Table des matières:

Carte servodriver avec Python-GUI et Arduino : 5 étapes
Carte servodriver avec Python-GUI et Arduino : 5 étapes

Vidéo: Carte servodriver avec Python-GUI et Arduino : 5 étapes

Vidéo: Carte servodriver avec Python-GUI et Arduino : 5 étapes
Vidéo: Driving a Servo-motor from a #Python🐍Tkinter GUI via pyFirmata + #Arduino + #Firmata protocol 2024, Novembre
Anonim
Carte de servodriver avec Python-GUI et Arduino
Carte de servodriver avec Python-GUI et Arduino

Lors du prototypage ou de la construction de modèles d'avions, vous rencontrez souvent le problème de devoir vérifier la course des servos ou de régler les servos en position médiane.

Au cas où vous ne voudriez pas construire tout votre système RC ou tester, jusqu'où vous pouvez pousser le servo ou où se trouve la position médiane, alors cette carte est faite pour vous ! Il vous permet de déplacer le servo vers des positions spécifiées ou de faire des allers-retours.

Cela fonctionne étonnamment bien, même avec 6 servos qui courent d'une position à l'autre dans la boucle.

En outre, c'est un bon projet pour en savoir plus sur la communication entre Python-GUI et Arduino à l'aide de Serial.

Étape 1: Ce dont vous avez besoin…

Pour ce projet, vous aurez besoin des éléments suivants:

Matériel

  • Arduino nano avec câble. J'ai utilisé un clone, et le code Python attend en fait une puce CH340 d'un clone
  • Une planche de prototypage. 7x5cm suffit
  • Quelques en-têtes et broches de 2, 54 mm
  • 1-6 servos
  • Alimentation pour les servos (j'ai utilisé un pack batterie avec 4 batteries)

Logiciel

  • Python 3:
  • Un pilote USB pour les puces CH340: il suffit de google pour les pilotes pour les pilotes CH340
  • IDE Arduino:

Étape 2: Souder la carte

Souder la carte
Souder la carte

La soudure est en fait simple selon Fritzing sur la photo. Assurez-vous simplement que vous pouvez facilement connecter les servos aux rangées à 3 broches.

  • Les rangées de 3 broches sont attachées aux broches numériques 3, 5, 6, 9, 10 et 11 de l'Arduino nano.
  • Le fil rouge est attaché à la broche 5V de l'Arduino
  • Le fil noir est connecté à la broche GND de l'Arduino
  • La paire de broches sous les rangées de 3 broches est destinée à connecter une alimentation de récepteur RC typique, vous pouvez ajouter des connecteurs comme vous le souhaitez, comme des bornes à vis, des connecteurs XT, JST ou… ou…

Personnellement, j'aime les rangées d'en-têtes femelles pour mettre l'Arduino, mais c'est à vous de décider.

Veuillez noter que les embases femelles en court-circuit sont un cavalier, qui vous permet d'alimenter le servo en utilisant la source 5V de l'Arduino à des fins de test. Si vous le forcez trop, l'Arduino se réinitialisera et perdra le bon rythme. Ils DOIVENT être retirés avant de brancher une autre alimentation.

Étape 3: Configuration de l'Arduino

Installez l'IDE Arduino et flashez l'Arduino nano avec le croquis ci-joint.

Étape 4: Configuration de Python

Configuration de Python
Configuration de Python

Installez Python 3 après l'avoir téléchargé. Assurez-vous de cocher l'option pour créer une variable "PATH".

Vous devez installer deux autres packages à l'aide de pip. Pour cela, appuyez sur la touche "Windows", tapez "cmd" et appuyez sur "enter". Dans l'invite de commande, tapez les commandes suivantes:

  • pip installer la série
  • piip installer pyserial
  • pip installer tkinter

Comme vous pouvez le voir, j'ai besoin des modules serial ainsi que pyserial, ce qui n'est probablement pas le plus efficace, puisque pyserial devrait remplacer serial. Néanmoins ça marche et je commence tout juste à apprendre;).

Ouvrez le script Python dans l'IDE et exécutez-le, ou exécutez-le directement depuis le terminal.

Dans le menu déroulant, vous pouvez choisir entre deux modes, "Go Straight" et "Ping Pong":

  • Allez tout droit: entrez une position de servo en microsecondes dans la première colonne et appuyez sur "Démarrer" pour que le servo se déplace vers la position spécifiée.
  • Ping Pong: saisissez une limite inférieure et une limite supérieure dans les deuxième et troisième colonnes. Ce sont les positions inférieure et supérieure, entre lesquelles le servo va aller et venir. Dans la colonne "Ping Pong Time", vous pouvez spécifier un temps en millisecondes pendant lequel le servo attendra lorsqu'il aura atteint la position supérieure ou inférieure. Appuyez sur "Démarrer" et le servo commencera à se déplacer d'avant en arrière, appuyez sur "Stop" et le servo s'arrêtera.

Étape 5: Où la magie opère

Enfin, je tiens à souligner certains des détails du code pour ceux qui souhaitent se lancer un peu dans la communication série entre Python et Arduino.

Maintenant, que se passe-t-il dans le programme Python ?

Tout d'abord, le programme vérifie ce qui est attaché aux ports COM dans cette ligne et l'enregistre dans une liste:

self. COMPortsList = liste(serial.tools.list_ports.comports())

Ensuite, il parcourt la liste jusqu'à ce qu'il trouve une puce CH340 notoire, l'enregistre, puis établit une connexion série après la boucle for. Notez que la boucle for s'interrompt dès que le premier CH340 est trouvé.

for p in self. COMPortsList: if "CH340" in p[1]: # Recherche d'un clone Arduino self. COMPort = p[0] break else: pass self. Ser = serial. Serial(self. COMPort, 57600)

La connexion série est établie avec le port COM avec une vitesse de transmission de 57600.

Et que fait le code Arduino ? Eh bien, puisque l'Arduino n'a qu'un seul port COM, la connexion série n'est qu'une ligne:

Serial.begin (57600);

Maintenant, nous pouvons utiliser les deux ports pour communiquer. Dans ce cas précis, seuls les messages du Python vers l'Arduino. Les messages sont envoyés ici depuis Python. La connexion série transmet des octets par défaut. C'est aussi le moyen le plus rapide d'envoyer des données et, pour autant que je sache, il est encore assez répandu. Ainsi, les entiers pour le numéro du servo (afin que l'Arduino sache quel servo déplacer) et la position en microsecondes sont transformés en un octet.

Command = struct.pack('>B', self. Place) # La variable int "self. Place" est transformée en octet

self. Ser.write(Command) # Ecriture de l'octet sur le port série Command = int(self. ServoPos.get())//10 # Lecture de l'entrée du champ et retourne int Command = struct.pack(' >B', Command) # Transformer l'int en octet self. Ser.write(Command) # Ecrire l'octet sur le port série

De plus, l'analyse des données prend du temps (par exemple, interpréter quatre octets "1", "2", "3" et "0" comme l'int 1230, pas comme quatre caractères différents) et il est préférable de ne pas le faire sur l'Arduino.

Côté Arduino, les informations envoyées sont récupérées comme suit:

if(Serial.available()>1){ // Si des données série sont disponibles, la boucle est saisie c = Serial.read(); // Le premier octet (numéro de servo) est enregistré dans une variable Micros = Serial.read(); // La position du servo est enregistrée ici Micros = Micros * 10; }

Conseillé: