Op een plankje van ca. 115 x 25 cm rijdt een treintje van de ene naar de andere kant. Aan beide uiteinde een fictief stationnetje waar gestopt en kortstondig gewacht wordt, voordat het treintje naar de andere kant vertrekt. Telkens heen en weer. Een Arduino Nano zorgt voor de besturing; de spanning op de rails wordt via een L298N-module telkens omgepoold. Aan elk uiteinde van de rails is een A3144 Hall-effectsensor aangebracht.


Door magneetjes die aan beide kopse kanten van een lokje aangebracht zijn, wordt het lokje door de sensoren gedetecteerd, de Arduino zorgt er via de L298N-module voor dat het treintje afremt en stopt, om na een korte pauze weer te vertrekken naar de andere kant.


De L298N is eigenlijk een module om twee motoren via ‘poort’ A (OUT1 & OUT2) en B (OUT3 & OUT4) aan te sturen. In dit geval worden alleen de uitgangen van A gebruikt. Een PWM-signaal vanuit de Arduino zorgt voor vertraging en versnelling van het lokje.


/* Pendelbaantje
* Pendelen tussen 2 stations waarbij binnen 2,5 s geremd wordt op een trigger van één van de sensoren.
* Na 10 seconden wordt er weer binnen 2,5s opgetrokken, om het proces te herhalen.
*/
int pSensor_1 = 3; // sensor bij station A
int pSensor_2 = 4; // sensor bij station B
int pRichting_v = 5; // Vooruit rijden A->B, naar IN1 op L298
int pRichting_a = 6; // Achteruit rijden B->A, naar IN2 op L298
int pRijspanning = 9; // PWM-pin naar ENA op L298
bool bRichting = false; // Rijrichting, true = vooruit
int iRijSpanning = 0; // Waarde tussen 0 (0V) en 255 (5V)
int max_snelheid = 150;
int wachttijd = 10000;
enum States {
stWachtenStation,
stAanzetten,
stRijden,
stAfremmen
};
enum States states = stWachtenStation;
void setup() {
pinMode(pSensor_1, INPUT_PULLUP);
pinMode(pSensor_2, INPUT_PULLUP);
pinMode(pRichting_v, OUTPUT);
pinMode(pRichting_a, OUTPUT);
pinMode(pRijspanning, OUTPUT);
Serial.begin(115200);
Serial.println("Pendelbaantje_2.ino");
}
void loop() {
// De check_power() functie is verwijderd; de trein pendelt nu direct continu
pendel();
}
void pendel(){
Serial.print("Sensor_1: ");
Serial.print(digitalRead(pSensor_1));
Serial.print('\t');
Serial.print("Sensor_2: ");
Serial.print(digitalRead(pSensor_2));
Serial.print('\n');
switch (states) {
case stWachtenStation:
// Wachten op station
setDirection(bRichting); // Richting naar pinnen wegschrijven
delay(wachttijd); // Wacht x seconden
states = stAanzetten;
break;
case stAanzetten:
// Optrekken van 0 naar max-snelheid in stapjes met 10 ms tussenpozen
for(int i = 0; i < max_snelheid; i++) {
iRijSpanning++;
analogWrite(pRijspanning, iRijSpanning); // Huidige rijstap naar PWM-pin wegschrijven
delay(10);
}
states = stRijden;
break;
case stRijden:
if (bRichting == true) // Vooruit, dus van A naar B
{
if (!digitalRead(pSensor_2)) // Wacht totdat je de sensor bij station B ziet
{
states = stAfremmen;
bRichting = false; // Richting veranderen
}
}
else // Achteruit, dus van B naar A
{
if (!digitalRead(pSensor_1)) // Wacht totdat je de sensor bij station A ziet
{
states = stAfremmen;
bRichting = true; // Richting veranderen
}
}
break;
case stAfremmen:
for(int i = 0; i < max_snelheid; i++) {
iRijSpanning--; // Van max_snelheid naar 0 in stapjes met 10 ms tussenpozen
analogWrite(pRijspanning, iRijSpanning); // Huidige rijstap naar PWM-pin wegschrijven
delay(10);
}
states = stWachtenStation;
break;
}
}
void setDirection(bool richting){
digitalWrite(pRichting_v, LOW); // Dode tijd (om kortsluiting in H-brug te vermijden)
digitalWrite(pRichting_a, LOW);
delay(100);
if (richting == true) // Vooruit
{
digitalWrite(pRichting_v, HIGH);
digitalWrite(pRichting_a, LOW);
}
else // Achteruit
{
digitalWrite(pRichting_v, LOW);
digitalWrite(pRichting_a, HIGH);
}
}
