lunes, 22 de marzo de 2010

Robot controlado por Infrarrojos II

El siguiente ejemplo es igual al que hemos visto anteriormente, pero le hemos incluido unos LEDs para marcar el estado del robot.
Cuando avance hacia delante encenderemos los dos LEDs, cuando gire hacia un lado solo encenderemos uno, y cuando gire hacia el otro lado, encenderemos el otro LED.

El circuito lo implementaremos de la siguiente manera:

Integrado SN754410NE
--------------------
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

Receptor IR
-----------
1º pin receptor IR al 12 (digital)
2º pin receptor IR a ground
3º pin receptor IR a +5V

Tutorial SN754410NE




//Control de dos motores
//Robot controlado a partir de un mando a distancia.
//Se encenderán dos LEDs cuando avanze, el de la izquierda cuando gire en esa dirección y el de la derecha cuando gire en esa dirección

#include "WProgram.h"
#include "NECIRrcv.h"
#define IRPIN 12

unsigned long ircode;
NECIRrcv ir(IRPIN);

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

const int Led1=7;
const int Led2=13;

int duracion=0;
unsigned long accion;

void setup()
{
Serial.begin(9600) ;
pinMode(input1, OUTPUT);
pinMode(input2, OUTPUT);
pinMode(input3, OUTPUT);
pinMode(input4, OUTPUT);
pinMode(IRPIN, INPUT);
ir.begin();
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
digitalWrite(input1, HIGH);
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);
digitalWrite(input4, LOW);
}

void loop()
{
while (ir.available())
{
ircode=ir.read();
accion=ircode;
Serial.println(ircode);
if(accion==2707357440)//Si se pulsa el 1 el tiempo de cada movimiento será de 2 sg
{
duracion=2000;
accion=0;
}
if(accion==2724069120)//Si se pulsa el 2 el tiempo de cada movimiento será de 3'4 sg
{
duracion=3400;
accion=0;
}
if(accion==3776904960)//Si se pulsa el 3 el tiempo de cada movimiento será de 6'5 sg
{
duracion=6500;
accion=0;
}
if(accion==3041591040)
{
//Giro sobre si mismo hacia la izquierda
digitalWrite(input1, LOW);//HACIA DELANTE LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, HIGH);//HACIA ATRAS LADO DERECHO
digitalWrite(input4, LOW);
digitalWrite(Led1, HIGH);
delay(duracion);
accion=0;
}
if(accion==3058302720)
{
digitalWrite(input1, LOW);//HACIA DELANTE LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);//HACIA DELANTE LADO DERECHO
digitalWrite(input4, HIGH);
digitalWrite(Led1, HIGH);
digitalWrite(Led2, HIGH);
delay(duracion);
accion=0;
}
if(accion==4111138560)
{
//Giro derecha
digitalWrite(input1, HIGH);//PARADO LADO IZQUIERDO
digitalWrite(input2, LOW);
digitalWrite(input3, HIGH);//HACIA ATRAS LADO DERECHO
digitalWrite(input4, LOW);
digitalWrite(Led2, HIGH);
delay(duracion);
accion=0;
}
//Despues de pulsar cada botón la acción durará un tiempo determinado y el robot volverá a pararse
digitalWrite(input1, HIGH);//PARADO LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);//PARADO LADO DERECHO
digitalWrite(input4, LOW);
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
}
}

sábado, 20 de marzo de 2010

Robot controlado por Infrarrojos

El siguiente programa nos servirá para poder controlar nuestro robot a partir de un mando a distancia. Asociaremos acciones del robot a diferentes botones. Estas acciones serán girar y avanzar.

Tutorial SN754410NE

Circuito físico:

Integrado SN754410NE
--------------------
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

Receptor IR
-----------
1º pin receptor IR al 12 (digital)
2º pin receptor IR a ground
3º pin receptor IR a +5V



Código .pde


//Control de dos motores
//Nuestro robot se mueve segun pulsemos las teclas asociadas en el mando a distancia
#include "WProgram.h"
#include "NECIRrcv.h"
#define IRPIN 12

unsigned long ircode;
NECIRrcv ir(IRPIN);

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

unsigned long accion;

void setup()
{
Serial.begin(9600) ;
pinMode(input1, OUTPUT);
pinMode(input2, OUTPUT);
pinMode(input3, OUTPUT);
pinMode(input4, OUTPUT);
pinMode(IRPIN, INPUT);
ir.begin();
digitalWrite(input1, HIGH);
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);
digitalWrite(input4, LOW);
}

void loop()
{
while (ir.available())
{
ircode=ir.read();
accion=ircode;
Serial.println(ircode);
if(accion==2724069120)
{
//Giro sobre si mismo hacia la izquierda
digitalWrite(input1, LOW);//HACIA DELANTE LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, HIGH);//HACIA ATRAS LADO DERECHO
digitalWrite(input4, LOW);
delay(1100);
accion=0;
}
if(accion==3776904960)
{
digitalWrite(input1, LOW);//HACIA DELANTE LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);//HACIA DELANTE LADO DERECHO
digitalWrite(input4, HIGH);
delay(2500);
accion=0;
}
//Despues de pulsar cada botón la acción durará un tiempo determinado y el robot volverá a pararse
digitalWrite(input1, HIGH);//PARADO LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);//PARADO LADO DERECHO
digitalWrite(input4, LOW);
}
}

miércoles, 17 de marzo de 2010

Motor driver SN754410

Vamos a realizar un pequeño programa para comenzar a mover dos motores utilizando el integrado SN754410. Para ello tendremos que montar el circuito formando un puente-H para poder controlar el sentido de la corriente al alimentar los motores.

Conexiones para el driver SN754410 (H-bridge):
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

Aquí dejo el hipervínculo a un tutorial muy adecuado de como hacer las conexiones con este driver: Tutorial SN754410NE



Código .pde


//Control de dos motores
//Nuestro robot se mueve hacia delante y gira dibujando un pentagono
//Integrado SN754410NE, driver para manejar motores. Sustito de la familia L293

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

void setup()
{
pinMode(input1, OUTPUT);
pinMode(input2, OUTPUT);
pinMode(input3, OUTPUT);
pinMode(input4, OUTPUT);
}

void loop()
{
digitalWrite(input1, LOW);//HACIA DELANTE LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);//HACIA DELANTE LADO DERECHO
digitalWrite(input4, HIGH);
delay(1000);

digitalWrite(input1, HIGH);//PARADO LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);//PARADO LADO DERECHO
digitalWrite(input4, LOW);
delay(200);

//Giro sobre si mismo hacia la izquierda
digitalWrite(input1, LOW);//HACIA DELANTE LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, HIGH);//HACIA ATRAS LADO DERECHO
digitalWrite(input4, LOW);
delay(900);

digitalWrite(input1, HIGH);//PARADO LADO IZQUIERDO
digitalWrite(input2, HIGH);
digitalWrite(input3, LOW);//PARADO LADO DERECHO
digitalWrite(input4, LOW);
delay(200);
}

lunes, 15 de marzo de 2010

LED 7-segments

Vamos a utilizar un LED de 7-segmentos de ánodo común. Eso significa que la alimentación es común, solo podemos encender y apagar todos los segmentos que deseemos a la vez.
Cada pin que conectemos a tierra será un segmento que se encenderá o apagará en función de la alimentación del 7 segmentos.





//LED 7-segment Common Anode
//Control de un LED 7-segmentos de anodo comúm
//Con este tipo de LEDs tenemos que dejar fijo el caracter que deseemos mostrar
//Varía según se hangan o no las conexiones a tierra de los pines 2-9
//1ºo 10º Pin del LED es el de alimentación
//Pines del 2 al 9 son tomas de tierra, cada una corresponde a un segmento del LED

const int segment7=3;

void setup()
{
pinMode(pin, OUTPUT);
}

void loop()
{
digitalWrite(segment7, HIGH);
delay(1000);
digitalWrite(segment7, LOW);
delay(300);
}

sábado, 13 de marzo de 2010

Juegos de luces

Tenemos diez LEDs, que forman seis juegos de luces diferentes. Cada juego está asociado a una tecla del mando a distancia. Luego controlaremos la intensidad de los pines PWM. Otras tres teclas del mando a distancia controlarán la intensidad del brillo de los LEDs PWM.

Colocando el receptor IR mirando hacia nosotros:
1º pin del IR al pin 12 (digital)
2º pin del IR a ground
3º pin del IR a +5V

Pines PWM a 6 LEDs
Pines 4, 7, 8, 12 a 4 LEDs
Lados negativos de los LEDS a ground



Código .pde


//En el siguiente programa tendremos 6 juegos de luces, asociados a 6 teclas del mando a distancia
//Podremos elegir la intensidad de las salidas PWM con otros 3 botones (+, - y Enter)

#include "WProgram.h"
#include "NECIRrcv.h"
#define IRPIN 8
unsigned long ircode;
NECIRrcv ir(IRPIN);
const int pinesPWM[]={5,6,9,10};
const int pinesDigitales[]={3,4,7,2,12,11};
int intensidad=1;
int i=0;

void setup()
{
pinMode(IRPIN, INPUT);
for(i=0; i<6; i++)
{
pinMode(pinesDigitales[i], OUTPUT);
if(i<=3)
{
pinMode(pinesPWM[i], OUTPUT);
}
}
ir.begin();
}

void loop ()
{
while (ir.available())
{
ircode=ir.read();
}

if(ircode==3977445120)
{
intensidad=10;
}
if(ircode==3944021760)
{
intensidad=60;
}
if(ircode==3994156800)
{
intensidad=255;
}
//Primer juego de luces
if(ircode==2707357440)
{
for(i=0; i<6; i++)
{
if(i%2==0)
{
analogWrite(pinesPWM[0], intensidad);
analogWrite(pinesPWM[1], intensidad);
analogWrite(pinesPWM[2], 0);
analogWrite(pinesPWM[3], 0);
}
else
{
analogWrite(pinesPWM[0], 0);
analogWrite(pinesPWM[1], 0);
analogWrite(pinesPWM[2], intensidad);
analogWrite(pinesPWM[3], intensidad);
}
digitalWrite(pinesDigitales[i], HIGH);
delay(480);
digitalWrite(pinesDigitales[i], LOW);
}
analogWrite(pinesPWM[0], 0);
analogWrite(pinesPWM[1], 0);
analogWrite(pinesPWM[2], 0);
analogWrite(pinesPWM[3], 0);
}
//Segundo juego de luces
if(ircode==2724069120)
{
for(i=0; i<6; i++)
{
if(i%2==0)
{
analogWrite(pinesPWM[0], intensidad);
analogWrite(pinesPWM[2], intensidad);
analogWrite(pinesPWM[1], 0);
analogWrite(pinesPWM[3], 0);
}
else
{
analogWrite(pinesPWM[0], 0);
analogWrite(pinesPWM[2], 0);
analogWrite(pinesPWM[1], intensidad);
analogWrite(pinesPWM[3], intensidad);
}
digitalWrite(pinesDigitales[i], HIGH);
delay(300);
}
for(i=5; i>=0; i--)
{
if(i%2==0)
{
analogWrite(pinesPWM[0], intensidad);
analogWrite(pinesPWM[2], intensidad);
analogWrite(pinesPWM[1], 0);
analogWrite(pinesPWM[3], 0);
}
else
{
analogWrite(pinesPWM[0], 0);
analogWrite(pinesPWM[2], 0);
analogWrite(pinesPWM[1], intensidad);
analogWrite(pinesPWM[3], intensidad);
}
digitalWrite(pinesDigitales[i], LOW);
delay(300);
}
analogWrite(pinesPWM[0], 0);
analogWrite(pinesPWM[2], 0);
analogWrite(pinesPWM[1], 0);
analogWrite(pinesPWM[3], 0);
}
//Tercer juego de luces
if(ircode==3776904960)
{
digitalWrite(pinesDigitales[2], HIGH);
digitalWrite(pinesDigitales[3], HIGH);
delay(280);
digitalWrite(pinesDigitales[1], HIGH);
digitalWrite(pinesDigitales[4], HIGH);
delay(280);
digitalWrite(pinesDigitales[0], HIGH);
digitalWrite(pinesDigitales[5], HIGH);
delay(280);
analogWrite(pinesPWM[1], intensidad);
analogWrite(pinesPWM[2], intensidad);
delay(280);
analogWrite(pinesPWM[0], intensidad);
analogWrite(pinesPWM[3], intensidad);
delay(280);
for(i=0; i<6; i++)
{
digitalWrite(pinesDigitales[i], LOW);
}
for(i=0; i<4; i++)
{
analogWrite(pinesPWM[i], 0);
}
delay(180);
}
//Cuarto juego de luces
if(ircode==3041591040)
{
digitalWrite(pinesDigitales[2], HIGH);
digitalWrite(pinesDigitales[3], LOW);
digitalWrite(pinesDigitales[1], LOW);
digitalWrite(pinesDigitales[4], HIGH);
digitalWrite(pinesDigitales[0], HIGH);
digitalWrite(pinesDigitales[5], LOW);
analogWrite(pinesPWM[0], intensidad);
analogWrite(pinesPWM[2], intensidad);
analogWrite(pinesPWM[1], 0);
analogWrite(pinesPWM[3], 0);
delay(220);
digitalWrite(pinesDigitales[2], LOW);
digitalWrite(pinesDigitales[3], HIGH);
digitalWrite(pinesDigitales[1], HIGH);
digitalWrite(pinesDigitales[4], LOW);
digitalWrite(pinesDigitales[0], LOW);
digitalWrite(pinesDigitales[5], HIGH);
analogWrite(pinesPWM[0], 0);
analogWrite(pinesPWM[2], 0);
analogWrite(pinesPWM[1], intensidad);
analogWrite(pinesPWM[3], intensidad);
delay(220);
for(i=0; i<6; i++)
{
digitalWrite(pinesDigitales[i], LOW);
}
for(i=0; i<4; i++)
{
analogWrite(pinesPWM[i], 0);
}
}
//Quinto juego de luces
if(ircode==3058302720)
{
digitalWrite(pinesDigitales[2], HIGH);
analogWrite(pinesPWM[3], intensidad);
delay(280);
digitalWrite(pinesDigitales[1], HIGH);
analogWrite(pinesPWM[2], intensidad);
delay(280);
digitalWrite(pinesDigitales[0], HIGH);
digitalWrite(pinesDigitales[5], HIGH);
delay(280);
analogWrite(pinesPWM[1], intensidad);
digitalWrite(pinesDigitales[4], HIGH);
delay(280);
analogWrite(pinesPWM[0], intensidad);
digitalWrite(pinesDigitales[3], HIGH);
delay(280);
for(i=0; i<6; i++)
{
digitalWrite(pinesDigitales[i], LOW);
}
for(i=0; i<4; i++)
{
analogWrite(pinesPWM[i], 0);
}
delay(180);
}
//Sexto juego de luces
if(ircode==4111138560)
{
digitalWrite(pinesDigitales[0], HIGH);
delay(180);
digitalWrite(pinesDigitales[1], HIGH);
analogWrite(pinesPWM[1], intensidad);
delay(180);
digitalWrite(pinesDigitales[2], HIGH);
analogWrite(pinesPWM[0], intensidad);
delay(180);
analogWrite(pinesPWM[3], intensidad);
digitalWrite(pinesDigitales[3], HIGH);
delay(180);
analogWrite(pinesPWM[2], intensidad);
digitalWrite(pinesDigitales[4], HIGH);
delay(180);
digitalWrite(pinesDigitales[5], HIGH);
delay(180);
digitalWrite(pinesDigitales[5], LOW);
delay(180);
analogWrite(pinesPWM[2], 0);
digitalWrite(pinesDigitales[4], LOW);
delay(180);
analogWrite(pinesPWM[3], 0);
digitalWrite(pinesDigitales[3], LOW);
delay(180);
digitalWrite(pinesDigitales[2], LOW);
analogWrite(pinesPWM[0], 0);
delay(180);
digitalWrite(pinesDigitales[1], LOW);
analogWrite(pinesPWM[1], 0);
delay(180);
digitalWrite(pinesDigitales[0], LOW);
delay(180);
}
}

miércoles, 10 de marzo de 2010

L293E

En el siguiente montaje moveremos un motor en ambas direcciones. Para el manejo de las corrientes se utiliza un driver L293E. Consultar datasheet para el montaje del circuito. Los diodos son necesarios, ya que no están integrados en el driver.


Datasheet L293E



//Control de un motor en ambos sentidos
//Integrado L293E son necesarios los diosos rectificadores (No están integrados en el chip). Consultar datasheet.

const int input1=10;
const int input2=11;

void setup()
{
pinMode(input1, OUTPUT);
pinMode(input2, OUTPUT);
}

void loop()
{
digitalWrite(input1, LOW);//HACIA DELANTE LADO IZQUIERDO
digitalWrite(input2, HIGH);
delay(1000);

digitalWrite(input1, HIGH);//HACIA ATRAS LADO IZQUIERDO
digitalWrite(input2, LOW);
delay(1000);

digitalWrite(input1, HIGH);//PARADO LADO IZQUIERDO
digitalWrite(input2, HIGH);
delay(1000);
}

domingo, 7 de marzo de 2010

Sensor Luz & Piezo

Vamos a controlar una serie de LEDs a partir de un sensor de luz y un sensor piezoeléctrico. Cuando haya poca luz ambiente los LEDs generarán un juego de luces. Este juego de luces irá cambiando a cada golpe recibido por el sensor piezoeléctrico.

El circuito lo implementaremos de la siguiente manera:
8 LEDs númerados desde el pin 6 al 13 (digitales)
8 LEDs a ground

+ Lado positivo sensor Luz a +5V
+ Lado positivo sensor Luz a pin 4 (analógico)
- Lado negativo sensor Luz a ground

+ Piezo a través de resistencia (33O-990 Ohmios) al pin 4 (analógico)
- Piezo a ground



Código .pde


//El siguiente circuito generará diferentes juegos de luces según los golpes que reciba el sensor piezoeléctrico.
//Los LEDs se activarán cuando no haya casi luz ambiente.

const int vectorLED[]={6,7,8,9,10,11,12,13};
const int sensorLuz=5;
const int sensorPiezo=4;
int valorPiezo=0;
int valorLuz=0;
int sensorMax=0;
int sensorMin=1022;
int contadorPiezo=0;
int i=0;

void setup()
{
Serial.begin(9600);
pinMode(sensorPiezo,INPUT);
pinMode(sensorLuz,INPUT);
for(i=0; i<8; i++)
{
pinMode(vectorLED[i], OUTPUT);
}
digitalWrite(13, HIGH);
while(millis()<5000)
{
valorLuz=analogRead(sensorLuz);
if(valorLuz>sensorMax)
{
sensorMax=valorLuz;
}
if (valorLuz {
sensorMin=valorLuz;
}
}
digitalWrite(13, LOW);
}

void loop()
{
valorLuz=analogRead(sensorLuz);
valorLuz=map(valorLuz, sensorMin, sensorMax, 0, 255);
valorLuz=constrain(valorLuz, 0, 255);
valorPiezo=analogRead(sensorPiezo);
if(valorPiezo<40)
{
contadorPiezo++;
}
if(valorLuz>200 && (contadorPiezo%5)==1)
{
do{
for(i=0; i<8; i++)
{
digitalWrite(vectorLED[i], HIGH);
delay(120);
}
for(i=7; i>=0; i--)
{
delay(120);
digitalWrite(vectorLED[i], LOW);
}
valorLuz=analogRead(sensorLuz);
valorLuz=map(valorLuz, sensorMin, sensorMax, 0, 255);
valorLuz=constrain(valorLuz, 0, 255);
}while(valorLuz>200);
}
if(valorLuz>200 && (contadorPiezo%5)==2)
{
do{
for(i=0; i<8; i+=2)
{
digitalWrite(vectorLED[i], HIGH);
delay(120);
}
for(i=1; i<8; i+=2)
{
digitalWrite(vectorLED[i], HIGH);
delay(120);
}
for(i=7; i>=0; i--)
{
digitalWrite(vectorLED[i], LOW);
}
valorLuz=analogRead(sensorLuz);
valorLuz=map(valorLuz, sensorMin, sensorMax, 0, 255);
valorLuz=constrain(valorLuz, 0, 255);
}while(valorLuz>200);
}
if(valorLuz>200 && (contadorPiezo%5)==3)
{
delay(300);
digitalWrite(vectorLED[0], HIGH);
digitalWrite(vectorLED[1], HIGH);
delay(300);
digitalWrite(vectorLED[4], HIGH);
digitalWrite(vectorLED[5], HIGH);
digitalWrite(vectorLED[0], LOW);
digitalWrite(vectorLED[1], LOW);
delay(300);
digitalWrite(vectorLED[2], HIGH);
digitalWrite(vectorLED[3], HIGH);
digitalWrite(vectorLED[4], LOW);
digitalWrite(vectorLED[5], LOW);
delay(300);
digitalWrite(vectorLED[6], HIGH);
digitalWrite(vectorLED[7], HIGH);
digitalWrite(vectorLED[2], LOW);
digitalWrite(vectorLED[3], LOW);
delay(300);
digitalWrite(vectorLED[6], LOW);
digitalWrite(vectorLED[7], LOW);
}
if(valorLuz>200 && (contadorPiezo%5)==4)
{
for(i=0; i<8; i++)
{
digitalWrite(vectorLED[i], HIGH);
delay(60);
digitalWrite(vectorLED[i-1], LOW);
delay(60);
}
digitalWrite(vectorLED[7], LOW);
}
if(valorLuz>200 && (contadorPiezo%5)==0)
{
for(i=0; i<8; i++)
{
valorPiezo=analogRead(sensorPiezo);
if(valorPiezo<40)
{
contadorPiezo++;
}
digitalWrite(vectorLED[i], LOW);
}
}
}

sábado, 6 de marzo de 2010

Drivers para motores CC

Aquí dejo un pequeño ejemplo de como utilizar un integrado L293E. Este circuito es un driver que nos servirá para poder controlar motores de corriente continua. Ante cualquier duda, consultar datasheet. El único integrado de la familia L293 que no necesita los diodos rectificadores es el D. Todos los demas, incluido el de este ejemplo es necesario incluir los diodos.

L293E

El circuito lo implementaremos de la siguiente manera:

1º pin enable al pin 2 (digital)
2º pin input al pin 3 (digital)
3º pin output a +Motor
4º pin resistor a ground (-Alimentacion)
5º pin ground a ground (-Alimentacion)
6º pin ground a ground (-Alimentacion)
7º pin resistor a ground (-Alimentacion)
10º pin power supply a + Alimentacion
11º pin enable al pin 5 (digital)
12º pin input al pin 6 (digital)
13º pin output a +Motor
14º pin resistor a ground (-Alimentacion)
15º pin ground a ground (-Alimentacion)
16º pin ground a ground (-Alimentacion)
17º pin resistor a ground (-Alimentacion)
20º pin a +5V

Esta es una forma muy sencilla para comenzar a utilizar el integrado L293E. Más adelante veremos como controlar dos motores en ambos sentidos, este diseño nos permitirá cualquier clase de movimiento para nuestro robot.







//Control de Motores una direccion

const int enable1=2;
const int enable2=5;
const int motor1=3;
const int motor2=6;

void setup()
{
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(enable1, OUTPUT);
pinMode(enable2, OUTPUT);
}

void loop()
{
digitalWrite(enable2, HIGH);
digitalWrite(enable1, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);//PARADO
delay(100);
digitalWrite(enable2, HIGH);
digitalWrite(enable1, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);//GIRO IZQUIERDA
delay(4000);

digitalWrite(enable2, HIGH);
digitalWrite(enable1, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);//PARADO
delay(100);
digitalWrite(enable1, HIGH);
digitalWrite(enable2, LOW);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);//HACIA DELANTE
delay(2000);

digitalWrite(enable2, HIGH);
digitalWrite(enable1, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);//PARADO
delay(100);
digitalWrite(enable2, HIGH);
digitalWrite(enable1, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);//GIRO IZQUIERDA
delay(5000);
}

lunes, 1 de marzo de 2010

Sensores IR IV

Encenderemos o apagaremos los LEDs en función de lo que reciban los sensores IR. Si se encuentra algún objeto en su campo de visión los LEDs se encenderán.

El circuito lo montaremos de la siguiente manera:
Conectamos el emisor IR al pin 2
Conectamos el receptor IR a la entrada del pin analogico 3
Conectamos +5V al emisor IR
Conectamos -Ground al receptor

Conectamos el emisor IR al pin 4
Conectamos el receptor IR a la entrada del pin analogico 4
Conectamos +5V al emisor IR
Conectamos -Ground al receptor

Conectamos los LEDs a los pines 12 y 13 (digital)
Conectamos lado negativo de los LEDs a ground





//Encendemos el LED cuando uno de los dos sensores recibe presencia de un objeto
//Dará problemas utilizando dos de estos sensores si utilizamos la toma de tierra del ordenador si lo alimentamos por el puerto USB.
//Sino conectamos el ordenador a un enchufe con toma de tierra funcionará como ***'deseamos'
//Es recomendable no utilizar mas de dos sensores IR en el mismo circuito

const int sensorInfrarojo1=3;
const int azul=13;
const int emisor1=2;

const int sensorInfrarojo2=4;
const int verde=12;
const int emisor2=3;

int sensorValor1=0;
int sensorValor2=0;

void setup()
{
pinMode(sensorInfrarojo1, INPUT);
pinMode(azul, OUTPUT);
pinMode(emisor1, OUTPUT);
pinMode(sensorInfrarojo2, INPUT);
pinMode(verde, OUTPUT);
pinMode(emisor2, OUTPUT);
digitalWrite(emisor1, HIGH);//El emisor del sensor IR ha de estar siempre activo
digitalWrite(emisor2, HIGH);//El emisor del sensor IR ha de estar siempre activo
}

void loop()
{
sensorValor1=analogRead(sensorInfrarojo1);//Leemos los dos valores de los sensores
sensorValor2=analogRead(sensorInfrarojo2);//Un valor no lo evaluamos en el if ***(Interferencias en el circuito por falta de toma de tierra)
if((sensorValor1/5)>130)//De esta manera encendemos el LED cuando hay algo cerca de ambos sensores
{
digitalWrite(azul, HIGH);
digitalWrite(verde, HIGH);
}
else
{
digitalWrite(azul, LOW);
digitalWrite(verde, LOW);
}
}

Matriz de LEDs

El siguiente programa simula una matriz de LEDs controlada remotamente por un receptor infrarrojo. Cada LED que forma la matriz será controlado por un único botón del mando a distancia. Cada LED puede ser encendido o apagado independientemente del resto.

El circuito lo implementaremos de la siguiente manera:
Colocando el receptor IR mirando hacia nosotros:
1º pin del IR al pin 12 (digital)
2º pin del IR a ground
3º pin del IR a +5V

Pines del 2 al 11 formarán un vector de LEDs, simularán una matriz 2x5 en nuestra protoboard
Lado negativo de los LEDs a ground





//Cada LED numerado del 1 al 10 se encenderá y apagará cuando marquemos su número en el mando a distancia.
//Cada LED se enciende y apaga independientemente del resto con su propio botón del mando a distancia.

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

const int pinesLED[]={2,3,4,5,6,7,8,9,10,11};
int i=0;
unsigned long a1=2;
unsigned long a2=2;
unsigned long a3=2;
unsigned long a4=2;
unsigned long a5=2;
unsigned long a6=2;
unsigned long a7=2;
unsigned long a8=2;
unsigned long a9=2;
unsigned long a10=2;

NECIRrcv ir(IRPIN);

void setup()
{
pinMode(IRPIN, INPUT);
for(i=0; i<10; i++)
{
pinMode(pinesLED[i], OUTPUT);
}
ir.begin();
}

void loop()
{
while (ir.available())
{
ircode=ir.read();
if(ircode==2707357440)
{
a1++;
}
if(ircode==2724069120)
{
a2++;
}
if(ircode==3776904960)
{
a3++;
}
if(ircode==3041591040)
{
a4++;
}
if(ircode==3058302720)
{
a5++;
}
if(ircode==4111138560)
{
a6++;
}
if(ircode==2774204160)
{
a7++;
}
if(ircode==2790915840)
{
a8++;
}
if(ircode==3843751680)
{
a9++;
}
if(ircode==2974744320)
{
a10++;
}
}

if((a1%2)==1)
{
digitalWrite(pinesLED[0], HIGH);
}
else
{
digitalWrite(pinesLED[0], LOW);
}
if((a2%2)==1)
{
digitalWrite(pinesLED[1], HIGH);
}
else
{
digitalWrite(pinesLED[1], LOW);
}
if((a3%2)==1)
{
digitalWrite(pinesLED[2], HIGH);
}
else
{
digitalWrite(pinesLED[2], LOW);
}
if((a4%2)==1)
{
digitalWrite(pinesLED[3], HIGH);
}
else
{
digitalWrite(pinesLED[3], LOW);
}
if((a5%2)==1)
{
digitalWrite(pinesLED[4], HIGH);
}
else
{
digitalWrite(pinesLED[4], LOW);
}
if((a6%2)==1)
{
digitalWrite(pinesLED[5], HIGH);
}
else
{
digitalWrite(pinesLED[5], LOW);
}
if((a7%2)==1)
{
digitalWrite(pinesLED[6], HIGH);
}
else
{
digitalWrite(pinesLED[6], LOW);
}
if((a8%2)==1)
{
digitalWrite(pinesLED[7], HIGH);
}
else
{
digitalWrite(pinesLED[7], LOW);
}
if((a9%2)==1)
{
digitalWrite(pinesLED[8], HIGH);
}
else
{
digitalWrite(pinesLED[8], LOW);
}
if((a10%2)==1)
{
digitalWrite(pinesLED[9], HIGH);
}
else
{
digitalWrite(pinesLED[9], LOW);
}
}