Dus als ik het goed begrijp wil je een ouderwetse race-baan maken.
Met 2 racers, die ieder een potmeter in de hand hebben om hun snelheid aan te geven, en een ledje voor elk autootje.
Als ik me goed herinner zijn die "knijpertjes" (controllers) inderdaad potmeters.
Als ik er zo over nadenk, dan zou je het volgende kunnen doen;
In de loop() kijken wat de waarde is van elk van de 2 potmeters, en op basis daarvan opgeven hoeveel stappen een autootje vooruit gaat.
Elke autootje heeft z'n eigen kleur, behalve als beide autootje op dezelfde positie staan (misschien het LEDje wit maken voor dat geval?).
Positie op de baan moet worden bijgehouden, maar ook waar de start-streep is en hoeveel rondjes men gaat rijden.
Misschien is een "start" knop ook wenselijk zodat men alleen maar tegelijk kan starten.
Als de race over is, misschien de winnaar laten knipperen.
Laten we beginnen met de start knop. Ik zou een schakelaar gebruiken, die of aan of uit staat.
Er is een Arduino voorbeeld hiervoor: Arduino Button. Daarbij is de volgende code van belang:
int Schakelaar = 2;
int Racen = 0; // stand van de schakelaar
...
void setup() {
pinMode(buttonPin, INPUT);
...
}
void loop() {
Racen = digitalRead(Schakelaar);
if (Racen == HIGH) {
// doorgaan met racen
// hier lezen we dus de potmeters en zetten de betreffende LEDs aan afhankelijk van hun positie
} else {
// alle LEDs uitzetten
}
Voor de potentiometers bestaat ook een voorbeeld: Arduino Potentiometer.
Als test voorbeeld (voor uitvoer via de seriële poort naar de serial monitor, zie ook dit artikel). Dit voorbeeld kan handig zijn om wat te testen, zodat je een idee krijgt wat voor waarden de potentiometers gaan geven.
int potPin = 2; // select the input pin for the potentiometer
int val = 0; // variable to store the value coming from the sensor
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // declare the ledPin as an OUTPUT
}
void loop() {
val = analogRead(potPin); // read the value from the sensor
Serial.println(val);
delay(val); // stop the program for some time
}
Ik vermoed dat een 10K Ohm potentiometer prima gaat zijn. Dan moet je alleen even kijken wat beter gaat werken; een lineaire of logaritmische potentiometer. Ik vermoed dat lineair het beste gaat werken.
De analoge pin leest een waarde tussen 0 en 1023, afhankelijk van de potentiometer, en deze waarde moeten we dus omzetten naar snelheid.
In dit voorbeeld neem ik even aan dat we pin 3 en 4 gebruiken voor de potmeters
int potRacer1 = 3;
int potRacer2 = 4;
...
void loop() {
snelheidRacer1 = analogRead(potRacer1); // Deze waarde moeten we straks nog wel
snelheidRacer2 = analogRead(potRacer2); // op schaal zetten zodat de race niet met 1 klik over is
delay(X); // wacht X milliseconden tussendoor anders gaat het e.e.a. te snel en is de race zo over.
}
LED plaatsen - je sprak over een voorbeeld dat je gebruikt met de naam "first led" - helaas weet ik niet welk voorbeeld dat zou zijn. Weet je of je NeoPixel of FASTLed gebruikt? Zie ook dit artikel voor de verschillen - beiden werken overigens prima.
Voor beide is het plaatsen van een LED relatief eenvoudig:
1) Zet alle LEDs UIT
2) Als beiden op dezelfde positie staan, zet deze LED dan op WIT, anders zet betreffende LED aan voor autootje1 (bv Rood) en voor autootje 2 (bv. Blauw).
Als voorbeeld voor het zetten van de LEDs;
// Stel we gebruiken 60 LEDs
#define NUM_LEDS 60
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
...
void setup() {
strip.begin();
strip.show(); // initialisatie van alle LEDs
}
void loop() {
...
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, 0,0,0); // alle LEDs UIT
}
...
PositieRacer1 = PositieRacer1 + SnelheidRacer1;
PositieRacer2 = PositieRacer2 + SnelheidRacer2;
...
strip.setPixelColor(PositieRacer1, 0xff,0,0); // rode autootje
strip.setPixelColor(PositieRacer2, 0,0,0xff); // blauwe autootje
strip.show();
...
}
Nu hebben we nog de volgende problemen over:
- Hoe schaalt de baan versus de snelheid van de autootjes?
- Afvangen van de finish lijn (eventueel 2 LED displays die aangeven welke ronde we zijn?)
- Afvangen wanneer de race over is
Ik vindt dit wel een erg leuk idee, dus (met jouw toestemming) wil ik dit later misschien omzetten naar een artikeltje.