Archivo de la etiqueta: Arduino

Leer el puerto serie de Arduino con Python y PySerial

[singlepic id=20 w=320 h=240 float=right]Desde hace ya un tiempo he hoy buenos comentarios sobre Python y lo «fácil» que es programar con él, su potabilidad entre sistemas, etc. Me he puesto ha ello, y la verdad es que es muy fácil programar con él, después de un rato, se le coge el tranquillo a esa forma tan peculiar de escribir el código que tiene, solo utilizando tabulación, sin puntos y comas, llaves o cualquier otra forma de indicar el inicio y el fin de las lineas,  a la declaración de las variables, mejor dicho a la no declaración, la formar de trabajar con las funciones, etc. En general es un lenguaje muy fácil de trabajar y encima puedes hacer verdaderas locuras con el. Me ha recordado mucho al Basic que aprendí ya hace muchas lunas.

Para empezar, que mejor que trabajar con Arduino. Lo primero que he hecho es leer del puerto serie la información que escribe el Arduino.

Para el Arduino solo le he metido un código muy simple, genera un numero aleatorio, de -100 a 100,  y lo escribe en el puerto serie.

Codigo para Arduino

int x = 0;    // variable

void setup() {
  Serial.begin(9600);      // abre el puerto serie a 9600 bps:    
}

void loop() {

  Serial.println(random(-100, 100)); // Escribe en el puerto un numero aleatorio de -100 a 100
  delay(2000);
}

Y en Python lo que he hecho es aprovechar la librería PySerial que hay para Python para leer el puerto y leer los datos que escribe el Arduino.  Para instalar la librería PySerial es muy fácil, solo tenemos que seguir los pasos que hay en la propia pagina de PySerial.

El código en Python es muy simple, este mismo código en Java, me llevo bastante tiempo pelearme con la librería RxTx, en cambio en Python es tan sencillo como escribir el siguiente código.

Código Pytho

#!/usr/bin/python

# Importamos la libreira de PySerial
import serial

# Abrimos el puerto del arduino a 9600
PuertoSerie = serial.Serial('/dev/ttyACM0', 9600)
# Creamos un buble sin fin
while True:
  # leemos hasta que encontarmos el final de linea
  sArduino = PuertoSerie.readline()
  # Mostramos el valor leido y eliminamos el salto de linea del final
  print "Valor Arduino: " + sArduino.rstrip('\n')

Después de este código tan simple, ya tenemos un programa que nos lee los datos del puerto serie y lo muestra en pantalla. Esto con cualquier otro lenguaje te lleva un buen rato. Esto no me ha llevado mas de media hora de buscar por internet como se programa en Python y como funciona la libreria PySerial.

Que opinas de ello???

Problemas con el puerto de Arduino en Ubuntu (Linux)

[singlepic id=1 w=320 h=240 float=right]En un sistema linux, no todos los usuario pueden tender acceso a poder manejar los puertos. Solo los usuarios que estén en el grupo «dialout» tiene permiso para manejar los puertos. Lo normal es que nuestro usuario no este dentro de ese grupo, por lo que tendremos problemas para poder acceder al puerto que crea el arduino. Para solucionar este problema solo tendremos que añadir nuestro usuario al grupo «dialout» de la siguiente manera.

sudo usermod -a -G dialout <NombreDeUsuario>

Nos pedirá la contraseña de root. y con esto, nuestro usuario ya sera miembro del grupo «dialout».

Ya solo nos queda cerrar la sesión para que los cambios efectuados tenga efecto y podamos acceder al puerto del Arduino desde nuestro usuario.

Obtener la temperatura con Arduino y un termistor

En este proyecto vamos ha ver como podemos obtener la temperatura mediante la utilización de un termistor. Lo primero, que es un termistor, esta es una simple resistencia que varia según la temperatura que tenga, con el valor devuelto por la resistencia y una pequeña formula podemos calcular que temperatura hace.

Esquema del circuito:

El esquema de este circuito es muy sencillo, esta basado en un simple divisor de tensión, en este caso quedaría de la siguiente manera.

[singlepic id=3 w=320 h=240 float=center]

Este esquema es el utilizado en la mayoría de sensores, simplemente cambiando el termistor, por un lcr, por ejemplo, tendríamos un sensor para detectar la luminosidad.

En mi caso el termistor no es de 10 k, como se muestra en el esquema, sino que es de 100k (NJ28 NTC Thermistor,2.8mm,100K,1%), esto no varia mucho lo fundamental del sistema, ya que en el código para el arduino , le diremos tanto el valor de resistencia del termistor, como el valor de la resistencia secundaria.

Esquema de la conexión en al arduino:

[singlepic id=10 w=320 h=240 float=center]

Para calcular la temperatura necesitamos saber el valor beta de nuestro termistor, normalmente, este valor lo suele facilitar el fabricante de la resistencia, pero si el fabricante no nos lo da o no sabemos el fabricante, lo podremos calcular sabiendo la temperatura a la que esta el termistor, apuntamos el valor de resistencia ha esa temperatura y la temperatura en grados Kelvin, después elevamos la temperatura y volvemos a puntar la resistencia y la temperatura. Cuanto mas diferencia de temperatura mas fiable sera el calculo.

Por ejemplo, ponemos el termistor sobre un hielo, con otro termómetro miramos la temperatura, por ejemplo T1 = 3º + 273,15 y resistencia R1 = 34500 Ohm. Luego lo metemos el agua caliente y hacemos la misma comprobación T2 = 80º + 273,15 y R2 = 134 Ohm. Con esos datos aplicamos la siguiente formula:

beta=(log(RT2/RT1))/((1/T2)-(1/T1))

Quedando de la siguiente manera:

beta = (log(143 / 345000)) / ((1/353,15)-(1 / 276,15))

beta = 4283,9970482988 = 4284

Código para el Arduino.

#include <stdio.h>
#include <math.h>

int analogPin=0;     // Pin donde esta conectado el divisor de tension en el Arduino

float Vin=5.0;       // [V]       Voltage de entrada en el divisor de tension
float Raux=10000;    // [ohm]     Valor de la resistencia secundaria del divisor de tension
float R0=100000;     // [ohm]     Valor de resistencia nominal del termistor (NTC) a 25ºC
float T0=298.15;     // [K] (25ºC)

float Vout=0.0;      // [V]        Voltage given by the Voltage-Divider
float Rout=0.0;      // [ohm]      Resistencia actual del Termistor (NTC)

// Valores para calcular el valor Beta, si no lo sabemos
// float T1=273;     // [K]        Temperatura del 1º punto del test (en grados Kelvin)
// float T2=373;     // [K]        Temperatura del 2º punto del test (en grados Kelvin)
// float RT1=19750;  // [ohms]     Resistencia a 273K grados Kelvin (0ºC)
// float RT2=2150;   // [ohms]     Resistencia a 373K grados Kelvin (100ºC)

float beta=0.0;      // [K]        Parametro Beta
float Rinf=0.0;      // [ohm]      Parametros Rinf
float TempK=0.0;     // [K]        Temperatura de salida en grados Kelvin
float TempC=0.0;     // [ºC]       Temperatura de salida en grados Celsius

int iCont;            // Contador de ciclos, par el calculo de la temperatura media
float cTemp1;         // Variable temporal para acumular las temperaturas leidas 

void setup() {
  // Configuramos el puerto Serie
  Serial.begin(9600);

  // Configuramos el pin del Arduino en entrada
  pinMode(analogPin, INPUT);

  // Parametros generales para el calculo
  // Formula para calcular el valor beta si no disponemos de el
  // beta=(log(RT1/RT2))/((1/T1)-(1/T2));
  // Valor beta, los fabricantes suelen disponer ya de este valor, 
  // mirar en la tabla de carateristicas del termistor
  beta = 4380;
  Rinf=R0*exp(-beta/T0);
}

void loop()
{
  cTemp1=0;  
  for (iCont = 1; iCont <= 500; iCont ++)
  {
    // Cálculo del valor de la resistencia termistor (NTC) actual (a través de Vout)
    Vout=Vin*((float)(analogRead(analogPin))/1024.0); 
    Rout=(Raux*Vout/(Vin-Vout));

    // Calculo de la temperatura en grados Kelvin
    TempK=(beta/log(Rout/Rinf));
    // Calculo de la temperatura en grados Celsius
    TempC=TempK-273.15; 
    // Almacenamos la temperatura (grados Celsuis) actual para despues obtener la media
    cTemp1 = cTemp1 + TempC; 
    // Hacemos una pausa de 10 milisegundos    
    delay(10);
  }

  // Calculamos la temperatura media
  TempC = cTemp1/iCont;

  // Mostramos la temperatura media en grados Celsius
  Serial.println(TempC);

  // Hacemos una pausda de 1 seg.
  delay(1000);
}

Y con esto ya tendríamos un termómetro digital con nuestro Arduino.

Mi primer contacto con Arduino

Ya me ha llegado mi placa de Arduino, me he decido por el modelo mas normal, el Arduino UNO, en la versión SMD, Entre las diferencias que he podido observar con respecto a la otra versión del arduino UNO rev. 3, es que esta, el procesador es la versión de soldadura en superficie, mucho mas pequeño en tamaño que el que viene en la versión normal, Arduino UNO Rev. 3, y la disposición de alguno componentes, como puede ser el botón del reset, pero ha efectos prácticos,  son iguales.

Imagen del Arduino UNO versión SMD[singlepic id=11 w=320 h=240 float=center]

Imagen del Arduino UNO versión Rev. 3[singlepic id=12 w=320 h=240 float=center]

Para tener un primer contacto con el, he probado el típico «Hola mundo» pero para un arduino, es decir, encender y apagar un led. Hay varias formas de hacer esta prueba.

1º.- Encender y apagar el led que trae la propia placa, este led esta conectado al pin 13, solo tendremos que hacer que nuestro programa mande la señal necesaria por ese pin y el led se encenderá o se apagara.

2º.- Instalar nuestro propio led al pin 13, solo tendremos que insertar la patilla del positivo (ánodo, la patilla más larga) en el pin 13 y la patilla del negativo (catado, la patilla más corta) en el pin de masa, el pin a la izquierda del pin 13, no hace falta poner la resistencia que se necesita para hacer funcionar cualquier led normalmente, este pin aprovecha la resistencia que tiene para el led que viene en la placa para hacerlo funcionar. Y ya estaría listo, ejecutamos el mismo programa que en el caso anterior y ya lo tendríamos funcionando. En este caso se encenderían los 2 leds, tanto el que acabamos de instalar nosotros, como el que trae la propia placa.

3º.- Instalar nuestro propio led en un pin que no sea el 13, en este caso la única diferencia que tenemos con respecto a los casos anteriores, es que tendremos que instalar junto al led la resistencia necesaria, en este caso, una resistencia de 220 oh. Cambiamos en nuestro programa el pin 13 por el pin donde tenemos conectado nuestro led y a funcionar.

Código para encender y apagar un led  cada 1 seg con el Arduino.

/* Blinking LED
 * ------------
 *
 * turns on and off a light emitting diode(LED) connected to a digital  
 * pin, in intervals of 2 seconds. Ideally we use pin 13 on the Arduino 
 * board because it has a resistor attached to it, needing only an LED

 *
 * Created 1 June 2005
 * copyleft 2005 DojoDave <http://www.0j0.org>
 * http://arduino.berlios.de
 *
 * based on an orginal by H. Barragan for the Wiring i/o board
 */

int ledPin = 13;                 // LED conectado al pin digital 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // Establecer el pin a modo salida
}

void loop()
{
                                // Este ciclo se repetira hasta que se apage el Arduino
  digitalWrite(ledPin, HIGH);   // Encender el LED
  delay(1000);                  // Esperar un segundo
  digitalWrite(ledPin, LOW);    // Apagar el LED
  delay(1000);                  // Esperar un segundo
}

Este programa esta en el menú de ejemplos del software del Arduino.

Y de momento es todo. Espero que te haya servido de ayuda.

Arduino, ¿que es y para que vale esa cosa?

Desde hace mucho tiempo había oído hablar de este aparato, que si era hardware de código libre, que si era muy fácil de manejar, que te permitía controlar multitud de componentes electrónicos  etc.  Como siempre me ha gustado manejar cosas mediante el ordenador, me decidí a probarlo.

Pero, ¿que es Arduino?

[singlepic id=12 w=320 h=240 float=right]Según la Wikipedia «Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares». Es decir, es una placa que nos permite conectar determinados componentes electrónicos, procesar los datos que nos dan y realizar determinadas tareas con esa información, posee entradas y salidas tanto analógicas como digitales. En el caso del Arduino no tenemos por que tenerlo siempre conectado al ordenador, dispone una entrada de corriente propia que lo hace autónomo, ademas de tener su propia memoria donde poder almacenar tanto la información que va generando, como el programa para manejar esa información. Y si le añadimos algún modulo extra, la información nos la puede mandar al ordenador a través del Internet. Pero lo primero que me llamo la atención, al buscar más información de este aparato, fue su precio, en la pagina de Rs-Online, por ejemplo, se puede comprar uno por unos 21€, o en la pagina de BricoGeek por 22€,  o en la pagina de Cookig Hacks, el mas caro de las tres, pero con una amplia gama de accesorios disponibles, por 24€. Por ese precio no hay que pensárselo demasiado para querer probarlo. La otra cosa que me llamo la atención era la cantidad de módulos y accesorios que hay disponibles. El modulo que mas me impresiono fue  el de Ethernet, con este modulo podemos conectar el arduino directamente a la red mediante un clave de red normal, y poder ver la información a través de la red, al conectar el ardunio con este modulo, este nos instala un servidor web donde podremos ver toda la información en una pagina web, también podemos personalizar estas paginas, para poder ver la información como nosotros queramos. Otros módulos que hay disponibles nos permite conectar un módem GPRS, un módem WIFI, bluetooth, etc.

¿Que características tiene la versión básica de Arduino?

[singlepic id=13 w=320 h=240 float=right]La versión que he decido comprar es la que podemos decir que es la basica, el Ardunio UNO, en mi casa la versión rev.3. Este viene con un procesador Atmega328, tiene 14 entradas/salida, de las que 6 podemos utilizar como salida PWM, no se muy bien lo que son este tipo de salidas, pero por lo visto se pueden manejar motores de paso a paso con ellas, si no estoy equivocado, tengo que buscar mas información sobre ello. Cambien tiene 6 entradas analógicas  un oscilador de 16 Mhz, conexión al ordenador por USB, pulsador de reset y un conectar para poder alimentarlo se necesidad de estar conectado al ordenador y por si los componentes instalados en el consumen mas de lo que nos ofrece el conector USB. Ofrece también conectores para poder alimentar la electrónica que añadamos de 5 y 3.3 voltios.

¿Que podemos hacer con el Arduino?

[singlepic id=15 w=320 h=240 float=right]No hace falta buscar mucho para ver la amplia gama de posibilidades que nos ofrece este aparato, desde el aprendizaje de electrónica o robótica, hay muchos centros de enseñanza que lo utilizan para dar clases con ellos, hasta realizar todo un complejo sistema de domótica que pueda controlar cualquier cosa de nuestra casa, oficina, etc. La aplicación que mas me ha impresionado a sido una impresora que imprime en 3D, eso demuestra que el limite que tiene el arduino es la imaginación que la persona que trabaja con el tiene.

Así, viendo lo versatilidad que ofrece, la amplia información que hay disponible sobre él y el precio que tiene. Tendremos que hacernos con uno.

¿Que te parece el aparato?