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
Enkoder a motor - PID regulácia
Re: Enkoder a motor - PID regulácia
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.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
Ří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.
Re: Enkoder a motor - PID regulácia
Ď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.
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.
Re: Enkoder a motor - PID regulácia
Stačí si prohlédnout tu tebou odkazovanou stránku http://learn.makeblock.com/makeblock-orion/, konkrétně tady je připojení motoru. 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.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.
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.
Re: Enkoder a motor - PID regulácia
Ď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:
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.
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--;
}
}
attachInterrupt(0, doEncoder, RISING); // encoDER ON PIN 2
Nie je je mi jasné, prečo to funguje aj takto.
Re: Enkoder a motor - PID regulácia
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).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.
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.