Enkoder a motor - PID regulácia

Odpovědět
tibordoma

Enkoder a motor - PID regulácia

Příspěvek od tibordoma »

Zdravím,

pre svoj projekt potrebujem realizovať PID reguláciu otáčok/rýchlosti motorčeka.
Mám k tomuto nasledovné súčasti.

1. Doska MakeBlock Orion postavená na báze Arduino Uno - http://learn.makeblock.cc/orion/ a http://learn.makeblock.cc/learn/images/ ... on_Pin.png . Prípadne môžem použiť Arduino, to by mi veľmi neprekážalo, ale s MakeBlock Orion sa robí dobre, nakoľko červené porty idú na 12V.

2. Motor s enkóderom - http://www.makeblock.cc/optical-encoder ... 6v-185rpm/

3. Enkóder driver - http://www.makeblock.cc/me-encoder-motor-driver/ - zapája sa do červeného portu MakeBlock Orion , potom je možné používať túto API pre ovládanie motora - http://learn.makeblock.cc/api-documenta ... der-motor/ - ja chcem ale vlastné PID riadenie, napríklad s použitím knižnice http://playground.arduino.cc/Code/PIDLibrary . Možno tento enkóder driver ani nebude treba.

Tu je ešte všeobecná knižnica pre MakeBlock - https://github.com/Makeblock-official/Makeblock-Library

Potrebujem zisťovať otáčky motora kvôli spätnej väzbe, aby som následne mohol dodávať správny akčný zásah do systému. Chcem sa spýtať, kde by bolo najlepšie začať. Momentálne neviem, na aký pin dodávať PWM signál a ako čítať aktuálne otáčky motora z enkódera - i keď to by v podstate mohlo byť realizované cez tú knižnicu, v tomto prípade mi to neprekáža.

Ďakujem za každú pomoc
MartinL
Příspěvky: 252
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Enkoder a motor - PID regulácia

Příspěvek od MartinL »

tibordoma píše:Zdravím,

pre svoj projekt potrebujem realizovať PID reguláciu otáčok/rýchlosti motorčeka.
Mám k tomuto nasledovné súčasti.

1. Doska MakeBlock Orion postavená na báze Arduino Uno - http://learn.makeblock.cc/orion/ a http://learn.makeblock.cc/learn/images/ ... on_Pin.png . Prípadne môžem použiť Arduino, to by mi veľmi neprekážalo, ale s MakeBlock Orion sa robí dobre, nakoľko červené porty idú na 12V.

2. Motor s enkóderom - http://www.makeblock.cc/optical-encoder ... 6v-185rpm/

3. Enkóder driver - http://www.makeblock.cc/me-encoder-motor-driver/ - zapája sa do červeného portu MakeBlock Orion , potom je možné používať túto API pre ovládanie motora - http://learn.makeblock.cc/api-documenta ... der-motor/ - ja chcem ale vlastné PID riadenie, napríklad s použitím knižnice http://playground.arduino.cc/Code/PIDLibrary . Možno tento enkóder driver ani nebude treba.

Tu je ešte všeobecná knižnica pre MakeBlock - https://github.com/Makeblock-official/Makeblock-Library

Potrebujem zisťovať otáčky motora kvôli spätnej väzbe, aby som následne mohol dodávať správny akčný zásah do systému. Chcem sa spýtať, kde by bolo najlepšie začať. Momentálne neviem, na aký pin dodávať PWM signál a ako čítať aktuálne otáčky motora z enkódera - i keď to by v podstate mohlo byť realizované cez tú knižnicu, v tomto prípade mi to neprekáža.

Ďakujem za každú pomoc
Vždyť to máš vše v těch tvých odkazech. Čísla pinů, kde je co připojené jsou v tom obrázku http://learn.makeblock.cc/learn/images/ ... on_Pin.png.
Řízení rychlosti motorů je už v knihovně vyřešené, viz. http://learn.makeblock.cc/api-documenta ... der-motor/. Na 99% procent uvnitř bude regulátor pravděpodobně typu PID (což není, ale žádné zaklínadlo).
Takže doporučuji podle typu dotazů, to nejdříve vyzkoušet dle výše uvedeného odkazu (je tam řízení rychlosti i polohy motoru, čtení enkodéru, ...) a pak si to případně udělat po svém až trochu pochopíš podstatu.
tibordoma

Re: Enkoder a motor - PID regulácia

Příspěvek od tibordoma »

Ďakujem za odpoveď. Môj hlavný problém je so zapojením motora na dosku. Tu sú piny motora - http://i.snag.gy/6c8Y1.jpg

Na meranie rýchlosti by mohol byť dobrý tento program: http://forum.arduino.cc/index.php?topic=158385.0

Som skôr programátor a čo sa týka Arduina, tak doteraz som robil len s jednoduchšími vecami, takže ako mám zapojiť na dosku tento motorček, aby to bolo správne, mi nie je celkom jasné. Asi bude jednoduchšie zapojiť ho na Arduino a nerobiť s tým MakeBlockom. Najmä MakeBlock encoder driver je čierna skrinka, nakoľko schéma zapojenia nie je dostupná. Síce by sa to dalo nejako zistiť podľa Makeblock knižnice a API pre motor ( http://learn.makeblock.cc/api-documenta ... der-motor/ ), jednoduchšie ale asi bude naozaj zapojiť ten motor na Arduino. Tu by som teda poprosil o radu.

Vízia je taká, že na PID algoritmus mi stačí, že správny pin motora dám na PWM pin a 2 piny z enkódera na piny na Arduine, ktoré podporujú prerušenia, keďže to je treba. Čo sa týka dopredného a spätného chodu, tak na moje účely stačí jeden smer.
MartinL
Příspěvky: 252
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Enkoder a motor - PID regulácia

Příspěvek od MartinL »

tibordoma píše:Ďakujem za odpoveď. Môj hlavný problém je so zapojením motora na dosku. Tu sú piny motora - http://i.snag.gy/6c8Y1.jpg

Na meranie rýchlosti by mohol byť dobrý tento program: http://forum.arduino.cc/index.php?topic=158385.0

Som skôr programátor a čo sa týka Arduina, tak doteraz som robil len s jednoduchšími vecami, takže ako mám zapojiť na dosku tento motorček, aby to bolo správne, mi nie je celkom jasné. Asi bude jednoduchšie zapojiť ho na Arduino a nerobiť s tým MakeBlockom. Najmä MakeBlock encoder driver je čierna skrinka, nakoľko schéma zapojenia nie je dostupná. Síce by sa to dalo nejako zistiť podľa Makeblock knižnice a API pre motor ( http://learn.makeblock.cc/api-documenta ... der-motor/ ), jednoduchšie ale asi bude naozaj zapojiť ten motor na Arduino. Tu by som teda poprosil o radu.

Vízia je taká, že na PID algoritmus mi stačí, že správny pin motora dám na PWM pin a 2 piny z enkódera na piny na Arduine, ktoré podporujú prerušenia, keďže to je treba. Čo sa týka dopredného a spätného chodu, tak na moje účely stačí jeden smer.
Stačí si prohlédnout tu tebou odkazovanou stránku http://learn.makeblock.com/makeblock-orion/, konkrétně tady je připojení motoru.
MBlock.png
MBlock.png (39.23 KiB) Zobrazeno 4606 x
Na motoru jsou to vývody M+, M-. Ale nevím jaké proudové nároky má ten tvůj motor, takže je nutné zkontrolovat, zda výstupy té Orion desky jsou schopny dát odpovídající proud.

Enkoder můžeš připojit třeba do "kostičky" 4. Vcc - 5V, GND - GND, A - 2, B - 8 s tím, že si tedy program napíšeš sám. (pro ty knihovny MBlocku nevím, kde to má být připojené). A ještě poznámka k tomu odkazu na programek pro čtení enkoderu, je to odstrašující příklad řešení - v přerušení odesílá polohu na seriový port. Obsluha přerušení musí být co nejkratší (časově), aby se neztrácely požadavky na přerušení. Takto to při vyšší rychlostí určitě bude vypadávat.

Ještě jsem se koukl na ten Me Encoder Motor Driver http://learn.makeblock.com/me-encoder-motor-driver/ a tam to máš všechno úplně hotové, včetně PID regulátoru. Stačí připojit třeba na kostičku 1, k modulku motor a enkodér:
M+, M-, GND, 5V, ENC1 - A, ENC2 - B. Pokud ho tedy vlastníš, tak není co řešit.
tibordoma

Re: Enkoder a motor - PID regulácia

Příspěvek od tibordoma »

Ďakujem za pomoc. Kúpil som si Arduino Motor Shield a všetko funguje, ako má. Program na stránke http://forum.arduino.cc/index.php?topic=158385.0 meria rýchlosť pomocou enkódera, použil som PID knižnicu a aj tá funguje.

Mám otázku ohľadne kódu na meranie rýchlosti:

Kód: Vybrat vše

#define encoder0PinA  2
#define encoder0PinB  4

volatile long encoder0Pos=0;
long newposition;
long oldposition = 0;
unsigned long newtime;
unsigned long oldtime = 0;
long vel;

void setup()
{
  pinMode(encoder0PinA, INPUT);
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT);
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor
  attachInterrupt(0, doEncoder, RISING);  // encoDER ON PIN 2
  Serial.begin (9600);
  Serial.println("start");                // a personal quirk
}

void loop()
{
newposition = encoder0Pos;
newtime = millis();
vel = (newposition-oldposition) * 1000 /(newtime-oldtime);
Serial.print ("speed = ");
Serial.println (vel);
oldposition = newposition;
oldtime = newtime;
delay(250);
}

void doEncoder()
{
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }
}
Nemalo by byť tuto namiesto čísla 0 číslo 2?
attachInterrupt(0, doEncoder, RISING); // encoDER ON PIN 2

Nie je je mi jasné, prečo to funguje aj takto.
MartinL
Příspěvky: 252
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Enkoder a motor - PID regulácia

Příspěvek od MartinL »

tibordoma píše: Nemalo by byť tuto namiesto čísla 0 číslo 2?
attachInterrupt(0, doEncoder, RISING); // encoDER ON PIN 2

Nie je je mi jasné, prečo to funguje aj takto.
Ne, je to v pořádku. Vstupy externího přerušení jsou fyzicky na pinech 2 a 3. Ale jsou označovány jako externí přerušení 0 a 1. (0 je na pinu 2, 1 na pinu 3).
Je potřeba rozlišovat číslování pinů a označování jiných funkcí. Tohle je trošku problém u arduina, že tyto niance zakrývá. To začátečníkům sice usnadňuje první kroky, ale možná ztěžuje ty následující :(
Pokud si vezmete datasheet od AVR ATmega328 (která je např. v Adruinu Uno), tak tam je to vše popsáno.
Odpovědět