//Keyboard Controls:// 1 -Motor 1 Left // 2 -Motor 1 Stop // 3 -Motor 1 Right// 4 -Motor 2 Left // 5 -Motor 2 Stop // 6 -Motor 2 Right// Declare L298N Dual H-Bridge Motor Controller directly since there is not a library to load.// motorsturingconst int dir1PinA = 2; // motor driverconst int dir2PinA = 3; // motor driverconst int speedPinA = 9; // Needs to be a PWM pin to be able to control motor speedint speed = 100; // default speedbool richting = true; // richting true = forward false = backward// IR sensorconst int led1 = 7; // de pin van de IR ledconst int led2 = 8;const int sensor1 = A1; //de pin van de 1e ir sensorconst int sensor2 = A2; // de pin van de 2e ir sensorint waarde1 = 0;int waarde2 = 0;// wisselschakelaarconst int wissel1R = 11; // wissel 1const int wissel1L = 10;// potmeterconst int pot = A0; //de pin van de potmeterint potspeed = 0; //de ingestelde snelheid mbv de potmeter// switchesbool potmeter = true;int teller = 0;// timerslong snelheidTimer = 0; // timer voor optrekken afremmen pauze routineslong sensorTimer1 = 0; // timer voor sensor1 timeoutlong sensorTimer2 = 0; // timer voor sensor2 timeout// status variabelenint stationState = 0; // 0 geen actie 1 remmen 2 wachten 3 optrekkenint blokState = 0; // 0 geen actie 1 remmen 2 wachten 3 optrekkenvoid setup() { // Setup runs once per reset // initialize serial communication @ 9600 baud: Serial.begin(9600); //Define Pins pinMode(dir1PinA, OUTPUT); pinMode(dir2PinA, OUTPUT); pinMode(speedPinA, OUTPUT); pinMode (sensor1, INPUT_PULLUP); pinMode (sensor2, INPUT_PULLUP); pinMode (led1, OUTPUT); pinMode (led2, OUTPUT); pinMode (pot, INPUT); pinMode (wissel1R, OUTPUT); pinMode (wissel1L, OUTPUT); // start forward met default speed analogWrite(speedPinA, speed); //Sets speed variable via PWM digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH);}void loop() { // Initialize the Serial interface: if (Serial.available() > 0) { keyboardControl(Serial.read()); } if (richting) { // de trein rijdt vooruit if (leesSensor1()) { // indien sensor 1 positief :rem de trein af, pauzeer , start de trein op (station) schakel de pot meter even uit potmeter = false; stationState = 1; } if (leesSensor2() ) { // de trein gaat vooruit tel bv 3 rondjes, zet dan de wissel om naar station ++teller; if (teller > 3) { // eventueel testen of het station leeg is wissel1Rechts(); teller = 0; } } } else { // de trein rijdt achteruit if (leesSensor2()) { // de trein passeert de sensor achteruit, remt, wissel gaat om en trein gaat weer vooruit blokState = 1; potmeter = false; } } if (stationState > 0) Station(); if (blokState > 0) Blok(); if (potmeter) leesPot();}bool Optrekken() { bool b = false; // b=false : trein trekt niet verder op (snelheid bereikt) if (speed < potspeed) { b = true; if (millis() - snelheidTimer > 100) { speed = speed + 10; if (speed > potspeed) speed=potspeed; snelheidTimer = millis(); analogWrite(speedPinA, speed); } } return b;}bool Remmen() { bool b = false; // b=false : trein remt niet verder af (snelheid bereikt) if (speed > 0) { b = true; if (millis() - snelheidTimer > 100) { speed = speed - 10; if (speed <0) speed=0; snelheidTimer = millis(); analogWrite(speedPinA, speed); } } return b;}void Station() { bool b = true; switch (stationState) { case 1: b = Remmen(); // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is if (!b) { stationState = 2; wissel1Links(); } break; case 2: if (millis() - snelheidTimer > 10000) { if (richting == true) { // draai de rijrichting om analogWrite(speedPinA, 0); digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); richting = false; } // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv) snelheidTimer = millis(); stationState = 3; wissel1Rechts(); } break; case 3: b = Optrekken(); if (!b) { stationState = 0; potmeter = true; } break; }}void Blok() { bool b = true; switch (blokState) { case 1: b = Remmen(); // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is if (!b) { blokState = 2; wissel1Links(); } break; case 2: if (millis() - snelheidTimer > 1000) { if (richting == false) { // draai de rijrichting om analogWrite(speedPinA, 0); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); richting = true; } // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv) snelheidTimer = millis(); blokState = 3; } break; case 3: b = Optrekken(); if (!b) { blokState = 0; potmeter = true; } break; }}void wissel1Rechts() { digitalWrite (wissel1R, 1); delay(150); digitalWrite (wissel1R, 0);}void wissel1Links() { digitalWrite (wissel1L, 1); delay(150); digitalWrite (wissel1L, 0);}void leesPot() { potspeed = map(analogRead(pot), 0, 1023, 0, 255); if ((speed - potspeed) > 3 || (potspeed - speed) > 3) { speed = potspeed; analogWrite(speedPinA, speed); //Serial.print("Motor 1 Speed "); Serial.println(speed); // Serial.println(" "); }}bool leesSensor1() { bool b = false; if (millis() - sensorTimer1 > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren digitalWrite (led1, HIGH); waarde1 = analogRead(sensor1); delay(1); digitalWrite (led1, LOW); waarde2 = analogRead(sensor1); if ((waarde1 - waarde2) > 150) { // arbitraire waarde fine tunen nodig b = true; sensorTimer1 = millis(); } } return b;}bool leesSensor2() { bool b = false; if (millis() - sensorTimer2 > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren digitalWrite (led2, HIGH); waarde1 = analogRead(sensor2); delay(1); digitalWrite (led2, LOW); waarde2 = analogRead(sensor2); if ((waarde1 - waarde2) > 150) { // arbitraire waarde fine tunen nodig b = true; sensorTimer2 = millis(); } } return b;}void keyboardControl(int inByte) { switch (inByte) { case '1': // Motor 1 Forward analogWrite(speedPinA, speed); //Sets speed variable via PWM digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); richting = true; Serial.println("Motor 1 Forward"); Serial.println(" "); break; case '2': // Motor 1 Stop (Freespin) analogWrite(speedPinA, 0); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); richting = true; Serial.println("Motor 1 Stop"); Serial.println(" "); break; case '3': // Motor 1 Reverse analogWrite(speedPinA, speed); digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); richting = false; Serial.println("Motor 1 Reverse"); Serial.println(" "); break; case '+': // Motor 1 speed + if (speed < 255) ++speed; analogWrite(speedPinA, speed); Serial.print("Motor 1 Speed "); Serial.println(speed); Serial.println(" "); break; case '-': // Motor 1 speed + if (speed > 200) --speed; analogWrite(speedPinA, speed); Serial.print("Motor 1 Speed "); Serial.println(speed); Serial.println(" "); break; case 'l': // wissel links wissel1Links(); Serial.print("Wissel links"); Serial.println(" "); break; case 'r': // wissel rechts wissel1Rechts(); Serial.print("Wissel rechts"); Serial.println(" "); break; }}
const byte SensorPinnen[] = {A1, A2}; //Pinnen van de lichtsluis sensorenconst byte LedPinnen[] = {7, 8}; //Pinnen van de ledjes voor de lichtsluizenunsigned int sensorTimers[sizeof(SensorPinnen)];//Timers voor de sensoren (int omdat <65sec)bool leesSensor(byte nummer){ unsigned int millisNow = millis(); //omdat we intervallen van minder dan 65sec bekijken gaan we naar een uint int waardes[2]; if (millisNow - sensorTimers[nummer] > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren //Bekijken met led aan en led uit digitalWrite (LedPinnen[nummer], HIGH); waardes[0] = analogRead(SensorPinnen[nummer]); //delay(1); //lijkt me niet nodig digitalWrite (LedPinnen[nummer], LOW); waardes[1] = analogRead(SensorPinnen[nummer]); if ((waardes[0] - waardes[1]) > 150) { // arbitraire waarde fine tunen nodig sensorTimers[nummer] = millisNow; return true; } } return false;}
// Arduino analoge modelbaan besturing vs 1a// Dick koning augustus 2015//Keyboard Controls:// 1 -Motor 1 Left // 2 -Motor 1 Stop // 3 -Motor 1 Right// 4 -Motor 2 Left // 5 -Motor 2 Stop // 6 -Motor 2 Right// Declare L298N Dual H-Bridge Motor Controller directly since there is not a library to load.// motorsturingconst int dir1PinA = 2; // motor driverconst int dir2PinA = 3; // motor driverconst int speedPinA = 9; // Needs to be a PWM pin to be able to control motor speedint speed = 100; // default speedbool richting = true; // richting true = forward false = backward// IR sensorconst byte SensorPinnen[] = {A1, A2}; //Pinnen van de lichtsluis sensorenconst byte LedPinnen[] = {7, 8}; //Pinnen van de ledjes voor de lichtsluizen// wisselschakelaarconst byte WisselPinnen[] = {10, 11}; // Pinnen van de wisselsturing 1L, 1R etc// potmeterconst int pot = A0; //de pin van de potmeterint potspeed = 0; //de ingestelde snelheid mbv de potmeter// switchesbool potmeter = true;int teller = 0;// timerslong snelheidTimer = 0; // timer voor optrekken afremmen pauze routinesunsigned int sensorTimers[sizeof(SensorPinnen)];//Timers voor de sensoren (int omdat <65sec), size off definieert de lengte van de array// status variabelenint stationState = 0; // 0 geen actie 1 remmen 2 wachten 3 optrekkenint blokState = 0; // 0 geen actie 1 remmen 2 wachten 3 optrekkenvoid setup() { // Setup runs once per reset // initialize serial communication @ 115200 baud: Serial.begin(115200); //Define Pins pinMode(dir1PinA, OUTPUT); pinMode(dir2PinA, OUTPUT); pinMode(speedPinA, OUTPUT); for ( int i = 0 ; i < sizeof(SensorPinnen); i++) { pinMode (SensorPinnen[i], INPUT_PULLUP); pinMode (LedPinnen[i], OUTPUT); } for ( int i = 0 ; i < sizeof(WisselPinnen); i++) { pinMode (WisselPinnen[i], OUTPUT); } pinMode (pot, INPUT); // start forward met default speed analogWrite(speedPinA, speed); //Sets speed variable via PWM digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH);}void loop() { // Initialize the Serial interface: if (Serial.available() > 0) { keyboardControl(Serial.read()); } if (richting) { // de trein rijdt vooruit if (leesSensor(0)) { // indien sensor 1 positief :rem de trein af, pauzeer , start de trein op (station) schakel de pot meter even uit potmeter = false; stationState = 1; } if (leesSensor(1) ) { // de trein gaat vooruit tel bv 3 rondjes, zet dan de wissel om naar station teller++; if (teller > 2) { // eventueel testen of het station leeg is wissel(1); // wissel R teller = 0; } } } else { // de trein rijdt achteruit if (leesSensor(1)) { // de trein passeert de sensor achteruit, remt, wissel gaat om en trein gaat weer vooruit blokState = 1; potmeter = false; } } if (stationState > 0) Station(); if (blokState > 0) Blok(); if (potmeter) leesPot();}bool Optrekken() { bool b = false; // b=false : trein trekt niet verder op (snelheid bereikt) if (speed < potspeed) { b = true; if (millis() - snelheidTimer > 100) { speed = speed + 5; if (speed > potspeed) speed = potspeed; snelheidTimer = millis(); analogWrite(speedPinA, speed); } } return b;}bool Remmen() { bool b = false; // b=false : trein remt niet verder af (snelheid bereikt) if (speed > 0) { b = true; if (millis() - snelheidTimer > 100) { speed = speed - 5; if (speed < 0) speed = 0; snelheidTimer = millis(); analogWrite(speedPinA, speed); } } return b;}void Station() { bool b = true; switch (stationState) { case 1: b = Remmen(); // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is if (!b) { stationState = 2; wissel(0); // wissel 1 l } break; case 2: if (millis() - snelheidTimer > 10000) { if (richting == true) { // draai de rijrichting om analogWrite(speedPinA, 0); digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); richting = false; } // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv) snelheidTimer = millis(); stationState = 3; wissel(1); // wissel 1 r } break; case 3: b = Optrekken(); if (!b) { stationState = 0; potmeter = true; } break; }}void Blok() { bool b = true; switch (blokState) { case 1: b = Remmen(); // de functie remmen vermindert de snelheid van de trein tot 0, return= false als snelheid 0 is if (!b) { blokState = 2; wissel(0); // wissel l } break; case 2: if (millis() - snelheidTimer > 1000) { if (richting == false) { // draai de rijrichting om analogWrite(speedPinA, 0); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); richting = true; } // eventuele toets om te kijken of de trein kan vertrekken ( volgende blok vrij bv) snelheidTimer = millis(); blokState = 3; } break; case 3: b = Optrekken(); if (!b) { blokState = 0; potmeter = true; } break; }}void wissel(byte n) { digitalWrite (WisselPinnen[n], 1); delay(150); digitalWrite (WisselPinnen[n], 0); //Serial.Print("Wissel ");Serial.println(n);}void leesPot() { potspeed = map(analogRead(pot), 0, 1023, 0, 255); if ((speed - potspeed) > 3 || (potspeed - speed) > 3) { speed = potspeed; analogWrite(speedPinA, speed); //Serial.print("Motor 1 Speed "); Serial.println(speed); }}bool leesSensor(byte nummer) { unsigned int millisNow = millis(); //omdat we intervallen van minder dan 65sec bekijken gaan we naar een uint int waardes[2]; if (millisNow - sensorTimers[nummer] > 1000) { // na activatie van de sensor is die 1 sec niet meer te triggeren //Bekijken met led aan en led uit digitalWrite (LedPinnen[nummer], HIGH); waardes[0] = analogRead(SensorPinnen[nummer]); delay(1); //lijkt me niet nodig digitalWrite (LedPinnen[nummer], LOW); waardes[1] = analogRead(SensorPinnen[nummer]); if ((waardes[0] - waardes[1]) > 150) { // arbitraire waarde fine tunen nodig sensorTimers[nummer] = millisNow; // Serial.print("Sensor ");Serial.println(nummer); return true; } } return false;}void keyboardControl(int inByte) { switch (inByte) { case '1': // Motor 1 Forward analogWrite(speedPinA, speed); //Sets speed variable via PWM digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); richting = true; Serial.println("Motor 1 Forward"); Serial.println(" "); break; case '2': // Motor 1 Stop (Freespin) analogWrite(speedPinA, 0); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); richting = true; Serial.println("Motor 1 Stop"); Serial.println(" "); break; case '3': // Motor 1 Reverse analogWrite(speedPinA, speed); digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); richting = false; Serial.println("Motor 1 Reverse"); Serial.println(" "); break; case '+': // Motor 1 speed + if (speed < 255) ++speed; analogWrite(speedPinA, speed); Serial.print("Motor 1 Speed "); Serial.println(speed); Serial.println(" "); break; case '-': // Motor 1 speed + if (speed > 200) --speed; analogWrite(speedPinA, speed); Serial.print("Motor 1 Speed "); Serial.println(speed); Serial.println(" "); break; case 'l': // wissel links wissel(0); Serial.print("Wissel links"); Serial.println(" "); break; case 'r': // wissel rechts wissel(1); Serial.print("Wissel rechts"); Serial.println(" "); break; }}