Búsqueda personalizada

15 agosto 2006

Control de leds desde ratón - Arduino

Mas proyectos en: http://eduardomarin.es/node/2

Después de un primer intento para llevar a cabo un enlace directo entre ratón y Arduino, debido a problemas de comunicación entre los dos detallo la comunicación a través del pc.
Es una conexión muy parecida al enlace que ya hice entre teclado y el display de 8 segmentos, salvo que en esta ocasión, en vez de usar el programa terminal.exe implemento un controlador específico.
Pero, ¿cuál es la idea del invento?. Se trata de iluminar 4 leds, dispuestos en cruz, según se mueva el ratón. Así, si muevo el ratón hacia la izquierda, si iluminará el led de la izquierda. Si lo muevo hacia la derecha, se iluminará el de la derecha. Lo mejor de todo es que, aunque parezca algo sencillo y simple, tiene bastantes utilidades. Imaginemos poder mover un brazo mecánico mediante el uso del ratón y su rueda central :-) .
Para llevar a cabo esta tarea, primero había que conseguir hacer una lectura de los parámetros del ratón. Buscando en la red, encontré un driver ya implementado que solucionaba la ardua tarea de ponerse a rebuscar entre interrupciones y llamadas a bios. Esta librería, ratoli.h, puede encontrarse en la página del autor, pero no recuerdo dónde la encontré, así pues pego aquí el código:
/*

RATOLI.H:

-Llibreria amb rutines de control del Mouse.
-Ultima modificaci¢: 7-II-1995

*/
#include 

/* NOTA:    Valors de retorn de la funci¢ boto():
-----------------------------------------------
|  Valor:  |  Esquerra:  |  (Mig:)  |  Dret:  |
-----------------------------------------------
|    0     |     NO      |    NO    |   NO    |
|    1     |     SI      |    NO    |   NO    |
|    2     |     NO      |    NO    |   SI    |
|    3     |     SI      |    NO    |   SI    |
|    4     |     NO      |    SI    |   NO    |
|    5     |     SI      |    SI    |   NO    |
|    6     |     NO      |    SI    |   SI    |
|    7     |     SI      |    SI    |   SI    |
-----------------------------------------------
*/

union REGS rin,rout;

/*
-----------------------------------------------------------------------------
INITMOUSE: Inicialitza el mouse.
-----------------------------------------------------------------------------
*/
int InitMouse(void)
{
rin.x.ax=0;
int86(0x33,&rin,&rout);
return (rout.x.ax);            /* Retorna -1 si el mouse s'ha instalat. */                 /*         0 si no instalado*/
}

/*
-----------------------------------------------------------------------------
MOUSEOFF: Amaga el cursor del mouse.
-----------------------------------------------------------------------------
*/
void mouseoff(void)
{
rin.x.ax=2;
int86(0x33,&rin,&rout);
}

/*
-----------------------------------------------------------------------------
MOUSEON: Fa aparŠixer el cursor del mouse.
-----------------------------------------------------------------------------
*/
void mouseon(void)
{
rin.x.ax=1;
int86(0x33,&rin,&rout);
}

/*
-----------------------------------------------------------------------------
EIXX: Retorna la posici¢ horitzontal del mouse (depŠn de la ressoluci¢ del
text o dels gr…fics).
-----------------------------------------------------------------------------
*/
int eixx(void)
{
rin.x.ax=3;
int86(0x33,&rin,&rout);
return(rout.x.cx);
}

/*
-----------------------------------------------------------------------------
EIXY: Retorna la posici¢ vertical del mouse.
-----------------------------------------------------------------------------
*/
int eixy(void)
{
rin.x.ax=3;
int86(0x33,&rin,&rout);
return(rout.x.dx);
}

/*
-----------------------------------------------------------------------------
BOTO: Retorna l'estat dels botons. Veure la taula del principi per a saber
els valors exactes.
-----------------------------------------------------------------------------
*/
int boto(void)
{
rin.x.ax=3;
int86(0x33,&rin,&rout);
return(rout.x.bx);
}

/*
-----------------------------------------------------------------------------
SETMOUSEPOS: Col.loca el cursor del mouse en la posici¢ (x,y).
-----------------------------------------------------------------------------
*/
void SetMousePos(int x, int y)
{
rin.x.ax=4;
rin.x.cx=x;
rin.x.dx=y;
int86(0x33,&rin,&rout);
}


Por otra parte, debemos mandar datos a la placa Arduino, pero, esta vez, sin ayuda de terminal.exe, con lo cual debemos manejar los envíos y comunicaciones directamente. Lo primero que teníamos que hacer era conseguir mandar los datos correctamente. Dadas las características del puerto virtual USB-serial, se configuró para envío sobre 8 bits de datos, 1 bit de parada, no paridad y velocidad a 9600 bps. Despúes sólo quedaba mandar caracteres de control mediante la instrucción outport() sobre Arduino, y que éste interpretase correctamente el envío. El código sobre el pc quedaba entonces así:

/*     Nombre: Driver de rat¢n hacia Arduino control.c   */
/*      Escrito por: Eduardo Mar¡n Izquierdo   */
/* Basado  el env¡o puerto serie en source de: Craig Peacock  */
/*    Fecha:   14 - 8 - 2006    */

#include 
#include 
#include 
#include 
#define PORT1 0x3E8

/* Defines Serial Ports Base Address */
/* COM1 0x3F8    */
/* COM2 0x2F8     */
/* COM3 0x3E8     */
/* COM4 0x2E8     */

void main(void)
{
int c;
int ch;
int new_pos_x,new_pos_y,pos_x,pos_y;
outportb(PORT1 + 1 , 0);   /* Turn off interrupts - Port1 */

/*    PORT 1 - Communication Settings    */

outportb(PORT1 + 3 , 0x80);  /* SET DLAB ON */
outportb(PORT1 + 0 , 0x0C);  /* Set Baud rate - Divisor Latch Low Byte */
/* Default 0x03 =  38,400 BPS */
/*    0x01 = 115,200 BPS */
/*    0x02 =  57,600 BPS */
/*    0x06 =  19,200 BPS */
/*    0x0C =   9,600 BPS */
/*    0x18 =   4,800 BPS */
/*    0x30 =   2,400 BPS */
outportb(PORT1 + 1 , 0x00);  /* Set Baud rate - Divisor Latch High Byte */
outportb(PORT1 + 3 , 0x03);  /* 8 Bits, No Parity, 1 Stop Bit */
outportb(PORT1 + 2 , 0xC7);  /* FIFO Control Register */
outportb(PORT1 + 4 , 0x0B);  /* Turn on DTR, RTS, and OUT2 */

printf("Driver de rat¢n para Arduino\n");
printf("Por Eduardo Mar¡n\n");
printf("Pulse ESC para salir\n");

do {
new_pos_x=eixx();
if(new_pos_x>pos_x){
outportb(PORT1,'r');
}
else{
if(new_pos_xpos_y){
outportb(PORT1,'d');
}
else{
if(new_pos_y


Finalmente, y ya programando sobre Arduino, quedaba recibir los datos provenientes del código anterior. Sabiendo que los únicos carácteres de control eran aquellos que indicaban cuatro posibles direcciones (u,d,r,l; indicando: up, down, right, left), el código resultante es bastante sencillo. Si detectamos una 'u', entonces iluminaremos el led situado en la parte superior.
Observando el código, nos hacemos una idea de la solución:

/* Control de Leds desde teclado
* -------------
*
* Gracias a este programa podemos controlar un número de leds a partir
* del ratón del ordenador.
* 
* Autor: Eduardo Marín Izquierdo
* Fecha: 08-08-2006
*/

int pines [] = {12,11,10,9};
int Ledcontrol = 13;
byte caracter;
int retraso = 1;

void setup() {
int i;
pinMode (Ledcontrol,OUTPUT);
for (i=0; i<6; i++){
pinMode(pines[i],OUTPUT);
}
beginSerial(9600);  
}

void loop() {
caracter = serialRead();

if (caracter == 'l'){
digitalWrite(pines[0],HIGH);
delay(retraso);
digitalWrite(pines[0],LOW);
}
if (caracter == 'd'){
digitalWrite(pines[1],HIGH);
delay(retraso);
digitalWrite(pines[1],LOW);
}
if (caracter == 'u'){
digitalWrite(pines[2],HIGH);
delay(retraso);
digitalWrite(pines[2],LOW);
}
if (caracter == 'r'){
digitalWrite(pines[3],HIGH);
delay(retraso);
digitalWrite(pines[3],LOW);
}
}
Para hacerse una idea, el siguiente vídeo muestra la idea aquí expuesta.

10 agosto 2006

Noticias 003. Cronica de un encuentro anunciado.

Hoy me ha ocurrido algo que muchas veces me suele ocurrir, y que, seguramente, a más de uno le habrá sucedido y, además, se habrá puesto a pensar.
Ahora mismo estoy en Alcalá de Henares, y esta mañana salí a hacer compra a un hipermercado de la zona. En el barrio viven unos amigos de mi hermana que hace mucho tiempo que no veo.
Salgo a la calle y me viene a la mente una especie de predicción, obsesión o iluminación. Llamémoslo como se quiera a esa sensación que tiene uno de decir: "seguramente que me encuentro con esta persona". Vas como diciendo "seguro que me lo encuentro" y a la vez vas diciendo "seguro que no".
Pues el misterio en sí no tarda mucho en descubrirse. A los 2 minutos de salir del hipermercado me encuentro con aquélla persona que me rondaba por la cabeza.
En aquél instante la sorpresa esperada fue de agradable sensación, pues se trataba de buena gente.
El problema se encuentra cuando aquella persona que te viene a la cabeza no esperabas encontrártela, es más, no querías encontrártela y, como de una misteriosa traición, tus predicciones se personifican mientras tú pones mala jeta.
Así de raro es todo esto.
Así de raras son las casualidades.

Llegada de Arduino


El lunes, como esperaba, llegó Arduino.
Aquí pego fotos del ansiado momento.
Llegó en un paquete de la empresa USPS, la homóloga con Correos en USA. Al parecer, esta empresa tiene acuerdo con Correos una vez llegan sus paquetes a nuestra península. Y así fue. Un repartidor de Correos me hizo firmar la entrega.
Por lo tanto, ni tuve problemas con retención en aduana, ni hubo retraso. Todo correcto en el plazo estimado, 4-6 días.
En cuanto me llegó, comencé a trastear con la placa, probando leds, motorcillos, programando algún que otro pequeño modulillo.
Todo correcto.
Me di el placer de programar una lectura de teclado hacia salida de display de 8 segmentos. Fascinante.
Ahora espero encontrar, en primer lugar, algún que otro equipo viejo en la basura, alguna impresora o trasto con motor paso a paso. Si no tuviese suerte, y mira que buscar entre la basura no es de agrado, ya iría a la tienda a dejarme los cuartos, cosa que es de menos agrado todavía. Pediré, además, algún sensor de proximidad y aceleración para comenzar a hacer algún que otro gran proyecto, :-P.
Todo se verá con el tiempo, cosa que, ahora mismo, escasea.
En fin, a ver que tal. Hasta otra.




03 agosto 2006

La Evolución


Me puse a pensar, y al final acabé viendo al ser humano evolucionando.
De tanto pensar dije, seguro que tenemos un camocho bastante bueno.
De pensar y estudiar, me suele doler el cuello, al estilo Fernando Alonso, asique el ser humano del futuro tendrá un buen cuello.
Por otro lado, los demás músculos poco los ejercitamos, asique, será un tipillo algo enclenque, aunque con grandes dedos en las manos para poder trastear (por lo menos, si seguimos con el teclado, cosa que al final, dudo). No ocurre lo mismo con las plantas del pie, pues los dedos cada vez son más cortos.
De las partes íntimas no hablamos. Eso sí, sigue siendo igual de pudoroso, aparte de más cabreao.
Y para ilustrar la idea, ahí queda el hombre del futuro... :-P.

02 agosto 2006

Hoy hablamos de Arduino


Esta vez toca hablar del proyecto Arduino.

Anteriormente fue FON, y al final acabé formando parte de la comunidad. Por cierto que el AP funciona a pleno rendimiento.
Ahora toca trastear todavía más con este gadget, gizmo, cacharro o como se le quiera llamar.
Pero... ¿qué es arduino?
Arduino fue concebido como un proyecto de hardware libre. Sí, suena parecido a linux, software libre y licencias gnu. Sin embargo, aquí las ideas sobre software libre se entremezclan con diseños de circuiteria abiertos. No quiere decir que uno coja y diseñe un circuito integrado y se las apañe para construirlo. No. El proyecto arduino tiene un nivel algo superior. Disponemos de todos los componentes necesarios para crear un circuito capaz de controlar entradas y salidas, tanto analógicas como digitales, con posiblidiad de programación y muchas cosas más, todo ello bajo un diseño flexible, pues es la comunidad y los colaboradores los que han diseñado el circuito, el esquema. Eres tú el que decides seguir tal esquema y trabajar la pcb junto con sus componentes, o cambiar funcionalidades en el aparato. Por otro lado, si no estás muy familiarizado con la electrónica, puedes pedirlo ya montado.
A partir del circuito ya terminado podrá darse rienda suelta a la imaginación.
Las posibilidades son infinitas. Desde controlar un simple led, hasta llevar a cabo comunicación radio-modem en un robot mientras se tiene el control de servomotores conducidos por las indicaciones que nos llegan de los diferentes sensores que podremos montar.
La página oficial de Arduino nos muestra bastantes ejemplos y diseños a seguir, así como un foro en el cuál poder preguntar las dudas que nos abrumen.
Para los hispanoparlantes, visita obligada a la página oficial en traducción (por colaboradores).