Hoe je robots bestuurt met een gamecontroller en Arduino
Arduinos en vergelijkbare compatibele kaarten zijn overal een van de apparaten voor doe-het-zelf-knutselaars. Of je nu een beginner bent die net begint met Arduino of iemand die ze al in je leven gebruikt, ze bieden een platform voor talloze geweldige projecten.
Vandaag zullen we een creatieve manier onderzoeken om een servo te besturen met behulp van Processing en een Xbox360-controller. Als je al behoorlijk goed bent in het ontwikkelen van games, ben je misschien geïnteresseerd in onze zelfstudie met de aangepaste gamecontroller, die Unity gebruikt.
Deze tutorial veronderstelt een beetje voorkennis, als dit je eerste poging is om in Arduino te spelen, zou je onze Arduino-gids hier handig kunnen vinden. Evenzo, als dit de eerste keer is dat u Java gebruikt, kan het een beetje verwarrend zijn. Hoewel Processing een vereenvoudigde versie van het platform gebruikt, kunnen deze Java-concepten en -tips nog steeds helpen.
Wat je nodig hebt
- 1 x Arduino. We gebruiken vandaag een UNO.
- 1 x hobby-servo. Alles dat met de Arduino-pinnen werkt.
- 1 x bedrade Xbox360-controller. Hoewel dit technisch zal werken met bijna elke controller.
- Verschillende aansluitdraden.
Naast deze dingen, moet je ook Processing en de Arduino IDE downloaden van hun respectieve websites.
De Arduino voorbereiden
Eerst moeten we onze servo bevestigen. De bedradingskleuren kunnen hier variëren, maar als een algemene regel rood hecht aan de 5v pin, en bruin of zwart hechten aan de GND pin. De datalijn, die meestal is geel of oranje, hecht aan pin 10.
Controleer uw bedrading en sluit de Arduino aan op de computer. Open de Arduino IDE.
Open de StandardFirmata-schets op Bestand> Voorbeelden> Firmata> StandardFirmata. Deze schets stelt het bord in voor externe controle over de seriële poort, en is dezelfde die we in ons artikel over het beheersen van Arduino met Python hebben gebruikt. Programmeren en besturen van een Arduino met Python. Een Arduino programmeren en besturen met Python Helaas, het is het onmogelijk om een Arduino rechtstreeks in Python te programmeren, maar je kunt het via USB besturen met behulp van een Python-programma. Hier is hoe. Lees verder . Upload de schets naar het bord.
Als de upload mislukt, controleer dan of je de juiste board- en poortgegevens hebt geselecteerd in de Hulpmiddelen menu.
Onze Arduino is klaar voor gebruik!
Verwerking instellen
Open de verwerking, je wordt begroet met een lege schets. Voordat we hier iets doen, moeten we een paar bibliotheken installeren. Ga naar de Schetsen menu en selecteer Bibliotheek importeren> Bibliotheek toevoegen. Dit zal de Contribution Manager die er voor elke Arduino-gebruiker bekend uitziet.
We moeten drie bibliotheken installeren om dit te laten werken. De eerste is de Game Control Plus bibliotheek. Dit is wat ons in staat zal stellen om onze game controller te gebruiken met Processing. Gebruik het zoekvenster om het te vinden en klik op installeren in de rechterbenedenhoek. Game Control Plus heeft een andere bibliotheek nodig voor zijn configuratietool, dus laten we het nu krijgen. Zoeken naar de G4P bibliotheek en installeer het ook.
Eindelijk hebben we de Arduino (firmata) bibliotheek. U raadt het al, zoek ernaar en klik op installeren. Met deze dingen geïnstalleerd zijn we klaar om verder te gaan met het testen dat alles zal werken. We werken vandaag met Windows 10, maar de verwerking is beschikbaar voor de meeste platforms, waaronder Raspberry Pi. Stel je de mogelijkheden eens voor!
De Arduino testen
Voordat we beginnen met het maken van een aangepaste schets, laten we de Arduino en Servo testen met Processing. Open Bestand> Voorbeelden, en selecteer ArduinoServo van de Bijgedragen bibliotheken / Arduino (firmata) map. We zullen dit gebruiken om onze servo te testen, maar eerst moeten we misschien een paar dingen veranderen.
Blader door de schets en vind deze regel:
println (Arduino.list ());
Als het commentaar is weggelaten, verwijder dan eerst de twee schuine strepen println (Arduino.list ());, en bewaar de schets. Voer het uit door op het afspeelpictogram te klikken en houd de console aan de onderkant in de gaten. Dit zal een lijst maken met alles wat met je verbonden is COM havens.
In mijn geval stond mijn Arduino op COM 8, de derde poort die hier wordt vermeld. Dit is belangrijk omdat de code in de onderstaande regel een heeft reeks waarvan de waarde bepaalt welke COM-poort moet worden gebruikt.
We moeten dit wijzigen om onze COM-poort te weerspiegelen. Voor mij was het de derde positie of indexnummer 2:
arduino = nieuwe Arduino (dit, Arduino.list () [2], 57600);
We moeten een aantal andere kleine wijzigingen aanbrengen in deze code om deze te testen. Blader naar beneden waar de Arduino-pinnen zijn opgesteld en becommentarieer een van de regels hier. Verander de andere in Pin 10.
//arduino.pinMode(4, Arduino.SERVO); arduino.pinMode (10, Arduino.SERVO);
We moeten hetzelfde doen in de Trek() methode:
arduino.servoWrite (10, constrain (mouseX / 2, 0, 180)); // arduino.servoWrite (4, constrain (180 - mouseX / 2, 0, 180));
Sla de schets op en voer deze uit. Je zou je servo moeten kunnen verplaatsen door je muis heen en weer te bewegen over het venster dat het programma genereert.
Als het niet voor u werkt, controleert u uw Servo-bedrading en controleert u of u de juiste arraypositie voor uw COM-poort hebt. Als je eenmaal weet dat de Arduino goed met Processing praat, is het tijd om verder te gaan.
Configureren van de controller
De Game Control Plus-bibliotheek die we gebruiken, heeft ook een krachtige configuratie. Zorg ervoor dat uw controller is aangesloten, open de Configurator voorbeeldproject en voer het uit. Je krijgt een menu zoals dit:
Klik op de naam van uw controller en er verschijnt een veel groter configuratievenster.
Dit ziet er misschien nogal ontmoedigend uit, maar het is ontworpen om zo eenvoudig mogelijk te zijn. Vul aan de linkerkant de eerste sleutel in met de gewenste naam als variabele. Deze variabele regelt de positie van de servo, dus ik zal het noemen servoPos.
In het vak ernaast kunt u een korte beschrijving geven van wat het doet. Pak nu je controller op en verplaats de stick die je wilt gebruiken met je servo. Een beetje experimenteren toont aan dat de rechter thumbstick overeenkomt met de X-rotatiebox. Sleep een lijn tussen de servoPos variabele en deze box.
Nu moeten we onze configuratie opslaan als een gegevensbestand. In de rechterbovenhoek van het venster vult u het Apparaatrol veld en de Bestandsnaam veld-.
De bestandsnaam is belangrijk, omdat je deze in je code zult gebruiken. Ik houd het eenvoudig door het te noemen xbs. Klik Verifiëren dan Opslaan. Dit schrijft een bestand met instructies voor onze controller die we later kunnen gebruiken.
De aangepaste schetsmap voorbereiden
Laten we onze werkmap instellen. Open een lege verwerkingsschets en sla deze op onder elke gewenste naam. Hiermee wordt er een map voor gemaakt in de opslaglocatie.
Ga nu naar Documenten / Processing / libraries / GameControlPlus / examples / Configurator en kopieer de map met het label gegevens. Deze map bevat het configuratiebestand dat we zojuist hebben gemaakt. Navigeer naar de map van je nieuw opgeslagen lege schets en plak de datamap.
De aangepaste schets maken
Nu is alles op zijn plaats en kunnen we beginnen met het maken van een schets met behulp van onze twee bibliotheken. We gaan dit stap voor stap door, maar u kunt de volledige schets en gegevensmap downloaden als u verder wilt gaan. Merk op dat je de code misschien nog moet aanpassen om je Arduino COM-poorten te weerspiegelen.
Begin met het importeren van alle bibliotheken die we nodig hebben:
import processing.serial. *; import net.java.games.input. *; import org.gamecontrolplus. *; import org.gamecontrolplus.gui. *; importeer cc.arduino. *; import org.firmata. *;
We moeten ook onze ControlDevice, IO, en Arduino, samen met een vlotter om waarden van onze thumbstick te houden:
ControlDevice cont; ControlIO-besturing; Arduino arduino; zwevende duim;
Onze opstelling() methode maakt een klein venster, een instantie van de controller, en komt overeen met het apparaat met ons configuratiebestand. Dit is waar het belangrijk is om de bestandsnaam van ons configuratiegegevensbestand correct te krijgen:
void setup () size (360, 200); control = ControlIO.getInstance (this); cont = control.getMatchedDevice ("xbs"); if (cont == null) println ("not today chump"); // schrijf betere exit-statements dan ik System.exit (-1); // println (Arduino.list ()); arduino = nieuwe Arduino (dit, Arduino.list () [2], 57600); arduino.pinMode (10, Arduino.SERVO);
We controleren ook of er in dit stadium geen toepasselijke controller is en stoppen indien nodig het programma. Terwijl het venster gemaakt met grootte() is niet nodig, het geeft ons later enige feedback over of we nuttige waarden van onze controller krijgen. We initialiseren ook onze Arduino en pinnen hier, net zoals we deden tijdens het testen.
Nu maken we een kleine methode om de invoerwaarde van onze controller te grijpen en in kaart te brengen naar waarden die onze servo kan gebruiken:
openbare void getUserInput () thumb = map (cont.getSlider ("servoPos"). getValue (), -1, 1, 0, 180);
Deze ene regel code gebruikt ons gegevensbestand om onze benoemde controle te krijgen servoPos, die is gekoppeld aan de rechter thumbstick van de controller en waarden ervan leest. Het brengt vervolgens de waarden in kaart en slaat de waarde op in onze duim zweven variabele.
Op dit moment wordt deze code nooit gebeld, we zullen dat nu oplossen.
void draw () getUserInput (); achtergrond (duim, 100.255); arduino.servoWrite (10, (int) thumb);
De trek() is vergelijkbaar met de lus() methode in de Arduino IDE. Elk frame, het roept het getUserInput () methode en werkt het duim waarde. Het gebruikt deze waarde om de rode waarde van de te wijzigen achtergrond() geeft ons een visuele indicator van de waardeverandering. Vervolgens schrijft het deze waarde naar de servo met behulp van de arduino.servoWrite () functie. Merk op dat we moeten casten duim als een geheel getal als de servoWrite-functie twee gehele getallen (pincode en hoek) als argumenten gebruikt.
Controleer uw code op fouten, sla deze op en klik op uitvoeren. Na een kleine vertraging om de Arduino te initialiseren, zou het er zo uit moeten zien:
Controle met Game Controller en Arduino: klaar!
Dit project was in veel opzichten behoorlijk diepgaand voor de onervaren programmeur Learn With Coding Projects: 9 Udemy Courses voor de beginners programmeur Learn with Coding Projects: 9 Udemy Courses voor de beginners programmeur De echte moeilijkheid is het vinden van goede programmeerinstructies en cursussen die niet alleen leer je de nodige vaardigheden, maar doe dit met praktische projecten. Dat is waar Udemy instapt. Lees meer, ondanks de fantastische beschikbare bibliotheken om ons te helpen. Wat het vertegenwoordigt, is een nieuwe manier om na te denken over het besturen van robots en andere apparaten die u bouwt.
Dit project zou perfect samengaan met onze gids over het bouwen van een Laser Turret Pew Pew! Hoe een laser torentje te bouwen met een Arduino Pew Pew! Hoe maak je een laser torentje met een Arduino te bouwen Ben je verveeld? Kan net zo goed een lasertoren bouwen. Meer lezen, zodat u er volledige controle over hebt. Je zou een Piezo-zoemer kunnen instellen zoals in onze Simple Arduino Alarm. Hoe maak je een eenvoudig Arduino-alarmsysteem Hoe maak je een eenvoudig Arduino-alarmsysteem Detecteer beweging en maak de indringer bang met hoge, hoge alarmgeluiden en knipperende lichten. Klinkt dat leuk? Natuurlijk doet het. Dat is het doel van het Arduino-project van vandaag, geschikt ... Lees meer tutorial en gebruik je controller om de toonhoogte van de zoemer of kleur van de lichten te veranderen.
Of je kunt, nou ja, een enorme robot bouwen en de aarde overnemen. Zolang u maar lang genoeg een USB-kabel had!
Ontdek meer over: Arduino, Game Controller, Robotics.