32. Joystick

 

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:
    }
  }
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s