Páginas

viernes, 18 de noviembre de 2011

Mi primera aplicacion con Gambas y Arduino


Arduino y Gambas
Mi primera aplicación

Hoy os traigo mi primera aplicación con Gambas y Arduino.
Es algo muy sencillo,el tipico encendido de led y apagado, pero bueno... por algun lado hay que empezar... :)

Hay que diferenciar 2 partes:
La programación de arduino:
Lo primero que hace es conectarse al puerto serie a una velocidad 9600, y mandar un mensaje "Conectado con el Arduino.Hello world". Luego entra en un loop, donde según reciba el valor "1" o "0", enciende o apaga el led conectado al puerto 13, enviando el correspondente mensaje al puerto de serie de "Arduino: He apagado/encendido el led 13"

int dato;
void setup()
{
// Inicializamos puerto serie a 9600 bps
Serial.begin(9600);
pinMode(13, OUTPUT);
// Enviamos "Hello World" con salto de línea al final
Serial.println("Conectado con el Arduino. Hello world!");
//arduino manda esta cadena al PC
}
void loop()
{
//¿Existen datos por el puerto serie?
if (Serial.available()) {
//Guardamos el dato por la variable dato
dato=Serial.read();
// Serial.println(dato);
switch (dato) {
case 49:
// escribo 1 en el PC y lo envio
//Apagamos el led 13
digitalWrite(13,LOW);
Serial.println("Arduino: He apagado el led 13");
break;
case 48:
// escribo 0 en el PC y lo envio al arduino
//Encendemos el led 13
digitalWrite(13,HIGH);
Serial.println("Arduino: He encendido el led 13");
break;
}
}
}


Por otro lado esta el programa en gambas (basado en el ejemplo que trae gambas sobre el puerto serie):

Lo que hace el programa es configurar el puerto serie, y esperar al que el usuario pulse el boton de "Abrir" que se encarga de abrir el puerto y dejar las propiedade del boton de icono led verde activo, para que podamos pulsar sobre el.

Cuando pulsas sobre el boton, manda un mensaje al arduino, el mensaje varia si esta encendido o apagado (variable "encendido")


' Gambas class file
PUBLIC encendido AS Boolean

PUBLIC SUB Form_Close()
IF Sport.Status = Net.Active THEN CLOSE Sport
END

PUBLIC SUB Button1_Click()
IF Sport.Status = Net.Active THEN
CLOSE Sport
Button1.Text = "Abrir"
Label3.Enabled = FALSE
ToolButtonLed.enabled = FALSE
ELSE
' Line parameters
Sport.PortName = TxtPort.Text
Sport.Speed = CmbSpeed.Text
Sport.Parity = CmbParity.Index
Sport.DataBits = CmbData.Text
Sport.StopBits = CmbStop.Text
' keep DTR on
Sport.FlowControl = ComboBox1.Index
Sport.Open()

TextArea1.Text = "Port Abierto : " & Sport.PortName & " Settings : " &
Sport.Speed & "," & Sport.Parity & "," & Sport.DataBits & "," &
Sport.StopBits & Chr(13) & Chr(10)
Button1.Text = "Cerrar"
Label3.Enabled = TRUE
ToolButtonLed.enabled = TRUE
END IF
END

PUBLIC SUB SPort_Read()
DIM s AS String
READ #Sport, s, Lof(Sport)
TextArea1.Text = TextArea1.Text & s
END


PUBLIC SUB ComboBox1_Click()
Sport.FlowControl = ComboBox1.Index
END


PUBLIC SUB Form_Open()
ME.center
cmbSpeed.Index = cmbSpeed.Find("9600")
END


PUBLIC SUB ToolButtonLed_Click()
IF encendido = FALSE THEN
TRY PRINT #Sport, "0" 'enciendo led
IF ERROR THEN Message.Error("tienes que abrir el puerto")
ToolButtonLed.Picture = Picture["ledVerdeEncendido.jpg"]
encendido = TRUE
ELSE
PRINT #Sport, "1" 'apago led
ToolButtonLed.Picture = Picture["ledVerdeApagado.jpg"]
encendido = FALSE
ENDIF
END

Os dejo un video para que veais como funciona:




Codigo fuentes:
Arduino: puertoSerieEncendidoYapagado.pde
Gambas: SerialPort-Arduino 0.0.18.tar.gz

fuentes:
 Me he basado en las explicaciones de este blog:
http://www.craswer.net/2011/02/arduino-y-puerto-serie/
Y en el ejemplo que trae gambas2 sobre el puerto serie.

Nota: 22/01/2012
Lo que esta leyendo el arduino es la "salida" que genera la aplicación Gambas.

Gambas le envia un caracter "1" o "0" (no el número el 1 o 0).

El caracter "0" corresponde en la tabla ASCII al 48,
Y el caracter "1" corresponde en la tabal ASCII al 49

Por eso el tema de usar el  48 y el 49 en el código de Arduino.

Nota:
Una entrada interesante sobre lectura de entras analogicas:
http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDEQFjAA&url=http%3A%2F%2Fplatea.pntic.mec.es%2F~mhidalgo%2Fdocumentos%2F04_2011_EntradasAnalogicas.pdf&ei=duguT6rcHNOBhQfts4WCCw&usg=AFQjCNH2BooTBKKIlgGrNE4GFWNj9cuFAw&sig2=3jowRw23996gFHStD4_nzw

Otra entrada interesante:
http://recursostic.educacion.es/observatorio/web/es/equipamiento-tecnologico/didactica-de-la-tecnologia/944-monografico-arduinoblocks?showall=1

Y otro..
http://www.arduinoacademy.com/

Notas: 
03/05/2012
Podeis ver un ejemplo más complejo en el siguiente enlace:
http://jsbsan.blogspot.com.es/2012/05/arduino-y-gambas3-lectura-y-graficos-de.html

19/05/2012
Podeis ver otro ejemplo (con dos ServoMotores) en este enlace:
http://jsbsan.blogspot.com.es/2012/05/gambas-y-arduino-moviendo-dos.html

27/01/2014: Solución Error: Cannot open serial port (5)


Tengo un arduino más moderno (tipo leonardo), y cuando ejecuto el programa me da el siguiente error Cannot open serial port(5). 
Esto es debido a  que tiene ya un verdadero puerto USB y ahora nombre del puerto de conexión se llama: /dev/ttyACM0 (en vez de /dev/ttyUSB0)

Con este cambio, en los datos del programa que hay que poner inicialmente,  ya se  ejecuta correctamente con este tipo de arduino:

Nota:
en el entorno del Ide de Arduino, cuando elegimos el tipo Leonardo, el puerto serie se denomina tambien  /dev/ttyACM0



Saludos