Joystick

In dit project hebben we een volledig werkende joystick gemaakt vanaf nul. Geen kant-en-klare controller, maar een zelfgebouwde combinatie van sensoren, hout, ducktape, en creatieve elektronica. En ja: hij werkt echt.
Onze joystick gebruikt drie verschillende sensoren:
– een drukknop die via een PCV-buis wordt bediend,
– een zelfgemaakte potentiometer op basis van koolstofvezeldraad,
– en een hallsensor die de positie tussen twee magneten bepaalt.
Deze sensoren verbinden we met een Arduino via een breadboard. De waarden worden uitgelezen, geprint én verwerkt tot een joystick met meerdere ‘richtingen’ net als bij een echte gamecontroller. Als je op de knop drukt, krijg je feedback op het scherm. Als je de potentiometer of de hall sensor beweegt, zie je de bijbehorende waardes. Simpel, maar effectief.
We gebruikten lasersnijden om het houten doosje te maken, en verwerkten alle sensoren in de behuizing met slimme trucs zoals tape, spijkers, kurk en magneten. Technisch gezien kun je dit een joystick noemen. Wij noemen het liever: een combinatie van techniek, prutsen, en trots.
Supplies
Hier is de uiteindelijke materialen- en kostenlijst van ons zelfgemaakte Joystick:
Materialen:
- 2 x kubusmagneten N45
- 1 x Hallsensor 49E
- 1 x Plywood (lasersnijden)
- 8 x schroeven
- 8 x Elastieken
- 1 x koolstofvezeldraad
- 1 x klein stukje kurk
- 2 x pvc-buis
- 1 x drukknop
- 1 x koperen staaf
- 2 x bout
- 1 x LDC diplay I2C
Circuit:
- Arduino
- Breadboard
- wires
- batterij 9V
Tools
Verschillend gereedschap:
- Lasersnij apperaat
- houtlijm
- secondenlijm
- boor
- hamer
- laptop
- ducktape
- schroevendraaier
Lasersnijden

Om onze joystick netjes te kunnen monteren, hebben we eerst een houten behuizing ontworpen. Deze doos hebben we zelf ontworpen en laten lasersnijden uit 6 mm dik plywood. Zo past alles precies, en blijft het stevig genoeg voor het gebruik.
We maakten het ontwerp in Inkscape, en exporteerden dat als een bestand dat de lasersnijder direct begrijpt. De totale afmetingen van het plaatmateriaal zijn 600 × 450 mm, ruim genoeg voor alle onderdelen van het doosje.
Na het snijden hoefden we alleen nog maar de delen in elkaar te klikken en vast te lijmen met houtlijm. De openingen in het ontwerp zijn op maat gemaakt voor de sensoren en bedrading die later worden toegevoegd. Zo is alles overzichtelijk weggewerkt, zonder dat het onhandig wordt tijdens het bouwen of testen.
Arduino Circuit Maken



Voor onze joystick maken we gebruik van drie verschillende sensoren: een drukknop, een hallsensor en een zelfgemaakte potentiometer. Elk van deze sensoren meet een ander aspect van de beweging of input van de gebruiker. In deze stap bouwen we het circuit op een breadboard en verbinden we alles met een Arduino Uno.
We beginnen met het aansluiten van de drukknop. Deze zit op een digitale pin (A2) in de code ingesteld, zodat we eenvoudig kunnen detecteren of de knop wordt ingedrukt of niet.
De hallsensor wordt gebruikt om de positie van een magneet te meten. Deze sensor geeft een analoge waarde afhankelijk van de afstand tussen sensor en magneet. We sluiten deze aan op pin A0 van de Arduino.
Onze potentiometer is zelfgemaakt met koolstofvezeldraad, en gedraagt zich elektrisch gezien als een standaard spanningsdeler. Door beweging van een koperen staaf verandert de weerstand, en dus ook de uitgangsspanning. Deze waarde lezen we uit op pin A1.
Alle sensoren sluiten we aan op een breadboard, dat via 5V en GND met de Arduino verbonden is. Zo kunnen we de signalen goed testen voordat we alles monteren in de behuizing. De pinnen zijn bewust zo gekozen dat we eenvoudig de waardes kunnen uitlezen via de seriële monitor. Later verwerken we deze waardes in de code om de joystick in meerdere richtingen te kunnen gebruiken.
Upload Code
.jpeg)

Als alle sensoren goed aangesloten zijn op het breadboard, kunnen we de Arduino-code uploaden om te testen of alles werkt zoals bedoeld.
De code leest de waarden uit van drie sensoren:
- de hallsensor (pin A0),
- de potentiometer (pin A1),
- en de drukknop (pin A2).
In de seriële monitor van de Arduino IDE verschijnen drie regels met waardes. Zo kun je direct zien of er beweging is bij de potentiometer of hallsensor, en of de knop wordt ingedrukt. Wanneer op de knop wordt gedrukt, verschijnt het woord “POW!” in het scherm om zeker te weten dat het signaal goed doorkomt.
Sluit je Arduino via USB aan op je laptop en upload de code via de Arduino IDE. Zorg dat je het juiste board en de juiste poort geselecteerd hebt, klik op “Upload” en open daarna de seriële monitor (9600 baud).
tip: Als je geen waardes ziet, controleer of de pinnen goed overeenkomen met je code. Een klein foutje in de pin-aansluiting is zo gemaakt.
Dit is puur om te checken of inderdaad alles klopt. Nu gaan we voor onze uiteindelijke opstelling gebruik maken van een LDC display (stap 5)
LDC Display I2C
.jpeg)
Om ons ontwerp te laten werken zonder computer maken we gebruik van een LDC display I2C. Deze is connected aan de arduino. De onderstaande code is via de laptop 1 x gestuurd naar de Arduino, die hem vervolgens onthoudt. Nu kunnen we zonder laptop maar door middel van een batterij de joystick laten runnen. De 4 pinnen zijn als volgt connected met het breadboard.
- De GND --> GND van breadboard
- VCC --> 5V van breadboard
- SDA --> A4 arduino
- SCL --> A5 arduino
Voordat je dit kan gebruiken moet je de volgende library installeren
- LiquidCrystal_I2C by Marco Schwartz
Hier is de uiteindelijke code die we gebruiken:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// I2C address 0x27 is most common; change to 0x3F if needed
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int hallPin = A0; // Hall-sensor
const int potPin = A1; // Potentiometer
const int buttonPin = A2; // Drukknop (digitale pin)
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
lcd.init(); // Initialize LCD
lcd.backlight(); // Turn on backlight
lcd.clear(); // Clear screen
}
void loop() {
int hallValue = analogRead(hallPin);
float hallVolt = hallValue * (5.0 / 1023.0);
int potValue = analogRead(potPin);
float potVolt = potValue * (5.0 / 1023.0);
int buttonState = digitalRead(buttonPin);
// Print to Serial Monitor
Serial.print("Hall: ");
Serial.print(hallVolt, 2);
Serial.print(" V | Pot: ");
Serial.print(potVolt, 2);
Serial.print(" V");
if (buttonState == LOW) {
Serial.print(" | POW!");
}
Serial.println();
// Print to LCD
lcd.setCursor(0, 0); // First row
lcd.print("Hall:");
lcd.print(hallVolt, 2);
lcd.print("V");
lcd.setCursor(0, 1); // Second row
lcd.print("Pot:");
lcd.print(potVolt, 2);
if (buttonState == LOW) {
lcd.print(" POW!");
} else {
lcd.print(" "); // Clear leftover "POW!" text
}
delay(200);
}
Sensoren Verwerken in De Joystick
.jpeg)
.jpeg)



.jpeg)

Nu het echte werk: de sensoren verwerken in de joystickbehuizing. Dit is het moment waarop elektronica en constructie samenkomen en waar je erachter komt of alles past zoals je had bedacht.
- Drukknop
Voor de drukknop gebruikten we een stevige PVC-buis als houder. Deze buis loopt verticaal door het midden van het houten doosje en zorgt ervoor dat je stevig op de knop kunt drukken zonder dat de bedrading loskomt of beschadigt. De bovenkant van de knop is zichtbaar aan de buitenkant van de buis, terwijl de rest netjes binnenin zit, vastgezet met ducktape. Op die manier zie je alleen wat je nodig hebt om te ‘schieten’, en blijft de bedrading beschermd.
- Potentiometer
De potentiometer is misschien wel het meest creatieve onderdeel. We hebben een stuk koolstofvezeldraad gespannen tussen twee spijkers in een gefreesde gleuf in een houten plaat. Deze draad vormt als het ware een spanningsdeler. Aan het uiteinde van de joystickbuis hebben we een stukje kurk bevestigd waarin een koperen staaf is geplaatst. Bij beweging van de buis glijdt die staaf over het koolstofdraad, waardoor de weerstand verandert. Dat spanningsverschil meten we via de Arduino, en zo weten we in welke richting de joystick draait.
- Hallsensor
Voor de hallsensor kozen we een iets andere aanpak. Twee kleine magneten zijn stevig vastgemaakt aan de binnenkant van het houten doosje met secondelijm, aan weerszijden van de sleuf. De hallsensor zelf beweegt mee met de joystickbuis — die is namelijk bevestigd aan het bewegende gedeelte. Dus in plaats van dat de magneet voorbij de sensor beweegt, schuift de sensor zelf langs de vaste magneten. Die omgekeerde opstelling werkt net zo goed, en levert een nette variatie in het gemeten magnetisch veld op. Zo kunnen we met één analoge waarde vaststellen of de joystick naar voren of achteren is bewogen.
Terugveermechanisme Bouwen

Om ervoor te zorgen dat de joystick automatisch terugveert naar de middenstand, hebben we een simpel maar effectief mechanisme gemaakt met behulp van elastiekjes en houten staafjes.
Aan beide zijkanten van de houten behuizing hebben we twee rechte gaten gezaagd. Door deze gaten schuiven we twee houten balkjes (staafjes) die vrij kunnen bewegen. Aan beide uiteinden van elk balkje is een elastiek bevestigd, dat aan de binnenkant van de behuizing vastzit.
Wanneer je de joystick naar één kant beweegt, wordt ook het bijbehorende houten balkje meegetrokken. Het elastiek aan de andere kant rekt dan uit en zorgt voor tegendruk. Zodra je de joystick loslaat, trekt het gespannen elastiek het balkje, en dus de joystick, weer terug naar het midden.
Met dit systeem bootsen we een soort zelfcentrerend mechanisme na, zoals je dat ook bij commerciële joysticks ziet.
Joystick in Elkaar Zetten



Alle losse onderdelen zijn gedaan, nu kunnen we de joystick in elkaar zetten. Dit doen we door middel van alle losse houtonderdelen met houtlijm vast te lijmen als een soort bouwpakket. Nu krijgen we 2 doosjes met de sensoren erin verwerkt en de
Finished!!

.jpeg)
Het enige wat we nu nog hoeven doen is de joystick helemaal testen. We sluiten alle bedradingen aan; de hallsensor, druksensor en de potentiometer. Nu kunnen we net zoals een joystick aantonen dat ons zelfgemaakte joystick in 4 verschillende richtingen kan bewegen door behulp van 2 assen. Door middel van de druksensor krijgen we ook het idee van 'schieten' bij een echte joystick terug. Door de LDC display kunnen we de waardes van alles aflezen. Nu zijn we ready voor een echte flight simulator.