Elektromotor en arduino mega

Arduino specifieke Software
Berichten: 15
Geregistreerd: 03 Mei 2017, 15:58

Elektromotor en arduino mega

Berichtdoor Papui » 19 Mei 2018, 13:41

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:

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

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Elektromotor en arduino mega

Berichtdoor baco1978 » 19 Mei 2018, 22:38

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
Met vriendelijke groet Arjan

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Elektromotor en arduino mega

Berichtdoor Koepel » 20 Mei 2018, 00:11


Berichten: 15
Geregistreerd: 03 Mei 2017, 15:58

Re: Elektromotor en arduino mega

Berichtdoor Papui » 22 Mei 2018, 14:23

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.

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.

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Elektromotor en arduino mega

Berichtdoor baco1978 » 22 Mei 2018, 23:56

op dit moment lees je alleen tijdens de setup je toetswaarde in.

Tijdens je loop doe je dat niet. daardoor werken de eindstops niet
Met vriendelijke groet Arjan

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Elektromotor en arduino mega

Berichtdoor Koepel » 23 Mei 2018, 09:50

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.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 22 gasten