Skocz do zawartości

Enkoder Pololu i odczyt impulsów.


MarCiu

Pomocna odpowiedź

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. 

 

Link do komentarza
Share on other sites

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...

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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)

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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) 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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..

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.