Arduino joystick

Všestrannost Arduina mě nepřestává překvapovat. Poslední příčina překvapení je možnost použít modely Arduino Leonardo a Micro jako HID (human interface device). Prostě jako polohovací zařízení k počítači.

1. Představení

Arduino je jednodeskový počítač založený na mikrokontrolerech ATmega. Základní představeni modelu Leonardo / Micro.

Pro své účely jsem zvolil klon Arduino Pro Micro s cenou kolem 100 ,- Kč za kus.

Arduino Pro Micro klon.

Arduino se dodává se dvěmi DuPont lištami, které je nutné připájet k desce. Kratší konektory jsem prostrčil z vrchu desky a mikropájkou zapájel.Tím máme hardware připraven a můžeme přejít k softwaru.

2. Arduino Joystick Library

Jedná se o Arduino knihovnu, která přidá jeden nebo více joysticků do seznamu HID zařízení počítače. Autorem je Matthew Heironimus a knihovnu naleznete na autorově GitHubu ve verzi 2.0.5. Vyžaduje minimálně Arduino IDE 1.6.6.

Instalaci můžete provést ručně stažením z GitHubu nebo instalací z Arduino IDE.

3. Instalace Joystick Library

V Arduino IDE zvolíme z horního menu: Projekt -> Přidat knihovnu -> Spravovat knihovny

Arduino IDE instalace Joystick Library.

V Manažeru knihoven zadáme do filtru vyhledávání Joystick a nalistujeme Joystick Library. Vybereme a vybereme tlačítko Instalace.

Arduino IDE instalace Joystick Library.

Knihovna má několik jednoduchých příkladů, na kterých si vyzkoušíte jednotlivé funkce.

4. Ovladač pro Arcade machine

Mým cílem bylo vytvořit ovladače joysticku a 10 tlačítek pro projekt Arcade machine.

Sketch ArcadeFirstJoystick.ino je upravený příklad z knihovny GamepadExample.ino, kde jsem dodefinoval k joysticku ještě 10 tlačítek.

// Simple joystick with 10 buttons (8 + 2 for player mode and selection) for arcade machine - RetrOrangePi.
//
// Version: 0.02
// 0.02 - defined for specific connection with 8 buttons
// 0.01 - basic tests with joystick
//
// The digital pins 2 - 10 and 14 - 16 are grounded when they are pressed.
// Pin 2 = RIGHT
// Pin 3 = LEFT
// Pin 4 = DOWN
// Pin 5 = UP
// Pin 6 = button 1
// Pin 7 = button 2
// Pin 8 = button 3
// Pin 9 = button 4
// Pin 10 = button 5
// Pin 14 = button 6
// Pin 15 = button 7
// Pin 16 = button 8
// Pin A0 = select button
// Pin A1 = player button
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//			 Arduino Micro only.
//
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
	10, 0,					// Button Count, Hat Switch Count
	true, true, false,		// X and Y, but no Z Axis
	false, false, false,	// No Rx, Ry, or Rz
	false, false,			// No rudder or throttle
	false, false, false);	// No accelerator, brake, or steering

const int joystickButtonCount = 4;
const int firstButtonLineCount = 9;//2 - 10
const int secondButtonLineCount = 3;//14 - 16
const int thirdButtonLineCount = 2;//A0 - A1
const int totalButtonCount = firstButtonLineCount + secondButtonLineCount + thirdButtonLineCount;

#define DEBUG 1

void setup()
{
#ifdef DEBUG
	Serial.begin(115200);
#endif //DEBUG
	
	// Initialize Button Pins
	pinMode(2, INPUT_PULLUP);//right
	pinMode(3, INPUT_PULLUP);//left
	pinMode(4, INPUT_PULLUP);//down
	pinMode(5, INPUT_PULLUP);//up
	pinMode(6, INPUT_PULLUP);//button 1
	pinMode(7, INPUT_PULLUP);//button 2
	pinMode(8, INPUT_PULLUP);//button 3
	pinMode(9, INPUT_PULLUP);//button 4
	pinMode(10, INPUT_PULLUP);//button 5
	pinMode(14, INPUT_PULLUP);//button 6
	pinMode(15, INPUT_PULLUP);//button 7
	pinMode(16, INPUT_PULLUP);//button 8
	pinMode(A0, INPUT_PULLUP);//select button
	pinMode(A1, INPUT_PULLUP);//player button

	// Initialize Joystick Library
	Joystick.begin();
	Joystick.setXAxisRange(-1, 1);
	Joystick.setYAxisRange(-1, 1);
}

// Last state of the buttons
int lastButtonState[totalButtonCount] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};

void loop()
{
	// Read pin values from first button line 2 - 10
	for (int index = 0; index < firstButtonLineCount; index++)
	{
		int currentButtonState = !digitalRead(index + 2);//first pin is 2
#ifdef DEBUG
		//Serial.print("Testing pin:");
		//Serial.println(index + 2);
#endif //DEBUG
		
		if (currentButtonState != lastButtonState[index])
		{
#ifdef DEBUG
			Serial.println("State changed for:");
			Serial.println(index + 2);
#endif //DEBUG

			switch (index)
			{
				case 3: // UP
					if (currentButtonState == 1)
					{
						Joystick.setYAxis(-1);
					}
					else
					{
						Joystick.setYAxis(0);
					}
					break;
				case 0: // RIGHT
					if (currentButtonState == 1)
					{
						Joystick.setXAxis(1);
					}
					else
					{
						Joystick.setXAxis(0);
					}
					break;
				case 2: // DOWN
					if (currentButtonState == 1)
					{
						Joystick.setYAxis(1);
					}
					else
					{
						Joystick.setYAxis(0);
					}
					break;
				case 1: // LEFT
					if (currentButtonState == 1)
					{
						Joystick.setXAxis(-1);
					}
					else
					{
						Joystick.setXAxis(0);
					}
					break;
				case 4: // FIRE
				default:
					Joystick.setButton(index - 4, currentButtonState);
					break;
			}
			lastButtonState[index] = currentButtonState;
		}
	}

	// Read pin values from second button line 14-16
	for (int index = 0; index < secondButtonLineCount; index++)
	{
		int currentButtonState = !digitalRead(index + 14);//first pin is 14
#ifdef DEBUG
		//Serial.print("Testing pin:");
		//Serial.println(index + 14);
#endif //DEBUG
		
		if (currentButtonState != lastButtonState[index + firstButtonLineCount])//continue in first button line
		{
#ifdef DEBUG
			Serial.println("State changed for:");
			Serial.println(index + 14);
#endif //DEBUG

			switch (index)
			{
				default:
					Joystick.setButton(index + firstButtonLineCount - joystickButtonCount, currentButtonState);//continue as button 6
					break;
			}
			lastButtonState[index + firstButtonLineCount] = currentButtonState;
		}
	}

	// Read pin values from third button line A0-A1 as D18-D19
	for (int index = 0; index < thirdButtonLineCount; index++)
	{
		int currentButtonState = !digitalRead(index + 18);//first pin is 18
#ifdef DEBUG
		//Serial.print("Testing pin:");
		//Serial.println(index + 18);
#endif //DEBUG
		
		if (currentButtonState != lastButtonState[index + firstButtonLineCount + secondButtonLineCount])//continue in first and second button line
		{
#ifdef DEBUG
			Serial.println("State changed for:");
			Serial.println(index + 18);
#endif //DEBUG

			switch (index)
			{
				default:
					Joystick.setButton(index + firstButtonLineCount + secondButtonLineCount - joystickButtonCount, currentButtonState);//continue as button 6
					break;
			}
			lastButtonState[index + firstButtonLineCount + secondButtonLineCount] = currentButtonState;
		}
	}
	
	delay(10);
}

 

Program přeložíme a nahrajeme do Arduina. Po nahrání nám počítač začne vyhledávat ovladač pro nové zařízení.

5. Test ovladače

Ovladač si můžeme ve Windows vyzkoušet pomocí GameControlleru (Joy.cpl). K Arduino Micro připojíme jednotlivá tlačítka a joystick (Pin 2, 3, 4, 5).

Přez Start tlačítko dáme vyhledat Joy.cpl.

Hledání Game Controlleru.

Po nastartování GameControlleru bychom měli vidět jméno našeho nového HIDu.

Náš HID ovladač zobrazen v seznamu.

Poklepáním na položku v seznamu se nám otevře záložka, kde si budeme moci ověřit funkčnost. Kříž by měl skákat podle pohybu joysticku a tlačítka by se měla rozsvěcet podle stisku.

Ověření funkčnosti ovladače.

Pokud něco nefunguje, zkontrolujeme zapojení popřípadě debugujeme kód.

 

One thought on “Arduino joystick

Add yours

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑