Categories
Bidouillability Technology

Contrôler un Lego EV3 avec une API Web

Vous aussi vous voudriez commander votre robot avec une simple API Web? Par exemple pour embêter le chat ou surveiller votre domicile à distance (avec une arme sur son épaule il pourrait impressionner un cambrioleur et ressemblerait même à Johnny 5).
Dans ce cas, vous devez tester ceci et me dire ce que vous en pensez.

Il s’agit d’un micro serveur Web destiné à être installé sur un Lego Mindstorms EV3 avec le système ev3dev (basé sur Debian). J’ai simplement utilisé Flask afin de définir quelques endpoints correspondants aux différentes actions (avancer, reculer, tourner à droite, tourner à gauche et stopper).

Le README explique les quelques étapes nécessaires pour l’installation ainsi que l’utilisation. C’est vraiment simple. L’exemple ci-dessous ordonnera au robot d’avancer indéfiniment.

$ GET http://192.168.1.16:5000/move/forward
{"message": "OK", "direction": "forward", "action": "move"}

Le robot se stoppera dès qu’il recevra une requête GET sur l’endpoint /move/stop. Évidemment d’autres paramètres sont fournis par ev3dev. Je vais essayer de les rendre accessibles via l’API de manière simple. Par exemple demander au robot de se déplacer sur une distance ou de faire une rotation de x degrés. Il faudra prendre en compte la nature du sol ainsi que le niveau de charge de la batterie.

Je vais également ajouter au serveur une petite page Web avec du JavaScript qui permettra de contrôler le robot avec des boutons directionnels. Ce sera pratique pour commander le robot depuis un smartphone.

Categories
Programming

Premier test de la brique EV3 avec Python

Voici un simple exemple de programme pour la brique EV3 des Lego Mindstorms. Pour tester il faudra utiliser la distribution ev3dev.

#! /usr/bin/env python
# -*- coding: utf-8 -*-
 
#
# Avoids obstacles with the infrared sensor.
#
 
import time
 
from ev3.lego import LargeMotor
from ev3.lego import TouchSensor
from ev3.lego import InfraredSensor
 
LEFT = LargeMotor(port=LargeMotor.PORT.B)
RIGHT = LargeMotor(port=LargeMotor.PORT.C)
 
button = TouchSensor()
ir_sensor = InfraredSensor()
 
distance = 30
 
def start_stop():
    while True:
        time.sleep(1)
        if button.is_pushed:
            print "starting..."
            walk()
 
def walk():
    while True:
        time.sleep(1)
        if button.is_pushed:
            print "stopping..."
            LEFT.stop()
            RIGHT.stop()
            break
 
        if ir_sensor.prox <= distance:
            print "obstacle detected"
 
            LEFT.stop()
            RIGHT.stop()
 
            LEFT.run_forever(100, regulation_mode=False)
            time.sleep(5)
            LEFT.stop()
 
        LEFT.run_forever(100, regulation_mode=False)
        RIGHT.run_forever(100, regulation_mode=False)
 
if __name__ == "__main__":
    # Point of entry in execution mode
    start_stop()
 
    LEFT.stop()
    RIGHT.stop()

Malheureusement c’est terminé pour ce soir. Les piles sont vides…