Arduino

Roleta eletrônica com Arduino e FreeRTOS

Roleta eletrônica

Dado eletrônico ou roleta eletrônica? Bem, não importa muito.

O projeto é simples, mas agradável; o buzzer builtin da placa MaxBlitz ajudou a dar o efeito sonoro de catraca e usando o FreeRTOS pude mostrar uma outra forma de monitorar um pino. Mas usar FreeRTOS no Arduino não é igual utilizar em uma placa própria para isso.

Roleta eletrônica

Meu propósito era mostrar alguns recursos de software diferentes, afinal, fazer um dado eletrônico ou uma roleta eletrônica (como preferir chamar) é uma tarefa simples. Mas pode ser bem interessante.

O código está em implementação, quero adicionar mais recursos, mas com o pouco implementado já pude notar que o FreeRTOS no Arduino não funciona tão “liso” como em um ESP32 ou em um STM32.

Matriz de LEDs 8×8

Utilizar a matriz de LEDs é só um dos recursos pretendidos. Na verdade, quero fazer algo mais utilizando o PCF8574 contido na placa da MaxBlitz e criar um jogo com a Roleta eletrônica. O código para isso já está implementado e (aparentemente) funcional, mas vou escrevendo artigos conforme adicionar recursos.

A matriz de LEDs pode ser adquirida no nosso parceiro Curto Circuito.

Arduino standalone MaxBlitz

Já a placa MaxBlitz é um pouco mais complicada, porque é feita em lotes limitados e acaba muito rápido, mas você pode acompanhar no site do criador. Escrevi sobre esse standalone há poucos artigos antes desse.

Código do projeto

Números da roleta eletrônica

Compus uma matriz bidimensional para guardar os números. Já é algo pouco usual nos projetos makers, então foi uma oportunidade de mostrar o recurso:

Não precisaria ser em binário, mas é uma forma de visualizar como se fosse pontos. Se colocar cada octeto um embaixo do outro, seria como se o número estivesse deitado para a esquerda. Primeiro desenhei no papel e então escrevi o array.

Efeito sonoro

O som é a coisa mais simples do mundo, bastou tocar com a função tone passando o intervalo de tempo como parâmetro.

Para guardar os parâmetros da placa, criei uma struct, que deixa a lógica mais clara, fácil de achar onde a variável foi definida e a struct também permite cópias para outros propósitos. Não vai dar pra mostrar a principal utilidade da struct nesse programa, mas ela ficou assim:

Função para blink

O blink é o “hello world” da eletrônica digital, certo? Usamos pinModedigitalWrite em Arduino, mas com essa função não é necessário fazer o pinMode. Ela verifica se está configurado como OUTPUT e, se não estiver, faz o ajuste diretamente no registrador do respectivo pino. Se for passado 0 no loop, essa função apenas liga o LED.  Utilizei o LED builtin para saber quando passou pela função setup() e a partir de então a roleta eletrônica já estará pronta para uso.

Olha só que interessante; o registrador dos pinos 0 a 7 é o DDRB e o registrador do pino 8 ao 13 é o DDRD. Então a função verifica qual foi o pino solicitado e verifica se o pino já foi configurado como OUTPUT. Se não foi, o coloca. Poderia ser direto também, mas repare na condicional relacionado ao pino, que verifica se é maior que 7 e seu estado. Depois, faz um digitalWrite comum, mas poderia ser escrito diretamente no respectivo registrador também.

Função roulette

A função roleta também tem algo interessante.

Para gerar números randômicos em qualquer plataforma, é necessário uma semente. Se a semente for estática, a sequência randômica será sempre a mesma. Para fazer algo mais dinâmico, podemos ler o valor de um pino analógico que não esteja em uso e aproveitar sua flutuação.

Dentro dessa função também é feito o deslocamento dos bits do PCF8574 para simular uma roleta “mesmo”, que é a próxima fase desse projeto. Já está implementado, mas ainda preciso preparar os LEDs. Por fim, os números definidos para a matriz de LEDs 8×8 são chamadas conforme sua posição no loop, com delay incremental, para simular a desaceleração. Na última volta do loop, ele é interrompido no momento em que passar pela posição correspondente ao número randômico gerado.

Tasks

Uma das vantagens em utilizar um sistema operacional de tempo real é a possiblidade de processamento assíncrono. No caso desse programa, não é nada que não pudesse ser resolvido com interrupção, mas para figurar o recurso, criei uma task chamada vTaskRoulette que fica em loop monitorando o botão que aciona a roleta. Uma vez a função disparada, não adianta apertar subsequentemente, porque o processo estará preso no loop da roleta e assim não precisamos nos preocupar em tratar uma interrupção, nem garantir que não haverá reentrância.

Depois em setup(), simplesmente criamos a tarefa:

Um dos macetes aqui é que em alguns lugares não dá pra usar os ticks invés de delay e vice-versa. Vou deixar isso pra explicar em outro momento, por enquanto vou deixar o código completo para quem tiver interesse em reproduzir o brinquedo. Como utilizei o VisualStudio Code para programar, foi necessário fazer o include de Arduino.h, mas na IDE do Arduino esse include não é necessário:

Vídeo

Deixei uma demonstração no instagram e em nossa página no facebook, dê uma conferida na roleta eletrônica funcionando, minha filha viciou na brincadeira, e olhe que agora é só um número randômico!

 

Curso “Raspberry para hobistas e profissionais”

Continuo na divulgação do curso  que produzi, tendo 3 horas de conteúdo e mostrando desde a instalação do sistema em Windows e Linux à manipulação do GPIO em Shell Script, C e Python, além de interagir com dispositivos I2C, proteção do sistema de arquivos e como fazer um backup reduzido do sistema, entre outros.

Use o cupom de desconto DOBITAOBYTE e adquira o curso por R$21,00. Assim você apoia o blog e motiva outros cursos com Raspberry e outras plataformas, valeu?

 

Até a próxima!

 

One comment

Comments are closed.

%d blogueiros gostam disto: