Stap 9: Auto gaspedaal en stuurwiel
Het gaspedaal en stuurwiel op de auto zijn "analoge", wat betekent dat met behulp van de XBox-controller, de auto kan gaan op een aantal snelheden, en sla bij een bereik van stuurwiel hoeken. De juiste trigger wordt gebruikt voor het doorsturen van berichten, de trekker met links wordt gebruikt voor reverse en de linker analoge stick wordt gebruikt voor de besturing (dit zijn de standaardbesturingselementen voor XBox racegames). Om het verzenden van deze "analoge" ingangen van de XBox-controller aan de auto, reist de gegevens via de programma's als volgt:
Gaspedaal gegevens - C#:
1. de status van de XBox-Controller wordt gelezen. Links/rechts trigger waarden worden opgeslagen als drijvers
2. een vergelijking is gemaakt tussen de twee trigger-waarden. De grotere waarde gebruikt, en de kleinere waarde wordt genegeerd (bijvoorbeeld indien zowel voorwaarts als achteruit worden ingedrukt, de grotere waarde "wint")
3. de waarde wordt vermenigvuldigd met 100 en gemanipuleerd zodat 0 snelheid de waarde 500 is. Dit betekent dat de volledige snelheid omgekeerde overeen met de waarde "400 komt", en volle snelheid vooruit is de waarde "600". Dit werd gedaan om te voorkomen dat nodig om het gebruik van negatieve getallen, en de keuze van 500 als het middelpunt was volledig willekeurig.
4. de nieuwwaarde van de gashendel wordt geconverteerd naar een tekenreeks (zoals 3 cijfers).
5. de gashendel tekenreeks wordt toegevoegd aan de output string C#, en verstuurd naar de Arduino wanneer dit nodig is.
Gaspedaal gegevens - Arduino:
1. de Arduino ontvangt de volledige tekenreeks en slaat de gashendel tekens een karakter array.
2. de gashendel karakter array wordt omgezet in een int
3. met behulp van de "kaart"-functie, de waarde van de gashendel wordt omgezet in een compatibel waarde voor het ESC. Het ESC accepteert dezelfde controle signalen als servomotoren, dus de Servo-type wordt gebruikt voor het schrijven van een "diploma" waarde naar de ESC-pin. Het ESC is gekalibreerd zodanig dat 0 graden is volle snelheid omgekeerde en 180 graden is volle snelheid vooruit. 90 graden is 0 snelheid.
4. de waarde wordt weggeschreven naar het ESC.
In de C#-code ziet u ook enkele extra functies die het manipuleren van het gaspedaal. Deze werden opgenomen voor het wijzigen van de rijeigenschappen, maar ik heb niet vond ze dat nuttig. Een van deze functies gaat een lineaire/kwadraat/cubed gashendel modus. Lineaire modus biedt een 1:1 relatie tussen de positie van de trigger en de snelheid. Dus, het indrukken van de forwards trigger halverwege resultaten in de auto rijdt met de helft van de max snelheid. Vierkante modus houdt de kwadratuur van de ruwe waarde, dus halverwege het indrukken van de trigger resulteert in de auto rijdt met een kwart van de max snelheid. Dit biedt meer scala controle bij lagere snelheden, en minder bij hogere snelheden. Deze gaspedaal modi kunnen worden geselecteerd gebruikend de daling onderaan doos op de C#-programma GUI (met een muis).
De andere functie omvat de mogelijkheid om enable/disable "langzaam mode", door op de B-knop op de controller van de XBox. Trage modus beperkt de topsnelheid van de auto aan de helft van de max snelheid. Zo, zou u het volledige scala van de triggers om lagere snelheden. Deze modus komt eigenlijk handig soms - het is geweldig voor een nauwkeurige besturing bij lage snelheden.
Besturing is vrij gelijkaardig aan het gaspedaal. De manier waarop de gegevens reizen is:
Besturing van gegevens - C#:
1. de status van de XBox-Controller wordt gelezen. De waarde van de x-as linker analoge stick wordt opgeslagen als een float
2. de waarde wordt vermenigvuldigd met 100 en 500 is toegevoegd. Dit betekent dat de volledige links gelijk aan de waarde "400 is", en volledige recht de waarde "600 is". Dit werd gedaan om te voorkomen moeten negatieve getallen gebruiken als het gaspedaal, en de keuze van 500 als het middelpunt was volledig willekeurige.
3. de stuurinrichting nieuwwaarde wordt geconverteerd naar een tekenreeks (zoals 3 cijfers).
4. de stuurinrichting tekenreeks wordt toegevoegd aan de output string C#, en verstuurd naar de Arduino wanneer dit nodig is.
Besturing gegevens - Arduino:
1. de Arduino ontvangt de volledige tekenreeks en slaat de stuurinrichting tekens een karakter array.
2. de stuurinrichting karakter array wordt omgezet in een int
3. met behulp van de functie "kaart", de bedieningsinrichting waarde wordt omgezet in een compatibel waarde voor de stuurinrichting servo. Merk op dat het stuur servo niet over het volledige bereik van 0 tot en met 180 beschikt. Op mijn auto, volledige links is 133 graden en volledige recht is 60 graden, met een centrum-waarde van ongeveer 96 graden
4. de waarde wordt weggeschreven naar het stuur servo.
Als het gaspedaal, kan de besturing worden geconfigureerd om lineaire/kwadraat/cubed modus in het C#-programma. Ik vond dat voor mijn auto dit een beetje zinloos, vanwege het relatief kleine bereik in stuurhoek was. Omdat de wielen niet ver draaien, is het gemakkelijk om hen naar de juiste hoek in lineaire mode.
Opmerking over Arduino Servo bibliotheken:
Toen ik de Arduino schets aan het ontwikkelen was, gebruikte ik de Arduino Servo-standaardbibliotheek voor zowel het ESC en het stuur servo. Zodra ik de NeoPixel stick geïntroduceerd, de Servo-bibliotheek niet meer kon worden gebruikt (Zie https://learn.adafruit.com/neopixels-and-servos). De TiCoServo bibliotheek werkt net zo goed in mijn RC auto, maar er zijn grenzen - slechts twee servo's tegelijkertijd kunnen worden gebruikt, alleen een klein aantal pinnen worden (zelfs op een Arduino Mega gebruikt kan), en alleen bepaalde paren van deze pinnen kunnen samenwerken. De laatstgenoemde werd bedacht door vallen en opstaan...