Advertisement
Villalba2006

POST_72_B

Nov 29th, 2016
7,690
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 "B"
  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_A[0] vía RF desde el Arduino "A", 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 ("B") y si vale "0" el LED se apaga. En el supuesto de que nunca
  19.     recibamos ningún valor de la variable estado_pulsador_A[0], el LED permanecerá apagado (no se ha
  20.     presionado todavía el pulsador del Arduino "A").    
  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_B[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 "A", que es el que obtiene, a través de RF, el valor de la
  25.     variable estado_pulsador_B[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.  
  72.   // Incluimos las librerías necesarias
  73.   #include <SPI.h> // Librería para la comunicación SPI
  74.   // Librerías para el funcionamiento del módulo NRF24L01
  75.   #include <nRF24L01.h>
  76.   #include <RF24.h>
  77.  
  78.   // Declaramos los pines de control del módulo NRF24L01
  79.   #define CE 9
  80.   #define CSN 10
  81.  
  82.   // Se crea el objeto tipo RF24
  83.   RF24 radio(CE, CSN);
  84.  
  85.   // Se declaran los canales (64 bits en hexadecimal) para transmisión RF
  86.   const uint64_t canal[2] = {0xF0F0F0F0E1LL,0xF0F0F0F0D2LL};
  87.  
  88.   // Variable que enviamos mediante RF (de tipo string siempre)
  89.   unsigned int estado_pulsador_B[1];
  90.  
  91.   // Variable que recibimos mediante RF (de tipo string siempre)
  92.   unsigned int estado_pulsador_A[1];
  93.  
  94.   int pulsador = 7; // Pin digital 7 para el pulsador
  95.   int LED = 6; // Pin digital 6 para el LED
  96.  
  97.   // Inicializamos las variables internas para el pulsador
  98.   int encender = 0;
  99.   int anterior = 0;
  100.   int estado = 0;  
  101.  
  102.  
  103.   void setup()
  104.   {
  105.       pinMode(LED, OUTPUT); // Pin digital 6 como salida    
  106.       pinMode(pulsador, INPUT); // Pin digital 7 como entrada
  107.       pinMode(CSN, OUTPUT); // Pin digital 10 como salida
  108.    
  109.       digitalWrite(LED, LOW); // Inicialmente el LED se apaga
  110.      
  111.       radio.begin();  // Inicialización de la comunicación RF
  112.      
  113.       // Establece el retardo y el número de reintentos tras fallo en la comunicación RF
  114.       radio.setRetries(15,15);
  115.      
  116.       radio.openWritingPipe(canal[1]); // Abro el canal "1" para escribir
  117.       radio.openReadingPipe(1,canal[0]); // Abro el canal "0" para leer
  118.   }
  119.  
  120.   void loop()
  121.   {
  122.       // ************************ PARTE CORRESPONDIENTE A LA RECEPCIÓN B ****************************
  123.      
  124.       radio.startListening(); // Comienzo a escuchar por el canal "0"
  125.      
  126.       // Siempre que haya información disponible vía RF...   
  127.       while(radio.available())
  128.       {
  129.         // Se recibe el valor de la variable estado_pulsador_A[0] a través de RF
  130.         radio.read(estado_pulsador_A, sizeof(estado_pulsador_A));    
  131.      
  132.         // Si el valor de la variable estado_pulsador_A[0] es igual a "1" se enciende el LED
  133.         if (estado_pulsador_A[0] == 1)
  134.         {
  135.           digitalWrite(LED, HIGH);
  136.         }
  137.        
  138.         // Si el valor de la variable estado_pulsador_A[0] es igual a "0" se apaga el LED
  139.         if (estado_pulsador_A[0] == 0)
  140.         {
  141.           digitalWrite(LED, LOW);
  142.         }      
  143.       }
  144.       delay(20); // Doy tiempo de lectura al receptor B
  145.      
  146.       radio.stopListening(); // Paro de escuchar por el canal "0"
  147.      
  148.      
  149.       // ************************ PARTE CORRESPONDIENTE A LA EMISIÓN B ****************************
  150.      
  151.       estado = digitalRead(pulsador); // Guardamos el estado actual del pulsador B
  152.        
  153.       if(estado && anterior == 0) // Comparamos el estado actual y el anterior del pulsador B
  154.       {
  155.         encender = 1 - encender;
  156.       }
  157.      
  158.       anterior = estado; // Actualizamos el estado del pulsador B.
  159.      
  160.       if(encender) // Si el estado interno del pulsador B pasa de "LOW" a "HIGH".
  161.       {
  162.         estado_pulsador_B[0] = 1; // La variable vale 1
  163.       }
  164.      
  165.       else // Si el estado interno del pulsador B pasa de "HIGH" a "LOW".
  166.       {
  167.         estado_pulsador_B[0] = 0; // La variable vale 0
  168.       }  
  169.            
  170.       // Se envía el valor de la variable estado_pulsador_B[0] a través de RF
  171.       radio.write(estado_pulsador_B, sizeof(estado_pulsador_B));
  172.       delay(20); // Doy tiempo de escritura al emisor B      
  173.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement