måndag 29 april 2013

Stegmotor+Raspberry Pi

Med hjälp av http://www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/ och http://www.raspberrypi-spy.co.uk/2013/04/berryclip-6-led-board-testing-in-c/ petade jag ihop följande


#include <wiringPi.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int pin[]={ 5, 6, 10, 11 };
int delaytime=1;

void init_pins ();
void step_forward ();
void step_backward ();
void closedown ();

int main(void) {
        int step;

        if (wiringPiSetup () == -1) {
                printf ("problem med wiringPi\n");
                exit (1);
        }
        init_pins();
// 2038-2039 verkar innebära ett varv/360 grader 2038/4=509,5
// Kanske 512 är nära nog, isf blir
// 180:256, 90:128, 45:64, 22.5:32, 11.25:16, _5.625_:8,
// 2.8125:4, 1.40625:2 och 0,703125:1
// Varje step_xxx() innebär en cykel, dvs 8 signaler och 8 step_xxx =
// 5.625 grader; 8x8=64
// Kortet har spec "stride angle 5.625 grader/64"...

        for (step=0; step<509; step++)
                step_forward();
        for (step=0; step<509; step++)
                step_backward();
        closedown();
        exit(0);
}

// Functions

void init_pins () {
        int c;

        for (c=0; c<4; c++)
                pinMode(pin[c], OUTPUT);
}
void step_forward () {
        int bit, pos, c;
        int a=8, b=4;

        for (c=0; c<4; c++, b=(b==1)?8:b/2, a=(a==1)?8:a/2) {
                for (bit=8, pos=0; bit>=1;bit/=2, pos++) {
                        digitalWrite (pin[pos], a&bit);
                        delay (delaytime);
                }
                for (bit=8, pos=0; bit>=1;bit/=2, pos++) {
                        digitalWrite (pin[pos], (a+b)&bit);
                        delay (delaytime);
                }
        }
}
void step_backward () {
        int bit, pos, c;
        int a=1, b=8;

        for (c=0; c<4; c++, b=(b==8)?1:b*2, a=(a==8)?1:a*2) {
                for (bit=8, pos=0; bit>=1;bit/=2, pos++) {
                        digitalWrite (pin[pos], (a+b)&bit);
                        delay (delaytime);
                }
                for (bit=8, pos=0; bit>=1;bit/=2, pos++) {
                        digitalWrite (pin[pos], a&bit);
                        delay (delaytime);
                }
        }
}
void closedown () {
        int c;

        for (c=0;c<4;c++)
                digitalWrite (pin[c], 0);
}

I exemplet kör jag den ett varv medurs och sedan tillbaka ett varv.

Det jag inte fattar är det som jag skriver i kommentaren i mitten:
Om 512 cykler blir ett varv (vilket mina tester inte riktigt visar) så gör 8 cykler om 8 signaler att motorn snurrar 5,625 grader, vilket sammanfaller med specen på kortet att den har "Stride Angle: 5,625 grader/64" eller, på en annan PDF "Step Angle: 5,625 grader/64".

Nu vet jag inte vad det betyder, men det är inget minimum för hur mycket man kan snurra motorn iaf då en cykel blir ~0,7 grader.

(Siffran 2038-2039 har jag från innan jag hade for-loopen som snurrar 4 ggr inne i step-xxx-funktionerna)

Ett annat och allvarligare problem jag har är att resurser käkas upp på nåt mysko sätt.
Sitter jag och editerar, bygger, kör, editerar, bygger, kör osv så börjar det sakta gå segare och segare tills jag tappar kontakten och måste starta om.

Jag har testat med script att köra programmet 100 ggr utan att samma skedde.
Jag har också testat att med script bygga programmet 200 ggr utan problem.
Återstår editorn, nano, men jag är lite skeptisk till att den skulle orsaka sådana problem...

Kan nämnas att jag har en Raspberry till, där jag inte sett motsvarande trots idogt editerande.