Eindschakelaars werken niet

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 48
Geregistreerd: 05 Apr 2018, 00:44

Eindschakelaars werken niet

Berichtdoor Gompy » 09 Mei 2018, 19:17

Ik probeer al wat dagen mijn eindschakelaars aan de praat te krijgen, maar tot op heden is het me niet gelukt met de onderstaande code.
Wie kan me zeggen waar ik de mist in ga ?

De loopmoeren moeten aan het eind van de spindel tegen de eindschakelaars lopen waardoor de motoren moeten stoppen.
Moduul is een L298N welke de motoren sturen, alleen aan/uit en geen PWM.

BTW, de eindschakelaars maken naar massa als de loopmoer er tegenaan loopt.

Code: Alles selecteren
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

// motor azimuth adjustment
int enA = 7;
int in1 = 8;
int in2 = 9;
// motor elevation adjustment
int enB = 12;
int in3 = 10;
int in4 = 11;

void setup()
{
// lcd.init(); // initialize the lcd
// lcd.backlight();
 
 Serial.begin(9600); // initialize the serial port

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

// set end switches
 pinMode(3, INPUT_PULLUP); // end switch up
 pinMode(4, INPUT_PULLUP); // end switch down
 pinMode(5, INPUT_PULLUP); // end switch left
 pinMode(6, INPUT_PULLUP); // end switch right

}
void loop()
{
// LIGHT SENSORS
 int tr = analogRead(0); // LDR top right / brown
 int br = analogRead(1); // LDR bottom right / green
 int tl = analogRead(2); // LDR top left / yellow
 int bl = analogRead(3); // LDR bottom left / orange
 
// control delay time in milliseconds of LIGHT SENSOR readings
 int delaytime = analogRead(A7)*2;
// set range of tolerance between LIGHT SENSOR readings - Arduino LED indicate time
 int tolerance = analogRead(A6)/4;

//print LIGHT SENSOR values to serial monitor for debugging
 Serial.println(tl);
 Serial.println(bl);
 Serial.println(tr);
 Serial.println(bl);
 
 Serial.println(delaytime);
 Serial.println(tolerance);
 Serial.println();

 int count = 0; //start millisecond count of LIGHT SENSOR readings
 count++; //incremental count increase, continues to show LIGHT SENSOR results

 int avt = (tr + tl) / 2; // average value top
 int avd = (bl + br) / 2; // average value down
 int avl = (tl + bl) / 2; // average value left
 int avr = (tr + br) / 2; // average value right
 
 int dv = avt - avd; // average difference of top and bottom LIGHT SENSORS
 int dh = avl - avr;// average difference of left and right LIGHT SENSORS

 if (-1*tolerance > dv || dv > tolerance) // check if the difference in top/bottom LIGHT SENSORS is greater than tolerance
{
 if (avt > avd) // if average LIGHT SENSOR values on top side are greater than on bottom side then elevation motor rotates CLOCKWISE
  {

// set motor Elevation enable
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  digitalWrite(enB, HIGH);
  Serial.println("ELEVATION MOTOR MOVES CLOCKWISE");
  Serial.println("   ");

// end switch is grounded
  if (digitalRead(3) == LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  Serial.print("ELEVATION MOTOR END SWITCH UP");
  Serial.println("   ");
 
  }
  else // if average LIGHT SENSOR values on bottom side are greater than on top side then elevation motor rotates COUNTERCLOCKWISE
  {

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  digitalWrite(enB, HIGH);
  Serial.println("ELEVATION MOTOR MOVES COUNTERCLOCKWISE");
  Serial.println("   ");

// if end switch is grounded
  if (digitalRead(4) == LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  Serial.print("ELEVATION MOTOR END SWITCH DOWN");
  Serial.println("   ");

  }
}
  else if (-1*tolerance < dv || dv < tolerance) // if difference is smaller than tolerance, STOP elevation motor
  {
  digitalWrite(enB, LOW);
  Serial.println("ELEVATION MOTOR STOPS");
  Serial.println("   ");
  }

 if (-1*tolerance > dh || dh > tolerance) // check if the difference in left and right LIGHT SENSORS is within tolerance range
{
 if (avl > avr) // if average LIGHT SENSOR values on left side are greater than right side, azimuth motor rotates CLOCKWISE
  {

// set motor Azimuth enable
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(enA, HIGH);
  Serial.println("AZIMUTH MOTOR MOVES CLOCKWISE");
  Serial.println("   ");

// end switch is grounded
  if (digitalRead(5) == LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  Serial.print("AZIMUTH MOTOR END SWITCH LEFT");
  Serial.println("   ");

  }
  else // if average LIGHT SENSOR values on right side are greater than on left side, azimuth motor rotates COUNTERCLOCKWISE
  {

  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(enA, HIGH);
  Serial.println("AZIMUTH MOTOR MOVES COUNTERCLOCKWISE");
  Serial.println("   ");

// end switch is grounded
  if (digitalRead(6) == LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  Serial.print("AZIMUTH MOTOR END SWITCH RIGHT");
  Serial.println("   ");
  }
}
  else if (-1*tolerance < dh || dh < tolerance) //if difference is smaller than tolerance, STOP azimuth motor
  {
  digitalWrite(enA, LOW);
  Serial.println("AZIMUTH MOTOR STOPS");
  Serial.println("   ");
  }
  delay(delaytime);
}


Mvg, Rob

Advertisement

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

Re: Eindschakelaars werken niet

Berichtdoor shooter » 09 Mei 2018, 22:37

maak eerst eens een paar functies aan, zodat het allemaal wat overzichtelijker word.
bijvoorbeeld beweging horizontaal en beweging verticaal

in de horizontale beweging krijg je dan links en rechts
dus dan word het:
if vrijgave links en wens links dan beweging links.
if vrijgave rechts en wens rechts dan beweging rechts
het venijn zit hem in dat EN, dat zit er bij jou niet in.
veiliger is het overigens als je een paar diodes gebruikt om de beweging te stoppen. dan is de veiliging in de hardware en niet in de software.
paul deelen
shooter@home.nl

Berichten: 48
Geregistreerd: 05 Apr 2018, 00:44

Re: Eindschakelaars werken niet

Berichtdoor Gompy » 09 Mei 2018, 23:14

De diodes snap ik niet helemaal, ik kan moeilijk de motor voeding uitschakelen want dan kan hij ook niet meer de andere kant op draaien.

Het schema maakt het misschien al wat duidelijker.
A en B zijn de motoren met spindel en dat blokje in het midden is de loopmoer welke van links naar rechts gaat en visaversa.

In de code heb ik ook eea veranderd, ik zie de schakelaars laag worden maar nog geen reactie op de motoren zelf.
Ik heb er even een // voor gezet omdat ik liever deel voor deel doe zodat ik ook kan begrijpen wat ik doe.
solarpanel-motor.jpg
solarpanel-motor.jpg (30.75 KiB) 165 keer bekeken


Code: Alles selecteren
// motor azimuth adjustment
int enA = 7;
int in1 = 8;
int in2 = 9;
// motor elevation adjustment
int enB = 12;
int in3 = 10;
int in4 = 11;

void setup()
{
 
 Serial.begin(9600); // initialize the serial port

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

// set end switches
 pinMode(3, INPUT_PULLUP); // end switch up
 pinMode(4, INPUT_PULLUP); // end switch down
 pinMode(5, INPUT_PULLUP); // end switch left
 pinMode(6, INPUT_PULLUP); // end switch right

}
void loop()
{
// LIGHT SENSORS
 int tr = analogRead(0); // LDR top right / brown
 int br = analogRead(1); // LDR bottom right / green
 int tl = analogRead(2); // LDR top left / yellow
 int bl = analogRead(3); // LDR bottom left / orange

// END SWICHES
 int switch1 = digitalRead(3);
 int switch2 = digitalRead(4);
 int switch3 = digitalRead(5);
 int switch4 = digitalRead(6);
 
// control delay time in milliseconds of LIGHT SENSOR readings
 int delaytime = analogRead(A7)*2;
// set range of tolerance between LIGHT SENSOR readings - Arduino LED indicate time
 int tolerance = analogRead(A6)/4;

//print LIGHT SENSOR values to serial monitor for debugging
 Serial.println(tl);
 Serial.println(bl);
 Serial.println(tr);
 Serial.println(bl);
 
 Serial.println(delaytime);
 Serial.println(tolerance);

 Serial.print(switch1);
 Serial.print(switch2);
 Serial.print(switch3);
 Serial.print(switch4);

 Serial.println();

 int count = 0; //start millisecond count of LIGHT SENSOR readings
 count++; //incremental count increase, continues to show LIGHT SENSOR results

 int avt = (tr + tl) / 2; // average value top
 int avd = (bl + br) / 2; // average value down
 int avl = (tl + bl) / 2; // average value left
 int avr = (tr + br) / 2; // average value right
 
 int dv = avt - avd; // average difference of top and bottom LIGHT SENSORS
 int dh = avl - avr;// average difference of left and right LIGHT SENSORS

 if (-1*tolerance > dv || dv > tolerance) // check if the difference in top/bottom LIGHT SENSORS is greater than tolerance
{
 if (avt > avd) // if average LIGHT SENSOR values on top side are greater than on bottom side then elevation motor rotates CLOCKWISE
  {

// set motor Elevation enable
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  digitalWrite(enB, HIGH);
  Serial.println("ELEVATION MOTOR MOVES CLOCKWISE");
  Serial.println("   ");

// end switch is grounded
//  if (switch1 == LOW);
//  digitalWrite(in3, LOW);
//  digitalWrite(in4, LOW);
//  Serial.println("ELEVATION MOTOR END SWITCH UP");
//  Serial.println("   ");
 
  }
  else // if average LIGHT SENSOR values on bottom side are greater than on top side then elevation motor rotates COUNTERCLOCKWISE
  {

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  digitalWrite(enB, HIGH);
  Serial.println("ELEVATION MOTOR MOVES COUNTERCLOCKWISE");
  Serial.println("   ");

// if end switch is grounded
//  if (switch2 == LOW);
//  digitalWrite(in3, LOW);
//  digitalWrite(in4, LOW);
//  Serial.println("ELEVATION MOTOR END SWITCH DOWN");
//  Serial.println("   ");

  }
}
  else if (-1*tolerance < dv || dv < tolerance) // if difference is smaller than tolerance, STOP elevation motor
  {
  digitalWrite(enB, LOW);
  Serial.println("ELEVATION MOTOR STOPS");
  Serial.println("   ");
  }

 if (-1*tolerance > dh || dh > tolerance) // check if the difference in left and right LIGHT SENSORS is within tolerance range
{
 if (avl > avr) // if average LIGHT SENSOR values on left side are greater than right side, azimuth motor rotates CLOCKWISE
  {

// set motor Azimuth enable
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(enA, HIGH);
  Serial.println("AZIMUTH MOTOR MOVES CLOCKWISE");
  Serial.println("   ");

// end switch is grounded
//  if (switch3 == LOW);
//  digitalWrite(in3, LOW);
//  digitalWrite(in4, LOW);
//  Serial.println("AZIMUTH MOTOR END SWITCH LEFT");
//  Serial.println("   ");

  }
  else // if average LIGHT SENSOR values on right side are greater than on left side, azimuth motor rotates COUNTERCLOCKWISE
  {

  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(enA, HIGH);
  Serial.println("AZIMUTH MOTOR MOVES COUNTERCLOCKWISE");
  Serial.println("   ");

// end switch is grounded
//  if (switch4 == LOW);
//  digitalWrite(in3, LOW);
//  digitalWrite(in4, LOW);
//  Serial.println("AZIMUTH MOTOR END SWITCH RIGHT");
//  Serial.println("   ");
  }
}
  else if (-1*tolerance < dh || dh < tolerance) //if difference is smaller than tolerance, STOP azimuth motor
  {
  digitalWrite(enA, LOW);
  Serial.println("AZIMUTH MOTOR STOPS");
  Serial.println("   ");
  }
  delay(delaytime);
}

Berichten: 35
Geregistreerd: 22 Jan 2013, 16:40

Re: Eindschakelaars werken niet

Berichtdoor zuid » 10 Mei 2018, 09:03

Code is lastig te lezen zo.
Geen oplossing voor het probleem maar ... in de "void loop" is opgenomen:
Code: Alles selecteren
int count = 0; //start millisecond count of LIGHT SENSOR readings
 count++; //incremental count increase, continues to show LIGHT SENSOR results

Count blijft denk ik hierdoor altijd 1.

Vraagje: Stopt de motor wel als hij op het juiste punt is aangekomen?

Ik heb een beetje probleem met de "if" in deze "else" gaan de "||"wel goed?
if (-1*tolerance > dv || dv > tolerance) // check if the difference in top/bottom LIGHT SENSORS is greater than tolerance
.....
else if (-1*tolerance < dv || dv < tolerance) // if difference is smaller than tolerance, STOP elevation motor

Berichten: 48
Geregistreerd: 05 Apr 2018, 00:44

Re: Eindschakelaars werken niet

Berichtdoor Gompy » 10 Mei 2018, 11:39

Als ik de eindschakelaars even weg denk dan werkt de installatie perfect, mijn "probleem" zijn alleen de eindafslagen.
Nu kunnen de loopmoeren tegen de eindstukken aanlopen waardoor telkens mijn zekeringen eruit flippen.

@shooter
Om nog even terug te komen op het gebruik van dioden, dat worden behoorlijk eindschakelaars.
De stroom van de motoren wordt telkens met de schakelaars verbroken en dat gebeurd heel langzaam door de overbrenging.
De motoren draaien ~1 omwenteling per seconden en de loopmoeren verschuiven ~1,25 mm per seconden.
De eindschakelaars worden dus heel langzaam bedient waardoor ik behoorlijke langzaam het contact open en sluit en vonken kan/ga trekken in de schakelaars.

Ik neem tenminste aan dat je dit soort schakeling bedoelt.
Bijlagen
Motor sturing met eindschakelaars 1.jpg
Motor sturing met eindschakelaars 1.jpg (14.85 KiB) 135 keer bekeken

Berichten: 35
Geregistreerd: 22 Jan 2013, 16:40

Re: Eindschakelaars werken niet

Berichtdoor zuid » 10 Mei 2018, 12:21

Als de motor tegen de eindschakelaar staat zet je hem eerst aan en daarna vraag de eindschakelaar af om de motor weer uit te zetten.
Wellicht is omdraaien een optie.

Berichten: 48
Geregistreerd: 05 Apr 2018, 00:44

Re: Eindschakelaars werken niet

Berichtdoor Gompy » 10 Mei 2018, 12:31

Ik heb eea omgedraaid en de compiler loopt er doorheen.

Code: Alles selecteren
// end switch is grounded

if (switch1 == LOW);
{
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  Serial.println("ELEVATION MOTOR END SWITCH UP");
  Serial.println("   ");
}
  }
else if (switch1 == HIGH); // set motor Elevation enable
{
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  digitalWrite(enB, HIGH);
  Serial.println("ELEVATION MOTOR MOVES CLOCKWISE");
  Serial.println("   ");
}
  } 

Berichten: 35
Geregistreerd: 22 Jan 2013, 16:40

Re: Eindschakelaars werken niet

Berichtdoor zuid » 10 Mei 2018, 13:07

Bedoel je "het werkt niet" ?

Nog een optie.

Na de eind switch moet er nog enige ruimte zijn voor de motor om door te draaien.
De eind switch kan bereikt worden vlak voor de "delay(delaytime);"
Dan staat de motor dus nog tenminste deze tijd tegen de eindstop aan.

PS:
Waarom in een "else" een tegenovergestelde "if" ?
Conditie geen LOW dan toch altijd HIGH.

Berichten: 48
Geregistreerd: 05 Apr 2018, 00:44

Re: Eindschakelaars werken niet

Berichtdoor Gompy » 10 Mei 2018, 13:18

Ik ben al wat ouder en nog maar een beginner met deze materie, het is voor mij allemaal nieuw.
Dit heb ik vroeger (~50 jaar) nooit op school geleerd, dus ik sta nog in de babyschoenen met mijn kennis ivm jullie.
Wat ik nu leer haal ik van internet (Arduino), maar soms snap ik het niet en loop dan vast.
Het zal vast makkelijk gaan als ik eenmaal de werking van de commando's ken, wat ze doen en weet te gebruiken.

Berichten: 35
Geregistreerd: 22 Jan 2013, 16:40

Re: Eindschakelaars werken niet

Berichtdoor zuid » 10 Mei 2018, 13:37

Waarom stop je bij de eind switch door de draairichting op "onbepaald" te zetten
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);.

en als je het juiste punt bereikt hebt door de motor uit te zetten?
digitalWrite(enB, LOW);

Zo oud als ik? (70+)
Motoren is niet mijn specialiteit hoor, ik vind dit gewoon een leuk project.
Electronica is voor mij het moeilijke deel van een project.
Het software deel heb ik weer minder moeite mee.
Mijn vragen en opmerkingen zijn meer bedoelt om te snappen waarom en hoe het werkt.

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast