Robot Car mit Raspberry Pi

Dans les blogs précédents sur la Robot Car, nous avons utilisé les micro-contrôleurs robustes compatibles Uno et Nano. Les Raspians vont maintenant s'imposer. Des contrôleurs de moteur basés sur le circuit intégré L293D et des kits de voitures robotisées pour le Raspberry Pi ont vu le jour peu après sa sortie en 2012. Avec les Pi Wars annuelles, il y a même un concours pour les modèles les plus polyvalents ; les tâches ont été très difficiles à chaque fois jusqu'à présent.

Dans ce blog, je veux utiliser l'un des avantages du Raspi et connecter un clavier sans fil au port USB. De plus, j'utilise un des rares Raspberry Pi 3A+, parfaitement adapté à nos besoins. En gros, le code ci-dessous fonctionne pour n'importe quel modèle de Raspi. Comme contrôleur de moteur j'utilise le MotoZero de ThePiHut. Comme son nom l'indique, il s'agit d'un HAT (Hardware Attached on Top) au format Pi Zero. Mais le connecteur J6 (mieux connu sous le nom de connecteur GPIO) est inchangé depuis des années pour tous les modèles.

Indispensable pour notre installation est un convertisseur DC-DC ; j'utilise le LM2596S Step-down DC-DC Buck Converter avec affichage digital à 3 chiffres, où les tensions sont affichées directement. Le passage de la tension d'entrée à la tension de sortie se fait par le petit bouton à droite de l'affichage à 3 chiffres. Comme l'alimentation se fait via la broche 5V (broche 2 ou 4), la tension d'entrée pour le Raspi doit être précisément de 5.0 à 5.1V. Les pics de tension peuvent détruire le Raspberry Pi. Cela ne m'est jamais arrivé. Mais même un redémarrage non planifié est assez ennuyeux, car le processus de démarrage prend environ une minute.

Matériel Nécessaire

Numéro Composant
1 Raspberry Pi 3A+
ou Raspberry Pi 3B / 3B+
ou Raspberry Pi Zero / WH
Note : A la fin, nous voulons aussi utiliser le WLAN.
1 Contrôleur de moteur Moto Zero
1 LM2596S Convertisseur abaisseur DC-DC Buck avec affichage numérique à 3 chiffres
1 Clavier sans fil
1 Kit Robot Car avec deux moteurs/roues
Compartiment de la batterie, câble de démarrage, petit matériel


J'ai vissé le convertisseur DC-DC dans la zone avant sous le châssis, le logement pour le Raspi et le compartiment de la batterie que j'ai fixé avec du velcro ou du ruban adhésif double face (moquette) comme auparavant.

Image: Robot Car vu d'en haut avec Raspberry Pi 3A+ et Pack batterie (2 batteries LiPo)

Photo du bas: 2 moteurs et convertisseur DC-DC

Quelques mots sur le Raspberry Pi 3A+ et le MotoZero : Le 3A+ est la version réduite du 3B+ avec un processeur quadricœur, 512 Mo de RAM, WLAN/Bluetooth et un port USB-A. Le 3A+ est la version réduite du 3B+. Je peux me passer d'un port LAN et d'une autre prise USB et bénéficier en contrepartie d'une consommation électrique plus faible. Avec le Pi Zero avec le simple processeur m'a gêné surtout que j'ai toujours besoin d'adaptateurs pour le câble HDMI et USB.

Le MotoZero est un simple contrôleur de moteur avec deux ICs du type L293D. Il est ainsi possible de contrôler jusqu'à quatre moteurs. L'avantage d'une HAT est que vous pouvez économiser beaucoup de connexions de câbles en la branchant sur l'en-tête J6. Le MotoZero est livré en kit et doit être soudé. Il existe ces instructions pour le faire. Conseil : au lieu de l'embase GPIO à 40 broches fournie, utilisez ce que l'on appelle une embase à empiler, dont les broches dépassent considérablement. Les contrôleurs de moteur n'utilisent pas tous les GPIO, vous pouvez donc utiliser certaines broches pour des capteurs ou d'autres extensions. Pour des raisons de construction, j'ai utilisé les connecteurs Motor 3 et 4. Et comme je l'ai découvert lors d'expériences, la tension de référence pour la modulation de largeur d'impulsion (PWM), c'est-à-dire la commande du moteur, est appliquée à la broche de validation du L293D.

Brochage

Moteur

1

2

3

4

Broche de l'activateur

5

17

12

25

Borne Positive ( + )

24

6

23

13

Négatif ( - ) Terminal

27

22

16

18


Software

Comme dans les précédents articles du blog sur le Raspberry Pi et Python, je m'extasie cette fois-ci sur le module de programme gpiozero de Ben Nuttall et al, qui est pour moi un excellent exemple de programmation orientée objet. Bien entendu, toutes les fonctions de commande des moteurs, mais aussi d'évaluation des capteurs, sont implémentées.

Comme nous utilisons les mêmes moteurs qu'auparavant, j'ai décidé d'utiliser à nouveau le système avec les cinq pas de vitesse par direction. Pour rappel : si la tension est trop faible, les moteurs ne font que vrombir, mais ne démarrent pas. Et selon l'alimentation en tension, la tension doit également être régulée vers le haut. Par conséquent, la liste speedLevel avec les 11 éléments peut être différente pour vous. Avec gpiozero les valeurs doivent se trouver entre -1 et +1 ; donc la division par 1000 a lieu avec l'attribution des valeurs. Par ailleurs je reçois de cette manière la possibilité d'équiper les télécommandes développées par moi-même avec HC-12 et nRF24L01.

Script Python


#! /usr/bin/python3
# Code for driving a robot car with MotoZero
# Motors attached to M3 and M4
# For motor control, use keybord w,a,s,y or arrow keys
# By Bernd54Albrecht for AZ-Delivery

from gpiozero import Robot, Motor, OutputDevice, LED
from signal import pause
import _thread
import sys
import termios
import tty

robot = Robot(left=(16,23), right=(13,18))
motor1_enable = OutputDevice(12, initial_value=1)
motor2_enable = OutputDevice(25, initial_value=1)

led = LED(4)
led.on()
code = 505
inkey_buffer = 1

def inkey():
  fd=sys.stdin.fileno()
  remember_attributes=termios.tcgetattr(fd)
  tty.setraw(sys.stdin.fileno())
  character=sys.stdin.read(inkey_buffer)
  termios.tcsetattr(fd,termios.TCSADRAIN, remember_attributes)
  return character

def readkey():
  k1 = inkey()
  if ord(k1) != 0x1b:
    return k1
  k2 = inkey()
    if ord(k2) != 0x5b:
  return k1
    k3 = inkey()
  return chr(0x10 + ord(k3) - 65) # 16=Up, 17=Down, 18=Right, 19=Left arrows


def getCode():
  global code
  key = readkey()
  print("key = ",key,"ord(key)",ord(key))
  if (key=='w' or ord(key) == 16) and code<1000:
    code = code + 100
  elif (key=='y' or ord(key) == 17) and code>100:
    code = code-100
  elif (key=='s' or ord(key) == 18) and code%100<10:
    code = code+1
  elif (key=='a' or ord(key) == 19) and code%100>0:
    code = code-1
  elif key == ' ':
    code = 505
  elif ord(key) == 3:
    code=505
    led.off()
    exit()

  print(code)
  return

def motor(y,x):
  print("y = ",y, " x = ", x)
  speedLevel = [-600,-500,-400,-320,-250,0,250,320,400,500,600]
  speed = speedLevel[y]

if x==10:
    left = min(speed+250,600)
    right = max(speed-250,-600)

  elif x==9:
    left = min(speed+200,600)
    right = max(speed-200,-600)

  elif x==8:
    left = min(speed+150,600)
    right = max(speed-150,-600)

  elif x==7:
    left = min(speed+100,600)
    right = max(speed-100,-600)

  elif x==6:
    left = min(speed+50,600)
    right = max(speed-50,-600)

  elif x==4:
    right = min(speed+50,600)
    left = max(speed-50,-600)

  elif x==3:
    right = min(speed+100,600)
    left = max(speed-100,-600)

  elif x==2:
    right = min(speed+150,600)
    left = max(speed-150,-600)

  elif x==1:
    right = min(speed+200,600)
    left = max(speed-200,-600)

  elif x==0:
    right = min(speed+250,600)
    left = max(speed-250,-600)

  else:
    left = speed
    right = speed

  robot.value = (left/1000, right/1000)

while True:
  getCode()
  y = int(code/100)
  x = code - 100*y
  _thread.start_new_thread(motor,(y,x))


Avec ce programme, j'utilise un module de programme qui me permet d'interroger une seule touche, même sans touche de retour. Cependant, ce module nécessite d'être lancé dans le terminal. Sinon, vous obtenez le message d'erreur suivant :


Image: Message d'erreur, si le programme n'est pas lancé dans le terminal

Si vous ne voulez pas cela, vous pouvez vous passer du module et travailler avec la commande d'entrée. Ensuite, cependant, chaque entrée doit être complétée par la touche retour.

Dans ma configuration, le programme Python est lancé dans le terminal de toute façon, parce que j'ai écrit le démarrage du programme dans le fichier autostart. Ainsi, je peux démarrer le Raspi sans moniteur et avoir mon Robot Car prêt à fonctionner après le démarrage. Il existe plusieurs méthodes de démarrage automatique, et pour ne rien arranger, elles ont changé au cours des dernières années. J'utilise la méthode qui est officiellement appelée "méthode système". Pour ce faire, ouvrez le fichier ci-dessus avec :

Sudo Nano / etc / xdg / lxsession / lxde PI / autostart

Parmi les lignes suivantes, vous trouverez déjà les trois premières dans le fichier autostart :

Lxde panel - section lxde Pi
Pcmanfm - Bureau - profil lxde Pi
Xscreensaver - pas d'éclaboussure
Terminal lxe - python3 / Path / USScript.py


Avec la quatrième ligne, je lance le terminal et y exécute notre programme Python3. Il est important que le programme soit spécifié avec le chemin complet, dans mon cas

Terminal lxe - python3 / home / PI / robot car / robot car motozero3 4U Code 505.py

Pour indiquer que le démarrage du système et du programme est terminé, j'ai connecté une LED à la broche 4. Ainsi, lorsque la lumière s'allume, la petite voiture robot est prête à partir et attend les commandes clavier w, a, s, f, les touches fléchées ou la barre d'espace pour s'arrêter rapidement. Avec Ctrl+C, le programme est terminé.

Si vous ne disposez pas d'un clavier sans fil, vous pouvez bien sûr aussi lancer le programme dans un programme terminal sur le PC, par exemple Putty.

Image : Configuration et démarrage de Putty

Après s'être connecté, passez dans le bon répertoire, dans mon cas

CD roboka

et lancez le programme Python avec

Python 3

Cependant, une nouvelle instance du terminal et du programme Python est lancée. Ainsi, si votre RobotCar a des secousses pendant la conduite, le programme ouvert avec le démarrage automatique est toujours en cours d'exécution en parallèle. Il doit d'abord être terminé et retiré du démarrage automatique si nécessaire.

Image : Connexion Putty et démarrage du programme

Quittez le programme avec Ctrl+C ; et si vous voulez arrêter le Raspi de manière ordonnée, tapez ce qui suit :
sudo shutdown - h now

Enfin l'opposé de l'autostart, l'arrêt automatique sans écran et sans clavier. Un outil d'Adafruit, mais incompréhensible sans l'explication de Michael Horne (https://www.recantha.co.uk/blog/), que je traduis ici en allemand.

Le tout fonctionne en court-circuitant les deux dernières broches (carte #39=Masse et #40=GPIO21), que ce soit avec une fiche de court-circuitage ou un trombone.

Vous avez besoin du programme git, qui est préinstallé dans le système d'exploitation du Raspberry Pi de nos jours. Si vous ne l'avez pas encore, commencez par (après la mise à jour et la mise à niveau obligatoires)

Sudo APT get install git

En utilisant git clone, le script Adafruit est ensuite téléchargé :
Clone gitHttps: / / github.com / adafruit / adafruit - GPIO - Halt
Ou Clone gitGIT http: / / github.com / adafruit / adafruit - GPIO - Halt
Le clonage signifie que le répertoire a maintenant été copié sur notre Raspi. Nous nous rendons dans ce répertoire avec

Disque adafruitGPIO. Stop

Là, nous entrons les commandes suivantes l'une après l'autre :

Mari

Installation de sudo make

Ceci va installer le script dans le répertoire /usr/local/bin/gpio-halt

Pour exécuter ce script en tant que "service", nous créons le fichier requis avec :

Sudo Nano / LIB / systemd / System / GPIOArrête ça.

Entrez le code suivant dans nano :  

[unité]
Description = raccourcir la broche 21 et le sol pour fermer Pi
Après = plusieursUtilisateurs. Objectifs

[services]
Type = inactif
Execstart = / usr / local / bin / GPIO pause 21

[installation]
Tu en veux?Utilisateurs. Objectifs

Dans nano, le script est enregistré avec Ctrl+o et okay, puis on quitte nano avec Ctrl+x.

Nous sommes de retour dans le terminal sur la ligne de commande. Ici, le programme est rendu exécutable avec :

Sudo chmod 644 / LIB / systemd / System / GPIOArrête ça.

Et systemd devrait utiliser le script à partir de maintenant :

Le démon sudo systemctl recharge

Sudo systemctl activer GPIOArrête ça.

Enfin, le Raspi est connecté au 

Sudo redémarre  

redémarré et nous pouvons essayer le script.




 Amusez-vous bien en l'essayant.


Projets pour avancéTarte aux framboises

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi