Arduino Uno + Easydriver + Stepper motor = Timelapse slide

Jeg har sat mig for lidt at et projekt som nybegynder, men det hele er sådan set gået nemt.

Problemet er bare kodningen af Arduinoen. Jeg har forsøgt mig de sidste to ugers tid med lidt forskellige koder, som jeg har fundet i forskellige tutorials. Forsøgt at rette dem til og prøve mig frem. jeg bliver bare ikke meget klogere, da koderne er så vidt forskellige.

Nogen tér sig underligt, og virker ikke medmindre USB er sat i (på trods af DC strømforsyning), og et andet tilfælde, hvor pin 2 og 12 er markeret i koden, men det er pin 2 og 3 der gir en effekt. Sådan nogle ting.

Det eneste jeg vil er at motoren kører meget langsom(1-10 rpm) og at jeg nemt kan ændre hastigheden, evt. via et potientmeter eller direkte i koden.

Jeg håber der en venlig sjæl, der lige vil lave et mashup til mig, da det ikke kan være særligt kompliceret, hvis man mestrer sproget.
Om ikke andet, så lige pege mig i den rigtige retning.
Lige nu føles det lidt som at tage en uddannelse som mekaniker, for at lære at skifte sine dæk selv.

På forhånd mange tak.

hej.

Uden at du vedlægger lidt kode ved jeg jo ikke hvad du har prøvet. Husk at bruge den der "#"-knap ovenfor så din kode kommer i smuk kasse med scrollbars (og ikke laver smileys hvor det bare er luk-parantes)

virker ikke medmindre USB er sat i (på trods af DC strømforsyning),

er en klassiker - du har ikke nok strøm i din strømforsyning. (Strømforsyningen der går ind i DC stikket på Arduinoen bør være 7V eller lidt mere og give mindst 500mA for at være på ligefod med USB) Den anden er at - afhængigt af din motor som jeg ikke ved noget om - du ikke bør suge strøm fra Arduino board/chippen for at drive en motor.

Jeg skal have et billede (eller en håndtegning du har scannet eller fotograferet) af dit kredsløb. Og et type nummer, helst en link til datablad af din motor.

Ja, du vil nu ikke "bare" skifte dæk, du vil faktisk skifte bremser - for at holde analogien. Kan også gøre uden den store mekanikker udannelse, men kræver lidt indsigt i nogle principper. Og det duer ikke at sige "røret virker for småt" uden at fortælle hvilken bil og bremsetype det drejer sig om. Nok om analogien - lad os se på kode og kredsløb, så er det nok en smal sag.

Jamen, du får da lige hvad du beder om :wink:

Her er et Datasheet af motoren: http://www.let-elektronik.dk/filer/produkter/SM-42BYG011-25.pdf

Opsætningen er således; http://bildr.org/blog/wp-content/uploads/2011/05/EasyDriver-Stepper-Motor-Driver2-400x722.png
Forbundet til et 12v batteri. Hvilke pins jeg bruger på arduinoen afhænger selvfølgelig af hvad koden fortæller mig.

Jeg har så arbejdet lidt udfra disse eksempler, da de var mest begynder venlige. I hvert fald Example 1. Easy Driver Examples

Og har rodet lidt med Example 2 og kommet frem til denne kode

int dirpin = 3;
int steppin = 12;

void setup() {
Serial.begin(9600);

pinMode(dirpin, OUTPUT);
pinMode(steppin, OUTPUT);
}
void loop()
{

  int i;

  digitalWrite(dirpin, LOW);     // Set the direction.
  delay(100);

Serial.println(">>");
  for (i = 0; i<4000; i++)       // Iterate for 4000 microsteps.
  {
digitalWrite(steppin, LOW);  // This LOW to HIGH change is what creates the
digitalWrite(steppin, HIGH); // "Rising Edge" so the easydriver knows to when to step.
    delayMicroseconds(200);      // This delay time is close to top speed for this
  }                              // particular motor. Any faster the motor stalls.

  digitalWrite(dirpin, LOW);    // Change direction.
  delay(100);

  Serial.println(">>");
  for (i = 0; i<4000; i++)       // Iterate for 4000 microsteps
  {
digitalWrite(steppin, LOW);  // This LOW to HIGH change is what creates the
    digitalWrite(steppin, HIGH); // "Rising Edge" so the easydriver knows to when to step.
    delayMicroseconds(200);      // This delay time is close to top speed for this
  }                              // particular motor. Any faster the motor stalls.

}

Nu er det ikke fordi jeg har problemer med lige netop denne kode. Det er bare generelt. De fleste koder jeg har set er fyldt op med alt muligt. Beregnet i forhold til afstand. Den ene vej og den anden vej. Microsteps eller omgange osv.
Der er ikke rigtig noget udgangspunkt medmindre jeg går i basics, men der har jeg ikke rigtig haft held heller :). Da jeg så nemlig skal vide lidt mere end at setup er opsætningen og loop er "funktion".

Jeg har en aksel som langsomt hiver en snor om sig, så jeg skal bare bruge en simpel kode som jeg kan ændre hastigheden i.
Der er ikke nogen grund til at have en avanceret kode, som er lavet efter min skinne (140 cm) og som tager ryk i sekundet. Det eneste jeg skal bruge er et "smooth" træk (hvordan man nu vil formulere det) Evt. have muligheden for at kunne tilføje en "pause" til timelapse med flere sekunders lukkertid eller HDR timelapse. Der kunne det være nyttigt.

Jeg giver dig en længre forklaring/hjælp i morgen.

Du tager bare den tid det skal tage.

Sætter pris på hjælpen :wink:

Du har alle delene. Dvs du har en fin for-løkke og du stepper sandsynligtvis lystigt deruda'. Sådan forstår jeg din situation lige nu.

Man fortræker i dette forum at give folk et hint, snarere end en grydeklar løsning.

Hvad sker det med din motor hvis i stedet for 200 mikros sekunder du bruger 500 millisekunder. Gør det så ikke det du vil? Mere tid?

En stepper er i sagens natur en "stepper" den vil flytte sig i ryk med det der er dens step størrelse (typisk 1,8 grader) Hvis du sætter 5V til MS1 og MS2 vil den tage mindre trin (Easydriver sætter 1/8 spænding på den ene spole og 7/8 på den anden - ergo drejer motoren til 1/8 mellem to trin). Nu skal du bare give 8 gange så mange step-pulser for at få samme drejning.

At læse en "hasighedsværdi" fra en potentiometer involvere brug af analogRead og det vil være nemt nok, men analogRead har en tends til at støje lidt, dvs du får lid forskellige værdier for hver gang selv om poten ikke bliver rørt. Så man er nødt til at gøre noget med løbende gennemsnit eller via en ektsra trykknap siger at man kun skal læse en gang.

Jeg vil foretrække at læse et tal fra Serial input. Søg her på forumet efter "nnnC" så finder du en lille kodestump jeg ofte bruger til diverse parameter-indstilling-fra-serial. Alternativt kan du bare sige bogstav A er 1 trin i sekundet, B er 5 trin og ellers en opslags tabel hvad hver bogstav skal betyde. (Kig på switch...case i Reference sektionen)

Takker for god info :wink:

Selvfølgelig regnede jeg ikke med at alt arbejdet blev gjort for mig.
Jeg er ikke typen som bare kaster min computer over på en ven/familiemedlem, fordi at de lige ved hvad der skal gøres. Hvorefter de kan sidde og blive frustreret over det den næste uges tid.

Dog kan jeg ikke teste så meget lige nu, da min Easydriver muligvis er død. Ved ikke om jeg har tabt en dråbe tin forkert, men et eller andet er dødt. Nu afventer jeg lige da jeg har lidt for meget i kalenderen i øjeblikket.

Jeg vender tilbage med nyt :wink:

Har været lidt optaget af nogle andre projekter, så har først fået liv i det hele nu.

Den kode jeg postede her virker dog ikke mere, hvad jeg gør forkert ved jeg ikke helt.
Jeg har dog læst lidt op på de andre koder jeg har brugt og er fundet frem til at denne egentlig burde være nok:

void setup() {                
  pinMode(8, OUTPUT);     
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(1);          
  digitalWrite(9, LOW); 
  delay(1);          
}

Hvis jeg uploader denne kode til min Arduino stepper min motor lystigt derud af, som beskrevet på siden. Når jeg så vil ændre hastigheden som beskrevet herunder, er der ingen ændringer. Samme hastighed uanset delay. Har prøvet fra 10ms til 5000 uden nogen ændring i hastigheden.

So how fast is this code going to run the stepper? Well, with the STEP signal 1ms high and 1ms low, each complete pulse will take 2ms of time. Since there are 1000ms in 1 second, then 1000/2 = 500 microsteps/second.

What if we wanted the motor to go slower? We change the delay(); lines to have longer delays. If you use delay(10); for both, the you'll move at 50 microsteps/second.

What if you wanted the motor to go faster? We can't really delay for less than 1 ms, can we? Yes, of course we can! We can change the delay() calls to delayMicroseconds(100); calls and then each delay would be 100 microseconds (or us), so the motor would be driven at 5000 microsteps/second.

Så mit spørgsmål nu er egentlig bare, hvad der gør at delay ikke virker som ønsket?

Selvfølgeligt skal den lille kode stump virke. Det lyder som om noget andet får stepperen at dreje, end din pin9. Hvad sker hvis du ikke laver noget (dvs loop() er tom)?

Er det sådan her, du tænker på?

void setup() {                
  pinMode(8, OUTPUT);     
  pinMode(9, OUTPUT);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
}

void loop() {         
}

Du har fat i noget, for jeg har samme torque og hastighed med denne kode.

Mystisk. Jeg har samme opsætning som på hjemmesiden, og har forsøgt med og uden Gnd, for at se om det gjorde nogen forskel.

Således:

Jo det var sådan jeg tænkte. Og det bekræfter jo at noget er galt med dit kredsløb. Og det er også for enkelt at have gået galt. (Lige nu vil dit kredsløb også kun virke hvis du har USBen i Arduinoen da den jo ellers ikke får strøm noget sted fra.)

Men, nu tror jeg ikke dine ledninger er så lige og pæne som tegningen :slight_smile: Hvis din Step/Dir indgange ikke er forbundet vil vi se denne opførsel da indgangen på chippen modtger "radio støj" som input. Check og dobbel check. Hvis der mangler GND mellem de to print giver den anden ledningen ingen mening.

Der er to små problemer med breadboards. Det ene er at hvis ens ledninger er for tynde så bliver der ikke en god kontakt. Den anden har drivet mig til vanviiiid mindst en gang. De to lange "strømskinner" langs med yderkanten er ikke gennemgående - de er afbrudt i midten. Så hvis man sætter GND i den ene kant og tror man langs hele længden får GND så bliver man skuffet. Jeg ved - på tegningen bruger du slet ikke kantskinnerne - men du gør måske "in real life"?

Hvis du har en mulitmeter, så mål mellem GND og se om du har 5V på Easydriverens 5V udgang. Tag af alle strømforsyninger og mål med Ohm meter at du har "0 ohm" mellem et af de andre Arduino GND ben og et af den andre EasyDriver GND ben.

Og God jul, det er jo snart

Skulle vidst have uddybet lidt :wink: Var nærmere det setup jeg har arbejdet udfra.

Jeg har det nemlig ikke akkurat som på tegningen, og knap så flot, som du hentyder ;).

Jeg bruger ikke et breadboard, da jeg tænkte at jeg ville have lidt frihed til at bygge det ind i en lille kasse.
Det er almindelige jumper-kabler fra Let-elektronik jeg bruger (han-han), som er proppet i Arduino'ens pin og loddet til Easydriver. Er disse muligvis for tynde?

Strømkilden er et lille bilbatteri, som fodrer både Easydriveren og Arduino'en via DC-input. Her har jeg været nødt til at have to tykke ledninger fra batteriet, og lodde jumperkabler på dem, da Easydriverens "indgange" er så små.

Men jeg må lige prøve at lodde efter her en af de kommende dage og melde tilbage.

Den her fangede jeg ikke helt :slight_smile: "Hvis der mangler GND mellem de to print giver den anden ledningen ingen mening."

Jeg har ikke den store forstånd på GND i det hele taget. Vi har et multimeter, jeg har låne på arbejdet, så det kigger jeg lige på.

Og selvfølgelig, God jul og godt nytår!

Schmixebakke:
Det er almindelige jumper-kabler fra Let-elektronik ... Er disse muligvis for tynde?

De er fine nok.

Den her fangede jeg ikke helt :slight_smile: "Hvis der mangler GND mellem de to print giver den anden ledningen ingen mening."

man siger at plus ledningen har f.eks. 5V. Men 5V er ikke en absolut ting som temperatur, mere som en afstand. Hvis du siger "den her er 4cm væk" - så må jeg sprørge "4 cm fra hvad?". Det samme med spændning - den er relativ til Ground/GND. Hvis din ledning fra Arduinoen er 5V og du putter den i Easydriveren, så synes den kun at den har 5V hvis de har SAMME GND. Eller giver spændningen fra den løse enkle ledning fra Arduinoe ingen mening. Altså GND fra alle print skal være forbundet. Og til -ve/0v af din batteriforsyning.

Et breadboard er ikke ment til brug i slutproduktet - det er bare en sandkasse der gør det nemt at at prøve et kredsløb af, inden man foreviger det med lodninger eller laver printkort. Som vi er enige - dit kredsløb er for "enkelt" at gå galt (selv om det alligevel gør)

Der er ikke så meget andet at gøre at kontrollere alt. :astonished: Igen. :~ Nøjsomeligt.

Så fik jeg tæmmet dyret. Nu gør det som jeg siger :slight_smile:

Jeg skiftede et par kabler og gennemtjekkede det hele, så det var nydeligt.
Det vidste sig dog også at være et andet problem, da min stationær ikke uploadede koden korrekt.
Selv hvis usb ikke sad i gennemførte den stadig uploadet og kalde det succesful, så der har været en eller andet der har forstyrret.

Efter jeg uploadede koden på min bærbar spillede det bare, og den reagerede korrekt.

Så det hele er sådan set som det skal være,

Endnu engang mange tak for hjælpen og tålmodigheden :*

Tak for påskønnelsen. Og især en tilbagemeldning at det blev løst og hvad den faktiske fejl var. Det kan vi alle der læser forumet lære af og det går i bøtten med "fælles kendskab".