Pendelbaantje

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.

Het schema

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.

L298N-module
A3144 Hall-effectsensor

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.

Proefopstelling
Overzicht van het baantje
/* 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);
  }
}
Ingegraven Hall-effectsensor

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.