PyBot
Butiá puede utilizarse de muchas formas, como un servicio consumible mediante la red como es el caso de pybot server o utilizando directamente la biblioteca usb4butia.
Usando Pybot localmente
Cuando se va a ejecutar Pybot y quién lo usa en la misma máquina, no es recomendable tener una arquitectura cliente-servidor. Para ese caso se dispone de una alternativa: usar directamente el módulo usb4butia dentro de Pybot.
Si no estamos en la carpeta donde está la librería PyBot podemos usar este truco para poder importar Pybot sin problemas desde cualquier lado:
import sys sys.path.insert(0, '/home/olpc/Activities/TurtleBots.activity/plugins/butia')
Esa es la ruta por defecto cuando el .XO se instala en Sugar, puede variar en otras computadoras. El paquete .deb instala TurtleBots en '/usr/share/sugar/activities' por lo que la ruta debe ser:
sys.path.insert(0, '/usr/share/sugar/activities/TurtleBots.activity/plugins/butia')
Importando el módulo:
from pybot import usb4butia
Instanciando la clase:
robot = usb4butia.USB4Butia()
A partir de este momento tenemos las mismas llamadas que en Pybot client. Por ejemplo, para obtener la versión del Firmware:
version = robot.getFirmwareVersion()
El módulo USB4Butia nos provee algunas propiedades "privadas" que pueden resultar útiles:
robot._bb # Lista de placas detectadas robot._drivers_loaded # Diccionario de drivers robot._debug # Bandera de debug, por defecto es False robot._get_all_drivers() # Función para cargar los drivers robot._get_driver() # Función para obtener un driver específico robot._hotplug # Lista de módulos hotplug robot._modules # Lista de módulos robot._openables # Lista de módoulos "openables"
Usando Pybot server
Levantamos el servidor desde una consola (debemos estar dentro de la carpeta pybot):
python pybot_server.py DEBUG
En este caso con la bandera de DEBUG para ver la salida del lado del servidor.
Luego nos encargamos del cliente:
from pybot impoty pybot_client
Instanciamos el cliente:
robot = pybot_client.robot()
A partir de ahora tenemos las mismas funciones que en la versión local, por ejemplo:
version = robot.getFirmwareVersion()
Funciones USB4Butiá - Pybot Client
Funciones útiles:
robot.close() # cierra todas las placas instanciadas robot.find_butias() # busca placas conectadas y las instancia robot.getBatteryCharge() # devuelve el nivel de carga de la batería (si no hay motores-> -1) robot.getFirmwareVersion() # devuelve la versión del firmware dentro del PIC robot.getVersion() # devuelve la versión del módulo butiá (arduino: 20, usb4butia:22) robot.getButiaCount() # devuelve la cantidad de placas conectadas robot.getModulesList() # devuelve la lista de dispositivos conectados (en todas las placas) robot.isPresent(device) # chequea si un dispositivo en particular está conectado robot.loopBack(data) # envía una string 'data' a la placa y devuelve lo mismo robot.reconnect() # no hace nada en usb4butia / en el cliente hace un reconnect del socket robot.refresh() # actualiza la lista de placas conectadas robot.callModule(modulename, board_number, number, function, params) #llamada a un módulo
Sensores
robot.getButton(port) # obtiene el valor del sensor botón conectado en el puerto port robot.getDistance(port) # obtiene el valor del sensor de distancia conectado en el puerto port robot.getGray(port) # obtiene el valor del sensor de grises conectado en el puerto port robot.getLight(port) # obtiene el valor del sensor de luz conectado en el puerto port robot.getResistance(port) # obtiene el valor del sensor de resistencia conectado en el puerto port robot.getTemperature(port) # obtiene el valor del sensor temperatura conectado en el puerto port robot.getVoltage(port) # obtiene el valor del sensor volyaje conectado en el puerto port robot.setLed(port, on) # si on es 1, prende el LED, si es 0, apaga el LED conectado en el puerto port
Hack pins
robot.modeHack(pin, mode) # establece el modo del pin: si mode es 0 es entrada y 1 salida robot.setHack(pin, value) # establece el valor del pin: pin en GND si es 0 y en +5v si es 1 robot.getHack(pin) # lee el valor del pin: pin
Motores
robot.set2MotorSpeed(leftSense, leftSpeed, rightSense, rightSpeed) #sense is 0 or 1, speed is between 0 and 1023 robot.setMotorSpeed(idMotor, sense, speed) #idMotor 0 for left motor, 1 for right