lunes, 26 de abril de 2010

Modo Automático/Manual

Vamos a manejar un coche de dos modos diferentes, aútomatico y manual.
En el modo manual enviaremos las instrucciones por infrarrojos.
El modo automático será controlado por la señal que recibe el sensor de ultrasonidos URM V3.2. En este ejemplo juntamos las funcionalidades de las últimas dos entradas del blog.


Conexiones
----------
Tutorial SN754410NE
Integrado SN754410NE, driver para manejar motores. Sustito de la familia L293
Pines 1, 9 y 16 a +5V
Pin 8 a +9-24V
Pines 2, 7 10 y 15 a la placa Arduino
Pines 4, 5, 12 y 13 a ground (Dos de ellos a la placa y dos a la fuente de alimentación)
Pines 3, 6 11 y 14 conectados a los motores

Tutorial URM V3.2
pin 7 URM --> pin 42 arduino
pin 6 URM --> pin 40 arduino
pin 4 URM --> pin 38 arduino
pin 2 URM --> ground arduino
pin 1 URM --> pin 36 arduino






#include "WProgram.h"
#include "NECIRrcv.h"
#define IRPIN 12
unsigned long ircode;

const int pin1=7;
const int pin2=13;
const int pin3=6;
const int pin4=2;
const int pin5=5;

unsigned long a1=2;
unsigned long a2=2;
unsigned long a3=2;
unsigned long a4=2;
unsigned long a5=2;
int duracion1=600;
int duracion2=1000;
boolean aux=true;

int ultraData=38;
int ultraTrigger=40;
int ultraEnable=42;
int ultraPower=36;
int val=0;
int ultraValue=0;
int timecount=0;

bool State=true;
long previousMillis = 0;
long interval = 8000;

NECIRrcv ir(IRPIN);

const int input1=10;
const int input2=11;
const int input3=9;
const int input4=8;

void adelante()
{
digitalWrite(input1, LOW);
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);
digitalWrite(input4, HIGH);
digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void izquierda()
{
digitalWrite(input1, HIGH);
digitalWrite(input2, LOW);
digitalWrite(input3, LOW);
digitalWrite(input4, HIGH);
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void derecha()
{
digitalWrite(input1, LOW);
digitalWrite(input2, HIGH);
digitalWrite(input3, HIGH);
digitalWrite(input4, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void atras()
{
digitalWrite(input1, HIGH);
digitalWrite(input2, LOW);
digitalWrite(input3, HIGH);
digitalWrite(input4, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, HIGH);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void parar()
{
digitalWrite(input1, LOW);
digitalWrite(input2, LOW);
digitalWrite(input3, LOW);
digitalWrite(input4, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
luzPosicion();
}
void luzPosicion()
{
if(aux)
{
digitalWrite(pin4, HIGH);
digitalWrite(pin5, LOW);
aux=false;
}
else
{
digitalWrite(pin4, LOW);
digitalWrite(pin5, HIGH);
aux=true;
}
}

void setup()
{
pinMode(input1, OUTPUT);
pinMode(input2, OUTPUT);
pinMode(input3, OUTPUT);
pinMode(input4, OUTPUT);
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);
pinMode(pin5, OUTPUT);
pinMode(IRPIN, INPUT);
ir.begin();
Serial.begin(9600);
pinMode(ultraPower, OUTPUT);
pinMode(ultraEnable, OUTPUT);
digitalWrite(ultraPower, HIGH);
digitalWrite(ultraEnable, HIGH);
delay(200);
}

void loop()
{
while (ir.available())
{
ircode=ir.read();
if(ircode==4194696960)
{
do{
ultraValue = 0;
timecount = 0;
val = 0;
pinMode(ultraTrigger, OUTPUT);
digitalWrite(ultraTrigger, HIGH);
delayMicroseconds(500);
digitalWrite(ultraTrigger, LOW);
delayMicroseconds(200);
digitalWrite(ultraTrigger, HIGH);
delayMicroseconds(200);
pinMode(ultraData, INPUT);

do
{
val=digitalRead(ultraData);
}while(val==HIGH);

do
{
val=digitalRead(ultraData);
timecount++;
delayMicroseconds(50);
}while(val==LOW);

ultraValue=timecount;
Serial.println(ultraValue);

if(ultraValue>=28)
{
adelante();
}
else
{
derecha();
}
Serial.flush();
delay(70);
}while(State);

if (millis() - previousMillis > interval)
{
previousMillis = millis();
if (State == false)
State = true;
else
State = false;
}
ircode=0;
}
else
{
if(2707357440==ircode)
{
duracion1=300;
duracion2=1000;
}
if(2724069120==ircode)
{
duracion1=500;
duracion2=3000;
}
if(3776904960==ircode)
{
duracion1=800;
duracion2=5000;
}
if(ircode==3810328320)//HACIA DELANTE
{
adelante();
delay(duracion2);
parar();
ircode=0;
}
if(ircode==3877175040)//HACIA ATRAS
{
atras();
delay(duracion2);
parar();
ircode=0;
}
if(ircode==3893886720)//DERECHA
{
derecha();
delay(duracion1);
parar();
ircode=0;
}
if(ircode==2824339200)//IZQUIERDA
{
izquierda();
delay(duracion1);
parar();
ircode=0;
}
Serial.println(ircode);
}
}
}

martes, 20 de abril de 2010

Robot autónomo URM V3.2

En el siguiente programa queremos implementar la automatización de nuestro robot a partir de un sensor URM V3.2. Cada vez que el sensor reciba señal de que se encuentra cercano a un objeto este girará, hasta que ya no se encuentre nada en su camino y siga hacia delante.








El circuito lo implementaremos de la siguiente manera:
Pines 1, 9 y 16 a +5V
Pin 8 a +9-24V
Pines 2, 7 10 y 15 a la placa Arduino
Pines 4, 5, 12 y 13 a ground (Dos de ellos a la placa y dos a la fuente de alimentación)
Pines 3, 6 11 y 14 conectados a los motores

Tutorial URM
pin 7 URM --> pin 42 arduino
pin 6 URM --> pin 40 arduino
pin 4 URM --> pin 38 arduino
pin 2 URM --> ground arduino
pin 1 URM --> pin 36 arduino



autonomo.pde


//Coche automatico, cuando el URM recibe señal de que existe un objeto proximo el coche gira
//Tutorial
//Integrado SN754410NE, driver para manejar motores. Sustito de la familia L293

#include "WProgram.h"
#include "NECIRrcv.h"
#define IRPIN 12
unsigned long ircode;

const int pin1=7;
const int pin2=13;
const int pin3=6;
const int pin4=2;
const int pin5=5;
boolean aux=true;

int ultraData=38;
int ultraTrigger=40;
int ultraEnable=42;
int ultraPower=36;
int val=0;
int ultraValue=0;
int timecount=0;

int State = LOW;
long previousMillis = 0;
long interval = 18000;

NECIRrcv ir(IRPIN);

const int input1=10;
const int input2=11;
const int input3=9;
const int input4=8;

void adelante()
{
digitalWrite(input1, LOW);
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);
digitalWrite(input4, HIGH);
digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void izquierda()
{
digitalWrite(input1, HIGH);
digitalWrite(input2, LOW);
digitalWrite(input3, LOW);
digitalWrite(input4, HIGH);
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void derecha()
{
digitalWrite(input1, LOW);
digitalWrite(input2, HIGH);
digitalWrite(input3, HIGH);
digitalWrite(input4, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void atras()
{
digitalWrite(input1, HIGH);
digitalWrite(input2, LOW);
digitalWrite(input3, HIGH);
digitalWrite(input4, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, HIGH);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
}
void parar()
{
digitalWrite(input1, LOW);
digitalWrite(input2, LOW);
digitalWrite(input3, LOW);
digitalWrite(input4, LOW);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
luzPosicion();
}
void luzPosicion()
{
if(aux)
{
digitalWrite(pin4, HIGH);
digitalWrite(pin5, LOW);
aux=false;
}
else
{
digitalWrite(pin4, LOW);
digitalWrite(pin5, HIGH);
aux=true;
}
}

void setup()
{
pinMode(input1, OUTPUT);
pinMode(input2, OUTPUT);
pinMode(input3, OUTPUT);
pinMode(input4, OUTPUT);
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);
pinMode(pin5, OUTPUT);
pinMode(IRPIN, INPUT);
ir.begin();
Serial.begin(9600);
pinMode(ultraPower, OUTPUT);
pinMode(ultraEnable, OUTPUT);
digitalWrite(ultraPower, HIGH);
digitalWrite(ultraEnable, HIGH);
delay(200);
}

void loop()
{
ultraValue = 0;
timecount = 0;
val = 0;
pinMode(ultraTrigger, OUTPUT);
digitalWrite(ultraTrigger, HIGH);
delayMicroseconds(500);
digitalWrite(ultraTrigger, LOW);
delayMicroseconds(200);
digitalWrite(ultraTrigger, HIGH);
delayMicroseconds(200);
pinMode(ultraData, INPUT);

do
{
val=digitalRead(ultraData);
}while(val==HIGH);

do
{
val=digitalRead(ultraData);
timecount++;
delayMicroseconds(50);
}while(val==LOW);

ultraValue=timecount;
Serial.println(ultraValue);
if(ultraValue>=28)
{
adelante();
}
else
{
if(State==false)
{
derecha();
}
else
{
izquierda();
}
}
Serial.flush();
delay(70);

if (millis() - previousMillis > interval)
{
previousMillis = millis();
if (State == LOW)
State = HIGH;
else
State = LOW;
}
}

lunes, 19 de abril de 2010

URM V3.2 Ultrasonic Sensor

En el siguiente ejemplo vamos a utilizar un sensor de ultrasonidos, el URM V3.2



Este sensor nos devuelve la distancia a la que se encuentra un objeto.
Encenderemos un LED rojo cuando un objeto se encuentre muy próximo, un LED azul cuando se encuentre a una distancia media, y un LED verde cuando el objeto se encuentre lejano.
Este sensor tiene un rango de 5-5000 cm

El circuito lo implementaremos de la siguiente manera:

URM V3.2 Ultrasonic Sensor
--------------------------
pin 7 URM --> pin 9 arduino
pin 6 URM --> pin 10 arduino
pin 4 URM --> pin 11 arduino
pin 2 URM --> ground arduino
pin 1 URM --> pin 12 arduino

URM V3.2



URM.pde


//Comprobamos la distancia de un objeto al sensor URM V3.2
//Utilizaremos un LED tricolor para representar la distancia de un objeto al sensor
int ultraData = 11;
int ultraTrigger = 10;
int ultraEnable=9;
int ultraPower=12;
int val = 0;
int ultraValue = 0;
int timecount = 0;

const int rojo=2;
const int verde=3;
const int azul=4;

void setup()
{
Serial.begin(9600);
pinMode(ultraPower, OUTPUT);
pinMode(ultraEnable, OUTPUT);
pinMode(rojo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
digitalWrite(ultraPower, HIGH);
digitalWrite(ultraEnable, HIGH);
delay(200);
}

void loop()
{
ultraValue = 0;
timecount = 0;
val = 0;
pinMode(ultraTrigger, OUTPUT);
digitalWrite(ultraTrigger, HIGH);
delayMicroseconds(500);
digitalWrite(ultraTrigger, LOW);
delayMicroseconds(200);
digitalWrite(ultraTrigger, HIGH);
delayMicroseconds(200);
pinMode(ultraData, INPUT);

do
{
val=digitalRead(ultraData);
}while(val==HIGH);

do
{
val=digitalRead(ultraData);
timecount++;
delayMicroseconds(50);
}while(val==LOW);

ultraValue=timecount;
Serial.println(ultraValue);

if(ultraValue<40)
{
analogWrite(rojo, 50);
}
else
{
digitalWrite(rojo, LOW);
}
if(ultraValue>=40 && ultraValue<100)
{
analogWrite(azul, 50);
}
else
{
digitalWrite(azul, LOW);
}
if(ultraValue>=100)
{
analogWrite(verde, 50);
}
else
{
digitalWrite(verde, LOW);
}
Serial.flush();
delay(50);
}