Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Robot Arduino avec manette PS2 (Joystick PlayStation 2)

Composants et fournitures

Arduino UNO
× 1
Drivers de moteur SparkFun Dual H-Bridge L298
× 1
Kit de réservoir robotique DIY
× 1
Manette sans fil Sony PS2
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

Dans ce tutoriel, je vais vous montrer comment utiliser un joystick sans fil PlayStation 2 (PS2) pour piloter un tank robotique. Une carte Arduino Uno a été utilisée au cœur de ce projet. Il reçoit les commandes du contrôleur sans fil et définit la vitesse des moteurs. D'autres cartes de développement peuvent également être utilisées (NodeMCU, Firebeetle, etc.), et les principes présentés dans ce tutoriel peuvent être appliqués sur d'autres modèles de robots et de gadgets.

J'ai déjà conçu un tank robotique contrôlé par Blynk. Il se connecte à un réseau Wi-Fi et reçoit des commandes du serveur Blynk. Un smartphone exécutant l'application Blynk a été utilisé comme télécommande et différentes méthodes de saisie ont été utilisées :boutons-poussoirs, barres coulissantes et même l'accéléromètre du smartphone. Vous pouvez en savoir plus sur ce projet ici :https://www.hackster.io/igorF2/wi-fi-Controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

J'ai également fait quelques expériences avec les commandes vocales. Cela peut être utile si vous souhaitez contrôler à distance un robot sans utiliser vos mains, ou si vous souhaitez le rendre accessible à une personne ayant des mouvements limités. On pourrait penser à un fauteuil roulant à commande vocale robotique, par exemple. Un kit robotique DIY a été utilisé, ainsi que certains de mes outils préférés :Adafruit.io, IFTTT et Arduino IDE. Instructions complètes ici :

https://www.hackster.io/igorF2/wi-fi-voice-controled-robot-using-google-assistant-79802c

Vous pouvez utiliser différents kits ou même concevoir vos propres robots en utilisant des matériaux simples, sans avoir besoin d'utiliser des outils complexes tels que des imprimantes 3D et des machines de découpe laser. Vous pouvez trouver un exemple sur un de mes tutoriels précédents :

https://www.hackster.io/igorF2/widc-wi-fi-Controlled-fpv-robot-8f1e09

Étape 1 : outils et matériaux

Les outils suivants ont été utilisés dans ce projet :

  • Fer à souder et fil (lien / lien). Les moteurs à courant continu étaient déjà livrés avec des fils soudés à ses bornes... Mais il finira par casser et vous devrez peut-être le ressouder. Pensez donc à avoir un bon fer à souder et du fil à proximité.
  • Feuille de mousse EVA (ou autre matériau non conducteur). Le châssis du robot que j'ai utilisé dans ce projet est en aluminium et des circuits imprimés sont installés sur ces pièces métalliques. J'ai utilisé une couche de feuille de mousse entre les planches et la plaque métallique pour éviter d'éventuels courts-circuits.
  • Ruban double face . Il a été utilisé pour coller les feuilles de mousse sur les circuits imprimés et pour l'installation du module H-Bridge.
  • Ciseaux , pour découper des rectangles de feuilles de mousse.

J'ai utilisé les pièces matérielles suivantes pour mon projet :

  • Carte de développement basée sur Arduino Uno (lien / lien / lien / lien). Il est utilisé comme contrôleur principal du robot. Il est vraiment facile à utiliser et à programmer avec Arduino IDE, idéal pour les débutants en électronique et en programmation.
  • Module pont en H double canal L298N (lien / lien / lien / lien). Ce module permet d'amplifier les signaux 3.3V du Wemos (ou d'un Arduino) au 12V nécessaire aux moteurs.
  • Réservoir de châssis de robot bricolage (lien). Ce kit génial contient tout ce dont vous avez besoin pour construire un char :deux moteurs à courant continu, des engrenages, des chenilles, des boulons, des écrous, etc. Il est déjà livré avec les outils nécessaires pour assembler le châssis, ce qui est idéal pour les débutants !
  • Télécommande sans fil PS2 (lien). Ce contrôleur de jeu vidéo peut envoyer des commandes sans fil à un récepteur, qui peut être interfacé avec un microcontrôleur à l'aide d'une communication série.
  • Piles 18650 3.7V (x3) (lien / lien). J'alimentais tout le circuit. Ce réservoir utilise des moteurs 12V. J'ai utilisé trois piles 3.7V en série pour les alimenter.
  • Support de batterie 3S 18650 (lien / lien / lien). Il peut contenir trois accus 18650 en série et se fixe facilement à l'arrière du réservoir.
  • Chargeur de batterie 18650 (lien / lien). Vos batteries finiront par s'épuiser. Lorsque cela se produit, un chargeur de batterie viendra à votre secours.
  • Cavaliers (lien / lien). J'ai utilisé 6 cavaliers mâle-femelle pour les signaux entre le pont en h et le Wemos, et 2 cavaliers mâle-mâle pour 5V et Gnd. Vous pourriez avoir besoin de plus si vous prévoyez d'ajouter des capteurs.
  • Câble USB de type B . Vous en aurez besoin pour télécharger votre code. La plupart des cartes sont déjà livrées avec leur propre câble.

Les liens ci-dessus ne sont qu'une suggestion d'où vous pouvez trouver les éléments utilisés dans ce didacticiel (et peut-être soutenir mes futurs didacticiels). N'hésitez pas à les chercher ailleurs et à acheter dans votre magasin local ou en ligne préféré.

Étape 2 :Assemblage du robot

La première partie de ce projet était l'assemblage de la structure du robot.

Dans des projets précédents, j'ai développé la structure de mon propre robot, en utilisant des matériaux facilement accessibles (sans avoir besoin d'outils complexes, d'imprimantes 3D ou de machines de découpe laser). Vous pouvez trouver ce projet dans le lien ci-dessous :

https://www.hackster.io/igorF2/widc-wi-fi-Controlled-fpv-robot-8f1e09

Plus tard, j'ai décidé de donner une chance à un kit robotique obtenu dans une boutique en ligne. Vous pouvez trouver un lien vers le châssis du robot sur le lien suivant :http://bit.ly/2ycI8fP. Si vous cherchez un kit, je pense que c'est une bonne option ! Je l'ai utilisé dans deux autres tutoriels, comme vous pouvez le voir sur les liens ci-dessous :

https://www.hackster.io/igorF2/wi-fi-controlled-robot-using-wemos-d1-esp8266-and-blynk-464198

https://www.hackster.io/igorF2/wi-fi-voice-controled-robot-using-google-assistant-79802c

Au début, il semblait que le montage serait complexe ou que je rencontrerais des problèmes comme le manque de pièces (vu la quantité de pièces qui composent le kit). Mais ce kit m'a vraiment surpris ! Toutes les pièces me semblent de bonne qualité, et plusieurs pièces détachées accompagnaient le kit. Ainsi, une vis perdue sous l'établi ne rendra pas impossible la réalisation de votre projet, que j'ai trouvé excellent (surtout après avoir perdu quelques vis).

Autre point positif, tous les outils nécessaires au montage du robot sont inclus dans le kit (une paire de clés Allen et le tournevis). Je pense que cela rend le kit excellent pour les débutants qui n'ont pas beaucoup d'outils !

Comme aspect négatif, je soulignerais le manque de documentation. L'assembleur du robot

ual (un tableur en chinois) n'est pas extrêmement convivial, et il n'y a pas beaucoup de tutoriels en ligne pour ce char. Et j'ai donc décidé de documenter le processus d'assemblage de mon robot dans la vidéo ci-dessus ! Un autre point d'attention concerne le matériau de la structure du robot. La base est entièrement en aluminium, ce qui peut provoquer des courts-circuits si les broches des circuits imprimés touchent le cadre.

Il existe d'autres kits en ligne que vous pouvez utiliser. Vous pouvez même créer votre propre structure, comme je l'ai décrit ci-dessous.

Étape 3 : câblage du circuit

Un bloc d'alimentation composé de trois batteries 18650 a été installé à l'arrière du robot. Il fournit 11,1 V (3 x 3,7 V) au robot. C'est suffisant pour alimenter les moteurs 12V DC.

Un pont en H à double canal L298N a été utilisé pour le contrôle des moteurs. Il reçoit des signaux 5V de la carte Arduino et fournit des tensions plus élevées aux moteurs. Il permet également aux moteurs de fonctionner dans les deux sens, en fonction de la combinaison de ces signaux d'entrée.

Chaque appareil a été connecté selon les schémas.

Suit une liste des broches que vous devrez connecter :

Entrées/sorties Arduino Uno :

  • Broche numérique 3 => Broche H-Bridge ENA
  • Broche numérique 5 => Broche H-Bridge IN1
  • Broche numérique 4 => Broche H-Bridge IN2
  • Broche numérique 8 => Broche H-Bridge IN3
  • Broche numérique 7 => Broche H-Bridge IN4
  • Broche numérique 6 => Broche ENB H-Bridge
  • Broche 5V => Broche H-Bridge 5V
  • Broche Gnd => Broche Gnd pont en H
  • Broche numérique 10 => Broche 6 du récepteur PS2
  • Broche numérique 11 => Broche 2 du récepteur PS2
  • Broche numérique 12 => Broche 1 du récepteur PS2
  • Broche numérique 13 => Broche 7 du récepteur PS2
  • Broche 3.3V => Broche 5 du récepteur PS2
  • Broche Gnd => Broche 4 du récepteur PS2

Entrées/sorties H-Bridge :

  • Broche ENA => Broche numérique Arduino 3
  • Broche IN1 => Broche numérique Arduino 5
  • Broche IN2 => Broche numérique Arduino 4
  • Broche IN3 => Broche numérique Arduino 8
  • Broche IN4 => Broche numérique Arduino 7
  • Broche ENB => Broche numérique Arduino 6
  • Broche 5V =>Broche Arduino 5V
  • Broche Gnd => Broche Arduino Gnd
  • Broche Gnd => Fil négatif de la batterie
  • Broche 12V => Fil positif de la batterie
  • OUT1 => Fil négatif moteur droit
  • OUT2 => Fil positif moteur droit
  • OUT3 => Fil positif moteur gauche
  • OUT4 => Fil négatif du moteur gauche

Récepteur PS2 :

  • Broche 1 (données) => Broche numérique Arduino 12
  • Broche 2 (commande) => Broche numérique Arduino 11
  • Broche 4 (terre) => Broche Arduino Gnd
  • Broche 5 (alimentation) => Broche Arduino 3.3V
  • Broche 6 (attention) => Broche numérique Arduino 10
  • Broche 7 (horloge) => Broche numérique Arduino 13

Étape 4 :configuration de l'IDE Arduino

Pour ce projet, j'ai utilisé Arduino IDE pour programmer la carte Arduino.

1. Téléchargez et installez la dernière version de l'IDE Arduino

Vous pouvez trouver la dernière version pour Windows, Linux ou MAC OSX sur le site Web d'Arduino :https://www.arduino.cc/en/main/software

Téléchargez-le gratuitement, installez-le sur votre ordinateur et lancez-le.

2. Ajout des bibliothèques

Dans ce projet, j'utilise la bibliothèque Arduino PS2X.

Téléchargez la bibliothèque sur https://github.com/madsci1016/Arduino-PS2X. Décompressez le fichier et copiez les dossiers dans les dossiers bibliothèques/outils Arduino IDE.

............

Maintenant que votre environnement de développement est prêt, passons à l'étape suivante !

Étape 5 : Explication de la bibliothèque de manettes sans fil PS2

Une manette sans fil PS2 est un excellent outil pour vos projets de robotique. Il dispose d'une quantité incroyable de boutons :20 boutons poussoirs numériques et 2 sticks analogiques. De cette façon, il y a des possibilités infinies pour contrôler votre robot.

J'ai utilisé la bibliothèque PS2X de Bill Porter (https://github.com/madsci1016/Arduino-PS2X) pour interfacer le contrôleur avec une carte Arduino Uno.

Il définit une classe PS2X pour le contrôleur, qui contient certaines méthodes de lecture des entrées analogiques et numériques à partir du joystick. Un objet de cette classe est créé à l'aide du code suivant (avant ou pendant l'installation) :

PS2X ps2x ;

Une fois l'objet défini, il doit être lié aux broches d'E/S de l'Arduino à l'aide de la fonction suivante :

error =ps2x.config_gamepad(horloge, commande, attention, données, pression ?, grondement ?);  

Cette fonction peut renvoyer des erreurs s'il y a un problème avec les connexions ou avec le contrôleur lui-même.

Les principales fonctions utilisées à partir de la bibliothèque sont celles de lecture des entrées numériques et analogiques. Pour la lecture et l'entrée numérique, la méthode suivante est utilisée :

ps2x.Button(bouton);  

Dans quel bouton est le nom du bouton à lire. Chaque bouton est mappé comme suit :

Boutons directionnels :

  • PSB_PAD_UP =bouton D-pad haut ;
  • PSB_PAD_DOWN =bouton bas du D-pad ;
  • PSB_PAD_LEFT =bouton gauche du D-pad
  • PSB_PAD_RIGHT =bouton droit du D-pad

Boutons d'action :

  • PSB_GREEN ou PSB_TRIANGLE =bouton triangle vert
  • PSB_RED ou PSB_CIRCLE =bouton cercle rouge
  • PSB_BLUE ou PSB_CROSS =bouton x bleu
  • PSB_PINK ou PSB_SQUARE =​​bouton carré rose

Déclencheurs :

  • PSB_L1 =bouton de déclenchement latéral gauche 1
  • PSB_R1 =bouton de déclenchement latéral droit 1
  • PSB_L2 =bouton de déclenchement latéral gauche 2
  • PSB_R2 =bouton de déclenchement latéral droit 2

Bâtons :

  • PSB_L3 =bouton poussoir du stick gauche (oui, vous pouvez appuyer sur le stick comme un bouton poussoir)
  • PSB_R3 =bouton poussoir du joystick droit

Menu :

  • PSB_SELECT =bouton de sélection
  • PSB_START =bouton de démarrage

Pour lire la valeur analogique (avec whill be convertisseur en un entier compris entre 0 et 255) des sticks utilisez la méthode suivante :

ps2x.Analog(stick_axis);  

Dans quel stick_axis représente le bâton et la direction à lire, comme suit :

  • PSS_LY =position y du joystick gauche
  • PSS_LX =position x du stick analogique gauche
  • PSS_RY =position y du joystick droit
  • PSS_RX =x-position du joystick droit

Avec ces fonctions de base, vous serez prêt à utiliser la manette PS2 sur votre projet ! Sur les étapes suivantes, je montre quelques exemples de croquis Arduino combinant ces boutons !

Étape 6 : Esquisse 1 - Boutons Dpad

Les anciens jeux vidéo, tels que SEGA Master System et Mega Drive et Nintendo SNES, n'avaient pas de boutons sensibles à la force. Les boutons directionnels n'étaient que des boutons marche/arrêt. Pour ce premier exemple, je voulais émuler le type de commandes que l'on aurait dans les anciens jeux vidéo de ces consoles.

Pour ce premier Sketch, j'ai utilisé les boutons Dpad comme entrées pour le robot. Chaque bouton était utilisé par le robot pour effectuer l'un des mouvements de base :avancer, tourner à droite, tourner à gauche ou reculer.

Ces boutons ont des sorties binaires. De cette façon, le microcontrôleur comprendra seulement que les boutons ont été enfoncés, mais ne comprendra pas à quel point ils ont été enfoncés. De cette façon, une fois qu'un bouton donné est cliqué, les moteurs tourneront à pleine vitesse.

Si vous avez tout connecté selon mes schémas, vous aurez les sorties suivantes :

  • PSB_PAD_UP =avancer
  • PSB_PAD_DOWN =reculer
  • PSB_PAD_LEFT =tourner à gauche
  • PSB_PAD_RIGHT =tourner à droite

Comme je l'ai déjà dit, le moteur se déplacera à une vitesse fixe. En tournant à gauche ou à droite, les moteurs fonctionneront dans des directions opposées, de sorte que le robot tournera autour de son axe.

Code Arduino :

Téléchargez le code et ouvrez-le sur Arduino IDE. Si vous utilisez le même brochage que moi, vous n'aurez probablement rien à changer sur le code (bien que cela puisse être nécessaire, si l'orientation des moteurs est différente

Pour télécharger le code, sélectionnez la carte « Arduino/Genuino Uno », sélectionnez le bon port COM, branchez la carte sur le port USB de votre ordinateur et téléchargez le code.
Une fois le téléchargement terminé, débranchez le câble USB et placez le batteries. Le code commencera à s'exécuter et la carte Arduino connectera automatiquement le joystick PS2. Ouvrez le moniteur série à la première utilisation et vérifiez l'état de la connexion. S'il ne parvient pas à se connecter avec le joystick, vous devez faire quelque chose :

  • Réinitialisez la carte Arduino Uno. Essayez-le plusieurs fois (pour moi, cela fonctionne généralement après la troisième réinitialisation);
  • Vérifiez si le joystick est allumé (et avec des batteries chargées). Le récepteur possède des LED qui indiqueront si le joystick a été appairé. Vérifiez également si les broches RX et TX d'Arduino clignotent lorsqu'il reçoit de nouvelles commandes (et met à jour l'état sur le port série) ;
  • Vérifiez les connexions... il se peut qu'il y ait un problème dans les cavaliers entre les composants.

Explication du code :

Dans ce projet, je n'ai eu qu'à utiliser la bibliothèque PS2X_lib.h. I est ajouté au début du code.

#include   

Définissez les broches de l'Arduino connectées au pont en h. Si vous utilisez les mêmes connectios que moi, vous aurez la configuration suivante. Si vous choisissez d'utiliser des broches différentes, mettez à jour cette partie du code.

// Ceux-ci sont utilisés pour définir la direction du pilote de pont. #define ENA 3 //ENA #define MOTORA_1 4 //IN3 #define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1 #define MOTORB_2 7 //IN2 #define ENB 6 //ENB  

Certaines variables globales ont été déclarées avant l'installation (p2sx , erreur , tapez et vibrer ). Le premier est une instance de la classe PS2X. L'état d'erreur lors de la connexion sera stocké sur erreur entier. Tapez et vibrer indiquera le type de contrôleur (contrôleur DualShock ou GuitarHero) et s'il est censé vibrer sur une commande donnée.

La première chose que j'ai faite pendant la configuration a été de configurer l'état des broches d'E/S (en tant que sortie) et de définir les broches d'activation sur LOW. De cette façon, vous désactiverez les deux moteurs au démarrage et le robot ne se déplacera pas au hasard en attendant le reste du code.

// Configurer les broches de sortie pinMode(ENA, OUTPUT); pinMode(MOTORA_1, SORTIE); pinMode(MOTORA_2, SORTIE); pinMode(ENB, SORTIE); pinMode(MOTORB_1, SORTIE); pinMode(MOTORB_2, SORTIE); // Désactiver les deux moteurs digitalWrite(ENA,0) ; écriture numérique (ENB, 0);  

Ensuite, j'ai commencé la communication par port série (utile pour déboguer le code). Choisissez une vitesse de transmission appropriée et réglez la même vitesse sur le moniteur série.

// Démarrer la communication série Serial.begin(57600);  

Enfin, configurez l'objet ps2x avec les broches de l'Arduino qui étaient connectées au récepteur du joystick (horloge, commande, attention et données respectivement). Il peut renvoyer une erreur (à afficher sur le moniteur série). Le type de contrôleur sera également affiché (même si vous connaissez probablement déjà le type de contrôleur que vous avez entre les mains à ce stade :D).

error =ps2x.config_gamepad(13,11,10,12, true, true); //configuration des broches et des paramètres :GamePad (horloge, commande, attention, données, pressions ?, Rumble ?) recherche d'erreur // recherche d'erreur if(error ==0){ Serial.println("Contrôleur trouvé, configuré avec succès" ); } else if(error ==1) Serial.println("Aucun contrôleur trouvé, vérifiez le câblage ou réinitialisez l'Arduino"); else if(error ==2) Serial.println("Contrôleur trouvé mais n'acceptant pas les commandes"); else if(error ==3) Serial.println("Le contrôleur refusant d'entrer en mode Pressions, peut ne pas le prendre en charge."); // Vérifiez le type de contrôleur type =ps2x.readType(); switch(type) { case 0:Serial.println("Type de contrôleur inconnu"); Pause; cas 1 :Serial.println("DualShock Controller Found"); Pause; cas 2:Serial.println("Contrôleur GuitarHero trouvé"); Pause; }  

Pendant la boucle principale, l'Arduino lira chaque bouton D-pad (HAUT, BAS, GAUCHE et DROIT) et définira les différentes valeurs pour les broches de sortie, afin de déplacer les roues. Après un bref délai, une nouvelle boucle est lancée.

La section suivante montre comment faire avancer le robot si le bouton HAUT a été enfoncé. Les broches MOTORA_1 et MOTORA_2 définissent le sens de rotation du moteur A. ENA définira si le mouvement est activé ou non (moteur ON/OFF). Notez qu'il s'agit d'une sortie "analogique" (en fait une PWM). Sa valeur doit être comprise entre 0 et 1023. Cela modulera le PWM et changera la tension moyenne à la sortie du pont en h (entre 0 et 12V). Si la tension moyenne est trop basse, le moteur ne pourra pas du tout bouger.

// AVANCER if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Avancer"); }  

* J'ai utilisé des sorties PWM pour les broches ENA et ENB. De cette façon, 1023 représenterait une impulsion avec la plus grande longueur (broche toujours allumée) et 0 l'absence d'impulsions (broche toujours éteinte). Si une valeur différente (plus petite) est utilisée ici, les moteurs devraient fonctionner plus lentement, car la tension moyenne à leurs bornes sera plus petite.

Étape 7 : esquisse 2 : Bâton analogique et boutons numériques (L2 et R2)

A un moment donné, toutes les consoles ont adopté des joysticks avec deux sticks analogiques. Ces nouvelles entrées ont permis des entrées sensibles à la force qui ont créé des actions à vitesse variable et sont devenues populaires dans tous les types de jeux vidéo.

Dans ce deuxième exemple, je voulais utiliser un commutateur analogique pour diriger le réservoir et une paire de boutons poussoirs comme accélérateur et freins/marche arrière. Ce genre de configuration est très populaire dans beaucoup de jeux de course, comme Mario Kart par exemple. Appuyez sur le bouton R2 pour l'accélération du réservoir, L2 pour la marche arrière et définissez la direction du mouvement en fonction de la position x du stick gauche.

Le type de kit robotique que j'ai utilisé n'a pas beaucoup d'inertie (si la tension sur les moteurs est réglée sur 0V, cela ne bougera pas pendant un certain temps). De cette façon, il n'était pas nécessaire de définir une commande pour freiner le robot.

La plupart du code a déjà été expliqué à l'étape précédente. Une différence est que j'ai défini deux variables qui stockent la vitesse de chaque moteur (de 0 à 1023).

int motor_right_speed =0;
int motor_left_speed =0;

Dans la boucle principale, l'Arduino lira la position x du stick gauche. Il recevra une valeur comprise entre 0 et 255 et la mappera entre -1023 et 1023.

Cette valeur sera ajoutée (ou soustraite) à la vitesse de chaque moteur, afin de créer une différence entre la vitesse de chaque piste et faire tourner le robot à gauche ou à droite.

int nJoyL =ps2x.Analog(PSS_LX); // lecture joystick gauche nJoyL =map(nJoyL, 0, 255, 1023, -1023); motor_right_speed =1023 ; motor_left_speed =1023; if (nJoyL <0) { motor_right_speed =motor_right_speed + nJoyL; } if (nJoyL> 0) { motor_left_speed =motor_left_speed - nJoyL; }  

Si le bouton R2 est enfoncé, le réservoir doit avancer. De cette façon, l'Arduino définit les valeurs appropriées pour les broches du moteur. ENA et ENB créent des sorties « analogiques » pour chaque moteur, avec une valeur proportionnelle à la vitesse souhaitée pour chaque moteur (basée sur la position x du joystick gauche).

L2 fera quelque chose de similaire, mais inversera le sens du moteur.

if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(!ps2x.Button(PSB_L2) ​​&&!ps2x.Button(PSB_R2)) { analogWrite(ENA, 0); analogWrite(ENB, 0); }  

Si aucun des boutons n'a été enfoncé, les moteurs seront désactivés.

Étape 8 : esquisse 3 : sticks analogiques gauche et droit (entraînement différentiel)

Celui-ci est ma façon préférée de contrôler le char (bien qu'il ne soit pas optimal en termes de ressources) ! J'ai l'impression de contrôler une vraie grosse machine à deux mains !

Dans ce code, j'ai utilisé les deux manettes pour régler la direction et la vitesse de chaque piste. Le stick gauche commandera la piste gauche et le stick droit contrôlera la piste droite.

Le code est presque le même que celui décrit précédemment. Mais cette fois, je voulais lire la position y des deux bâtons :

int nJoyL =ps2x.Analog(PSS_LY); // lecture du stick gauche int nJoyR =ps2x.Analog(PSS_RY); // lecture joystick droit nJoyL =map(nJoyL, 0, 255, 1023, -1023); nJoyR =map(nJoyR, 0, 255, -1023, 1023);  

Selon la position du bâton, le code définira les broches numériques pour définir la direction de chaque moteur.

J'ai utilisé une valeur fixe à l'activation (1023), mais j'utiliserais une valeur variable basée sur la valeur réelle du stick analogique. J'ai défini une zone morte (+-50) dans laquelle le microcontrôleur désactivera les moteurs.

// Effectuez des mouvements basés sur les deux sticks analogiques if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); }  

Étape 9 : esquisse n° 4 : stick analogique gauche uniquement

Dans cette dernière application Sketch, j'ai utilisé un seul joystick pour contrôler le robot. C'est optium en terme d'utilisation des ressources (il vous restera plein de boutons pour paramétrer différentes actions), mais c'est assez difficile à comprendre.

La vitesse de chaque piste est définie en fonction des positions x et y du joystick. De cette façon, il est possible d'appliquer différentes vitesses sur chaque piste et de déplacer le robot avec différentes vitesses/directions. Le code utilisé ici est dérivé du tutoriel suivant. Vérifiez-le !

https://www.impulseadventure.com/elec/robot-differential-steering.html

Étape 10 :Considérations finales

J'ai mis beaucoup d'efforts dans ce projet, pour qu'il soit le plus clair et pédagogique possible. Si vous l'avez aimé, n'oubliez pas d'"aimer" et de "partager". Votre soutien est très important pour moi ! :D

Si vous ne suivez toujours pas mes tutoriels, jetez un œil à ces autres tutoriels sur la robotique ! J'espère qu'ils vous plaisent !

https://www.hackster.io/igorF2/joy-robot-robo-da-alegria-bba54f

https://www.hackster.io/igorF2/widc-wi-fi-Controlled-fpv-robot-8f1e09

https://www.hackster.io/igorF2/nunchuk-controled-robotic-arm-with-arduino-b1c0fa

https://www.hackster.io/igorF2/wi-fi-browser-driven-robotic-arm-89b63d

Pensez à soutenir mes futurs projets avec un petit don Bitcoin ! :D

Adresse de dépôt BTC :1FiWFYSjRaL7sLdr5wr6h86QkMA6pQxkXJ

Code

  • Esquisse 1
  • Esquisse #2
  • Esquisse 3
  • Esquisse n°4
Esquisse #1Arduino
// Réservoir PS2 par Igor Fonseca @2019// Contrôle un réservoir robotique à l'aide d'un joystick PS2, à l'aide des boutons D-pad// basé sur un exemple utilisant la bibliothèque PS2X par Bill Porter 2011// Tout le texte ci-dessus doit être inclus dans toute redistribution.// include library#include // Ceux-ci sont utilisés pour définir la direction du pilote de pont.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4 #define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBPS2X ps2x; // créer une classe de contrôleur PS2//pour le moment, la bibliothèque ne prend PAS en charge les contrôleurs enfichables à chaud, ce qui signifie // vous devez toujours redémarrer votre Arduino après avoir connecté le contrôleur, // ou appeler à nouveau config_gamepad(pins) après avoir connecté le contrôleur. erreur entière =0 ; byte type =0;byte vibrate =0;void setup(){ // Configurer les broches de sortie pinMode(ENA, OUTPUT); pinMode(MOTORA_1, SORTIE); pinMode(MOTORA_2, SORTIE); pinMode(ENB, SORTIE); pinMode(MOTORB_1, SORTIE); pinMode(MOTORB_2, SORTIE); // Désactiver les deux moteurs digitalWrite(ENA,0) ; écriture numérique(ENB,0) ; // Lancer la communication série Serial.begin(57600); erreur =ps2x.config_gamepad(13,11,10,12, vrai, vrai); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); Pause; case 1:Serial.println("DualShock Controller Found"); Pause; case 2:Serial.println("GuitarHero Controller Found"); Pause; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller // Perform movements based on D-pad buttons // MOVE FORWARD if(ps2x.Button(PSB_PAD_UP)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move forward"); } // TURN RIGHT if(ps2x.Button(PSB_PAD_RIGHT)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn right"); } // TURN LEFT if(ps2x.Button(PSB_PAD_LEFT)){ digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Turn left"); } // MOVE BACK if(ps2x.Button(PSB_PAD_DOWN)){ digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); analogWrite(ENA, 1023); Serial.println("Move back"); } if (!ps2x.Button(PSB_PAD_DOWN) &&!ps2x.Button(PSB_PAD_UP) &&!ps2x.Button(PSB_PAD_RIGHT) &&!ps2x.Button(PSB_PAD_LEFT)) { analogWrite(ENB, 0); analogWrite(ENA, 0); } delay(50); } }
Sketch #2Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); Pause; case 1:Serial.println("DualShock Controller Found"); Pause; case 2:Serial.println("GuitarHero Controller Found"); Pause; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LX); // read left stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); int motor_right_speed =1023; int motor_left_speed =1023; if (nJoyL <0) { motor_right_speed =motor_right_speed + nJoyL; } if (nJoyL> 0) { motor_left_speed =motor_left_speed - nJoyL; } if(ps2x.Button(PSB_R2)) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(ps2x.Button(PSB_L2)) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed); } if(!ps2x.Button(PSB_L2) &&!ps2x.Button(PSB_R2)) { analogWrite(ENA, 0); analogWrite(ENB, 0); } delay(50); } }
Sketch #3Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using D-pad buttons// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include // These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBPS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); Pause; case 1:Serial.println("DualShock Controller Found"); Pause; case 2:Serial.println("GuitarHero Controller Found"); Pause; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyL =ps2x.Analog(PSS_LY); // read left stick int nJoyR =ps2x.Analog(PSS_RY); // read right stick nJoyL =map(nJoyL, 0, 255, 1023, -1023); nJoyR =map(nJoyR, 0, 255, -1023, 1023); // Perform movements based on both analog sticks if(nJoyR>50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); } if(nJoyR<-50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); } if (abs(nJoyR)<50) { analogWrite(ENA, 0); } if(nJoyL>50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); } if(nJoyL<-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); } if (abs(nJoyL)<50) { analogWrite(ENB, 0); } delay(50); } }
Sketch #4Arduino
// PS2 Tank by Igor Fonseca @2019// Controls a robotic tank using a PS2 joystick, using left analog stick// based on an example using the PS2X library by Bill Porter 2011// All text above must be included in any redistribution.// include libraries#include  //for v1.6// These are used to set the direction of the bridge driver.#define ENA 3 //ENA#define MOTORA_1 4 //IN3#define MOTORA_2 5 //IN4#define MOTORB_1 8 //IN1#define MOTORB_2 7 //IN2#define ENB 6 //ENBint motor_right_speed =0;int motor_left_speed =0;PS2X ps2x; // create PS2 Controller Class//right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error =0; byte type =0;byte vibrate =0;void setup(){ // Configure output pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); // Start serial communication Serial.begin(57600); error =ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings:GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error // Check for error if(error ==0){ Serial.println("Found Controller, configured successful"); } else if(error ==1) Serial.println("No controller found, check wiring or reset the Arduino"); else if(error ==2) Serial.println("Controller found but not accepting commands"); else if(error ==3) Serial.println("Controller refusing to enter Pressures mode, may not support it."); // Check for the type of controller type =ps2x.readType(); switch(type) { case 0:Serial.println("Unknown Controller type"); Pause; case 1:Serial.println("DualShock Controller Found"); Pause; case 2:Serial.println("GuitarHero Controller Found"); Pause; }}// Main loopvoid loop(){ if(error ==1) //skip loop if no controller found return; else { //DualShock Controller ps2x.read_gamepad(false, vibrate); // disable vibration of the controller int nJoyX =ps2x.Analog(PSS_LX); // read x-joystick int nJoyY =ps2x.Analog(PSS_LY); // read y-joystick nJoyX =map(nJoyX, 0, 255, -1023, 1023); nJoyY =map(nJoyY, 0, 255, 1023, -1023); // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt :The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range:(0..+127) float fPivYLimit =1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY>=0) { // Forward nMotPremixL =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); nMotPremixR =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; } else { // Reverse nMotPremixL =(nJoyX>=0)? (1023.0 - nJoyX) :1023.0; nMotPremixR =(nJoyX>=0)? 1023.0 :(1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL =nMotPremixL * nJoyY/1023.0; nMotPremixR =nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed =nJoyX; fPivScale =(abs(nJoyY)>fPivYLimit)? 0.0 :(1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL =(1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR =(1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed); motor_left_speed =nMotMixL; motor_right_speed =nMotMixR; if (motor_right_speed> 50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else if (motor_right_speed <-50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2, HIGH); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } if (motor_left_speed> 50) { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, HIGH); } else if (motor_left_speed <-50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } analogWrite(ENA, abs(motor_left_speed)); analogWrite(ENB, abs(motor_right_speed)); if (abs(motor_left_speed> 50) || abs(motor_left_speed> 50)) { Serial.println("Moving!"); } delay(50); } }

Schémas


Processus de fabrication

  1. Créez votre robot de streaming vidéo contrôlé par Internet avec Arduino et Raspberry Pi
  2. Unopad - Contrôleur MIDI Arduino avec Ableton
  3. Obstacles pour éviter le robot avec servomoteur
  4. Contrôler un robot Roomba avec Arduino et un appareil Android
  5. Bras robotique contrôlé par Nunchuk (avec Arduino)
  6. Arduino Nano :contrôler 2 moteurs pas à pas avec joystick
  7. Joystick Arduino
  8. Créer un robot de combat contrôlé avec une manette PS2
  9. Contrôler le bras robotique Arduino avec l'application Android