Usar un puerto USB como puerto serie TTL
Es infrecuente encontrar en un ordenador de escritorio moderno puertos serie y de existir tampoco podrían usarse directamente con Arduino, ya que trabaja con niveles TTL, por lo que habría que adaptar los que provee el puerto serie EIA232 o RS232, el más usado en un ordenador personal.
Los puertos USB sí que están muy presentes en los ordenadores modernos y la mayoría de las placas Arduino disponen de un conector USB que se usa como un puerto serie (coloquialmente llamado TTL por los niveles de voltaje comentados arriba) Este puerto serie, desde un punto de vista funcional, está clonado en un par de pines de la placa (TX/RX) Además, algunas placas como Arduino Mega, o Arduino Due, disponen de más puertos serie UART aparte del correspondiente al conector USB.
Para conectar con el puerto USB del ordenador podrá usarse directamente el conector USB de la placa Arduino o un conversor TTL en el ordenador, que conectará a los pines TX/RX de la placa Arduino, como alguno de los de la imagen de abajo.
Encontrar el puerto serie en uso
Para poder acceder a un puerto serie del ordenador desde Python es necesario conocer el identificador que corresponde al que conecta con Arduino.
La librería pySerial incluye algunas utilidades que simplifican el trabajo con los puertos serie. Una de ellas muestra una lista de los puertos que hay disponibles en el ordenador; para lanzar esta utilidad y ver la lista de puertos se utiliza la orden desde la consola.
Como puede verse en los anteriores listados, si existen varios puertos serie, el problema puede ser identificar cada uno de ellos. De darse el caso, dependiendo de la plataforma, hay algunas técnicas que pueden ser de ayuda.
En el caso de Linux hay varios recursos. Por ejemplo, se puede conectar el adaptador USB a serie TTL y consultar los mensajes con Arduino Leonardo con la información proporcionada por sobre el puerto USB-serie al que se conecta, , en el ejemplo.
para buscar el dispositivo por su nombre o ver qué se ha conectado en último lugar. En la siguiente se muestra un ejemplo de cómo localizar una placa
En el caso de Windows, se puede explorar, en el administrador de dispositivos, la lista de puertos COM y LPT mostrará el nombre del dispositivo (la placa Arduino Leonardo del ejemplo) y el nombre del puerto al que se conecta (COM3, en este caso)
En el caso del sistema operativo OS X, lo más sencillo es usar la orden
desde la consola (shell) y tratar de reconocer el dispositivo USB buscado, en el ejemplo de abajo.
Configurar el puerto serie en Python
La librería pySerial permite acceder a un puerto serie por su nombre o por su número. La segunda forma es independiente de la plataforma: en todos los sistemas operativos el primer puerto serie será el 0, el segundo el 1, el tercero el 2… pero, como se ha visto en los apartados anteriores, en Linux puede llamarse , en Windows y en OS X algo como , por lo que para realizar una aplicación multiplataforma, en la que se deba elegir el puerto a cada uso, habrá de contar con esas diferencias.
Según se describe en la documentación de la API de la librería PySerial, para configurar el puerto serie se puede elegir entre hacerlo al crearlo pasando directamente los datos de configuración o crearlo y configurarlo más adelante.
Si se configura directamente al crearlo no será necesario usar la función
para abrirlo antes de empezar a enviar o recibir datos por el puerto serie recién asignado.El constructor de la clase espera los siguientes parámetros opcionales.
- Nombre o número de puerto al que se conecta.
- Velocidad expresada en baudios.
- Número de nits de datos. Pueden usarse las constantes
Si el objeto para acceder a las comunicaciones serie se crea con algo como
es decir, sin parámetros de configuración, posteriormente se podrá configurar asignándole la configuración a la instancia que se ha creado. Para asignar el número de puerto se usa , para asignar la velocidad (en baudios) algo como , para el tiempo de espera y así sucesivamente.La configuración por defecto corresponde a una velocidad de 9600 baudios, 8 bits de datos, sin paridad y con un bit de parada (algo, por cierto, bastante común) que suele expresarse como 9600,8,N,1 o 9600_8N1
Si se cambia el valor de
la conexión se asocia a ese puerto de comunicaciones serie de forma que, si estubiera abierta se cierra y se vuelve a establecer con el nuevo valor.En el siguiente código de ejemplo en Python se han resaltado las dos líneas (2 y 3) que establecen el puerto serie y directamente su configuración.
1 2 3 4 5 6 7 |
# Acceso a un puerto serie desde Python con PySerial import serial puerto_serie=serial.Serial(0,9600,timeout=3) # Primer puerto serie, a 9600 baudios, con 3 segundos de espera de timeout # No es necesario abrir el puerto serie con open() si se configura al asignarlo puerto_serie.write("Saludos desde Python") puerto_serie.close() print "Conexión terminada" |
Configurar el puerto serie en Arduino
En la parte de Arduino también habrá que elegir el puerto serie con el que se trabaja, si es que hay varios disponibles; en este caso es más sencillo ya que existe un objeto Serial para cada uno de los disponibles. En una placa Arduino Uno, por ejemplo, sólo existe el objeto Serial (aunque siempre pueden inplementarse por software comunicaciones serie usando GPIO) mientras que en una placa Arduino Mega puede usarse tanto el objeto Serial (que corresponde con el puerto USB) como Serial1, Serial2 y Serial3 a los que se accedes por los pines correspondientes del a placa.
Para configurar el puerto serie en Arduino basta con llamar a la función begin() del objeto Serial que se vaya a utilizar, indicando la velocidad en baudios y una palabra de configuración que indica los bits de datos, la paridad y los bits de parada en el formato siendo fijo el texto «SERIAL_» y correspondiendo A al número de bits de datos, B a la paridad (que puede ser N, E u O para referirse a sin paridad, par o impar respectivamente) y C a los bits de parada. La configuración más habitual es (8 bits de datos sin paridad y un bit de parada y es la que se usará si se omite este parámetro.
Como es parte de la configuración, la llamada a begin() para inicializar las comunicaciones suele incluirse en la función setup() del programa para Arduino, por ejemplo de esta forma.
1 2 3 4 5 6 7 8 9 |
void setup() { Serial.begin(9600); //Como no se indica configuración se usa SERIAL_8N1 } void loop() { //Nada dentro del bucle principal,s sólo un ejemplo de configuración } |
Jean Carlo
Buenas, gracias por la informacion amigo.
Una consulta, no sabes como se puede, desde linux, colocarle un mismo /dev/ttyUSB0 al mismo arduino.
Por ejemplo, en el caso que tenga 3 arduinos diferentes, crear una regla para que le asigne siempre el mismo puerto a «x» arduino…
Asi que si conecto los arduinos , sin importar el orden , sabre cual puerto utiliza cada uno.
Es un problema para mi ahorita, porque debo verificarlo siempre, y para un programa desde python debo colocar el puerto en el programa si este se modifico.
En este link sale algo de lo que necesito, pero no me logra funcionar , agradezco si sabes algo al respecto,
http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/
Saludos,
Víctor Ventura
Hola, Jean Carlo.
¡Qué interesante pregunta! En el enlace que indicas explica bien cómo hacerlo (o por lo menos yo también lo hago así)
He escrito una entrada en la que detallo cómo asignar un nombre fijo al puerto serie de una placa Arduino. Creo que puede servirte, en cualquier caso, lo resumo a continuación.
Asignar un nombre fijo al puerto serie de un dispositivo.
Como va a mostrar mucha información, puedes discriminarla con udevadm info -a -n /dev/ttyACM0 | grep ‘ATTRS{serial}’ para el número de serie, con udevadm info -a -n /dev/ttyACM0 | grep ‘ATTRS{idProduct}’ para el identificador del producto…
Suponiendo, claro, que el identificador del vendedor de la placa es 1234 y el identificador del producto es 4567 (esto puedes verlo, como te decía, con dmesg, con lsusb, udevadm…)
Como es lógico, debes cambiar el grupo dialout por el que sea que tenga los permisos correspondientes y al que tu usuario pertenezca.
La «magia» consiste en que crea un enlace «carmela» o «pilar» dentro de /dev al puerto real correspondiente (por ejemplo /dev/ttyACM14) del que ya no te tienes que preocupar.
Espero haberte ayudado.
¡Muchas gracias por tu aportación. Sigue visitando nuestro blog. Te esperamos pronto!
Bruno
Victor que interesante articulo, la pregunta siguiente, trate de hacer un prorama en python manejando el pyserial pero me da el siguiente error, y la verdad no se a que se deba.
>>> import serial
Traceback (most recent call last):
File «», line 1, in
import serial
File «serial.py», line 6
SyntaxError: Non-ASCII character ‘\xf3’ in file serial.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
>>>
Alguna vez te paso esto y si es asi como le diste solución.
Gracias
Bruno
Víctor Ventura
Hola, Bruno.
El error que dices no me sale pero, eso de que diga «Non-ASCII» me suena a un conflicto entre codificaciones ¿Usas UTF-8? ¿Al principio del documento tiene la línea
# coding: utf-8
(o la línea# -*- coding: utf_8 -*-
)? Puede que ese sea el problema.Espero que te ayude. Por favor, cuéntanos si eso lo resuelve o qué solución le das finalmente. Gracias.
Daniel
Buenas Victor, gracias por la información.
Una consulta, si conectas varios arduinos a una raspberry usando python, es posible recibir los dats sin que se pisen y solo que haga caso al primer arduino conectado? My idea es conectar un segundo arduino y que el python ya lo reconozca sin tocar el codigo. Coloque en un array los nombres del arduino, pero solo recibo datos del primero que estaba conectado, y del segundo no, hasta que desconecte el primero.
Víctor Ventura
Hola, Daniel.
Sí, es posible. Precisamente, yo lo haría más o menos como lo describes: asignando un nombre fijo al puerto serie USB de cada Arduino y recibiendo datos en la Raspberry Pi desde la placa Arduino que corresponda según su nombre de puerto. Si quieres recorrer todos los puertos serie asignados, usar un vector con los nombres parece buena idea.
Gracias por visitar polaridad.es y suerte con tu proyecto.
Meta
Hola:
Aquí que puedes ver un ejemplo de controlar un Led hecho en Delphi y Arduino.
https://www.slideshare.net/Metaconta2/arduino-delphi-tokio-102-y-puerto-serie-v100
Como puedes ver, tiene dos botones, uno para encender un Led y el otro para apagargo. También Arduino envía datos a Delphi para poder ver el estado del Led.
¿Puedes hacer un tutorial paso a paso de esa posibilidad?
Un cordial saludo.
VICTOR HUGO MIRANDA TRUJILLO
Hola Víctor,
Una pregunta lo que pasa es que estoy creando un sensor de movimiento conectado a un arduino y que de ahí pase al programa de pynthon para bajar la información a mi base de datos con toda la información de cuando tuvo su primer movimiento y cuanto duro encendido en la base de datos.
Es que el sensor de movimiento debe encender una luz cada ves que presenta algún movimiento y que toda la información se guarde en una base de datos utilizando pynthon.