Stap 4: Samenstellen van stukken
Als u volledig alle materialen in de vorige stappen begrepen, moet u zitten kundig voor schrijven een XBox-controller-naar-UART-interface of PC-Arduino communicatie uit te voeren op uw eigen.
Als laatste voorbeeld zal ik gebruik maken van een zeer eenvoudige contraption: een Arduino met enkele LED's en de zoemer.
Ik wilde oorspronkelijk een kleine RC auto te bouwen, maar als gevolg van langdurige vertragingen in de levering van de onderdelen die ik niet zal kunnen om het te doen ten minste voor een andere week of zo... Hebt u een paar EasyDriver planken kan u richting pin in plaats van gele LED, en motor stap pin in plaats van rode LEDs (zie schema hierboven). Een piëzo-zoemer aangesloten op pin D3 reageert op elke druk op de knop op de controller.
De volledige functiebeschrijving neer op dit:
- Lees de XBox controller staat en het omvormen van een korte, maar goed gedefinieerde tekenreeks.
In mijn geval ben ik alleen verzenden motor snelheid, richting en de status van de knop, zodat het bericht ziet er als volgt:
LLL RRR D BBBB
waarbij LLL is de motorsnelheid van links, RRR is de motorsnelheid van recht en BBBB knopstatus van de vertegenwoordigt.
D is een motor richting, waarin slechts twee waarden: 1 voor voorwaarts en 0 voor achteruit.
Zowel LLL RRR zal worden genormaliseerd voor deadzones en geschaald naar kleinere waarden (tot 255)Als alternatief kunt u de onbewerkte XINPUT gegevens verzenden met arduino en verwerken het op de microcontroller zelf.
- Volgende, wij verzenden dit bericht via UART Arduino
- Alle motor snelheden verkregen waarden instellen en controleren van de status van de knop om te bepalen aanvullende acties
- Sommige gegevens verzenden naar PC (ik ben gewoon het verzenden van motor snelheden voor foutopsporing)
- Opgehaalde gegevens wordt verwerkt tot sommige visuele representatie. Alles wat die je wilt, zij het een eenvoudige tekstuitvoer in consolevenster, oftewel de GUI-gebaseerde productie, zoals voortgangsbalken, diagrammen, stroomdiagrammen of zelfs OpenGL rendering gebruiken
We hebben al geleerd hoe om te lezen van de UART berichten met behulp van gebeurtenissen, zodat we echt niet hoeft te maken over de juiste timing. PC-side-code kan verder verbeterd worden met deze leuke dingen, zoals multithreading en asynchrone communicatie, maar wij dat vandaag niet zal doen.
Dus, laten we beginnen met Arduino.
Bijgevoegd is een eenvoudige schets voor onze RC auto. Niets bijzonders, gewoon instellen motor snelheid afhankelijk van de positie van de analoge stick.
sqrt(LX*LX+ly*ly) stelt de omvang van de motorsnelheid
LY sign(-or +) regelt het de richting van de beweging (vooruit- of terugspoelen).
Op basis van de waarde van LX zetten we het verschil tussen links en rechts motorsnelheid. Als LX positief is, dan links motor is ingesteld op de huidige waarde van de snelheid, en rechts van de motor uses(128-LX). Als LX negatief is, toewijzen we waarden andersom.
Ik heb een kleine klasse, genaamd XBoxUart, die alle dingen die we geleerd hebben eerder in één programma combineert gemaakt op de PC zijde.
Gebruik onderstaande links om te downloaden van de broncode voor de PC en Arduino-kant.
Ten eerste, het uploaden van de schets van de arduino. U kunt testen of het werkt door een seriële Monitor op 115200 BZV en verzenden gegevens handmatig. Bijvoorbeeld message "100 100 1 0" is een equivalent van moving forward 100 stappen (links en rechts motors) met geen knoppen ingedrukt. Reactie moet je strijkers, weergegeven in de screenshot hierboven.
Opmerking: Vergeet niet de naam van de COM-poort wijzigen in wat uw Arduino CDC is. Hebt u een HC-05-module, kunt u het rechtstreeks op de Arduino RX en TX pinnen, als u wilt om het te proberen zonder draden.
Nu kunt u compileren van de C++-code in Visual Studio, beginnen uw XBox-controller, start het programma op uw PC en zie hoe LED's (of motoren) hun gedrag met beweging van de analoge stick veranderen! Elke knop in te drukken zal leiden tot de zoemer. De output in het consolevenster zal zijn vergelijkbaar met wat je op de laatste screenshot ziet.