Pendelbaan werkt niet zoals verwacht

Arduino specifieke Software
Berichten: 15
Geregistreerd: 20 Okt 2020, 11:40

Pendelbaan werkt niet zoals verwacht

Berichtdoor Who2020 » 20 Nov 2023, 14:38

Ik heb een pendelbaantje gebouwd (N-spoor) waarop een analoge bus tussen 2 stations heen en weer moet pendelen.
Ik gebruik IR-reflectiesensoren (zender en ontvanger naast elkaar) en later IR-lichtsluisjes (zender tegenover ontvanger(.
Ik heb het volgende probleem: de bus rijdt eerst een stukje richting sensor1, stopt, wacht 10 sec. en rijdt dan een stukje richting sensor2, dit herhaalt zich zonder een sensor te triggeren.
Ik heb geen idee wat er fout gaat, hopelijk iemand anders wel.
De sketch:
Code: Alles selecteren
[code]

int pSensor_1 = 3;         //sensor bij station A
int pSensor_2 = 4;         //sensor bij station B
int pRichting_v = 5;       //Vooruit rijden A naar B,naar IN1 op L298
int pRichting_a = 6;       //Achteruitrijden rijdenB naar A,naar IN2 op L298
int pRijspanning = 9;      //PWM-pin naar ENA op L298
bool bRichting = 1;        //Rijrichting, 1 = vooruit
int iRijSpanning = 0;      //Waarde tussen 0 (0V) en 255 (5V)

const char* stateNames[] = {
  "stWachtenStation",
  "stAanzetten",
  "stRijden",
  "stAfremmen"
};



enum States {
  stWachtenStation,
  stAanzetten,
  stRijden,
  stAfremmen
};

enum States states = stWachtenStation;

void setup() {

  pinMode(pSensor_1, INPUT);
  pinMode(pSensor_2, INPUT);
  pinMode(pRichting_v, OUTPUT);
  pinMode(pRichting_a, OUTPUT);
  pinMode(pRijspanning, OUTPUT);
  Serial.begin(9600);

}

void loop() {
  Serial.print("Current State: ");
  Serial.println(stateNames[states]);

  Serial.println("Richting: ");
  Serial.println(bRichting);

  switch (states)
  {
    // Wachten op het station, voor 10 seconden (10000ms)
    case stWachtenStation:
      setDirection(bRichting);
      delay(10000);
      states = stAanzetten;
      break;

    case stAanzetten:
      // In stapjes van 2ms weer optrekken (tot aan 255, wat vaak 1 is)
      for (int i = 0; i < 255; i++)
      {
        iRijSpanning++;
        analogWrite(pRijspanning, i);
        delay(2);
      }
      states = stRijden;
      break;

    case stRijden:
      // Deze state blijft aangeroepen worden tijdens het rijden tot dat 1 van de
      // pSensor_1 of pSensor 2 wordt gespot, daarna gaat hij afremmen
      if (bRichting == 1)
      {
        if (digitalRead(pSensor_2) == 0)
        {
          states = stAfremmen;
          bRichting = 0;
        }
      }
      else
      {
        if (digitalRead(pSensor_1) == 0)
        {
          states = stAfremmen;
          bRichting = 1;
        }
      }
      break;

    // Afremmen in stapjes van 2ms, je zou de delay weg kunnen halen voor instant stop.
    case stAfremmen:
      for (int i = 0; i < 255; i++)
      {
        iRijSpanning--;
        analogWrite(pRijspanning, iRijSpanning);
        delay(2);
      }
      states = stWachtenStation;
      break;
  }
}

void setDirection(int richting)
{
  // Beetje overkill, maar hier wordt alles uitgezet
  digitalWrite(pRichting_v, LOW);
  digitalWrite(pRichting_a, LOW);
  delay(100);
  // vooruit
  if (richting == 0)
  {
    digitalWrite(pRichting_v, HIGH);
    digitalWrite(pRichting_a, LOW);
  }
  //Achteruit
  else
  {
    digitalWrite(pRichting_v, LOW);
    digitalWrite(pRichting_a, HIGH);
  }

}
[/code]

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor shooter » 21 Nov 2023, 13:57

hij doet een halve seconde over afremmen prima maar welke richting is afremmen? dus een paar statussen erbij zetten zoals rijden links rijden rechts remmen links en remmen rechts en ook nog festopt links en rechts.
en je mag best de status of zoiets in de monitor zetten dan zie je wat actief is. hou er verder rekening mee dat het programma heel erg snel is dus veel sneller dab sensoren
paul deelen
shooter@home.nl

Berichten: 62
Geregistreerd: 05 Feb 2023, 13:30

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor sterretjeToo » 21 Nov 2023, 18:45

Geen idee welke sensoren je gebruikt. Misschien hebben deze sensoren een open-collector uitgang; in dat geval moet je de uitgang via een weerstand aan Vcc knopen (of de interne pull-up gebruiken)

Wat je nu hebt is misschien een zwevende ingang en die kan storingen uit de omgeving oppiken en daar reageert je programma op.

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor ThHe » 22 Nov 2023, 01:28

Testen kan ik het programma niet maar er zijn wat verdachte statements.

Code: Alles selecteren
   
case stRijden:
      // Deze state blijft aangeroepen worden tijdens het rijden tot dat 1 van de
      // pSensor_1 of pSensor 2 wordt gespot, daarna gaat hij afremmen
      if (bRichting == 1)
      {
        if (digitalRead(pSensor_2) == 0)
        {
          states = stAfremmen;
          bRichting = 0;
        }
      }
      else
      {
        if (digitalRead(pSensor_1) == 0)
        {
          states = stAfremmen;
          bRichting = 1;
        }
      }
      break;

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor ThHe » 22 Nov 2023, 01:39

Nu het hele verhaal:

Testen kan ik het programma niet maar er zijn wat verdachte statements.
if (rRichting == 1) is overbodig alleen de sensor test is bepalend.

Code: Alles selecteren
case stRijden:
      // Deze state blijft aangeroepen worden tijdens het rijden tot dat 1 van de
      // pSensor_1 of pSensor 2 wordt gespot, daarna gaat hij afremmen
      if (digitalRead(pSensor_2) == 0)
      {
         states = stAfremmen;
         bRichting = 0;
      }
      if (digitalRead(pSensor_1) == 0)
      {
        states = stAfremmen;
        bRichting = 1;
      }
     break;
    


Verder loop de i in de for loop samen met de IRijSpanning.
Code: Alles selecteren
      while (iRijSpanning < 255)
      {
        iRijSpanning++;
        analogWrite(pRijspanning, iRijSpanning);
        delay(2);
      }
     .........
     while (iRijSpanning > 0)
      {
        iRijSpanning--;
        analogWrite(pRijspanning, iRijSpanning);
        delay(2);
      }

Berichten: 15
Geregistreerd: 20 Okt 2020, 11:40

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor Who2020 » 27 Nov 2023, 14:42

Alles goed en wel maar:
a) de rijrichting maakt toch niets uit, hij moet na het passeren van een sensor omkeren.
b) ik ga het eens proberen met Hall sensoren en een magneet onder de bus.

Mvg, Willem

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor Frits1956 » 27 Nov 2023, 19:32

[quote="Who2020"
b) ik ga het eens proberen met Hall sensoren en een magneet onder de bus.

Mvg, Willem[/quote]
Welk sensortype wordt gebruikt heeft geen invloed op de werking van het programma.
Zelf gebruiken wij ook IR sensoren maar onze programma opbouw is anders dan deze complexe case vorm.
Wij programmeren meer met procedures die sequentieel aangeroepen worden waardoor eerder duidelijk wordt waar er wat anders gebeurd dan verwacht. Het maakt het miz ook makkelijker om te kunnen controleren of het bereiken van een sensor veel langer duurt dan normaal. Als dat laatste het geval is, dan is er wat mis en wordt bij ons een failure procedure in werking gezet.

Berichten: 15
Geregistreerd: 20 Okt 2020, 11:40

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor Who2020 » 17 Dec 2023, 15:31

Ook met de Hall sensoren werkt het niet.
Ik verdenk nu het (losse) motorshield.
Ik heb zojuist een nieuwe besteld, we gaan het zien.
Zal wel na de kerst worden :(

Berichten: 62
Geregistreerd: 05 Feb 2023, 13:30

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor sterretjeToo » 18 Dec 2023, 11:48

Ik zou eens beginnen met de volgende simpele sketch om te zien of je de juiste data van de sensoren krijgt / leest

Code: Alles selecteren
int pSensor_1 = 3;  //sensor bij station A
int pSensor_2 = 4;  //sensor bij station B


void setup()
{
  Serial.begin(9600);
  Serial.println(F("Test sketch for sensors"));

  pinMode(pSensor_1, INPUT);
  pinMode(pSensor_2, INPUT);
}

void loop()
{
  static int lastSensor1Value = HIGH;
  static int lastSensor2Value = HIGH;
  int x;
 
  x = digitalRead(pSensor_1);
  if (x != lastSensor1Value)
  {
    Serial.print(F("Sensor 1 = "));
    Serial.println(x);
    lastSensor1Value = x;
  }
 
  x = digitalRead(pSensor_2);
  if (x != lastSensor2Value)
  {
    Serial.print(F("Sensor 2 = "));
    Serial.println(x);
    lastSensor2Value = x;
  }
}


Je mag in principe geen data zien in de seriële monitor tenzij je één van de sensoren activeert of de-activeert.

Het maakt gebruik van "state change detection" zodat er alleen op veranderingen in het niveau van de signalen wordt gereageerd.

Berichten: 15
Geregistreerd: 20 Okt 2020, 11:40

Re: Pendelbaan werkt niet zoals verwacht

Berichtdoor Who2020 » 12 Jan 2024, 11:19

Ik ga het testen (ben nu bezig met mijn 3D printer dus er gaat wel wat tijd overheen)

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: emorawdjodeg en 83 gasten