lunes, 30 de enero de 2017

Una Clase para controlarlos a todos...bueeeno, solo a unos pocos. (Cinemática II)

Lo prometido es deuda y aquí estamos de nuevo con otra entrada a cerca de la dichosa Cinemática, esta vez para contaros que he creado una clase en Python que nos simplifica y nos hace más fácil la tarea de controlar un brazo robótico (vaya, para no querer hacer un brazo robótico, me estoy poniendo un poco pesadito con el tema).



viernes, 20 de enero de 2017

Arduino Plug&Play en Python


Hoy toca una entrada muy breve, estoy preparando otra más extensa en la que os contaré como va mi aventura de experimentación y frikeo con la Cinemática, todo en aras de aprender lo máximo posible para abordar mi siguiente proyecto.

El caso es sigo trasteando con software, pero ahora estoy en Python, me encanta Python, sirve para casi todo, si no lo conoces, te recomiendo seguir algún curso por la red, te será muy útil, de verdad.



Bueno, lo dicho, ando trasteando con Python y Arduino. No es una idea nueva, ya lo utilice la comunicación Python-Arduino en mi entrada del "Siguecaras" (Controlamos las Máquinas Aplicando la Visión Artificial (II)) Y hay muchos ejemplos en la red, entre ellas esta del Maestro Obijuan u esta otra de Robologs

Si os fijáis, en todas ellas, incluida la mía, se dice que 










O sea, que cada vez que queremos ejecutar el programa, debemos asegurarnos que el puerto que hemos puesto es el correcto. Pero ¿qué pasa cuando ejecutamos en máquinas distintas con SO distintos? o ¿si utilizamos un modelo de placa de Arduino diferente? pues que tendremos cada vez que revisar como se llama el nombre del puerto al que se ha conectado la placa y modificar el programa, un poco pesado la verdad.

Bien pues lo que he hecho es hacer una función que hace que nos olvidemos de comprobar el nombre de puerto, copiarlo, modificar el programa, etc. cada vez, sino que enchufamos nuestra placa al ordenador, y ya estamos listos para funcionar: Arduino Plug&Play.

Yo la he probado en Mac y en Windows 7 y con placas Arduino Uno (Freaduino Uno) y Nano y hasta ahora no me ha fallado nunca.

La función en sí es esta:

 
def getSPArduino():
    Puertos = list(serial.tools.list_ports.comports())

    bEncontrado = False
    for i in Puertos:
        if ('USB' in i[1]) or ('Arduino' in i[1]):
            try:
                PUERTO = i[0]
                VELOCIDAD = '9600' \
                            ''
                sp = serial.Serial(PUERTO, VELOCIDAD)
                print('Conectado!!!')
                sp.close()
                bEncontrado = True
                Arduino = i[0]
            except:
                pass

    if bEncontrado:
        return Arduino
    else:
        return 'xxx' 

y lo que hace es:
  1. Obtiene la lista de puertos serie 
  2. Recorre la lista en busca de alguno que su descripción contenga 'USB' o 'Arduino' 
  3. Si encuentra alguno, intenta conectarse a él 
  4. Si consigue conectarse, cierra la conexión y guarda el nombre de ese puerto y marca que ha encontrado alguno. 
  5. Al finalizar de recorrer la lista, si tiene activo el 'swich' de haber encontrado alguno, nos devuelve el nombre de éste, si no, devuelve 'xxx'
El uso es sencillo:

Como siempre, dejo la librería en mi Github, junto al NoteBook de la imagen anterior. Veréis en la librería otras dos funciones:
  • mapeo(val, minIn, maxIn, minOut, maxOut): En Arduino tenemos la función map() pero en Python no existe esa función, bueno, si existe, pero no hace la de Arduino y no conozco otra que sea igual, así que, la me la he creado.
  • mapServo(val): lo que hace es que le pasamos un valor entre 0 y 180 y nos lo devuelve en formato -90 - 90
Como os dije, esta es una entrada corta. Os dejo que tengo que preparar la siguiente entrada que esa si será mas larga.