Eindschakelaars werken niet
13 berichten
• Pagina 1 van 2 • 1, 2
Eindschakelaars werken niet
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.
Mvg, Rob
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
Re: Eindschakelaars werken niet
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.
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
shooter@home.nl
Re: Eindschakelaars werken niet
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.
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.
- 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);
}
Re: Eindschakelaars werken niet
Code is lastig te lezen zo.
Geen oplossing voor het probleem maar ... in de "void loop" is opgenomen:
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
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
Re: Eindschakelaars werken niet
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.
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 (14.85 KiB) 6975 keer bekeken
Re: Eindschakelaars werken niet
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.
Wellicht is omdraaien een optie.
Re: Eindschakelaars werken niet
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(" ");
}
}
Re: Eindschakelaars werken niet
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.
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.
Re: Eindschakelaars werken niet
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.
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.
Re: Eindschakelaars werken niet
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.
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.
13 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 22 gasten