Manual
do
Maker
.
com
O título é horrível e não esclarece o projeto, mas realmente, para explicar em uma chamada é difícil, então tenha em mente "Qt Radio Chat".
Tenho escrito vagarosamente artigos sobre o AFSmartRadio, que é uma placa modular com suporte a 3 tipos de rádio, dessa vez com o LoRA1276. Seu alcance indoor é tão incrível que resolvi criar um projeto diferente; fazer a comunicação entre dois computadores para abrir um chat, onde cada um coloca no aplicativo um nome de usuário e então inicia uma conversa bidirecional através do programa, sem precisar de Internet.
Esse projeto será dividido em duas etapas, sendo que nessa primeira estou fazendo o teste de comunicação entre o computador e a MCU. No caso do AFSmartRadio, ele utiliza um Arduino Pro Mini 3v3, mas estou fazendo o conceito em um Arduino Mega 2560, no qual incluí um protoshield do Baú da Eletrônica. Vou discorrer sobre o protoshield.
Tenho várias protoboards de diversos tamanhos, mas estou bastante cansado de utilizá-las. É muito trabalho colocar uma MCU ao lado de uma protoboard e ficar colocando montes de jumpers de lá pra cá. Mexeu a MCU, lá vai a protoboard pra um lado e pra outro, dando o famoso mal contato. Daí, sempre tem que ficar atento nisso, mas algumas vezes passa e até perceber a origem do problema, um tempo considerável já foi consumido.
Utilizar um proto shield tem me facilitado em diversos aspectos, incluindo na apresentação do projeto nos artigos. Se você reparar, tenho utilizado inclusive em Raspberry Pi. Mas invés de prototipar para um projeto específico, eu disponho os recursos sobre o protoshield e faço o wiring direto nela, assim posso mudar os componentes e fazer um projeto completamente diferente utilizando a mesma protoshield. Repare que nessa tinha 3 diodos em série para derrubar a tensão de 5V para 3v3 na alimentação do display OLED. Já deixei slot para FTDI, buzzer, RTC e conforme o wiring, diversos outros sensores!
Acredito mesmo que se você experimentar esse protoshield, não vai querer mais protoboard.
Se você olhar no site, vai encontrar montes de artigos com esse display OLED. Já escrevi artigos com Arduino, ESP32, Raspberry, Onion Omega e tudo quanto é placa que o suporte. Vale muito a pena e ele ajuda a fazer debugging sem precisar colocar um sniffer no barramento. Aliás, esse é outro artigo que estou prestes a escrever.
Se você ainda não adquiriu um display OLED, sugiro que pegue um I2C no site da Eletrogate.
E escolhi fazer o programa em Qt por diversas razões. Primeiro, porque gosto muito de Qt - um framework de C++ que facilita a programação a ponto de parecer "Python com tipagem forte". É tão fácil que é mais fácil programar em Qt do que programar para Arduino. E programar para Arduino, convenhamos que realmente é fácil, hum?
Além de estar fazendo por gosto, também iniciei uma série sobre programação em Qt no canal DobitAoByteBrasil no Youtube, onde já dispus de um tutorial completo para fazer comunicação serial entre o computador e o Arduino. Tem sido muito bem recebido, recomendo que dê uma olhada nos primeiros 4 videos sobre o assunto.
Esse programa que estou utilizando agora é uma extensão do primeiro tutorial, que por sua vez será extendido novamente com novos recursos. O video tutorial estará disponível no canal a cada nova inclusão de funcionalidades. Dessa vez mostro um pouco da utilização de signals para interação entre widgets, além de mostrar alguns poucos recursos que deles foram utilizados. Para esse artigo, a interface ficou dessa maneira:
Agora o Arduino Mega está programado apenas para enviar um "ok" a cada mensagem, para que eu pudesse ajustar a comunicação e exibição no display.
Fazendo a comunicação inicial e exibindo a mensagem remota no display, o código do Arduino ficou bem pequeno:
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define USERNAME "Mega> "
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
byte line = 0;
bool erase = false;
char msg[50] = {0};
void clearMsg(){
for (byte k=0;k<50;k++){
msg[k] = 0;
}
}
void drawText(const void *text,byte posX, byte posY, bool cls){
char *text2display = (char*) text;
if (cls){
display.clearDisplay();
}
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(posX,posY);
display.println((char*)text);
//display.setCursor(0,10);
display.display();
}
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
drawText("Manual do Maker",0,line,true);
line = 50;
}
void loop() {
clearMsg();
if (Serial.available()){
Serial.readBytesUntil('\n',msg,50);
}
if (msg[0] > 0){
char fullMsg[] = USERNAME;
strcat(fullMsg,"ok");
Serial.println(fullMsg);
if (line > 20){
line = 0;
drawText(msg,0,line,true);
}
else{
drawText(msg,0,line,false);
}
line+= 10;
String go = USERNAME;
go += (char *) millis();
//Serial.print(msg);
//verifica se deve pular 1 ou 2 linhas
if (strlen(msg)-1 >21){
line += 10;
}
else if (strlen(msg)-1 >42){
line += 20;
}
}
}
Repare que criei uma função para exibir texto, o que facilita e ajuda a reduzir o tamanho do código:
void drawText(const void *text,byte posX, byte posY, bool cls);
Utilizando o parâmetro const void *text, consigo fazer casting da mensagem no formato em que estiver. Nessa função passo também as posições X e Y para o display e um boolean cls para confirmar se o display deve ser limpo antes de imprimir a próxima mensagem. A função tem apenas 8 linhas de código, mas se tivesse que repetir isso a cada chamada, além de ficar feio, aumentaria o tamanho do programa (visualmente apenas).
O programa em Qt, apesar de pequeno, não dá pra dispor no artigo porque tem o header, o source, o main, o arquivo de projeto e a GUI. Nesse caso, o ideal é que você assista o video e pegue o link para download do programa na descrição do video.
Primeiramente, não conheço um computador da arquitetura x86 que tenha um RF sub-giga, por isso será necessário ter um rádio conectado a uma MCU, que por sua vez deve estar conectado ao computador x86/x86_64. Porém, se você tiver um Raspberry, poderá dispensar o computador e a MCU, utilizando um par de NRF24L01 para a comunicação. Claro que você não poderá se comunicar com um ponto remoto a 400m de sua origem (indoor) ou a quilometros de distância em campo aberto, mas já dá pra fazer umas brincadeiras.
Se quiser experimentar com NRF24L01 (por ser mais em conta), pegue os seus na Autocore Robótica. Se preferir um modelo com um pouco mais de alcance, a Autocore tem também esse modelo.
Se optar por utilizar Raspberry, você tem duas opções; fazer cross-compiling de uma maneira simples, como descrito nesse artigo, ou fazer a compilação nativa na board. Ou remota, mas nativa; bem, leia o artigo em questão para entender.
Se optar por utilizar um NRF24L01, poderá inclusive fazer uma rede mesh para aumentar o alcance e proporcionalmente, a diversão.
Vou compilar o video dessa primeira fase hoje e assim que concluído, disponibilizo no canal, com o nome "Qt Radio Chat". Não deixe de se inscrever e clique no sininho para receber notificações.
Se você reparar, estou implementando a transferência de arquivos de imagem. Tem que ser *.bmp, tem que ser grayscale (explico tudo no video) e tem que ter no máximo 128x64, para caber no display OLED e para que a transferẽncia não seja demorada, mesmo que para exibição no próprio app (a implementar, se possível, na próxima fase).
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.