Skocz do zawartości

Enkoder Pololu i odczyt impulsów.


Pomocna odpowiedź

Napisano

Witam całe grono 🙂

Jestem dość zielony w dziedzinie robotyki. Ale zawsze chciałem coś sobie "zbudować".

Ale jak zawsze teoria w głowie, jaki problem. Tu połączy się tym, napisze się tak i będzie wszystko działać... Niestety i tu zderzenie się z rzeczywistością, rozbija problem na 1000 kawałeczków 🙂

A więc tak. Zakupiłem sobie silniki z kołami. Żadne cudo, te zwykłe chińskie kontowe żółtki, Enkodery Pololu - te maleństwa zielone (niby 12 polowe). Sterownik silników Monster Motor Shield. Czujnik ultra dźwiękowy... I tak sobie dłubię i poznaję co się z czym je.

Ale właśnie mam trochę niejasności i wątpliwości związane z enkoderem i mam nadzieję że mi trochę rozjaśnicie w głowie i wyjaśnicie.

Encoder to ten: Enkoder . 

Napisałem procedurę odczytu impulsów:

volatile int encoder;
byte flag;

byte encoderA = 2;
byte encoderB = 10;

void ISR_cap(){
  Serial.print("*");
}

void setup() {
  Serial.begin(115200);
  pinMode(encoderA, INPUT);
  pinMode(encoderB, INPUT);
  attachInterrupt(digitalPinToInterrupt(encoderA), ISR_cap, FALLING);
}

void loop() {
}

W wyniku tego. Po pełnym obrocie osi, dostaję tylko TRZY "*"...
Więc wychodziło by, że nie jest to 12 polowy enkoder, tylko 6 polowy (trzy na kanał)? A przynajmniej jak to tak rozumiem.

Teraz pytanie Jak wykorzystać drugi kanał? Wiem jak podpiąć kanał "B" do zwykłego cyfrowego wejścia i uzyskać wartości "+", "-". Wiem jak podpiąć wejście B do drugiego pinu przerwania i mieć dwie procedury - wtedy mam odczyt SZEŚCIU "*".  Za nic 12!

Tylko jest problem, jak wtedy użyć drugi enkoder na drugi silnik. Próbowałem podłączyć oba wyjścia A i B do jednego wejścia INT, poprzez diody schottky'ego, tworząc taką bramkę OR. Teoretycznie powinno to dać impuls i z tego i z tego enkodera. Niestety nic to nie dało. 

 

Musisz tez chyba odczytac drugi pin encodera...wtedy bedzie 6...chociaz o ile sie nie zakrecilem to jesli twoj enkoder jest jakby 12 "krokowy" to w sumie zawiera sie na obrot 48 roznych kombinacji...(4 na jeden "cykl"...00/01/11/10 itp) 

Po drugie nie musisz uzywac przerwan Int...sa jeszcze PCInt ktore wystepuja na wiekszosci pinow...jest gotowa bibliotek, obsluga wyglada tak samo...

(edytowany)
17 minut temu, farmaceuta napisał:

jesli twoj enkoder jest jakby 12 "krokowy"

Jak podłączysz oba piny do przerwań to będzie 12-krokowy. Przy pojedynczym przerwaniu będzie 6-krokowy. Polecam zastanowić się, dlaczego.

A w ogóle warto wiedzieć jak działa enkoder inkrementalny - choćby zerknąć tutaj

  

12 godzin temu, MarCiu napisał:

wtedy mam odczyt SZEŚCIU "*".  Za nic 12


Jak zmienisz FALLING na CHANGE to będziesz miał 12.

A przy okazji: w procedurach przerwań nie wsadza się żadnych serial.cośtam().

 

 

Edytowano przez ethanak
  • Lubię! 1
9 minut temu, ethanak napisał:

Jak podłączysz oba piny do przerwań to będzie 12-krokowy. Przy pojedynczym przerwaniu będzie 6-krokowy.

i ja dosonale o tym wiem...😉 ja i trzeba zastosowac CHANGE o czym wspomniales zeby wykryc zbocza opadajace i rosnace..

byte AInput = 2;
byte BInput = 4;
 
byte lastState = 0;
byte steps = 0;
int  cw = 0;
byte AState = 0;
byte BState = 0;
byte State = 0;
 
void setup() {
  Serial.begin(9600);
  pinMode(AInput, INPUT_PULLUP);
  pinMode(BInput, INPUT_PULLUP);
    pinMode(3, OUTPUT);
    digitalWrite(3, LOW);
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);

}
 
void loop() {
  // read the input pin:
  AState = digitalRead(AInput);
  BState = digitalRead(BInput) << 1;
  State = AState | BState;
  

  if (lastState != State){
    switch (State) {
      case 0:
        if (lastState == 2){
          steps++;
          cw = 1;
        }
        else if(lastState == 1){
          steps--;
          cw = -1;
        }
        break;
      case 1:
        if (lastState == 0){
          steps++;
          cw = 1;
        }
        else if(lastState == 3){
          steps--;
          cw = -1;
        }
        break;
      case 2:
        if (lastState == 3){
          steps++;
          cw = 1;
        }
        else if(lastState == 0){
          steps--;
          cw = -1;
        }
        break;
      case 3:
        if (lastState == 1){
          steps++;
          cw = 1;
        }
        else if(lastState == 2){
          steps--;
          cw = -1;
        }
        break;
    }
  //  Serial.print(cw);
 
       Serial.println(steps);

  }
 
  lastState = State;
  
  
  delay(1);
}

wyprobuj ten kod zeby sie upewnic ostatecznie jaki enkoder masz...bo ja ostatnio mialem wielki problem i okazalo sie ze moj enkoder jest jakby troj-impulsowy na cykl czego dowiedzialem sie dopiero po podlaczeniu diod i sprawdzaniu jakie sekwencje z niego ida...(jais niestandardowy strasznie)

17 minut temu, ethanak napisał:

Akurat enkoder o którym wspomniał @MarCiu jest typowy (wiem bo stosowałem).

A te moje dziady to takie jak do myszki...kupilem na ali za pare zl 5 sztuk o tak zeby miec i sie okazalo po 2-dniowej walce, ze sekwencja wyglada tak...11/10/00...czyli dla A-11/0/11/0/11/0..dla B- 00/1/00/1/00/1

  • Lubię! 1

Dzięki Panowie za interesowanie 🙂

Tak wiem, że przerwanie powinno być jak najszybsze i wstawianie w niego "Seriala" nie jest dobrym pomysłem. Ale w tym przypadku tylko o zobrazowanie chodziło, czy przerwanie działa. A szybkość działania ograniczała się do ręcznego, powolnego obracania enkodera. Więc procesor raczej umierał z nudów 🙂

Faktycznie Zmiana wyzwolenia na CHANGE daje 6 gwiazdek (Na kanał), czyli jest faktycznie 12 polowy.

Wgrany zamieszczony kod to potwierdza. Arduino liczy do 12. Dzięki @farmaceuta za kod testowy 🙂

Wertując internety, w poszukiwaniu jakichś opisów robotów,  na github'ie znalazłem opis robota, który wykorzystuje bramki XOR, za pomocą których podłączone są oba wyjścia enkodera pod jednego INTa. Zamówiłem bramki i sprawdzę jak to będzie wyglądało w praktyce.

Na razie czytam, szukam i podpatruje, aby coś się pouczyć 🙂

 

  • Lubię! 1
8 minut temu, MarCiu napisał:

który wykorzystuje bramki XOR, za pomocą których podłączone są oba wyjścia enkodera pod jednego INTa. Zamówiłem bramki i sprawdzę jak to będzie wyglądało w praktyce.

Mozna i tak kombinowac...(z naciskiem na kombinowac)😉 generalnie jednak proponowal bym Ci zrobic tak jak juz wspomnialem...biblioteka PCInt, podpinasz dwa piny, w obsludze przerwania podajesz ta sama funkcje i wrzucasz do niej ten "moj" kod, i ustawiasz CHANGE oczywiscie dla obu przerwan...i gotowe😉 (5-10min z pobraniem biblioteki i po problemie) 

(edytowany)

LTR4206E

17 minut temu, farmaceuta napisał:

Mozna i tak kombinowac...(z naciskiem na kombinowac)😉 generalnie jednak proponowal bym Ci zrobic tak jak juz wspomnialem...biblioteka PCInt, podpinasz dwa piny, w obsludze przerwania podajesz ta sama funkcje i wrzucasz do niej ten "moj" kod, i ustawiasz CHANGE oczywiscie dla obu przerwan...i gotowe😉 (5-10min z pobraniem biblioteki i po problemie) 

Dzięki. Wieczorem spróbuję. Widać już stary w myśleniu jestem 😉 wydawało mi się, co sprzętowe rozwiązanie to sprzętowe 😄

Aha a któraś konkretna biblioteka PCINTA będzie najlepsza, coś możesz polecić? Widzę różne są.

Edytowano przez MarCiu

Ewentualnie zastanowić się, czy 6 impulsów na obrót silnika przypadkiem nie wystarczy (w końcu te silniczki mają jakieś tam przełożenie i na obrót koła wychodzi już dość dużo) - wtedy podpinasz tylko pin A pod przerwanie (czyli jak masz dwa enkodery to wykorzystujesz tylko dwa piny do przerwań, a tyle akurat masz). Pin B podpinasz do dowolnego innego pinu i aplikujesz odpowiednią procedurę zliczania w przerwaniu.

 

  • Lubię! 1
1 godzinę temu, MarCiu napisał:

Aha a któraś konkretna biblioteka PCINTA będzie najlepsza, coś możesz polecić? Widzę różne są.

No ja korzystalem z tej wersji...(testowo co prawda, ale dzialalo wporzadku bez ceregieli).. https://github.com/NicoHood/PinChangeInterrupt/tree/master/examples

mozna tez tak jak kolega @ethanak wspomnial...jezeli nie potrzebujesz mega wielkiej rozdzielczosci to tez mozna pojechac na jednym pinie..

Dzięki.

Niestety silniki nie mają przedłużonych wałów i enkodery mam założone na osi wyjściowej (po drugiej stronie osi koła). Więc już i tak mam tylko 12 impulsów na obrót.

Ale już wiem że nie tędy droga i z tym ciężko będzie cokolwiek zrobić. Ale myślałem, że choć do testów wystarczy... Ot początki i macanie z zamkniętymi drogami.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...