Hello, voici la dernière partie des tuto consacré au KiwilBot, nous avons vu dans la premiere partie le montage et les pièces necessaires, dans la seconde partie l' éléctronique et câblage et donc la troisième partie sera logiquement porté sur la partie programmation du Raspberry Pi. Pour la programmation rien de bien compliquer en soit car je me suis servit de beaucoup de choses existante, premièrement j'utilise le très connu webiopi car en plus de l'installation de l'interface basique il vous installe aussi dans votre répertoire des exemples dont un qui est le cambot2 qui est une page web qui permet de contrôler un robot avec caméra.
A partir de la il ne me restait plus qu'a comprendre sont fonctionnement et l'adapter à mon projet. C'est pourquoi la version que je vais vous proposer marche avec un robot qui à 4 moteur dc et une camera board pour la camera. Par la suite pourquoi pas envisager une interface un peu plus design.
I-Installation des bases :
Comme décrit plus haut j'utilise Webiopi, on commençons donc par l'installer :
wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
tar xvzf WebIOPi-0.6.0.tar.gz
cd WebIOPi-0.6.0
sudo ./setup.sh
Ici deux option soit vous le lancer manuellement à chaque fois par :
sudo /etc/init.d/webiopi start
soit vous le démarrer en même temps que le système :
sudo update-rc.d webiopi defaults
Dés à présent vous pouvez contrôler les GPIO via l'interface Web avec ceci :
http://ipraspberry:8080/
II-Configuration de Webiopi et Cambot :
Cambot :
On se place dans le repertoir de l'exemple Cambot2 :
cd /home/pi/WebIOPi-0.6.0/examples/magpi-9-cambot2
La version de webiopi est à adapter bien sur. Dans se dossier deux nous intéresse l'index.html qui est la structure de la page et le fichier cambot.py dans lequelle se trouve tout les fonctions pour controller le robot.
On modifie donc dans un premier temps le cambot.py, tout y est paramétrable vous pouvez adapter votre code en fonction de GPIO utiliser si se ne sont pas les mêmes :
sudo nano ./cambot.py
Vous pouvez voir que le code est déjà bien commenté, mais pour ceux qui ont suivi le tuto depuis le début voici le code :
Imports
import webiopi
# Retrieve GPIO lib
GPIO = webiopi.GPIO
# -------------------------------------------------- #
# Constants definition #
# -------------------------------------------------- #
# Left motor GPIOs
L1=4 # H-Bridge 1
L2=17 # H-Bridge 2
LE=18 # H-Bridge 1,2EN
# Right motor GPIOs
R1=27 # H-Bridge 3
R2=22 # H-Bridge 4
RE=23 # H-Bridge 3,4EN
# -------------------------------------------------- #
# Left Motor Functions #
# -------------------------------------------------- #
def left_stop():
GPIO.output(L1, GPIO.LOW)
GPIO.output(L2, GPIO.LOW)
def left_forward():
GPIO.output(L1, GPIO.HIGH)
GPIO.output(L2, GPIO.LOW)
def left_backward():
GPIO.output(L1, GPIO.LOW)
GPIO.output(L2, GPIO.HIGH)
# -------------------------------------------------- #
# Right Motor Functions #
# -------------------------------------------------- #
def right_stop():
GPIO.output(R1, GPIO.LOW)
GPIO.output(R2, GPIO.LOW)
def right_forward():
GPIO.output(R1, GPIO.HIGH)
GPIO.output(R2, GPIO.LOW)
def right_backward():
GPIO.output(R1, GPIO.LOW)
GPIO.output(R2, GPIO.HIGH)
# -------------------------------------------------- #
# Macro definition part #
# -------------------------------------------------- #
def go_forward():
left_forward()
right_forward()
def go_backward():
left_backward()
right_backward()
def turn_left():
left_backward()
right_forward()
def turn_right():
left_forward()
right_backward()
def stop():
left_stop()
right_stop()
# -------------------------------------------------- #
# Initialization part #
# -------------------------------------------------- #
# Setup GPIOs
GPIO.setFunction(LE, GPIO.OUT)
GPIO.setFunction(L1, GPIO.OUT)
GPIO.setFunction(L2, GPIO.OUT)
GPIO.setFunction(RE, GPIO.OUT)
GPIO.setFunction(R1, GPIO.OUT)
GPIO.setFunction(R2, GPIO.OUT)
GPIO.output(RE, GPIO.HIGH)
GPIO.output(LE, GPIO.HIGH)
stop()
# -------------------------------------------------- #
# Main server part #
# -------------------------------------------------- #
# Instantiate the server on the port 8000, it starts immediately in its own thread
server = webiopi.Server(port=8000, login="cambot", password="cambot")
# Register the macros so you can call it with Javascript and/or REST API
server.addMacro(go_forward)
server.addMacro(go_backward)
server.addMacro(turn_left)
server.addMacro(turn_right)
server.addMacro(stop)
# -------------------------------------------------- #
# Loop execution part #
# -------------------------------------------------- #
# Run our loop until CTRL-C is pressed or SIGTERM received
webiopi.runLoop()
# -------------------------------------------------- #
# Termination part #
# -------------------------------------------------- #
# Stop the server
server.stop()
# Reset GPIO functions
GPIO.setFunction(LE, GPIO.IN)
GPIO.setFunction(L1, GPIO.IN)
GPIO.setFunction(L2, GPIO.IN)
GPIO.setFunction(RE, GPIO.IN)
GPIO.setFunction(R1, GPIO.IN)
GPIO.setFunction(R2, GPIO.IN)
Pour le fichier Index.html peu de chose à changer mise appart tout en bas du fichier le lien pour le Webcam et sa définition, personnellement j'utilise une camera board donc je vais plus tard dans le tuto vous aider à la configurer avec jmpgstreamer, donc le lien de la webcam sera égale à :
http://192.168.0.16:8080/?action=stream
La partie Cambot est terminé passons à la configuration de Webiopi.
Webiopi :
Actuellement quand vous acceder à la page Webiopi via votre adresse ip vous voyer apparaitre les differents choix que propose de base Webiopi mais aucun lien permetant d'acceder au Cambot, c'est ce que nous allons faire tout de suite. Pour cela il faut modifier le fichier Index.html de Webiopi :
sudo nano /usr/share/webiopi/htdocs/index.html
On voit tout les menus du Webiopi on va donc ajouter un lien vers le projet Cambot (Impossible pour moi de vous mettre directement le code donc je vous mes une image) :
On peut donc voir que dans les dernier ligne j'ai rajouter Robot Controlle, il suffit de redémarrer webiopi et vous devriez voir apparaître sur votre page web un lien, ce lien pour le moment ne renvoie vers rien c'est normale.
Comme je viens de le dire rien ne s'affiche lorsque que l'on clique sur notre lien, il faut dans un premier temps ajouter le script du cambot au Webiopi :
sudo nano /etc/webiopi/config
Dans la section [SCRIPTS] on y ajouter la ligne suivante :
cambot = /home/pi/WebIOPi-0.6.0/examples/magpi-9-cambot2/cambot.py
Bientôt fini, ne reste plus qu'a copier le dossier "/home/pi/WebIOPi-0.6.0/examples/magpi-9-cambot2" à l'endroit ou la page web viens chercher ces fichiers c'est à dire dans "/usr/share/webiopi/htdocs/app". Si vous faite un ls dans se dossier vous pourrez voir tout les dossier contenant chaque index des page webiopi.
On copie le dossier entier :
sudo cp -R /home/pi/WebIOPi-0.6.0/examples/magpi-9-cambot2/cambot.py /usr/share/webiopi/htdocs/app
Relancer Webiopi :
sudo /etc/init.d/webiopi restart
Et voila à se niveau vous pouvez accéder à la page Contrôle robot et utiliser les flèches pour déplacer le robot.
III-Partie Vidéo :
Cette partie sera propre aux personnes possédant une camera board, mais il est très facile de trouvez l’équivalent pour d'autre webcam.
Installation des outils nécessaires :
sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
Ensuite :
sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
On télécharge et installe MJPG-Streamer :
wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip
unzip mjpg-streamer-code-182.zip
cd mjpg-streamer-code-182/mjpg-streamer
make mjpg_streamer input_file.so output_http.so
sudo cp mjpg_streamer /usr/local/bin
sudo cp output_http.so input_file.so /usr/local/lib/
sudo cp -R www /usr/local/www
On créer un dossier dans le quelle il y aura les images prise par la camera :
sudo mkdir ./Temp
sudo chmod -R 777 ./Temp
Les droit sont important car dans mon cas sans les droits sur le dossier impossible de mettre les images dedans.
Et pour finir voici le script qui permet le streaming :
sudo nano ./cam.sh
sudo chmod -R 777 ./cam.sh
#!/bin/sh
nohup raspistill --nopreview -w 640 -h 480 -q 10 -o ./Temp/pic.jpg -tl 10 -t 99999999 -rot 180 &
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f ./Temp -n pic.jpg" -o "output_http.so -w /usr/local/www"
Le script est à lancer à chaque fois que vous voulez vous servir de la camera.
Pour la connexion à webiopi rien ne change toujour ceci :
http://ipraspberry:8080/
a la seule différence qui est le nom et mot de passe qui sont tout les deux "cambot" .
La Troisième et dernier partie de se tuto est maintenant "terminé", terminé entre guillemet car des modification sont surement a envisager concernant des l'interface et pourquoi pas lui rajouter quelques gadgets.
J'attend vos retours :D