Arduino - Een joystick

From SPAD-it Wiki
Jump to: navigation, search

Een joystick kan in twee richtinegn bewegen. De horizontale richting noemen we de x-richting en de vertikale richting de y-richting. Daarmee kun je twee dingen besturen met een enkele knop. Een joystick heeft in het algemeen vier aansluitingen: nul, Vcc (voedingsspanning) en twee signaal-aansluitingen, een voor elke richting. Van binnen heeft een joystick twee potmeters die zo zijn geschakeld dat de twee signaal-aansluitingen spanningen afgeven tussen nul en Vcc. In ruststand staat de joystick in het midden en zijn ook de spanningen voor x en y in het midden tussen 0 en Vcc. Een Arduino kan dus de stand van de joystick bepalen door die twee spanningen te meten en actie ondernemen op basis van die informatie. Een joystick gebruikt dan natuurlijk wel twee analoge ingangen van de Arduino. Geen probleem: je hebt er dan nog vier over.

De schakeling

Extra benodigdheden:

  • 1 joystick module
Joystick2.jpgJoystick schakeling.png
Een joystick module met aansluiting op de Arduino

Het programma

int x_pin = 1;  // analoge input pin voor de x-as: A1
int y_pin = 0;  // analoge input pin voor de y-as: A0

void setup()
{
  Serial.begin(9600); // start de seriele communicatie met een baud rate van 9600
}

void loop()
{
  int val_x = analogRead(x_pin);     // waarde tussen 0 en 1023
  int val_y = analogRead(y_pin);
  float x = 0.001953125*val_x - 1.0; // val/512-1 => waarde tussen -1 en 1
  float y = 0.001953125*val_y - 1.0; // waarde tussen -1 en 1; 0=neutrale stand
  Serial.print("x=");
  Serial.print(x,3);                 // 3 cijfers achter de komma is genoeg hier
  Serial.print("; y=");
  Serial.println(y,3);
  delay(100);
}

Uitleg

Om de schakeling eenvoudig te houden bepalen we in dit project alleen de stand van de joystick in de x- en y-richting. Die stand wordt vervolgens via de seriele communicatie doorgegeven aan de PC. We hoeven dan alleen de joystick op de Arduino aan te sluiten. Daarbij gaat de pin voor rx in de A1-poort van de Arduino en de pin voor ry in de A0-poort. De analoge poorten hoeven niet te worden geinitialiseerd omdat die standaard gelden als input. De Setup() functie wordt dus alleen gebruikt om de seriele communicatie te starten. De Loop() functie meet de stand van de joystick in beide richtingen via de spanning op A0 en A1. Die spanning wordt gemeten als een getal tussen 0 en 1023. Hierbij staat 1023 voor Vcc. Door deze waarde te delen door 512 (de helft van Vcc), en 1 af te trekken krijg je een getal tussen -1 en 1. Bij 0 staat de joystick in het midden. Deze getallen wordt vervolgens doorgegeven aan de computer via de seriele communicatie met drie cijfers achter de komma. Na alle voorgaande projecten is dit zo eenvoudig dat er eigenlijk geen toelichting nodig had moeten zijn.

Beetje spelen

Misschien gaat het niet helemaal zoals je zou verwachten: als je de knop los laat laat de Serial Monitor niet steeds nullen zien, maar getallen die een beetje afwijken van nul. Bovendien zijn de getallen bij elke meting net weer iets anders, al scheelt het vast niet veel. Vaak wil je dat er niets gebeurt als je de knop los in het midden laat staan; dat je auto rechtdoor stuurt en stil staat. Die afwijkingen kunnen dan een probleem zijn. Vandaar deze opdracht: verander het programma zo dat je een nette spanning van 0 krijgt voor beide richtingen als de knop wordt los gelaten.

Sommige joystick's hebben een vijfde pootje. Meestal gaat het hier om een joystick met een ingebouwde actie-knop: je kunt de joystick dan bewegen, maar je kunt er ook op drukken als op een knop. Bewegen om te mikken en dan een actie uitvoeren. Dat vijfde pootje geeft dan aan of de actie-knop is ingedrukt. Deze kun je aan een digitale ingang hangen. Als je zo'n joystick hebt kun je het programma zo aanpassen dat je in de Serial Monitor ook een melding krijgt of de actie wordt uitgevoerd.

Navigatie