lunes, 13 de noviembre de 2017

Arduino: Driver L293, DHT 11, nRF2401 (parte2)

Buenas a todos ya esta listo el programa para sus primeras pruebas.

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