Modul Joystick PS2
|
Joystick je vstupní zařízení, kter0 umožňuje snímat pohyb herní páčky ve dvou směrech.
Samotný joystick je tvořen konstrukcí, která obsahuje dva potenciometry a tlačítko pro detekci stisku joysticku.
V normálním stavu je potenciometr nastaven přibližně do poloviny svého rozsahu a při pohybu páčky se mění
jeho odpor od 0 do jeho maxima.
V Arduinu stačí tedy měřit na těchto potenciometrech zapojených jako děliče napětí.
Napětí si následně přepočteme na zvolené souřadnice.
Zapojení:
Arduino | | Joystick |
GND | - | GND |
VCC | - | +5V |
A2 | - | VRX |
A3 | - | VRY |
SCL(A5) | - | SW |
9.1. Test joysticku
Napište program, který bude zobrazovat po sériové lince aktuální hodnoty z AD převodníků, připojených k joysticku.
Vypisujte také stav tlačítka joysticku.
Nápověda
Pro čtení hodnoty analogového vstupu slouží příkaz
analogRead(pin) ... vrací hodnotu v rozsahu 0 - 1023
pin ... určuje nožičku, na kterou je přivedeno měřené napětí (0-5V)
Řešení
9.2. Přepočet souřadnic joysticku
Napište program, který bude měřit polohu joysticku v rozsahu souřadnic -100 až +100 v obou osách. Vypočtenou polohu zobrazujte přes sériovou linku.
Nápověda
Pro lineární přepočet hodnot slouží příkaz
map(value, in_min, in_max, out_min, out_max) ... vrací číselnou hodnotu v rozsahu out_min - out_max
value ... vstupní hodnota v rozsahu in_min - in_max
in_min ... minimální vstupní hodnota
in_max ... maximální vstupní hodnota
out_min ... minimální výstupní hodnota
out_max ... maximální výstupní hodnota
Řešení
E09_Joystick2.ino
#define VRX A2
#define VRY A3
int x, y;
void readJoy() {
x = analogRead(VRX);
x = map(x, 0, 1023, -100, 100);
y = analogRead(VRY);
y = -map(y, 0, 1023, -100, 100);
}
void setup()
{
pinMode(VRX, INPUT);
pinMode(VRY, INPUT);
Serial.begin(9600);
}
void loop()
{
readJoy();
Serial.print("x:");
Serial.print(x);
Serial.print(" y:");
Serial.println(y);
delay(100);
}
9.3. Přepočet souřadnic joysticku 2
Upravte předchozí program tak, aby středová (klidová) poloha joysticku měla hodnotu 0 v obou osách.
Řešení
E09_Joystick3.ino
#define VRX A2
#define VRY A3
#define SW A5
int nulaX, nulaY;
int x, y;
bool tlacitko = 0;
void readJoy() {
x = analogRead(VRX) - nulaX;
if (x >= 0)
x = map(x, 0, 1023-nulaX, 0, 100);
else
x = map(x, -nulaX, 0, -100, 0);
y = analogRead(VRY) - nulaY;
if (y >= 0)
y = -map(y, 0, 1023-nulaY, 0, 100);
else
y = -map(y, -nulaY, 0, -100, 0);
tlacitko = !digitalRead(SW);
}
void setup()
{
pinMode(VRX, INPUT);
pinMode(VRY, INPUT);
pinMode(SW, INPUT_PULLUP);
Serial.begin(9600);
nulaX = analogRead(VRX);
nulaY = analogRead(VRY);
}
void loop()
{
readJoy();
Serial.print("x:");
Serial.print(x);
Serial.print(" y:");
Serial.print(y);
Serial.print(" s:");
Serial.println(tlacitko);
delay(100);
}
9.4. Světelný had ovládaný joystickem
Vytvořte program realizující běžící světlo (hada, úloha 2.1) ovládaného joystickem. Pohyb vlevo - vpravo je dán směrem výchylky
osy x joysticku, rychlost jeho pohybu velikostí výchylky.
Řešení
E09_Joystick4.ino
#define LED_MIN 1
#define LED_MAX 8
#define VRX A2
#define VRY A3
#define SW A5
int nulaX;
int x;
void readJoy() {
x = analogRead(VRX) - nulaX;
if (x >= 0)
x = map(x, 0, 1023-nulaX, 0, 100);
else
x = map(x, -nulaX, 0, -100, 0);
}
void setup()
{
for (byte i = LED_MIN; i <= LED_MAX; i++)
pinMode(i, OUTPUT);
pinMode(VRX, INPUT);
pinMode(VRY, INPUT);
pinMode(SW, INPUT_PULLUP);
nulaX = analogRead(VRX);
}
byte led = 1;
void loop()
{
readJoy();
if (x > 1) {
led++;
if (led > LED_MAX) led = LED_MIN;
}
if (x < -1) {
led--;
if (led < LED_MIN) led = LED_MAX;
}
for (byte i = LED_MIN; i <= LED_MAX; i++) {
digitalWrite(i, i == led);
}
delay(550-abs(x)*5);
}