Table des matières:

Programmation d'un robot Micro:Bit et d'un joystick:Bit Controller avec MicroPython : 11 étapes
Programmation d'un robot Micro:Bit et d'un joystick:Bit Controller avec MicroPython : 11 étapes

Vidéo: Programmation d'un robot Micro:Bit et d'un joystick:Bit Controller avec MicroPython : 11 étapes

Vidéo: Programmation d'un robot Micro:Bit et d'un joystick:Bit Controller avec MicroPython : 11 étapes
Vidéo: Управление серводвигателем с помощью кнопки: перемещение сервопривода и возврат SPB-1 2024, Juillet
Anonim
Programmation d'un Micro:Bit Robot & Joystick:Bit Controller avec MicroPython
Programmation d'un Micro:Bit Robot & Joystick:Bit Controller avec MicroPython

Pour Robocamp 2019, notre camp d'été de robotique, des jeunes de 10 à 13 ans soudent, programment et construisent un « robot fourmi » basé sur un micro:bit BBC, ainsi qu'un micro:bit à utiliser comme télécommande.

Si vous êtes actuellement à Robocamp, passez à l'étape 3, car nous avons effectué les deux premières étapes en groupe

Ceci est un guide étape par étape pour faire communiquer un robot micro:bit avec un contrôleur joystick:bit.

Il ne prend pas le chemin le plus rapide pour que tout fonctionne, mais essaie les choses par petits morceaux afin que vous puissiez tester le code au fur et à mesure, y apposer votre propre empreinte et comprendre pourquoi nous faisons les choses que nous faisons !

Pour cette activité, nous utilisons notre propre robot personnalisé, mais il fonctionnera avec n'importe quel robot utilisant un pilote de moteur similaire, tel qu'un L9110s.

Les fichiers de conception de notre robot sont disponibles ici:

Ce guide est écrit pour les débutants, mais si vous n'avez jamais utilisé un micro:bit avec MicroPython auparavant, nous vous recommandons d'essayer d'abord un programme plus simple, tel que notre badge nominatif Instructable: https://www.instructables.com/id/Felt -Microbit-Nom…

Fournitures

2x BBC micro:bit

Robot qui fonctionne avec un BBC micro:bit (voir explication ci-dessus)

joystick: contrôleur de bits (nous avons le nôtre de Cool Components)

Étape 1: configuration du robot

Vous avez quelques options pour écrire du code MicroPython pour votre micro:bit:

  • Mu, que vous pouvez télécharger et installer ici:
  • L'éditeur en ligne, que vous pouvez retrouver ici:

Ces instructions supposent que vous utilisez Mu

Ouvrez Mu et branchez votre micro:bit sur votre ordinateur. Mu doit reconnaître que vous utilisez un micro:bit et sélectionnez le « Mode » micro:bit, mais si ce n'est pas le cas, modifiez-le manuellement.

choisir le mode
choisir le mode

Obtenez une copie du code de test du moteur du robot à partir d'ici:

Si vous n'êtes pas habitué à Github, cela peut ne pas être intuitif ! Voici deux façons simples d'obtenir ce code:

  1. Enregistrez le fichier Raw sur votre ordinateur, puis chargez-le dans Mu:
  2. Copiez et collez tout le code donné dans un nouveau fichier dans Mu.
enregistrer le fichier brut
enregistrer le fichier brut

Cliquez maintenant sur le bouton 'Flash' de la barre d'outils de Mu, pour envoyer votre nouveau code au micro:bit.

Cela ne fonctionnera que si le micro:bit est branché

Le voyant jaune à l'arrière du micro:bit commencera à clignoter. Une fois terminé, votre code a été transféré.

CONFIGURATION DES DIRECTIONS DU MOTEUR

Ce programme allumera les moteurs dans différentes directions lorsque vous appuyez sur le bouton « A » du micro:bit.

Ce que tu veux qu'il se passe c'est:

  • Lorsque 'A' est affiché, le moteur gauche avance
  • Lorsque « B » est affiché, le moteur gauche vers l'arrière
  • Lorsque « C » est affiché, le moteur droit avance
  • Lorsque « D » est affiché, le moteur droit vers l'arrière

Ce ne sera probablement pas le cas, car cela dépend de la façon dont vous avez câblé votre robot !

En haut du code, vous trouverez une liste de variables, qui déterminent quelle broche sur le micro:bit contrôle quelle direction du moteur.

Si vous utilisez l'un de nos robots (fichiers), échangez les noms de variables pour que le robot se déplace dans les bonnes directions:

permuter les variables de broche
permuter les variables de broche

Si vous utilisez votre propre robot, vérifiez à quelles broches le pilote du moteur est connecté avant de modifier le code.

TESTER L'ENTRAÎNEMENT

Vérifiez maintenant comment votre robot conduit en remplaçant le code de test dans la boucle principale par votre propre code.

Vous dites au robot de conduire en appelant la fonction drive(). Cela prend deux arguments - une valeur pour le moteur gauche et une valeur pour les moteurs droits, entre 0 (arrêt) et 1023 (vitesse max).

En appelant drive(500, 500), par exemple, vous dites aux deux moteurs de s'allumer, en marche avant, à environ la moitié de la vitesse.

Essayez quelques options pour avoir une idée de sa conduite droite et de sa vitesse de rotation.

Astuce: les tests de moteur étaient à la fois dans une boucle while True et dans une instruction if - les moteurs ne tourneraient pas tant que vous n'auriez pas appuyé sur le bouton A du micro:bit, et il vérifie en permanence si vous avez appuyé sur le bouton A.

Astuce: les moteurs ne s'éteindront pas tant que vous ne le leur aurez pas demandé ! Ils continueront toujours à faire leur dernière instruction.

EN OPTION: AMÉLIORER LA CONDUITE EN LIGNE DROITE

Si votre robot ne conduit pas en ligne droite, l'un de vos moteurs peut tourner plus vite que l'autre.

Après avoir vérifié que rien n'empêche physiquement la roue de tourner librement, vous pouvez modifier le code dans la fonction d'entraînement pour réduire la vitesse du moteur le plus rapide.

Faites défiler vers le haut pour trouver la définition de la fonction d'entraînement et regardez les deux premières instructions:

def lecteur (L, R):

# Ci-dessous se trouve un ajustement pour corriger l'écart de vitesse du moteur L = int(L*1) R = int(R*1)

Ces deux lignes prennent actuellement la valeur de L et R, multipliez-les par 1, puis assurez-vous qu'elles sont toujours des nombres entiers (int).

Par exemple, si votre moteur gauche est plus rapide, remplacez *1 sur sa ligne par *0.9 et voyez si cela améliore les choses.

Vous ne pourrez pas le rendre parfait, mais vous pouvez continuer à l'ajuster jusqu'à ce qu'il roule plus droit.

CONFIGURATION DE LA RADIO

Configurez maintenant la radio en ajoutant les lignes suivantes en haut de votre code:

importer une radio

radio.config(canal=7, groupe=0, file=1) radio.on()

Cela permettra à votre robot de recevoir des instructions d'un autre micro:bit, mais pour le moment il recevra des instructions de n'importe quel autre micro:bit.

En effet, le canal 7 et le groupe 0 sont les canaux par défaut.

Modifiez ces nombres en choisissant un canal entre 0-82 et un groupe entre 0-255. Désormais, votre micro:bit ne recevra que les instructions des autres utilisateurs avec les mêmes informations de configuration.

queue=1 signifie que le micro:bit ne conservera qu'un seul message entrant à la fois - cela donne un temps de réponse légèrement plus rapide que la valeur par défaut, qui est de 3.

Maintenant, vous devez modifier votre code de boucle principale pour, au lieu d'exécuter des instructions lorsque vous appuyez sur un bouton, attendez un message radio entrant et répondez de manière appropriée.

Essayez le code suivant comme test (il ne fera rien tant que vous n'aurez pas configuré le joystick à l'étape 2):

tant que vrai:

message = radio.receive() si message == 'forward': drive(500, 500)

Étape 2: configuration du joystick

Débranchez le micro:bit de votre robot et branchez le micro:bit de votre joystick à la place

Obtenez une copie du code de configuration du joystick à partir d'ici:

Configurez la radio en utilisant la même configuration (canal et numéro de groupe) que vous l'avez fait pour le robot - cela permettra aux deux de communiquer entre eux.

A la fin du programme, démarrez votre boucle principale:

tant que vrai:

si button_a.was_pressed(): radio.send('forward')

Ce code n'utilise pas encore le joystick:bit. Il utilise le bouton A sur le micro:bit pour envoyer un message.

Assurez-vous que votre robot et votre contrôleur micro:bits sont alimentés, puis appuyez sur le bouton pour envoyer votre message.

Si le message est bien reçu et que votre robot se déplace… bravo ! Vous avez terminé avec les instructions de configuration.

DES CONSEILS DE DÉPANNAGE

Si vous obtenez un message d'erreur sur votre contrôleur micro:bit… déboguez le code de votre contrôleur

Si vous obtenez un message d'erreur sur votre robot micro:bit… votre message radio a été envoyé avec succès ! Mais le robot ne peut pas le comprendre, alors vérifiez que le message que vous avez envoyé et le message que vous avez dit au robot d'écouter correspondent.

Si rien ne se passe du tout

  • Assurez-vous d'avoir flashé le bon code sur chaque micro:bit - il est facile de flasher accidentellement le mauvais !
  • Assurez-vous que vos numéros de chaîne et de groupe correspondent sur chaque micro:bit

Étape 3: Vérification des valeurs du joystick

Les prochaines étapes utilisent toutes le code du contrôleur

Avant de pouvoir utiliser le joystick sur votre contrôleur, vous devez savoir quels types de valeurs vous obtenez lorsque vous appuyez sur le joystick.

Remplacez votre boucle principale par le code suivant:

tant que vrai:

joystick = joystick_push() print(joystick) sleep(500)

Flashez ce code sur votre micro:bit, puis cliquez sur le bouton REPL dans la barre d'outils de Mu. Cela ouvrira un terminal en bas de l'éditeur, qui vous donnera un lien en temps réel vers le micro:bit.

ouvrir le REPL
ouvrir le REPL

Cela ne fonctionnera que si le micro:bit est branché

Avec le REPL ouvert, appuyez sur le bouton de réinitialisation à l'arrière de votre micro:bit.

Image
Image

Vous devriez voir certaines valeurs s'afficher sur votre écran:

valeurs dans le terminal
valeurs dans le terminal

Poussez le manche du joystick et voyez ce qui arrive aux chiffres.

Notez les valeurs données lorsque le joystick est en position centrale - dans mon cas (518, 523).

Cliquez à nouveau sur le bouton REPL de la barre d'outils de Mu pour le fermer - vous ne pourrez pas flasher de nouveau code sur le micro:bit tant qu'il est ouvert.

Étape 4: Ajustement des variables X et Y

Vous souhaitez modifier les valeurs données par la fonction joystick, pour que:

  • au centre c'est zéro
  • c'est positif
  • le bas est négatif.

Cela correspond aux instructions dont le robot a besoin - un nombre positif pour avancer et un nombre négatif pour reculer.

Regardez les chiffres que vous avez obtenus à la dernière étape. Le premier nombre est x et le deuxième nombre est y.

Modifiez la définition joystick_push() qui est déjà dans le programme, pour réduire vos valeurs par rapport à l'original:

def joystick_push():

x = pin0.read_analog() - 518 y = pin1.read_analog() - 523 return x, y

Utilisez vos propres numéros, ils peuvent être différents des miens

Flashez votre nouveau code, ouvrez le REPL, appuyez sur le bouton de réinitialisation du micro:bit et vérifiez vos valeurs.

Obtenez-vous (0, 0) ?

Étape 5: Conversion de X et Y en valeurs pour les moteurs gauche et droit

Pour le moment, ce joystick ne sera pas très utile pour piloter un robot. Poussé jusqu'au bout, vous obtiendrez une valeur telle que (0, 500).

Si vous donniez ces chiffres au robot, il mettrait en marche le moteur de droite mais pas celui de gauche, ce qui n'est pas ce que vous voulez qu'il se produise !

Ce diagramme montre ce qui arrive aux valeurs x et y lorsque vous déplacez le joystick, et ce que nous voulons que le robot fasse lorsque vous déplacez le joystick.

diagramme
diagramme

Vous devez utiliser des mathématiques pour mélanger les valeurs x et y, pour vous donner quelque chose de plus utile.

m

LES MATHS

Commençons par pousser le joystick à fond.

Voici un exemple des valeurs que vous pourriez obtenir:

x = 0

y = 500

Pour être utile au robot, vous voulez obtenir des valeurs comme celles-ci:

gauche = 500

droite = 500

Essayons d'ajouter x et y de différentes manières pour voir quels nombres nous obtenons:

x + y = 0 + 500 = 500

x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500

Voyons maintenant ce qui se passe si nous poussons le joystick complètement vers la droite.

Voici un exemple des valeurs que vous pourriez obtenir:

x = 500

y = 0

Pour faire tourner le robot à droite, vous voulez que le moteur gauche avance et que le moteur droit recule:

gauche = 500

droite = -500

Essayons à nouveau notre formule:

x + y = 500 + 0 = 500

x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500

Comparez les deux ensembles de formules pour déterminer quelle option vous donnera la bonne valeur à gauche et quelle option vous donnera la bonne valeur à droite.

Essayez-le avec certaines des valeurs que vous obtenez de votre propre joystick, pour vous assurer que la formule que vous choisissez fonctionne tout le temps.

m

ÉLARGISSEMENT DE LA FONCTION JOYSTICK

Développez et modifiez la fonction du joystick pour créer deux nouvelles variables pour la gauche et la droite, et pour renvoyer ces valeurs au lieu de x et y:

def joystick_push():

x = pin0.read_analog() - 518 y = pin1.read_analog() - 523 gauche = droite = retour gauche, droite

Flashez votre nouveau code, ouvrez le REPL, appuyez sur le bouton de réinitialisation du micro:bit et vérifiez vos valeurs.

Obtenez-vous les valeurs que vous attendez?

Si vous avez besoin d'aide supplémentaire, consultez notre exemple de code ici:

Étape 6: Envoi des valeurs sous forme de messages radio

Vous avez maintenant quelques valeurs prêtes à être envoyées à votre robot.

Modifiez votre boucle principale, afin qu'elle vérifie les valeurs du joystick, mais au lieu d'imprimer les valeurs, elle les prépare à être envoyées sous forme de message radio.

tant que vrai:

joystick = joystick_push() message = str(joystick[0]) + " " + str(joystick[1])

Cela n'enverra pas encore le message !

Que se passe-t-il dans cette nouvelle ligne de code ?

  • joystick[0] signifie le premier bit d'information qui sort de la fonction joystick (gauche)
  • joystick[1] est le bit d'information suivant (à droite)
  • str() convertit ces deux nombres au format chaîne (texte au lieu de nombres) - cela est nécessaire pour pouvoir envoyer les informations par radio.

Vous serez habitué à voir + pour signifier une addition - il peut à la fois additionner des nombres et concaténer des chaînes, ce qui signifie qu'il collera les deux bits d'information ensemble.

Exemple:

150 + 100 = 250

str(150) + str(100) = 150100

Ainsi, la concaténation collera vos valeurs gauche et droite ensemble.

Pour forcer une séparation entre les deux bits d'information (afin que le robot sache qu'il s'agit de deux bits d'information), concaténez une chaîne supplémentaire entre eux en utilisant " ". Les marques de parole autour de l'espace signifient qu'il s'agit déjà d'une chaîne.

Enfin, étendez votre code pour envoyer ce message nouvellement créé à la radio:

radio.send(message)

dormir(10)

Le sommeil ralentit l'envoi des messages afin que le micro:bit récepteur ne soit pas surchargé de trop d'informations !

Flashez ce code sur votre contrôleur micro:bit et déboguez toutes les erreurs avant de passer à l'étape suivante

Étape 7: Réception des messages sur votre robot

Reprenez le code de votre robot depuis le début - n'oubliez pas de débrancher votre contrôleur micro:bit afin de ne pas y faire clignoter accidentellement le code du robot

Faites défiler jusqu'à votre boucle principale - supprimez le code de test et ajoutez ceci à la place:

tant que vrai:

message = radio.receive() print(message) sleep(100)

Cela définit une variable égale au message entrant et imprime le message au REPL - pour vérifier que les messages arrivent comme prévu.

Flashez votre nouveau code, connecté au REPL, puis poussez le joystick.

Vous devriez obtenir quelque chose comme ceci:

Valeurs REPL
Valeurs REPL

DES CONSEILS DE DÉPANNAGE

Si vous obtenez un message d'erreur sur votre contrôleur micro:bit… déboguez le code de votre contrôleur

Si vous obtenez un message d'erreur sur votre robot micro:bit… votre message radio a été envoyé avec succès ! Mais le robot ne peut pas le comprendre, alors vérifiez que le message que vous avez envoyé et le message que vous avez dit au robot d'écouter correspondent.

Si rien ne se passe du tout

  • Assurez-vous d'avoir flashé le bon code sur chaque micro:bit - il est facile de flasher accidentellement le mauvais !
  • Assurez-vous que vos numéros de chaîne et de groupe correspondent sur chaque micro:bit

Étape 8: Utilisation des messages entrants pour contrôler les moteurs du robot

Vous obtenez maintenant deux numéros envoyés à la radio sous forme de chaîne.

Vous devez diviser ce message en deux chaînes, puis reconvertir les chaînes en nombres et les transmettre à la fonction d'entraînement. Il se passe beaucoup de choses à la fois !

Avant de faire cela, vous devez vérifier que le message que vous recevez est dans le bon format.

Si aucun message n'est envoyé, vous recevrez "Aucun" à la place. Si vous essayez de diviser cela, vous obtiendrez un message d'erreur.

tant que vrai:

message = radio.receive() si le message n'est pas None: message = message.split() drive(int(message[0]), int(message[1]))

Que se passe-t-il ici?

  • Le nouveau code s'exécutera si le message est autre que « Aucun ».
  • message.split() recherche un espace dans le message (que nous avons ajouté à la dernière étape) et l'utilise pour diviser le message en deux.
  • int(message[0]), int(message[1]) fait le contraire de ce que nous avons fait à l'étape précédente - obtient chaque information individuellement et la convertit en un entier (un nombre entier).
  • int(message[0]) est utilisé comme valeur pour le moteur gauche dans la fonction d'entraînement, et int(message[1]) est utilisé comme valeur pour le moteur droit.

Vérifiez que cela fonctionne - les moteurs tournent-ils lorsque vous appuyez sur le joystick ?

Sinon, c'est l'heure du débogage !

Si oui, fantastique ! Vous avez un robot télécommandé qui fonctionne !

Passez un peu de temps à vous entraîner avec votre robot avant de passer à l'étape suivante. Conduit-il comme vous l'attendez ?

Les prochaines étapes vous montreront comment utiliser les boutons du joystick pour ajouter des fonctionnalités supplémentaires à votre robot

Si vous voulez voir notre version de ce code jusqu'à présent:

  • Robot:
  • Contrôleur:

Étape 9: Utilisation des boutons – Réception de messages supplémentaires

Pour le moment, votre code essaiera de diviser tout message qui n'est pas Aucun. Cela signifie que s'il reçoit, par exemple, « bonjour », vous obtiendrez un message d'erreur.

Pour permettre à votre micro:bit d'interpréter d'autres messages, il devra d'abord vérifier chaque message attendu, puis diviser le message uniquement s'il n'a pas été invité à en faire autre chose.

Développez votre code comme ceci:

si le message n'est pas Aucun:

if message == 'bonjour': display.show(Image. HAPPY) elif message == 'canard': display.show(Image. DUCK) else: message = message.split() drive(int(message[0]), int(message[1]))

Tout d'abord, il vérifiera s'il a reçu le message « bonjour ». Si c'est le cas, il affichera une image heureuse, puis reviendra en haut de la boucle et vérifiera le message suivant.

Si le message n'est pas bonjour, il vérifiera ensuite si le message est « canard ».

Si le message n'est pas « bonjour » OU « canard, il fera la dernière chose sur la liste, qui divisera le message et allumera les moteurs. Il n'essaiera pas de diviser le message s'il a reçu « bonjour » ou « canard », ce qui signifie que vous ne recevrez pas de message d'erreur de l'un de ces deux messages.

Le double signe égal est important - cela signifie « est égal à », par rapport à un seul signe égal, qui définit quelque chose (donc message = « bonjour » signifie que nous définissons la variable sur « bonjour », message == « bonjour » signifie que nous demandons si le message est égal à « bonjour »).

Essayez-le avec seulement deux options pour le moment, pour le tester - vous pouvez ajouter autant d'autres messages que vous le souhaitez plus tard.

Lien vers le code de travail:

Étape 10: Envoi de messages supplémentaires à l'aide des boutons du contrôleur

Débranchez le micro:bit de votre robot et branchez le micro:bit de votre joystick à la place

Revenez à votre code de contrôleur pour le modifier.

Semblable au code du robot, nous voulons que le contrôleur vérifie si vous essayez d'envoyer d'autres messages, avant d'envoyer les valeurs du joystick.

En haut de la boucle, nous voulons toujours qu'il vérifie les valeurs actuelles du joystick, mais nous voulons également qu'il vérifie si un bouton est actuellement enfoncé:

tant que vrai:

joystick = joystick_push() bouton = button_press()

button_press() renvoie une valeur A, B, C, D, E ou F selon le bouton actuellement enfoncé (si rien n'est enfoncé, il renvoie None).

Maintenant, nous pouvons faire une instruction if-elif-else, comme nous l'avons fait pour le code du robot - en utilisant deux boutons et en envoyant la valeur du joystick si aucun bouton n'est enfoncé.

si bouton == 'A':

radio.send('bonjour') sleep(500) bouton elif == 'B': radio.send('duck') sleep(500) else: message = str(joystick[0]) + " " + str(joystick [1]) radio.envoi (message) sommeil(10)

Lorsqu'un bouton est enfoncé, envoyez l'un des messages que vous avez demandé au robot de rechercher à l'étape précédente.

Le message sera envoyé chaque fois que le bouton est enfoncé, et les ordinateurs sont beaucoup plus rapides que les gens ! Il peut donc envoyer le message plusieurs fois avant que vous n'ayez réussi à retirer votre doigt du bouton.

Le sommeil après l'envoi du message le ralentit, de sorte qu'il ne vérifiera plus le bouton si rapidement - essayez quelques chiffres ici pour obtenir le temps parfait pour vous - trop lentement et il ne répondra pas non plus rapidement et votre robot recevra tellement de messages de bouton qu'il pourrait cesser de répondre au joystick !

Est-ce que ça marche?

Si vous recevez des messages d'erreur, réfléchissez bien à ce que vous venez de changer et à ce qui se passe.

Si vous obtenez une erreur sur le robot lorsque vous appuyez sur un bouton de votre contrôleur, vous savez que le message passe, mais cela perturbe le robot. Vérifiez que le message que vous avez envoyé et le message que vous avez demandé au robot de rechercher sont les mêmes.

Lien vers le code de travail:

Étape 11: Étapes suivantes

Vous avez maintenant les connaissances nécessaires pour travailler avec les moteurs de votre robot et avec votre joystick:bit controller

Utilisez ces connaissances pour améliorer les deux programmes et vous les approprier. Quelques idées ci-dessous !

Vous avez six boutons sur votre manette ! Que voulez-vous qu'ils fassent ?

  • Que diriez-vous de programmer une routine de danse pour votre robot à faire sur commande ? Écrivez un algorithme de commandes drive(), séparées par des commandes sleep() !
  • Voulez-vous changer la direction dans laquelle le robot se déplace pour qu'il puisse facilement rouler à l'envers ? Pensez aux valeurs x et y de votre joystick. Que représentent-ils et comment pourriez-vous les manipuler ?
  • Votre robot a-t-il (ou pourriez-vous ajouter !) des fonctionnalités supplémentaires telles que des LED, un haut-parleur ou des capteurs ?

Idées pour améliorer le code

  • Pourriez-vous aider votre robot à gérer les messages inconnus en utilisant le code try/except ?
  • Les calculs utilisés pour calculer les valeurs gauche et droite du joystick ne nous donnent pas toute la plage de valeurs (le lecteur du robot peut accepter un nombre jusqu'à 1023). Pouvez-vous modifier ce code pour obtenir une meilleure plage ?
  • Il existe d'autres méthodes pour mélanger les valeurs du joystick - pouvez-vous trouver une meilleure façon de le faire ?

Conseillé: