Table des matières:

Un robot à 4 roues motrices piloté via une manette de jeu USB à distance : 6 étapes
Un robot à 4 roues motrices piloté via une manette de jeu USB à distance : 6 étapes

Vidéo: Un robot à 4 roues motrices piloté via une manette de jeu USB à distance : 6 étapes

Vidéo: Un robot à 4 roues motrices piloté via une manette de jeu USB à distance : 6 étapes
Vidéo: Elle Était Coincée Donc Ce Policier L'aide 2024, Juin
Anonim
Image
Image

Pour mon prochain projet de robotique, j'ai été obligé d'architecte/concevoir ma propre plate-forme robotique en raison de circonstances imprévues.

L'objectif est qu'il soit autonome, mais d'abord, j'avais besoin de tester ses capacités de conduite de base, alors j'ai pensé que ce serait un projet annexe amusant de se comporter et d'être contrôlé comme s'il s'agissait d'un véhicule RC (radiocommandé)., mais utilisez plutôt une manette de jeu USB.

Les résultats ont été à peu près aussi bons ou meilleurs que ce à quoi je m'attendais.

L'avantage d'emprunter la voie de la manette de jeu USB, avec beaucoup de programmation, est que je peux la personnaliser et l'ajouter à ce que j'ai déjà fait. Je n'ai aucune expérience réelle dans la construction d'un véhicule RC, mais j'imagine que l'on est à peu près coincé avec l'émetteur RC (joysticks/boutons, etc.) et le récepteur RC fournis.

Par exemple, j'ai ajouté une certaine reconnaissance du fait que le robot a heurté un mur, simplement en demandant au logiciel de détecter des courants élevés et des valeurs de vitesse d'encodeur faibles.

En option, on peut ajouter des webcams USB au robot, en fonction du nombre et de leur emplacement, on peut conduire le robot dans le salon et dans une autre pièce, tout en étant assis ailleurs devant l'ordinateur auquel la manette de jeu USB est connectée. ce.

Ce Instructable ne sera pas un vrai, détaillé, tout compris, étape par étape, mais je vais essayer de donner autant de détails que possible.

Fournitures

Pièces suggérées: la plupart de ces éléments ont été obtenus auprès de Servo City (Actobotics).

2 - canaux en U de 13,5 , pour les côtés du châssis de base. Les moteurs sont montés sur celui-ci. J'ai choisi quelque chose de plus court et mes moteurs sont montés dans les coins mêmes, ce qui rendait leur montage difficile.

2 - profilés en U de 12 pour l'avant et l'arrière du cadre de base.

2 - 15 profilés en U pour les pare-chocs, avant et arrière

2 - 7 (ou était-ce 7,5 ?) U-canaux pour les colonnes avant. Ce n'est pas trop critique, les longueurs peuvent varier. Cela dépend de la hauteur des colonnes arrière et à quelle hauteur vous choisissez de mettre l'angle U-canal qui se connecte entre eux.

2 - (longueur ?) U-canaux pour l'élément coudé, d'avant en arrière, reliant les colonnes verticales. Celui-ci est essentiel, car Servo City / Actobotics vend des panneaux ou des supports inclinés à 45 degrés à cet effet, mais vous devrez faire quelques calculs / trig pour vous assurer d'obtenir les bonnes longueurs.

2 - (longueur ?) U-canaux pour servir de pare-chocs latéraux de niveau supérieur, encore une fois, cela dépend de ce que vous faites avec la base

2 - (longueur ?) U-canaux pour servir de pare-chocs avant et arrière de niveau supérieur, idem question ci-dessus.

1 - (longueur ?) U-canal pour servir de membre le plus haut, s'étend sur les colonnes arrière. Celui-ci n'est peut-être pas trop critique, puisque vous pouvez le monter sur le dessus, ou devant/derrière les colonnes verticales.

12 (environ) canaux en L ou supports. Ceux-ci servent à plusieurs fins, mais fournissent essentiellement une intégrité/résistance structurelle aux coins du cadre de base ET des colonnes verticales.

4 (+?) profilés plats de 3 à 5 trous. Ceux-ci fournissent également une résistance structurelle au robot.

ServoCity vend deux principaux types d'écrans plats de grande surface, utiles pour une utilisation en tant que bac de protection inférieur ou supérieur à l'endroit où votre batterie et/ou vos contrôleurs seraient placés, ou même pour une surface supérieure pour les capteurs.

Il y a un panneau de 4 (4,5 ?)" X 12", et je pense que l'autre est un panneau de 9 (9,5 ?)" X 12.

Maintenant, c'est là que les choses deviennent intéressantes, et peuvent être déroutantes et coûteuses (les petites pièces s'additionnent). Tous les canaux, etc., peuvent être reliés les uns aux autres via ces pièces de connexion, qui sont au nombre de PLUSIEURS. C'est là que je suis désolé de ne pas avoir une liste de pièces complète, détaillée et spécifique.

Et le truc, c'est que… vous ne savez pas vraiment de quoi vous pourriez avoir besoin, ni de combien… parce qu'il y a tellement de façons d'assembler ces pièces.

Je peux lister ce que j'ai utilisé:

www.servocity.com/90-quad-hub-mount-c

www.servocity.com/side-tapped-pattern-moun…

www.servocity.com/90-quad-hub-mount-d

Les deux suivants sont très pratiques, et je voudrais juste faire le plein de ceux-ci:

www.servocity.com/single-screw-plate

www.servocity.com/dual-screw-plate

Vient ensuite toutes les vis (boulons). J'ai commencé avec un paquet de CHAQUE taille, et j'en ai parcouru la plupart. J'ai utilisé des vis plus longues là où la taille n'avait pas d'importance et j'ai réservé les plus courtes là où elles étaient REQUISES car aucune autre longueur ne fonctionnerait.

Enfin, vous devriez obtenir 1 sac de ceux-ci:

www.servocity.com/6-32-nylock-nuts-pack

Je n'en ai pas utilisé beaucoup, mais ils (je pense) sont essentiels pour s'assurer que vos moteurs ne vibrent pas du cadre au fil du temps. Seulement deux fonctionneraient par moteur, en raison du canal en U

Vous aurez besoin d'au moins 4 d'entre eux, vous pourriez en obtenir un ou deux supplémentaires au cas où vous en causeriez un (croyez-moi, vous pourriez allumer/débrancher les moteurs plusieurs fois):

www.servocity.com/heavy-duty-clamping-shaf…

En règle générale, les arbres des moteurs mesurent 6 mm et les essieux mesurent 1/4 po (0,25 in).

J'obtiendrais des vis noires, soi-disant plus solides, et je les utiliserais pour les pinces ci-dessus, et je n'utiliserais PAS les vis fournies avec les pinces:

(Je pense que ce sont ceux-là):

4 - roulements de 1/4" (0,25") de diamètre

1 - sachet d'entretoises noires 1/4"

4 - Serrage D-Hubs

www.servocity.com/0-770-clamping-d-hubs

4 - Arbres en D (#6340621.375" (1-3/8")

4 - Roues robustes de 6"

www.servocity.com/6-heavy-duty-wheel

Notez que j'adore ces roues mais qu'elles ont un bord en caoutchouc dur. Ils semblent bien se débrouiller sur les sols durs, les tapis et probablement les trottoirs en béton dur. Ne va pas bien sur l'herbe, le sable, etc.

AUSSI, ils auront tendance à salir votre tapis !!!

4 - moteurs:

www.servocity.com/motors-actuators/gear-mo…

J'y suis allé avec le 223 RPM, bonne vitesse de pointe en intérieur, je pouvais également déplacer mon robot (lourd avec 2 batteries SLA 12V) assez facilement au ralenti.

2 - encodeurs moteurs pour les moteurs. (Le Roboclaw de Servo City ne gère que 2 encodeurs)

1 - Contrôleur de moteur Roboclaw 2X45A, assurez-vous d'avoir celui avec les borniers verts dessus, pas les broches…. eh bien… chacun a ses avantages. Rétrospectivement.. J'ai peut-être eu les épingles.

Je pense que c'est tout de Servo City.

SparkFun vend Arduino Uno (c'est ce que j'ai utilisé), ainsi que Redboard Artemis en tant que gestionnaire de lecteur.

Vous aurez besoin d'un Raspberry Pi 3 (ou 4 ?) comme "cerveau" de haut niveau et comme interface avec vous.

Vous aurez besoin de câblage, d'interrupteurs, de fusibles et d'une diode "flyback" très robuste.

J'ai utilisé une batterie SLA à décharge profonde Duracell 12V 14AH, mais vous pouvez utiliser n'importe quoi.

ATTENTION! La conception de ce robot (TALL et WIDE, mais COURT), suppose une sorte de centre de gravité lourd, comme le fournirait une batterie SLA. Cela peut ne pas bien fonctionner avec ces autres types de batteries de technologie plus récente. LiPo, Lion, etc. Il pourrait facilement basculer.

De Pololu, j'ai reçu quelques adaptateurs de prise cylindrique, afin que je puisse alimenter indépendamment l'Arduino et/ou le Redboard, même s'ils seraient connectés au Raspberry via USB, car je ne voulais pas avoir à compter sur l'alimentation du Raspberry. (En particulier le montage de caméras, de capteurs, etc.)

Vous aurez besoin d'un régulateur de tension abaisseur de 12 à 5 V, minimum 5 A (?) pour le Raspberry. Les autres peuvent gérer n'importe quoi entre 7 et 15V donc directement sur la batterie SLA.

C'est à peu près tout pour les pièces.

Ce que je ne ferais PAS - un engrenage biseauté à 90 degrés.

Encore une fois, il y a de nombreuses vidéos dans ma liste de lecture youtube Robotics détaillant la plupart de ce qui précède.

Étape 1: Construction

Franchement, toutes mes étapes de construction sont déjà sous forme de youtubes. Vous pouvez les voir dans ma liste de lecture Robotics, à partir de "Wallace Robot 4". Les précédents (Wallace II, Wallace III) ont aussi du bon matériel

www.youtube.com/playlist?list=PLNKa8O7lX-w…

Étape 2: Testez le Roboclaw, les moteurs et les encodeurs

Les fabricants de Roboclaw (BasicMicro) ont une application Windows que vous pouvez utiliser pour vous assurer que vous avez correctement câblé les moteurs et les encodeurs au Roboclaw. Vous connecterez des moteurs du même côté en parallèle au Roboclaw. Vous pouvez choisir d'utiliser les fils de l'encodeur, uniquement sur les moteurs arrière ou les moteurs avant, ou peut-être même mieux - EN DIAGONALE.

La raison de ma suggestion est liée (plus tard) à la recherche d'un robot bloqué. Avoir un statut en diagonale indiquant si les roues avant/arrière tournent/ne tournent pas peut être mieux que juste l'avant ou juste l'arrière.

REMARQUE: ce que je n'ai PAS fait, c'est d'utiliser l'Arduino pour se connecter également (via des broches GPIO) aux encodeurs - si vous l'avez fait, vous pourriez avoir le Roboclaw gérer 2 encodeurs, puis l'Arduino gérer les deux autres, et juste interrogez le Roboclaw pour ses deux valeurs d'encodeur (et vitesses).

REMARQUE: j'ai utilisé l'application de BasicMicro pour pré-configurer le Roboclaw pour la montée/la descente en montée. C'est bon pour protéger le matériel et l'électronique. Il y a une vidéo à ce sujet dans ma playlist Robotics.

J'ai failli oublier: j'ai aussi acheté des câbles bullet-connector qui vont entre les câbles du moteur, et le Roboclaw. REMARQUE: si vous faites cela, vous remarquerez que la longueur totale du câble est VRAIMENT LONGUE. Mais je ne voulais pas avoir à en couper si je n'en avais pas besoin. J'ai rencontré (pour les étapes ultérieures) des problèmes de communication avec l'USB entre le Raspberry et l'Arduino, probablement à cause du bruit EMI.. mais j'ai contourné cela avec un logiciel.

Si cela devient un problème, vous pouvez couper les fils - vous pouvez également acheter un blindage métallique (d'Amazon, 1 de diamètre).

Dernière chose: je n'ai pas encore fait cela --- configurer ou régler automatiquement le Roboclaw (à l'aide d'encodeurs) afin que les moteurs gauche et droit se déplacent à la même vitesse et que le robot aille tout droit.

Le mien se courbe très légèrement sur environ 12 pieds, mais pas assez pour que je ressente le besoin de faire quoi que ce soit à ce sujet.

Étape 3: Ajout et programmation de l'Arduino

Vous aurez besoin de la prise cylindrique et de quelques câbles, ainsi que d'un câble USB. Assurez-vous d'avoir le bon pour le connecteur Arduino.

Vous devrez télécharger l'IDE Arduino.

Ici à Github est le dernier croquis qui gère la conduite du robot:

github.com/elicorrales/wallace.robot.ardui…

Vous connecterez l'Arduino à votre ordinateur exécutant l'IDE, et en fonction de la façon dont le croquis est écrit, vous utiliseriez les broches 10 et 11 sur l'Arduino pour les communications série (Software Serial) avec le Roboclaw.

J'ai développé un protocole de communication simple entre le Raspberry Pi et l'Arduino.

Il est basé sur des caractères ASCII, ce qui facilite le débogage et le test en utilisant simplement la fenêtre "moniteur série" de l'IDE Arduino.

Les commandes commencent au numéro "0" (zéro) et montent juste au besoin

Les commandes commençant par les "20" sont des commandes Roboclaw directes, et celles en dessous de ce nombre sont des commandes strictement liées à Arduino.

En raison du bruit EMI, j'ai amélioré la chaîne de commande pour inclure une somme de contrôle.

Ainsi, toute chaîne comprendra:

# nombre de jetons dans la chaîne dont celui-ci

la somme de contrôle

Exemple, disons que vous voulez que l'Arduino réponde avec son menu de commandes:

4 0 12 16

"4" correspond à quatre jetons dans une chaîne.

"0" est la commande MENU.

"12" est le nombre aléatoire que j'ai choisi.

"16" est la somme de 4 + 0 + 12.

Cette même commande MENU pourrait être différente:

4 0 20 24

Parce que j'ai choisi un nombre aléatoire différent, la somme de contrôle est également différente.

Exemple, supposons que vous vouliez avancer à 100 % de vitesse:

5 29 0 134 100

"5" cinq jetons

"29" la commande FORWARD

"0" le nombre aléatoire

"134" la somme de contrôle

"100" le paramètre 1 (la vitesse dans ce cas)

Si l'Arduino ne peut pas vérifier cette chaîne entrante, il la laisse simplement tomber/l'ignore, pas de réponse.

Si l'Arduino ne reçoit pas une prochaine commande de mouvement avec X millisecondes, il envoie un moteur d'ARRÊT au Roboclaw.

L'Arduino démarre et commence à envoyer un état automatique au port USB… à moins qu'on ne lui dise d'arrêter de le faire.

À ce stade, vous devriez être prêt à essayer de contrôler le Roboclaw et de regarder les moteurs tourner, simplement en utilisant le "Serial Monitor" sur l'IDE.

Étape 4: Ajout et programmation du Raspberry Pi (node.js)

Encore une fois, si vous jetez un œil à ma liste de lecture Robotics, même depuis le début, j'ai parcouru chaque étape pour que le Raspberry soit opérationnel.

La seule chose que j'ai peut-être passée sous silence, c'est que vous aurez besoin d'un régulateur 5V et que vous construisez, coupez/modifiez un câble USB ou alimentez le Raspberry d'une autre manière.

Chez Github, vous trouverez tout ce dont vous avez besoin dans le Raspberry pour communiquer avec l'Arduino via USB.

github.com/elicorrales/wallace.robot.raspb…

Il existe même des scripts de test.

Vous pouvez jeter un œil au code du serveur node.js et vous verrez comment le Raspberry convertit les instructions numériques laconiques en chaînes d'URL de type REST. Vous pouvez utiliser "curl" pour envoyer des commandes de test.

Exemple:

votre adresse IP RP3: 8084/arduino/api/forward/50

provoquera la rotation momentanée des roues des moteurs vers l'avant.

Si vous mettez cela dans une boucle de script shell, vous verriez que les roues continuent de tourner.

Le code node.js (server.js) inclut une fonction de reconnexion au cas où les communications série seraient perdues pour l'Arduino. Vous pouvez tester cela en débranchant simplement l'Arduino du Raspberry et en le rebranchant.

Assurez-vous que vous faites correspondre le débit en bauds série entre les deux.

En raison de l'Arduino laissant tomber de mauvais paquets de données, et parce qu'au niveau node.js, et au niveau du navigateur javascript, tout est codé pour envoyer de nombreuses commandes "drive", j'ai pu exécuter jusqu'à 2 000 000 bauds (2 Mbps).

Si vous exécutez les scripts de test et que vous voyez les roues tourner, alors vous êtes prêt pour l'étape suivante.

Étape 5: Étape finale - Programmation / Utilisation du client de page Web

Les fichiers clients sont inclus dans le lien Github vers la partie Raspberry de tout cela.

index.html. index.js. p5.min.js.

Ils gèrent la manette de jeu USB via l'API Gamepad (basée sur un navigateur) et vous devriez voir les différents boutons et curseurs également disponibles sur la page Web.

Le code javascript interroge (sondage) les valeurs des axes X et Y pour l'un des joysticks. Il interroge très rapidement et envoie toutes ces valeurs au serveur node.js qui écoute à 8084.

Les valeurs brutes des axes X et Y des joysticks sont comprises entre 0 et 1.

Mais la fonction de bibliothèque de contrôleur de moteur Roboclaw utilisée dans l'Arduino pour piloter les moteurs, attend une valeur comprise entre -100 et 0 (vers l'arrière) ou (0 à 100) vers l'avant.

Alors…. c'est le but d'inclure le p5.min.js. Il se trouve qu'il y a cette fonction map() très agréable et pratique où vous lui donnez la valeur brute, sa plage brute (actuelle) et la nouvelle plage souhaitée. Et il convertit la valeur brute en la valeur de la nouvelle plage mappée.

Autre point: à la vitesse 100, le robot peut être très délicat. Je tombais constamment sur quelque chose. Mais même si vous vous améliorez, cela reste délicat lorsque vous tournez à gauche ou à droite.

Quelque chose à ajouter serait similaire au curseur Max Speed actuel sur la page Web. Ce curseur détermine quelle est la valeur la plus élevée ou maximale à laquelle vous allez mapper les joysticks Xs et Ys.

Exemple:

Disons que vous mappez 0 -> 1 à 0 -> 100. Lorsque vous poussez le joystick à fond, vous êtes à 100. Touchy. Peut-être trop rapide.

Mais, si vous reculez un peu ce curseur Max Speed, vous mappez maintenant 0 -> 1 à 0 -> 80 ou 70.

Cela signifie que vous avez plus de latitude pour déplacer votre joystick sans qu'un changement aussi important de la vitesse ne soit envoyé au node.js (et à l'Arduino).

Et l'ajout que vous pouvez faire est de séparer les X (rotation à gauche ou à droite) des Y (avant ou arrière) dans leurs propres vitesses maximales disponibles.

Ainsi, vous pouvez laisser les Y à 0 à 100, 0 à -100 pour un mouvement linéaire rapide, mais réduire la vitesse maximale des X pour un mouvement de rotation plus contrôlé. Le meilleur des deux mondes.

Étape 6: Facultatif: Pilotez le robot avec la souris et/ou les événements tactiles

Si vous êtes arrivé jusqu'ici, vous savez que les couches logicielles à partir du navigateur et en passant par Javascript et jusqu'au serveur Raspberry node.js, enfin à l'arduino, convertissent les coordonnées X et Y du joystick Gamepad en " commandes avant" (ou "arrière", etc) (et leur valeur de vitesse).

De plus, vous savez alors que bien que les X et Y des manettes soient de moins 1, à zéro, à plus 1, ceux-ci doivent être convertis entre zéro et 100. Eh bien, le maximum dépend du réglage de la vitesse maximale sur la page Web.

Soo… la seule chose à faire pour utiliser soit la souris, soit les événements tactiles (comme sur un smartphone), est de capturer ces événements, de saisir les X et les Y.

MAIS ---- ces X et Y ne sont PAS compris entre 1 et 1 négatif. Ils commencent à 0 et augmentent positivement, car ce sont essentiellement les pixels ou les coordonnées d'écran relatives d'un élément HTML (comme un panneau d'amorçage) ou d'un canevas.

Donc là encore, la fonction "map()" de la bibliothèque Js de P5 est très pratique pour re-mapper à ce dont nous avons besoin.

J'ai remanié le code pour avoir deux pages Web différentes, une pour le bureau à l'aide de la manette de jeu, une autre pour le mobile, à l'aide des événements tactiles.

De plus, une fois que les X et les Y sont reconfigurés, ils sont introduits dans la même chaîne de code, etc., tout comme les X et les Y de la manette de jeu.

Conseillé: