[PS3RACER]

Een RC racewagentje besturen met een Playstation 3 controller? cool!
racewagen

Een filmpje zegt meer dan 1000 plaatjes… (ligt er aan of er meer dan 1000 frames zijn…):

Vraag en Antwoord:

Q: Hoe werkt het?
A: De Playstation 3 Sixaxis Dualshock controller (Wat een naam… ‘PS3 controller’ vanaf nu…) maakt verbinding met een Bluetooth USB-dongle. Dit dongle is aangsloten op een zogenaamde USB-Host Shield, welke op een Arduino Uno is geprikt. Door middel van code die is geschreven voor de Arduino, kan deze Arduino communiceren met het USB Host Shield en dus ook de bluetooth dongle. De Arduino ontvangt op deze manier de data die afkomstig is van de standen van de knoppen van de PS3 controller. Deze Arduino Uno stuurt deze data 28 keer per seconde door naar een andere Arduino (Arduino Mega in dit geval). Deze Arduino Mega, zet de signalen, vrijwel realtime, om in afgevlakte PWM signalen die ‘begrepen’ worden door de twee H-bridges van het wagentje. Voor elke H-bridge zijn 2 signalen nodig, welke door een comparator gaan (een opamp in de meeste gevallen en ook in dit geval) en besluit welke van 2 signalen het sterkst is en welke 2 van de 4 transistoren (H-Bridge) moeten open sturen en hoe ver. 1 H-Bridge is voor de stuur’servo’ (wat eigenlijk geen servo is, zie verderop de Q&A) en de ander is voor de aandrijving.
Ok nu wat simpeler, maar niet minder correct:
De PS3 controller stuurt een signaal met de standen van zijn knoppen naar de microcontroller op het dak van de auto. Dit gebeurt 28 keer per seconde. De signalen worden omgezet door de microcontroller naar een elektrisch signaal over 2 kanalen, kanaal A en kanaal B. Hoe meer er ingestuurd wordt hoe sterker het signaal over kanaal A en hoe meer er gas gegeven wordt, hoe sterker het signaal over kanaal B. Het wagentje ‘meet’ de signaalsterkte van elk kanaal en stuurt hiermee de motoren aan. Kanaal A voor de stuur-motor en kanaal B voor de Aandrijfmotor. Een negatief elektrisch signaal over kanaal B laat het wagentje naar achter rijden en een positief elektrisch signaal laat het wagentje naar voren rijden. Hoe verder het signaal van de ‘0’ af is, hoe harder het wagentje rijdt. Voorbeeld: Een signaal met waarde  ‘-5’ laat het wagentje heel langzaam naar achter rijden en ‘128’ laat het wagentje heel snel naar voren rijden. bij waarde ‘0’ staat het wagentje stil. Bij kanaal A werkt het net zo, maar dan voor links = negatief (onder 0) en rechts = positief (boven 0). Hier is ‘0’ ‘rechtdoor rijden’.

Q: Ik zie 2 arduino’s: Een Arduino Mega en een Arduino -waarschijnlijk- Uno met daar op een USB-Host shield. Waarom twee Arduino’s gebruiken?
A: Dat heeft te maken met het verwerken van de hoeveelheid pakketten en de hoeveelheid code die nodig is om dit werkend te krijgen. De software voor het aansturen van de PS3 controller heb ik niet zelf geschreven. Dat is een draak van een stuk software waar een andere knappe kop zich flink over heeft lopen buigen al. Deze code is alleen heel erg universeel en omvat veel mogelijkheden. Zo kan deze code ook Wii remote’s en XBox 360 controllers aan. Los van dat het veel code is, maakt deze code ook flink gebruik van de rekenkracht van de Arduino. Het bleek dat het aansturen van het wagentje met de aangeleverde data van de PS3 controller, door dezelfde Arduino, nogal lastig was. Ik kreeg niet meer dan 17-18 pakketten per seconde verwerkt. Dit vond ik niet erg bevredigend en ik wilde meer richting de 30 pakketten per seconde gaan. Omdat ik in geen zin had (lees: te lui was) om de zeer uitgebreide code van het USB-Host Shield te herschrijven of zodanig aan te passen, had ik voor de test gebruik gemaakt van 2 Arduino’s. Een Arduino die de Bluetooth verbinding maakt en de gegevens ontvangt van de PS3 controller d.m.v. de USB Host Shield code en een andere Arduino die deze gegevens verwerkt in een zelf geschreven code naar een voor het wagentje nuttig PWM signaal (Pulse Width Modulation). Ik kan de verwerkingssnelheid opkrikken tot 28/29 Pakketten per seconde voordat ik rare fouten krijg, zoals onverwachts rijden/sturen. Als ik dus minder lui was geweest en de code zodanig had aangepast naar eigen behoefte had ik deze packetrate wellicht ook kunnen krijgen met een enkele Arduino. Ik had ook een andere AVR/PIC kunnen gebruiken, of een Arduino Due gebruiken (draait op 84 MHz), maar die had ik toen nog niet voorhanden…
Dit was dan ook een van mijn eerste microcontroller-projecten!

Q: USB Host Shield?
A: [Link naar externe bron] (Engels)

Q: Wat voor wagentje is dat?
A: Een “Red Jumper”, zogenaamd van Carrera. Gekocht bij de Intertoys in de aanbieding voor 30 Euro. Achteraf nog best genaaid ook, want ik wilde perse een servo stuurmotor hebben, maar hetgeen waarmee als ‘servo steering’ adverteerde op de doos, bleek niets anders te zijn dan een goedkoop gelijkstroommotortje met een slipkoppeling die afhankelijk van de snelheid en richting meer of minder stuurde. Niet erg zuiver. Bij het openmaken om de signaalkabels van de Arduino aan te sluiten viel me al gelijk op wat voor Chinese kwaliteit dit wagentje betrof. Het soldeerwerk was slechter gedaan dan een blinde 10-jarige met een 100 Watt soldeerpistool dat zou kunnen… met blote voeten 🙁 Ik moest eerst zelf zaken herstellen aan het printplaatje, voordat ik uberhaupt aan de signalen kon gaan werken.

Q: Wat is het bereik?
A: Je zal verrast zijn; bijna 20 meter! Bluetooth staat er om bekend een bereik van zo’n 10-15 meter te hebben. Ik kan dit wagentje echter zo’n 19-20 meter ver rijden en onder controle houden, voordat onvoorspelbaar gedrag plaatsvindt (Doorrijden zonder gas geven, niet meer sturen enzo).

Q: Hoe hard gaat ie?
A: Niet zo hard. Het is een goedkoop wagentje met een armoedig motortje. Ik gok iets harder dan wandelsnelheid; 6 á 7 km/h.

Q: Hoe lang gaat de batterij mee?
A: Een half uur ongeveer. Het is trouwens een Li-Ion 7.4 Volt 700mAh accupakje. Welke zowel 2 Arduino’s als het wagentje zelf voedt. Valt nog mee moet ik zeggen.

Q: Economisch exploitabel? (Ga je het verkopen?)
A: Nee. Er zitten te veel glitches en uitdagingen aan. Ook zijn er kant-en-klare bestuurbare wagentjes die je met een telefoon kan besturen voor 25 Euro. De Chinezen hebben deze markt overgenomen. Wat wel een mogelijkheid kan zijn is om een soort ontvangerbox te maken die een PS3 controller verbinding laat maken met een bestaand RC racewagentje. Voor mensen die veel Need For Speed of Grand Tourismo spelen op de PS3, kan het besturen van een RC model met een PS3 controller soepeler gaan. Het is mogelijk. Not putting my hopes up, though 🙂

Q: glitches?
A: Ja een voorbeeld is dat niet alle bluetooth dongles werken met het USB Host shield. Dit ligt niet aan het USB-Host shield, maar aan de beperkte ruimte voor code op de Arduino. Sommige dongles vragen excentrieke hoeveelheden code om alleen nog maar aangestuurd te worden en alle dongles zijn zo ongeveer verschillend. Om dus meerdere bluetooth dongles compatibel te maken is er gewoonweg niet genoeg ruimte beschikbaar op de Arduino.

Q: Wat kost het?
A: Als de code is bijgeschaafd, zodat je maar 1 Arduino nodig zou hebben, dan zou je totaal zo’n 80-90 Euro kwijt zijn voor de benodigde spullen. Er van uitgaande dat je al een PS3 controller in bezit hebt.

Q: Werkt de PS3 controller daarna ook nog op de PS3?
A: Ja, je hoeft je PS3 controller alleen een keertje nog met een USB-kabel aan de PS3 te koppelen en ze zijn weer met elkaar ‘gepaired’.

Q: Wii Mote en XBox 360 controllers ook mogelijk?
A: Ja. Alleen bij de 360 controller is er een kleine uitdaging wat betreft de bluetooth verbinding. Die maakt gebruik van een andere class of iets dergelijks en daarvoor moet een speciale 360 bluetooth dongle gebruikt worden.

Q: Waterdicht?
A: Nee… dit keer niet.