Mostrando entradas con la etiqueta L293. Mostrar todas las entradas
Mostrando entradas con la etiqueta L293. Mostrar todas las entradas

viernes, 1 de diciembre de 2017

Arduino: Coche RC Maisto Drift XboxRC24

Buenas a todos los Arduineros y Arduineras!!

Ahora le toca el paso a los coches RC!!! Estos son los que siempre ha sido mi preferencia en cuanto a radio control. Y ahora voy a ver que tal le sienta a Arduino el control de este tipo de vehículos. En principio con todo lo visto en el blog sobre los módulos de comunicación nRF2401 podríais montar uno sin ningún tipo de problemas.

En los archivos para la descarga incluyo también el del mando de Xbox modificado ya que también esta modificado para soportar nuevas funciones y ajustes que voy incluyendo poco a poco.

Bueno para este proyecto voy a utilizar la misma plantilla del archivo .ino que use con el tanque RC.

Esto me obliga también ha hacer cambios en casi todo lo que tengo así que iré publicando los archivos cuando crea que la versión esta lista.

La base de este proyecto es un coche RC que me cayo en mis manos hace años y haremos que vuelva a andar como el primer día... o mejor ;)

Arduino Maisto Monster Drift Arduino Maisto Monster Drift

Se llama Maisto Monster Drift y ya le hice unas modificaciones anteriormente, bueno viendo la fecha... hacer bastante tiempo.

Lo primero que había que modificar era la dirección. Así que lo primero que tenemos que hacer es quitar la electrónica original para dar cabida al servo, al Arduino NANO y al driver L293.

Del integrado L923 solo usaremos la mitad del chip ya que solo tenemos que alimentar uno de los motores.


Arduino Maisto Monster Drift
Quitar la parte superior

Arduino Maisto Monster Drift
Electrónica que tenemos que no vamos a usar


Arduino Maisto Monster Drift
Maisto Monster Drift sin electrónica

lunes, 13 de noviembre de 2017

Arduino Ejemplos: Control de tanque RC con L293, DHT11 y NRF2401 (Parte 2)

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

El Programa esta dividido 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; // salidas 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);
}


Salida serial de XboxRC24:


Monitor Serial XboxRC24

Si te interesa la comunicación puedes revisar otras entradas relacionadas con el módulo nRF2401:


Muchas Gracias a todos, Si tenéis cualquier duda hacédmelo saber en la caja de comentarios, Saludos!!!

Arduino Ejemplos: Control de tanque RC con L293, DHT11 y NRF2401 (Parte 1)

Muy buenas a todos y todas!!

Esto va sobre ruedas, y nunca mejor dicho, ya tengo la primera versión del mando XboxRC24 transmitter y para sus pruebas he utilizado un vehículo que construí cuando trabajaba con los microcontroladores 16f, que buenos recuerdos, siempre liado con los puertos COM del portátil...

Lo termine (todos sabemos que estos proyectos nunca terminan) y al poco tiempo empecé con Arduino.

Arduino nRF2401
Arduino nRF2401

Hace un tiempo lo actualice a esta plataforma utilizando el HC-06 encargado de la transmisiones de datos, ahora se encargará el nRF2401. Con un mayor alcance, un consumo casi de risa y siendo realmente estable es la mejor solución que he visto hasta ahora en el tema de radio control.


Oruga Cebek V2

La base de este proyecto es completamente artesanal, realizado en aluminio y plástico reciclado.

La estructura de aluminio son unos separadores de los que se utilizan en la obra en cocinas y baños.

La base sobre la que va montada la electrónica son de una caja registradora.

Oruga Cebek V2

Cuenta con una batería Ni-Cd de 9,6V y 900mAh, como ya he comentado y seguramente vuelva a comentar, el tema de las baterías tengo que estudiarlo más a fondo ya que es algo que a día de hoy esta muy avanzado. Es un diseño sencillo pero muy robusto, ideal para cacharrear con el.

Tenéis mas fotos de su construcción original en la entrada que escribí en su momento: Oruga cebek C-6083 V2

A partir de esas todo lo demás pertenece a la ultima actualización.

La electrónica:

Esquema de conexiones pata Tanque XboxRC24
Esquema de conexiones para Tanque XboxRC24