Mostrando entradas con la etiqueta Arduino. Mostrar todas las entradas
Mostrando entradas con la etiqueta Arduino. Mostrar todas las entradas

martes, 3 de abril de 2012

Programación en Lego


Programación en Lego

Después de encontrar dos kits de Lego Mindstorms RCX sin uso en la F11, decidí revivirlos y aprender a utilizarlos. El primer problema que encontré fue el puerto serie que hacía falta para comunicar los RCX con el ordenador, problema que solucioné con un adaptador, algo en lo que no tenía mucha fe. El siguiente problema fue encontrar el entorno de programación : Robolab. Lo intenté con torrents sin resultado; solo lo encontré en descarga directa , pero en ruso y con virus (http://www.descargarfull.com/descargar/robolab-2-9-4-build-c-2003-2010x86/)
Tuve problemas con el ruso, ya que necesitaba configurar el programa, así que tuve que hacerme una tabla de traducción del menú:

Traduciendo el menú de inicio


Primeros Pasos

El entorno de programación es gráfico, copia del LabView de TI. Los if y while se hacen mediante diagramas de flujos:


Hay que tener cuidado al programar los if, ya que hay que evitar cruzar las condiciones, o el programa no podrá compilarlo:
Diagramas cruzados. No se puede compilar

Diagrama sin cruzar. Sí compila


Sumo

Este es un programa que encontré por Internet para hacer un robot de sumo muy sencillo:


El robot echa de la zona cualquier objeto que se encuentre.
Aquí podemos ver el funcionamiento:




Rastreador (Follow line)

También encontré un programa de seguimiento de líneas con un solo detector, que se basa en seguir la línea límite entre la zona blanca y gris, dando lugar a medir la zona "gris":

Lo que no encontré fue un programa para dos detectores, así que tuve que hacerlo yo mismo:

Aquí dejo el vídeo que prueba su buen funcionamiento:



Máquina vs vida

Si te preguntas si la robótica puede superar a la vida en algún momento, yo hice la prueba. El resultado: la robótica es mucho más fiable pero menos versátil.

sábado, 10 de marzo de 2012

Taller de robótica en la F11




Ayer estuve en el taller de robótica de Reset(clase F11)y estuve probando algunas cosas.

La primera fue desarrollar la oruga de Obijuan. Como todavía no tengo la impresora disponible hice los módulos con plantillas y la Dremel.

Estas son las fotos del desarrollo. Las plantillas como siempre están colocadas en el Thingiverse:

La plancha de PVC a mecanizar


Colocando las plantillas

Plantillas ya hechas

Colocados los servos

Después de ponerles los servos, probé a ponerles un programa siempre:

#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 = 90; // variable para almacenar la posición del servo
int pos2 = 90;
Servo myservo3;
int pos3 = 90;// crea un objeto tipo servo para co// crea un objeto tipo servo para co// 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);
myservo2.attach(10); // 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); myservo.write(pos);// espera 15 ms para dar tiempo al servo a llegar a la nueva posición } pos2=90; 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);
myservo3.write(pos);// espera 15 ms para dar tiempo al servo a llegar a la nueva posición
}
pos3=90;
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);
myservo3.write(pos);// espera 15 ms para dar tiempo al servo a llegar a la nueva posición
}

}


Tiene fallos de montaje, pero los corregiré cuando Obijuan suba las librerías de las orugas, ya que con dichas librerías si que podré simular el movimiento perfectamente.



Por otra parte estuve ayudando al control de servos continuos, que como ya tenia cierta experiencia, como puse en la entrada anterior. He hecho un programa muy simple para control de un servo continuo:

#include

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}


void loop()
{

pos=0;
myservo.write(pos);
delay(1000);
pos=180;
myservo.write(pos);
delay(1000);
pos=94;
myservo.write(pos);
delay(1000);

}

Vamos ahora con otro experimento, los Legos MindStorms. Mi experiencia fue muy buena y aunque yo jamas tuve Legos de chico, fue muy fácil de aprender a dominar su manejo. Dejo un video de un robot que hice, aunque espero en el futuro hacer una entrada sobre ello:


lunes, 5 de marzo de 2012

Entrega 1 de Cilindrín: Pruebas con sensores,servos y placa.


Ayer terminé de circuitear el Cilindrín, el cual se presentara como modelo de ejemplo en el Cybertech. Esta entrada formara parte de su documentación.

Prueba de sensores

Estuve probando los diferentes sensores y estos fueron los resultados:

Programa de prueba:

#define inPin 1
int value = 0; /
void setup()
{
Serial.begin(9600);
pinMode(inPin, INPUT);
}
void loop()
{
value = analogRead(inPin);
Serial.println(value);
delay (500);
}

Finales de carrera (End-Stops): Las pruebas con los sensores se hicieron con el esquema que viene en los talleres, pero debe ser al revés cuando es la entrada es digital.



LDRs: Mismo esquema que en el anterior pero cambiando el final de carrera por el LDR. Solo 200 puntos de diferencia en la entrada analógica ,lo que indica mucha sensibilidad.

Potenciómetro: Igual que LDRs, pero con total recorrido de puntos en la entrada para un potenciometro de 4K7.


Sensores de distancia y fotodetectores.

Esquema

En el sensor analogico el valor maximo es 650


El sensor digital presenta un led rojo.
Array optodetectores (digital)



Con componentes basicos: fotodiodo y fototransistor

El fototransistor pasa de no conducir a 20 k (haría falta un transistor para amplificar). Conectado directamente es 60 puntos de diferencia.
Funciona igual reflejando en superficies blancas
Para puentear , habría que amplificar con transistor. Mejor utilizar el integrado 4n37

Foto del montaje

Receptor ir preparado:

Parece que da el valor en digital.
Esquema

http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
Hay que realizar una modificacion para las versiones modernas (viene al principio de la pagina)
El que mejor va es el ejemplo irreceiverdump.

Controlo de servo continuo(trucado o no)

Los diferentes valores dan diferentes velocidades y sentidos de giro:
Pos=0, sentido antihorario
Pos=180, sentido horario
Siempre hay una posición que bloquea las ruedas, en nuestro caso es 94
No hemos podido alimentar la placa de potencia con el microcontrolador.
Ejemplo practico a modificar para placa de control:

int inpuA = 2; // define function INTPUT 1 (IC2)
int inpuB = 12; // define function INTPUT 2 (IC2)
int inpuC = 8; // define function INTPUT 3 (IC2)
int inpuD = 7; // define function INTPUT 4 (IC2)
int pwm1 = 11; // define function ENABLE A (IC2)
int pwm2 = 10; // define function ENABLE A (IC2)
void setup()
{
pinMode (inpuA, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuB, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuC, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuD, OUTPUT); // definir la pa􀁗illa como salida
pinMode (pwm1, OUTPUT); // definir la pa􀁗illa como salida
pinMode (pwm2, OUTPUT); // definir la pa􀁗illa como salida
}
void loop()
{
int i,d ;
i=255; // definir el valor del PWM 0-255 (velocidad)
d=50; // definir el valor del PWM 0-255 (velocidad)
analogWrite(pwm1, i); // Salida del PWM para el ENABLE A (IC2)
digitalWrite (inpuA, HIGH); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB, LOW); // Desactiva el INTPUT 2 (IC2)
// Resultado del OUT1 = +
// Resultado del OUT2 = -
delay (1000);
analogWrite (pwm2, d); // Salida del PWM para el ENABLE B (IC2)
digitalWrite (inpuC, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD, HIGH); // Activa el INTPUT 4 (IC2)
delay (1000);
// Resultado del OUT3 = -
// Resultado del OUT4 = +
}


TABLA DE CONEXIONES

Documento adjunto. En el Dropbox del Proyecto

Una pregunta interesante seria:¿ Existe diferencia entre A1 y 1? Si ,son entradas diferentes.
Problema en el load: Para cargar los programas desconectar la alimentación de los servos.

Programa de prueba(Girar a la derecha)

#include

Servo myservod;
Servo myservoi;

const int buttonPin = 3; // the number of the pushbutton pin
int pos = 180; // variable to store the servo position
int pos2 = 0; // variable to store the servo position
int var=1 ;
void setup()
{
Serial.begin(9600);
myservod.attach(9); // attaches the servo on pin 9 to the servo object
myservoi.attach(6); // attaches the servo on pin 9 to the servo object
pinMode(buttonPin, INPUT);
}


void loop()
{

myservod.write(pos); // tell servo to go to position in variable 'pos'
myservoi.write(pos2); // tell servo to go to position in variable 'pos'
var = digitalRead(buttonPin);
delay(15);


if(var == LOW)
{
Serial.write(1);
myservod.write(pos); // tell servo to go to position in variable 'pos'
myservoi.write(pos);
delay(1000);
}
delay(1000);
}

Y el video:



lunes, 20 de febrero de 2012

U1 y R1: Open Source Construx Blocks


Desde hacia tiempo estaba detras de unos diseños Open Source con los que se pudieran hacer fácilmente brazos robóticos. Tras conocer el Y1 de Obijuan (www.iaerobotics.com), me decidí a hacer unos módulos derivados de este por el cual se pudieran hacer cualquier tipo de robots, incluidos brazos.


Montaje de un Y1

Al no estar disponible actualmente la impresora 3d (Darthmaker) , he hecho los modulos a traves de planos con pvc. Asi ha quedado el Y1:


Lo siguiente ha sido diseñar e imprimir los planos del U1 y R1. El U1 es un nexo de unión entre piezas y no lleva ningún tipo de electrónica ni motor de momento. El R1 es la articulación rotatoria básica.

Los planos han sido colgados en mi cuenta de Thingiverse:

http://www.thingiverse.com/exergy123



R1



U1

Foto de familia

Para finalizar he hecho una prueba con los servos. Dejo el código y el vídeo:

#include

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

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

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

El vídeo:




sábado, 28 de enero de 2012

Arduino 5: Shield Ardurobotronica, muerte de Arduino y fin del proyecto Recly!




He conseguido controlar el brazo ThumbsUp con la placa de control de motores Ardurobotronica. Compre esta porque era la que mejor precio tenia con respecto a lo motores que puede controlar (6).

http://www.juguetronica.com/tienda/detalles/2120/251/robotica/arduino-y-accesorios/ardurobotronica-kit-para-montar-.html

Lo primero que me di cuenta es que no traia documentacion para montar y le faltaba elementos.
Tuve que comprar los componentes. Después de soldarla , la probe en el Arduino con el programa de prueba que traia el manual.


Este era el programa:

int inpuA = 2; // define function INTPUT 1 (IC2)
int inpuB = 12; // define function INTPUT 2 (IC2)
int inpuC = 8; // define function INTPUT 3 (IC2)
int inpuD = 7; // define function INTPUT 4 (IC2)
int pwm1 = 11; // define function ENABLE A (IC2)
int pwm2 = 10; // define function ENABLE A (IC2)
void setup()
{
pinMode (inpuA, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuB, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuC, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuD, OUTPUT); // definir la pa􀁗illa como salida
pinMode (pwm1, OUTPUT); // definir la pa􀁗illa como salida
pinMode (pwm2, OUTPUT); // definir la pa􀁗illa como salida
}
void loop()
{
int i,d ;
i=255; // definir el valor del PWM 0-255 (velocidad)
d=50; // definir el valor del PWM 0-255 (velocidad)
analogWrite(pwm1, i); // Salida del PWM para el ENABLE A (IC2)
digitalWrite (inpuA, HIGH); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB, LOW); // Desactiva el INTPUT 2 (IC2)
// Resultado del OUT1 = +
// Resultado del OUT2 = -
analogWrite (pwm2, d); // Salida del PWM para el ENABLE B (IC2)
digitalWrite (inpuC, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD, HIGH); // Activa el INTPUT 4 (IC2)
// Resultado del OUT3 = -
// Resultado del OUT4 = +
}

No funcionaba. Comprobe las soldaduras a contraluz y resulto que habia tres soldaduras mal y una cortocircuitada con otra.Despues de esta prueba el Arduino ya no era reconocido por el ordenador. Mirando el Arduino encontre una mota de estaño, que habria caido de la placa (no estuve soldando con la placa puesta, asi que no se).Esa mota de estaño estaba entre los contactos del chip FTD (el cual se encarga de la conexion Usb). El Arduino ensi seguia ejecutando el ultimo programa que le meti el de prueba. Ahora si funcionaba la placa Ardurobotronica.



Asi que tengo que dar por muerto el Arduino .DEP
Por suerte tenia ekl microkit32, otro microcontrolador 100% compatible con arduino.Con este implemente el seguiente programa:

int inpuA_1 = 11; // define function INTPUT 1 (IC2)
int inpuB_1 = 10; // define function INTPUT 2 (IC2)
int inpuC_1 = 9; // define function INTPUT 3 (IC2)
int inpuD_1 = 6; // define function INTPUT 4 (IC2)
int inpuA_2 = 2; // define function INTPUT 1 (IC2)
int inpuB_2 = 12; // define function INTPUT 2 (IC2)
int inpuC_2 = 8; // define function INTPUT 3 (IC2)
int inpuD_2 = 7; // define function INTPUT 4 (IC2)
int inpuA_3 = 5; // define function INTPUT 1 (IC2)
int inpuB_3 = 3; // define function INTPUT 2 (IC2)
int inpuC_3 = 4; // define function INTPUT 3 (IC2)
int inpuD_3 = 13; // define function INTPUT 4 (IC2)
void setup()
{
Serial.begin(9600);
pinMode (inpuA_1, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuB_1, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuC_1, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuD_1, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuA_2, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuB_2, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuC_2, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuD_2, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuA_3, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuB_3, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuC_3, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuD_3, OUTPUT); // definir la pa􀁗illa como salida
}
void loop()
{

byte brightness;
byte angulo;
if (Serial.available()) {
brightness = Serial.read();


//IC1
if(brightness == 1){
digitalWrite (inpuA_1, HIGH); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB_1, LOW); // Desactiva el INTPUT 2 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 40){
digitalWrite (inpuA_1, LOW); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB_1, HIGH); // Desactiva el INTPUT 2 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 60){
digitalWrite (inpuC_1, HIGH); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_1, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 90){
digitalWrite (inpuC_1, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_1, HIGH); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 120){
digitalWrite (inpuC_1, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_1, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 91){
digitalWrite (inpuA_1, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuB_1, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}



//IC2
if(brightness == 2){
digitalWrite (inpuA_2, HIGH); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB_2, LOW); // Desactiva el INTPUT 2 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 3){
digitalWrite (inpuA_2, LOW); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB_2, HIGH); // Desactiva el INTPUT 2 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 4){
digitalWrite (inpuC_2, HIGH); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_2, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 5){
digitalWrite (inpuC_2, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_2, HIGH); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 7){
digitalWrite (inpuC_2, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_2, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 6){
digitalWrite (inpuA_2, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuB_2, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
//IC3
if(brightness == 16){
digitalWrite (inpuA_3, HIGH); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB_3, LOW); // Desactiva el INTPUT 2 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 12){
digitalWrite (inpuA_3, LOW); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB_3, HIGH); // Desactiva el INTPUT 2 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 13){
digitalWrite (inpuC_3, HIGH); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_3, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 14){
digitalWrite (inpuC_3, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_3, HIGH); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 7){
digitalWrite (inpuC_2, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD_2, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 15){
digitalWrite (inpuA_3, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuB_3, LOW); // Activa el INTPUT 4 (IC2)
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
}}

Para Processing el de siempre:

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()[1tt], 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);
}

if (key == 'w') {
fill(45);
prueba=2;
port.write(prueba);
}
if (key == 'e') {
fill(90);
prueba=3;
port.write(prueba);
}
if (key == 'r') {
fill(135);
prueba=4;
port.write(prueba);
}
if (key == 't') {
fill(255);
prueba=5;
port.write(prueba);
}
if (key == 'q') {
fill(0);
prueba=6;
port.write(prueba);
}
if (key == 'y') {
fill(0);
prueba=7;
port.write(prueba);
}
if (key == 'z') {
fill(0);
prueba=16;
port.write(prueba);
}
rect(25, 25, 50, 50);
if (key == 'x') {
fill(45);
prueba=12;
port.write(prueba);
}
if (key == 'c') {
fill(90);
prueba=13;
port.write(prueba);
}
if (key == 'v') {
fill(135);
prueba=14;
port.write(prueba);
}
if (key == 'b') {
fill(255);
prueba=15;
port.write(prueba);
}



}




Con este controle el bazo ThumbsUp.



También intente seguir con el Proyecto Recly! , pero me he dado cuenta que al no tener motores paso y tener que controlar el movimiento bansandome en encoder hace demasiado complicado que este proyecto se pueda hacer fácilmente con cualquier impresora, por lo que pierde interés realizarlo por haber mucho otros mejores diseños ya disponibles en las web.Por ello doy por concluido el proyecto Recly! Dejo el video:



domingo, 22 de enero de 2012

Arduino 4: Brazo robótico con Arduino



Entre examen y examen he decidido darle un empujoncito a lo del brazo robótico y he estado experimentando con los servos. Este programa seria una ampliación de la cámara robotizada de la entrada Arduino 3.

El programa seria:

Proccesing

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()[2], 9600);
}



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 == 'w') {
fill(45);
prueba=2;
port.write(prueba);
}
if (key == 'e') {
fill(90);
prueba=3;
port.write(prueba);
}
if (key == 'r') {
fill(135);
prueba=4;
port.write(prueba);
}
if (key == 't') {
fill(255);
prueba=5;
port.write(prueba);
}
if (key == 'q') {
fill(0);
prueba=6;
port.write(prueba);
}


if (key == 'z') {
fill(0);
prueba=16;
port.write(prueba);
}
rect(25, 25, 50, 50);
if (key == 'x') {
fill(45);
prueba=12;
port.write(prueba);
}
if (key == 'c') {
fill(90);
prueba=13;
port.write(prueba);
}
if (key == 'v') {
fill(135);
prueba=14;
port.write(prueba);
}
if (key == 'b') {
fill(255);
prueba=15;
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
Servo myservo3; // 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(10); // liga el servo conectado en el pin 9 al objeto servo
myservo3.attach(11); // 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();
}

//Tercer Servo
if(brightness == 12){
angulo=45;
myservo3.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 13){
angulo=90;
myservo3.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 14){
angulo=120;
myservo3.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 15){
angulo=180;
myservo3.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
if(brightness == 16){
angulo=1;
myservo3.write(angulo);
brightness = Serial.read();
delay(30);
brightness = Serial.read();
}
}
}


Y el video:



viernes, 9 de diciembre de 2011

Proyecto ejemplo




Esta entrada es va a ser parte de la documentación para el proyecto ejemplo de la asociación reset:
Este robot sera utilizado como ejemplo para el concurso Cybertech. Estara desarrollado con íntegramente con software y hardware libre y sus piezas tambien seran Open Source. La filosofia se intenta asemejar a Skybot,Orugator,F-Track (www.iaerobotics.com).

El robot sera capaza de realizar las siguientes rutinas:

Rutinas principales:
-Ratón:Seguidor de lineas , pudiendo esquivar obstaculos y realizar adelantamientos
-Topo: Resolución de un laberinto
-Condición:Pasar de seguidor de lineas a modo laberinto de forma automática
-Remoto: Control remoto del robot a través de señales infrarrojas.

Subrutinas de seguimiento:
Toro: Empuja a cualquier objeto dentro de su campo.
Perro: Se va hacia cualquier cosa que en sus sensores pero mantiene una distancia.
Rex:Igual que seguidor, pero el objeto debe moverse.
Sumo: Empuja a cualquier objeto que este dentro de su campo , hasta llegar a una linea
Polilla:Seguidor de luz
Gato: Seguidor de una pared.

Para esto se utilizara solo dos motores unicamente y sensores de distancia infrarrojos.

Aparte de los dos motores, como actuadores también tendrá luces y algún que otro actuador

Lista de componentes

x2 Fotocelulas http://www.sparkfun.com/products/9088 1,50€/u
x2 Servos Parallax Continuos 15€/u
x3 Sensores de distancia 5cm 3,25 €
x1 Sensor de distancia 10cm 5,85 €
x1 Array de fotoreflectores http://www.juguetronica.com/tienda/detalles/1777/252/robotica/sensores/cadena-sensores-reflectancia-8rc.html 15,21€
x1 Dectector de infrarojos http://www.juguetronica.com/tienda/detalles/1773/252/robotica/sensores/receptor-de-infrarrojos.html 2,95€
x1 ChipKit32 o Arduino UNO 22 €
x1 Cybertech driver shield o Arduino motor shield http://www.bricogeek.com/shop/arduino/15-motor-shield-kit.html 21,00€

Total: 110 €

sábado, 12 de noviembre de 2011

Proyecto CNC Recly!



Proyecto CNC Recly!

He comenzado un nuevo proyecto , que será a largo plazo, llamado Recly!
Este proyecto se basa en la idea de utilizar una impresora vieja o de segunda mano para crear una CNC Router (fresadora) Open Source. Para eso he conseguido la siguiente impresora:





Una HP Dekjet defectuosa de fabrica (no recogia papel). Al no haberse utilizado nunca , no esta manchada de tinta por ningún lado, por lo que me facilita el proceso de desmontaje.
El primer problema que me he encontrado han sido los tornillos, los cuales son de tipo hexagonal especial (anti-manitas desmontadores de impresoras) , pero con un destornillador plano y mucha paciencia he conseguido quitarlos



Impresora sin el escaner




El carro sin la carcasa

Me he fijado en que esta impresora, al contrario de lo que yo creia , no lleva motores paso a paso, sino de cc normales con encoders para controlar su posicion. Imagino que de esta forma salen mucho más baratos.



El encoder del carro.

Carro del escaner

Una vez sacado el carro con sus engranajes, y el carro del escaner , ya solo queda el segundo paso:



Control de los carros con Arduino y etapa de potencia (drivers) (Próximamente)





Saque la idea de este proyecto de aqui:

http://www.instructables.com/id/DIY-CNC/
http://www.cnczone.com/forums/open_source_cnc_machine_designs/
http://buildyourcnc.com/default.aspx

domingo, 30 de octubre de 2011

Arduino 3 : Robot gusano y cámara robotizada 2



Arduino 3 : Robot gusano y cámara robotizada 2


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





Mis módulos

Por eso he programa esta especie de gusano, al cual le 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 la 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í dejos los vídeos, tanto desde fuera como con la Cam montada en el gusano:









Cámara robotiza 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.

domingo, 23 de octubre de 2011

Controlando con el teclado y Arduino: Camara robotizada

En el experimento de hoy he probado el control serie de Arduino , enviando bytes a través del USB y haciendo que Arduino los interprete. Para enviar los datos he utilizado Processing , primo hermano de Arduino, es un lenguaje orientado a gráficos basado en Java. Para este ejemplo he probado los ejemplos de Dimmer y Sweep en Arduino y Keyboard en Processing. Digamos que los he mezclado un poco y he conseguido un programa que interpreta algunas teclas como bytes, las envía a Arduino y este las interpreta como posición para el servo.

Como bonus, le he puesto una webcam a la estructura, por lo que he conseguido una cámara robotizada

Para Processing:

//Este ejemplo esta bajo licencia Creative Commons

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 MAYÚSCULAS

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);

}

Para Arduino:


#include

Servo myservo; // 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
}

void loop()
{
byte brightness;

// 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:
myservo.write(brightness);
delay(3000);
}
}

Estos son los vídeos. Os recomiendo que los veáis los dos a la vez, ya que asín están grabados.





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

lunes, 17 de octubre de 2011

Mi primer Hola Mundo con Arduino




Como comentaba en la anterior entrada, antes de Arduino era muy difícil hacer aplicaciones sencillas de robótica. Hoy me ha llegado mi primer AR-UNO y por eso voy a mostrar mis primeros experimentos con la placa.





1º Experimento : Encender y apagar un led

Después de pelearme con la instalación de los drivers, debido a que instale la versión 19(no soporta AR-UNO) , conseguí conectar la placa al ordenador.

Este es el código que inserte (se llama Blink y es el 1º ejemplo que viene):

/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.

This example code is in the public domain.
*/

void setup() {
// initialize the digital pin as an output:
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}

Utilice dos leds y así quedo el montaje:





2ºExperimento: Control de un servo

Hace ya mucho tiempo que quería echar a andar estos servos, los cuales acople a una estructura que pretendía ser un brazo robótica. He probado primero con un servo que va hacia arriba y hacia abajo. Este es el código:

// Sweep
// por BARRAGAN

#include

Servo myservo; // crea un objeto tipo servo para controlar el servo

int pos = 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
}

void loop()
{
for(pos = 0; pos < 180; pos += 1) // va de 0 a 180 grados
{ // en pasos de 1 grado
myservo.write(pos); // 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
}
for(pos = 180; pos>=1; pos-=1) // va de 180 a 0 grados
{
myservo.write(pos); // 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
}
}




En vez de dejaros fotos , dejare un vídeo que le he hecho:








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


Seguir @Exergy123