Vou mostrar mais uma alternativa para comunicação wireless entre placas Arduino, o módulo wireless NRF24L01, que opera na frequência de 2.4GHz.
Esse módulo é uma opção de baixo custo para comunicação não só entre placas Arduino, mas também pode ser utilizado para comunicação entre Arduino e Raspberry, Arduino e PIC, Raspberry e Beaglebone, e várias outras combinações.
Ele utiliza o chip NRF24L01+ da Nordic (datasheet), e funciona com alimentação de 1,9 à 3.6V. Possui um regulador de tensão interno que permite que seja ligado tanto em microcontroladores com nível de sinal de 3.3 como de 5V. A velocidade máxima de comunicação é de 2Mbps, utilizando uma antena embutida. Uma outra característica do módulo é que ele pode funcionar como emissor ou como receptor, mediante alteração na programação.
Com relação à frequência de operação, apesar de operar na faixa de 2.4GHz, esse módulo não consegue se conectar às redes wireless padrão 802.11x, já que utiliza um protocolo de comunicação diferente dessas redes.
Pinagem do NRF24L01 e ligação ao Arduino
Na lateral da placa temos um conector de 10 pinos, dos quais 7 serão utilizados para conexão ao Arduino. Veja que no esquema abaixo temos os pinos Vcc e GND duplicados. Nos meus testes, eu utilizei apenas um de cada. Aparentemente não há necessidade de ligar os dois ao mesmo tempo.
Na tabela abaixo, o esquema de ligação do módulo que utiliza a interface SPI para comunicação com o microcontrolador. Vamos utilizar essa tabela para testar a comunicação entre duas placas Arduino, controlando, à partir de um Arduino Uno, um servo motor 9G e um led conectados à um Arduino Mega:
Vamos dividir esse tutorial em duas partes, apresentando o circuito e o programa para o emissor (Uno) e depois para o receptor (Mega).
Circuito NRF24L01 e Arduino Uno – Emissor
Nesse primeiro circuito, temos apenas o Arduino Uno e o módulo NRF24L01. Utilizaremos esse circuito emissor para enviar comandos ao receptor via serial monitor.
Antes de carregar o programa, baixe a biblioteca RF24 neste link. Descompacte o arquivo e coloque a pasta RF24 dentro da pasta Libraries da IDE do Arduino.
Carregue o programa abaixo no Arduino Uno. Tenha uma atenção especial com esta linha (18):
O número no final da linha (0xE13CBAF433LL), deve ser o mesmo nos dois programas, pois é este valor que indica em qual rede o módulo está operando.
// Programa : NRF24L01 Emissor - Servo motor // Autor : Arduino e Cia #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" // Armazena caractere digitado na serial char valor[1]; // Armazena os dados enviados int dados[1]; // Inicializa o NRF24L01 nos pinos 9 (CE) e 10 (CS) do Arduino Uno RF24 radio(9,10); // Define o endereco para comunicacao entre os modulos const uint64_t pipe = 0xE13CBAF433LL; void setup() { // Inicializa a serial Serial.begin(57600); Serial.println("Digite 1, 2 ou L e pressione ENVIAR..."); // Inicializa a comunicacao do NRF24L01 radio.begin(); // Entra em modo de transmissao radio.openWritingPipe(pipe); } void loop() { // Le o caractere digitado na serial if (Serial.available() > 0) { valor[0] = Serial.read(); } // Envia 1 via radio caso seja digitado o valor 1 if (valor[0] == '1') { Serial.println("Enviado : 1 - Gira servo para a esquerda"); dados[0] = 1; radio.write(dados, 1); delay(100); valor[0] = 0; } // Envia 2 via radio caso seja digitado o valor 2 if (valor[0] == '2') { Serial.println("Enviado : 2 - Gira servo para a direita"); dados[0] = 2; radio.write(dados, 1); delay(100); valor[0] = 0; } // Envia 3 via radio caso seja digitado o caractere L if (valor[0] == 'L') { Serial.println("Enviado : L - Acende o led"); dados[0] = 3; radio.write(dados, 1); delay(100); valor[0] = 0; } }
Abra o serial monitor e você terá a tela abaixo, onde poderá enviar os caracteres 1, 2 ou L para o receptor:
Circuito Arduino Mega – Receptor
No Arduino Mega, vamos conectar o módulo NRF24L01 às portas 50, 51 e 52, que formam a interface SPI. O servo motor está ligado à porta digital 4 e o led à porta 5.
Carregue o seguinte programa no Arduino, que aguarda pelo sinal de rádio do módulo e, caso receba o número 1 movimenta o servo no sentido anti-horário, com o número 2 move o servo no sentido horário e para o número 3 (caractere L digitado), aciona o led.
// Programa : NRF24L01 Receptor - Servo motor // Autor : Arduino e Cia #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <Servo.h> // Armazena os dados recebidos int recebidos[1]; // Inicializa o NRF24L01 nos pinos 9 (CE) e 53 (CS) do Arduino Mega RF24 radio(9,53); Servo myservo; // Define o endereco para comunicacao entre os modulos const uint64_t pipe = 0xE13CBAF433LL; // Define o pino do led int LED1 = 5; void setup() { // Servo conectado ao pino 4 myservo.attach(4); // Define o pino do led como saida pinMode(LED1, OUTPUT); // Inicializa a serial Serial.begin(57600); // Inicializa a comunicacao do NRF24L01 radio.begin(); // Entra em modo de recepcao radio.openReadingPipe(1,pipe); radio.startListening(); // Mensagem inicial Serial.println("Aguardando dados..."); } void loop() { // Verifica sinal de radio if (radio.available()) { bool done = false; while (!done) { done = radio.read(recebidos, 1); Serial.print("Recebido : "); Serial.print(recebidos[0]); // Se recebeu 1, movimenta o servo para a esquerda if (recebidos[0] == 1) { delay(10); Serial.println(" -> Girando motor para a esquerda"); myservo.write(1); } // Se recebeu 2, movimenta o servo para a direita if (recebidos[0] == 2) { delay(10); Serial.println(" -> Girando motor para a direita"); myservo.write(160); } // Se recebeu 3, acende o led if (recebidos[0] == 3) { delay(10); Serial.println(" -> Acende led"); digitalWrite(LED1, HIGH); } else { digitalWrite(LED1, LOW); } delay(100); } } }
No serial monitor, podemos acompanhar o recebimento dos dados ao mesmo tempo em que o servo motor e o led são acionados:
Gostou? Confira outros posts utilizando comunicação wireless aqui mesmo no Arduino e Cia!