Práctica 4
Vamos a utilizar el teclado para enviar órdenes a Arduino, mediante la misma conexión serie del monitor que usamos para ver por pantalla.
La instrucción para que arduino lea una tecla del ordenador es:
Serial.read();
Siempre deberemos guardar la tecla capturada en una variable, por ejemplo "tecla", quedaría así:
tecla = Serial.read();
Ahora dentro de tecla tendríamos la tecla que se ha pulsado y con ese valor podemos hacer cosas.
Una cosa importante a tener en cuenta es que tecla NO es una variable como las que hemos usado hasta ahora, no va a contener un número entero (int), sino que va a contener un caracter. Para eso en la declaración de variables, (al principio del programa) deberemos declararla de la siguiente forma:
char tecla;
En la práctica tenemos que conseguir que Arduino encienda alguno de los 3 leds que vamos a conectarle según las teclas que pulsemos. Si pulsamos la tecla "1", debe encenderse un solo led, si pulsamos la tecla "2" se deberán encender 2 leds y si pulsamos la tecla 3 deberán encenderse los 3 leds. (puedes modificar este funcionamiento si lo deseas).
Dentro de loop, tendremos que capturar la tecla pulsada y según su valor haremos una cosa u otra. Para ello usaremos las órdenes if y else que vimos en las prácticas anteriores. La forma de hacer las comparaciones serían:
if (tecla == '1')
{
acciones;
}
if (tecla == '2')
{
acciones;
}
.....
Sólo nos queda una cosa, debemos esperar hasta que se pulse una tecla, eso se lo decimos a Arduino, introduciendo un if antes de Serial.read.
Usamos la orden Serial.available, que se encarga de mirar si se ha pulsado una tecla.
Con lo que la orden competa debe quedar así:
if( Serial.available() ) tecla = Serial.read();
Combina todo esto para realizar la práctica
Mostrando entradas con la etiqueta Tecno 4º-ardu2. Mostrar todas las entradas
Mostrando entradas con la etiqueta Tecno 4º-ardu2. Mostrar todas las entradas
19 mar 2012
18 mar 2012
TECNO 4º E.S.O. ARDUINO. V
EJERCICIO SOS
Estamos perdidos y vamos a pedir socorro mandando toda la noche un SOS luminoso para que nos vean los aviones de rescate. Un LED parpadea, emitiendo un SOS en código morse.
En código Morse las letras se representan por pulsos largos (rayas) o cortos (puntos), para nuestro ejemplo necesitamos conocer sólo 2 letras:
El comando for
Hay que declarar las variables que vamos a usar como contadores en las iteraciones con el comando for. En este caso, el valor con el que las inicialicemos no importa, pues se vuelven a inicializar al ejecutarse el comando for.
int n=0
La iteración con for describe un bucle que se ejecuta un nº de veces que se indica con el valor inicial, el valor final y cuanto cambia la variable en cada iteración. En este caso tenemos tres : empieza en 0, acaba en 2 y cambia añadiendo 1. Es decir:
for(n=0;n<3;n++){ - Una primera vez en que n vale 0
digitalWrite(led, HIGH); - Una segunda vez en que n vale 1
delay(corto); - Una tercera vez en que n vale 2
digitalWrite(led,LOW);
delay(corto);
}
Estamos perdidos y vamos a pedir socorro mandando toda la noche un SOS luminoso para que nos vean los aviones de rescate. Un LED parpadea, emitiendo un SOS en código morse.
En código Morse las letras se representan por pulsos largos (rayas) o cortos (puntos), para nuestro ejemplo necesitamos conocer sólo 2 letras:
- S: punto-punto-punto
- O: raya-raya-raya
La duración de los puntos y las rayas es diferente:
Punto:100ms
Raya:300ms
Entre 2 letras hay que hacer una pausa (100ms)
Entre una señal de SOS y la siguiente hay que poner un tiempo de espera (1s)
Tendremos que encender y apagar los leds con sus delays asociados como ya sabemos para determinar la longitud de cada pulso; pero la novedad de este programa es que en lugar de utilizar los milisegundos vamos a declarar al principio unas variables con los valores en cuestión. Así quedará:
int punto=100;
int raya=300;
int pausa=100;
int espera=1000;
Y luego deberíamos utilizar, por ejemplo: delay(punto);
Realiza el programa
El comando for
Hay que declarar las variables que vamos a usar como contadores en las iteraciones con el comando for. En este caso, el valor con el que las inicialicemos no importa, pues se vuelven a inicializar al ejecutarse el comando for.
int n=0
La iteración con for describe un bucle que se ejecuta un nº de veces que se indica con el valor inicial, el valor final y cuanto cambia la variable en cada iteración. En este caso tenemos tres : empieza en 0, acaba en 2 y cambia añadiendo 1. Es decir:
for(n=0;n<3;n++){ - Una primera vez en que n vale 0
digitalWrite(led, HIGH); - Una segunda vez en que n vale 1
delay(corto); - Una tercera vez en que n vale 2
digitalWrite(led,LOW);
delay(corto);
}
18 feb 2012
Tec4º. Arduino. Sensores LDR y Motores
Uso de Sensores LDR
Ya hemos visto cómo conectar los sensores LDR a las entradas analógicas, conecta 2 LDRs a tu protoboard y a Arduino:
Vamos a suponer que tenemos un robot con 2 motores y 2 LDR.
Según la iluminación, el robot deberá siempre buscar la luz, así sus motores se moverán para dirigirlo a izquierda o derecha según qué LDR detecte más luz. El algoritmo a seguir será el siguiente:
Por ahora vamos a simular los 2 motores con 2 leds que funcionarán de la siguiente manera:
- Si un motor va hacia delante su led debe parpadear rápidamente
- Si un motor va hacia atrás su led deberá parpadear léntamente.
Para esto deberás definir 2 funciones externas que simularán este comportamiento en los leds (recuerda que se definen fuera de loop):
void adelante(motor,tiempo)
{
...
...
}
void atras(motor,tiempo)
{
...
...
}
Donde la palabra "motor" será "motorIZ"1 ó "motorDE" segùn el motor que queramos mover.
La palabra "tiempo" dice los milisegundos que debe estar moviéndose el motor (en nuestro caso los leds)
La función deberá llamarse desde loop, por ejemplo así:
adelante(motorIZ,300);
17 feb 2012
Tec4º. Arduino. Sensores LDR
Uso de Sensores LDR
El ejemplo más sencillo pasa por utilizar 2 LDR situados en los laterales del robot para permitirle detectar niveles de iluminacióin y por tanto programarlo para que evite objetos, por ejemplo.
Construiremos, sobre una pequeña placa perforada-estañada, unos conectores para que los valores de variación de la resistencias se envíe a 2 de las entradas analógicas de Arduino y los motores actuen en consecuencia.
Veamos el circuito de las LDR:
Ahora como queda en la placa:
Por fin el robot completo:
El código del programa:
Suponemos que vamos a usar 2 motores DC conectados a M3 y M4 (ver comentarios en código) y uso de motores
#include "AFMotor.h" // La librería AFMotor.h para control de motores //***************EL MOTOR IZQ(mirando desde encima al robot, va al revés por su colocación)************************ AF_DCMotor motor3(3, MOTOR12_1KHZ); // crea motor #1, 64KHz pwm MAYOR FRECUENCIA MÁS PRECISIÖN -> Más CONSUMO AF_DCMotor motor4(4, MOTOR12_1KHZ); // crea motor #2, 64KHz pwm int LDR_D = 0; // LDR derecho (vista superior desde atrás);analog pin 0 int LDR_I = 1; // LDR izquierdo ;analog pin 1 int LDR_D_val = 0; // variables para leer el valor del LDR int LDR_I_val = 0; void setup() { Serial.begin(9600); // Para imprimir mensajes por pantalla (monitor serie) // PONEMOS LAS VELOCIDADES motor3.setSpeed(100); // velocidad de 0-255 motor4.setSpeed(100); } void loop() { LDR_D_val = analogRead(LDR_D);
LDR_I_val = analogRead(LDR_I); //Calibramos los LDR para ver los valores que devuelven, en este caso, el izquierdo devuelve un valor un poco menor por eso se suman 8çSerial.print("LDRDerecha = "); Serial.println(LDR_D_val); Serial.print("LDRIzquierda = ");Serial.println(LDR_I_val+8); // Compara los valores devueltos por las LDR y produce el cambio de dirección de los motores if (LDR_D_val > LDR_I_val+8) { Serial.println("D>I"); motor3.run(BACKWARD); // tuerce derecha motor4.run(RELEASE); delay(100); } else if (LDR_D_val < LDR_I_val+8) { Serial.println("I>D"); motor3.run(RELEASE); motor4.run(FORWARD); // tuerce izquierda delay(100); } else if (LDR_D_val == LDR_I_val) { Serial.println("D=I"); motor3.run(BACKWARD); // centro motor4.run(FORWARD); delay(100); } motor3.run(RELEASE); motor4.run(RELEASE); }
TEC 4º ESO. Sensor de distancia SHARP
Vamos a utilizar un sensor de infrarrojos Sharp 2Y0A21, que nos permitirá calcular distancias a objetos.
Este sensor tiene un emisor y receptor de infrarrojos. El receptor, dependiendo de la distancia ofrece una salida de voltaje inversa (a mayor voltaje, menor distancia).
Para calcular la distancia en centímetros a un objeto, podemos usar un ajuste de mínimos cuadrados. La relación entre distancia <->voltaje no es lineal, sino que sigue una hipérbola.
Se definen 3 zonas de medida, según la distancia: A partir de 10cm. Entre 10 y 35 cm y de 35 hasta fuera de rango. Así tenemos 3 funciones diferentes según la zona de medida : alto, medio bajo, para ajustar la medida en centímetros.
Gráfico del voltaje y la distancia
Para obtener la distancia real en cm podemos usar el siguiente código:
Variables:
int alto=515, medio=160, bajo=77; //valores de tensión del sharp
int v1=5.811816334556221; //Datos parametrizados
int v2=6.946413436045397;
int y1=1.80249287176700;
int y2=6.17138891056397;
int p1=10, p2=35; //Distancia mínima de lectura y mediana
int cm=0; //Para almacenar el valor obtenido en cm valor=0;
int sharp=A0; //Entrada analógica del sensor.
Programa:
valor=analogRead(sharp);
if (valor>alto || value
else if (valor > medio){
cm=(int)((1000.0/valor−y1)∗(v1)+p1);
}else{
cm=(int)((1000.0/valor−y2 )∗(v2)+p2);
}
(Código: David Vilaseca)
4 abr 2011
TECNO 4º E.S.O. ARDUINO. VI. Servos
Vamos a aprender a manejar motores con nuestra placa Arduino.
Los servo motores, son motores de corriente continua que tienen la posibilidad de moverse hasta cualquier posición de su rango y mantenerse en ella de una manera estable.
Como ves en la imagen, el motor está formado por un conjunto de engranajes que hacen de reductora y un circuito de control por el que podremos manejar la velocidad y posición del motor.
La mayoría de los servos giran 180º. Se utilizan en robótica y radiocontrol, así como en otras aplicaciones en las que se quiere precisión a la hora de mover algún objeto (camaras de videovigilancia, sensores...).
En nuestro caso más tarde tendremos que "trucar" estos motores para que nos permitan girar 360º y mover las ruedas de un robot.
Accede al siguiente enlace y copia y pega el código para manejar un servo.
Los servo motores, son motores de corriente continua que tienen la posibilidad de moverse hasta cualquier posición de su rango y mantenerse en ella de una manera estable.
Como ves en la imagen, el motor está formado por un conjunto de engranajes que hacen de reductora y un circuito de control por el que podremos manejar la velocidad y posición del motor.
La mayoría de los servos giran 180º. Se utilizan en robótica y radiocontrol, así como en otras aplicaciones en las que se quiere precisión a la hora de mover algún objeto (camaras de videovigilancia, sensores...).
En nuestro caso más tarde tendremos que "trucar" estos motores para que nos permitan girar 360º y mover las ruedas de un robot.
Accede al siguiente enlace y copia y pega el código para manejar un servo.
Suscribirse a:
Entradas (Atom)