Category: Mecatronica libre


Como os dije en la entrada anterior hemos empezado a construir nuestro propio brazo robótica.

Para ello en primer lugar observamos el diseño del brazo que venden como kit de montaje, (el que controlábamos en el video anterior) vimos sus movilidad, sus limitaciones, su fuerza, su velocidad… Con respecto a la movilidad es un brazo bastante flexible, tiene cinco articulaciones, permite llegar a todos los puntos de diferentes formas. Uno de los grandes incovenientes es que es bastante lento, como está hecho con motores DC y reductoras para conseguir algo de precisión tiene muy poca velocidad, y no lo puedes controlar con exactitud, no hace dos movimientos iguales. También la fuerza era un punto a mejorar, a pesar de que los motores no estuviesen muy allá está hecho de plástico y por lo tanto limitado a coger objetos ligeros.

Una vez estudiado los puntos a mejorar del brazo procedimos a hacer un diseño para tener una idea de los materiales que ibamos a necesitar, su precio, electrónica, motores…  El diseño lo hicimos en CAD os dejo aquí el plano.

Brazo robotico-Model

El brazo está diseñado para fabricarse con perfiles en U de aluminio, y motorizado con Servomotores en las articulaciones bajas y microServos en las articulaciones más altas. Una vez terminado la parte del diseño llegó la hora de ir a comprar, los perfiles de aluminio U son fáciles de encontrar en almacenes de bricolaje al igual que la tornillería, los servos lo teníamos de otros proyectos y la garra la compramos en libelium.

En el siguiente post seguiremos contando cómo avanza el proyecto.

Buenas, desde hace un mes nos hemos metido más a fondo en el tema de la mecatrónica, y que mejor forma de hacerlo que controlando el brazo robótico que compramos hace ya un tiempo, para controlarlo hemos usado nuestra placa focusduino, basada en arduino.

A pesar de que este brazo está hecho con motores DC y la estructura es de plástico nos ha motivado a seguir avanzando un poco más en esto de los brazos robóticos, con lo que nos hemos propuesto construirnos nuesto propio brazo robótico, ya que en las tiendas lo mejor que podemos encontrar es este y controlado por un software que tiene que estar enchufado al ordenador y solo es compatible con el OS de Sr Gates.

 

 

Pronto os iremos contando los avances con nuestro brazo.

Buenas, una de las cosas más impactantes de la domótica es llegar a casa dar una palmada y encender la luz, pues bien, eso lo podríamos hacer con alguno de los micrófonos que venden en dealextreme para arduino por unos cuantos dolares, pero si vuestra paciencia no es capaz de esperar a hacerse viejo y queréis saber cómo hacerlo sin usar ninguna placa de micrófono os explico brevemente qué tenéis que usar.

No sé si sabréis que un altavoz no es más que una membrana que al llegarle una señal por el cable la hace vibrar a una frecuencia determinada, pues si lo hacéis a la inversa, es decir, mandáis una frecuencia por el aire a la membrana, ésta a su vez se excita y manda por el cable una señal, esa pequeña señal la podéis amplificar y leerla con Arduino.

Para amplificar esa señal existen numerosos circuitos, esta vez he usado un amplificador operacional u741 que añadiéndole un par de resistencias y polarizándolo con +15v, gnd y -15v  podéis hacer que amplifique la señal por la constante que queráis (entre 1 y 1 millón) Os dejo el esquema para que le echéis un vistazo.

esquema741

Teniendo el circuito amplificador listo, leemos la señal analógica con Arduino, usando el programa que viene en el compilador como ejemplo de AnalogReadSerial vemos la entrada que tenemos, y cómo varía al dar una palmada o golpear la mesa, ponemos. Escribimos en nuestro programa que cuando el sonido llegue a un punto determinado se enciende un led, o active el relé para encender la luz.

Os dejo por aquí el video, esta vez no enciendo la lámpara sino que enciendo un led del laboratorio.

Retomando un poco el tema de la domótica hemos hecho un pequeño proyecto para probar los sensores magnéticos, instalando uno en la puerta de la habitación hacemos que al abrirla se encienda la luz y al cerrarla se apague.

Un sensor magnético consiste básicamente en un pequeño «interruptor» formado por una pequeña lámina metálica que al acercarse el imán ésta hace contacto cerrando así el circuito, son bastante económicos aunque también bastante frágiles ya que al tener ese movimiento mecánico con el tiempo suelen dañarse. En esta ocasión he usado uno que he sacado de un velocímetro de bicicleta, para comprobar si funciona hemos le ponemos una resistencia y montamos un circuito desde el gnd de arduino hasta la salida de 5v, cargamos el código de DigitalReadSerial y pinchando uno de los pines digitales vemos como al acercarse el imán marca 1 y al alejarse 0.

 

Habiendo montado ese circuito retocamos un poco el código añadiendo una condición para activar el relé cuando marque 0 la lectura. Podéis ver cómo haceros una placa relé y un código de ejemplo en el primer post: https://openmechatronics.wordpress.com/2011/09/03/control-de-luces-con-mando-ir-y-arduino/

 

Os dejo un vídeo para que veáis cómo funciona.

 

 

Otro de los proyectos que he hecho durante este curso ha sido el disparador de fotos por ultrasonido, con este «aparatito» podemos cerrar el obturador de una cámara mediante un movimiento. Es bastante útil ya que podemos accionar la cámara a parte de con un sensor ultrasonido con cualquier otra aplicación para Arduino (sensor de luz, Xbee, Ethernet…).

Os dejo el video para que veais el funcionamiento.

Para interactuar desde Arduino con la cámara hemos usado un emisor IR el cual actúa como mando para la cámara, a partir de ahí ya podemos usar cualquier cosa para controlarla, desde un pulsador para hacer un mando económico, hasta la ethernet shield para realizar fotos desde cualquier parte del mundo.

Os dejo un enlace con las librerías para controlar diferentes cámaras a través del IR y con el código de prueba.

FocusBot

Tras haber dejado de lado un poco el blog, os subo los proyectos que he estado haciendo durante el curso, no he hecho todos los que me hubiese gustado por falta de tiempo.

En esta entrada os voy a mostrar FocusBot, hecho desde Iniciativa Focus en la Universidad de Málaga, este robot quizás sea el más inteligente o más bien el menos tonto de los que he hecho hasta ahora, es capaz de avanzar por una habitación con obstáculos esquivándolos en un 90 % de los casos, este porcentaje de éxito se podría aumentar con facilidad mejorando la «visión», es decir, eliminando los ángulos muertos, esto lo haríamos añadiéndole un tercer sensor de ultrasonido.

Como siempre hemos usado una placa Arduino Focusduino (placa arduino con contrador de motores), dos sensores ultrasonidos y una base robótica con dos motores.

Os dejo el video.

También he hecho una librería para los sensores de ultrasonido para aligerar así el código, la podréis descargar junto con el programa del robot como ejemplo:

Descargar librería y código aquí.

Mecatrónica

Ahora que comienza el curso es buen momento para explicar qué es, o para qué sirve lo que llamamos MECÁTRONICA. Esta nueva disciplina viene de la combinación de distintas ramas de la ingeniería como son: la ingeniería mecánica, ingeniería electrónica, ingeniería de control e ingeniería informática. Esta combinación forman lo que es la ingeniería mecatrónica, una especialidad reciente que surge ante la necesidad tecnológica a la que vamos orientados.

Este término fue acuñado por  la empresa japonesa Yaskawa Electric Co en 1969, y años más tarde permite el libre uso de este término. La mecatrónica nace para autimatizar la maquinaría existente, y hacer así los procesos más agiles y confiables, con esta nueva rama se pretende conseguir también la armonización de los componentes mecánicos de un sistema y los electrónicos lo cual ha sido siempre bastante complejo.

Un ingeniero en Mecatrónica es un profesional con amplio conocimiento práctico y multidisciplinario capaz de integrar y desarrollar sistemas automatizados que involucren tecnologías de varios campos de la ingeniería. Este especialista entiende sobre el funcionamiento de los componentes mecánicos, eléctricos, electrónicos y computacionales de los procesos industriales; y que tiene como referencia el desarrollo sostenible.

Para estudiar esta profesión cada día va siendo más accesible, aunque aún no se ha extendido a numerosas universidades, pese a que en EE.UU. lleva ya tiempo existiendo esta especialización, aquí en España para ser ingeniero en mecatrónica tenías que hacer ingeniería industrial o informática y una vez terminada realizar un máster. Hoy día contamos en Andalucía (Sevilla y Málaga) con Ingeniería electrónica, robótica y mecatrónica, una nueva carrera que ha apecido gracias al proyecto de Andalucía Tech.

Cada día nuestra persiana se va haciendo más inteligente, o más bien, la voy haciendo menos tonta. Esta vez hemos incluido al sistema un elemento muy importante a la hora de hacerla más autónoma: el sensor de luz, al haberle incorporado la memoria eeprom anteriormente nos posibilita añadirle este tipo de sensores. El funcionamiento en esta primera prueba es muy simple, cuando detecta que hay una determinada luz sube la persiana para así dejar pasarla, y cuando detecta más oscuridad la cierra, partiendo de esto podríamos hacerla a nuestro gusto,  y conforme hubiera más luz, se pusiese a una determinada posición. Os dejo el video de prueba

El código es el siguiente:

// Miguel Angel Torres de la Camara, matc2068@gmail.com, openmechatronics.wordpress.com
//Proyecto domotica: control de persianas mediante el sensor de luminosidad
#include <Servo.h>
#include <Wire.h>
#include <CursoArduino.h>
#include <EEPROM.h>
const int analogInPin = A0;
int sensorPin = A0;    // pin del sensor de luz
int sensorValue = 0;
int addr = 0;
int estado = EEPROM.read(addr); //estado de la persiana (0-100) guardado en la memoria eeprom
byte valor;

void setup(){
  inicializa();
  Serial.begin(9600);
}
void subePersiana(){ //funcion para subir la persiana (100) desde abajo (0)
  if(sensorValue > 640){ //sube la persiana si hay mucha luz
  retrocedeDerecho(100);
  delay(900);
  estado = 100; //al subir el estado es igual a 100
  EEPROM.write(addr, estado); //guarda el estado en la direccion 0
}
else{
  para();
}}
void bajaPersiana(){ //funcion para bajar la persiana (0) desde arriba (100)
  if(sensorValue < 500){ //baja la persiana si hay poca luz
  avanzaDerecho(100);
  delay(850);//al bajar, el tiempo necesario disminuye
  estado = 0; //estado nuevo es igual a 0
  EEPROM.write(addr, estado);  //guarda estado en la eeprom
}
else{
para();
}}
void loop(){
  sensorValue = analogRead(analogInPin);   
  int dato = Serial.read(); //lee el numero en el serial
  if(estado == 100){ //si la persiana esta arriba
    bajaPersiana(); //bajala cuando no haya luz
  }
  else if(estado == 0) { //si la persiana esta abajo
    subePersiana(); //subela cuando no haya luz
  }
  //imprime el estado de la memoria eeprom y el valor del sensor de luminosidad
  Serial.print(addr);
  Serial.print(«\t»);
  Serial.print(EEPROM.read(addr), DEC);
  Serial.println();               
  Serial.print(«sensor = » );                       
  Serial.print(sensorValue);  
  Serial.println();
  delay(30);    
}

Tras los proyectos de domótica realizados, me atraía la idea de hacer un robot un poco más dinámico y menos aburrido que hacer subir y bajar la persiana. Desde que vi un Segway quedé fascinado por el funcionamiento, la suavidad y el manejo tan simple que tenía, a la vez que combinaba una tecnología compleja para permanecer en equilibrio. Con los avances tecnológicos que ha habido en el siglo XX, parece mentira que hasta el siglo XXI (alrededor del 2000 o 2001) no se haya inventado este medio de transporte individual. Hoy en día es usado en las grandes industrias para que los empleados se desplacen de un lugar a otro, también lo usan los agentes de seguridad en aeropuertos, en zonas peatonales… Así que me propuse hacer un segway, o más bien, un minisegway con lo que tenía por casa, el controlador sería como no nuestra placa arduino, con el controlador de motores,  como acelerómetro usaríamos el del mando nunchuck de la wii, un par de motores y listo, sólo quedaría la programación, que no es poco. Así que monté todo el chasis instalé todos los componentes y me puse manos a la obra con el código. En primer lugar probé un código simple, que leyese el ángulo del acelerómetro y si pasase del punto de equilibrio hacia un lado o hacia otro andase adelante o hacia atrás, dependiendo. Evidentemente no fue así de fácil, tenía que tener en cuenta la aceleración, conforme se fuese cayendo fuera acelerando para contrarrestar la caída, así que tras varios intentos fallidos hice el siguiente código:

// Miguel Angel Torres de la Camara, matc2068@gmail.com, openmechatronics.wordpress.com
//Robotica, mecatronica libre: Segway

#include <Servo.h>

#include <CursoArduino.h>

#include <WiiNChuck.h>

#include <Wire.h>

WiiNChuck chuck;
//acelerometros
int accx;
int accy;
int e = 95; //angulo de equilibrio
void setup(){
Wire.begin();
inicializa();
chuck.begin();
Serial.begin(9600);
}
void aceleraMotor(){ //funcion de aceleracion del motor
int x = 15;
if (accy < 40 && accy > 140){ // si el angulo que sale es < 40 o > 140 acelera mas
x = 2*x;
}
else{
x = 2*x;
}
if (accy < e){  //conforme caiga hacia la izquierda retrocede
retrocede(-((accy-e)-x));
}
else if (accy > e){ //conforme caiga a la derecha avanza
avanza((accy-90)+x);
}
}

void loop(){
chuck.update();
//acelerometros
accx=chuck.AccelX();
accy=((chuck.AccelY()) – 385); // al restar 385 el valor minimo pasa a ser 0, y el maximo 180

Serial.print(»  Acc X: «); //imprime acelerometro eje x
Serial.print(accx);
Serial.print(»  Acc Y: «); //imprime acelerometro eje y
Serial.print(accy);

Serial.println();     //salto de linea
delay(10);

//control de motores
int der = 180; //angulo maximo
int izq = 0; //angulo minimo
if (accy > izq && accy < der){ //si se sale de ese rango, o sea si vuelca, para
aceleraMotor();
}

else {
para();
}
}

Pues aunque en la teoría debía funcionar, en la práctica permanece en pie pocos segundos, así que si alguien sabe cómo se puede solucionar le invito a que modifique el código. Como pista os puedo dar que hay que usar un sistema PID.

Como dije en el último post, el proyecto de la persiana no estaba completo, ya que debido a la complejidad podía haber numerosas versiones, si controlarla con el mando o con los pulsadores parecía complejo eso correspondería a la versión más simple, ya que este tipo de sistemas tienen que funcionar con una memoria que nos diga dónde está la persiana, o más bien, que sepa dónde está, para que cuando pulses dos veces hacia arriba lo haga tan solo una vez y no se desenrrolle, o por ejemplo para dejar la persiana a mediación (50%). Con el código anterior podríamos ponerlo a mediación pero sabiendo nosotros previamente dónde estaba. Para hacer que la persiana sea más «inteligente necesitamos un tipo de memoria llamada memoria EEPROM:

(Wikipedia:) son las siglas de Electrically-Erasable Programmable Read-Only Memory (ROM programable y borrable eléctricamente). Es un tipo de memoria ROM que puede ser programada, borrada y reprogramada eléctricamente, a diferencia de la EPROM que ha de borrarse mediante un aparato que emite rayos ultravioletas. Son memorias no volátiles.

Este tipo de memorias son usadas en infinidad de aparatos electrónicos, arduino ya viene con este microcontrolador instalado, e incluso con la librería en las últimas versiones del software, aunque no es difícil de usar, requiere conocer previamente cómo funciona, esta ha sido la primera vez que he usado este tipo de memoria en un proyecto, y la relación entre dificultad y ventajas es muy favorable.

En primer lugar vamos a dar una pequeña explicación de cómo funcionan estas memorias: Básicamente los comando a usar para esta memoria con arduino, al igual que la mayoría de las memorias, son 3: «EEPROM.write(dirección, valor)» donde indicamos la dirección (un entero de 0 a 512) e indicamos el valor (otro entero de 0 a 1023), de esta forma guardamos los datos en la memoria eeprom. Para leerlo pues simplemente tendremos que imprimir en el monitor serial, «Serial.print()«,  el dato que hay guardado en la dirección donde hayamos guardado el valor, «EEPROM.read(dirección)», por lo que quedaría así «Serial.print(EEPROM.read(address), DEC)». Por último al ser una memoria borrable, debemos que saber que para borrar le tendremos que poner que «for (int i = 0; i < 512; i++)» para la direccion de 0 a 512 el valor es 0 «EEPROM.write(i, 0);»

Tras haber visto el funcionamiento de las memorias eeprom, vamos a explicar cómo lo hemos implementado en el proyecto de la persiana, antes de poner el código debemos saber que la persiana va a tener 3 estados que va a estar imprimiendo constantemente en el monitor, y aunque se apague va a seguir guardando ese valor, éste podrá ser 0, 50 ó 100 correspondiendo el primero cuando la persiana esté abajo y el último cuando esté arriba Estos 3 estados se podrán controlar con las teclas: 2 (baja la persiana), 5 (la deja a la mitad) y 8 (la deja arriba), estas teclas corresponden con las flechas que hay en el teclado númerico de la derecha.El código resultante ha sido el siguiente:

// Miguel Angel Torres de la Camara, matc2068@gmail.com, openmechatronics.wordpress.com
//Proyecto domotica: control de persianas con memoria eeprom
#include <Servo.h>
#include <Wire.h>
#include <CursoArduino.h> //libreria del curso iniciativa focus, descargable en su pagina.
#include <EEPROM.h>
int addr = 0;
int estado = EEPROM.read(addr); //estado de la persiana (0-100) guardado en la memoria eeprom
byte valor;

void setup(){
inicializa();
Serial.begin(9600);
}
void subePersiana(){ //funcion para subir la persiana (100) desde abajo (0)
retrocedeDerecho(100);
delay(900);
estado = 100; //al subir el estado es igual a 100
EEPROM.write(addr, estado); //guarda el estado en la direccion 0
}
void bajaPersiana(){ //funcion para bajar la persiana (0) desde arriba (100)
avanzaDerecho(100);
delay(850);//al bajar, el tiempo necesario disminuye
estado = 0; //estado nuevo es igual a 0
EEPROM.write(addr, estado);  //guarda estado en la eeprom
}
void bajamitadPersiana(){  //funcion para bajar la persiana hasta la mitad (50)
avanzaDerecho(100);
delay(900/2); //la mitad del tiempo
estado = 50; //el nuevo estado es 50
EEPROM.write(addr, estado);  //guarda el nuevo estado en la eeprom
}
void subemitadPersiana(){ //funcion para subir la persiana hasta la mitad (50)
retrocedeDerecho(100);
delay(1000/2);
estado = 50; //nuevo estado es 50
EEPROM.write(addr, estado); // guarda estado en la eeprom
}
void loop(){
int dato = Serial.read(); //lee el numero en el serial
if((dato ==’2′) && (estado == 100)){ //bajar (0) desde (100)
;
bajaPersiana();
}
else if((dato==’2′) && (estado == 50)){ //bajar (0) desde (50)
;
bajamitadPersiana();
estado = 0;
EEPROM.write(addr, estado);    //guarda que esta en 0
}
else{
para();
}
if((dato ==’8′) && (estado == 0)){ //sube a 100 desde 0
;
subePersiana();
}
else if((dato==’8′) && (estado == 50)){ //sube a 100 desde 50
;
subemitadPersiana();
estado = 100;
EEPROM.write(addr, estado); //guarda que esta en 100
}
else{
para();
}
if((dato ==’5′) && (estado == 100)){ //baja a 50 desde 100
;
bajamitadPersiana();
}
else if((dato==’5′) && (estado == 0)){ //sube a 50 desde 0
;
subemitadPersiana();
}
else{
para();
}
//imprime el estado de la eeprom
Serial.print(addr);
Serial.print(«\t»);
Serial.print(EEPROM.read(addr), DEC);
Serial.println();
delay(100);

}