- Kruhový diagram
- Generování signálů PWM na pinu GPIO pro řízení servomotoru
- Programování PIC16F8771A pro robotické rameno
- Simulace kódu PIC Robotic Arm
- Návrh desek plošných spojů pomocí EasyEDA
- Výpočet a objednávání vzorků online
- Práce s robotickým ramenem PIC
Od montážních linek v automobilovém průmyslu až po telesochirurgické roboty ve vesmíru se Robotic Arms nacházejí všude. Mechanismy těchto robotů jsou podobné člověku, kterého lze naprogramovat na podobnou funkci a zvýšené schopnosti. Mohou být použity k provádění opakovaných akcí rychleji a přesněji než lidé, nebo mohou být použity v drsném prostředí bez rizika lidského života. Již jsme pomocí Arduina vytvořili robotickou ruku Record and Play, která by mohla být vycvičena k provádění konkrétního úkolu a navždy opakována.
V tomto tutoriálu použijeme průmyslový standard 8bitový mikrokontrolér PIC16F877A k ovládání stejného robotického ramene potenciometry. Úkolem tohoto projektu je, že PIC16F877A má pouze dva piny schopné PWN, ale musíme pro našeho robota ovládat asi 5 servomotorů, které vyžadují 5 jednotlivých PWM pinů. Musíme tedy využít piny GPIO a generovat PWM signály na PIC GPIO piny pomocí časových přerušení. Nyní bychom samozřejmě mohli upgradovat na lepší mikrokontrolér nebo použít IC de-multiplexeru, abychom to tady mnohem usnadnili. Ale i tak stojí za to vyzkoušet tento projekt s výukovou zkušeností.
Mechanická struktura robotického ramene, kterou používám v tomto projektu, byla kompletně 3D vytištěna pro můj předchozí projekt; kompletní konstrukční soubory a postup montáže najdete zde. Alternativně, pokud nemáte 3D tiskárnu, můžete také vytvořit jednoduchou robotickou ruku pomocí kartonů, jak je uvedeno v odkazu. Za předpokladu, že jste se nějakým způsobem zmocnili svého robotického ramene, pokračujte v projektu.
Kruhový diagram
Níže je uvedeno kompletní schéma zapojení tohoto robotického ramene založeného na mikrokontroléru PIC. Schémata byla nakreslena pomocí EasyEDA.
Schéma zapojení je velmi jednoduché; celý projekt je napájen 12V adaptérem. Toto 12V se poté převede na + 5 V pomocí dvou regulátorů napětí 7805. Jeden je označen jako + 5V a druhý je označen jako + 5V (2). Důvod, proč máme dva regulátory, je ten, že když se servo otáčí, natáhne hodně proudu, což vytváří pokles napětí. Tento pokles napětí nutí PIC restartovat se sám, proto nemůžeme provozovat PIC i servomotory na stejné kolejnici + 5V. Ten, který je označen jako + 5 V, se tedy používá k napájení mikrokontroléru PIC, LCD a potenciometrů a samostatný výstup regulátoru, který se označuje jako + 5 V (2), se používá k napájení servomotorů.
Pět výstupních pinů potenciometrů, které poskytují proměnné napětí od 0 V do 5 V, je připojeno k analogovým pinům An0 až AN4 PIC. Protože plánujeme použít časovače ke generování PWM, lze servomotory připojit k jakémukoli pinu GPIO. Pro servomotory jsem vybral piny od RD2 do RD6, ale může to být jakýkoli GPIO podle vašeho výběru.
Vzhledem k tomu, že program vyžaduje hodně ladění, je k portu B rozhraní PIC připojen také 16x2 LCD displej. Tím se zobrazí pracovní cyklus servomotorů, které jsou řízeny. Kromě toho jsem také rozšířil připojení pro všechny GPIO a analogové piny, jen pro případ, že by v budoucnu bylo třeba propojit nějaké senzory. Nakonec jsem také připojil pin programátoru H1 k přímému programování PIC s pickit3 pomocí možnosti programování ICSP.
Generování signálů PWM na pinu GPIO pro řízení servomotoru
Jakmile je obvod připraven, musíme přijít na to, jak generovat signály PWN na pinu GPIO PIC pro ovládání servomotoru. Už jsme unavili něco podobného pomocí metody přerušení časovače a byli jsme úspěšní. Zde budeme stavět jen na tom, takže pokud jste zde noví, důrazně vám doporučuji přečíst si tento předchozí tutoriál, než budete pokračovat dále.
Všechny hobby servomotory pracují s frekvencí 50 Hz. To znamená, že jeden kompletní pulzní cyklus pro servomotor bude 1/50 (F = 1 / T), což je 20ms. Z tohoto úplného 20ms je řídicí signál pouze od 0 do 2ms, zatímco zbytek signálu je vždy vypnutý. Níže uvedený obrázek ukazuje, jak se doba zapnutí mění pouze od 0 do 2 ms, aby se motor otočil z 0 stupňů na 180 stupňů z celkové doby trvání 20 ms.
S ohledem na tuto skutečnost musíme program napsat takovým způsobem, že PIC čte 0 až 1204 z potenciometru a mapuje jej na 0 až 100, což bude pracovní cyklus servomotoru. Pomocí tohoto pracovního cyklu můžeme vypočítat dobu zapnutí servomotoru. Pak můžeme inicializovat přerušení časovače na přetečení v pravidelném intervalu tak, aby fungovalo podobně jako funkce millis () v Arduinu. Díky tomu můžeme přepnout stavový GPIO pin tak, aby byl vysoký po požadovanou dobu, a po 20 ms (jeden kompletní cyklus) jej vypnout a poté opakovat stejný proces. Nyní, když jsme pochopili logiku, pojďme se dostat do programu.
Programování PIC16F8771A pro robotické rameno
Jako vždy najdete kompletní program s videem na konci této stránky, odtud si můžete také stáhnout kód se všemi potřebnými soubory. V této části probereme logiku, která stojí za programem. Program využívá modul ADC, modul časovače a modul LCD k ovládání robotického ramene. Pokud nevíte, jak používat funkce ADC nebo časovače nebo propojit LCD s PIC, pak se můžete vrátit k příslušným odkazům a naučit se je. Níže je uvedeno vysvětlení za předpokladu, že čtenář je s těmito pojmy obeznámen.
Konfigurace portu časovače 0
Nejdůležitější částí kódu je nastavení časovače 0 na přetečení pro každé konkrétní zpoždění. Vzorce pro výpočet tohoto zpoždění lze uvést jako
Zpoždění = ((256-REG_val) * (Prescal * 4)) / Fosc
Použitím registru OPTION_REG a TMR0 jsme nastavili časovač 0 tak, aby pracoval s předkalární hodnotou 32 a REG val je nastaven na 248. Krystalová frekvence (Fosc) použitá v našem hardwaru je 20Mhz. S těmito hodnotami lze zpoždění vypočítat jako
Zpoždění = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 sekund (nebo) = 0,05 ms
Nyní jsme tedy nastavili časovač, aby přetékal každých 0,05 ms. Níže uvedený kód je stejný
/ ***** Konfigurace portu pro časovač ****** / OPTION_REG = 0b00000100; // Timer0 s externím kmitočtem a 32 jako prescalar // Také umožňuje PULL UPs TMR0 = 248; // Načte časovou hodnotu na 0,0001 s; delayValue může být mezi 0-256 pouze TMR0IE = 1; // Povolit bit přerušení časovače v registru PIE1 GIE = 1; // Povolit globální přerušení PEIE = 1; // Povolit přerušení periferie / *********** ______ *********** /
Z celkového ovládacího okna 0ms až 2ms servomotoru jej můžeme ovládat s rozlišením 0,05 ms, což nám umožňuje mít (2 / 0,05) 40 různých pozic pro motor v rozmezí 0 stupňů až 180 stupňů. Tuto hodnotu můžete dále snížit, pokud ji může váš MCU podporovat, aby získal více pozic a přesnou kontrolu.
Rutina přerušení služby (ISR)
Nyní, když máme časovač 0 nastavený na přetékání každých 0,05 ms, budeme mít příznak přerušení TMR0IF nastavený na 0,05 ms. Takže uvnitř funkce ISR můžeme tento příznak resetovat a zvýšit proměnnou nazvanou count o jednu. Takže nyní se tato proměnná zvýší o 1 na každých 0,05 ms.
void interrupt timer_isr () { if (TMR0IF == 1) // Byl spuštěn příznak časovače kvůli přetečení časovače -> nastaveno na přetečení každých 0,05 ms { TMR0 = 248; // Načtení časovače Hodnota TMR0IF = 0; // Vymazat počet příznaků přerušení časovače ++; // Počítání přírůstků o 1 za každých 0,05 ms }
Výpočet pracovního cyklu a doby provozu
Dále musíme vypočítat pracovní cyklus a čas pro všech pět servomotorů. Máme pět servomotorů, z nichž každý se používá k ovládání jednotlivých částí ramene. Musíme tedy přečíst hodnotu ADC všech pěti a pro každou vypočítat pracovní cyklus a včas.
Hodnota ADC bude v rozsahu 0 až 1024, kterou lze převést na pracovní cyklus 0% až 100% jednoduchým vynásobením 0,0976 (100/1024 = 0,0976) získanou hodnotou. Tento pracovní cyklus 0 až 100% musí být poté převeden na čas zapnutí. Víme, že při 100% pracovním cyklu musí být doba zapnutí 2 ms (pro 180 stupňů), takže vynásobením 0,02 (2/100 = 0,02) se převede 0 až 100 pracovní cyklus na 0 až 2 ms. Ale pak je náš počet proměnných časovače nastaven tak, aby se zvyšoval jednou za každých 0,05 ms. To znamená, že hodnota počtu bude 20 (1 / 0,05 = 20) za každou 1ms. Takže musíme vynásobit 20 s 0,02, abychom vypočítali přesný čas pro náš program, který nám dá hodnotu 0,4 (0,02 * 20 = 0,4). Kód pro stejný je uveden níže, můžete vidět, že se opakuje 5krát pro všech 5 potů pomocí smyčky for. Výsledné hodnoty jsou uloženy v poli T_ON.
for (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // Načtěte hodnotu POT pomocí 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ýběr motoru, který se má otáčet
Nemůžeme ovládat všech pět motorů společně, protože to způsobí, že kód ISR se zpomalí celý mikrokontrolér. Musíme tedy otáčet pouze jeden servomotor najednou. Chcete-li vybrat, které servo se bude otáčet, bude mikrokontrolér monitorovat čas zapnutí všech pěti servomotorů a porovná jej s předchozím časem. Dojde-li ke změně doby zapnutí, můžeme dojít k závěru, že konkrétní servo musí být přesunuto. Kód stejné je uveden níže.
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');
Tiskneme také pracovní cyklus serva na LCD obrazovku, aby si uživatel mohl být vědom své aktuální polohy. Na základě změny doby zapnutí je proměnné servo aktualizováno o čísla od 0 do 4, z nichž každé představuje jednotlivé motory.
Ovládání servomotoru uvnitř ISR
Uvnitř ISR máme počet proměnných, které se zvyšují každých 0,05 ms, což znamená, že za každých 1 ms se proměnná zvýší o 20. Pomocí toho musíme ovládat piny, aby produkovaly signál PWM. Pokud je hodnota počtu menší než čas zapnutí, GPIO tohoto motoru se zapne pomocí níže uvedeného řádku
PORTD = PORTD - servo_code;
Zde má pole servo_code detail pinů všech pěti servomotorů a na základě hodnoty v proměnném servu bude použit kód pro tento konkrétní servomotor. Potom je logicky OR (-) s existujícími PORTD bity, abychom nenarušili hodnoty jiného motoru a aktualizovali pouze tento konkrétní motor. Podobně pro vypnutí čepu
PORTD = PORTD & ~ (servo_code);
Obrátili jsme bitovou hodnotu pomocí operátoru logické inverze (~) a poté jsme provedli operaci AND (&) na PORTD, abychom vypnuli pouze požadovaný pin, zatímco ostatní piny jsme ponechali v předchozím stavu. Celý fragment kódu je uveden níže.
void interrupt timer_isr () { if (TMR0IF == 1) // Byl spuštěn příznak časovače kvůli přetečení časovače -> nastaveno na přetečení každých 0,05 ms { TMR0 = 248; // Načtení časovače Hodnota TMR0IF = 0; // Vymazat počet příznaků přerušení časovače ++; // Počítání přírůstků o 1 za každých 0,05 ms -> počet bude 20 za každou 1 ms (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; if (count> = 20 * 20) count = 0; if (počet <= (T_ON)) PORTD = PORTD - servo_code; else PORTD = PORTD & ~ (servo_code); }
Víme, že celkový cyklus musí trvat 20 ms, než se znovu zapne pin GPIO. Zkontrolujeme tedy, zda počet překročil 20 ms porovnáním hodnoty count s 400 (stejný výpočet, jak je popsáno výše), a pokud ano, musíme znovu inicializovat počet, aby byl nulový.
Simulace kódu PIC Robotic Arm
Před přenesením na skutečný hardware je vždy lepší simulovat kód. Takže jsem použil Proteus k simulaci mého kódu a ověřil jsem si, že funguje správně. Obvod použitý pro simulaci je uveden níže. Použili jsme osciloskop ke kontrole, zda jsou podle potřeby generovány signály PWM. Můžeme také ověřit, zda se LCD a servomotory otáčejí podle očekávání.
Jak můžete vidět na displeji se zobrazí pracovní cyklus motoru D za 07 založený na hodnotě banku, která je 3 rd motoru. Podobně, pokud je přesunuta jiná nádoba, zobrazí se na LCD pracovní cyklus této nádoby a její číslo motoru. Signál PWM zobrazený na osciloskopu je uveden níže.
Celková doba cyklu je měřena na 22,2 ms pomocí možnosti kurzoru na osciloskopu, která je velmi blízko požadovaných 20 ms. Nakonec jsme si jisti, že kód funguje, takže pro pokračování v obvodu ho můžeme buď letovat na desce perf, nebo použít desku plošných spojů. Na prkénku to nebude fungovat snadno, protože POT má vždy tendenci způsobovat problémy kvůli špatnému připojení.
Návrh desek plošných spojů pomocí EasyEDA
Pro návrh tohoto robotického ramene PIC jsme zvolili online nástroj EDA s názvem EasyEDA. Používám to již dlouhou dobu a považuji to za velmi pohodlné kvůli jeho obrovské dostupnosti stopy a snadno použitelné přírodě. Po návrhu desky plošných spojů si můžeme objednat vzorky desek plošných spojů pomocí jejich nízko nákladových služeb výroby desek plošných spojů. Nabízejí také službu sourcingu komponent, kde mají velkou zásobu elektronických součástek a uživatelé si mohou spolu s objednávkou PCB objednat požadované komponenty.
Při navrhování vašich obvodů a desek plošných spojů můžete také zveřejnit své návrhy obvodů a desek plošných spojů, aby je mohli ostatní uživatelé kopírovat nebo upravovat a mohli těžit z vaší práce. Také jsme pro tento obvod zveřejnili celé naše rozvržení obvodů a desek plošných spojů, zkontrolujte níže uvedený odkaz:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
Pomocí tohoto odkazu můžete přímo objednat stejnou desku plošných spojů, kterou používáme v tomto projektu, a použít ji. Jakmile je návrh dokončen, lze desku zobrazit jako 3D model, který bude velmi užitečný při vizualizaci toho, jak by se deska po výrobě objevila. 3D model desky, kterou používáme, je uveden níže. Kromě toho můžete také zobrazit horní a dolní vrstvu desky a zkontrolovat, zda je úhledná obrazovka podle očekávání.
Výpočet a objednávání vzorků online
Po dokončení návrhu této desky plošných spojů robotů PIC si můžete desku plošných spojů objednat přes JLCPCB.com. Chcete-li objednat desku plošných spojů z JLCPCB, potřebujete soubor Gerber. Chcete-li stáhnout soubory Gerber z vašeho PCB, jednoduše klikněte na tlačítko Generovat soubor výroby na stránce editoru EasyEDA, odtud si stáhněte soubor Gerber nebo klikněte na Objednávka na JLCPCB, jak je znázorněno na následujícím obrázku. To vás přesměruje na JLCPCB.com, kde můžete vybrat počet desek plošných spojů, které chcete objednat, kolik měděných vrstev potřebujete, tloušťku desky plošných spojů, hmotnost mědi a dokonce i barvu desky plošných spojů, jako je snímek zobrazený níže:
Poté, co vyberete všechny možnosti, klikněte na „Uložit do košíku“ a poté se dostanete na stránku, kde můžete nahrát svůj soubor Gerber, který jsme stáhli z EasyEDA. Nahrajte svůj soubor Gerber a klikněte na „Uložit do košíku“. A nakonec kliknutím na Pokladna bezpečně dokončete objednávku, poté dostanete své PCB o několik dní později. Vyrábějí desku plošných spojů za velmi nízkou cenu, což je 2 $. Jejich doba výroby je také velmi kratší, což je 48 hodin s dodávkou DHL 3-5 dní, v podstatě dostanete PCB do týdne od objednání.
Po objednání desky plošných spojů můžete zkontrolovat průběh výroby desky plošných spojů s datem a časem. Zkontrolujete to na stránce Účet a kliknete na „Průběh výroby“.
Po několika dnech objednání desek plošných spojů jsem dostal vzorky desek plošných spojů v pěkném obalu, jak je znázorněno na obrázcích níže.
A po získání těchto kusů jsem pájel všechny požadované komponenty přes PCB. Také jsem přímo pájel POT namísto použití spojovacích vodičů, protože vodiče ze samice na samici, které jsem původně používal tam, kde jsem dával divné analogové výstupní napětí pravděpodobně kvůli uvolněným kontaktům. Jakmile byly všechny komponenty smontovány, vypadal můj PCB asi takto.
Možná jste si všimli, že na této desce je pouze jedna 7805. To proto, že zpočátku jsem si myslel, že bych se mohl dostat pryč s pouhým regulátorem pro napájení jak PIC, tak servomotoru a později jsem si uvědomil, že potřebuji dva. K napájení servomotorů přes zelené vodiče, které zde vidíte, jsem tedy použil externí obvod.
Nemusíte se s tím ale moc starat, protože; Změny na PCB jsem provedl nyní. Můžete použít upravenou desku plošných spojů a pájet oba regulátory na samotné desce.
Práce s robotickým ramenem PIC
Po všech únavných pracích je čas na výplatu. Pájejte všechny komponenty na desce a nahrajte program do PIC ovladače. Kompletní kód je uveden níže nebo si jej můžete stáhnout zde. Programovací konektor poskytnutý na desce by vám měl pomoci nahrát program přímo pomocí Pickit 3 bez větších potíží. Jakmile je program nahrán, měli byste vidět LCD displej s aktuálně ovládaným servem. Chcete-li se dozvědět více o programování mikrokontroléru PIC, postupujte podle předchozího kurzu.
Odtud můžete jednoduše otočit hrnec a zkontrolovat, jak servomotory reagují na každý potenciometr. Jakmile pochopíte formát, můžete robotické rameno ovládat tak, aby provádělo jakoukoli akci, kterou potřebujete k provedení a zábavě. Najdete kompletní zpracování projektu ve videu odkazujeme níže.
To je to, kluci doufají, že jste pochopili projekt a naučili se z něj něco nového. Pokud máte nějaké dotazy, nechte je v sekci komentářů nebo použijte fóra pro další technické diskuse.