Mål: Att avläsa en joystick samt att använda dess värden för att styra en processing sketch t.ex. en boll som man kan förflytta.
Teori: Joysticken består egentligen av två potentiometrar och en tryckknapp. Potentiometrarna används för att avläsa joystickens läge i x och y riktningen. Arduinos analog pins A0 och A1 används för att avläsa potentiometrarna och digital pin 2 för att avläsa knappen.
Fritzing kopplingsschema
Arduino koden
/* * Based on SerialCallResponse * Modified by Wilbur Smith 2017 */ #define xpin A1 // horizontal x eller VRx #define ypin A0 // vertical y eller VRy #define buttonpin 2 // select eller SW int xvalue = 0; int yvalue = 0; int button = 0; int inByte = 0; void setup() { Serial.begin(9600); // starta serial kommunikationen pinMode(buttonpin, INPUT); // pin riktningen digitalWrite(buttonpin, HIGH); // internal pullup establishContact(); // körs endast en gång } void loop() { if (Serial.available() > 0) // om något finns i serial buffern { inByte = Serial.read(); // läs värdet xvalue = map(analogRead(xpin),0,1024,0,255); // läs joystickens x-värde och skala om delay(10); // låt analog to digital konvertern återställas yvalue = map(analogRead(ypin),0,1024,255,0); // läs joystickens y-värde och skala om button = map(digitalRead(buttonpin), 0, 1, 0, 255); // läs joystickens tryckknapp och skala om Serial.write(xvalue); // skriv x-värdet i serialporten Serial.write(yvalue); // skriv y-värdet i serialporten Serial.write(button); // skriv "knapp"värdet i serialporten } } void establishContact() { // denna kod körs en gång under setup while (Serial.available() <= 0) { // medan inget ginns i serial buffern Serial.print('A'); // skicka tecknet A delay(300); } }
Processing koden
import processing.serial.*; // inkludera serial biblioteket Serial myPort; // Skapa ett serial objekt int[] sensorArray = new int[3]; // skapa en array för att lagra tre sensorvärden int serialCount = 0; // räknar hur många bytes mottagits från serialporten int ballcolor; // färg på cirkeln int xvalue, yvalue, button; // värden från joysticken boolean firstContact = false; // ingen första kontakt upprättats void setup() { size(765, 510); println(Serial.list()); String portName = Serial.list()[2]; myPort = new Serial(this, portName, 9600); } void draw() { background(255); fill(ballcolor); ellipse(xvalue*3, yvalue*2, 50, 50); } void serialEvent(Serial myPort) { // funktionen för serialhändelser int inByte = myPort.read(); // läs porten och spara byten i variabeln inByte if (firstContact == false) // om första kontatkten med arduino inte upprättats { if (inByte == 'A') // kolla om det är ett 'A' { myPort.clear(); // töm serial buffern firstContact = true; // notera i koden att första kontakten med arduino upprättad myPort.write('A'); // skicka tillbaka till arduino ett 'A' } } else { // om kontakt med arduino upprättats (firstContact == true) sensorArray[serialCount] = inByte; // spara det första bytet på den 0:e platsen i arrayn serialCount++; // öka serialCount från 0 till 1 if (serialCount > 2 ) { // om 3 värden tagits emot xvalue = sensorArray[0]; // spara arrayns första byte med namnet xvalue yvalue = sensorArray[1]; // spara arrayns andra byte med namnet yvalue button = sensorArray[2]; // spara arrayns andra byte med namnet button if(button < 200) { ballcolor = 0; } else { ballcolor = 200; } myPort.write('A'); // be Arduino om nya sensorvärden serialCount = 0; // återställ serialCount: } } }