Projet PiCar : Montage et test
Le prototype fonctionne, maintenant on monte la voiture pour de vrai.
Aussi les premiers tests avec un petit programme écrit en python
Le matériel
Lors de ma première commande, j’avais déjà acheté une plaque robotique pour faire le chassis
J’ai du rajouter, car je n’avais pas encore :
Un shield de prototypage à souder soit même, c’est plus propre que la breadboard.
Une roulette à bille pour faire la troisième roue à l’arrière
Des entretoises et des vis
Un fer à souder et de l’étain
Une batterie externe pour alimenter le Pi
Montage de la voiture
Pour le soudage du Shield, Adafruit a fait un excellent tuto dont je me suis servis pour souder le mien.
Premiers tests
Connecter le Pi au réseau Wifi
Je reviendrais pas sur la procédure pour connecter le Pi à un réseau Wifi.
Il y a tellement de sujet qui en parle ( cf Generation Linux pour Raspbian 7, framboise314 pour Raspbian 8 )
Sachez juste que si vous n’avez pas encore de clé Wifi, je vous conseil celle ci qui est compatible avec le Pi.
Pour une liste dans périphériques compatible, c’est par ici.
Programme de test
Avant d’embarquer le code dans une page web avec le retour de la caméra je suis passé par ce petit code qui permet de simplement tester la conduite en SSH dans un terminal
#!/usr/bin/env python #coding=utf-8 # Ce programme permet de controler la voiture robot avec les touches de clavier # GeoHolz : http://blog.jolos.fr #Déclaration from time import sleep import RPi.GPIO as GPIO import sys, termios, atexit from select import select import serial from threading import Thread out = serial.Serial('/dev/ttyAMA0',38400) #Déclaration des GPIOs #Moteur 1 EnA = 4 Out1 = 17 Out2 = 22 #Moteur2 EnB = 18 Out3 = 23 Out4 = 27 #Il existe 2 mode pour déclarer les GPIO, soit GPIO.BOARD soit GPIO.BCM GPIO.setmode(GPIO.BCM) ###### Pour capturer les touches utilisés sur le clavier et lancer la bonne commande ###### ###### On utilise ce petit bout de code : http://code.activestate.com/recipes/572182/ ###### # save the terminal settings fd = sys.stdin.fileno() new_term = termios.tcgetattr(fd) old_term = termios.tcgetattr(fd) # new terminal setting unbuffered new_term[3] = (new_term[3] & ~termios.ICANON & ~termios.ECHO) # switch to normal terminal def set_normal_term(): termios.tcsetattr(fd, termios.TCSAFLUSH, old_term) # switch to unbuffered terminal def set_curses_term(): termios.tcsetattr(fd, termios.TCSAFLUSH, new_term) def putch(ch): sys.stdout.write(ch) def getch(): return sys.stdin.read(1) def getche(): ch = getch() putch(ch) return ch def kbhit(): dr,dw,de = select([sys.stdin], [], [], 0) return dr <> [] ###### ###### SUITE PLUS TARD ###### ###### # Fonction qui permet de faire avancer la voiture # Pour rappel, les 2 enable à 1, et 1 commande de chaque moteur à 1 def Forward(): GPIO.output(Out1,True) GPIO.output(Out3,True) GPIO.output(Out2,False) GPIO.output(Out4,False) GPIO.output(EnA,True) GPIO.output(EnB,True) # Fonction qui permet de stopper la voiture def Stop(): GPIO.output(Out1,False) GPIO.output(Out3,False) GPIO.output(Out2,False) GPIO.output(Out4,False) GPIO.output(EnA,True) GPIO.output(EnB,True) def Standby(): GPIO.output(Out1,False) GPIO.output(Out3,False) GPIO.output(Out2,False) GPIO.output(Out4,False) GPIO.output(EnA,False) GPIO.output(EnB,False) # Fonction qui permet de faire reculer la voiture # Pour rappel, les 2 enable à 1, et 1 commande de chaque moteur à 1 ( les 2 qui étaient à 0 pour avancer ) def Reverse(): GPIO.output(Out2,True) GPIO.output(Out4,True) GPIO.output(Out1,False) GPIO.output(Out3,False) GPIO.output(EnA,True) GPIO.output(EnB,True) # Fonction qui permet de faire tourner la voiture à droite def TurnRight(): GPIO.output(Out1,True) GPIO.output(Out3,False) GPIO.output(Out2,False) GPIO.output(Out4,True) GPIO.output(EnA,True) GPIO.output(EnB,True) # Fonction qui permet de faire tourner la voiture à gauche def TurnLeft(): GPIO.output(Out1,False) GPIO.output(Out3,True) GPIO.output(Out2,True) GPIO.output(Out4,False) GPIO.output(EnA,True) GPIO.output(EnB,True) GPIO.setmode(GPIO.BCM) # Déclaration Enable du moteur 1 en OUT GPIO.setup(EnA,GPIO.OUT) GPIO.output(EnA, False) # Déclaration Enable du moteur 2 en OUT GPIO.setup(EnB,GPIO.OUT) GPIO.output(EnB, False) # Déclaration des pins controle moteur en OUT GPIO.setup(Out1,GPIO.OUT) GPIO.setup(Out2,GPIO.OUT) GPIO.setup(Out3,GPIO.OUT) GPIO.setup(Out4,GPIO.OUT) # Toutes les pins à 0 GPIO.output(Out1,False) GPIO.output(Out2,False) GPIO.output(Out3,False) GPIO.output(Out4,False) # Avant de commencer, test de chaque fonction Forward() sleep(1) Reverse() sleep(1) TurnLeft() sleep(5) TurnRight() sleep(5) Stop() sleep(1) Standby() ###### Pour capturer les touches utilisés sur le clavier et lancer la bonne commande ###### ###### On utilise ce petit bout de code : http://code.activestate.com/recipes/572182/ ###### ###### SUITE ###### if __name__ == '__main__': atexit.register(set_normal_term) set_curses_term() while True: key = getch() if key== "p": print "exit" break elif key=="s": Forward() elif key=="d": TurnLeft() elif key=="q": TurnRight() elif key=="z": Reverse() else: Stop() ###### FIN ###### Standby() GPIO.cleanup()
Le code parle de lui même.
Si les touches sont inversés, plusieurs possibilités :
- Changer le sens des fils sur les bornes moteurs du Shield
- Inverse les touches dans le code ( plus facile )
Une vidéo :
Prochaine étape : embarquer le code dans une page web avec le retour de la webcam