El Programa consta de dos partes, el archivo "XboxRC24_Receptor_Tanque" y el archivo "NRF2401Receptor". Este ultimo sera común a partir de ahora que lo use en mis proyectos sin que sufra muchas modificaciones, es la mejor manera de "reciclar" código. Explicare ese código mas detalladamente en una próxima entrada, tanto la del receptor como la del emisor.
Como ya explique su construcción y diagrama de conexiones en Arduino: driver L293, DHT11 y nRF2401 (parte 1) voy a poner directamente el código:
Código XboxRC24_Receptor_Tanque.ino
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <DHT.h> RF24 radio(9, 10); const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; typedef struct { int dec = 0; //T1 int ace = 0; //T2 int RXdata = 0; // Eje RX int RYdata = 0; // Eje RY int LXdata = 0; // Eje LX int LYdata = 0; // Eje LY int ButA = 0; //Boton A int ButB = 0; //Boton B int ButX = 0; //Boton X int ButY = 0; //Boton Y int Butb = 0; //Boton Back int ButS = 0; //Boton Start } dataReceive; dataReceive dataR; typedef struct { int dataS0 = 0; //dato 0 int dataS1 = 0; //dato 1 int dataS2 = 0; // dado 2 int dataS3 = 0; // dato 3 int dataS4 = 0; // dato 5 } dataSend; dataSend dataS; // Pin digital donde se conectamos el sensor. #define DHTPIN 8 //Definimos el tipo de sensor (DHT11, DHT22). #define DHTTYPE DHT11 //Iniciamos el sensor DHT11. DHT dht(DHTPIN, DHTTYPE); int motor11 = 4; // int motor12 = 5; // 6alidas para el L293N int motor21 = 6; // int motor22 = 7; // int enable1 = 3; // incluidos el enable //int claxon = 10; // int luces = 14; int estado; int flag = 0; int estadoStop = 0; int acc = 0; void setup() { //Configuramos los pines de salida: pinMode(motor11, OUTPUT); pinMode(motor12, OUTPUT); pinMode(enable1, OUTPUT); pinMode(motor21, OUTPUT); pinMode(motor22, OUTPUT); pinMode(luces, OUTPUT); digitalWrite (luces, HIGH); delay (3000); digitalWrite (luces, LOW); dht.begin(); Serial.begin(9600); //Comunicacion serial para el monitor serial radio.begin(); radio.setRetries(15, 15); radio.startListening(); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1, pipes[0]); } void loop() { receiver(); botones(); conversion(); flag = 0; ///////////////////////////////////////////// if (estado == 0 || estadoStop == 1) { // PARADO digitalWrite(motor11, LOW); digitalWrite(motor12, LOW); digitalWrite(motor21, LOW); digitalWrite(motor22, LOW); if (flag == 0) { Serial.println("STOP!"); flag = 1; } estadoStop = 0; } else if (estado == 1) { // AVANCE: analogWrite(enable1, acc); digitalWrite(motor11, HIGH); digitalWrite(motor12, LOW); digitalWrite(motor21, HIGH); digitalWrite(motor22, LOW); if (flag == 0) { Serial.println("Avance!!!"); flag = 1; } } else if (estado == 2) { // REVERSA analogWrite(enable1, acc); digitalWrite(motor11, LOW); digitalWrite(motor12, HIGH); digitalWrite(motor21, LOW); digitalWrite(motor22, HIGH); if (flag == 0) { Serial.println("REVERSA!!!"); flag = 1; } } else if (estado == 3) { // IZQUIERDA analogWrite(enable1, acc); digitalWrite(motor11, LOW); digitalWrite(motor12, HIGH); digitalWrite(motor21, HIGH); digitalWrite(motor22, LOW); if (flag == 0) { Serial.println("GIRA IZQUIERDA"); flag = 1; } } else if (estado == 4) { // DERECHA analogWrite(enable1, acc); digitalWrite(motor11, HIGH); digitalWrite(motor12, LOW); digitalWrite(motor21, LOW); digitalWrite(motor22, HIGH); if (flag == 0) { Serial.println("GIRA DERECHA"); flag = 1; } } static unsigned long lastTrigger; //Limpia la pantalla cada 500ms if (millis() - lastTrigger >= 2000) { lastTrigger = millis(); dht11Read(); } } void conversion() { acc = map(dataR.ace, 0, 100, 0, 254); acc = constrain (acc, 0 , 240); if (dataR.RYdata == dataR.RXdata) estado = 0; else if ((dataR.RYdata > 50) && (dataR.RXdata <= 50)) estado = 1; //AVANCE else if ((dataR.RYdata < 50) && (dataR.RXdata >= 50)) estado = 2; //REVERSA else if ((dataR.RXdata > 50) && (dataR.RYdata <= 50)) estado = 3; //DERECHA else if ((dataR.RXdata < 50) && (dataR.RYdata >= 50)) estado = 4; //IZQUIERDA } void botones() { if (dataR.ButA == 0) { digitalWrite(luces, HIGH); } else { digitalWrite (luces, LOW); } } void dht11Read(){ float h = dht.readHumidity();// Lee la humedad relativa. float t = dht.readTemperature();// Lee la temperatura en ºC (por defecto). if (isnan(h) || isnan(t)) { Serial.println("Error obteniendo los datos del sensor DHT11"); return; //Si tiene error vuelve a leer el sensor } float hic = dht.computeHeatIndex(t, h, false); //Calcula el índice de calor en ºC dataS.dataS1 = t; dataS.dataS2 = h; dataS.dataS3 = hic; Serial.println(); Serial.print("Temperatura: "); Serial.print(t); Serial.println(" ºC"); Serial.print("Humedad: "); Serial.print(h); Serial.println(" %"); Serial.print("Indice de calor: "); Serial.print(hic); Serial.println(" ºC"); }
Código NRF2401Receptor.ino
void receiver(){ if ( radio.available() ) // Si hay datos disponibles { bool done = false; while (!done) // Espera aqui hasta recibir algo { done = radio.read( &dataR, sizeof(dataR)); //receiverDebug(); } radio.stopListening(); // Dejamos d escuchar para poder hablar radio.write( &dataS, sizeof(dataS)); Serial.println("Enviando Respuesta"); radio.startListening(); // Volvemos a la escucha para recibir mas paquetes //sendDebug(); } } void receiverDebug() { Serial.println("Dato Recibido ="); Serial.print("Canal 0 = "); Serial.println(dataR.dec); Serial.print("Canal 1 = "); Serial.println(dataR.ace); Serial.print("Canal 2 = "); Serial.println(dataR.RXdata); Serial.print("Canal 3 = "); Serial.println(dataR.RYdata); Serial.print("Canal 4 = "); Serial.println(dataR.LXdata); Serial.print("Canal 5 = "); Serial.println(dataR.LYdata); Serial.print("Canal 6 = "); Serial.println(dataR.ButA); } void sendDebug(){ Serial.println(dataS.dataS0); Serial.println(dataS.dataS1); Serial.println(dataS.dataS2); Serial.println(dataS.dataS3); Serial.println(dataS.dataS4); }
Monitor Serial XboxRC24 |
Muchas Gracias a todos, Si tenéis cualquier duda hacedmelo saber en la caja de comentarios, Saludos!!!
No hay comentarios :
Publicar un comentario