Probleem met DC-motor door joystick

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Pallieman072
  • Registratie: Maart 2020
  • Laatst online: 22-06-2020
Goedenavond,

Ik ben bezig met een project waarbij ik doormiddel van een joystick een DC-motor en stappenmotor aanstuur. Als ik de joystick naar links beweeg, zal de DC-motor in wijzerzin bewegen (joystick naar rechts in tegenwijzerzin draaien). Van zodra ik op de drukknop (geïntegreerd op de joystick) druk, beweegt mijn stappenmotor heel snel 90 graden in wijzerzin en terug in tegenwijzerzin (terug in startpositie). Echter wanneer ik dan de joystick opnieuw wil bewegen om de DC-motor te bewegen gebeurt er iets vreemds. De DC-motor reageert niet meteen omdat het eerst een heel klein stukje in tegenwijzerin beweegt. Nadien werkt de DC-motor weer perfect. Wat mij opvalt is dat van zodra ik op de drukknop druk, de spanning daalt van 12V naar 5V en wanneer ik de joystick weer beweeg (DC-motor activeren) de spanning terug stijgt naar 12V. Ik werk met een labovoeding begrensd op 12V en 2A. Ik vraag mij af of dit een fout in het programma is of in het circuit?

Zie hieronder mijn programma.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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);
    }
  }
}

Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 00:04

SA007

Moderator Tweaking
Je hebt hier niet bijstaan hoe je de motoren aangesloten hebt, maar het lijkt alsof digital 12/13 naar een h-brug gaan.

Paar punten:
- Ik zie niks aan 'ruis' onderdrukking, kan je in je seriele data zien dat de analoge waarde netjes van waarde wijzigd?
Als je joystick geen nette waardes geeft kan je afwijkende waardes krijgen.
Bijv een vuiltje in de potmeter kan je waarde behoorlijk laten verspringen.
- Waarschijnlijk totaal niet boeiend maar je mist een paar edge cases, als de waarde precies 485 of 535 is doet je code niks.
- Als de analoge waarde van < 485 naar > 535 springt stuur je beide outputs naar high, dat kan je h-brug slopen, ik zou de digitalwrite regels omdraaien zodat naar LOW schakelen altijd bovenaan staat.
- Ik zie geen 'snelheidsbeperking' behalve de waarde naar serieel schrijven, houdt er rekening mee dat je zomaar honderden keren per seconde je motor gaat schakelen, dat is wellicht niet de bedoeling.

Of 1 hiervan je probleem oplost durf ik niet zo te zeggen, er lijkt niks fout te zijn, maar denk dat de fysieke wereld als schakelsnelheid van de h-brug of ruis in het joysticksignaal hier het probleem is.

Acties:
  • 0 Henk 'm!

  • Pallieman072
  • Registratie: Maart 2020
  • Laatst online: 22-06-2020
@SA007
Ik gebruik inderdaar een L298N waarmee ik zowel mijn stepper als DC-motor mee aanstuur.
- Neen, mijn joystick geeft netjes de juiste analoge waardes dus zou niet weten wat er fout is.
- Ik ben beginnend met Arduino dus geen idee wat edge cases zijn. Ik heb gewone een neutrale zone ingevoerd (dode zone) op de joystick zodat de motor niks doet wanneer hij stilstaat.
- Hoe bedoel je dat x aantal keren per seconde schakelen niet de bedoeling is? De motor zou namelik wel wel veel van draaizin veranderen.

Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 00:04

SA007

Moderator Tweaking
@Pallieman072
Ok, het zou kunnen zijn dat je joystick ruist en vaak tussen waardes wisselt, dit is overigens iets wat ze wel standaard gaan doen als ze ouder worden (herken je vast wel van oude versterkers die kraken als je het volume veranderd).
Iets om als je dit langere tijd wil gaan gebruiken wel rekening mee te houden.
Bijvoorbeeld een manier is om 10x de waarde op te halen en hiervan een gemiddelde te pakken of waardes weggooien die meer dan x afwijken van de vorige.

Edge cases zijn randgevallen, kleine plekjes waar je niet zo bij stilstaat en niet vaak voorkomen.
Hier zie je bijvoorbeeld dat je code hebt voor als je waarde groter is dan 535 of kleiner dan 535.
Je hebt alleen geen code voor als hij 'exact' 535 is. Hier zal dat waarschijnlijk niks uitmaken gezien dat gewoon niks doet maar wel iets om rekening mee te houden.

Je wil je motor vast vaak schakelen, maar wat 'vaak' is voor een mens, een motor en een microcontroller is wat anders.
Je arduino draait op 16MHz, dat houdt in dat die chip de motor makkelijk een miljoen keer per seconde de opdracht kan geven om om te draaien.
Dat kan je motor fysiek natuurlijk nooit bijhouden, en zal dan veel stroom gaan trekken om het toch te proberen wat je motor/h-brug kan beschadigen.
De beperking die er nu inzit waardoor hij niet zo vaak kan beslissen wat hij gaat doen is om de waarde naar de seriele poort te schrijven, dat duurt best lang, dan zit je op een beperking van 100-200x per seconde.
Voor een motor nog steeds best snel, die gaan toch wel moeite hebben met > 10x per seconde omwisselen.
Wat jij als vaak beschouwd ligt daar wellicht bij in de buurt, maar het is handig om rekening mee te houden dat zo'n microcontroller behoorlijk snel is.

Acties:
  • 0 Henk 'm!

  • Pallieman072
  • Registratie: Maart 2020
  • Laatst online: 22-06-2020
@SA007 Ok, dus mijn programma klopt normaal gezien. Ligt de fout dan in de aansluiting want zoals ik al eerder zei trekt mijn circuit 5V zodra ik op de drukknop druk. Wanneer ik terug beweeg met de joystick trekt mijn circuit 12V en dit zorgt volgens mij ervoor dat de DC-motor gek doet.

Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
@Pallieman072 Wat is je circuit dan want blijkbaar trekt ie dus meer dan 2A. Je kunt trouwens geen Volt "trekken". Je labvoeding staat waarschijnlijk gelimiteerd op 2A en zakt dus in Volts om te voorkomen dat je over de 2A heen komt.

Heb je een schema (dat ook overeen komt met de praktijk)?

En, zoals @SA007 terecht opmerkt, print joyWaarde2 eens naar de serial en kijk hoe groot de ruis is. Als die alle kanten opspringt, zul je inderdaad aan ruisonderdrukking moeten doen om het signaal glad te strijken.

[ Voor 38% gewijzigd door Room42 op 18-03-2020 23:19 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • Pallieman072
  • Registratie: Maart 2020
  • Laatst online: 22-06-2020
@Room42 Ik heb geen tekening maar mijn circuit bestaat uit 2 L298n's. Eén voor de stepper en één voor de DC-motor. Ik voed de L298n doormiddel van de 12V ingang en vanuit deze ingang vertrekt een draad naar de andere L298n. Mijn arduino wordt gevoed a.d.h.v. de 5V uitgang (op de L298n). De joystick is gewoon aangesloten op de 5V pin van de arduino.

Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Nee, zo kan ik niet beoordelen of dat goed is of niet. Wellicht dat iemand anders er chocola van kan maken, maar ik heb toch liever een tekening. ;)

Maar de output van joyWaarde2?

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 17:14
Wat zijn de specificaties van de motoren die je hebt? Als de spanning van je labvoeding inzakt betekent dat dat je te veel stroom trekt.

Wat ik denk dat er gebeurt:
Als ik de joystick naar links beweeg, zal de DC-motor in wijzerzin bewegen (joystick naar rechts in tegenwijzerzin draaien).
Je voeding kan op zich de belasting van de DC-motor prima aan.

De default state van de Stepper-klasse is dat alle pinnen laag staan, en er dus geen stroom naar de stepper gaat. Pas op het moment dat je met de stepper voor het eerst gaat bewegen komt er spanning op de pinnen te staan en die blijft er ook op staan. De stepper blijft dus stroom trekken, ook als hij niet (meer) beweegt.
Wat mij opvalt is dat van zodra ik op de drukknop druk, de spanning daalt van 12V naar 5V
De stepper trekt kennelijk zo veel stroom (meer dan 2A) dat je labvoeding de spanning begrenst op 5V.
en wanneer ik de joystick weer beweeg (DC-motor activeren) de spanning terug stijgt naar 12V
Op het moment dat je dan opnieuw gaat proberen te draaien met de DC-motor trek je nog meer stroom. De DC motor op zich trekt niet te veel stroom voor de labvoeding, maar nu, omdat je net aan de stepper hebt gedraaid, krijgt de labvoeding zowel de stroom van de motor áls de stroom van de stepper voor zijn kiezen. De spanning zakt nog verder in dan 5V. De brownout protection van de Arduino triggert een reset, je sketch begint opnieuw van de start en er gaat geen stroom meer naar de stepper. Nu kan de DC-motor weer normaal werken totdat je de stepper weer gaat gebruiken.

Acties:
  • 0 Henk 'm!

  • Pallieman072
  • Registratie: Maart 2020
  • Laatst online: 22-06-2020
@Tom-Z Wow, een prachtige uitleg. Ik ken niet veel van elektronica maar dit was duidelijk.
- Stappenmotor: https://www.tinytronics.n...motor-0.55n.m-1.5a-nema17 en DC-motor is een oude Maxon motor die 24V aankan.
- Is er een mogelijkheid om deze pinnen van de stepper terug low te maken. Of een andere aanpassing in het programma waarbij dit probleem wordt verholpen.

Acties:
  • 0 Henk 'm!

  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 17:14
Pallieman072 schreef op donderdag 19 maart 2020 @ 10:27:
@Tom-Z Wow, een prachtige uitleg. Ik ken niet veel van elektronica maar dit was duidelijk.
- Stappenmotor: https://www.tinytronics.n...motor-0.55n.m-1.5a-nema17 en DC-motor is een oude Maxon motor die 24V aankan.
Die stepper motor is totaal ongeschikt om op deze manier aan te sturen. De maximale spanning is 24V, maar de nominale spanning is 2.4V. Je H-bridge gaat het niet lang uithouden op deze manier. Voor deze stepper heb je een constant current stepper driver nodig. Een gewone H-bridge is niet genoeg.
- Is er een mogelijkheid om deze pinnen van de stepper terug low te maken. Of een andere aanpassing in het programma waarbij dit probleem wordt verholpen.
Je zou gewoon 4x een digitalWrite(pin, LOW) kunnen doen.

Acties:
  • 0 Henk 'm!

  • Pallieman072
  • Registratie: Maart 2020
  • Laatst online: 22-06-2020
@Tom-Z
- Ik werkte eerst met easydrivers maar ben overgeschakeld op een H-brug. Dit omdat het makkelijker te monteren was aangezien ik 4 stappenmotoren en 4 DC-motoren moet aansturen.
- Moet ik dit dan coderen in mijn void setup of in mijn eerste if-functie? Wil niet dat ik zomaar iets schrijf en uiteindelijk mijn H-brug opblaas.

Acties:
  • 0 Henk 'm!

  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 17:14
@Pallieman072 Dat doe je op het punt dat de stepper motor niet meer hoeft te bewegen, dus direct na de step(-200).

Die L298 is wel écht ongeschikt voor die stepper motor. De enige reden dat de L298 nog niet kapot is is dat je labvoeding stroombegrenzing heeft.
Ik zou overwegen, als je 4 steppers aan moet sturen, dat je dan een 3D printer controller gebruikt zoals een RAMPS board. Dat is gewoon een programmeerbaare Arduino met aansluitingen voor 4 (geschikte) stepper drivers en motoren.

Acties:
  • 0 Henk 'm!

  • Pallieman072
  • Registratie: Maart 2020
  • Laatst online: 22-06-2020
@Tom-Z Ik heb alle pinnen op low gezet ... echter geen resultaat. Hoe zou jij dit programma schrijven waarbij als ik druk de stepper beweegt en bij het bewegen van de joystick, de DC-motor draait?

[ Voor 51% gewijzigd door Pallieman072 op 19-03-2020 15:24 ]

Pagina: 1