Página principal

nRF24L01
Control de 2 servos + 1 servo o motor
xsetaseta@gmail.com


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/RF24






Conexió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 "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 "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ías
Programas


Hasta pronto.
Juan Galaz


BIBLIOGRAFÍA

https://github.com/maniacbug/RF24
https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
http://openhardware.pe/transceptores-nrf24l01-2-4ghz-radio-wireless-how-to/
http://cursos.olimex.cl/tutoriales/
http://www.electroensaimada.com/servomotor.html
http://arduino.cl/servo-motor-con-arduino/



www.000webhost.com