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

Contrôler Arduino Rover à l'aide de Firmata et de la manette Xbox One

Composants et fournitures

Manette Xbox Microsoft et adaptateur sans fil pour Windows
Ce contrôleur peut être ajouté à un PC Windows à l'aide de l'adaptateur
× 1
Modem Bluetooth SparkFun - BlueSMiRF Silver
Ou un module Bluetooth identique (HC-05, HC-06)
× 1
Arduino UNO
× 1

Applications et services en ligne

Microsoft Windows 10 IoT Core
Cette application est l'intermédiaire entre l'esquisse Firmata standard et la manette Xbox One

À propos de ce projet

Il y a quelques mois j'ai acheté un petit rover (contrôlé par un Arduino Uno) pour un très bon prix. Le kit était très complet :châssis de voiture, 2 roues de voiture, 2 moteurs à engrenages à courant continu, un UNO R3, un contrôleur de moteur à double pont en H L298N et plusieurs autres composants.

Ce rover est destiné à être programmé pour un fonctionnement autonome. Par conséquent, un capteur à ultrasons et un servo sont également ajoutés dans le kit. Un joli bouclier de capteur Arduino 5 est également dans le kit. Oui, c'était une vraie aubaine;-)

Mais mon idée était d'utiliser à la fois un contrôleur Xbox One et le protocole Firmata pour piloter celui-ci par moi-même ou l'un de mes fils. Et ça marche très bien !

Voici une vidéo de la solution finale :

Les principaux éléments utilisés dans ce projet sont :

  • Un kit rover (nous n'utilisons pour cette démonstration qu'un sous-ensemble des pièces : la plaque de base, les roues, les moteurs, l'Arduino Uno, le support de batterie 9 volts et le contrôleur de moteur L298N Dual H-Bridge)
  • Un support de piles supplémentaire pour 6 piles AA
  • Un module Bluetooth (HC-06)
  • Une manette Xbox One avec un adaptateur sans fil pour Windows (pour la connecter à un ordinateur portable)
  • Un ordinateur portable (avec Windows 10 + VS2015 + dongle Bluetooth)
  • Une lumière clignotante pour un effet dramatique uniquement

Création du kit

Construire le kit n'est pas si difficile. Bien que le manuel de construction soit en chinois, tout semble assez logique. Il n'y a qu'une seule plaque de base, j'ai donc dû mettre des composants dessus et d'autres en bas (maintenant le contrôleur de moteur) :

Dans cette image, deux supports de batterie différents sont ajoutés. Pendant la programmation, j'ai découvert que je devais utiliser une alimentation séparée juste pour faire fonctionner les moteurs.

Connexion des moteurs - disposition des broches du contrôleur

Le cœur du matériel cette fois n'est pas l'Arduino Uno mais le contrôleur de moteur.

« Le L298 est un pilote à double pont en H pour les moteurs CC à balais et les moteurs pas à pas. Il prend en charge une large plage de tensions de fonctionnement et peut fournir 2 A par canal dans un boîtier traversant accessible pour les projets de bricolage. »

Ce contrôleur contrôlera la vitesse et la direction de chacun des deux moteurs, en utilisant des signaux provenant de l'Arduino.

La disposition des broches du contrôleur de moteur à double pont en H L298N est :

  • Plus + du moteur à courant continu 1
  • Moins – du moteur CC 1
  • Alimentation. Je fournis 9 volts à partir d'un support de batterie séparé
  • Terrain commun. Connecté à la fois à mon support de batterie séparé et à l'Arduino
  • Coupure . Peut produire 5 volts (non utilisé . Mon Arduino est alimenté par un autre support de batterie)
  • ENA connecté à Arduino D10. Ce port est compatible PWM (blanc)
  • IN1 connecté à Arduino D9. (gris)
  • IN2 connecté à Arduino D8. (violet)
  • IN3 connecté à Arduino D7. (bleu)
  • IN4 connecté à Arduino D6. (vert)
  • ENB connecté à Arduino D5. Ce port est compatible PWM (jaune)
  • Plus + du moteur à courant continu 2
  • Moins – du moteur CC 2
  • Le cavalier à côté de 2 et 3 n'est PAS supprimé car je ne dépasse pas la puissance d'entrée sur 12 volts (jusqu'à 35 volts) (cavalier non marqué sur la photo)

Remarque :le contrôleur a sa propre alimentation. L'Arduino en a un aussi. Pour que les choses continuent de fonctionner (sans faire exploser les éclaircies, donnez-leur un terrain d'entente . Voir puce 4 ci-dessus)

Connecter les moteurs - disposition des broches d'Arduino

La connexion de l'Arduino est assez simple. On connecte la masse et le 5 volts de l'alimentation à l'Arduino. Et nous connectons les six lignes (ENA, IN1-4 et ENB) à la broche D10 jusqu'à D5.

Il doit être clair que les ports 7 et 8 (et 9 et 10 pour l'autre moteur) ne sont que des ports GPIO normaux. Ceux-ci seront utilisés pour la direction du moteur. Si les deux ports (par exemple 7 et 8) sont LOW, le moteur ne fera rien (il s'arrête). Si l'un est HAUT et l'autre BAS, le moteur fonctionnera dans un sens. S'il est connecté dans l'autre sens (le premier est réglé sur BAS et l'autre sur HAUT), le moteur connecté fonctionnera dans l'autre sens.

Mais... le simple réglage de ces broches n'aboutira à rien. Pas encore de pièces mobiles !

La magie viendra des broches 5 et 10. Ce sont des broches « spéciales » qui peuvent générer un signal PWM. Si vous définissez une valeur comprise entre 0 et 255, le moteur fonctionnera TRÈS lentement (arrêté) ou à grande vitesse.

Remarque :chaque port de l'Arduino Uno capable de PWM est marqué d'un tilde (le ~).

Connexion Bluetooth

Le module Bluetooth que j'utilise n'a besoin d'être connecté qu'aux ports RX et TX (croisement des lignes) et il a besoin d'une alimentation de 5 volts et de la masse de l'Arduino.

Croquis Firmata sur l'Arduino

Le croquis Firmata « StandardFirmata » est tout ce dont nous avons besoin sur l'Arduino ! Récupérez-le simplement à partir des exemples Arduino IDE et téléchargez-le (vous devrez peut-être d'abord désépingler le TX/RX pour terminer le téléchargement).

Remarque :en raison du manque de qualité de mon module Bluetooth, je baisse toujours le débit en bauds qui est codé en dur à l'intérieur du croquis, et le met à 9600.

Messieurs, démarrez vos moteurs

Ou, testez la connexion…

Alors pourquoi j'utilise Firmata ? parce que c'est facile. Comment facile? Très facile. Et cela peut même être fait sans programmation. Démarrez simplement l'application Windows Remote Arduino Experience (disponible dans le magasin et fonctionne également sur un appareil Windows 10 Mobile).

Vous devez d'abord vous connecter au module Bluetooth HC-6 déjà couplé.

Une fois jumelé, accédez à la page PWM. Activez la broche numérique 5 et attribuez-lui une valeur de, disons, 128.

Attention :l'étape suivante fera tourner votre moteur. Casque sur et roues de la farine. Vous saurez pourquoi lorsque vous le verrez.

Rendez-vous ensuite sur la page Numérique. Et basculez le commutateur de la broche numérique 6.

Maintenant, si tout est connecté et fonctionne, l'un des moteurs tournera !

Si c'est le cas, vous pouvez vérifier d'autres vitesses (en utilisant une valeur PWM supérieure ou inférieure) ou changer la direction (définir la broche numérique 6 sur 0 volt et la broche numérique 7 sur 5 volts).

Et voila. Vous pouvez contrôler cette roue !

Mais il y a plus, il en va de même pour la broche 10 (PWM) et la broche numérique 9 et la broche numérique 8.

Les deux roues tournent. Maintenant, commencez à coder…

L'application UWP en tant que créateur de correspondance

Il doit être clair que nous avons besoin d'une nouvelle application UWP entre le contrôleur Xbox One et le rover.

J'ai déjà blogué sur l'utilisation du contrôleur Xbox One ici. Cette fois, nous allons combiner ces connaissances avec notre rover.

Regardons l'interface de notre application UWP :

C'est assez ennuyeux, deux boutons et un bloc de texte. Je n'aurai plus rien à faire que de me connecter d'abord à l'Arduino en utilisant Firmata. Et une fois la connexion établie, le bouton du contrôleur devra lancer une boucle géante pour lire l'entrée du contrôleur et la transformer en commandes utiles.

Et ce que nous voulons créer, ce sont ces commandes de réservoir classiques avec deux poignées. Tout ce dont nous avons besoin est de vérifier les deux manettes sur le contrôleur Xbox One. Les déplacer vers l'avant et vers l'arrière fera également démarrer le moteur correspondant vers l'avant et vers l'arrière :

Remarque :si vous démarrez une nouvelle application UWP, n'oubliez pas d'ajouter la fonctionnalité Bluetooth. Et vous devrez installer le paquet nuget pour Firmata.

Tout d'abord, nous ajoutons l'extrait XAML (voir la section code pour le code source Xaml) dans la grille mainform afin d'avoir quelques boutons.

Ensuite, nous ajoutons le code derrière (voir la section code pour le code source C#) du formulaire principal. I est fondamentalement divisé en deux parties. Nous établissons d'abord une connexion via Bluetooth avec le protocole Firmata. Ensuite, nous commençons à écouter les entrées sur le contrôleur Xbox One.

Dans la boucle de vérification des commandes, nous décidons si une manette pointe vers l'avant ou vers l'arrière ou se trouve dans la plage « stop ». Après cela, nous décidons de la valeur de la broche PWM.

Il est intéressant de voir que l'écriture d'une valeur PWM est représentée dans Firmata comme l'écriture d'une valeur analogique sur un port numérique. Il n'y a pas de méthode PWM spéciale dans la classe Arduino.

J'ai ajouté deux méthodes "ArduinoDigitalWrite" et "ArduinoAnalogWrite" pour éviter d'écrire la même valeur encore et encore sur l'Arduino. Cela encombrera la communication et dégradera les performances de l'Arduino. (Dans une conception beaucoup plus riche, j'ai ajouté un buzzer. Sans ignorer les commandes en double, les performances du buzzer étaient extrêmement médiocres et terribles à entendre).

Lorsque les moteurs reçoivent les faibles impulsions PMW, le moteur ne commence pas directement à fonctionner, il gémit avec un son très distinctif. C'est un comportement normal. Et c'est ainsi que j'ai découvert que je devais ajouter deux sources d'alimentation. La première fois que j'ai tout connecté, j'ai pensé que le contrôleur était cassé. Rien ne s'est passé. Jusqu'à ce que je débranche l'un des moteurs et que l'autre se mette à gémir.

Voilà comment ça marche :

Note de bas de page :la lumière clignotante n'est pas seulement pour un effet dramatique. Chaque fois que vos créations commencent à bouger, soyez conscient de la sécurité. L'engin est stupide, vous ne l'êtes pas ! C'est pourquoi j'avais mis cette lumière dessus en premier lieu.

Code

  • Contrôles Xaml pour démarrer la communication
  • Code-Behind du formulaire principal de l'application UWP
Contrôles Xaml pour démarrer la communicationsnippets
Collez-le dans le formulaire principal de votre nouvelle application UWP
 
Code-Behind du formulaire principal de l'application UWPC#
Ce code se connecte au rover à l'aide de Firmata et transmet les commandes du contrôleur Xbox One
classe partielle scellée publique MainPage :Page{ private BluetoothSerial _bluetooth; privé RemoteDevice _arduino; privé UwpFirmata _firmata =null; manette de jeu privée _Gamepad =null; // Nous ne fournissons jamais de PWM supérieur à 255 * 0,75 private double _SpeedLimit =0.75; // les valeurs inférieures à cette valeur absolue arrêtent le rover private double _ActionPoint =0.15; octet privé _LeftForward =6 ; octet privé _LeftBackward =7 ; octet privé _LeftValue =5 ; octet privé _RightForward =9 ; octet privé _RightBackward =8 ; octet privé _RightValue =10 ; Private Dictionary _CurrentPinStates =new Dictionary(); Private Dictionary _CurrentSpeedValues ​​=new Dictionary(); public MainPage() { this.InitializeComponent(); } void privé btnStart_Click (expéditeur d'objet, RoutedEventArgs e) { btnStart.IsEnabled =false; Gamepad.GamepadAdded +=Gamepad_GamepadAdded ; Gamepad.GamepadRemoved +=Gamepad_GamepadRemoved ; _bluetooth =new BluetoothSerial("HC-06"); _bluetooth.ConnectionLost +=BluetoothConnectionLost ; _bluetooth.ConnectionFailed +=BluetoothConnectionFailed ; _bluetooth.ConnectionEstablished +=OnConnectionEstablished ; _firmata =new UwpFirmata(); _arduino =new RemoteDevice(_firmata); _firmata.begin(_bluetooth); _bluetooth.begin (9600, SerialConfig.SERIAL_8N1) ; _arduino.DeviceReady +=ArduinoDeviceReady ; } privé asynchrone void BluetoothConnectionLost(string message) { wait Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="ConnectionLost" + message;      btnStart.IsEnabled =true; }); } privé asynchrone void BluetoothConnectionFailed(string message) { wait Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="ConnectionFailed" + message;       btnStart.IsEnabled =true; }); } privé asynchrone void ArduinoDeviceReady() { wait Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Device Ready"; }); } private void OnConnectionEstablished() { var action =Dispatcher.RunAsync( CoreDispatcherPriority.Normal, new DispatchedHandler(() => { DisableEnableButtons(true); ArduinoDigitalWrite(_LeftForward, PinState.LOW); ArduinoDigitalWrite(_LeftLOWBackward); (_RightBackward, PinState.LOW); ArduinoDigitalWrite (_RightForward, PinState.LOW); })); } private void DisableEnableButtons(bool enabled) { // Désactive tous les boutons. Sinon // le 'A' appuiera sur celui mis au point. btnController.IsEnabled =activé ; btnStart.IsEnabled =activé ; } privé asynchrone vide Gamepad_GamepadRemoved( expéditeur d'objet, Gamepad e) { _Gamepad =null; wait Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Contrôleur supprimé"; }); } privé asynchrone vide Gamepad_GamepadAdded( expéditeur d'objet, Gamepad e) { _Gamepad =e; wait Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Contrôleur ajouté"; }); } privé asynchrone void btnController_Click (expéditeur d'objet, RoutedEventArgs e) { DisableEnableButtons (false); while (true) { wait Task.Delay(TimeSpan.FromMilliseconds(3)); if (_Gamepad ==null) { continuer ; } // Récupère l'état actuel var reading =_Gamepad.GetCurrentReading(); if (Math.Abs(reading.LeftThumbstickY) <_ActionPoint) { ArduinoDigitalWrite(_LeftForward, PinState.LOW); ArduinoDigitalWrite(_LeftBackward, PinState.LOW); sldrLeftSpeed.Value =0; } else if (reading.LeftThumbstickY>=_ActionPoint) { ArduinoDigitalWrite(_LeftForward, PinState.HIGH); ArduinoDigitalWrite(_LeftBackward, PinState.LOW); sldrLeftSpeed.Value =255 * Math.Abs(reading.LeftThumbstickY) * _SpeedLimit; } else if (reading.LeftThumbstickY <=-_ActionPoint) { ArduinoDigitalWrite(_LeftForward, PinState.LOW); ArduinoDigitalWrite(_LeftBackward, PinState.HIGH); sldrLeftSpeed.Value =255 * Math.Abs(reading.LeftThumbstickY) * _SpeedLimit; } if (Math.Abs(reading.RightThumbstickY) <_ActionPoint) { ArduinoDigitalWrite(_RightForward, PinState.LOW); ArduinoDigitalWrite(_RightBackward, PinState.LOW); sldrRightSpeed.Value =0; } else if (reading.RightThumbstickY>=_ActionPoint) { ArduinoDigitalWrite(_RightForward, PinState.HIGH); ArduinoDigitalWrite(_RightBackward, PinState.LOW); sldrRightSpeed.Value =255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit; } else if (reading.RightThumbstickY <=-_ActionPoint) { ArduinoDigitalWrite(_RightForward, PinState.LOW); ArduinoDigitalWrite(_RightBackward, PinState.HIGH); sldrRightSpeed.Value =255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit; } } } private void ArduinoDigitalWrite(byte port, PinState state) { // ignore les commandes en double var existe =_CurrentPinStates.ContainsKey(port); if (!existe || _CurrentPinStates[port] !=état) { _CurrentPinStates[port] =état ; _arduino.digitalWrite(port, état); } } private void ArduinoAnalogWrite(byte port, ushort value) { // ignore les commandes en double var existe =_CurrentSpeedValues.ContainsKey(port); if (!existe || _CurrentSpeedValues[port] !=valeur) { _CurrentSpeedValues[port] =valeur ; _arduino.analogWrite(port, valeur); } }}

Processus de fabrication

  1. Système de présence utilisant Arduino et RFID avec Python
  2. Télécommande universelle utilisant Arduino, 1Sheeld et Android
  3. Voltmètre DIY utilisant Arduino et Smartphone
  4. Utiliser l'IoT pour contrôler à distance un bras robotique
  5. Mesure de la fréquence et du cycle de service à l'aide d'Arduino
  6. Sonar utilisant arduino et affichage lors du traitement de l'IDE
  7. Contrôle de la luminosité des LED à l'aide de Bolt et Arduino
  8. Bras robotique simple et intelligent utilisant Arduino
  9. Contrôle total de votre téléviseur à l'aide d'Alexa et d'Arduino IoT Cloud