Elektromotor en arduino mega
6 berichten
• Pagina 1 van 1
Elektromotor en arduino mega
Allen,
voor een project wil ik een elektromotor aansturen met mijn arduino mega. Hiervoor gebruik ik een VMA03 van velleman.
De motor dient zowel links als rechts te draaien en de eindstoppen worden aangegeven door 2 drukknoppen. Het starten van de motor gebeurd door een touchsensor (TTP223B). Het draaien lukt me wel maar met mijn code dien ik de touch 4 seconden lang te bedienen vooraleer deze signaal geeft. De volledige motor beweging van links ==> rechts en omgekeerd neemt ook ±4 seconden in beslag.
Kan ik mijn code aanpassen dat ik de touch maar een seconde dien te bedienen en dat dan de motor al begint te draaien?
Nog een probleem is dat de motor geen rem heeft. De motor duwt dus nog enige tijd tegen de drukknop vooraleer deze stilstaat. Kan ik programmatisch het uitlopen van de motor tegen gaan?
Code:
voor een project wil ik een elektromotor aansturen met mijn arduino mega. Hiervoor gebruik ik een VMA03 van velleman.
De motor dient zowel links als rechts te draaien en de eindstoppen worden aangegeven door 2 drukknoppen. Het starten van de motor gebeurd door een touchsensor (TTP223B). Het draaien lukt me wel maar met mijn code dien ik de touch 4 seconden lang te bedienen vooraleer deze signaal geeft. De volledige motor beweging van links ==> rechts en omgekeerd neemt ook ±4 seconden in beslag.
Kan ik mijn code aanpassen dat ik de touch maar een seconde dien te bedienen en dat dan de motor al begint te draaien?
Nog een probleem is dat de motor geen rem heeft. De motor duwt dus nog enige tijd tegen de drukknop vooraleer deze stilstaat. Kan ik programmatisch het uitlopen van de motor tegen gaan?
Code:
- Code: Alles selecteren
#define ctsPin 7 // Pin for capactive touch sensor
#define eindstop1 8
#define eindstop2 9
int pwm_a = 3; //PWM control for motor outputs 1 and 2
int dir_a = 2; //direction control for motor outputs 1 and 2
void setup() {
pinMode(ctsPin, INPUT);
pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
pinMode(dir_a, OUTPUT);
pinMode(eindstop1, INPUT);
pinMode(eindstop2, INPUT);
}
void loop() {
int ctsValue = digitalRead(ctsPin);
int toetsWaarde1 = digitalRead(eindstop1);
int toetsWaarde2 = digitalRead(eindstop2);
if (toetsWaarde1 == LOW && toetsWaarde2 == LOW) {
digitalWrite (dir_a, HIGH);
analogWrite(pwm_a, 150);
} else {
analogWrite(pwm_a, 0);
delay(4000);
}
if (toetsWaarde1 == LOW && toetsWaarde2 == HIGH && ctsValue == HIGH) {
digitalWrite (dir_a, LOW);
analogWrite(pwm_a, 100);
delay(4000);
}
if (toetsWaarde1 == HIGH && toetsWaarde2 == LOW && ctsValue == HIGH) {
digitalWrite (dir_a, HIGH);
analogWrite(pwm_a, 100);
delay(4000);
}
}
Advertisement
Re: Elektromotor en arduino mega
in je schets werk je met delays, tijdens een delay kan de arduino niks anders doen, omdat die aan het wachten is totdat de delay afgelopen is.
wil je dit oplossen dan zal je je schets om moeten gooien.
kijk eens naar
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
wil je dit oplossen dan zal je je schets om moeten gooien.
kijk eens naar
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Met vriendelijke groet Arjan
Re: Elektromotor en arduino mega
Ik heb deze vraag inderdaad ook op een ander forum geplaatst. Indien dit niet gewenst is zal ik hier zeker rekening mee houden in het vervolg. Mijn excuses daarvoor.
Zoals gereageerd is heb ik de "blink without delay" bekeken en proberen toe te passen. Dit heb ik proberen toe te passen op een klein stuk code om het in het begin wat makkelijker te maken. Namelijk op het deel dat als geen van de 2 eindstoppen bediend zijn, de motor een richting dient uit te draaien totdat de eindstop wel bedient is.
Indien ik het toepas en de code upload draait de motor wel richting de einstop maar indien deze de eindstop bedient is blijft de motor maar draaien. Hij stopt helemaal niet meer. Hieronder zal ik de code eens plaatsen.
De millis wil ik niet gebruiken als tijdsinterval. Ik wil de millis alleen gebruiken om de motorsturing te combineren met andere delen van het programma. Het grootste probleem met de delays was dat als ik deze instel op 1000 ms, en ik de motor laat draaien door de touchsensor terwijl een eindstop bediend is, de motor maar een seconde draait en dan terug valt naar het scenario dat er geen enkele einstop bediend is. Terwijl de motor dient te draaien tot de andere eindstop bedient is. De functie dat de motor draait naar een einstop als geen van beide eindstoppen bedient zijn is maar een functie die ik erin heb gezet voor als de stroom een keer uitvalt zodat de motor vanzelf terug naar start positie gaat.
Maar nu leg ik het moeiijk uit volgens mij, hopelijk valt het een beetje af te leiden uit mijn code.
Alle hulp om millis werkende te krijgen is nog steeds welkom.
Zoals gereageerd is heb ik de "blink without delay" bekeken en proberen toe te passen. Dit heb ik proberen toe te passen op een klein stuk code om het in het begin wat makkelijker te maken. Namelijk op het deel dat als geen van de 2 eindstoppen bediend zijn, de motor een richting dient uit te draaien totdat de eindstop wel bedient is.
Indien ik het toepas en de code upload draait de motor wel richting de einstop maar indien deze de eindstop bedient is blijft de motor maar draaien. Hij stopt helemaal niet meer. Hieronder zal ik de code eens plaatsen.
- Code: Alles selecteren
const int ctsPin = 7; // Pin for capactive touch
const int eindstop1 = 8;
const int eindstop2 = 9;
const int pwm_a = 3; //PWM control for motor outputs 1 and 2
const int dir_a = 2; //direction control for motor outputs 1 and 2
int ctsValue = digitalRead(ctsPin);
int toetsWaarde1 = digitalRead(eindstop1);
int toetsWaarde2 = digitalRead(eindstop2);
unsigned long previousMillis = 0;
const long interval = 1000;
void setup() {
pinMode(ctsPin, INPUT);
pinMode(pwm_a, OUTPUT); //Set control pins to be outputs
pinMode(dir_a, OUTPUT);
pinMode(eindstop1, INPUT);
pinMode(eindstop2, INPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (toetsWaarde1 == LOW && toetsWaarde2 == LOW) {
digitalWrite (dir_a, HIGH);
analogWrite(pwm_a, 150);
} else {
analogWrite(pwm_a, 0);
}
}
//if (toetsWaarde1 == LOW && toetsWaarde2 == HIGH && ctsValue == HIGH) {
//digitalWrite (dir_a, LOW);
//analogWrite(pwm_a, 100);
//delay(4000);
//}
//if (toetsWaarde1 == HIGH && toetsWaarde2 == LOW && ctsValue == HIGH) {
//digitalWrite (dir_a, HIGH);
//analogWrite(pwm_a, 100);
//delay(4000);
//}
}
De millis wil ik niet gebruiken als tijdsinterval. Ik wil de millis alleen gebruiken om de motorsturing te combineren met andere delen van het programma. Het grootste probleem met de delays was dat als ik deze instel op 1000 ms, en ik de motor laat draaien door de touchsensor terwijl een eindstop bediend is, de motor maar een seconde draait en dan terug valt naar het scenario dat er geen enkele einstop bediend is. Terwijl de motor dient te draaien tot de andere eindstop bedient is. De functie dat de motor draait naar een einstop als geen van beide eindstoppen bedient zijn is maar een functie die ik erin heb gezet voor als de stroom een keer uitvalt zodat de motor vanzelf terug naar start positie gaat.
Maar nu leg ik het moeiijk uit volgens mij, hopelijk valt het een beetje af te leiden uit mijn code.
Alle hulp om millis werkende te krijgen is nog steeds welkom.
Re: Elektromotor en arduino mega
op dit moment lees je alleen tijdens de setup je toetswaarde in.
Tijdens je loop doe je dat niet. daardoor werken de eindstops niet
Tijdens je loop doe je dat niet. daardoor werken de eindstops niet
Met vriendelijke groet Arjan
Re: Elektromotor en arduino mega
Je mag gerust aan anderen om hulp vragen. Ik weet echter niet op welk forum ik zal antwoorden en nu proberen verschillende mensen je te helpen terwijl ze dat van elkaar niet weten. Het mooie van een forum is dat iedereen de antwoorden van iemand anders kan lezen en dat kan corrigeren of aanvullen.
Zoals baco1978 schreef zul je functie digitalRead() in de loop() moeten gebruiken. Er is geen andere manier om in de loop() te weten te komen of de eindschakelaar contact maakt.
Om iets 4 seconden lang te doen, is er een iets andere manier van millis nodig.
https://gist.github.com/Koepel/01a6088f321eef5ec62f0b470c97a01e
Let op dat het starten en stoppen los van elkaar gebeurt. Bij het starten worden twee variabelen gebruiken ('previousMillis' en 'enabled', en met die twee variabelen wordt het afgehandeld.
Zoals baco1978 schreef zul je functie digitalRead() in de loop() moeten gebruiken. Er is geen andere manier om in de loop() te weten te komen of de eindschakelaar contact maakt.
Om iets 4 seconden lang te doen, is er een iets andere manier van millis nodig.
https://gist.github.com/Koepel/01a6088f321eef5ec62f0b470c97a01e
Let op dat het starten en stoppen los van elkaar gebeurt. Bij het starten worden twee variabelen gebruiken ('previousMillis' en 'enabled', en met die twee variabelen wordt het afgehandeld.
6 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 26 gasten