pendelbaan

algemene C code
Berichten: 32
Geregistreerd: 07 Okt 2016, 10:33

pendelbaan

Berichtdoor maartentukker » 06 Feb 2019, 21:59

Goedendag,

Ik ben bezig met een pendelbaan en heb deze bijna werkend. Servo sturing voor de wissel, stroomloos maken en signalering werken super.
Nu heb ik 1 vraag, de motor sturing (lok) werkt bijna. Via een andere arduino uno.
Detectie werkt via reed modules en signaleren goed, ook de test met losse magneten ging goed. Als de sensor geactiveerd wordt en ik de magneet weg haal, wordt de spanning 0 en na 4 seconden wordt de polariteit omgedraaid.
Maar met lok er op blijft hij boven het reed contact staan en stopt de trein keurig, maar rijd dan niet meer weg???? Ik dacht de code goed te hebben met aparte voids voor stop, foreward en return en deze ook goed verwerkt te hebben, maar blijkbaar klopt er ergens iets niet.
Ook als deze doorschiet komt hij weer over de reed schakelaar, en stopt dan dus weer, hoe zou ik hier het beste een vertraging oid in kunnen bouwen dat hij pas weer reageerd als een andere reed signaal gegeven heeft?
Kunnen jullie daar misschien hulp bij bieden?

MvG,

Maarten Tukker


Code: Alles selecteren
// reed

// 3 Afzonderlijke reed sensoren, input op  2, 3 en 4  en led output op 5, 6, 7 en motor control op 8, 9, 10
// Pendelbaan, 1 trein rijd heen en weer en rijd de andere kant op wanneer een reed contact gemaakt wordt. Deze registratie vind plaats via de DO van de reed module.
// Systeem werkt wanneer een reed geschakeld wordt en dan weer opend... maar als de lok er boven blijft staan en de reed dus continu geactiveerd wordt blijft het lokje staan
// en doet niks meer tot de reed onderbroken wordt en dat gaat het programma verder????

// set pin numbers:
const int reed[] =  {2, 3, 4};     // the number of the LDR pins
const int ledPin1 =  5;      // the number of ledPin block in
const int ledPin2 =  6;      // the number of ledPin block out
const int ledPin3 =  7;      // the number of ledPin block out

// connect motor controller pins to Arduino digital pins
int enA = 10;
int in1 = 9;
int in2 = 8;

// variables will change:
int reedState = 1;         // variable for reading the reed


void setup() {

  Serial.begin(9600);
  Serial.print("reed detectie en motor ");
 
  // set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);

  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
 
  int reedState = 0;

  for (int x = 0; x < 3; x++)
  {
    pinMode(reed[x], INPUT);
  }
}



void Foreward(){
 
      delay(2000);
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      analogWrite(enA, 110);
     
 
}
void Reverse(){
 
      delay(2000);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      analogWrite(enA, 130);
}
void OFF(){
 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  }


void loop() {
 
 
  // read the state of the reed value one by one (3 in total in this case):
  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);
       
    // check if the reed is activated.
   
    if (reedState == HIGH && reed[x] == 2) {    // x == 2 means the first reed in line at begin of track
      // turn  LED on:
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      // turn on motor direction 1
      OFF();
      Foreward();
     
   
      }

    if (reedState == HIGH && reed[x] == 3) {    // x == 3 means the second reed (at pin 3) in line at the end of track
      // turn  LED on:
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, LOW);
      // turn on motor direction 2
      OFF();
      Reverse();
     
     
      }
     
   
    if (reedState == HIGH && reed[x] == 4) {    // x == 3 means the second reed (at pin 3) in line at the end of track
      // turn  LED on:
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, HIGH);
      // turn on motor direction 2
      OFF();
      Reverse();
     
   
      }
   }
}
 
]

Advertisement

Gebruikers-avatar
Berichten: 110
Geregistreerd: 23 Dec 2011, 00:11
Woonplaats: Enschede

Re: pendelbaan

Berichtdoor bigred » 07 Feb 2019, 10:32

Code: Alles selecteren
for (int x = 0; x < 3; x++)
    reedState = digitalRead(reed[x]);

Je for loop gaat van 0 tot en met 2 en je inputs zijn 2 tot en met 4 hoe kan x in reed[x] dan ooit hoger dan 2 worden ?
Code: Alles selecteren
    if (reedState == HIGH && reed[x] == 2)
    if (reedState == HIGH && reed[x] == 3)
    if (reedState == HIGH && reed[x] == 4)

reed[x] kun je niet uitlezen, je wilt hier de waarde van x uitlezen.

Wat je kunt doen is je for loop aanpassen:
Code: Alles selecteren
for (int x = 2; x < 5; x++)
reedState = digitalRead(reed[x]);

Je if statements worden dan:
Code: Alles selecteren
    if (reedState == HIGH && x == 2)
    if (reedState == HIGH && x == 3)
    if (reedState == HIGH && x == 4)


Als dit werkt probeer dan ook je functie zo compleet mogelijk te houden:
Code: Alles selecteren
void Foreward(){
      OFF();
      delay(2000);
      // turn  LED on:
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      // turn on motor direction 1
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      analogWrite(enA, 110);
}

In de loop heb je dan alleen dit nodig:
Code: Alles selecteren
    if (reedState == HIGH && x == 2) Foreward();
 }


Dit maakt het veel makkelijk als je je programma ooit wilt uitbreiden en de kans op fouten is kleiner omdat bij het aanroepen van void Foreward je altijd eerst de motor uit zet en de controle leds goed zet.

Berichten: 32
Geregistreerd: 07 Okt 2016, 10:33

Re: pendelbaan

Berichtdoor maartentukker » 07 Feb 2019, 21:03

Ik heb de code aangepast, echter knipperen de LED's nu om beurten en doet de lok niks meer. Niet voor en niet achteruit...
Zodra ik de for statement weer terug zet naar 0 en 2 pakt hij en reageerd het programma op de signalering van de reed contacten. Maar alleen als de reed even geactiveerd is en de lok er weer af geschoven wordt (reed niet meer bediend) doorloopt hij het rij programma (vooruit en achteruit).

Ik heb 2 Reverse voids gemaakt omdat er 2 verschillende sporen zijn vanwaar de lok terug rijd, elk met een eigen reed contact en dus verschillende signaal lampen.
De hoofdloop is zo idd een stuk duidelijker.

Code: Alles selecteren
[code]
// reed

// 3 Afzonderlijke reed sensoren, input op  2, 3 en 4  en led output op 5, 6, 7 en motor control op 8, 9, 10
// Pendelbaan, 1 trein rijd heen en weer en rijd de andere kant op wanneer een reed contact gemaakt wordt. Deze registratie vind plaats via de DO van de reed module.
// Systeem werkt wanneer een reed geschakeld wordt en dan weer opend... maar als de lok er boven blijft staan en de reed dus continu geactiveerd wordt blijft het lokje staan
// en doet niks meer tot de reed onderbroken wordt en dat gaat het programma verder????

// set pin numbers:
const int reed[] =  {2, 3, 4};     // the number of the LDR pins
const int ledPin1 =  5;      // the number of ledPin block in
const int ledPin2 =  6;      // the number of ledPin block out
const int ledPin3 =  7;      // the number of ledPin block out

// connect motor controller pins to Arduino digital pins
int enA = 10;
int in1 = 9;
int in2 = 8;

// variables will change:
int reedState = 1;         // variable for reading the LDR status


void setup() {

  Serial.begin(9600);
  Serial.print("reed detectie en motor 4");

  // set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);

  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);

  int reedState = 0;

  for (int x = 2; x < 5; x++)
  {
    pinMode(reed[x], INPUT);
  }
}



void Foreward() {

  OFF();
  delay(2000);  //Tijd dat de lok stil blijft staan
  // turn occupation LED on:
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  // turn on motor direction 1
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 110);

}
void Reverse1() {

  OFF();
  delay(2000);
  // turn LED
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, LOW);
  // turn motor direction
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 130);
}

void Reverse2() {

  OFF();
  delay(2000);
  // turn LED
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);
  // turn motor direction
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 130);
}
void OFF() {

  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}


void loop() {


  // read the state of the reed value one by one (3 in total in this case):
  for (int x = 2; x < 5; x++)
  {
    reedState = digitalRead(reed[x]);

    // check if the reed is activated.
    // if it is, the reedtate is LOW.
    if (reedState == HIGH && x == 2) {
      Foreward();
    }
    if (reedState == HIGH && x == 3) {
      Reverse1();
    }
    if (reedState == HIGH && x == 4) {
      Reverse2();
    }
  }
}

[/code]

Berichten: 32
Geregistreerd: 07 Okt 2016, 10:33

Re: pendelbaan

Berichtdoor maartentukker » 07 Feb 2019, 21:10

De code lijn: If (reedState == HIGH && x == 2) Foreward(); } Pakt hij niet, lijkt erop dat Foreward tussen 2 {} moet staan. Deze lijn zou dan 3 x moeten, voor 2, 3 en 4 (maar dan nog met Reverse1() en 2).

Na de eerst } gaat deze weer naar de eerste void regel.

Of moet ik dan eerst nog wat anders schrijven?

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

Re: pendelbaan

Berichtdoor shooter » 08 Feb 2019, 22:47

en dat doet hij 1 miljoen keer per secopnde dus je zult er een beetje rustig aan moeten doen.
een pendelbaan bestaat eigenlijk uit 2 diodes die de lok aan het eind laten stoppen, en dan na een bepaalde tijd omdraaien.
Het kan zeker met reed kontakten. dan moet je wel weten welke richting het op gaat.
paul deelen
shooter@home.nl

Berichten: 32
Geregistreerd: 07 Okt 2016, 10:33

Re: pendelbaan

Berichtdoor maartentukker » 08 Feb 2019, 23:04

Dus ik zou dan met meer delay's moeten werken? En en een functie inbouwen die de richting bijhoud (= laatst geactiveerd reed contact). En deze reed weer laten meedoen nadat een andere geactiveerd is geweest.
Kan dat met een timer?

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

Re: pendelbaan

Berichtdoor shooter » 09 Feb 2019, 20:17

Zet er maar een delay in van 1 seconde elke keer dat is hoop ik voldoende
Je maakt een fout in de regel daar staat } en dat moet natuurlijk { zijn of {en hier meoten dan de instructies tussen staan.
}
zoek eens naar een cheat sheet voor arduino, heb ik nog steeds erbij liggen.
maak een stroomschema en geef de variabelen goede namen.
paul deelen
shooter@home.nl

Berichten: 32
Geregistreerd: 07 Okt 2016, 10:33

Re: pendelbaan

Berichtdoor maartentukker » 10 Feb 2019, 14:21

De code weer aangepast en het werkt, tenminste als de lok boven de reed stil komt te staan en deze geactiveerd blijft. Ik heb verschillende opties geprobeerd om de stand van de reed te "onthouden" als de lok er overheen rijd en deze dan niet meer geactiveerd is. Het is me alleen nog niet gelukt.
Het gekke is dat de LED's dan wel blijven branden.

Als het contact geactiveerd is stopt de lok en rijd na 2500 ms de andere kant op.

Hoe zou ik de HIGH kunnen vasthouden, terwijl deze niet meer geactiveerd wordt door de magneet, voor minimaal 2500 ms tot de lok weer rijd. Als deze eenmaal op weg is gaat het goed.

Code: Alles selecteren
[code]
// reed

// 3 Afzonderlijke reed sensoren, input op  2, 3 en 4  en led output op 5, 6, 7 en motor control op 8, 9, 10
// Pendelbaan, 1 trein rijd heen en weer en rijd de andere kant op wanneer een reed contact gemaakt wordt. Deze registratie vind plaats via de DO van de reed module.


// set pin numbers:
const int reed[] =  {2, 3, 4};     // the number of the reed pins
const int ledPin1 =  5;      // the number of ledPin block in
const int ledPin2 =  6;      // the number of ledPin block out
const int ledPin3 =  7;      // the number of ledPin block out

// connect motor controller pins to Arduino digital pins
int enA = 10;
int in1 = 9;
int in2 = 8;

// variables will change:
int reedState = 1;         // variable for reading the reed status

unsigned long interval = 2500;
unsigned long startTime;
byte lastPress;

void setup() {

  Serial.begin(9600);
  Serial.print("reed detectie en motor werkend 5");

  // set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);

  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);

  int reedState = 1;

  for (int x = 0; x < 3; x++)
  {
    pinMode(reed[x], INPUT);
  }
}

void loop() {



  // read the state of the reed status one by one (3 in total in this case):
  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);
    // check if the reed is activated.
    // if it is, the reedState is LOW.
    if (reedState == HIGH && reed[x] == 2) {    // x == 2 means the first LDR in line at begin of block

      // turn occupation LED on:
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      // turn on motor direction 1

      Foreward();
      delay(20);
    }

    if (reedState == HIGH && reed[x] == 3) {    // x == 3 means the second LDR (at pin 3) in line at the end of block

      // turn block free LED on:
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, LOW);
      // turn on motor direction 2

      Reverse1();
      delay(20);
    }


    if (reedState == HIGH && reed[x] == 4) {    // x == 3 means the second LDR (at pin 3) in line at the end of block

      // turn block free LED on:
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, HIGH);
      // turn on motor direction 2

      Reverse2();
      delay(20);
    }
  }
}


void Foreward() {

  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);

    byte pressedF = digitalRead(2);
    if (pressedF)
    {
      if (pressedF != lastPress)
      {
        OFF();
        startTime = millis();
      }
    }
    
   lastPress = pressedF;
      if (millis() - startTime >= interval)
      {
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        analogWrite(enA, 90);
        delay(50);
      
    }
  }
}
void Reverse1() {

  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);

    byte pressedR1 = digitalRead(3);
    if (pressedR1)
    {
      if (pressedR1 != lastPress)
      {
        OFF();
        startTime = millis();
      }
    }
     lastPress = pressedR1;
    
      if (millis() - startTime >= interval)
      {
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        analogWrite(enA, 90);
        delay(50);
      
    }
  }
}

void Reverse2() {

  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);

    byte pressedR2 = digitalRead(4);
    if (pressedR2)
    {
      if (pressedR2 != lastPress)
      {
        OFF();
        startTime = millis();
      }
    }
    lastPress = pressedR2;
    
      if (millis() - startTime >= interval)
      {
        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        analogWrite(enA, 110);
        delay(50);
       
    }
  }
}

void OFF() {

  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);

}











[/code]

Berichten: 32
Geregistreerd: 07 Okt 2016, 10:33

Re: pendelbaan

Berichtdoor maartentukker » 10 Feb 2019, 14:49

Geprobeerd om de waarde te onthouden, maar levert helaas niks op...



Code: Alles selecteren
[code]
// reed

// 3 Afzonderlijke reed sensoren, input op  2, 3 en 4  en led output op 5, 6, 7 en motor control op 8, 9, 10
// Pendelbaan, 1 trein rijd heen en weer en rijd de andere kant op wanneer een reed contact gemaakt wordt. Deze registratie vind plaats via de DO van de reed module.
// Systeem werkt wanneer een reed geschakeld wordt en dan weer opend... maar als de lok er boven blijft staan en de reed dus continu geactiveerd wordt blijft het lokje staan
// en doet niks meer tot de reed onderbroken wordt en dat gaat het programma verder????

// set pin numbers:
const int reed[] =  {2, 3, 4};     // the number of the LDR pins
const int ledPin1 =  5;      // the number of ledPin block in
const int ledPin2 =  6;      // the number of ledPin block out
const int ledPin3 =  7;      // the number of ledPin block out

// connect motor controller pins to Arduino digital pins
int enA = 10;
int in1 = 9;
int in2 = 8;

// variables will change:
int reedState = 1;         // variable for reading the LDR status

unsigned long interval = 2500;
unsigned long startTime;
byte lastPress;

boolean activeF, activeR1, activeR2;

void setup() {

  Serial.begin(9600);
  Serial.print("reed detectie en motor werkend 3");

  // set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);

  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);

  int reedState = 1;

  for (int x = 0; x < 3; x++)
  {
    pinMode(reed[x], INPUT);
  }
}

void loop() {



  // read the state of the LDR value one by one (2 in total in this case):
  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);
    // check if the LDR is activated.
    // if it is, the LDRState is LOW.
    if (reedState == HIGH && reed[x] == 2) {    // x == 2 means the first LDR in line at begin of block

      // turn occupation LED on:
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      // turn on motor direction 1

      Foreward();
      delay(20);
    }

    if (reedState == HIGH && reed[x] == 3) {    // x == 3 means the second LDR (at pin 3) in line at the end of block

      // turn block free LED on:
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, LOW);
      // turn on motor direction 2

      Reverse1();
      delay(20);
    }


    if (reedState == HIGH && reed[x] == 4) {    // x == 3 means the second LDR (at pin 3) in line at the end of block

      // turn block free LED on:
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, HIGH);
      // turn on motor direction 2

      Reverse2();
      delay(20);
    }
  }
}


void Foreward() {


  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);
    int c = digitalRead(reed[x]);
    if (c == 2) {
      activeF = true;
      activeR1 = false;
      activeR2 = false;
    }
    byte pressedF = digitalRead(2);
    if (pressedF)
    {
      if (pressedF != lastPress)
      {
        OFF();
        startTime = millis();
      }
    }

    lastPress = pressedF;
    if (millis() - startTime >= interval)
    {
      if (activeF || !activeF) {
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        analogWrite(enA, 90);
        delay(50);
      }
    }
  }
}

void Reverse1() {

  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);
    int c = digitalRead(reed[x]);
    if (c == 3) {
      activeF = false;
      activeR1 = true;
      activeR2 = false;
    }

    byte pressedR1 = digitalRead(3);
    if (pressedR1)
    {
      if (pressedR1 != lastPress)
      {
        OFF();
        startTime = millis();
      }
    }
    lastPress = pressedR1;

    if (millis() - startTime >= interval)
    {
      if (activeR1 || !activeR1);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      analogWrite(enA, 90);
      delay(50);

    }
  }
}

void Reverse2() {

  for (int x = 0; x < 3; x++)
  {
    reedState = digitalRead(reed[x]);
    int c = digitalRead(reed[x]);
    if (c == 4) {
      activeF = false;
      activeR1 = false;
      activeR2 = true;
    }

    byte pressedR2 = digitalRead(4);
    if (pressedR2)
    {
      if (pressedR2 != lastPress)
      {
        OFF();
        startTime = millis();
      }
    }
    lastPress = pressedR2;

    if (millis() - startTime >= interval)
    {
      if (activeR2 || !activeR2);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      analogWrite(enA, 110);
      delay(50);

    }
  }
}

void OFF() {

  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);

}











[/code]

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast