- Shema vezja
- Ustvarjanje PWM signalov na GPIO pin za servo motor nadzor
- Programiranje PIC16F8771A za robotsko roko
- Simulacija kode robotske roke PIC
- PCB Design z uporabo EasyEDA
- Izračun in naročanje vzorcev prek spleta
- Delovanje robotske roke PIC
Robotsko orožje je mogoče najti povsod, od montažne linije avtomobilske industrije do robotov za telekirurgijo v vesolju. Mehanizmi teh robotov so podobni človeškim, ki jih je mogoče programirati za podobno funkcijo in večje zmogljivosti. Uporabljajo se lahko za ponavljajoča se dejanja hitreje in natančneje kot ljudje ali v težkih okoljih, ne da bi tvegali človeško življenje. Z Arduinom smo že izdelali robotsko roko Record and Play Robotic Arm, ki bi jo lahko usposobili za določeno nalogo in jo ponavljali za vedno.
V tej vadnici bomo uporabili industrijski standard 8-bitni mikrokrmilnik PIC16F877A za nadzor iste robotske roke s potenciometri. Izziv tega projekta je, da ima PIC16F877A samo dva zatiča, ki podpirata PWN, vendar moramo za našega robota nadzorovati približno 5 servo motorjev, ki potrebujejo 5 posameznih zatičev PWM. Torej moramo uporabiti zatiče GPIO in na zatičih PIC GPIO ustvariti signale PWM s pomočjo prekinitev s časovnikom. Zdaj bi seveda lahko nadgradili na boljši mikrokrmilnik ali uporabili IC za razmnoževanje, da bi tu stvari veliko olajšali. A vseeno je vredno poskusiti s tem projektom za učno izkušnjo.
Mehanska struktura robotske roke, ki jo uporabljam pri tem projektu, je bila za moj prejšnji projekt popolnoma natisnjena v 3D obliki; celotne projektne datoteke in postopek sestavljanja najdete tukaj. Če nimate 3D-tiskalnika, lahko tudi izdelate preprosto robotsko roko iz kartona, kot je prikazano v povezavi. Ob predpostavki, da ste se nekako prijeli za svojo robotsko roko, nadaljujte s projektom.
Shema vezja
Popoln diagram vezja za to robotsko roko na osnovi mikrokrmilnika PIC je prikazan spodaj. Sheme so bile narisane s pomočjo EasyEDA.
Shema vezij je precej preprosta; celoten projekt napaja 12V adapter. Ta 12V se nato z dvema regulatorjema napetosti 7805 pretvori v + 5V. Ena je označena kot + 5V, druga pa kot + 5V (2). Razlog za dva regulatorja je, da se servo, ko se vrti, potegne veliko toka, kar povzroči padec napetosti. Ta padec napetosti prisili PIC, da se ponovno zažene, zato ne moremo upravljati tako PIC kot servo motorjev na isti + 5V tirnici. Torej tisti, ki je označen kot + 5V, se uporablja za napajanje mikrokrmilnika PIC, LCD in potenciometrov, ločen izhod regulatorja, ki je označen kot + 5V (2), pa se uporablja za napajanje servo motorjev.
Pet izhodnih zatičev potenciometrov, ki zagotavljajo spremenljivo napetost od 0V do 5V, je povezanih z analognimi zatiči An0 do AN4 PIC. Ker načrtujemo uporabo časovnikov za generiranje PWM, je servo motorje mogoče priključiti na kateri koli GPIO zatič. Za servo motorje sem izbral nožice od RD2 do RD6, lahko pa je kateri koli GPIO po vaši izbiri.
Ker program vključuje veliko odpravljanja napak, je zaslon LCD 16x2 povezan tudi z portom B PIC. To bo prikazalo obratovalni cikel servo motorjev, ki jih nadzorujemo. Poleg tega sem podaljšal tudi povezave za vse GPIO in analogne nožice, za vsak primer, če bo treba v prihodnosti povezati senzorje. Na koncu sem priključil tudi programski zatič H1 za neposredno programiranje PIC-a s pickit3 z uporabo možnosti programiranja ICSP.
Ustvarjanje PWM signalov na GPIO pin za servo motor nadzor
Ko je vezje pripravljeno, moramo ugotoviti, kako generirati PWN signale na GPIO zatiču PIC za nadzor servo motorja. Nekaj podobnega smo že utrudili z metodo prekinitve Timer in smo bili uspešni. Tu bomo šele nadaljevali, zato, če ste tu novi, vam toplo priporočam, da pred nadaljevanjem preberete to prejšnjo vadnico.
Vsi hobi servo motorji delujejo s frekvenco 50 Hz. To pomeni, da bo en celoten impulzni cikel za servo motor 1/50 (F = 1 / T), kar je 20 ms. Od teh popolnih 20 ms je krmilni signal le od 0 do 2 ms, preostali signal pa je vedno izklopljen. Spodnja slika prikazuje, kako se čas vklopa spreminja le od 0 do 2 ms, da se motor zavrti od 0 do 180 stopinj celotnega trajanja 20 ms.
Glede na to moramo program napisati tako, da PIC od potenciometra odčita od 0 do 1204 in ga preslika na 0 do 100, kar bo delovni cikel servo motorja. S pomočjo tega delovnega cikla lahko izračunamo čas vklopa servo motorja. Nato lahko prekinitev časovnika inicializiramo tako, da se v rednem intervalu preliva, tako da deluje podobno kot funkcija milis () v Arduinu. S tem lahko statusni GPIO pin za želeno trajanje preklopimo na visok in ga izklopimo po 20 ms (en celoten cikel) in nato ponovimo isti postopek. Zdaj, ko smo razumeli logiko, pojdimo v program.
Programiranje PIC16F8771A za robotsko roko
Kot vedno na koncu te strani najdete celoten program z video posnetkom, tudi tukaj lahko prenesete kodo z vsemi potrebnimi datotekami. V tem poglavju bomo razpravljali o logiki programa. Program za upravljanje robotske roke uporablja modul ADC, modul časovnika in modul LCD. Če se ne zavedate, kako uporabljati funkcije ADC ali funkcije časovnika ali povezati LCD s PIC, se lahko vrnete na ustrezne povezave in se jih naučite. Spodnja razlaga je podana ob predpostavki, da je bralec seznanjen s temi pojmi.
Konfiguracija vrat časovnika 0
Najpomembnejši odsek kode je nastavitev časovnika 0 na pretok za vsako določeno zamudo. Formule za izračun te zamude lahko damo kot
Zakasnitev = ((256-REG_val) * (Prescal * 4)) / Fosc
Z uporabo registrov OPTION_REG in TMR0 smo časovnik 0 nastavili tako, da deluje s predkalarno vrednostjo 32, vrednost REG pa je nastavljena na 248. Kristalna frekvenca (Fosc), ki se uporablja v naši strojni opremi, je 20 MHz. S temi vrednostmi lahko zakasnitev izračunamo kot
Zakasnitev = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 sekund (ali) = 0,05 ms
Tako smo zdaj nastavili, da se časovnik preliva na vsakih 0,05 ms. Koda za enako velja spodaj
/ ***** Konfiguracija vrat za časovnik ****** / OPTION_REG = 0b00000100; // Timer0 z zunanjo frekvenco in 32 kot predkalarjem // Omogoča tudi PULL UPs TMR0 = 248; // Naloži časovno vrednost za 0,0001s; delayValue je lahko med 0-256 samo TMR0IE = 1; // Omogoči bit prekinitve časovnika v registru PIE1 GIE = 1; // Omogoči globalno prekinitev PEIE = 1; // Omogoči periferno prekinitev / *********** ______ *********** /
Od celotnega krmilnega okna servo motorja od 0 ms do 2 ms ga lahko nadzorujemo z ločljivostjo 0,05 ms, kar nam omogoča (2 / 0,05) 40 različnih položajev motorja od 0 stopinj do 180 stopinj. To vrednost lahko še znižate, če jo lahko podpira vaš MCU, da doseže več položajev in natančen nadzor.
Rutinska storitev prekinitve (ISR)
Zdaj, ko imamo časovnik 0 nastavljen na pretok za vsakih 0,05 ms, bomo zastavico prekinitve TMR0IF nastavili za 0,05 ms. Torej znotraj funkcije ISR lahko ponastavimo to zastavico in spremenljivko, imenovano count, povečamo za eno. Torej, zdaj se bo ta spremenljivka povečala za 1 za vsakih 0,05 ms.
void interrupt timer_isr () { if (TMR0IF == 1) // Zastavica časovnika se je sprožila zaradi prelivanja časovnika -> nastavljena na preliv za vsakih 0,05 ms { TMR0 = 248; // Naloži časovnik Vrednost TMR0IF = 0; // Počisti število zastavic prekinitve časovnika ++; // Štetje prirastkov za 1 za vsakih 0,05 ms }
Izračun delovnega cikla in pravočasno
Nato moramo izračunati obratovalni cikel in pravočasno za vseh pet servo motorjev. Imamo pet servo motorjev, od katerih se vsak uporablja za nadzor posameznega odseka roke. Torej moramo prebrati vrednost ADC vseh petih in za vsakega izračunati delovni cikel in čas.
Vrednost ADC bo v območju od 0 do 1024, kar lahko pretvorite v 0% do 100% obratovalnega cikla tako, da na dobljeno vrednost preprosto pomnožite 0,0976 (100/1024 = 0,0976). Ta 0 do 100% obratovalni cikel je treba nato pretvoriti v čas vklopa. Vemo, da mora biti pri 100% delovnem ciklusu čas vklopa 2 ms (za 180 stopinj), tako da se z množenjem 0,02 (2/100 = 0,02) 0 do 100 delovnega cikla pretvori v 0 do 2 ms. Potem pa naj bi se število števcev spremenljivk časovnika povečalo enkrat na vsakih 0,05 ms. To pomeni, da bo vrednost štetja 20 (1 / 0,05 = 20) za vsakih 1 ms. Torej moramo 20 pomnožiti z 0,02, da natančno izračunamo čas za naš program, ki nam bo dal vrednost 0,4 (0,02 * 20 = 0,4). Koda za isto je prikazana spodaj, lahko jo vidite petkrat ponovljeno za vseh 5 loncev z uporabo zanke for. Nastale vrednosti so shranjene v matriki T_ON.
for (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // odčitamo vrednost POT z uporabo ADC Duty_cycle = (POT_val * 0.0976); // Zemljevid 0 do 1024 do 0 do 100 T_ON = Duty_cycle * 0,4; // 20 * 0,02
Izbira, kateri motor naj se vrti
Vseh petih motorjev ne moremo nadzorovati skupaj, saj bo ISR koda močno upočasnila celoten mikrokrmilnik. Torej moramo hkrati vrteti le en servo motor. Če želite izbrati, kateri servo servo vrteti, mikrokrmilnik nadzira čas vklopa vseh petih servo motorjev in ga primerja s prejšnjim časom. Če pride do spremembe časa vklopa, lahko sklepamo, da je treba določen servo premakniti. Koda za isto je prikazana spodaj.
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:");} sicer če (pot_num == 1) {Lcd_Set_Cursor (1,6); Lcd_Print_String ("B:");} sicer if (pot_num == 2) {Lcd_Set_Cursor (1,11); Lcd_Print_String ("C:");} sicer if (pot_num == 3) {Lcd_Set_Cursor (2,1); Lcd_Print_String ("D:");} sicer če (pot_num == 4) {Lcd_Set_Cursor (2,6); Lcd_Print_String ("E:");} char d2 = (Duty_cycle)% 10; char d1 = (dolžnost_cikla / 10)% 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
Na LCD zaslon natisnemo tudi obratovalni cikel servo, da bi bil uporabnik seznanjen s trenutnim položajem. Na podlagi spremembe časa vklopa se spremenljivka servo posodobi s številkami od 0 do 4, ki predstavljajo posamezne motorje.
Nadzor servo motorja znotraj ISR
Znotraj ISR imamo spremenljivko štetja, ki se poveča za vsakih 0,05 ms, kar pomeni, da se bo za vsakih 1 ms spremenljivka povečala za 20. S tem moramo krmiliti zatiče, da dobimo PWM signal. Če je vrednost štetja manjša od časa ob vklopu, se GPIO tega motorja vklopi s spodnjo vrstico
PORTD = PORTD - servo_koda;
Tu ima matrika servo_code podrobnosti pin vseh petih servo motorjev in na podlagi vrednosti v spremenljivem servo bo uporabljena koda za ta servo motor. Takrat je logično ALI (-) z obstoječimi bitoma PORTD, tako da ne motimo vrednosti drugega motorja in posodobimo samo ta motor. Podobno za izklop zatiča
PORTD = PORTD & ~ (servo_koda);
Z uporabo logičnega inverznega (~) operatorja smo obrnili bitno vrednost in nato izvedli operacijo AND (&) na PORTD-u, da izključimo samo želeni pin, medtem ko ostale nožice pustimo v prejšnjem stanju. Celoten delček kode je prikazan spodaj.
void interrupt timer_isr () { if (TMR0IF == 1) // Zastavica časovnika se je sprožila zaradi prelivanja časovnika -> nastavljena na preliv za vsakih 0,05 ms { TMR0 = 248; // Naloži časovnik Vrednost TMR0IF = 0; // Počisti število zastavic prekinitve časovnika ++; // Štetje prirastkov za 1 za vsakih 0,05 ms -> štetje bo 20 za vsakih 1 ms (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; if (count> = 20 * 20) count = 0; if (count <= (T_ON)) PORTD = PORTD - servo_code; else PORTD = PORTD & ~ (servo_code); }
Vemo, da mora celotni cikel trajati 20 ms, preden se GPIO pin ponovno vklopi. Torej preverimo, ali je štetje preseglo 20 ms, tako da primerjamo vrednost count s 400 (enak izračun, kot je opisan zgoraj) in če je odgovor da, moramo štetje znova inicializirati na nič.
Simulacija kode robotske roke PIC
Vedno je bolje, da kodo simulirate, preden jo prenesete na pravo strojno opremo. Tako sem z Proteusom simuliral svojo kodo in jo preveril, da deluje pravilno. Vezje, uporabljeno za simulacijo, je prikazano spodaj. Z osciloskopom smo preverili, ali se po potrebi generirajo signali PWM. Prav tako lahko preverimo, ali se LCD in servo motorji vrtijo po pričakovanjih.
Kot lahko vidite, LCD zaslonov ciklus motorja D, da je 07, ki temelji na pot vrednosti, ki je 3 rd motorja. Podobno, če premaknete drug lonec, se obratovalni cikel tega lonca in njegova številka motorja prikaže na LCD-prikazovalniku. Signal PWM, prikazan na osciloskopu, je prikazan spodaj.
Skupno obdobje cikla se izmeri na 22,2 ms z uporabo kazalke na osciloskopu, ki je zelo blizu želenih 20 ms. Končno smo prepričani, da koda deluje, zato jo lahko za nadaljevanje vezja spajkamo na ploščo za perf ali uporabimo PCB. Na plošči ne bo delovalo zlahka, ker POT vedno povzroča nekaj težav zaradi slabih povezav.
PCB Design z uporabo EasyEDA
Za oblikovanje te robotske roke PIC smo izbrali spletno orodje EDA, imenovano EasyEDA. Zdaj ga uporabljam že dolgo in se mi zdi zelo priročen zaradi velike razpoložljivosti odtisa in enostavne narave. Po načrtovanju PCB lahko naročimo vzorce PCB z njihovimi poceni storitvami izdelave PCB. Ponujajo tudi storitev nabave komponent, kjer imajo veliko zalogo elektronskih komponent in uporabniki lahko naročijo njihove zahtevane komponente skupaj z naročilom PCB.
Med načrtovanjem vezij in tiskanih vezij lahko svoje načrte vezij in tiskanih vezij objavite tudi tako, da jih lahko drugi uporabniki kopirajo ali urejajo in izkoristijo vaše delo. Za to vezje smo objavili tudi celotno postavitev vezij in tiskanih vezij, preverite spodnja povezava:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
S to povezavo lahko neposredno naročite isti PCB, ki ga uporabljamo v tem projektu, in ga uporabite. Ko je zasnova končana, lahko ploščo obravnavamo kot 3D model, ki bo v veliko pomoč pri vizualizaciji izgleda plošče po izdelavi. 3D model plošče, ki ga uporabljamo, je prikazan spodaj. Poleg tega si lahko ogledate tudi zgornjo in spodnjo plast plošče, da preverite, ali je gladki zaslon po pričakovanjih.
Izračun in naročanje vzorcev prek spleta
Po končanem oblikovanju tega PCB-ja PIC Robot lahko PCB naročite prek JLCPCB.com. Če želite naročiti PCB pri JLCPCB, potrebujete datoteko Gerber. Za prenos Gerberjevih datotek s tiskanega vezja na strani urejevalnika EasyEDA kliknite gumb Generate Fabrication File , nato pa prenesite datoteko Gerber od tam ali pa kliknite Naroči pri JLCPCB, kot je prikazano na spodnji sliki. To vas bo preusmerilo na JLCPCB.com, kjer lahko izberete število PCB-jev, ki jih želite naročiti, koliko bakrenih plasti potrebujete, debelino PCB-ja, težo bakra in celo barvo PCB-ja, na primer spodnji posnetek:
Ko ste izbrali vse možnosti, kliknite »Shrani v košarico« in nato boste preusmerjeni na stran, kjer lahko naložite svojo Gerberjevo datoteko, ki smo jo prenesli iz EasyEDA. Naložite svojo datoteko Gerber in kliknite »Shrani v košarico«. In končno kliknite Checkout Securely, da dokončate naročilo, nato pa boste nekaj dni kasneje dobili svoje PCB-je. PCB izdelujejo po zelo nizki stopnji, ki znaša 2 USD. Njihov čas izdelave je prav tako zelo manjši, kar znaša 48 ur, ko DHL dobavi 3-5 dni, v bistvu boste svoje PCB dobili v enem tednu po naročilu.
Po naročilu PCB lahko preverite proizvodni napredek PCB z datumom in uro. To preverite tako, da odprete stran Račun in kliknete "Napredek proizvodnje".
Po nekaj dneh naročanja PCB-jev sem dobil vzorce PCB v lepi embalaži, kot je prikazano na spodnjih slikah.
In potem ko sem dobil te koščke, sem na PCB prilepil vse zahtevane komponente. Prav tako sem neposredno spajkal POT, namesto da bi uporabil povezovalne žice, ker so ženske na ženske žice, ki sem jih sprva uporabljal, dajale čudne analogne izhodne napetosti, verjetno zaradi ohlapnih kontaktov. Ko so bile sestavljene vse komponente, je bil moj PCB videti nekako takole.
Morda ste opazili, da je na tej plošči samo en 7805. To je zato, ker sem sprva mislil, da se lahko rešim samo z regulatorjem za napajanje PIC in servo motorja, kasneje pa sem ugotovil, da potrebujem dva. Tako sem z zunanjim vezjem napajal servo motorje skozi zelene žice, ki jih vidite tukaj.
Kljub temu vam ni treba veliko skrbeti, ker; Zdaj sem spremenil PCB. Uporabite lahko spremenjeni PCB in spajkate oba regulatorja na samem krovu.
Delovanje robotske roke PIC
Po vseh napornih delih je čas za poplačilo. Spajkajte vse komponente na ploščo in naložite program na krmilnik PIC. Popolna koda je navedena spodaj ali jo lahko prenesete od tukaj. Programski konektor, ki je priložen na plošči, vam bo pomagal naložiti program neposredno z Pickit 3 brez večjih težav. Ko je program naložen, se na LCD-prikazovalniku prikaže servo, ki je trenutno pod nadzorom. Če želite izvedeti več o programiranju mikrokrmilnika PIC, sledite prejšnjim navodilom.
Od tam lahko preprosto obrnete lonec in preverite, kako se servo motorji odzivajo na posamezni potenciometer. Ko enkrat razumete obliko, lahko z robotsko roko nadzirate, da izvede kakršno koli dejanje, ki ga potrebujete za zabavo. Celotno delovanje projekta najdete v spodnjem videoposnetku.
To je to, fantje upajo, da ste projekt razumeli in se iz njega naučili kaj novega. Če imate kakršna koli vprašanja, jih pustite v oddelku za komentarje ali uporabite forume za druge tehnične razprave.