Arduino

Aloittaja Pete2, 19.12.09 - klo:21:13

« edellinen - seuraava »

0 Jäsenet ja 1 Vieras katselee tätä aihetta.

Pete2

 Testailin vähän encoderin lukua Arduino:lla,
netistä löytämääni ohjelman tynkää muuttamalla
sainkun sainkin, näytöön nousevan ja laskevan
arvon.Ohjelma käytää ohjaimen molempia ulkoisia
keskeytyksiä.
Ojelma myös "kadottaa" kymmenyksen kun siirtyy
nolla pisteen yli tai alle??.
Ohjelmointikieli on c-kielen tyyppistä, pitääkin
kaivaa esiin "paperit" kahdeksan vuoden takaiselta
c-kurssilta : )





Jonne


Tarkoitatko suunnanvaihtoa (kun hukkaa nollapisteen)?
Jos näin, lue aina vaihtuva tila A&B-pulsseista.

Olen joskus tehnut aloituksen aiheesta, missä on useammalla
eri kielelle ohjelmaesimerkit, en löytänyt sitä tähän hätään...
Delta Electronics -tuotteet www.thelentech.fi - Blogi ennenmikrotietokoneita.blogspot.fi

Orbitrek

Ujosti off-topic, mutta on muuten aivan vallaton peli tuo arduino.
Itsekin fanitan kyseistä laitosta. Ääri helppoa saada hilavitkuttimia up-and-running Arduinolla.

USkallatko laittaa jakoon encooderin-luku-snippettiä?

Pete2

Arduino on tosiaan helppo saada toimimaan, ja
hintakin n20e ei paha.

Encoderi ohjelma käyttää keskeytyksiä
(joita 2) A: ssa ja Index linjassa,kymmenys
katoaa aina kun encoderi mene nollasta -0.1
Kun A saa aikaan keskeytyksen niin B linja
lukemalla saadaan pyörimis suunta (näin olen
ymmärtänyt).Linkki keskusteluun josta olen
ohjelman "lainannut"(Bluemarble:n postaus).

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1185064568

Kremmen

Lainaus käyttäjältä: Pete2 - 20.12.09 - klo:08:53

Kun A saa aikaan keskeytyksen niin B linja
lukemalla saadaan pyörimis suunta (näin olen
ymmärtänyt).

Joo tuo on yksinkertaisin tapa saada liike ja suunta ulos kvadratuurienkooderista. Siinä on (huonolla ohjelmakoodilla) pieni riski saada asema liukumaan jos enkooderi tärisee tai vaihtaa suuntaa hyvin usein pienellä liikevälillä. Tähän törmäsin itsekin vuonna miekka ja kilpi kun näitä palkan eteen toteutettiin.
Tehokkain tapa lukea q-enkooderia on ottaa kiinni jokainen tilanvaihto kummastakin kanavasta, siis sekä nousevat että laskevat pulssinreunat A- ja B-kanavasta. Noista on helppo toteuttaa tilakone joka laskee asemaa/nopeutta 4 kertaa tarkemmin kuin lukemalla vain A-kanavan nousevalla pulssinreunalla.
Tilakaavio menee näin (olettaen, että A-kanavan nouseva reuna tulee eteenpyörimisessä ennen B-kanavan nousevaa):


      Kanava| A B | A B | A B | A B |
        Tila| 0 0 | 0 1 | 1 0 | 1 1 |
A(nous)     | --- | --- | Et  | Ta  |
A(lask)     | Ta    Et    ---   --- |
B(nous)     | --- | Ta  | --- | Et  |
B(lask)     | Et  | --- | Ta  | --- |


Kanava = kanava jonka tilaa katsotaan
Tila    = kanavan tila lukuhetkellä
A(nous) jne = kanavan tilamuutos joka käynnistää tilojen luvun
Et = enkooderi pyörii nimellisesti eteen
Ta = enkooderi pyörii nimellisesti taakse

Pseudokoodi liikkeen dekodaukseen (olettaen, että on 1 keskeytys johon kaikki tilanvaihdot on ohjattu)


case kanava
    A_nouseva: begin
        if B_kanava = 0 then Asema = Asema +1 else Asema = Asema -1
    end
    A_laskeva: begin
        if B_kanava = 1 then Asema = Asema +1 else Asema = Asema -1
    end
    B_nouseva: begin
        if A_kanava = 1 then Asema = Asema +1 else Asema = Asema -1
    end
    B_laskeva: begin
         if A_kanava = 0 then Asema = Asema +1 else Asema = Asema -1
   end

end case

Tuolla algoritmilla Q-enkooderista irtoaa tarkin mahdollinen asema- ja liiketieto, eikä se missaa tilanvaihtoja (joista syntyy asemavirhettä). Haasteeksi tulee nyt tunnistaa, mikä tilanvaihto aiheutti keskeytyksen. Ratkaisuja tähän on useita erilaisia riipuen siitä, millaiset resurssit on käytettävissä. Simppelein on tietty 4 keskeytystuloa, joita palveltaessa ensin kirjataan keskeyttänyt kanava ja sitten ajetaan tuo algoritmi. Tai ne voidaan tallentaa erikseen luettaviksi parilla lisäpiirillä. Tai jos on sekä nousevalla että laskevalla reunalla aktivoituva keskeytystulo käytettävissä, niin kytketään tuloon (A XOR B) jolloin saadaan tilanmuutos keskeytystulossa jokaisesta reunasta. Tai sitten voi tehdä niin, että ylläpitää kanavien tilaa muistissa ja vertaa edelliseen tilaan jolloin keskeyttänyt pulssinreuna selviää vertailussa. Tällöin ei saa missata yhtään keskeytystä koska tila menee väärin ja hukataan pulsseja.
Nopeuden laskenta pulssijonosta on jo huomattavasti haastavampaa enkä laita mitään pseudokoodiakaan tähän kun siinä on aika monta liikkuvaa osaa. Mikäli joudutaan laskemaan nopeutta suurella dynamiikka-alueella ei pelkkä pulssien vähenteleminen toisistaan enää riitä vaan joudutaan myös ajastamaan pulssien välejä.
Nothing sings like a kilovolt
Dr W. Bishop

tanantunari

Tulipa vaan mieleen, vähä menee ohi aiheen mutta eikös pulssi anturilla saisi toteutettua manuaali sorviin karan ns. paikotuksen. Et laittas käsiporakoneen tk pitimeen kiinni, et saa porattua akseliin reikiä tietylly jaolle. Pulssi anturi ja joku näyttö ja karasta pyörittäs asteet kohdilleen ja pistäs jarrun päälle  ja tökkäis reijän ja nii edelleen

Pete2

Ohjelma esimerkissä index on kytketty toiseen
keskeytykseen jolla nollataan kymmenykset,ja
aletaan lasku uudestaan, niin virhe ei muodostu
kovin isoksi.
Tuo nouseva ja laskevat pulssireunat on
vaikea hahmottaa : )
Arduinossa on vain 2 keskeytystä,ehkä
indexin voisi lukea muullakin tavalla.



Kremmen

Lainaus käyttäjältä: Pete2 - 20.12.09 - klo:08:53
Linkki keskusteluun josta olen
ohjelman "lainannut"(Bluemarble:n postaus).

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1185064568


Vilkaisin tuota koodia. Ei se ehkä ihan ammattilaisen kirjoittamaa ole, mutta noin pääpiirteissään ajaa asiansa. Muutama seikka siitä paistaa läpi jotka viittaavat siihen, että asialla on kaveri joka ymmärtää tehtäväksiannon, mutta ei varmaan tee koneenohjausta eikä koodausta vakityönä (no, niinhän tekijä itsekin sanoo). Siitähän ei ole mitään pahaa sanottavaa, mutta aika helpo tuota koodia on toisaalta vähän parannellakin.

Lainaa
Bluemarble: PROBLEMS - for some reason it misses one tenth of a turn when the counter goes from 0.0 to -0.1.
Maybe someone could fix this?? it is not a huge problem.
Also, I'm not a programmer, if anyone sees ways I can clean up this code please let me know.

Yhden selvän mokan ainakin löysin: muuttuja
volatile unsigned int  encoder0Pos = 0;      //the encoder position variable.
on sinänsä esitelty oikein, paitsi kun sitä käytetään myöhemmin, lause
if (encoder0Pos == -1){                  // if encoder position is equal to -1
on selkeästi esittelyn vastainen. Lukuarvo -1 ei ole unsigned int arvoalueella. Kääntäjästä riippuen koodin käyttäytyminen vaihtelee arvaamattomasti. Huolellisempi parseri ei edes päästäisi tuota objektikoodiksi asti. Muuttuja pitää ehdottomasti esitellä:
volatile int  encoder0Pos = 0;      //the encoder position variable.
jos sitä noin käytetään.

Sitten tuo koko kierroslaskurin ja indeksipulssin käsittely on vähän sekavaa. Tekijällä ei ole oikein ollut selkeää näkemystä mitä hän on tekemässä, tai ainakaan se ei näy koodista. Tämä nyt lienee toki ihan testiohjelmaksi tarkoitettu rykäisy joten ei pidä olla liian kriittinen, mutta silti itse miettisin toisin mm. nämä asiat:

-Koodista näkyy, että anturin pulssimääräksi / kierros on päätetty 500. Hyvän koodaustavan mukainen nipotus vaatisi laittamaan tuon lukuarvon esitellyksi vakioksi eikä hautaamaan sitä koodiin. Nyt esim tuo 499 joka esiintyy koodissa on aika täydellinen taikaluku. Sehän on tietenkin 500 -1 ja pitäisi noin muotoilla myös koodissa (käyttäen siis sitä nimettyä vakiota), koska jos kaveri myöhemmin päättää että anturissa onkin vain 200 p/r niin mitä tuo 499 silloin tarkoittaa?. No, tämä on toisaalta vain tyylikysymys mutta ammattiohjelmoija saisi turpaansa jos tuollaista vääntäisi :D.

- Indeksipulssin käsittelyssä pitää olla tarkkana. Jos lukemaa käsitellään sen perusteella, niin ainakin pitää tietää montako pulssia indeksi enkooderin kiekolla kattaa. Kierrettäessä indeksin kohdalle eri suunnilta pitää pulssinreunojen paikkaero huomioida, muuten laskenta menee väärin. Aikanaan paljon käytettiin herra tohtori-insinööri Johannes Heidenhainin vehkeitä joissa indeksi tosin on lyhyt, vain yhden inkrementin (1/4 jakson) pituinen ja osuu väliin jossa sekä A että B =1.
Indeksi ei tarvitse omaa keskeytystä, vain tulosignaalin jonka arvo tarkistetaan jokaisella pulssikeskeytyksellä. Ensin muodostetaan suuntatieto ja sen jälkeen katsotaan onko indeksi mennyt päälle tällä keskeytyksellä. Jos on, tiedetään saavutun indeksialueelle kyseisestä suunnasta ja asema voidaan merkata kiinteästi kun tunnetaan indeksin peitto kooderin kiekolla. Heidenhainilla siis peitto = 1 inkrementti, joten asema voidaan suoraan nollata tähän. Arduinoon en ole milloinkaan koskenut, mutta jos siinä on 2 keskeytystä jotka saa liipaistua sekä nousevalla että laskevalla reunalla niin ne kanaviin kiinni. Indeksi normaliin tuloon.

Tuo näytön yhden desimaalin virhe tulee aivan varmasti joutosilmukassa olevasta näyttörutiinista. En sitä vaivautunut enempää analysoimaan, se on selvästi aivan rikki jo syntyessään. Tapa käsitellä kokonaisia ja desimaaleja tuolla tavalla aivan eri muuttujina on amatöörimäinen :) ja tarpeettoman vaikea. Kaveri ei ole uskaltanut/osannut tehdä tuota "oikein" käyttäen 2-komplementtiaritmetiikkaa. Jos tässä aikaa jää tänään muilta hommilta niin voin laittaa toimivaa koodia tuosta osuudesta, ellei joku muu ehdi ensin.


Nothing sings like a kilovolt
Dr W. Bishop

Kremmen

Lainaus käyttäjältä: Pete2 - 20.12.09 - klo:08:53
Arduino on tosiaan helppo saada toimimaan, ja
hintakin n20e ei paha.

Encoderi ohjelma käyttää keskeytyksiä
(joita 2) A: ssa ja Index linjassa,kymmenys
katoaa aina kun encoderi mene nollasta -0.1
Kun A saa aikaan keskeytyksen niin B linja
lukemalla saadaan pyörimis suunta (näin olen
ymmärtänyt).Linkki keskusteluun josta olen
ohjelman "lainannut"(Bluemarble:n postaus).

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1185064568

Kun oli aikaa niin viilasin vähän tuota esimerkkikoodia. Tämä ei ehkä juuri tällaisena käänny suoraan Arduinolle, kun minulla ei semmoista eikä sen käännösaikaisia kirjastoja ole. AVRStudio ja GCC kelpuuttavat tämän noin pääosin. Pienellä mekaanisella viilaamisella pitäisi mennä läpi.
Alkuperäisen kirjoittaja ei ollut huomioinut mm. sitä, että pitää olla varovainen käsiteltäessä muuttujia joiden arvo saattaa päivittyä keskeytyksen aikana. Pahimmassa tapauksessa arvo on muuttunut tai rikki (monitavuisilla rakenteilla) jos keskeytyksen aiheuttama päivitys osuu keskelle lauseen evaluointia. Ja sehän osuu ennemmin tai myöhemmin...
Desimaalivirhe oli helppo - perinteinen off by one ja helppo fiksata.


#include <avr/interrupt.h>

#define encoder0PinA  3            //Quadrature Track A
#define encoder0PinB  4            //Quadrature Track B
#define encoder0PinC  2            //Index Track

#define ENCODER_RESOLUTION 500      // Resoluutio kerrotaan nimetyllä vakiolla joka esitellään, eikä koodiin hautaamalla!
#define SUBDIVISIONS 10            // Moneenko osaan kierros jaetaan näytöllä

//encoder variables

volatile int encoder0Pos = 0;      //the encoder position variable.
volatile int turn = 0;                              //the total turns.
volatile int cw;               // pyörii myötäpäivään (miksikähän alkup tekijä oli valinnut vastapäivään)
volatile int atIndex;            // INDEKSITIETO KESKEYTYKSESTÄ JOUTOSILMUKKAAN
volatile unsigned int chA, chAPrev; // Enkooderin A-kanavan viimeinen ja viimeistä edellinen tila
volatile unsigned int chB, chBPrev; // Enkooderin B-kanavan viimeinen ja viimeistä edellinen tila



// int start = true;                        //variable used to indicate the first time the encoder sees the index track.
int decimal = 0;                        //tenths of a turn.
int encoderHome = 0;                        //used to reset encoder0Pos if any counts are missed during a rotation.
// pitäisi olla volatile kun muutetaan keskeytyspalvelijasta!! No ,tätä ei enää käytetä joten jätä kommentoiduksi
// int ccw = false;                        //which direction the encoder is spinning.
int display = 0;                        //variable for display data on LCD screen.

void setup(){

//encoder pinModes
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH);       // turn on pullup resistor

/* MOLEMMAT KESKEYTYKSET ENKOODERIN KANAVIIN */

attachInterrupt(0, doEncoder, CHANGE);  // encoder track A on interrupt 0 - pin 3
attachInterrupt(1, doEncoder, CHANGE);  // encoder track A on interrupt 1 - pin 4


beginSerial(19200);                  //start communications with LCD screen Matrix Orbital LCD0821
        Serial.print(254, BYTE);      //turn off the cursor on LCD
        Serial.print(84, BYTE);        //turn off the cursor on LCD 
        Serial.print(254, BYTE);      // turn on the LCD backlight  //remove any of these if needed
        Serial.print(66, BYTE);        // turn on the LCD backlight
        Serial.print(0);                // turn on the LCD backlight
}


void loop(){
   int tmpPos, tmpTurn;
   Serial.print(12, BYTE);            //clears the LCD screen.
   Serial.println ("Turns =");        //print "Turns =" on the LCD screen.

   cli();                        // VOLATILE-MUUTTUJAN KÄSITTELY PITÄÄ KEHYSTÄÄ KESKEYTYSKIELLOIN!
   tmpPos = encoder0Pos;
        tmpTurn = turn;
   sei();

   decimal = (tmpPos * SUBDIVISIONS / ENCODER_RESOLUTION);
   if (tmpTurn <0) {
      display = abs(tmpTurn+1);
      decimal = abs(decimal);   // Tässä oli syy miksi yksi desimaali putosi pois. Klassinen off-by-one -virhe
      Serial.print ("-");                  //print a negative sign when turns is negative
   } else {
      display = tmpTurn;
   }
Serial.print (display);            //show turns on LCD
Serial.print (".");                  //print a decimal point after the turns
Serial.print (decimal);            //print the tenths of a turn after the decimal point.
delay(20);                        //delay 20ms so that the LCD screen doesnt flood
}


void doEncoder(){

int dA, dB, chC;

   chA = digitalRead(encoder0PinA); //OLETUS: TÄMÄ FUNKTIO ASETTAA ALIMMAN BITIN ARVOON 1/0 JA MUUT 0
   chB = digitalRead(encoder0PinB);

   dA = chA ^ chAPrev;
   dB = chB ^ chBPrev;

   // tsekataan kumpaan suuntaan inkrementti tuli ja päivitetään inkrementtilaskuri sen mukaan.
   // Otetaan välistä ulos suuntatieto muuttujaan cw
   cw = ((dA && (chA ^ chB)) || (dB && !(chA ^ chB)));
   encoder0Pos +=  cw - ((dA && !(chA ^ chB)) || (dB && (chA ^ chB)));

   chAPrev = chA;
   chBPrev = chB;

   chC = digitalRead(encoder0PinC);

   if (chC) {   // olisko indeksisignaali just nyt päällä
      atIndex = true;
      encoder0Pos = 0;
      if (cw) turn +=1 else turn -= 1;
}



Nothing sings like a kilovolt
Dr W. Bishop

Kremmen

Lainaus käyttäjältä: tanantunari - 20.12.09 - klo:12:06
Tulipa vaan mieleen, vähä menee ohi aiheen mutta eikös pulssi anturilla saisi toteutettua manuaali sorviin karan ns. paikotuksen. Et laittas käsiporakoneen tk pitimeen kiinni, et saa porattua akseliin reikiä tietylly jaolle. Pulssi anturi ja joku näyttö ja karasta pyörittäs asteet kohdilleen ja pistäs jarrun päälle  ja tökkäis reijän ja nii edelleen

Kyllä kai tuon voisi tehdä. Muutama haastehan siinä tulisi, lähinnä kai se, ettei anturin lukema ole mikään lukko joka estäisi karaa liikkumasta. Kun ei sorvissa normaalisti ole mitään karajarrua niin pitäisi keksiä sellainen joka lukittuu liikuttamatta karaa yhtään. Ei varmaan mahdotonta mutta eikö helpompaa olisi soveltaa johderuuvin hammaspyörävälityksiä ja keksiä niihin lukitusmekanismi? Sopivilla rattailla saisi aika joukon jakoja aikaan.
Nothing sings like a kilovolt
Dr W. Bishop

Pete2

Nyt kun pyöritän encoderia kierrokset
vain kasvavat ja decimaali pisteen
jälkeen 0,on kun tieto suunnasta ei
päivity vaan on + kokoajan.

Muutokset että sain käännettyä ohjelmaan ja tietenkin
Lcd näytön sarjaväyläisestä tavalliseksi:

if (chC) {                              // olisko indeksisignaali just nyt päällä
      atIndex = true;
      encoder0Pos = 0;}
   else  if (cw) {turn +=1;}
   else {turn -= 1;}







tanantunari

Mutta kun meitin sorvissa on karajarru, siinä kara lähtee pyörii eteen ja taakse kun vetää joystikistä ylös ja alas ja sivuille on jarru ja vapaa. Niin minkähänlainen pulssi anturi siihe tarvis olla ja sit joku lcd näyttö mistä näkis asteet. Ei varmaan maksaiskaa ihan mansikoita.

Kremmen

Lainaus käyttäjältä: Pete2 - 20.12.09 - klo:20:11
Nyt kun pyöritän encoderia kierrokset
vain kasvavat ja decimaali pisteen
jälkeen 0,on kun tieto suunnasta ei
päivity vaan on + kokoajan.

Muutokset että sain käännettyä ohjelmaan ja tietenkin
Lcd näytön sarjaväyläisestä tavalliseksi:

if (chC) {                              // olisko indeksisignaali just nyt päällä
      atIndex = true;
      encoder0Pos = 0;}
   else  if (cw) {turn +=1;}
   else {turn -= 1;}

Tuo ei noin kirjoitettuna toimi samalla tavalla, eikä itse asiassa ollenkaan. Menisikö tämä läpi sinun kääntäjästäsi:

if (chC) {
    atIndex = true;  // tätä ei itse asiassa nyt edes käytetä missään, joten voi jättää poiskin...
    encoder0Pos = 0;
    if (cw) {
        turn += 1;
    } else {
        turn -= 1;
    }
}


Koodinpätkän tarkoitus on indeksin tullessa asetta indeksitieto, nollata positolaskuri sekä liikkeen suunnasta riippuen joko kasvattaa tai vähentää kierroslaskuria.

Nothing sings like a kilovolt
Dr W. Bishop

Kremmen

Lainaus käyttäjältä: tanantunari - 20.12.09 - klo:21:17
Mutta kun meitin sorvissa on karajarru, siinä kara lähtee pyörii eteen ja taakse kun vetää joystikistä ylös ja alas ja sivuille on jarru ja vapaa. Niin minkähänlainen pulssi anturi siihe tarvis olla ja sit joku lcd näyttö mistä näkis asteet. Ei varmaan maksaiskaa ihan mansikoita.

No tässähän sinun laskuriasi koko ajan koodataan  ;D. Semmoinen anturi jota tässä nyt on käsitelty, eli kvadratuuri-inkrementtianturi kelpaisi hyvin.
Suuri, ehkä suurin haaste on julmettu resoluutiovaatimus pulssianturille. Veikkaan että homma todellisuudessa kaatuu tähän.
Seuraava suuri haaste on keksiä pulssianturille sopiva asennuspaikka. Välystä ei isommin passaisi olla, joten aika kiinteästi pitäisi saada karaan kiinni. "Helppo" tapa olisi laittaa karan jatkoksi, mutta kun siinä on se reikä keskellä ja joskus sieltä saattaa tulla rautaa läpi :).
Joku viritys pitää siis rakentaa, ehkä hammashihna tms jolla saa anturin pois karan akselilta. Tämmöisiin vaan tuppaa helposti syntymään periodisia kulmavirheitä jolloin reikiä tulee kyllä oikea määrä mutta jako on pikkaisen pielessä suuntaan ja toiseen kierroksen matkalla.
Tarkkuusvaatimusta voi arvioida vaikka tälleen: oletetaan että sorviin mahtuu sellainen kappale, että jakoympyrän max säde olisi 100mm. Sanotaan että jako halutaan satasen tarkkuudella. Kulmavirhettä saa silloin olla ~0,0001 radiaania eli noin 0,0057 astetta. Kiertokulman resoluutio pitää tällöin olla n. 62800 inkrementtiä / kierros. Ei mahdotonta, mutta jos tietäisit mitä tuollaiset anturit maksaa niin muuttuisit kalpeaksi kuin lakana.
Kaikkea voi viritellä ja varmaan tuohonkin löytyisi jotain konsteja, mutta ehdotan luopumaan. Hyvän mekaanisen jakopään saa murto-osalla tämmöisen keksinnäön kustannuksista vaikkei omalle työlle laskisi mitään.
Nothing sings like a kilovolt
Dr W. Bishop

Pete2

Nyt laskee täysiä kierroksia yhteen suuntaan,ei kymmenyksiä.
Encoderini antaa 400 p/k joten muutin ENCODER_RESOLUTION.

void doEncoder(){

int dA, dB, chC;

   chA = digitalRead(encoder0PinA); //OLETUS: TÄMÄ FUNKTIO ASETTAA ALIMMAN BITIN ARVOON 1/0 JA MUUT 0
   chB = digitalRead(encoder0PinB);

   dA = chA ^ chAPrev;
   dB = chB ^ chBPrev;

   // tsekataan kumpaan suuntaan inkrementti tuli ja päivitetään inkrementtilaskuri sen mukaan.
   // Otetaan välistä ulos suuntatieto muuttujaan cw
   cw = ((dA && (chA ^ chB)) || (dB && !(chA ^ chB)));
   encoder0Pos +=  cw - ((dA && !(chA ^ chB)) || (dB && (chA ^ chB)));

   chAPrev = chA;
   chBPrev = chB;

   chC = digitalRead(encoder0PinC);

   if (chC) {
    atIndex = true;  // tätä ei itse asiassa nyt edes käytetä missään, joten voi jättää poiskin...
    encoder0Pos = 0;
    if (cw) {
        turn += 1;
    } else {
        turn -= 1;
    }
}
}




Powered by EzPortal
SMF spam blocked by CleanTalk