Esta postagem também está disponível em: Inglês
Há dois anos (mais ou menos) eu comprei um Arduino Duemilanove, depois de ter feito uma disciplina optativa de laboratório de microcontroladores e me empolgado com o assunto… Segui então os tutoriais clássicos: pisquei LEDs, fiz comunicação usando a porta serial e toquei musiquinhas gerando ondas quadradas… Mas depois do período de “lua de mel”, a plaquinha foi parar na gaveta.
Só recentemente é que eu tive vontade de mexer de novo com o AVR, e encontrei um amigo empolgado pra projetarmos algo juntos – o Tarcísio Fischer. Nós decidimos tentar fazer um emissor de rádio AM usando SOMENTE o Arduino. A idéia é transmitir um sinal AM pra ser recebido em rádios comuns caseiros (tipo rádio-relógio ou à pilha), e o mais importante é que NENHUM componente analógico deveria ser utilizado. Tanto a geração da onda portadora (em aprox. 500 KHz), quando a modulação pelo sinal deveriam ser feitas pelo Arduino sozinho. Assim basta colocar um fio comprido no pino de saída (como na foto) e temos um transmissor AM (de baixa potência :P)
Passei alguns dias programando isso, mas no final o sucesso foi épico! Coloquei dois vídeos no Youtube detalhando a saga até agora, um gravado em 1º de Abril (juro que é tudo verdade!) e outro gravado ontem. Prometo pra vocês que no próximo post eu vou publicar o código. Só estou esperando um dia para revisar o código com o Tarcísio e então mandar pro GitHub…
Enquanto isso vejam os vídeos :) No primeiro episódio o código está cheio de números “hardcoded”, e o transmissor só funciona em 550 KHz AM, emitindo um tom cuja frequência eu nem sei…
Já no segundo vídeo o código do nosso transmissor evoluiu bastante. Agora eu separei tudo em bibliotecas estáticas (.a). Uma biblioteca responsável só pela portadora AM (libavram.a), e outra responsável pela modulação dessa portadora de maneira flexível (libavrtone.a). Na verdade a libavrtone.a funciona também com um outro “backend”. Eu fiz a libavrbuzzer.a, que como o nome diz, pode emitir ondas sonoras quadradas num pino de saída digital.
Através do diagrama tosco abaixo vocês podem entender (ou não) como os backends (libavrbuzzer.a e libavram.a) colaboram com a libavrtone.a para fazer tocar musiquinhas no buzzer e em AM:
E por hoje era só pessoal… Hora de dormir e voltar ao trabalho. Assim que tiver um tempinho coloco o código no GitHub e posto aqui com uns comentários. Logo vai estar pronto o super foda transmissor morse AM!


Gostei do seu experimento. Estava procurando exemplos de transmissores RF. Estou no aguardo da publicacao do codigo
Olá David! Na verdade o código já está publicado, eu só não postei sobre ele no blog ainda porque não está 100%, falta fazer ainda o controle de duração dos sons… Mas a parte de controle de altura, e a geração de AM tá completa.
Você pode acessar o código no GitHub, aqui: https://github.com/joaopizani/avr-wavegen :)
Que bom! Vou dar uma olhada no seu código. Vi que vc não utilizou a IDE padrão do Arduino. Eu já havia mexido com o CrossPack for AVR® Development com o auxilio do Xcode recentemente, mas acabei desistindo. Não me adaptei muito bem com os arquivos Makefile. Consegui compilar e carregar uns programinhas no meu Arduino Uno Atmel 328p, mas foi só isso. Quero ver como é feito a modulação de ondas de RF para tentar fazer um transmissor como vc fez. Obrigado por compartilhar!
Essa semana mesmo eu mexi bastante no código, para adicionar e reorganizar a parte que cuida da duração das notas musicais…
Você pode usar como modelo o Makefile que está em avr-wavegen/integration-tests/tone-with-am/Makefile. Ele tá cheio de comentários sobre o que signifca os valores lá dentro, é bem fácil de usar :)
Para cuidar da parte de medição do tempo (duração das notas), eu criei um mecanismo de “cronômetro” genérico pro AVR, que está publicado em https://github.com/joaopizani/avr-alarm . Esse cronômetro faz uma contagem regressiva com um tempo que você define, e quando o tempo expira, ele executa uma função também definida pelo usuário. Vou usar isso pro tocador de músicas agora ;)
Olá João Paulo,
Nos arquivos com o nome “paths.def” vc faz referencia a diretórios como setados nas variáveis AVRUTILS_ROOT, AVRAM_ROOT e AVRTONE_ROOT. Esses diretórios devem corresponder as bibliotecas? Também tem as referencias para subdiretorios “include” e “lib”, mas nas bibliotecas não tem esses subdiretorios.
Oi David! Eu ainda pretendo documentar melhor esses arquivos logo… Só falta terminar de testar tudo e garantir que funciona :)
Mas a idéia por trás do paths.def é bem simples. Para você poder usar as bibliotecas referenciadas (avr-utils, avr-am, avr-buzzer, etc.) você deve primeiro “instalá-las”; daí o AVRUTILS_ROOT e outros são o diretório de “instalação” da respectiva lib.
Assim: vá no diretório da lib (por ex. avr-am) e digite “make install PREFIX=dir LIBRARY=1″ e a lib vai ser compilada e instalada em dir (um diretório qualquer à sua escolha). Daí depois vc seta lá no paths.def o AVRAM_ROOT como dir. Entendeu? :)
Só mais uma última dica: se você tiver uma conta no github, é mais legal que deixe suas dúvidas e sugestões na própria parte de “issues” do repositório: https://github.com/joaopizani/avr-wavegen/issues Assim fica tudo junto, mais fácil da gente se referir a arquivos e tal…
Ok obrigado!
Pingback: Highlights dos últimos 100 posts :D | Experimento imaginário