Mini Pool Table Trainer
Ik vind een potje pool heel erg leuk. Alleen ben ik er helaas niet zo goed in. Dus heb ik een pool trainer voor mijzelf gemaakt om beter te worden. Ik heb het alleen wel door het project heen heel erg versimpeld. De trainer geeft een locatie aan die je moet raken tegen de rand van de tafel met een gele led. Als je de goede locatie raakt krijg je een punt en krijg je een nieuwe target op een willekeurige locatie om op de te richten. Deze locatie wordt berekend met een time of flight sensor.
In eerste instantie zou ik meerdere sensoren gebruiken om een 2d grid met leds te besturen. Dit was veel te ambitieus voor de ervaring die ik heb met een Arduino. Maar ik heb er wel veel van geleerd. Veel van de basics van het programmeren en het aansluiten, maar ook de FastLED library en verschillende klus dingetjes.
Supplies
Ik heb de volgende onderdelen gebruikt:
- Arduino Uno
- 9V batterij
- 9V Batterij Clip met DC Jack
- VL6180 Time-of-Flight ToF Afstandssensor
- (15cm gebruikt) WS2812B Digitale 5050 RGB LED Strip - 96 LEDs 1m
- 5 man vrouw kabels
- 3 man man kabels
- Mini Pooltafel
- Houtlijm
- Rond de 200cm2 aan dun verwerkt hout uit de schuur van een oude kast
- Schuurpapier
- Plakband of tape
Ik heb de volgende tools gebruikt:
- Zaag, elke werkt wel
- Accu boor met 10 mm boor
Iteraties En Testen
In eerste instantie zou de pool tafel veranderd worden in een 2d grid met veel meer leds. Dit zou helaas te duur en tijdconsumerend zijn. Daarom had ik het eerst één dimensionaal gemaakt met een sensor en een bal die je precies op de goede locatie moet krijgen. Dit idee werkte niet heel erg goed dus heb ik uiteindelijk alleen het doel één dimensionaal gemaakt
Casing
Na het testen met het prototype heb ik een casing gemaakt. Dit beschermt de time of flight sensor en verstopt de toekomstige draden van de sensor en de ledstrip. De afmetingen kan je zien in de afbeelding. Wanneer je alle delen hebt uitgezaagd en geschuurd, moet je 2 gaten boren: één voor de sensor, één voor de draden van de ledstrip. Als dat gedaan is, kan je het hout aan elkaar lijmen met houtlijm. Volg goed de instructie die op het houtlijm staat. Ik heb het 2 keer opnieuw moeten doen.
Wiring
Terwijl je bezig bent met wachten op het drogen van de houtlijm, boor een gat in de pool tafel. Boor het gat zo dicht mogelijk bij waar de casing komt, maar zonder door het afvoersysteem van de ballen te boren. Plak de ledstrip op de rand van de pool tafel waar de casing komt te zitten. Stop de draden door het gat dat je zonet geboord hebt. Maak de sensor vast op de goede plek met de draden er al aan vast. Stop de draden door het gat.
Verbind de draden zoals het elektronische schema.
Code
De code van het project werkt erg vanzelfsprekend. De code wordt verder uitgelegd met comments.
Belangrijk is om de libraries te instaleren. Dit zijn FastLED en Adafruit_VL6180X.
//Mini Pool Trainer 11-8-2023
#include <FastLED.h>
#include <Wire.h>
#include "Adafruit_VL6180X.h"
// Hoe veel leds heeft de strip?
#define NUM_LEDS 15
#define DATA_PIN_LEDS 3
#define LEDS_PER_20CM 20
//Defineer de array van leds
CRGB leds[NUM_LEDS];
//Tof Sensor. Gebruikt de Pins A4 en A5
Adafruit_VL6180X vl = Adafruit_VL6180X();
float maxDistance = 140; //de maximale lengte van led strip in mm
int targetPosition;
void setup(){
//Sinc debug met ToF sensor
Serial.begin(115200);
//setup ledstrips
FastLED.addLeds<WS2812, DATA_PIN_LEDS, GRB>(leds, NUM_LEDS);
//setup Tof sensor
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
targetPosition = setTarget();
}
void loop() {
//Lees distance van ToF sensor
float distance = ReadDistance();
//Registeer Hit
if(distance < maxDistance){
int hitPosition = round(distance/(200/LEDS_PER_20CM));
Serial.print("position: "); Serial.println(hitPosition);
if(hitPosition == targetPosition){
//speler heeft target geraakt
HitSequence();
targetPosition = setTarget();
}
else
//speler heeft gemist
leds[hitPosition] = CRGB::Red;
}
FastLED.show();
delay(10);
}
int ReadDistance(){
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print("Range: "); Serial.println(range);
}
return range;
}
//Kiest een nieuwe target voor de speler
int setTarget(){
int nextTarget = random(0, NUM_LEDS-1);
leds[nextTarget] = CRGB::Yellow;
FastLED.show();
return nextTarget;
}
//licht animatie als de speler de target raakt
void HitSequence(){
for(int i = 0; i < 3; i++){
for(int j = 0; j < NUM_LEDS; j++){
leds[j] = CRGB::Green;
FastLED.show();
}
delay(100);
for(int j = 0; j < NUM_LEDS; j++){
leds[j] = CRGB::Black;
FastLED.show();
}
delay(100);
}
for(int j = 0; j < NUM_LEDS; j++){
leds[j] = CRGB::Black;
FastLED.show();
}
}
Klaar!
Hier nog een video van het werkende product!
Ook al is het eindresultaat niet wat ik verwacht had, ben ik er nog steeds wel heel tevreden mee. Het werkt en de ervaring is vermakelijk voor een paar minuten. Tijdens het proces heb ik erg veel geleerd. Solderen, circuits maken, programmeren voor arduino en hoe een accu boor werkt. Er kan nog veel verbeterd worden aan het project, maar het is goed genoeg en ik heb dit project vooral gedaan om ervan te leren.