nRF24L01
Control de 2 servos + 1 servo o motor
xsetaseta@gmail.com
Revisión del circuito. 17/11/2017
Después de bastante tiempo de realizar el montaje, tuve la necesidad de hacer otro montaje con el nRF24.
Montado todo bien no me funcionaba, o el funcionamiento era errático.
Después de muchas pruebas, descubrí que en algún que otro módulo se necesitaba un condensador entre Vcc y GND.
Colocados los condensadores en todos los módulos el funcionamiento era correcto.
____________________________________________________________
En este montaje he utilizado dos placas arduino y dos módulos nRF24L01 para el control de 2 servos y un motor de DC o 1 servo.
El control se realiza desde el circuito emisor donde existen 3 potenciómetros a modo de joystick, donde 2 hacen de modo coordenadas X-Y , y el tercer potenciómetro a modo de control de potencia.
Mi objetivo era realizar el control de un avión RC de ala fija, donde el control se realiza con el timón de dirección y con el timón de profundidad, y la potencia del motor con el tercer potenciómetro de potencia.
En este montaje solo he utilizado el modo de transmisión de un módulo emisor a el otro módulo receptor.
El nRF24L01+ integra un completo transceptor RF de 2,4 GHz, un sintetizador de RF y toda la lógica de banda base incluyendo un acelerador de protocolo por hardware Enhanced ShockBurstTM con una interfaz SPI de alta velocidad para el controlador de la aplicación. El módulo Transceptor es de baja potencia y corto alcance, 200 metros más o menos.
Estos transceivers utilizan la banda de 2,4 GHz como muchos routers WiFi, algunos teléfonos inalámbricos, etc y no necesitan licencia. Estos transceptores pueden tanto enviar, como recibir datos en “paquetes” de varios bytes a la vez.
La librería utilizada es la RF24
https://github.com/maniacbug/RF24Conexión del Arduino al nFR24L01 3V3 ----VCC (3.3V )
pin D8-----------CE (chip enable in)
pin D7----------CSN (chip select in)
SCK pin D13----------SCK (SPI clock in)
MOSI pin D11----------SDI (SPI Data in)
MISO pin D12----------SDO (SPI data out)
GND----------GND Los pin CE y CS se pueden cambiar a otros pin del arduino en el programa.
//RF24 (cepin, cspin)
RF24 radio(8,7);La alimentación del nFR24L01 debe estar entre 1.9 to 3.6V, por lo cual debemos utilizar la salida de 3.3V del arduino. En algunas páginas recomiendan colocar un condensador en la salida de 3.3V para minimizar posibles caídas de tensión debido a un consumo puntual alto.
Para el control de potencia del motor DC se utiliza el modo PWM (control mediante ancho de pulso) que maneja un MOSFET IRF630, es el que tenía a mano, puede servir cualquier otro.
Los servos se controlan mediante el ancho de pulso.
Emisor Programa emisor Arduino |
//xsetaseta@gmail.com #include <SPI.h> #include <nRF24L01.h>
#include <RF24_config.h> #include <RF24.h>
#define debug 0
int sensorPin1 = A0; int sensorPin2 = A1; int sensorPin3 = A2;
unsigned char cadena[10];
RF24 radio(8,7);
unsigned int z;
// Topology // Radio pipe addresses for the 2 nodes to communicate. const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
void setup(void) {
Serial.begin(9600);
radio.begin(); radio.setRetries(15,15); radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1,pipes[1]); Serial.println("Transmitiendo datos"); }
void loop(void) { radio.stopListening(); cadena[0]='A'; cadena[1] = analogRead(sensorPin1)>>2; cadena[2] = analogRead(sensorPin2)>>2; cadena[3] = analogRead(sensorPin3)>>2; cadena[4] = 'A'; cadena[5] = 'A'; #if debug Serial.print(cadena[1],DEC);Serial.print(" "); Serial.print(cadena[2],DEC);Serial.print(" "); Serial.print(cadena[3],DEC); #endif enviarS(); radio.startListening(); delay(21); //20 }
void enviarS() { if (radio.write( cadena, 6 )) { Serial.println(" ok send.");} else { Serial.println(" failed send.");} } |
Receptor Programa receptor Arduino |
//xsetaseta@gmail.com #include <SPI.h> #include <nRF24L01.h>
#include <RF24_config.h> #include <RF24.h>
#include <Servo.h>
#define debug 0
Servo myservo1; Servo myservo2; Servo myservo3;
int posicion;
bool done;
const int analogOutPin = 5;
unsigned char cadena[10]; int z;
//RF24 (cepin, cspin) RF24 radio(8,7);
// Topology // Radio pipe addresses for the 2 nodes to communicate. const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
void setup() { Serial.begin(9600); myservo1.attach(2); myservo2.attach(3); myservo3.attach(4); radio.begin(); radio.setRetries(15,15); radio.startListening(); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1,pipes[0]); Serial.println("Esperando datos"); }
void loop() { delay(10); if ( radio.available() ) { done = false; while (!done) { done = radio.read( cadena, 6); #if debug Serial.print(cadena[0]);Serial.print(" "); Serial.print(cadena[1],DEC);Serial.print(" "); Serial.print(cadena[2],DEC);Serial.print(" "); Serial.print(cadena[3],DEC);Serial.println(" "); #endif z=cadena[0]; switch(z) { case 65: posicion = map(cadena[1], 0, 254, 0, 179); myservo1.write(posicion); posicion = map(cadena[2], 0, 254, 0, 179); myservo2.write(posicion); posicion = map(cadena[3], 0, 254, 0, 179); myservo3.write(posicion); analogWrite(analogOutPin, cadena[3]); break; }
radio.stopListening(); delay(10); radio.startListening(); } } } |
Los dos servos se controlan desde los pins D2 y D3 .
Como podemos ver podemos controlar un tercer servo en el pin D4 o un motor DC se utiliza el modo PWM en el pin D5.
El sistema funciona en prototipo, pero no lo he montado en circuito impreso, ni montado en el avión como me hubiera gustado hacer.
Tampoco he probado el alcance real en campo abierto para ver el alcance real. Cierto es que si necesitamos mucho más alcance existe un módulo nFR24L01 con antena que promete llegar hasta 1Km.
La alimentación normal de todo el circuito es de 5V a excepción del módulo nFR24L01 que es de 3.3V , pero lo he alimentado todo a 3.4V y funciona perfectamente.
LibreríasProgramasHasta pronto.
Juan Galaz
BIBLIOGRAFÍA
https://github.com/maniacbug/RF24https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTohttp://openhardware.pe/transceptores-nrf24l01-2-4ghz-radio-wireless-how-to/http://cursos.olimex.cl/tutoriales/http://www.electroensaimada.com/servomotor.htmlhttp://arduino.cl/servo-motor-con-arduino/