Archivos mensuales: Octubre 2011

Arduino 3: Robot gusano y cámara robotizada 2

Hace unos años descubrí la pagina de Iearobotics, donde se hablaba de robots ápodos a base de módulos. Yo quise emularlo (lo del diseño modular) para construir un brazo robótico. Pero esta vez he querido ir hasta el concepto original.


Mis módulos

Por eso he programado esta especie de gusano, al cual he añadido dos paquetes de pañuelos a modo de almohadillas para que no resbalara por la mesa, y mi viejo Nokia a modo de contrapeso para que pudiese levantar un poco la estructura.

El programa, en el que intento programar una media onda sinusoidal es el siguiente:

#include

Servo myservo; // crea un objeto tipo servo para controlar el servo
Servo myservo2; // crea un objeto tipo servo para controlar el servo
int pos = 0; // variable para almacenar la posición del servo
int pos2 = 0; // variable para almacenar la posición del servo
void setup()
{
myservo.attach(9); // liga el servo conectado en el pin 9 al objeto servo
myservo2.attach(6); // liga el servo conectado en el pin 6 al objeto servo
}

void loop()
{
pos2=180/2;
for(pos = 0; pos < 180; pos += 1) // va de 0 a 180 grados
{ // en pasos de 1 grado
myservo.write(pos);
pos2 -= 1;
myservo2.write(pos2/2); // dice al servo que se posicione en la posición indicada por la variable ‘pos’
delay(15); // espera 15 ms para dar tiempo al servo a llegar a la nueva posición
}
pos2=0;
for(pos = 180; pos>=1; pos-=1) // va de 180 a 0 grados
{
myservo.write(pos);
pos2 += 1;
myservo2.write(pos2/2); // dice al servo que se posicione en la posición indicada por la variable ‘pos’
delay(15); // espera 15 ms para dar tiempo al servo a llegar a la nueva posición
}

}

 

Y aquí dejo los vídeos, tanto desde fuera como con la cámara montada en el gusano:


Cámara robotizada 2

He mejorado el programa que interpretaba los ángulos, ya que ahora no los lee directamente, sino que los selecciona a través de unos ifs consecutivos. Os dejo los programas tanto el de interpretación de arduino como el de control en Processing.

Processing

import processing.serial.*;
Serial port;
int i;

void setup() {
size(256, 150);
println(“Available serial ports:”);
println(Serial.list());
port = new Serial(this, Serial.list()[1], 9600);
}

//CUIDADO CON LAS MAYUSCULAS

void draw() {
byte prueba;
if (key == ‘s’) {
fill(45);
prueba=40;
port.write(prueba);
}
if (key == ‘d’) {
fill(90);
prueba=60;
port.write(prueba);
}
if (key == ‘f’) {
fill(135);
prueba=90;
port.write(prueba);
}
if (key == ‘g’) {
fill(255);
prueba=120;
port.write(prueba);
}
if (key == ‘a’) {
fill(0);
prueba=1;
port.write(prueba);
}
rect(25, 25, 50, 50);
if (key == ‘t’) {
fill(45);
prueba=2;
port.write(prueba);
}
if (key == ‘h’) {
fill(90);
prueba=3;
port.write(prueba);
}
if (key == ‘n’) {
fill(135);
prueba=4;
port.write(prueba);
}
if (key == ‘y’) {
fill(255);
prueba=5;
port.write(prueba);
}
if (key == ‘j’) {
fill(0);
prueba=6;
port.write(prueba);
}
rect(50, 25, 50, 50);

}

Arduino

#include

Servo myservo; // crea un objeto tipo servo para controlar el servo
Servo myservo2; // crea un objeto tipo servo para controlar el servo
int pos = 0; // variable para almacenar la posición del servo

void setup()
{
Serial.begin(9600);
myservo.attach(9); // liga el servo conectado en el pin 9 al objeto servo
myservo2.attach(6); // liga el servo conectado en el pin 9 al objeto servo
}

void loop()
{
byte brightness;
byte angulo;
// check if data has been sent from the computer:
if (Serial.available()) {
// read the most recent byte (which will be from 0 to 255):
brightness = Serial.read();
// set the brightness of the LED:
if(brightness == 1){
angulo=0;
myservo.write(1);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 40){
angulo=40;
myservo.write(40);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 60){
angulo=60;
myservo.write(60);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 90){
angulo=90;
myservo.write(90);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 120){
angulo=70;
myservo.write(120);
brightness = Serial.read();
delay(30);
brightness = Serial.read();

//Segundo Servo
}
if(brightness == 2){
angulo=45;
myservo2.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 3){
angulo=90;
myservo2.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 4){
angulo=120;
myservo2.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 5){
angulo=180;
myservo2.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 6){
angulo=1;
myservo2.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
}
}

 

Licencia Creative Commons
Este obra está bajo una licencia Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.

Resumen: programadoras, controladoras y controlodora-programadora

A continuación voy a hacer un resumen de las diferentes tarjetas controladoras e interfaces que existen y se aplican en el mundo de la robótica. Así intentaré tener un poco más claros los conceptos:

Programadora (Grabadora)

Se conecta al PC a través del puerto paralelo, puerto serie o USB y se descargan programas de manera rápida y sencilla. Perfecto para aprender a programar microcontroladores. Los más simples son los de puerto paralelo, ya que se pueden programar directamente:
Puerto Paralelo: El más simple, se utilizan algunos pines de este puerto para programar el chip.
Uno de los más sencillos que he encontrado:

http://www.todorobot.com.ar/proyectos/picprog/picprog.htm
Otra versión: http://www.pablin.com.ar/electron/circuito/mc/ppp/index.htm

Puerto serie: Para adaptar los niveles del protocolo R232 hará falta un chip como Max232:

http://www.iearobotics.com/personal/andres/proyectos/picmin/pic1.html

USB: necesitaremos un conversor USB-R323. Si no, el único que he ecnontrado que se puede programar directamente es el microcontrolador de Microchip PIC18F2550, el cual soporta el protocolo HID implementado por hardware:

http://usbpicprog.org/

 

Controladora

Puede funcionar en modo autónomo, sin conectarse al PC. Cada vez que se encienda la tarjeta se ejecutará el programa que está grabado en la memoria del PIC.
De este tipo ya apenas se encuentran, porque la diferencia en costo de fabricar una de estas y una que además sea programadora es mínima.

 

Controlodora-programadora (Entrenadora)

Incluye las características de las dos anteriores en una sola. Son las más populares.
Suelen funcionar como interfaz, es decir, actúa como un periférico del PC, puede recibir órdenes y enviar datos. Las hay para conectarlas por paralelo, serie y USB.

Vamos a destacar tres, por su conexión USB, su facilidad y porque son OSHW (Open Source Hardware):

Arduino. Ya hemos hablado antes de esta. Con núcleo Atmel, es la más famosa. http://www.arduino.cc/es/

Pinguino. Ya lleva implementado por hardware el protocolo HID, por lo que no le hace falta un chip traductor. Usada sobre todo por ARDE:
http://www.hackinglab.org/

Skypic. Diseñada por “Obijuan”, también tiene nucleo PIC
http://www.iearobotics.com/wiki/index.php?title=Skypic

Alternativas de pago hay muchas, por ejemplo:
http://www.superrobotica.com/S310205.htm

 

Licencia Creative Commons
Este obra está bajo una licencia Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.