まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Rpi-pi_EYE

Impressionné par le résultat, j'ai alors entrepris de l'imprimer, ce malgré le manque d'informations et d'instructions flagrant, me disant naïvement que le gars avait dû faire les choses bien, que ça passerait sans problèmes…
Bien mal m'en a pris, ce fût une catastrophe !
L'impression en ABS étant toujours assez galère avec des décollements de pièces importants, j'ai dû jeter la pièce principale du P-eye qui non seulement était donc déformée, et qui de plus ne permettait pas d’accueillir convenablement les servo-moteurs, les logements n'étant pas aux bonnes dimensions, en plus d'un système d'enclipsement de ceux-ci vraiment trop fragile.
Ces impressions difficiles obligeant à avoir systématiquement recours aux supports d'impression, et le fait qu'il manque le panneau arrière pour loger le Raspberry me fit enfin comprendre que non, son truc n'est vraiment pas terminé.
Encore eut-il fallut le signaler, la fonction existe, une case à cocher dans Thingiverse pour signaler qu'il s'agit d'un WIP:

Hey! This thing is still a Work in Progress. Files, instructions, and other stuff might change!

Hum, bref, passons…
J'importe et nettoie l'objet dans Sketchup histoire de tout refaire… Wép, le travail n'est pas sourcé, puis de retourner sur la page dans l'idée de publier un remixe et de me rendre compte que le modèle était protégé par une licence restrictive (CC by-nc-nd) interdisant cela !

  • Pas cool, je laissais tout de même un message sur la page histoire de faire baver les follower qui attendaient la suite depuis un an, et Ghiotto, eut alors l'amabilité de libérer son travail afin que je puisse le publier : http://www.thingiverse.com/thing:520703

Le prototype :

img_0186.jpg img_0183.jpg Voici donc une version au design plus simple que le projet d'origine, plus facilement imprimable.
Tous les éléments du kit de Ghiotto ont été conservés, sauf le boîtier principal que j'ai entièrement refait et séparé en deux morceaux.

img_0185.jpg J'ai notamment modifié, agrandit et consolidé les supports de servo pour les adapter à ceux dont je disposais, en plus d'y adjoindre une fixation par vis.
Le fichier source Sketchup permettra au besoin d'ajuster la position latérale de ces supports, ou de les revoir complètement.
Il reste à faire un boîtier arrière pour intégrer le Raspberry-Pi et fermer cet ouvrage.

  • Voici une vue de l'arrière, avec les servos fixés par des petites vis de récupération :

img_0181.jpg

En action avec la vidéo :

  • On peut fixer les servos de deux manières différentes :

img_0129.jpg img_0184.jpg

  • Il faudra peut-être percer un peu plus grand en fonction des vis dont on dispose, ou utiliser la technique du briquet, pour éviter l'éclatement du plastique lorsque le pas de vis va creuser son sillon.

C'est simple : engager la vis, chauffer la tête, visser doucement dans le plastique qui va ramollir sur le passage de la vis, attendre que ça refroidisse/solidifie pour dévisser, ébavurer l'excédent de plastique fondu remonté au bord du trou, revisser en utilisant la bonne technique !


  • L'anneau gris est à coller sur la structure :

img_0182.jpg img_0130.jpg

C'est un peu plus esthétique, ici en vidéo :



 Câblage des servos sur les GPIO du Raspberry :

Avec des servo TowerPro SG90,

  • Premier servo

- Fil orange sur le GPIO1 du Raspberry (pin 12 - BCM18).
- Fil rouge sur le +5V d'une alimentation externe (l'USB du Raspi n'est pas assez puissant).
- Fil marron sur la masse de l'alimentation.

  • Second servo

- Fil orange sur le GPIO0 du Raspberry (pin 11 - BCM17).
- Fil rouge sur le +5V de l'alimentation.
- Fil marron sur la masse de l'alimentation.

Relier une masse GPIO du Raspberry sur la masse de l'alimentation externe.

Utilisation de la librairie RPIO :

Voici la doc de la librairie : http://pythonhosted.org/RPIO/

  • Pour l'installer, c'est facile :
sudo apt-get install python-setuptools
sudo easy_install -U RPIO
  • Voilà quelques morceaux de code qu'on peut utiliser dans la console python, notamment pour déterminer les valeurs limites de la course du servo (valeurs à tâtonner doucement, pour ne pas trop la dépasser, car sinon on force le micro-mécanisme au risque de l'abîmer).

Valeurs minimale et maximale de la PWM testée pour mes servos : 820µs à 2690µs.

On initialise la libraire :

from RPIO import PWM
servo = PWM.Servo()
  • Puis on fait bouger le servo connecté au GPIO17 avec 820µs :
servo.set_servo(17, 820)
  • On fait bouger le servo connecté au GPIO17 avec 2690µs, dans le sens opposé donc:
servo.set_servo(17, 2690)
  • On stoppe les opération pour le GPIO17 :
servo.stop_servo(17)

À ce stade, on sait donc piloter les servos, il suffit de choisir la valeur qui sied à la position dont on a besoin. Avec ces commandes simples, on peut déjà créer un programme…

Piloter les servos via une interface web avec web.py :

  • Découvert après quelques recherches, on va utiliser un module http://webpy.org/, qui contient un serveur Web ultra-léger.

Et de me rendre compte de la mention en bas de page :
started by Aaron Swartz (webpy@aaronsw.com)

Tomber sur un petit bout du travail d'Aaron Swartz, peu après avoir visionné sa bio en vidéo, ma saisi au tripe… quand on sait le gâchis qu'a été cette histoire, une victime pour l'exemple, du patriot act américain, que l'état Français cherche à faire la même chose au travers de lois sécuritaires, donc liberticides, que beaucoup applaudissent, dont madame pécresse qui déclare publiquement des bêtises (« Il faudra bien entendu un Patriot Act à la française… »), pour déclarer plus tard : « je ne sais même pas ce qu'il y a dans le Patriot Act américain »…
Tout ça me file la nausée… juste, connectez vos cerveaux ou allez faire chier les mygales dans leurs nids, qu'on ait la paix !
Ces lois n'empêcheront pas les poseurs de bombes, ho que non ! Par contre elles permettent de contrôler touuuut le monde, voire d'en pousser certains à bout, jusqu'au suicide…

  • Si vous ne l'avez pas vu, allez tout de suite télécharger la vidéo : The Internets Own Boy_The Story of Aaron Swartz, voici les sous-titres en Français.

Hum…

  • C'est donc avec émotions qu'on installe le module, à l'aide d'easy install :
sudo easy_install web.py
  • Puis on crée une arborescence sur le Raspberry-Pi:
cd /
mkdir webpyserver
cd /webpyserver
mkdir templates
mkdir static

Le dossier webpyserver contiendra le fichier Python à exécuter.
Le dossier webpyserver/templates contiendra une page HTML.
Et le dossier webpyserver/static contiendra une feuille de style au format CSS.

  • On va écrire un programme qui sera placé dans le dossier /webpyserver/DeuxServo.py :
#!/usr/bin/env python 
import web, RPIO
from web import form
from RPIO import PWM

servo = PWM.Servo()

# definit la page de nom index pour le site web 
urls = ('/', 'index') 
dossier_web = web.template.render('templates')

app = web.application(urls, globals())

# definit les boutons a afficher 
ma_forme = form.Form( 
form.Button("btn", id = "btn1-0", value = "s1-0", html = "Servo 1 - 0 degre", class_ = "bouton_1-0"), 
form.Button("btn", id = "btn1-90", value = "s1-90", html = "Servo 1 - 90 degres", class_ = "bouton_1-90"), 
form.Button("btn", id = "btn1-180", value = "s1-180", html = "Servo 1 - 180 degres", class_ = "bouton_1-180"), 
form.Button("btn", id = "btn2-0", value = "s2-0", html = "Servo 2 - 0 degre", class_ = "bouton_2-0"), 
form.Button("btn", id = "btn2-90", value = "s2-90", html = "Servo 2 - 90 degres", class_ = "bouton_2-90"), 
form.Button("btn", id = "btn2-180", value = "s2-180", html = "Servo 2 - 180 degres", class_ = "bouton_2-180") 
)

# definit l action a effectuer quand la page index est appele 
class index:
    def GET(self): 
        forme = ma_forme() 
        return dossier_web.index(forme, "Raspberry Pi control Servo") 
    def POST(self): 
        userdata = web.input() 
        if userdata.btn == "s1-0": 
            servo.set_servo(17, 820)
        if userdata.btn == "s1-180": 
            servo.set_servo(17, 2600)
        if userdata.btn == "s1-90": 
            servo.set_servo(17, 1710)
        if userdata.btn == "s2-0": 
            servo.set_servo(18, 820)
        if userdata.btn == "s2-180": 
            servo.set_servo(18, 2600)
        if userdata.btn == "s2-90": 
            servo.set_servo(18, 1710)
        raise web.seeother('/')

# programme 
if __name__ == '__main__': 
    app.run()
  • Enfin dans le dossier templates on écrit un fichier index.html :
$def with (form, title)
<!doctype html>
<html>
    <head>
        <title>$title</title>
    </head>
   
    <body>
        <br />
        <form class="form" method="post">
        $:form.render()
        </form>
    </body>
</html>
  • Tout est prêt, on initialise le programme avec la commande :
sudo python DeuxServo.py
  • Et on se rend à l'adresse IP du Raspberry en spécifiant le port 8080 :

ControlServo.jpg

  • C'est tout pour ce programme de test !

Reste à écrire un programme pour piloter les deux servos à l'unisson afin de diriger l'œil de la caméra aux coordonnées désirées. Cela fera peut-être l'objet d'un futur billet, mais il faut déjà que je termine la modélisation3D du boîtier.


À suivre

Ressources :

http://itechnofrance.wordpress.com/2013/02/04/piloter-les-ports-gpio-partir-dun-navigateur-internet/
http://webpy.org/

https://www.censa.mx/imgs/prods/18022004/docs/doc1-1401817609.pdf
http://www.servodatabase.com/servo/towerpro/sg90
https://www.censa.mx/imgs/prods/18022004/docs/doc1-1401817609.pdf
https://projects.drogon.net/raspberry-pi/wiringpi/pins/
https://groups.google.com/forum/#!topic/raspberrybots/lRfu5ucbjYE
http://papinthierry.free.fr/index.php?option=com_content&view=article&id=32&Itemid=32

Commentaires

1. Le mercredi, 21 octobre 2015, 15:48 par Julldozer

Carrement cool de voir la conception du bidule sous tous ses angles !
Ya surement plein de trucs sympas a faire en timelapse avec...

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet