Reactietijd Meter
Dit project heb ik gemaakt voor een vak dat ik aan de HKU kreeg. In het begin van dit project was Formule 1 bezig en stond, zoals het hoort, Max Verstappen op nummer 1. Doordat Formule 1 in deze periode bijna niet te missen was, heb ik er interesse in ontwikkeld en ben ik vanuit deze interesse gaan werken aan dit project.
Bij Formule 1 is een van de belangrijkste vaardigheden van een coureur een snelle reactietijd. Om dit op een speelse manier te verwerken in een project besloot ik om een reactietijd meter te maken in de vorm van een Formule 1 stuur. Dit stuur heeft ook een afteller in de vorm van de startlichten van Formule 1.
Supplies
Componenten:
- Arduino Uno
- OLED Display I2C (128x32)
- 9V Batterij Houder met DC Jack
- 9V Batterij
- 10 Rode leds
- Simpele knop
- 5x 220Ω weerstanden
- 1x 10KΩ weerstand
- 17x koperen kabel
- Printplaatje 5x8cm
- 2 schroeven
Behuizing:
- Triplex 3 laags 3mm dik
- Naaldhouten lad
- Houtlijm
Ik begon met mijn idee uit te werken op papier en alle benodigdheden hiervoor op te schrijven en te bestellen.
Zodra ik alle benodigdheden had, begon ik al mijn componenten te linken aan mijn Arduino en mijn breadboard. Zo kon ik testen of al mijn componenten wel werkten.
Zodra alles werkend was, kon ik beginnen met het schrijven van mijn code.
#include
#include
#include
#include
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH 128
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
int countdownNumber = 6;
double count;
bool buttonPressed = false;
int score1;
int score2;
int score3;
void setup() {
registerDisplay();
registerPins();
Serial.begin(9600);
}
void loop() {
countdown();
counter();
}
void registerDisplay() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();
}
void registerPins() {
pinMode(4, INPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
void displayText(int textSize, String text, int x, int y, boolean d) {
display.setTextSize(textSize);
display.setTextColor(WHITE);
display.setCursor(x,y);
display.println(text);
if(d){
display.display();
}
}
void countdown() {
if (buttonPressed == false) {
for (int i = 8; i < 13; i++) {
countdownNumber--;
delay(1000);
display.clearDisplay();
displayText(3, String(countdownNumber), 4, 3, false);
display.display();
digitalWrite(i, HIGH);
}
countdownNumber = 6;
delay(1000);
for (int i = 8; i < 13; i++) {
digitalWrite(i, LOW);
}
}
}
void counter() {
if (buttonPressed == false) {
for (int i = 0; i < 100; i++) {
int buttonState = digitalRead(4);
display.clearDisplay();
displayText(3, String(i), 4, 3, false);
display.display();
if(buttonState == 1) {
buttonPressed = true;
checkScores(i);
break;
}
}
}
displayBestScores();
buttonPressed = false;
}
void displayBestScores() {
delay(5000);
display.clearDisplay();
displayText(1, "#1 score: " + String(score1), 4, 0, false);
displayText(1, "#2 score: " + String(score2), 4, 10, false);
displayText(1, "#3 score: " + String(score3), 4, 20, false);
display.display();
delay(5000);
}
void checkScores(int score) {
if (score < score1 || score1 == 0) {
if (score1 != 0) {
if (score2 != 0) {
score3 = score2;
}
score2 = score1;
}
score1 = score;
} else if (score > score1 && score < score2 || score2 == 0) {
if (score2 != 0) {
score3 = score2;
}
score2 = score;
} else if (score > score2 && score < score3 || score3 == 0) {
score3 = score;
}
}
Zodra mijn componenten aan elkaar verbonden waren, ik de code geschreven had en alles met elkaar werkten, kon ik beginnen met het verplaatsen van mijn breadboard met een printplaatje. Op mijn printplaatje heb ik vervolgens alles gesoldeerd zodat het niet meer snel uit elkaar kan vallen.
Als 5e stap heb ik mijn behuizing in elkaar gezet. Ik ben begonnen met afmetingen te maken van al mijn componenten zodat ik zeker wist dat alles binnen mijn behuizing paste. Vervolgens heb ik schetsen gemaakt van het ontwerp. Voor de behuizing wilde ik een stuur maken dat afgeleid was van sturen die gebruikt worden bij Formule 1. Ik was van plan om hier hout voor te gaan gebruiken als materiaal, wat al snel de oorzaak was van een aantal complicaties op het gebied van design. Zo is een Formule 1 stuur erg dynamisch, wat moeilijk na te bootsen is met hout. Zo heb ik zoals hierboven weergegeven een aantal schetsen gemaakt. Uiteindelijk heb ik voor het rechts onder ontwerp gekozen aangezien deze voornamelijk uit basisvormen bestond, wat dus goed te maken was met hout.
Daarna heb ik alles uitgezaagd en aan elkaar gelijmd om zo een nette houten behuizing te hebben. Vervolgens heb ik de nodige inkepingen gemaakt zodat mijn ledlampen, knop en display van buitenaf zichtbaar waren. Als laatste heb ik de gehele behuizing zwart gespoten.
Als laatste stap heb ik mijn gesoldeerde componenten in mijn behuizing geplaatst en mijn behuizing dicht gemaakt met 2 schroeven aan de achterkant zodat ik in de toekomst eventueel nog de batterij eruit kan halen of vervangen.
Conclusie
Ik heb bij dit project gebruik gemaakt van een aantal bronnen waaronder deze pagina die mij hielp bij het gebruiken van mijn display (deze display weergeeft de score). https://github.com/elementzonline/Arduino-Sample-Codes/blob/master/OLED_I2C_Sample/OLED_I2C_Sample.ino
Echter merkte ik al snel dat met het gebruiken van deze code en mijn programmeerkennis een deel van mijn Arduino niet deed wat het moest doen. Dit werd veroorzaakt door de code die mijn display zou moeten initialiseren. Ik heb er daarom voor gekozen om gebruik te maken van een andere bron(https://robojax.com/learn/arduino/?vid=robojax-SSD1306-OLED-128x32) waarbij de tick snelheid van mijn display omlaag ging, maar ik wel volledig gebruik kon maken van mijn Arduino.
Aan de hand van dit project heb ik veel geleerd over de mogelijkheden met Arduino’s en hoe toegankelijk het eigenlijk is. Voordat ik ooit met een Arduino had gewerkt, verwachtte ik dat het veel lastiger was om externe onderdelen aan te sturen met een Arduino. Dit viel mij heel erg mee en ik heb veel lol gehad bij het proces van het maken van dit project.
Iets wat ik geleerd heb en een volgende keer meer rekening mee zou willen houden is dat je goed moet nadenken over de indeling binnen een behuizing. Zo heb ik veel moeite gehad om de arduino, display, leds, knop en printplaatje op de juiste plek neer te zetten zonder dat de kabels elkaar in de weg zaten of dat de arduino display wegdrukte van zijn plek.