FAVORITAR

Dado eletrônico: pseudo-aleatoriedade com Franzininho C0

Neste artigo vamos falar sobre pseudo-aleatoriedade com a placa Franzininho C0 (STM32C0). A aplicação à desenvolver é um dados eletrônico de seis possibilidades, cujo número a ser mostrado será “sorteado” em código.

Já aprendemos a configurar a Franzininho C0 neste artigo, é necessária uma forma de gravar o bootloader no STM32C0 (como o STlink V2 que utilizei). Isso apenas inicialmente, visto que depois basta um cabo USB e a IDE do Arduino.

Os números gerados pela maioria dos microcontroladores não são https://stackoverflow.com/questions/14796398/how-generate-real-random-number-using-stm32-mcu. Isso porque para gerar números aleatórios precisamos de uma seed (semente) e nem sempre é possível que essa semente seja realmente aleatória.

Alguns microcontroladores da ST tem a possibilidade de gerar números aleatórios, como os da linha STM32F4. Já a linha C0 com a qual vamos trabalhar não conta com esta opção.

Seminário Linux Embarcado 2024: Evento Presencial em São Paulo

Participe do Seminário Linux Embarcado 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.

Inscreva-se

Utilizaremos código feito na IDE do Arduino, conforme comentado neste artigo anterior. O ecossistema Arduino conta com duas funções que podemos utilizar: random() e randomSeed(); a função random() aceita como parâmetros o número inicial e o número final com os quais queremos trabalhar.

Já a função randomSeed() aceita uma fonte tecnicamente aleatória de seed (semente), como, por exemplo, uma entrada analógica desconectada (sem ligação em hardware). Isso tudo porque, conforme já explicado, programaticamente o código do Arduino começa a gerar os números sempre de um mesmo valor/lugar/ponto. Lendo uma entrada analógica desconectada (flutuante) faz com que a semente para iniciar o código seja a mais aleatória possível.

O circuito

Nosso circuito vai contar com seis LEDs, que serão energizados conforme o número a ser mostrado. Caso o número a ser mostrado seja dois, 2 LEDs serão ligados; caso o número seja cinco, 5 LEDs serão energizados.

Os LEDs estarão nos pinos PA5, PA6, PA7, PB6, PB7 e PC14. Utilizaremos um botão push button como gatilho, que vai dar início ao “girar” dos dados; ele está no pino PC15. 

Sobre a entrada analógica que vamos utilizar como fonte de “aleatoriedade”, consultei exemplos de código oficiais para saber como chamar a mesma no sketch. Escolhi utilizar o AD no pino PA4 (ADC_IN4), que chamaremos simplesmente de A4.

O Código

Conforme já mencionado, para geração do número aleatório vamos primeiro “semear” (inicializar) a contagem fazendo: 

Lendo então a entrada analógica A4 que está completamente desconectada no circuito. Após isso nós podemos usar:

Observe que colocamos os limites entre 1 e 7, isso porque o valor máximo da função é n-1; nos limitando portanto entre 1 e 6, exatamente os valores possíveis em um dado de seis lados. Repare no código abaixo que eu não utilizei nenhuma função delay(), pois não queria que meu código ficasse bloqueado/parado.

Utilizei portanto um artifício de programação com auxílio da função micros(), que captura o tempo em microssegundos desde a inicialização do microcontrolador:

A função IF será verdadeira quando a diferença entre o tempo atual (micros()) e o anterior(previousTime) for maior que um valor que eu vou ajustar (delay1).

Eu faço outro IF para decidir quais LEDs vou ligar, dependendo do valor (inteiro) da variável “numero”. Comparo “numero” com valores entre 1 e 6 e então dentro de cada função faço:

O código final ficou da forma abaixo, completo. 

Os resultados 

No GIF abaixo eu desativei o botão e deixei o sistema gerando números aleatórios a cada 0,5 segundos. Observe que o LED da direita que é o primeiro (1) quase nunca desliga, pois todos os demais valores sempre dependem dele, assim como alguns valores dependem do LED 2, etc.

Fiz outro teste onde deixei o circuito rodando por alguns minutos, gerando 249 pontos de números. Veja abaixo que parece decentemente aleatório, porém não consigo afirmar.

Claro que à olho nú parece um bom resultado, porém talvez com técnicas e equacionamento consiga-se determinar melhor a aleatoriedade do sistema. De qualquer forma este projeto de dado eletrônico é um ótimo brinquedo, garante algumas horas de diversão e jogos.

Note que eu utilizei a Franzininho C0 (STM32C0) neste tutorial, porém o mesmo software pode ser utilizado na maioria das placas que rodam Arduino.

Abaixo mostro o resultado do código que criamos, observe que a cada vez que pressiono o botão um novo número aleatório é gerado. Algumas vezes é o mesmo número, isso é perfeitamente normal.

Palavras finais

Devido à natureza determinística dos sistemas digitais, obter números aleatórios é por vezes difícil. Utilizar técnicas como ler uma entrada analógica desconectada ajuda, mas ainda assim o sistema estaria vulnerável a ataques externos.

Demonstramos neste artigo a implementação de um dado eletrônico de seis lados (seis dígitos) com a incrível placa Franzininho C0 (STM32C0), um microcontrolador poderoso e de baixo consumo. Conforme comentado, o mesmo sketch/código pode ser utilizado com outras plataformas: Arduino, ESP32, Teensy, etc.

Saiba Mais

Franzininho C0 – Primeiros passos com Arduino

Como instalar o STM32CubeIDE: Guia de Primeiros Passos

Como gravar a Franzininho C0 via USB/Serial usando o STM32CubeProgrammer

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
Bruno Silva
Bruno Silva
17/06/2024 11:51

Uma abordagem interessante seria a utilização de array para mapear os valores de saída e uma pequena lógica booleana, para diminuir o tamanho do código, conforme o exemplo abaixo: //define os bits #define BIT0 (1<<0) #define BIT1 (1<<1) #define BIT2 (1<<2) #define BIT3 (1<<3) #define BIT4 (1<<4) #define BIT5 (1<<5) //mapeia os valores int numeros[] = {BIT0,  BIT0 + BIT1, BIT0 + BIT1 + BIT2, BIT0 + BIT1 + BIT2 + BIT3, BIT0 + BIT1 + BIT2 + BIT3 + BIT4, BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5}; //No looping seta os valores conforme o numero… Leia mais »

Home » Software » Dado eletrônico: pseudo-aleatoriedade com Franzininho C0

EM DESTAQUE

WEBINARS

LEIA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste:


Seminário de
Sistemas Embarcados e IoT 2024
 
Data: 25/06 | Local: Hotel Holiday Inn Anhembi, São Paulo-SP
 
GARANTA SEU INGRESSO

 
close-link