Stappenmotor blokkeert en maakt raar geluid

Op 17 maart 2020 21:53:47 schreef Lead Acid:
@TS Gebruik je een aparte voeding voor je arduino of een usb voeding, ik heb al meegemaakt dat de regelaar op het arduinobordje te weinig stroom levert, zeker als er nog een driver mee bestuurd wordt Ik kreeg toen allerlei abnormale stappen , behalve als mijn PC nog verbonden was met de usb van de arduino .

Ik voed mijn L298n met labovoeding (12V) en doormiddel van de 5V uitgang (op de L298n) wordt mijn Arduino gevoed. Hierdoor krijgt mijn Arduino dus spanning en hoeft hij niet verbonden te blijven met de USB-kabel.

je stuurt als de motor stilstaat zo'n 12V/ 1.6 Ohm = 7.5A door de motor. Dat is te veel. Kan zijn dat de L298 zoveel niet aankan en dat het minder wordt, maar het zal dan een gevecht worden tussen of de motor of de L298 het eerst kapot gaat.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Lambiek

Special Member

Op 18 maart 2020 08:32:06 schreef rew:
je stuurt als de motor stilstaat zo'n 12V/ 1.6 Ohm = 7.5A door de motor. Dat is te veel. Kan zijn dat de L298 zoveel niet aankan en dat het minder wordt, maar het zal dan een gevecht worden tussen of de motor of de L298 het eerst kapot gaat.

Precies, de driver mag maar 2A per kanaal doen. De enige manier om het heel te houden is de enable te combineren met pwm voor de stroom.

Als je haar maar goed zit, GROETEN LAMBIEK.

Op de voedingsklem ( het ronde stekkertje ) van een Arduino ( UNO ) hoort tussen de 7 en 12V te staan . De usb aansluiting kan ook gevoed worden , en die krijgt dan 5V .

De TS heeft al aangegeven dat hij een labvoeding gebruikt die begrensd is op 2.5A. Of dat fraai is, denk het niet.

en doormiddel van de 5V uitgang (op de L298n) wordt mijn Arduino gevoed.

Dat snap ik niet. Er is geen 5V uitgang op de L298.

Op 18 maart 2020 10:40:28 schreef floppy:
De TS heeft al aangegeven dat hij een labvoeding gebruikt die begrensd is op 2.5A. Of dat fraai is, denk het niet.
[...]
Dat snap ik niet. Er is geen 5V uitgang op de L298.

Mijn circuit trekt iets van 1,... ampère dus dit moet niet het probleem zijn.
Jawel, zie deze afbeelding. Rechts van de ground is er een 5V output.

Lambiek

Special Member

Op 18 maart 2020 11:41:29 schreef Pallieman:
Jawel, zie deze afbeelding. Rechts van de ground is er een 5V output

Dat moet ook gaan om je Arduino uit je driver te voeden.

Maar zit er nu al beweging in je stappenmotor of nog niet?

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 18 maart 2020 12:25:41 schreef Lambiek:
[...]
Dat moet ook gaan om je Arduino uit je driver te voeden.

Maar zit er nu al beweging in je stappenmotor of nog niet?

Ik voed mijn Arduino doormiddel van mijn driver.
Ja, de stappenmotor en DC-motor werken. Het probleem is dus nu nog dat de DC-motor heel kortstondig naar de andere kant beweegt. Dit nadat ik de drukknop heb ingedrukt om de stappenmotor te laten bewegen.

Lambiek

Special Member

Dat zal toch wel iets in de software zijn denk. Plaats je hele programma eens, misschien wil er iemand naar kijken om je daarna een hint te geven.

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 18 maart 2020 13:30:23 schreef Lambiek:
Dat zal toch wel iets in de software zijn denk. Plaats je hele programma eens, misschien wil er iemand naar kijken om je daarna een hint te geven.

Ja, vrees het ook. Ik denk persoonlijk dat het probleem is dat de Arduino geen twee dingen kan controleren (if-functie) waardoor dit probleem ontstaat.

Lambiek

Special Member

Op 18 maart 2020 13:42:05 schreef Pallieman:
Ik denk persoonlijk dat het probleem is dat de Arduino geen twee dingen kan controleren (if-functie) waardoor dit probleem ontstaat.

Nou, een controller kan heel veel dingen te gelijk hoor. :) Mits het programma goed opgebouwd is.

Ik stuur hier vier stappenmotoren tegelijk aan plus nog wat andere functies, geen enkel probleem.

Als je haar maar goed zit, GROETEN LAMBIEK.
Sangre

Golden Member

Yep, als je als beginner de voorbeelden 'Blink' en 'Blink without delay' met elkaar vergelijkt gaat er een wereld voor je open

Op 18 maart 2020 15:11:35 schreef Sangre:
Yep, als je als beginner de voorbeelden 'Blink' en 'Blink without delay' met elkaar vergelijkt gaat er een wereld voor je open

Idd, ga het eens proberen met het voorbeeld van "blink without delay". Moet wel even kijken hoe ik dat programma ga integreren voor het aansturen van mijn stepper.
Dit is mijn programma. Zou het voor problemen kunnen zorgen voor de Arduino? Ook wat mij opvalt is dat wanneer ik op drukknop druk mijn circuit iets boven de 5V trekt. Wanneer ik de joystick dan heen en weer beweeg trekt mijn circuit 12V waardoor men motor dus begint te "trippen". Hierna draait de motor wel zoals het moet.

code:


#include <Stepper.h>

const int stepsPerRevolution = 200;

Stepper stepper3(stepsPerRevolution, 8, 9, 10, 11);

int joyPin2 = A1;
int joyWaarde2 = 0;

int swPin2 = 3;
int drukknopWaarde2 = 0;


void setup() {
  pinMode(swPin2, INPUT);
  digitalWrite(swPin2, HIGH);
  stepper3.setSpeed(300);
  Serial.begin(9600);
}

void loop() {
  drukknopWaarde2 = digitalRead(swPin2);
  Serial.println(drukknopWaarde2);
  if (drukknopWaarde2 == LOW) {
    stepper3.step(200);
    delay(50);
    stepper3.step(-200);
  }
  else {
    joyWaarde2 = analogRead(joyPin2);
    Serial.println(joyWaarde2);
    if (joyWaarde2 >  535) {
      digitalWrite(12, HIGH);
      digitalWrite (13, LOW);
    }
    if (joyWaarde2 < 535 and joyWaarde2 > 485) {
      digitalWrite(12, LOW);
      digitalWrite (13, LOW);
    }

    if (joyWaarde2 < 485) {
      digitalWrite(12, LOW);
      digitalWrite (13, HIGH);
    }
  }
}
Shiptronic

Golden Member

kan je copy|paste doen en tussen [ code ] haken zetten?

{EDIT] thanks, stuk leesbaarder zo !

[Bericht gewijzigd door Shiptronic op 18 maart 2020 18:30:02 (27%)]

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Op 17 maart 2020 06:10:54 schreef rew:
Iedereen blijft richtlijnen "het is in het algemeen beter als...." verkondigen als absolute waarheden "je kan nooit....".

Onder omstandigheden kan je best een interrupt lang laten duren.

Rew jij weet nog veel meer van programmeren dan ik. Door je erfvaring weet je beter wat wel en niet kan. Ook moet je dan de hardware en werking van je cpu veel beter kennen en dan kan je ook veel beter inschatten wat je in een interrupt kan doen en of deze überhaupt wel nodig is.

TS is een beginnende programmeur en waarschijnlijk ook nauwelijks bekent met de werking van een CPU dan kan het in mijn ogen geen kwaat om wat ahrde begrenzingen op te stellen voor het gebruik van interrupts en dat later als meer kennis en ervaring er is dat je daar van kan en mag afwijken.

Nou, een controller kan heel veel dingen te gelijk hoor. :) Mits het programma goed opgebouwd is.

De meeste microcontrollers kunnen toch echt maar 1 ding tegelijk of je moet er 1 hebben met 2 of meerdere cpu cores.
De cpu in de arduino kan maar 1 instructie tegelijk uitvoeren mar doet dit zo snel dat je wel daardoor meerdere stappen motoren tegelijk kan aansturen. In werkelijkheid zit er dan tussen het aansturen van 2 stappenmoten slecht micro seconde. En dat geeft niets want een stappenmotor op volle snelheid is vergelijken met een microcontroller nog steeds langzaam.
Je moet je programma dan ook zo maken dat er maar 1 ding tegelijkertijd kan worden uitgevoerd. Je programma met gebruik van stappenmotoren het liefst geen delays bevat. I.p.v. delay kan je beter millis() gebruiken is wel een aantal extra regels code per keer maar zorgt ervoor dat je motoren niet schokkerig gaan draaien of je programma traag reageert op drukknoppen.

Zonder naar je programma gekeken te hebben had ik je al eerder advies gegeven op je programma eerst zo kaal mogelijk te maken en dan langzaam dingen toevoegen. Nu kunnen we je natuurlijk wel vertellen wat je moet veranderen maar daarvan leer je werkelijk niets. Je leert van je fouten. Ik maak in mijn programma's ook nog steeds veel fouten en leer dus nog steeds.
Als er fouten in je programma zitten is het altijd handig om eerst na te gaan wat er nu wel goed werkt dat is ook 1 van de redenen dat je met // of /* en */ regels en of hele blokken regels uit kan zetten. Als je eenmaal weer een goed werkende basis hebt dan ga je dus weer een regel aanzetten en kijken of het in die regel fout gaat.

Leuk programma heb je geschreven maar ik heb geen idee wat er gebeurt.
Er staan nergens comments bij. Ja het is voor jouw duidelijk wat swPin2 is maar ik heb geen idee.

En wat gebeurt er hier :

c code:

joyWaarde2 = analogRead(joyPin2);
    Serial.println(joyWaarde2);
    if (joyWaarde2 >  535) {
      digitalWrite(12, HIGH);
      digitalWrite (13, LOW);

En dan vooral wat gebeurt er op pin 12 en pin 13.
Waarom de waarde 535 wat is daar speciaal aan? Als dat precies het midden is van de joystick dan niet precies die waarde gebruiken maar bv 535 + x of 535 - X WQaarbij x dan 5 kan zijn maar dat moet je zelf even testen. Dit komt omdat 535 niet altijd precies het midden is maar bv kan variëren tussen 533 en 537 en door nu een offset van x toe toevoegen voorkom je dat de als joystick in het midden staat de motor toch vooruit en achteruit gaat

[Bericht gewijzigd door benleentje op 18 maart 2020 18:42:05 (29%)]

Op 18 maart 2020 18:38:00 schreef benleentje:
Leuk programma heb je geschreven maar ik heb geen idee wat er gebeurt.
Er staan nergens comments bij. Ja het is voor jouw duidelijk wat swPin2 is maar ik heb geen idee.

En wat gebeurt er hier :

c code:

joyWaarde2 = analogRead(joyPin2);
    Serial.println(joyWaarde2);
    if (joyWaarde2 >  535) {
      digitalWrite(12, HIGH);
      digitalWrite (13, LOW);

En dan vooral wat gebeurt er op pin 12 en pin 13.
Waarom de waarde 535 wat is daar speciaal aan? Als dat precies het midden is van de joystick dan niet precies die waarde gebruiken maar bv 535 + x of 535 - X WQaarbij x dan 5 kan zijn maar dat moet je zelf even testen. Dit komt omdat 535 niet altijd precies het midden is maar bv kan variëren tussen 533 en 537 en door nu een offset van x toe toevoegen voorkom je dat de als joystick in het midden staat de motor toch vooruit en achteruit gaat

swPin2 is de switchpin, dus de drukknop op joystick.
Op pin 12 en pin 13 wordt de motor aangestuurd. Groter dan 535 gaat de motor naar de ene kant en bij kleiner dan 485 gaat de motor naar de andere kant.

En dan precies welke motor? Wat is ene kant en wat de andere.
Zou je dat er in het vervolg bij willen schrijven zeker als je met een ander deelt is dat eigenlijk noodzakelijk. Als je zaken helder formuleert help dat later enorm bij fout zoeken. Je mag zelf kiezen in welke taal je dat schrijft Engels heeft daarbij wel de voorkeur maar is niet perse verplicht.

Het is nog handiger en ook voor jezelf om pin 12 en 13 te declareren zodat de functie overal in het programma duidelijk is. dus 12 kan zijn MotAen1 en 13 MotAen2 maar mag ook zijn freesmotor_en1

IK zou ook de getallen 485 en 535 declaren met heldere omschrijving als je dan later wil aanpassen hoef je enkele de variabele van waarde te veranderen. Met declareren bedoel ik dan const int of const byte.

c code:

joyWaarde2 = analogRead(joyPin2);
    Serial.println(joyWaarde2);
    if (joyWaarde2 >  535) {   //Joystick naar voren is motor vooruit
      digitalWrite(12, HIGH);
      digitalWrite (13, LOW);

Ik zou ook de getallen 485 en 535 declaren met heldere omschrijving als je dan later wil aanpassen hoef je enkele de variabele van waarde te veranderen. Met declareren bedoel ik dan const int of const byte.
Constanten worden na het compileren van het programma vervangen door de waarde en nemen dan in de microcontroller geen variabele(geheugen plaatsen) in beslag

c code:


Stepper stepper3(stepsPerRevolution, 8, 9, 10, 11);  //aansturen van stappenmotor via LM298

const int joyPin2 = A1;    // Analoge poort voor inlezen Joystick waarde 500 = midden
int joyWaarde2 = 0;         // Analoge Joystick ingelezen waarde 500 = midden

const int swPin2 = 3;
int drukknopWaarde2 = 0;
buckfast_beekeeper

Golden Member

c code:

if (joyWaarde2 >  535) {
      digitalWrite(12, HIGH);
      digitalWrite (13, LOW);
    }
    if (joyWaarde2 < 535 and joyWaarde2 > 485) {
      digitalWrite(12, LOW);
      digitalWrite (13, LOW);
    }

    if (joyWaarde2 < 485) {
      digitalWrite(12, LOW);
      digitalWrite (13, HIGH);
    }

Hier laat je de controller 3 keer een if uitvoeren en dan nog 1 met een and er in. Dit duurt allemaal iets langer dan

c code:

If(waarde > 535){
    doe iets
}
else if(waarde < 485){
    doe iets anders
}
else{
    doe weer wat anders
}

Wat doet het programma als de waarde 535 of 485 is. Daar al bij stil gestaan? Ook dat wordt opgevangen door bovenstaande code. Ipv 4 keer een vergelijking te maken schieten er nu nog 2 over.

Van Lambiek wordt goede geuze gemaakt.