Advertisement
Villalba2006

POST_72_A

Nov 29th, 2016
7,756
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.29 KB | None | 0 0
  1. /*  TITULO: Comunicación bidireccional entre Arduinos con módulos NRF24L01
  2.             >> Programa Arduino "A"
  3.            
  4.     AUTOR:
  5.    
  6.     MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
  7.     - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
  8.     - TWITTER: https://twitter.com/MarianoCampoGa
  9.     - CORREO: marianodc83@gmail.com
  10.    
  11.    
  12.     DESCRIPCIÓN DEL PROGRAMA
  13.    
  14.     Con este programa controlamos el encendido y apagado de un LED con un solo pulsador, mediante una
  15.     conexión por radiofrecuencia (RF) bidireccional entre dos Arduinos, a través de módulos NRF24L01.    
  16.     Vamos a recibir el valor de la variable estado_pulsador_B[0] vía RF desde el Arduino "B", cada
  17.     vez que se presione el pulsador conectado a él, si esta variable tiene el valor de "1" se enciende
  18.     el LED conectado a este Arduino ("A") y si vale "0" el LED se apaga. En el supuesto de que nunca
  19.     recibamos ningún valor de la variable estado_pulsador_B[0], el LED permanecerá apagado (no se ha
  20.     presionado todavía el pulsador del Arduino "B").    
  21.     Por otro lado, cada vez que presionamos el pulsador conectado a este Arduino, se envía mediante RF
  22.     el valor de la variable estado_pulsador_A[0], si es la primera vez que lo presionamos se envía un
  23.     "1" y si es la segunda vez un "0", repitiéndose el proceso contínuamente, para que se encienda o
  24.     apage el LED conectado al Arduino "B", que es el que obtiene, a través de RF, el valor de la
  25.     variable estado_pulsador_A[0]. En el supuesto de que nunca presionemos el pulsador, no se envía
  26.     ningún valor mediante RF y como consecuencia el LED permanecerá apagado.
  27.    
  28.    
  29.    
  30.     ESQUEMA DE CONEXION
  31.    
  32.                                       +-----+
  33.          +----[PWR]-------------------| USB |--+
  34.          |                            +-----+  |
  35.          |         GND/RST2  [ ][ ]            |
  36.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |    
  37.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |    
  38.          |                             AREF[ ] |
  39.          |                              GND[ ] |
  40.          | [ ]N/C                    SCK/13[ ] |   Pin "SCK" del módulo NRF24L01
  41.          | [ ]IOREF                 MISO/12[ ] |   Pin "MISO" del módulo NRF24L01
  42.          | [ ]RST                   MOSI/11[ ]~|   Pin "MOSI" del módulo NRF24L01
  43.          | [ ]3V3    +---+               10[ ]~|   Pin "CSN" del módulo NRF24L01
  44.          | [ ]5v    -| A |-               9[ ]~|   Pin "CE" del módulo NRF24L01
  45.          | [ ]GND   -| R |-               8[ ] |  
  46.          | [ ]GND   -| D |-                    |
  47.          | [ ]Vin   -| U |-               7[ ] |   PA
  48.          |          -| I |-               6[ ]~|   LED(+)
  49.          | [ ]A0    -| N |-               5[ ]~|  
  50.          | [ ]A1    -| O |-               4[ ] |  
  51.          | [ ]A2     +---+           INT1/3[ ]~|  
  52.          | [ ]A3                     INT0/2[ ] |  
  53.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  54.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  55.          |            [ ] [ ] [ ]              |
  56.          |  UNO_R3    GND MOSI 5V  ____________/
  57.           \_______________________/
  58.  
  59.   NOTAS:
  60.    - Alimentación del módulo NRF24L01:
  61.      - GND del módulo NRF24L01--> GND de Arduino.
  62.      - VCC del módulo NRF24L01--> +3.3V de Arduino.
  63.    - El pin "IRQ" del modulo NRF24L01 no se conecta a nuestro Arduino.
  64.    - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos)
  65.    - Conexión PULL-DOWN del pulsador.
  66.        - PB conectado a VCC.
  67.        - PA conectado a GND a través de una R=10K ohms.
  68.    - Cátodo(-) del LED (pata más corta) a GND a través de una R=220 ohms.            
  69. */
  70.  
  71.   // Incluimos las librerías necesarias
  72.   #include <SPI.h> // Librería para la comunicación SPI
  73.   // Librerías para el funcionamiento del módulo NRF24L01
  74.   #include <nRF24L01.h>
  75.   #include <RF24.h>
  76.  
  77.   // Declaramos los pines de control del módulo NRF24L01
  78.   #define CE 9
  79.   #define CSN 10
  80.  
  81.   // Se crea el objeto tipo RF24
  82.   RF24 radio(CE, CSN);
  83.  
  84.   // Se declaran los canales (64 bits en hexadecimal) para transmisión RF
  85.   const uint64_t canal[2] = {0xF0F0F0F0E1LL,0xF0F0F0F0D2LL};
  86.  
  87.   // Variable que enviamos mediante RF (de tipo string siempre)
  88.   unsigned int estado_pulsador_A[1];
  89.  
  90.   // Variable que recibimos mediante RF (de tipo string siempre)
  91.   unsigned int estado_pulsador_B[1];
  92.  
  93.   int pulsador = 7; // Pin digital 7 para el pulsador
  94.   int LED = 6; // Pin digital 6 para el LED
  95.  
  96.   // Inicializamos las variables internas para el pulsador
  97.   int encender = 0;
  98.   int anterior = 0;
  99.   int estado = 0;  
  100.  
  101.  
  102.   void setup()
  103.   {
  104.       pinMode(LED, OUTPUT); // Pin digital 6 como salida    
  105.       pinMode(pulsador, INPUT); // Pin digital 7 como entrada
  106.       pinMode(CSN, OUTPUT); // Pin digital 10 como salida
  107.    
  108.       digitalWrite(LED, LOW); // Inicialmente el LED se apaga
  109.      
  110.       radio.begin();  // Inicialización de la comunicación RF
  111.      
  112.       // Establece el retardo y el número de reintentos tras fallo en la comunicación RF
  113.       radio.setRetries(15,15);
  114.      
  115.       radio.openWritingPipe(canal[0]); // Abro el canal "0" para escribir
  116.       radio.openReadingPipe(1,canal[1]); // Abro el canal "1" para leer
  117.   }
  118.  
  119.   void loop()
  120.   {
  121.       // ************************ PARTE CORRESPONDIENTE A LA RECEPCIÓN A ****************************
  122.      
  123.       radio.startListening(); // Comienzo a escuchar por el canal "1"
  124.      
  125.       // Siempre que haya información disponible vía RF...   
  126.       while(radio.available())
  127.       {
  128.         // Se recibe el valor de la variable estado_pulsador_B[0] a través de RF
  129.         radio.read(estado_pulsador_B, sizeof(estado_pulsador_B));    
  130.      
  131.         // Si el valor de la variable estado_pulsador_B[0] es igual a "1" se enciende el LED
  132.         if (estado_pulsador_B[0] == 1)
  133.         {
  134.           digitalWrite(LED, HIGH);
  135.         }
  136.        
  137.         // Si el valor de la variable estado_pulsador_B[0] es igual a "0" se apaga el LED
  138.         if (estado_pulsador_B[0] == 0)
  139.         {
  140.           digitalWrite(LED, LOW);
  141.         }      
  142.       }    
  143.       delay(20); // Doy tiempo de lectura al receptor A
  144.      
  145.       radio.stopListening(); // Paro de escuchar por el canal "1"
  146.      
  147.      
  148.       // ************************ PARTE CORRESPONDIENTE A LA EMISIÓN A ****************************
  149.      
  150.       estado = digitalRead(pulsador); // Guardamos el estado actual del pulsador
  151.        
  152.       if(estado && anterior == 0) // Comparamos el estado actual y el anterior del pulsador A
  153.       {
  154.         encender = 1 - encender;
  155.       }
  156.      
  157.       anterior = estado; // Actualizamos el estado del pulsador A.
  158.      
  159.       if(encender) // Si el estado interno del pulsador A pasa de "LOW" a "HIGH".
  160.       {
  161.         estado_pulsador_A[0] = 1; // La variable vale 1
  162.       }
  163.      
  164.       else // Si el estado interno del pulsador  A pasa de "HIGH" a "LOW".
  165.       {
  166.         estado_pulsador_A[0] = 0; // La variable vale 0
  167.       }  
  168.            
  169.       // Se envía el valor de la variable estado_pulsador_A[0] a través de RF
  170.       radio.write(estado_pulsador_A, sizeof(estado_pulsador_A));
  171.       delay(20); // Doy tiempo de escritura al emisor A        
  172.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement