Robot IMAGINA TDR STEAM

Este robot utiliza dos servos transformados en motores de corriente continua, accionados con dos relés y una placa IMAGINA TDR STEAM montada sobre un Arduino UNO.

La placa IMAGINA TDR STEAM dispone de dos pulsadores (D2 / D3), un sensor de humedad y temperatura DHT11 (D4), un sensor de luz LDR (A1), un sensor de temperatura LM35D (A2), un receptor de infrarrojos (D6), un puerto analógico en el que hemos conectado un sensor Sharp 2Y0A21 que mira hacia la derecha (A3), una interfaz I2C compatible con sensores (SDA A4, A5 SCL), un puerto serie TTL y el botón de reinicio.

Dispone de un led azul (D13) y uno rojo (D12), un led RGB (D9 / D10 / D11), un zumbador piezoeléctrico (D5), un potenciómetro que hemos anulado para poder conectar el sensor Sharp 2Y0A21 que mira hacia adelante (A0), dos puertos digitales en los que se han conectado los motores de las ruedas con un par de relés (Los relés se activan con "digitalWrite(7, LOW);") (D7 / D8). D7 mueve la rueda izquierda y D8 la rueda derecha.

También hemos colocado dos sensores CNY70 para la función de robot seguidor de linea, conectados a A4 y A5. A4 está conectado al sensor de la izquierda y A5 al de la derecha.

En lugar de los sensores CNY70 se pueden utilizar también sensores barrera de infrarrojos como los que se muestran a continuación. Estos sensores tienen una salida digital, pero se puede utilizar en una entrada analógica de Arduino.

Programa para un seguidor de linea

int sensorderecho;

int sensorizquierdo;

int direccion;

void setup() {

pinMode(7, OUTPUT);

pinMode(8, OUTPUT);

Serial.begin(9600);

}

void loop() {

sensorderecho = analogRead(A5);

sensorizquierdo = analogRead(A4);

Serial.println(sensorderecho);

Serial.println(sensorizquierdo);

if ((sensorderecho>250)||(direccion==0)) {

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, HIGH);//Rueda derecha parada

direccion = 0;

}

if ((sensorizquierdo>250)||(direccion==1)) {

digitalWrite(7, HIGH);//Rueda izquierda parada

digitalWrite(8, LOW);//Rueda derecha adelante

direccion = 1;

}

if ((sensorizquierdo>250)&&(sensorderecho>250)) {

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, LOW);//Rueda derecha adelante

}

}

Un programa un poco más lento

Esta otra versión del programa reduce la velocidad para seguir mejor la linea.

int sensorderecho;

int sensorizquierdo;

int direccion;

void setup() {

pinMode(7, OUTPUT);

pinMode(8, OUTPUT);

Serial.begin(9600);

}

void loop() {

sensorderecho = analogRead(A5);

sensorizquierdo = analogRead(A4);

Serial.println(sensorderecho);

Serial.println(sensorizquierdo);

if ((sensorderecho>250)||(direccion==0)) {

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, HIGH);//Rueda derecha parada

delay(20);

digitalWrite(7, HIGH);//Rueda izquierda parada

digitalWrite(8, HIGH);//Rueda derecha parada

delay(10);

direccion = 0;

}

if ((sensorizquierdo>250)||(direccion==1)) {

digitalWrite(7, HIGH);//Rueda izquierda parada

digitalWrite(8, LOW);//Rueda derecha adelante

delay(20);

digitalWrite(7, HIGH);//Rueda izquierda parada

digitalWrite(8, HIGH);//Rueda derecha parada

delay(10);

direccion = 1;

}

if ((sensorizquierdo>250)&&(sensorderecho>250)) {

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, LOW);//Rueda derecha adelante

}

}

Se podría hacer que el programa del robot rastreador fuese más rápido, utilizando interrupciones. Arduino UNO puede utilizar dos interrupciones en los pines 2 y 3.

Programa para un robot con un sensor de distancia lateral para rodear cajas

// Pin de lectura del sensor lateral Sharp 2Y0A21

int ir_sensor0 = A3;

void setup()

{

pinMode(7, OUTPUT);

pinMode(8, OUTPUT);

}

void loop()

{

int lectura, distancialateral;

lectura = analogRead(ir_sensor0); // lectura del sensor A0

distancialateral = pow(3027.4 / lectura, 1.2134); // conversión a centímetros

if(distancialateral>10){

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, HIGH);//Rueda derecha parada

}

if(distancialateral<10){

digitalWrite(7, HIGH);//Rueda izquierda parada

digitalWrite(8, LOW);//Rueda derecha adelante

}

if(distancialateral==10){

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, LOW);//Rueda derecha adelante

}

}

Programa con dos sensores de distancia para salir de un laberinto

// Pin de lectura del sensor lateral Sharp 2Y0A21

int ir_sensor0 = A3;

// Pin de lectura del sensor frontal Sharp 2Y0A21

int ir_sensor1 = A0;

void setup()

{

pinMode(7, OUTPUT);

pinMode(8, OUTPUT);

}

void loop()

{

int lectura, lecturas, distancialateral, distanciafrontal;

lectura = analogRead(ir_sensor0); // lectura del sensor A3

distancialateral = pow(3027.4 / lectura, 1.2134); // conversión a centímetros

lecturas = analogRead(ir_sensor1); // lectura del sensor A0

distanciafrontal = pow(3027.4 / lecturas, 1.2134); // conversión a centímetros

if(distanciafrontal>15){

if(distancialateral>15){

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, HIGH);//Rueda derecha parada

}

if(distancialateral<15){

digitalWrite(7, HIGH);//Rueda izquierda parada

digitalWrite(8, LOW);//Rueda derecha adelante

}

if(distancialateral==15){

digitalWrite(7, LOW);//Rueda izquierda adelante

digitalWrite(8, LOW);//Rueda derecha adelante

}

}

if(distanciafrontal<=15){

digitalWrite(7, HIGH);//Rueda izquierda parada

digitalWrite(8, LOW);//Rueda derecha adelante

}

}

Programa que mide la temperatura con el sensor LM35D

void setup()

{

Serial.begin(9600);

}

void loop()

{

int valor = analogRead(A2);

float millivoltios = (valor / 1023.0) * 5000;

float gradoscelsius = millivoltios / 10;

Serial.print(gradoscelsius);

Serial.println(" C");

delay(1000);

}

Programa que mide temperatura y humedad con un sensor DHT11

#include <DHT.h>

// Definimos el pin digital donde se conecta el sensor

#define DHTPIN 4

// Definimos el tipo de sensor

#define DHTTYPE DHT11

// Inicializamos el sensor DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {

// Inicializamos comunicación serie

Serial.begin(9600);

// Comenzamos el sensor DHT

dht.begin();

}

void loop() {

// Esperamos 5 segundos entre medidas

delay(5000);

// Leemos la humedad relativa

float h = dht.readHumidity();

// Leemos la temperatura en grados centígrados (por defecto)

float t = dht.readTemperature();

// Leemos la temperatura en grados Fahreheit

float f = dht.readTemperature(true);

// Comprobamos si ha habido algún error en la lectura

if (isnan(h) || isnan(t) || isnan(f)) {

Serial.println("Error obteniendo los datos del sensor DHT11");

return;

}

// Calcular la sensación térmica en Fahreheit

float hif = dht.computeHeatIndex(f, h);

// Calcular la sensación térmica en grados centígrados

float hic = dht.computeHeatIndex(t, h, false);

Serial.print("Humedad: ");

Serial.print(h);

Serial.print(" %\t");

Serial.print("Temperatura: ");

Serial.print(t);

Serial.print(" *C ");

Serial.print(f);

Serial.print(" *F\t");

Serial.print("Índice de calor: ");

Serial.print(hic);

Serial.print(" *C ");

Serial.print(hif);

Serial.println(" *F");

}