Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Steuern Sie Arduino Rover mit Firmata und Xbox One-Controller

Komponenten und Verbrauchsmaterialien

Microsoft Xbox Controller und Wireless Adapter für Windows
Dieser Controller kann mit dem Adapter zu einem Windows-PC hinzugefügt werden
× 1
SparkFun Bluetooth-Modem - BlueSMiRF Silber
Oder ein identisches (HC-05, HC-06) Bluetooth-Modul
× 1
Arduino UNO
× 1

Apps und Onlinedienste

Microsoft Windows 10 IoT Core
Diese App ist das Zwischenprodukt zwischen der standardmäßigen Firmata-Skizze und dem Xbox One-Controller

Über dieses Projekt

Vor ein paar Monaten habe ich mir einen kleinen Rover (gesteuert von einem Arduino Uno) zu einem sehr guten Preis gekauft. Der Bausatz war sehr vollständig:Autochassis, 2 Autoräder, 2 DC-Getriebemotoren, ein UNO R3, ein L298N Dual H-Bridge Motor Controller und mehrere andere Komponenten.

Dieser Rover soll für den autonomen Betrieb programmiert werden. Daher wird dem Bausatz auch ein Ultraschallsensor und ein Servo hinzugefügt. Auch ein schönes Arduino Sensor Shield 5 ist im Bausatz enthalten. Ja, das war ein echtes Schnäppchen;-)

Aber meine Idee war, sowohl einen Xbox One Controller als auch das Firmata-Protokoll zu verwenden, um diesen von mir oder einem meiner Söhne zu steuern. Und es funktioniert sehr gut!

Hier ist ein Video der endgültigen Lösung:

Die Hauptbestandteile dieses Projekts sind:

  • Ein Rover-Kit (wir verwenden für diese Demonstration nur eine Teilmenge der Teile: die Grundplatte, die Räder, die Motoren, das Arduino Uno, den 9-Volt-Batteriehalter und den L298N Dual H-Bridge Motor Controller)
  • Ein zusätzlicher Batteriehalter für 6 AA-Batterien
  • Ein Bluetooth-Modul (HC-06)
  • Ein Xbox One-Controller mit WLAN-Adapter für Windows (um ihn mit einem Laptop zu verbinden)
  • Ein Laptop (mit Windows 10 + VS2015 + Bluetooth-Dongle)
  • Ein Blitzlicht nur für dramatische Effekte

Bausatz bauen

Das Bauen des Bausatzes ist nicht so schwer. Obwohl die Bauanleitung auf Chinesisch war, scheint alles ziemlich logisch. Es gibt nur eine Grundplatte, also musste ich einige Komponenten oben und einige unten platzieren (jetzt die Motorsteuerung):

In diesem Bild sind zwei verschiedene Batteriehalter hinzugefügt. Beim Programmieren habe ich festgestellt, dass ich ein separates Netzteil verwenden muss, um die Motoren zum Laufen zu bringen.

Anschließen der Motoren – Pinbelegung des Controllers

Das Herzstück der Hardware ist diesmal nicht das Arduino Uno, sondern der Motorcontroller.

„Der L298 ist ein Dual-H-Brücken-Treiber für DC-Bürstenmotoren und Schrittmotoren. Es unterstützt einen breiten Betriebsspannungsbereich und kann 2 A pro Kanal in einem Gehäuse mit Durchgangsbohrung liefern, das für Do-it-yourself-Projekte zugänglich ist."

Dieser Controller steuert die Geschwindigkeit und Richtung jedes der beiden Motoren mithilfe von Signalen, die vom Arduino kommen.

Das Pin-Layout des L298N Dual H-Bridge Motor Controllers ist:

  • Plus + von Gleichstrommotor 1
  • Minus – von Gleichstrommotor 1
  • Strom EIN. Ich liefere 9 Volt aus einem separaten Batteriehalter
  • Gemeinsamkeit. Verbunden mit meinem separaten Batteriehalter und dem Arduino
  • Ausschalten . Kann 5 Volt erzeugen (nicht verwendet . Mein Arduino wird von einem anderen Batteriehalter mit Strom versorgt)
  • ENA mit Arduino D10 verbunden. Dieser Port unterstützt PWM (weiß)
  • IN1 ist mit Arduino D9 verbunden. (grau)
  • IN2 mit Arduino D8 verbunden. (lila)
  • IN3 mit Arduino D7 verbunden. (blau)
  • IN4 mit Arduino D6 verbunden. (grün)
  • ENB mit Arduino D5 verbunden. Dieser Port unterstützt PWM (gelb)
  • Plus + von DC-Motor 2
  • Minus – von Gleichstrommotor 2
  • Der Pullover neben 2 und 3 wird NICHT entfernt weil ich die Eingangsleistung nicht über 12 Volt (bis 35 Volt) überschreite (Jumper im Bild nicht markiert)

Hinweis:Der Controller verfügt über eine eigene Stromversorgung. Der Arduino hat auch einen. Um die Dinge am Laufen zu halten (ohne Dinge in die Luft zu sprengen, gib ihnen eine gemeinsame Basis . Siehe Punkt 4 oben)

Anschließen der Motoren – Pinbelegung von Arduino

Das Anschließen des Arduino ist ziemlich einfach. Wir verbinden die Masse und die 5 Volt der Stromversorgung mit dem Arduino. Und wir verbinden die sechs Leitungen (ENA, IN1-4 und ENB) mit Pin D10 bis D5.

Es muss klar sein, dass Port 7 und 8 (und 9 und 10 für den anderen Motor) nur normale GPIO-Ports sind. Diese werden für die Richtung des Motors verwendet. Wenn beide Ports (zB 7 und 8) LOW sind, tut der Motor nichts (er stoppt). Wenn einer HIGH und der andere LOW ist, läuft der Motor in eine Richtung. Bei umgekehrtem Anschluss (der erste ist auf LOW und der andere auf HIGH eingestellt) läuft der angeschlossene Motor in die andere Richtung.

Aber.. nur diese Pins zu setzen führt zu nichts. Noch keine beweglichen Teile!

Die Magie kommt von Pin 5 und 10. Dies sind "spezielle" Pins, die ein PWM-Signal erzeugen können. Das Einstellen eines Wertes zwischen 0 und 255 führt dazu, dass der Motor SEHR langsam (gestoppt) oder mit hoher Geschwindigkeit läuft.

Hinweis:Jeder PWM-fähige Port des Arduino Uno ist mit einer Tilde (dem ~) gekennzeichnet.

Bluetooth verbinden

Das von mir verwendete Bluetooth-Modul muss nur an den RX- und TX-Port angeschlossen werden (überqueren Sie die Leitungen) und es benötigt 5 Volt Strom und Masse vom Arduino.

Firmata-Skizze auf dem Arduino

Die Firmata-Skizze „StandardFirmata“ ist alles, was wir auf dem Arduino brauchen! Holen Sie es sich einfach aus den Arduino-IDE-Beispielen und laden Sie es hoch (vielleicht müssen Sie zuerst den TX / RX lösen, um den Upload abzuschließen).

Hinweis:Aufgrund der mangelnden Qualität meines Bluetooth-Moduls verringere ich immer die im Sketch fest codierte Baudrate und setze sie auf 9600.

Meine Herren, starten Sie Ihre Motoren

Oder testen Sie die Verbindung…

Warum verwende ich Firmata? weil es einfach ist. Wie einfach? Sehr leicht. Und das sogar ohne Programmierung. Starten Sie einfach die Windows Remote Arduino Experience App (im Store erhältlich und funktioniert auch auf einem Windows 10 Mobile-Gerät).

Zuerst müssen Sie sich mit dem bereits gekoppelten HC-6-Bluetooth-Modul verbinden.

Rufen Sie nach der Kopplung die PWM-Seite auf. Aktivieren Sie den digitalen Pin 5 und geben Sie ihm einen Wert von beispielsweise 128.

Achtung:Der nächste Schritt bringt Ihren Motor zum Laufen. Helm auf und das Mehl abrollen. Sie werden wissen, warum, wenn Sie es sehen.

Dann gehen Sie auf die Seite Digital. Und lege den Schalter des digitalen Pins 6 um.

Wenn jetzt alles angeschlossen ist und läuft, dreht sich einer der Motoren!

In diesem Fall können Sie andere Geschwindigkeiten prüfen (mit einem höheren oder niedrigeren PWM-Wert) oder die Richtung ändern (digitalen Pin 6 auf 0 Volt und digitalen Pin 7 auf 5 Volt setzen).

Und da hast du es. Du kannst dieses Rad steuern!

Aber es gibt noch mehr, das gleiche gilt für Pin 10 (PWM) und Digital Pin 9 und Digital Pin 8.

Beide Räder laufen. Beginnen Sie jetzt mit der Codierung…

Die UWP-App als Matchmaker

Es muss klar sein, dass wir eine neue UWP-App zwischen dem Xbox One-Controller und dem Rover brauchen.

Ich habe hier bereits über die Verwendung des Xbox One-Controllers gebloggt. Dieses Mal werden wir dieses Wissen mit unserem Rover kombinieren.

Schauen wir uns die Benutzeroberfläche unserer UWP-App an:

Es ist ziemlich langweilig, zwei Tasten und ein Textblock. Ich habe nichts mehr zu tun, als mich zuerst mit Firmata mit dem Arduino zu verbinden. Und sobald die Verbindung hergestellt ist, muss die Controller-Taste eine riesige Schleife starten, um die Controller-Eingabe zu lesen und in nützliche Befehle umzuwandeln.

Und was wir schaffen wollen, ist diese klassische Panzersteuerung mit zwei Griffen. Alles, was wir brauchen, ist, die beiden Thumbsticks auf dem Xbox One-Controller zu überprüfen. Wenn Sie sie vorwärts und rückwärts bewegen, wird auch der entsprechende Motor vorwärts und rückwärts gestartet:

Hinweis:Wenn Sie eine neue UWP-App starten, vergessen Sie nicht, die Bluetooth-Funktion hinzuzufügen. Und Sie müssen das Nuget-Paket für Firmata installieren.

Zuerst fügen wir das XAML-Snippet (siehe Codeabschnitt für Xaml-Quellcode) in das Hauptformularraster ein, damit wir einige Schaltflächen haben.

Als nächstes fügen wir den Code Behind (siehe Codeabschnitt für C#-Quellcode) des Hauptformulars hinzu. I ist grundsätzlich in zwei Teile gegliedert. Zuerst stellen wir eine Verbindung über Bluetooth mit dem Firmata-Protokoll her. Als nächstes hören wir auf Eingaben auf dem Xbox One-Controller.

Innerhalb der Schleife zur Kontrolle der Bedienelemente entscheiden wir, ob ein Thumbstick nach vorne oder hinten zeigt oder sich im „Stopp“-Bereich befindet. Danach entscheiden wir, welchen Wert der PWM-Pin haben soll.

Es ist interessant zu sehen, dass das Schreiben eines PWM-Werts in Firmata als das Schreiben eines analogen Werts an einen digitalen Port dargestellt wird. Es gibt keine spezielle PWM-Methode in der Arduino-Klasse.

Ich habe zwei Methoden „ArduinoDigitalWrite“ und „ArduinoAnalogWrite“ hinzugefügt, um zu verhindern, dass der gleiche Wert immer wieder auf den Arduino geschrieben wird. Dies wird die Kommunikation stören und die Leistung des Arduino beeinträchtigen. (In einem viel reichhaltigeren Design habe ich einen Summer hinzugefügt. Ohne doppelte Befehle zu ignorieren, war die Leistung des Summers extrem schlecht und schrecklich zu hören).

Wenn die Motoren die niedrigen PMW-Impulse erhalten, beginnt der Motor nicht direkt zu laufen, er heult mit einem sehr markanten Geräusch. Dies ist ein normales Verhalten. Und so fand ich heraus, dass ich zwei Stromquellen hinzufügen musste. Als ich das erste Mal alles angeschlossen habe, dachte ich, der Controller sei kaputt. Nichts ist passiert. Bis ich einen der Motoren aus der Steckdose zog und der andere anfing zu jammern.

So funktioniert es:

Fußnote:Das Blitzlicht dient nicht nur der dramatischen Wirkung. Immer wenn Ihre Kreationen in Bewegung geraten, achten Sie bitte auf die Sicherheit. Der Apparat ist dumm, du nicht! Dafür hatte ich diese Leuchte erst einmal darüber gelegt.

Code

  • Xaml-Steuerelemente zum Starten der Kommunikation
  • Code-Behind des UWP-App-Hauptformulars
Xaml-Steuerelemente zum Starten der KommunikationSnippets
Fügen Sie dies in das Hauptformular Ihrer neuen UWP-App ein
 
Code-Behind der UWP-App-HauptformC#
Dieser Code stellt über Firmata eine Verbindung zum Rover her und leitet Xbox One Controller-Befehle weiter.
öffentliche versiegelte Teilklasse MainPage :Page{ private BluetoothSerial _bluetooth; privates RemoteDevice _arduino; private UwpFirmata _firmata =null; privates Gamepad _Gamepad =null; // Wir liefern nie eine PWM von mehr als 255 * 0,75 private double _SpeedLimit =0,75; // Werte unter diesem absoluten Wert stoppen den Rover private double _ActionPoint =0.15; privates Byte _LeftForward =6; privates Byte _LeftBackward =7; privates Byte _LeftValue =5; privates Byte _RightForward =9; privates Byte _RightBackward =8; privates Byte _RightValue =10; privates Wörterbuch _CurrentPinStates =neues Wörterbuch(); privates Dictionary _CurrentSpeedValues ​​=new Dictionary(); public MainPage() { this.InitializeComponent(); } private void btnStart_Click (Objektsender, RoutedEventArgs e) { btnStart.IsEnabled =false; Gamepad.GamepadAdded +=Gamepad_GamepadAdded; Gamepad.GamepadRemoved +=Gamepad_GamepadRemoved; _bluetooth =neue BluetoothSerial("HC-06"); _bluetooth.ConnectionLost +=BluetoothConnectionLost; _bluetooth.ConnectionFailed +=BluetoothConnectionFailed; _bluetooth.ConnectionEstablished +=OnConnectionEstablished; _firmata =neue UwpFirmata(); _arduino =neues RemoteDevice(_firmata); _firmata.begin(_bluetooth); _bluetooth.begin(9600, SerialConfig.SERIAL_8N1); _arduino.DeviceReady +=ArduinoDeviceReady; } private async void BluetoothConnectionLost(string message) { await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="ConnectionLost" + Nachricht;      btnStart.IsEnabled =true; }); } private async void BluetoothConnectionFailed(string message) { await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="ConnectionFailed" + message;       btnStart.IsEnabled =true; }); } private async 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(_LeftBackward, PinState.LOW); ArduinoDigitalWrite (_RightBackward, PinState.LOW); ArduinoDigitalWrite (_RightForward, PinState.LOW); })); } private void DisableEnableButtons(bool aktiviert) {// Alle Schaltflächen deaktivieren. Andernfalls // drückt das 'A' auf das fokussierte. btnController.IsEnabled =aktiviert; btnStart.IsEnabled =aktiviert; } private async void Gamepad_GamepadRemoved( Objektsender, Gamepad e) { _Gamepad =null; wait Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Controller entfernt"; }); } private async void Gamepad_GamepadAdded( Objektsender, Gamepad e) { _Gamepad =e; wait Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Controller hinzugefügt"; }); } privat async void btnController_Click (Objektsender, RoutedEventArgs e) { DisableEnableButtons (false); while (true) { wait Task.Delay (TimeSpan.FromMilliseconds(3)); if (_Gamepad ==null) { fortfahren; } // Aktuellen Status abrufen var reading =_Gamepad.GetCurrentReading(); if (Math.Abs ​​(reading.LeftThumbstickY) <_ActionPoint) { ArduinoDigitalWrite (_LeftForward, PinState.LOW); ArduinoDigitalWrite (_LeftBackward, PinState.LOW); sldrLeftSpeed.Value =0; aufrechtzuerhalten. Sonst if (reading.LeftThumbstickY>=_ActionPoint) { ArduinoDigitalWrite (_LeftForward, PinState.HIGH); ArduinoDigitalWrite (_LeftBackward, PinState.LOW); sldrLeftSpeed.Value =255 * Math.Abs(reading.LeftThumbstickY) * _SpeedLimit; aufrechtzuerhalten. Sonst 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; aufrechtzuerhalten. Sonst if (reading.RightThumbstickY>=_ActionPoint) { ArduinoDigitalWrite (_RightForward, PinState.HIGH); ArduinoDigitalWrite (_RightBackward, PinState.LOW); sldrRightSpeed.Value =255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit; aufrechtzuerhalten. Sonst if (reading.RightThumbstickY <=-_ActionPoint) { ArduinoDigitalWrite (_RightForward, PinState.LOW); ArduinoDigitalWrite (_RightBackward, PinState.HIGH); sldrRightSpeed.Value =255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit; aufrechtzuerhalten. if (!existiert || _CurrentPinStates[Port] !=Zustand) { _CurrentPinStates[Port] =Zustand; _arduino.digitalWrite (Port, Zustand); aufrechtzuerhalten. if (!existiert || _CurrentSpeedValues[Port] !=Wert) { _CurrentSpeedValues[Port] =Wert; _arduino.analogWrite (Port, Wert); } }}

Herstellungsprozess

  1. Anwesenheitssystem mit Arduino und RFID mit Python
  2. Universelle Fernbedienung mit Arduino, 1Sheeld und Android
  3. DIY-Voltmeter mit Arduino und Smartphone
  4. Einsatz des IoT zur Fernsteuerung eines Roboterarms
  5. Frequenz- und Duty-Cycle-Messung mit Arduino
  6. Sonar mit Arduino und Anzeige bei der Verarbeitung von IDE
  7. Steuerung der LED-Helligkeit mit Bolt und Arduino
  8. Einfacher und intelligenter Roboterarm mit Arduino
  9. Volle Kontrolle über Ihren Fernseher mit Alexa und Arduino IoT Cloud
  10. FM-Radio mit Arduino und RDA8057M