Arduino RC bil med FPV Camera (9 / 15 steg)
Steg 9: Bilen gas och styrning
Den gas och styrning på bilen är "analog", vilket innebär att med hjälp av XBox controller, bilen kan flytta på en rad olika hastigheter, och vända på en rad styra vinklarna. Den rätt trigger används för framlänges, vänster utlösaren används för omvänd och vänster styrspak används för styrning (dessa är standardkontroller för XBox spel). För att överföra dessa "analoga" ingångar från XBox-handkontrollen till bilen, färdas data genom program som följer:
Throttle Data - C#:
1. statusen XBox Controller läses. Vänster/höger avtryckare värden sparas som flöten
2. en jämförelse görs mellan de två trigger värdena. Det större värdet används och det lägre värdet ignoreras (t.ex om både framåt och bakåt är nere, det större värdet "vinner")
3. värdet är multiplicerat med 100, och manipuleras så att 0 hastighet är värdet 500. Detta innebär att full fart bakåt är motsvarande värdet "400", och full fart framåt är värdet "600". Detta gjordes för att förhindra att behöva använda negativa tal, och valet av 500 som mittpunkten var helt godtyckligt.
4. det nya spjäll värdet konverteras till en sträng (som 3 siffror).
5. spjäll strängen läggs till Utdatasträngen C#, och skickas till Arduino när det behövs.
Throttle Data - Arduino:
1. Arduino får full sträng, och sparar gas tecken till en karaktär array.
2. gasen karaktär array konverteras till ett int
3. använda funktionen "karta", spjäll värdet konverteras till ett kompatibelt värde för ESC. ESK accepterar samma styrsignaler som servomotorer, så Servo typen används för att skriva ett "graden" värde till ESC stift. ESK har kalibrerats så att 0 grader är full fart bakåt och 180 grader är full fart framåt. 90 grader är 0 hastighet.
4. värdet skrivs till ESC.
I C#-koden ser du också några extra funktioner som manipulerar gasreglaget. Dessa ingick att förändra körsättet, men jag har inte hittat dem som användbara. En av dessa funktioner innebär en linjär/fyrkant/kubik gas läge. Linjärt läge finns en 1:1-relation mellan avtryckaren position och hastighet. Så, att trycka framåt avtryckaren halvvägs resultaten i bilen rör sig med hälften av dess max hastighet. Fyrkantiga läge innebär kvadratur raw värdet, så att trycka på avtryckaren halvvägs leder till bilen rör sig med en fjärdedel av dess max hastighet. Detta ger mer utbud av kontroll vid lägre hastigheter, och mindre vid högre hastigheter. Dessa spjäll lägen kan väljas med droppa ned låda på C# program GUI (med en mus).
Den andra funktionen innebär förmågan att aktivera/inaktivera "långsamt mode", genom att trycka på B-knappen på XBox-handkontrollen. Långsam läge begränsar bilens toppfart till hälften av dess max hastighet. Så, kan du använda alla de triggers för att styra lägre hastigheter. Detta läge faktiskt är praktiskt ibland - det är bra för exakt kontroll vid låga hastigheter.
Styrningen är ganska lika till spjäll. Hur data färdas är:
Styrning Data - C#:
1. statusen XBox Controller läses. Vänster styrspak x-värde sparas som en flöte
2. värdet multipliceras med 100, och 500 läggs. Detta innebär att hela vänster är motsvarande värdet "400", och full rätt är värdet "600". Detta gjordes för att förhindra att behöva använda negativa tal som gasen, och valet av 500 som mittpunkten var helt godtyckligt.
3. det nya styrsystemet värdet konverteras till en sträng (som 3 siffror).
4. styrning strängen läggs till Utdatasträngen C#, och skickas till Arduino när det behövs.
Styrning Data - Arduino:
1. Arduino får full sträng, och sparar styrning tecken till en karaktär array.
2. styrning karaktär array konverteras till ett int
3. använda funktionen "karta", styrning värdet konverteras till ett kompatibelt värde för styrning servo. Observera att styrning servo inte har ett fullständigt utbud av 0 till 180. På min bil, full vänster är 133 grader och full rätt är 60 grader, med ett centrum värde på ca 96 grader
4. värdet skrivs till styrning servo.
Som gasreglaget, kan styrningen konfigureras till linjär/fyrkant/kubik läge i C# program. Jag tyckte att detta var lite meningslöst, på grund av den relativt litet utbud i styrutslag för min bil. Eftersom hjulen inte vänder långt, är det lätt att få dem till rätt vinkel i linjära läge.
Observera om Arduino Servo bibliotek:
När jag höll på att utveckla den Arduino skissen, använde jag standardbiblioteket för Arduino Servo för både ESC och styrning servo. När jag presenterade NeoPixel pinnen, Servo biblioteket inte kunde användas längre (se https://learn.adafruit.com/neopixels-and-servos). TiCoServo biblioteket fungerar lika bra i min RC bil, men det finns gränser - endast två servon kan användas samtidigt, bara en liten uppsättning stift kan användas (även på en Arduino Mega), och endast specifika par av dessa stift kan arbeta tillsammans. Sist var listat ut genom försök och misstag...