- Schéma zapojenia
- Generovanie signálov PWM na kolíku GPIO pre riadenie servomotora
- Programovanie PIC16F8771A pre robotické rameno
- Simulácia kódu PIC robotického ramena
- Dizajn DPS pomocou EasyEDA
- Výpočet a objednávanie vzoriek online
- Pracovanie robotického ramena PIC
Od montážnej linky automobilového priemyslu až po kozmické roboty vo vesmíre sa robotické zbrane nachádzajú všade. Mechanizmy týchto robotov sú podobné človeku, ktorého je možné naprogramovať na podobnú funkciu a zvýšenie schopností. Môžu byť použité na vykonávanie opakovaných akcií rýchlejšie a presnejšie ako ľudia alebo môžu byť použité v drsnom prostredí bez rizika ľudského života. Už sme vytvorili robotické rameno Record and Play pomocou Arduina, ktoré by bolo možné vyškoliť na vykonanie konkrétnej úlohy a navždy opakovať.
V tomto tutoriále použijeme priemyselný štandardný 8-bitový mikrokontrolér PIC16F877A na ovládanie rovnakého robotického ramena potenciometrami. Výzvou tohto projektu je, že PIC16F877A má iba dva piny schopné PWN, ale musíme ovládať asi 5 servomotorov nášho robota, ktoré vyžadujú 5 jednotlivých PWM pinov. Musíme teda využiť GPIO piny a generovať PWM signály na PIC GPIO pinoch pomocou časovacích prerušení. Teraz by sme samozrejme mohli upgradovať na lepší mikrokontrolér alebo použiť integrovaný obvod de-multiplexora, aby sme to tu podstatne uľahčili. Stále však stojí za to vyskúšať tento vzdelávací zážitok.
Mechanická štruktúra robotického ramena, ktorú používam v tomto projekte, bola úplne vytlačená 3D pre môj predchádzajúci projekt; kompletné konštrukčné súbory a postup montáže nájdete tu. Ak nemáte 3D tlačiareň, môžete si tiež zostaviť jednoduché robotické rameno pomocou kartónov, ktoré sú zobrazené v odkaze. Za predpokladu, že ste sa nejako zmocnili svojho robotického ramena, pokračujte v projekte.
Schéma zapojenia
Kompletná schéma zapojenia tohto robotického ramena založeného na mikrokontroléri PIC je uvedená nižšie. Schémy boli nakreslené pomocou programu EasyEDA.
Schéma zapojenia je dosť jednoduchá; celý projekt je napájaný z 12V adaptéra. Toto 12V sa potom prevedie na + 5V pomocou dvoch regulátorov napätia 7805. Jeden je označený ako + 5V a druhý je označený ako + 5V (2). Dôvod pre vznik dvoch regulátorov je ten, že keď sa servo točí, priťahuje veľa prúdu, čo vedie k poklesu napätia. Tento pokles napätia prinúti PIC sa znovu reštartovať, a preto nemôžeme prevádzkovať PIC aj servomotory na rovnakej koľajnici + 5 V. Ten, ktorý je označený ako + 5 V, sa teda používa na napájanie mikrokontroléra PIC, LCD a potenciometrov a samostatný výstup regulátora, ktorý sa označuje ako + 5 V (2), sa používa na napájanie servomotorov.
Päť výstupných pinov potenciometrov, ktoré poskytujú premenlivé napätie od 0 V do 5 V, je pripojených k analógovým pinom An0 až AN4 PIC. Pretože plánujeme použitie časovačov na generovanie PWM, môžu byť servomotory pripojené k ľubovoľnému pinu GPIO. Pre servomotory som vybral piny RD2 až RD6, ale môže to byť akýkoľvek GPIO podľa vášho výberu.
Pretože program vyžaduje veľa ladenia, je k portu B rozhrania PIC pripojený aj displej LCD 16 x 2. Toto zobrazí pracovný cyklus servomotorov, ktoré sú riadené. Okrem toho som tiež rozšíril pripojenie pre všetky GPIO a analógové piny, pre prípad, že by bolo potrebné v budúcnosti prepojiť nejaké snímače. Nakoniec som tiež pripojil pin H1 programátora na priame programovanie PIC s pickit3 pomocou možnosti programovania ICSP.
Generovanie signálov PWM na kolíku GPIO pre riadenie servomotora
Keď je obvod pripravený, musíme prísť na to, ako generovať signály PWN na pinu GPIO PIC na riadenie servomotora. Niečo podobné sme už unavili metódou prerušenia Timer a boli sme úspešní. Tu nadstavíme iba to, takže ak ste tu nový, dôrazne vám odporúčam prečítať si tento predchádzajúci návod skôr, ako budete pokračovať.
Všetky hobby servomotory pracujú s frekvenciou 50Hz. To znamená, že jeden kompletný impulzný cyklus pre servomotor bude 1/50 (F = 1 / T), čo je 20ms. Z tejto úplnej 20ms je riadiaci signál iba od 0 do 2ms, zatiaľ čo zvyšok signálu je vždy vypnutý. Na nasledujúcom obrázku je znázornené, ako sa doba zapnutia mení iba od 0 do 2 ms, aby sa motor otočil z 0 stupňov na 180 stupňov z celkovej doby trvania 20 ms.
S ohľadom na to musíme program napísať tak, aby PIC čítal od 0 do 1204 z potenciometra a mapoval ho na 0 až 100, čo bude pracovný cyklus servomotora. Pomocou tohto pracovného cyklu môžeme vypočítať čas zapnutia servomotora. Potom môžeme inicializovať prerušenie časovača na pretečenie v pravidelnom intervale tak, aby fungovalo podobne ako funkcia millis () v Arduine. Pomocou toho môžeme prepnúť stavový GPIO pin na vysoký na požadovanú dobu a vypnúť ho po 20ms (jeden kompletný cyklus) a potom opakovať ten istý proces. Teraz, keď sme pochopili logiku, poďme sa dostať do programu.
Programovanie PIC16F8771A pre robotické rameno
Celý program s videom nájdete ako vždy na konci tejto stránky, odtiaľ si tiež môžete stiahnuť kód so všetkými potrebnými súbormi. V tejto časti sa budeme zaoberať logikou programu. Program využíva na riadenie robotického ramena modul ADC, časovač a modul LCD. Ak neviete, ako používať funkcie ADC alebo Timer alebo prepojiť LCD s PIC, môžete sa naučiť príslušné odkazy. Nasledujúce vysvetlenie je dané za predpokladu, že čitateľ je oboznámený s týmito pojmami.
Konfigurácia portu s časovačom 0
Najdôležitejšou časťou kódu je nastavenie časovača 0 na nadmerný tok pre každé konkrétne oneskorenie. Vzorce na výpočet tohto oneskorenia môžu byť dané ako
Oneskorenie = ((256-REG_val) * (Prescal * 4)) / Fosc
Použitím registra OPTION_REG a TMR0 sme nastavili časovač 0 tak, aby pracoval s predkalárnou hodnotou 32 a REG val je nastavený na 248. Kryštálová frekvencia (Fosc) použitá v našom hardvéri je 20 MHz. S týmito hodnotami možno oneskorenie vypočítať ako
Oneskorenie = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 sekúnd (alebo) = 0,05 ms
Teraz sme teda nastavili časovač na pretečenie každých 0,05 ms. Kód, ktorý urobí to isté, je uvedený nižšie
/ ***** Konfigurácia portu pre časovač ****** / OPTION_REG = 0b00000100; // Timer0 s externými frekvenciami a 32 ako predkallar // Tiež umožňuje PULL UPs TMR0 = 248; // Načítanie časovej hodnoty za 0,0001 s; delayValue môže byť medzi 0-256 iba TMR0IE = 1; // Povoliť bit prerušenia časovača v registri PIE1 GIE = 1; // Povoliť globálne prerušenie PEIE = 1; // Povoliť prerušenie periférie / *********** ______ *********** /
Z celkového rozsahu 0 až 2 ms ovládacieho okna servomotora ho môžeme ovládať s rozlíšením 0,05 ms, čo nám umožňuje mať (2 / 0,05) 40 rôznych pozícií pre motor v rozmedzí od 0 do 180 stupňov. Túto hodnotu môžete ešte znížiť, ak by ju vaša jednotka MCU mohla podporovať, aby získala viac pozícií a presnejšiu kontrolu.
Rutina prerušenia služby (ISR)
Teraz, keď máme nastavený časovač 0 na nadmerný tok každých 0,05 ms, budeme mať príznak prerušenia TMR0IF nastavený na 0,05 ms. Takže vo vnútri funkcie ISR môžeme resetovať tento príznak a zvýšiť premennú nazvanú count o jednu. Teraz sa teda táto premenná zvýši o 1 na každých 0,05 ms.
void interrupt timer_isr () { if (TMR0IF == 1) // Bol spustený príznak časovača kvôli pretečeniu časovača -> nastavený na pretečenie každých 0,05ms { TMR0 = 248; // Načítanie časovača Hodnota TMR0IF = 0; // Vymazať počet príznakov prerušenia časovača ++; // Počítajte prírastky o 1 na každých 0,05 ms }
Výpočet prevádzkového cyklu a času
Ďalej musíme vypočítať pracovný cyklus a čas pre všetkých päť servomotorov. Máme päť servomotorov, z ktorých každý sa používa na riadenie jednotlivých častí ramena. Musíme teda prečítať hodnotu ADC všetkých piatich a pre každú vypočítať pracovný cyklus a včas.
Hodnota ADC bude v rozmedzí od 0 do 1024, ktorú je možné previesť na pracovný cyklus 0% až 100% jednoduchým vynásobením hodnoty 0,0976 (100/1024 = 0,0976) a získanej hodnoty. Tento pracovný cyklus 0 až 100% sa musí potom previesť na čas ZAPNUTIA. Vieme, že pri 100% pracovnom cykle musí byť doba zapnutia 2ms (pre 180 stupňov), takže vynásobením 0,02 (2/100 = 0,02) sa prevádza 0 až 100 pracovný cyklus na 0 až 2ms. Ale potom je náš počet premenných časovača nastavený na zvýšenie raz za každých 0,05ms. To znamená, že hodnota počítania bude 20 (1 / 0,05 = 20) za každú 1ms. Takže musíme vynásobiť 20 a 0,02, aby sme vypočítali presný čas pre náš program, ktorý nám dá hodnotu 0,4 (0,02 * 20 = 0,4). Kód toho istého je uvedený nižšie, môžete ho vidieť opakovať 5-krát pre všetkých 5 hrncov pomocou cyklu for. Výsledné hodnoty sú uložené v poli T_ON.
pre (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // Načítaj hodnotu POT pomocou ADC Duty_cycle = (POT_val * 0,0976); // Mapa 0 až 1024 až 0 až 100 T_ON = Duty_cycle * 0,4; // 20 * 0,02
Výber motora, ktorý sa má otáčať
Nemôžeme riadiť všetkých päť motorov súčasne, pretože to spôsobí, že kód ISR bude ťažko brzdiť celý mikrokontrolér. Musíme teda otáčať naraz iba jeden servomotor. Ak chcete zvoliť, ktoré servo sa má otáčať, mikrokontrolér monitoruje čas zapnutia všetkých piatich servomotorov a porovnáva ho s predchádzajúcim včas. Pokiaľ dôjde k zmene času ZAPNUTIA, môžeme dospieť k záveru, že dané servo musí byť presunuté. Kód rovnakého kódu je uvedený nižšie.
if (T_ON! = Pev_val) { Lcd_Clear (); servo = pot_num; Lcd_Set_Cursor (2,11); Lcd_Print_String ("S:"); Lcd_Print_Char (servo + '0'); if (pot_num == 0) {Lcd_Set_Cursor (1,1); Lcd_Print_String ("A:");} else if (pot_num == 1) {Lcd_Set_Cursor (1,6); Lcd_Print_String ("B:");} else if (pot_num == 2) {Lcd_Set_Cursor (1,11); Lcd_Print_String ("C:");} else if (pot_num == 3) {Lcd_Set_Cursor (2,1); Lcd_Print_String ("D:");} else if (pot_num == 4) {Lcd_Set_Cursor (2,6); Lcd_Print_String ("E:");} char d2 = (Duty_cycle)% 10; char d1 = (Duty_cycle / 10)% 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
Na LCD obrazovku tiež tlačíme pracovný cyklus serva, aby si užívateľ mohol byť vedomý svojej aktuálnej polohy. Na základe zmeny času ZAPNUTIA sa variabilné servo aktualizuje o čísla od 0 do 4, z ktorých každé predstavuje jednotlivé motory.
Ovládanie servomotora vo vnútri ISR
Vo vnútri ISR máme počet premenných, ktoré sa zvyšujú každých 0,05 ms, čo znamená, že za každých 1 ms sa premenná zvýši o 20. Pomocou toho musíme ovládať piny, aby produkovali signál PWM. Ak je hodnota počtu menšia ako čas zapnutia, potom sa pomocou nižšie uvedeného riadku zapne GPIO tohto motora
PORTD = PORTD - servo_code;
Tu má pole servo_code podrobnosti o kolíku všetkých piatich servomotorov a na základe hodnoty v premennom servu sa použije kód pre tento konkrétny servomotor. Potom je logicky OR (-) s existujúcimi bitmi PORTD, aby sme nenarušili hodnoty iného motora a neaktualizovali iba tento konkrétny motor. Podobne na vypnutie čapu
PORTD = PORTD & ~ (servo_code);
Bitovú hodnotu sme obrátili pomocou operátora logickej inverzie (~) a potom sme vykonali operáciu AND (&) na PORTD, aby sme vypli iba požadovaný pin, zatiaľ čo ostatné piny sme ponechali v predchádzajúcom stave. Celý útržok kódu je uvedený nižšie.
void interrupt timer_isr () { if (TMR0IF == 1) // Bol spustený príznak časovača kvôli pretečeniu časovača -> nastavený na pretečenie každých 0,05ms { TMR0 = 248; // Načítanie časovača Hodnota TMR0IF = 0; // Vymazať počet príznakov prerušenia časovača ++; // Počítajte prírastky o 1 za každých 0,05ms -> počet bude 20 za každých 1ms (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; if (počet> = 20 * 20) počet = 0; if (počet <= (T_ON)) PORTD = PORTD - servo_code; else PORTD = PORTD & ~ (servo_code); }
Vieme, že celkový cyklus musí trvať 20 ms, kým sa znova nezapne pin GPIO. Takže skontrolujeme, či počet prekročil 20ms porovnaním hodnoty count s 400 (rovnaký výpočet ako je diskutovaný vyššie) a ak áno, musíme počet inicializovať, aby bol opäť nulový.
Simulácia kódu PIC robotického ramena
Pred zavedením na skutočný hardvér je vždy lepšie simulovať kód. Použil som teda Proteus na simuláciu môjho kódu a overil som si, že funguje správne. Obvod použitý na simuláciu je zobrazený nižšie. Použili sme osciloskop na kontrolu, či sa podľa potreby generujú signály PWM. Tiež môžeme overiť, či sa LCD a servomotory otáčajú podľa očakávania.
Ako vidíte, LCD zobrazuje pracovný cyklus motora D na hodnotu 07 na základe hodnoty potenciálu, ktorou je 3. motor. Podobne, ak sa pohne iným hrncom, na LCD sa zobrazí pracovný cyklus hrnca a číslo jeho motora. Signál PWM zobrazený na osciloskope je uvedený nižšie.
Celková perióda cyklu sa zmeria na 22,2 ms pomocou možnosti kurzora na osciloskope, ktorá je veľmi blízko požadovaných 20 ms. Nakoniec sme si istí, že kód funguje, takže aby sme mohli pokračovať v zapojení, môžeme ho buď spájkovať na doske perf, alebo použiť dosku plošných spojov. Na nepájivom poli to nebude fungovať ľahko, pretože POT má vždy tendenciu spôsobovať problémy kvôli zlému pripojeniu.
Dizajn DPS pomocou EasyEDA
Na návrh tohto robotického ramena PIC sme si vybrali online nástroj EDA s názvom EasyEDA. Používam ho už dlho a považujem ho za veľmi vhodný pre svoju obrovskú dostupnosť stopy a ľahko použiteľnú prírodu. Po dizajne DPS si môžeme objednať vzorky DPS prostredníctvom ich lacných služieb výroby DPS. Ponúkajú tiež službu sourcingu komponentov, kde majú veľkú zásobu elektronických komponentov a používatelia si môžu objednať požadované komponenty spolu s objednávkou PCB.
Pri navrhovaní vašich obvodov a dosiek plošných spojov môžete tiež zverejniť svoje návrhy obvodov a dosiek plošných spojov, aby ich ostatní používatelia mohli kopírovať alebo upravovať a využívať tak výhody vašej práce. Pre tento obvod sme tiež zverejnili celé naše usporiadania obvodov a dosiek plošných spojov, skontrolujte odkaz nižšie:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
Pomocou tohto odkazu môžete priamo objednať tú istú DPS, ktorú používame v tomto projekte, a použiť ju. Po dokončení návrhu je možné dosku považovať za 3D model, ktorý veľmi pomôže pri vizualizácii toho, ako by sa doska po výrobe javila. 3D model dosky, ktorú používame, je zobrazený nižšie. Okrem toho si môžete tiež prezrieť hornú a spodnú vrstvu dosky a skontrolovať, či je hladká obrazovka podľa očakávania.
Výpočet a objednávanie vzoriek online
Po dokončení návrhu tohto PCB robota PIC si môžete objednať PCB cez JLCPCB.com. Na objednanie DPS od JLCPCB potrebujete Gerber File. Ak chcete stiahnuť súbory Gerber z vašej PCB, jednoducho kliknite na tlačidlo Generovať súbor výroby na stránke editora EasyEDA, odtiaľ si stiahnite súbor Gerber alebo kliknite na Objednávku na JLCPCB, ako je to znázornené na obrázku nižšie. To vás presmeruje na JLCPCB.com, kde si môžete zvoliť počet DPS, ktoré chcete objednať, koľko medených vrstiev potrebujete, hrúbku DPS, hmotnosť medi a dokonca aj farbu DPS, ako je to na nasledujúcom obrázku:
Po výbere všetkých možností kliknite na „Uložiť do košíka“ a dostanete sa na stránku, kde môžete nahrať váš súbor Gerber, ktorý sme si stiahli z EasyEDA. Nahrajte svoj súbor Gerber a kliknite na tlačidlo „Uložiť do košíka“. A nakoniec kliknite na Checkout Securely pre dokončenie objednávky, potom dostanete svoje PCB o pár dní neskôr. Vyrábajú PCB za veľmi nízku cenu, čo sú 2 doláre. Ich doba výroby je tiež veľmi krátka, čo je 48 hodín s dodávkou DHL 3 - 5 dní, v podstate dostanete PCB do týždňa od objednania.
Po objednaní DPS môžete skontrolovať priebeh výroby DPS s dátumom a časom. Skontrolujete to tak, že prejdete na stránku Účet a kliknete na „Produkčný pokrok“.
Po niekoľkých dňoch objednania DPS som dostal vzorky DPS v peknom obale, ako je znázornené na obrázkoch nižšie.
A po získaní týchto kúskov som všetky potrebné komponenty nadpájal na DPS. Tiež som priamo spájkoval POT namiesto použitia pripájacích vodičov, pretože vodiče zo samice do samice som pôvodne používal tam, kde som dával zvláštne analógové výstupné napätia pravdepodobne kvôli uvoľneným kontaktom. Len čo boli všetky komponenty zmontované, moja doska plošných spojov vyzerala asi takto.
Možno ste si všimli, že na tejto doske je iba jedna 7805. Je to preto, že som si spočiatku myslel, že by mi mohol uniknúť iba regulátor na napájanie PIC aj servomotora, a neskôr som si uvedomil, že potrebujem dva. Použil som teda externý obvod na napájanie servomotorov cez zelené vodiče, ktoré tu vidíte.
Nemusíte sa s tým však veľmi trápiť, pretože; Teraz som vykonal zmeny na DPS. Môžete využiť upravené PCB a spájkovať oba regulátory na samotnej doske.
Pracovanie robotického ramena PIC
Po všetkých únavných prácach je čas na vyplatenie. Spájkujte všetky komponenty na doske a program nahrajte do PIC radiča. Kompletný kód je uvedený nižšie alebo si ho môžete stiahnuť tu. Programovací konektor poskytnutý na doske by vám mal pomôcť nahrať program priamo pomocou Pickit 3 bez väčších problémov. Akonáhle je program nahraný, mali by ste vidieť LCD displej zobrazujúci servo, ktoré je práve ovládané. Ak sa chcete dozvedieť viac informácií o programovaní mikrokontroléra PIC, postupujte podľa predchádzajúceho návodu.
Odtiaľ môžete hrniec jednoducho otočiť a skontrolovať, ako servomotory reagujú na každý potenciometer. Keď pochopíte formát, môžete ovládať robotické rameno tak, aby vykonávalo činnosti potrebné na zábavu a zábavu. Nájdete kompletné spracovanie projektu vo videu odkazujeme nižšie.
To je to, že chlapci dúfajú, že ste pochopili projekt a dozvedeli sa z neho niečo nové. Ak máte akékoľvek otázky, nechajte ich v sekcii komentárov alebo použite fóra na ďalšie technické diskusie.