help met sketch - DC motor besturing en IR sensor

IDE gerelateerde berichten
Berichten: 3
Geregistreerd: 26 Mei 2024, 21:10

help met sketch - DC motor besturing en IR sensor

Berichtdoor leoarduinoman » 26 Mei 2024, 22:07

Ik heb een DC motortje wat middels een relais wordt aan- of uit geschakeld.
Na 5 omwentelingen, die ik tel met een IR sensor (TCRT5000 – line follower), stopt de motor 3 seconden doordat, via een relais, de voedingspanning van de motor wordt uitgeschakeld.
Na deze 3 seconden wordt het relais weer bekrachtigd en krijgt de motor zijn voedingsspanning en begint de cyclus van 5 omwentelingen opnieuw.

Ook stopt de motor als de IR sensor wordt geactiveerd EN er wordt een deurschakelaar ingedrukt, de motor stopt dan zolang de deurschakelaar is ingedrukt. Pas als ik de deurschakelaar los laat wordt de motor weer bekrachtigd en start de cyclus van 5 omwentelingen opnieuw. Dit werkt allemaal perfect.

Wat me echter niet lukt is om, als de motor na 5 omwentelingen is gestopt EN de deurschakelaar wordt ingedrukt in de “3 seconden periode dat motor is gestopt” de motor dan gestopt blijft ZOLANG de deurschakelaar is ingedrukt.
Zodra ik de deurschakelaar los laat moet de motor weer gaan draaien….

Wat moet ik aanpassen in mijn sketch??


// Pin configuration

const int sensorPin = 5; // Infrared sensor
const int doorswitch = A4; // Deurschakelaar
int relay = 13; // Relay wat motorspanning schakelt

// Variables
int objectCount = 0; // Counter to keep track of the number of objects
int sensorState = 0; // Current state of the sensor (HIGH or LOW)
int lastSensorState = 0; // Previous state of the sensor

void setup() {
pinMode(sensorPin, INPUT); // Set sensor pin as input
Serial.begin(9600); // Initialize serial communication for debugging
pinMode(relay, OUTPUT);
digitalWrite(relay, HIGH);
pinMode(doorswitch, INPUT); // declare doorswtich as input
}

void loop() {
sensorState = digitalRead(sensorPin); // Read the state of the sensor
int valB = digitalRead(doorswitch); // read doorswitch state HIGH = OPEN LOW = COSED

if (sensorState != lastSensorState) { // Check if the sensor state has changed (object detected)
if (valB == HIGH && sensorState == HIGH) { // als deur OPEN is en IR sensor detecteert object dan stopt motor zolang deur OPEN is
digitalWrite(13, LOW);
objectCount = 0;
} else {
if (valB == LOW && sensorState == HIGH) { // als deur DICHT is en en IR sensor detecteert object dan worden omwentelingen geteld
objectCount++; // Increment the object count when an object is detected
Serial.print("Object detected! Count: ");
Serial.println(objectCount);
digitalWrite(13, HIGH);
}
if (objectCount > 4) { // Na 5 omwentelingen stopt van object stopt motor
digitalWrite(13, LOW);
Serial.print("motor switched off ");
Serial.println();
delay(3000);
digitalWrite(13, HIGH);
objectCount = 0;
}
if (objectCount < 3) {
digitalWrite(13, HIGH);
delay(50); // Delay to debounce the sensor (avoid multiple counts for a single object)
}
lastSensorState = sensorState; // Update the last sensor state for the next iteration
}
}
}

Advertisement

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

Re: help met sketch - DC motor besturing en IR sensor

Berichtdoor shooter » 28 Mei 2024, 13:18

je maakt een int valB aan en dan ga je kijken of deze een boolean is
en met dit soort if constructies moet je goed kijken welke regels er zijn liever allemaal apart op een regel zetten
zoals if waar1 && waar2 then etc.
en bij delay staat je programma stil dus dat kun je beter oplossen met een timer (millis() wat eigenlijk gewoon een klokje intern is en na een startsignaal sla je de long int waarde op in een variabele en elke loop kijk je of die variabele al 3000 keer is (automatisch opgheoogd is
paul deelen
shooter@home.nl

Berichten: 3
Geregistreerd: 26 Mei 2024, 21:10

Re: help met sketch - DC motor besturing en IR sensor

Berichtdoor leoarduinoman » 28 Mei 2024, 21:04

Hoi Shooter,

Bedankt voor de tip en je hebt gelijk wat betreft het vervangen van de delay door millis.. Ik ga e.e.a. uitproberen..

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

Re: help met sketch - DC motor besturing en IR sensor

Berichtdoor ThHe » 29 Mei 2024, 18:03

Als ik naar de code kijk valt het volgende direct op:
Je leest 2 trigges uit nl "sensorState" en "valB" terwijl je alleen met "sensorState" wijziging iets uitvoerd:

Code: Alles selecteren
  sensorState = digitalRead(sensorPin); // Read the state of the sensor
  int valB = digitalRead(doorswitch); // read doorswitch state HIGH = OPEN LOW = COSED
 
  if (sensorState != lastSensorState) { // Check if the sensor state has changed (object detected)
   .......
  }


Ik denk dat het if(valB ... statement moet worden verplaatst.
De loop() komt er dan als volgt uit te zien:

Code: Alles selecteren
void loop() {
  sensorState = digitalRead(sensorPin); // Read the state of the sensor
  int valB = digitalRead(doorswitch); // read doorswitch state HIGH = OPEN LOW = COSED
   
  if (valB == HIGH && sensorState == HIGH) { // als deur OPEN is en IR sensor detecteert object dan stopt motor zolang deur OPEN is
      digitalWrite(13, LOW);
      objectCount = 0;
  }   
  else if (sensorState != lastSensorState) { // Check if the sensor state has changed (object detected)
    if (valB == LOW && sensorState == HIGH) { // als deur DICHT is en en IR sensor detecteert object dan worden omwentelingen geteld
        objectCount++; // Increment the object count when an object is detected
        Serial.print("Object detected! Count: ");
        Serial.println(objectCount);
        digitalWrite(13, HIGH);
    }
    if (objectCount > 4) { // Na 5 omwentelingen stopt van object stopt motor
        digitalWrite(13, LOW);
        Serial.print("motor switched off ");
        Serial.println();
        delay(3000);
        digitalWrite(13, HIGH);
        objectCount = 0;
    }
    if (objectCount < 3) {
        digitalWrite(13, HIGH);
        delay(50); // Delay to debounce the sensor (avoid multiple counts for a single object)
    }
    lastSensorState = sensorState; // Update the last sensor state for the next iteration
  }
}


Het vervolg kan zijn, maar dat kan je zelf testen, of het gedeelte van > 4 kan worden samengevoegd.

Code: Alles selecteren
  if ((valB == HIGH && sensorState == HIGH) || // als deur OPEN is en IR sensor detecteert object dan stopt motor zolang deur OPEN is
     (objectCount > 4)) {                     // OF Na 5 omwentelingen stopt van object stopt motor
        digitalWrite(13, LOW);
        Serial.print("motor switched off ");
        Serial.println();
        delay(3000);
        digitalWrite(13, HIGH);
        objectCount = 0;
    }


Als de delay(3000) je in de weg zit om een of andere reden moet je de timer met millis() inbouwen.
Als het inbouwen een probleem is laat het dan nog even weten.
Succes!!

Berichten: 3
Geregistreerd: 26 Mei 2024, 21:10

Re: help met sketch - DC motor besturing en IR sensor

Berichtdoor leoarduinoman » 02 Jun 2024, 21:55

ThHe, bedankt en het werkt nu als volgt:
-Na 5 omwentelingen stopt de motor 3 seconden als de IR sensor weer HIGH wordt
-Als ik de deur open terwijl de motor draait stopt de motor zodra de IR sensor HIGH wordt...

Wat echter nog steeds niet goed werkt is dat als na 5 omwentelingen de motor is gestopt en in de DELAY periode van 3 seconden open ik de deur dan gaat de motor na 3 seconden toch weer draaien terwijl de motor, zolang de deur open is, stil moet blijven staan.

Omdat ik met deze Arduino nog 3 andere motoren aanstuur (betreft een horloge winder voor 4 horloges) moet de DELAY inderdaad worden vervangen door millis want die DELAY stopt de sketch.... Ik ben zelf al bezig geweest met millis maar dat maakt het niet eenvoudiger..

Elke suggestie of hulp is welkom...

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

Re: help met sketch - DC motor besturing en IR sensor

Berichtdoor shooter » 04 Jun 2024, 17:42

bedenk dat millis() een teller is die elke ms 1 ophoogt en waarvan je de waarde kunt zien met long tijd = millis() en je dus kan vragen of millis() of dat al lang geleden bijv 10000 milliseconden geleden is gevraagd door millis() - tijd > 1000 te vragen
paul deelen
shooter@home.nl

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

Re: help met sketch - DC motor besturing en IR sensor

Berichtdoor ThHe » 04 Jun 2024, 23:57

Bij mijn eerdere opmerking ben ik uitgegaan van de bestaande code.
Zelf denk ik dat objectCount = 0 direct moet worden uitgevoerd na de digitalWrite(13, LOW)

Nu het delay(3000) op simpele manier invoeren in sketch.
Toevoegen aan je // Variables het volgende statement "long timer = 0;"
Aan het begin van de loop het volgende uitbreiden.

Code: Alles selecteren
void loop() {
  sensorState = digitalRead(sensorPin); // Read the state of the sensor
  int valB = digitalRead(doorswitch); // read doorswitch state HIGH = OPEN LOW = COSED

  if (timer != 0) {         // timer loopt indien != 0
     if (timer > millis()) {
        // Eventuele Acties die je wil uitvoeren terwijl de timer nog loopt.
     } else {                            // Timer is afgelopen
        digitalWrite(13, HIGH);   // huidige uitvoering na einde delay
        timer = 0;                     // Timer afzetten
     }
  }
  else  if (valB == HIGH ......


Nu nog de timer aanzetten door de delay te vervangen

Code: Alles selecteren
        timer = millis() + 3000;
 //       delay(3000);
 //       digitalWrite(13, HIGH);


Als alles goed is werkt de sketch nog hetzelfde maar de delay(3000) is vervangen door millis()
Als je met meerdere motoren aan de gang gaat kun je ook met meedere timers werken.
Succes!!

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten