Leitor RFID móvel - um projeto Maker Kit usando Particle e Ubidots
Nos últimos anos, Ubidots uniu forças com Particle para alcançar um objetivo final: possibilitar a criação rápida, fácil e eficiente de IoT .
Avançando para os dias de hoje, temos orgulho em afirmar que ambos os produtos estão sendo usados para acelerar IoT em nível global . De empreendedores e startups a empresas de todos os portes, estamos ajudando os negócios a criar um futuro orientado por dados.
Recentemente, Friedl aceitou o desafio de criar um IoT do zero. Inicialmente, seu conhecimento edge o assunto era limitado. No entanto, graças à pesquisa que realizou — e a muitos vídeos do YouTube — ele ganhou confiança para usar diversas ferramentas e concretizar seu objetivo: criar um leitor RFID móvel sem ser um especialista IoT
Após alcançarmos esse resultado surpreendente, entramos em contato com Friedl para parabenizá-lo pelo sucesso e aprender com sua conquista. Também queríamos compartilhar essa história com a Comunidade Ubidots , pois acreditamos que ela serve de inspiração e aprendizado.
À luz dessas grandes conquistas, minha entrevista explorará o processo de desenvolvimento de Friedl, as técnicas que ele utilizou para atingir seu objetivo e outras lições valiosas.
A publicação original pode ser encontrada no Particle Community . Friedl gentilmente a compartilhou também no Ubidots .
Escrito por : friedl_1977
Como primeiro projeto, decidi construir um leitor RFID móvel que enviasse dados em tempo real para o MySQL, Google Sheets ou Ubidots via Webhooks.
- Crédito da foto: Migal Vanas
Observação:
Este não é um tutorial propriamente dito, mas sim uma demonstração do produto. Como recebi muita ajuda do Fórum Particle , decidi publicar meus arquivos Eagle e o código para que fiquem disponíveis para qualquer pessoa que queira utilizá-los.
Presumo que você tenhaedge básico do ambiente Particle , webhooks e que já tenha configurado sua conta e dispositivos no Particle Console. Caso contrário, faça isso antes de tentar esta compilação.
Resumo:
Construir um scanner RFID verdadeiramente sem fio (móvel) com o objetivo de ler cartões RFID, capturar os UIDs desses cartões e enviá-los para;
Lista de materiais:
- Módulo leitor de cartão MFRC522 3
- Bateria LiPo 3.7V
- Módulo de bateria 1
- LM394N 1
- Conjunto de LEDs 0603 para indicador de bateria
- 2 LEDs RGB para indicar o status do sistema e o status de leitura do cartão
- Particle Fóton
- Interruptor deslizante - Alimentação principal
- Interruptor de inclinação 1
- Projeto personalizado de PCB (da PCBWAY ou similar )
- Gabinete com design personalizado
- Vários resistores 0603
- Ferrita 2 !!!
Em primeiro lugar:
Se você for como eu, um protótipo genérico simples não será suficiente, então me esforcei um pouco mais, aprendi a usar o Rhinoceros e projetei um gabinete simples, porém elegante (ou pelo menos eu achava) que exibisse o Particle Photon e alguns outros componentes.
Além disso, decidi não usar uma placa de prototipagem genérica, pois DETESTO fios. Incluí uma imagem da minha tentativa inicial de fazer uma placa "bonita" usando uma placa de prototipagem e fios jumper, mas depois de algumas horas percebi que simplesmente não daria certo. Mais uma curva de aprendizado: pesquisei no Google, passei algumas horas no YouTube e consegui me virar no Autodesk Eagle. Valeu cada minuto investido.
***A última imagem mostra a placa de circuito impresso totalmente montada com o LED indicador de status "OK ", bem como o LM3914N em funcionamento, indicando uma carga de bateria de aproximadamente 90%. (7 de 8 LEDs)
Enviei os arquivos Gerber para a PCBWAY e, em menos de uma semana, minhas novas placas de circuito impresso personalizadas estavam prontas para montagem.
O que importa:
Agora, a programação. Esta é a parte com a qual tenho mais dificuldade, mas graças à ajuda de alguns membros dos fóruns Particle e da Hackster, consegui chegar ao código abaixo. Provavelmente não é o código mais elegante do mundo, mas funciona, então sinta-se à vontade para usá-lo e aprimorá-lo, se quiser.
// Projeto: Registro de Presença RFID Móvel // Um projeto da FireFli (PTY) LTD // Data: Julho de 2019 // Compilado por: Friedl Basson // Detalhes: Leitura de UIDs de cartões RFID e envio via webhooks para UbiDots, banco de dados MySQL ou Planilhas Google // Créditos: Agradecimentos especiais à comunidade Particle por auxiliar e tornar este projeto possível! // Firmware: V2.1.1 //Modo Sistema// - comente se você for configurar o Wi-Fi pelo aplicativo Particle e não precisar se conectar a outra rede sem fio posteriormente //SYSTEM_MODE(SEMI_AUTOMATIC); // Esta instrução #include foi adicionada automaticamente pelo Particle IDE. #include "RFID.h" #include <Ubidots.h> /* Define os pinos usados para SS (SDA) e RST (reset) para SPI de hardware e software */ #define SS_PIN A2 #define RST_PIN D2 /* Define os pinos usados para DATA OUT (MOSI), DATA IN (MISO) e CLOCK (SCK) SOMENTE para SPI de software */ #define MOSI_PIN D3 #define MISO_PIN D4 #define SCK_PIN D5 //Inicializando RGB START - LED RGB e buzzer são usados como indicadores de status do sistema int redPin = D6; int greenPin = D1; int bluePin = D0; int buzzPin = D7; //Inicializando RGB END /* Cria uma instância da biblioteca RFID */ #if defined(_USE_SOFT_SPI_) RFID RC522(SS_PIN, RST_PIN, MOSI_PIN, MISO_PIN, SCK_PIN); // SPI por software #else RFID RC522(SS_PIN, RST_PIN); // SPI por hardware #endif //const char* WEBHOOK_NAME = "rfid_uid"; const char* WEBHOOK_NAME = "Ubidots"; Ubidots ubidots("webhook", UBI_PARTICLE); void setup() { Serial.begin(9600); // WiFi.listen(); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); pinMode(buzzPin, OUTPUT); // Definindo credenciais para nova conexão Wi-Fi /* Esta seção só é necessária se você quiser se conectar a uma nova rede Wi-Fi após a configuração inicial. Isso só funcionará se as credenciais Wi-Fi atuais tiverem sido apagadas. O código será executado APENAS UMA VEZ na inicialização e definirá as novas credenciais especificadas. Depois que as novas credenciais forem definidas, este código não será executado novamente. */ WiFi.on(); if (!WiFi.hasCredentials()) { WiFi.setCredentials("SSID", "PASSWORD", WPA2, WLAN_CIPHER_AES); } WiFi.connect(); waitUntil(WiFi.ready); Particle(); #if !defined(_USE_SOFT_SPI_) /* Habilita a interface SPI de hardware */ SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV8); SPI.begin(); #endif /* Inicializa o leitor RFID */ RC522.init(); delay(5000); digitalWrite(bluePin, HIGH); digitalWrite(greenPin, HIGH); digitalWrite(redPin, LOW); } void loop() { /* Contador temporário do loop */ uint8_t i; /* Um cartão foi detectado? */ if (RC522.isCard()) { /* Se sim, obtém seu número de série */ RC522.readCardSerial(); char str[16]; snprintf(str, sizeof(str) , "%02X %02X %02X %02X" , RC522.serNum[0] , RC522.serNum[1] , RC522.serNum[2] , RC522.serNum[3] ); // Webhooks// /* RFID_WP = nome do seu webhook str = seus dados que você deseja publicar como PRIVADO ou PÚBLICO */ // Particle("RFID_WP", str, PRIVATE); // Publicar dados no banco de dados do WordPress // Particle("XLS", str, PRIVATE); // Publicar dados no Google Sheets Serial.print(str); /* Adiciona pares de chave-valor de contexto */ ubidots("UID", str); char* context = (char *) malloc(sizeof(char) * 60); /* Constrói o contexto com o array acima para enviar ao Ubidots */ ubidots(context); ubidots("UID", 1, context); // Alterar para o nome da sua variável bool bufferSent = false; bufferSent = ubidots(WEBHOOK_NAME, PUBLIC); // Usará webhooks particle para enviar dados //} // - EXPERIMENTE Ubidots - // // digitalWrite(buzzPin, HIGH); delay(500); digitalWrite(buzzPin, LOW); digitalWrite(bluePin, LOW); delay(750); digitalWrite(bluePin, HIGH); } else if (RC522.isCard()) { RC522.readCardSerial(); char str[16]; snprintf(str, sizeof(str) , "%02X %02X %02X %02X" , RC522.serNum[0] , RC522.serNum[1] , RC522.serNum[2] , RC522.serNum[3] ); digitalWrite(bluePin, LOW); digitalWrite(greenPin, LOW); digitalWrite(redPin, HIGH); // digitalWrite(buzzPin, HIGH); delay(1000); digitalWrite(bluePin, HIGH); digitalWrite(greenPin, HIGH); digitalWrite(redPin, LOW); digitalWrite(buzzPin, LOW); } delay(500); }
Front-ends:
Graças à função webhook do Particle Console, consegui publicar o código em praticamente qualquer lugar sem problemas. Agora, se você conhece bem PHP e MySQL, talvez consiga escrever seu próprio script do lado do servidor, mas para quem é iniciante como eu, recomendo os dois serviços a seguir:
Eles são bem diferentes, então você deve analisar ambos para determinar qual é o mais adequado para o seu uso. Resumindo, se você quer que os dados sejam publicados em tempo real em um local de sua escolha, o Zapier (ou algo similar) é a melhor opção. Se você não se importa em armazenar os dados no servidor de terceiros, Ubidots é uma opção muito mais econômica (custo por ponto de dados) e tem o benefício adicional de alguns widgets interessantes para apresentar seus dados de forma gráfica. Anexei uma captura de tela de um Dashboard que criei no Ubidots .
- Crédito da foto: Migal Vanas
Em retrospectiva:
Inicialmente, pensei que construir um indicador de bateria que funcionasse fora do microcontrolador seria a melhor ideia, pois funcionaria independentemente e liberaria pinos digitais muito necessários. No entanto, a desvantagem é que, sem um sinal analógico enviado ao microcontrolador, não é possível exibir a duração da bateria no dashboard. O LM3914N também requer alguns cálculos para definir as volutas de referência e determinar quais resistores usar, dependendo da diferença de tensão entre os estados "totalmente carregado" e "descarregado". Lembre-se de que, por razões práticas, você deve trabalhar com 3,1 V na bateria quando ela estiver descarregada, pois a maioria dos componentes não funcionará abaixo de 3 V ou começará a apresentar comportamentos erráticos. Seis de um, eu acho.
Eu também não usaria o interruptor de inclinação novamente para acionar o indicador de bateria, pois ele é muito sensível e causa oscilações na luz. Um simples interruptor tátil parece uma ideia muito melhor... apenas uma sugestão.
Imperdível:
A maior dificuldade para mim foi entender o efeito que qualquer metal ou circuito pode ter em um leitor RFID. Projetei, construí e testei toda a unidade inicialmente conectada a uma fonte de alimentação constante. Devido ao design compacto da unidade, a bateria foi instalada muito próxima ao módulo leitor RFID. A consequência… Nenhuma leitura 😲 Como medida temporária, envolvi a bateria com fita isolante elétrica, o que funcionou “razoavelmente”. Comprei núcleos de ferrite na Amazon como último recurso e, como num passe de mágica, a interferência desapareceu.
Agradeço a todos que contribuíram de alguma forma para o projeto, em especial ao @ScruffR pela compreensão de que todos começamos em algum lugar e pela extrema paciência 🙂 Um agradecimento especial também ao @Joe da Particle pelos incríveis Maker Kits. Ansioso por mais projetos!!!
Arquivos:
Diagrama esquemático do Eagle - BAIXAR
Arquivo do Eagle Board - BAIXAR
Incrível, não é? Agora, como prometido... Aqui você encontrará algumas das perguntas que Friedl gentilmente respondeu.
P: O que te motivou a entrar no ecossistema IoT ?
A/ Sempre gostei de tecnologia e meu desejo de criar coisas novas se encaixa perfeitamente no setor IoT . Desenvolver coisas novas que possam melhorar a vida é o que mais gosto.
P: Por que você experimentou tantas plataformas?
A/ Como sou completamente novo na área de IoT e não gosto muito de programação, estava procurando uma plataforma fácil de usar e com um bom custo-benefício, em vez de desenvolver a minha própria. Percebi que a maioria das plataformas foi projetada pensando em usuários experientes, o que dificulta bastante a vida de quem está começando na IoT. Mesmo usuários experientes podem achar que gastar muito tempo configurando sistemas desnecessariamente complexos é um processo demorado. Como meu foco principal é o desenvolvimento de produtos, design de produtos e de placas de circuito impresso (PCBs), era fundamental encontrar uma solução que eu pudesse entender e começar a usar rapidamente.
P: O que você aprendeu com cada um deles?
A maioria das plataformas parece complexa de aprender e muito cara se você não tomar cuidado. Os baixos custos iniciais ou as versões "gratuitas" podem facilmente te atrair para o uso do produto, mas assim que você começar a transmitir dados ao vivo, perceberá que é bastante caro.
P: Por que você decidiu escolher a Ubidots?
A Ubidots provou ser a melhor opção em ambos os aspectos: fácil de aprender, bastante acessível e com uma política de uso de dados justa. Além disso, o suporte foi excelente! A interface gráfica é fácil de entender e a opção de rótulos personalizados é interessante, embora um pouco cara.
Espero sinceramente que esta história inspire você a começar a construir e experimentar seus próprios IoT de diferentes tipos e, melhor ainda, esperamos que você use Ubidots para potencializar seus esforços e viabilizar seu processo.