Índice:

Gerador de tons Arduino sem biblioteca ou funções seriais (com interrupções): 10 etapas
Gerador de tons Arduino sem biblioteca ou funções seriais (com interrupções): 10 etapas

Vídeo: Gerador de tons Arduino sem biblioteca ou funções seriais (com interrupções): 10 etapas

Vídeo: Gerador de tons Arduino sem biblioteca ou funções seriais (com interrupções): 10 etapas
Vídeo: EU NÃO SABIA QUE O ARDUINO CONSEGUE FAZER ISSO! 2024, Julho
Anonim
Gerador de tons Arduino sem biblioteca ou funções seriais (com interrupções)
Gerador de tons Arduino sem biblioteca ou funções seriais (com interrupções)

Isso não é algo que eu normalmente faria um instrutível, eu prefiro meu trabalho em metal, mas como sou um estudante de engenharia elétrica e tenho que fazer uma aula de microcontroladores (Embedded Systems Design), pensei em fazer um instrutível sobre um dos meus projetos. Quando fiz originalmente o projeto e outros para esta classe, descobri que há poucos ou nenhum tutorial que não usa as funções da biblioteca do Arduino ou funções seriais, o que é outro motivo pelo qual pensei que seria um bom instrutor.

Este código é projetado para o microcontrolador Atmega 2560, então se você quiser implementá-lo em outra placa, você precisará alterar os registros de endereço no código com base no manual do usuário de seus controladores. A ideia básica por trás do código é que sempre que você inserir uma tecla no teclado no monitor serial, o arduino mega produzirá uma certa frequência com base na tecla que você pressionar, com "q" reinicializando-a. Eu fiz isso para que "a" produza a freqüência A bemol e "A" produza a freqüência A sustenido, "b" produzindo B bemol, "c" para dó bemol, "C" para dó sustenido e assim por diante. O código completo é carregado no final, mas cada etapa dividirá o código em partes para que seja mais fácil de explicar.

Etapa 1: Definindo endereços de registro

Definindo Endereços de Registro
Definindo Endereços de Registro

Esta etapa é fácil, se você estiver usando o atmega 2560, você só precisa usar os endereços que usei, embora se você usar uma placa com um chip diferente, você precisará encontrar os endereços de cada um desses registros em seu manual do usuário dos chips. As definições no topo são apenas constantes que serão usadas para nossas funções mais tarde. Especificamos os endereços como voláteis sem sinal porque não queremos que o compilador mexa com eles.

Etapa 2: Matrizes e Variáveis Globais

Matrizes e variáveis globais
Matrizes e variáveis globais
Matrizes e variáveis globais
Matrizes e variáveis globais
Matrizes e variáveis globais
Matrizes e variáveis globais

Aqui, queremos definir a matriz de frequência que conterá todas as frequências que cada tecla deve produzir. Esses valores são calculados a partir das freqüências reais das notas e, honestamente, esqueci como os obtive, mas são os valores corretos quando os testei em um osciloscópio para ter certeza. Também estamos definindo a matriz de notas que contém todas as teclas a serem pressionadas para cada tom, bem como as variáveis de que precisaremos para nossas funções posteriores.

Etapa 3: a função "serial.begin"

o
o

Chamaremos nossa função personalizada que replica a função "serial.begin" U0init (). Ele pega a taxa de transmissão desejada como entrada e inicia a porta serial nessa taxa de transmissão.

Etapa 4: a função "serial.available"

o
o

Chamaremos a função que imita "serial.available" U0kbhit (). Ele não aceita entrada, mas em vez disso, detecta se há uma alteração feita no teclado usando o bit de status RDA e retorna verdadeiro quando uma alteração é detectada.

Etapa 5: a função "serial.read"

o
o

Chamaremos a função que imita a função "serial.read" U0getchar (), que não recebe nenhuma entrada e produz qualquer alteração feita no teclado, que é armazenada no registrador UDR0.

Etapa 6: a função "serial.write"

o
o

Chamaremos a função que imita "serial.write" U0putchar (), que obtém os dados do registro UDR0 enquanto uma alteração é detectada e armazenada, e envia essa alteração de volta para o monitor serial.

Etapa 7: A função de configuração

A função de configuração
A função de configuração

Esta é a função de configuração básica que usará nossa imitação "serial.begin" para inicializar a porta serial e inicializará nossas configurações de bits para os registradores do temporizador e definirá PB6 para emitir nossos tons.

Etapa 8: as funções de loop e ISR

As funções de Loop e ISR
As funções de Loop e ISR

O loop funciona da seguinte forma: se uma alteração for detectada com nossa função "serial.available", nossa função "serial.read" armazena essa alteração, e nossa função "serial.write" coloca essa alteração no monitor serial. Contanto que uma variável i seja menor que o tamanho da matriz de frequência, ela definirá a saída como a posição de i nessa matriz, gerando a frequência nessa posição. O ISR funciona como o reset, onde se a posição da matriz de frequência não for igual a 0 (em outras palavras, se "q" não for pressionado), ele emitirá a frequência, mas quando "q" for pressionado, ele será redefinido. Observe: este código usa interrupções, mas pode ser feito com interrupções desabilitadas. Vou postar o código sem interrupções se receber alguma solicitação, só acho que a versão de interrupção é mais divertida.

Etapa 9: Fiação

Fiação
Fiação

A fiação para este código é extremamente fácil, simplesmente coloque um fio de saída de PB6 em uma placa de ensaio, conecte uma campainha ou alto-falante em série com isso e conecte-o de volta ao aterramento. Nota: se você usar um alto-falante, coloque um pequeno resistor antes do alto-falante. Se você quiser apenas ver a saída, mas não ouvi-la, basta conectar PB6 ao fio vermelho de um osciloscópio e o fio preto ao aterramento.

Etapa 10: Juntando tudo

Eu adicionei o código completo a esta etapa, já que expliquei todas as suas partes nas etapas anteriores. Leva apenas uma entrada de teclado para diferentes frequências e envia essa frequência para PB6. Espero que você tenha gostado de ler uma maneira diferente de codificar com o IDE!

Além disso, vote nele no concurso Microcontrolador: D

Recomendado: