- Grandinės schema
- PWM signalų generavimas GPIO kaištelyje servovariklio valdymui
- Robotinės rankos programavimas PIC16F8771A
- PIC robotizuotos rankos kodo modeliavimas
- PCB dizainas naudojant „EasyEDA“
- Mėginių apskaičiavimas ir užsakymas internetu
- PIC robotizuotos rankos darbas
Pradedant automobilių gamybos pramonės surinkimo linija ir baigiant telochirurgijos robotais kosmose, robotų ginklų galima rasti visur. Šių robotų mechanizmai yra panašūs į žmones, kuriuos galima užprogramuoti atlikti panašias funkcijas ir didesnes galimybes. Jie gali būti naudojami pakartotiniams veiksmams atlikti greičiau ir tiksliau nei žmonės, arba gali būti naudojami sunkioje aplinkoje, nerizikuojant žmogaus gyvybe. Mes jau sukūrėme įrašų ir žaidimų robotą, naudodami „Arduino“, kurį būtų galima išmokyti atlikti tam tikrą užduotį ir priversti kartoti amžinai.
Šioje pamokoje mes naudosime pramonės standartą PIC16F877A 8 bitų mikrovaldiklį, kad valdytume tą pačią robotizuotą ranką potenciometrais. Šio projekto iššūkis yra tas, kad PIC16F877A turi tik du PWN palaikančius kaiščius, tačiau mes turime valdyti maždaug 5 mūsų roboto servovariklius, kuriems reikalingi 5 atskiri PWM kaiščiai. Taigi mes turime naudoti GPIO kaiščius ir generuoti PWM signalus ant PIC GPIO kaiščių, naudodami laikmačio pertraukiklius. Dabar, žinoma, galėtume patobulinti į geresnį mikrovaldiklį arba naudoti multiplekserio IC, kad viskas būtų daug lengviau. Tačiau vis dėlto verta išbandyti šį projektą mokymosi patirtimi.
Mechaninė roboto rankos struktūra, kurią naudoju šiame projekte, buvo visiškai 3D atspausdinta mano ankstesniame projekte; Čia rasite visas dizaino bylas ir surinkimo procedūras. Arba, jei neturite 3D spausdintuvo, taip pat galite pastatyti paprastą robotų ranką naudodami kartonus, kaip parodyta nuorodoje. Darant prielaidą, kad kažkaip turite savo robotinę ranką, galite tęsti projektą.
Grandinės schema
Visa šio PIC mikrovaldiklio valdomos robotinės rankos grandinės schema parodyta žemiau. Schemos buvo parengtos naudojant „EasyEDA“.
Grandinės schema yra gana paprasta; visą projektą maitina 12 V adapteris. Tada šis 12 V paverčiamas + 5 V, naudojant du 7805 įtampos reguliatorius. Vienas žymimas kaip + 5V, o kitas - kaip + 5V (2). Dviejų reguliatorių priežastis yra ta, kad kai servo pasisuka, jis pritraukia daug srovės, dėl kurios sumažėja įtampa. Šis įtampos kritimas priverčia PIC iš naujo paleisti save, todėl mes negalime valdyti tiek PIC, tiek servo variklių tame pačiame + 5 V bėgyje. Taigi, pažymėtas kaip + 5V, naudojamas maitinti PIC mikrovaldiklį, skystųjų kristalų ekraną ir potenciometrus, o atskiras reguliatoriaus išėjimas, pažymėtas kaip + 5V (2), naudojamas servovarikliams maitinti.
Penki potenciometrų išėjimo kaiščiai, užtikrinantys kintamą įtampą nuo 0 V iki 5 V, yra prijungti prie PIC analoginių kaiščių nuo An0 iki AN4. Kadangi PWM generavimui planuojame naudoti laikmačius, servovariklius galima prijungti prie bet kurio GPIO kaiščio. Servo varikliams atrinkau kaiščius nuo RD2 iki RD6, tačiau tai gali būti bet kuris jūsų pasirinktas GPIO.
Kadangi programa reikalauja daug derinimo, 16x2 LCD ekranas taip pat yra sujungtas su PIC portB. Tai parodys valdomų servovariklių darbo ciklą. Be to, aš taip pat išplėtiau visų GPIO ir analoginių kaiščių sujungimus, tik tuo atveju, jei ateityje reikės susieti kokius nors jutiklius. Galiausiai aš taip pat prijungiau programuotojo kaištį H1, kad tiesiogiai suprogramuočiau PIC su „pickit3“, naudodamas ICSP programavimo parinktį.
PWM signalų generavimas GPIO kaištelyje servovariklio valdymui
Kai grandinė bus paruošta, turime išsiaiškinti, kaip generuoti PWN signalus PIC GPIO kaište, norint valdyti servo variklį. Mes jau pavargome nuo panašaus, naudodami laikmačio pertraukimo metodą, ir mums pavyko. Čia mes tiesiog sukursime ant jo, todėl jei esate čia naujas, primygtinai rekomenduosime perskaityti šią ankstesnę pamoką prieš tęsdami toliau.
Visi hobio servo varikliai dirba 50Hz dažniu. Tai reiškia, kad vienas visas servovariklio impulsų ciklas bus 1/50 (F = 1 / T), o tai yra 20 ms. Iš šių 20 ms valdymo signalas yra tik nuo 0 iki 2 ms, o likęs signalas visada išjungtas. Žemiau pateiktame paveikslėlyje parodyta, kaip įjungimo laikas svyruoja tik nuo 0 iki 2 ms, kad variklis pasuktų nuo 0 laipsnių iki 180 laipsnių visos 20ms trukmės trukmės.
Turėdami tai omenyje, turime parašyti programą taip, kad PIC nuskaitytų nuo 0 iki 1204 iš potenciometro ir suskirstytų ją nuo 0 iki 100, kuris bus servovariklio darbo ciklas. Naudodami šį darbo ciklą galime apskaičiuoti servovariklio įjungimo laiką. Tada mes galime inicijuoti laikmačio pertraukimą, kad jis būtų perpildytas reguliariai, kad jis veiktų panašiai kaip „Arduino“ funkcija milis (). Tuo mes galime perjungti būsenos GPIO kaištį į aukštą norimą laiką ir išjungti po 20 ms (vieno viso ciklo), tada pakartoti tą patį procesą. Dabar, kai supratome logiką, leiskite mums patekti į programą.
Robotinės rankos programavimas PIC16F8771A
Kaip visada, visą programą su vaizdo įrašu galite rasti šio puslapio pabaigoje, čia taip pat galite atsisiųsti kodą su visais reikalingais failais. Šiame skyriuje aptarsime programos logiką. Roboto rankai valdyti programoje naudojamas ADC modulis, laikmačio modulis ir LCD modulis. Jei nežinote, kaip naudotis ADC funkcijomis ar laikmačio funkcijomis arba susieti LCD su PIC, tada galite grįžti prie atitinkamų nuorodų, kad jų sužinotumėte. Žemiau pateiktas paaiškinimas pateikiamas darant prielaidą, kad skaitytojas yra susipažinęs su šiomis sąvokomis.
0 laikmačio prievado konfigūracija
Svarbiausias kodo skyrius yra „Timer 0“ nustatymas per didelę srautą kiekvienai konkrečiai vėlai. Formulės šiam vėlavimui apskaičiuoti gali būti pateiktos kaip
Vėlavimas = ((256-REG_val) * (Prescal * 4)) / Fosc
Naudodami „OPTION_REG“ ir „TMR0“ registrą, laikmatį 0 nustatėme veikti su preskaliarine reikšme 32, o REG val nustatomas į 248. Mūsų aparatinėje įrangoje naudojamas kristalų dažnis (Fosc) yra 20 MHz. Su šiomis vertėmis vėlavimą galima apskaičiuoti taip
Vėlavimas = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 sekundės (arba) = 0,05 ms
Taigi dabar mes nustatėme, kad laikmatis perpildytų kas 0,05 ms. Tą patį darantis kodas pateiktas žemiau
/ ***** Laikmačio prievado konfigūracija ****** / OPTION_REG = 0b00000100; // „Timer0“ su išoriniu dažniu ir 32 kaip išankstinis skalė // Taip pat įgalina PULL UPs TMR0 = 248; // Įkelkite laiko vertę 0,0001 s; „delayValue“ gali būti tik tarp 0–256 TMR0IE = 1; // Įjungti laikmačio pertraukimo bitą PIE1 registre GIE = 1; // Įgalinti visuotinį pertraukimą PEIE = 1; // Įgalinti periferinį pertraukimą / *********** ______ *********** /
Iš viso servo variklio valdymo lango nuo 0 ms iki 2 ms mes galime jį valdyti 0,05 ms sek. Raiška, kuri leidžia mums turėti (2 / 0.05) 40 skirtingų variklio padėčių nuo 0 iki 180 laipsnių. Galite dar labiau sumažinti šią vertę, jei jūsų MCU galėtų ją palaikyti, kad gautų daugiau pozicijų ir tiksliai valdytų.
Pertraukiamo aptarnavimo rutina (ISR)
Dabar, kai laikmatis 0 nustatytas kaip perteklius kas 0,05 ms, TMR0IF pertraukimo vėliava bus nustatyta 0,05 ms. Taigi viduje ISR funkcija, mes galime iš naujo, kad vėliava ir prieaugio kintama vadinamas skaičių iki vieno. Taigi dabar šis kintamasis bus padidintas 1 už kiekvieną 0,05 ms.
negaliojantis pertraukimo laikmatis_isr () { if (TMR0IF == 1) // Laikmačio vėliava suveikė dėl laikmačio perpildymo -> nustatyta perpildyti kas 0,05 ms { TMR0 = 248; // Įkelti laikmatį Reikšmė TMR0IF = 0; // Išvalyti laikmačio pertraukimo vėliavų skaičių ++; // Suskaičiuokite prieaugį 1 už kiekvieną 0,05 ms }
Apskaičiuokite darbo ciklą ir įjungimo laiką
Tada turime apskaičiuoti visų penkių servo variklių darbo ciklą ir laiką. Mes turime penkis servovariklius, kurių kiekvienas naudojamas atskirai rankos daliai valdyti. Taigi turime perskaityti visų penkių ADC vertę ir kiekvienam apskaičiuoti darbo ciklą bei laiką.
ADC reikšmė bus nuo 0 iki 1024, kurią galima konvertuoti į 0–100% darbo ciklą, paprasčiausiai padauginant iš gautos vertės 0,0976 (100/1024 = 0,0976). Tada šis 0–100% darbo ciklas turi būti paverstas ON laiku. Mes žinome, kad esant 100% darbo ciklui įjungimo laikas turi būti 2 ms (180 laipsnių), taigi padauginus 0,02 (2/100 = 0,02), paversime 0–100 darbo ciklą į 0–2 ms. Bet tada nustatoma, kad mūsų laikmačio kintamųjų skaičius padidės vieną kartą per 0,05 ms. Tai reiškia, kad skaičiaus vertė bus 20 (1 / 0,05 = 20) už kiekvieną 1 ms. Taigi turime padauginti 20 iš 0,02, kad apskaičiuotume tikslų programos laiką, kuris suteiks mums vertę 0,4 (0,02 * 20 = 0,4). To paties kodas rodomas žemiau, galite pamatyti, kaip jis kartojamas 5 kartus visiems 5 puodams, naudojant „for loop“. Gautos vertės saugomos T_ON masyve.
už (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // Perskaitykite POT reikšmę naudodami ADC Duty_cycle = (POT_val * 0.0976); Žemėlapis nuo 0 iki 1024 iki 0 iki 100 T_ON = Duty_cycle * 0,4; // 20 * 0,02
Pasirenkamas sukamas variklis
Mes negalime valdyti visų penkių variklių kartu, nes tai padarys ISR kodą sunkų ir sulėtins visą mikrovaldiklį. Taigi vienu metu turime sukti tik vieną servovariklį. Norėdami pasirinkti, kurį servo pasukti, mikrovaldiklis stebi visų penkių servovariklių įjungimo laiką ir lygina jį su ankstesniu laiku. Jei pasikeičia įjungimo laikas, galime daryti išvadą, kad konkretus servo serveris turi būti perkeltas. To paties kodas parodytas žemiau.
jei (T_ON! = Pev_val) { Lcd_Clear (); servo = puodo_suma; „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 = (muito ciklas / 10)% 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
Mes taip pat atspausdiname servo darbo ciklą LCD ekrane, kad vartotojas galėtų žinoti jo dabartinę padėtį. Atsižvelgiant į ON laiko pasikeitimą, kintamasis servo serveris atnaujinamas skaičiais nuo 0 iki 4, nurodant atskirus variklius.
Servovariklio valdymas ISR viduje
ISR viduje kintamųjų skaičius didėja kas 0,05 ms, tai reiškia, kad už kiekvieną 1 ms kintamasis bus padidintas 20. Naudodamiesi tuo, mes turime valdyti kaiščius, kad gautume PWM signalą. Jei skaičiaus vertė yra mažesnė nei įjungimo laikas, to variklio GPIO įjungiamas naudojant žemiau esančią eilutę
PORTD = PORTD - servo_kodas;
Čia masyvas servo_code turi visų penkių servo variklių kaiščių detales ir, atsižvelgiant į kintamo servo vertę, bus naudojamas to konkretaus servo variklio kodas. Tada logiškai ARBA (-) su esamais PORTD bitais, kad netrukdytume kitų variklių reikšmių ir atnaujintume tik šį konkretų variklį. Panašiai ir kaiščio išjungimui
PORTD = PORTD & ~ (servo_kodas);
Mes pakeitėme bitų vertę naudodami loginį atvirkštinį (~) operatorių ir tada atlikome AND (ir) operaciją PORTD, kad išjungtume tik norimą kaištį, o kitus kaiščius palikome ankstesnėje būsenoje. Visas kodo fragmentas rodomas žemiau.
negaliojantis pertraukimo laikmatis_isr () { if (TMR0IF == 1) // Laikmačio vėliava suveikė dėl laikmačio perpildymo -> nustatyta perpildyti kas 0,05 ms { TMR0 = 248; // Įkelti laikmatį Reikšmė TMR0IF = 0; // Išvalyti laikmačio pertraukimo vėliavų skaičių ++; // Suskaičiuokite prieaugius 1 už kiekvieną 0,05 ms -> skaičius bus 20 už kiekvieną 1 ms (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; jei (skaičius> = 20 * 20) skaičius = 0; if (skaičius <= (T_ON)) PORTD = PORTD - servo_kodas; else PORTD = PORTD & ~ (servo_kodas); }
Mes žinome, kad bendras ciklas turi trukti 20ms, kol vėl bus įjungtas GPIO kaištis. Taigi mes patikriname, ar skaičius viršijo 20 ms, lyginant skaičiaus vertę su 400 (tas pats skaičiavimas, kaip aptarta aukščiau), ir jei taip, mes turime vėl inicijuoti skaičių nuliui.
PIC robotizuotos rankos kodo modeliavimas
Visada geriau imituoti kodą prieš nunešant jį į tikrąją aparatinę įrangą. Taigi aš naudoju „Proteus“, kad imituočiau savo kodą, ir patikrinau, ar jis veikia tinkamai. Modeliavimui naudojama grandinė parodyta žemiau. Mes naudojome osciloskopą, kad patikrintume, ar PWM signalai yra generuojami, kaip reikalaujama. Taip pat galime patikrinti, ar skystųjų kristalų ir servo varikliai sukasi taip, kaip tikėtasi.
Kaip matote, skystųjų kristalų ekrane rodomas variklio D darbo ciklas 07, atsižvelgiant į puodo vertę, kuri yra trečiasis variklis. Panašiai, jei perkeltas kitas puodas, to puodo darbo ciklas ir jo variklio numeris bus rodomas LCD. PWM signalas, parodytas osciloskope, parodytas žemiau.
Naudojant žymeklį osciloskope, matuojamas bendras ciklo laikotarpis yra 22,2 ms, kuris yra labai artimas norimiems 20 ms. Galiausiai esame įsitikinę, kad kodas veikia, todėl, norėdami tęsti grandinę, galime jį sulituoti ant plokštės arba naudoti PCB. Duonos lentoje jis neveiks lengvai, nes dėl prasto ryšio POT visada turi problemų.
PCB dizainas naudojant „EasyEDA“
Norėdami sukurti šią PIC robotizuotą ranką, mes pasirinkome internetinį EDA įrankį „EasyEDA“. Aš naudoju jį ilgą laiką ir manau, kad tai labai patogu, nes yra labai platus ir lengvai naudojamas gamta. Sukūrę PCB, galime užsisakyti PCB pavyzdžius pagal jų pigias PCB gamybos paslaugas. Jie taip pat siūlo komponentų tiekimo paslaugas, kai turi daug elektroninių komponentų, o vartotojai gali užsisakyti reikalingus komponentus kartu su PCB užsakymu.
Kurdami savo grandines ir PCB, jūs taip pat galite viešai paskelbti savo grandinių ir PCB dizainus, kad kiti vartotojai galėtų juos nukopijuoti ar redaguoti ir galėtų pasinaudoti jūsų darbu. Mes taip pat paviešinome visus mūsų grandinių ir PCB išdėstymus šiai grandinei. žemiau esančią nuorodą:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
Naudodamiesi šia nuoroda galite tiesiogiai užsisakyti tą pačią PCB, kurią naudojame šiame projekte, ir ją naudoti. Kai dizainas bus baigtas, lentą galima vertinti kaip 3D modelį, kuris bus labai naudingas vizualizuojant, kaip plokštė atrodys po pagaminimo. Žemiau parodytas mūsų naudojamos lentos 3D modelis. Be to, galite peržiūrėti viršutinį ir apatinį lentos sluoksnį, kad patikrintumėte, ar slidus ekranas yra toks, kokio tikėtasi.
Mėginių apskaičiavimas ir užsakymas internetu
Baigę kurti šio PIC roboto PCB, galite užsisakyti PCB per JLCPCB.com. Norėdami užsisakyti PCB iš JLCPCB, jums reikia „Gerber File“. Norėdami atsisiųsti „Gerber“ failus iš savo PCB, tiesiog spustelėkite mygtuką „ Generuoti gamybos failą “ „EasyEDA“ redaktoriaus puslapyje, tada atsisiųskite „Gerber“ failą iš ten arba galite spustelėti „ Užsakyti JLCPCB“, kaip parodyta žemiau esančiame paveikslėlyje. Tai nukreips jus į JLCPCB.com, kur galėsite pasirinkti norimų užsisakyti PCB skaičių, kiek jums reikia vario sluoksnių, PCB storį, vario svorį ir net PCB spalvą, pavyzdžiui, žemiau pateiktą momentinę kopiją:
Pasirinkę visas parinktis, spustelėkite „Įrašyti į krepšelį“ ir pateksite į puslapį, kuriame galėsite įkelti savo „Gerber“ failą, kurį atsisiuntėme iš „EasyEDA“. Įkelkite savo „Gerber“ failą ir spustelėkite „Išsaugoti krepšelyje“. Galiausiai spustelėkite „Checkout Secure“, kad užbaigtumėte užsakymą, tada po kelių dienų gausite savo PCB. Jie gamina PCB labai mažu greičiu, kuris yra 2 USD. Jų sukūrimo laikas taip pat yra labai trumpesnis, tai yra 48 valandos, kai DHL pristatomas per 3-5 dienas. Iš esmės savo PCB gausite per savaitę nuo užsakymo.
Užsisakę PCB, galite patikrinti savo PCB gamybos pažangą su data ir laiku. Tai patikrinsite apsilankę paskyros puslapyje ir spustelėję „Gamybos pažanga“.
Po kelių dienų užsisakius PCB, aš gavau gražių pakuočių PCB pavyzdžius, kaip parodyta žemiau esančiose nuotraukose.
Gavęs šiuos kūrinius, visus reikalingus komponentus prilitavau per PCB. Aš taip pat tiesiogiai lituojau POT, užuot naudojęs jungiamuosius laidus, nes iš pradžių naudoti moteriški ir moteriški laidai, kai tikriausiai dėl laisvų kontaktų suteikė keistas analogines išėjimo įtampas. Surinkus visus komponentus, mano PCB atrodė maždaug taip.
Galbūt pastebėjote, kad šioje lentoje yra tik vienas 7805. Taip yra todėl, kad iš pradžių maniau, kad galiu išsisukti tik su reguliatoriumi tiek PIC, tiek servo varikliui maitinti, o vėliau supratau, kad man reikia dviejų. Taigi, naudodamas išorinę grandinę, maitinau servovariklius per žalius laidus, kuriuos matote čia.
Nepaisant to, jums nereikia dėl to daug jaudintis, nes; Dabar atlikau pakeitimus PCB. Galite naudoti modifikuotą PCB ir lituoti abu reguliatorius pačiame laive.
PIC robotizuotos rankos darbas
Po visų varginančių darbų atėjo laikas atsipirkti. Lituokite visus lentos komponentus ir įkelkite programą į PIC valdiklį. Visas kodas pateikiamas žemiau arba jį galima atsisiųsti iš čia. Lentoje esanti programavimo jungtis turėtų padėti be didesnio vargo įkelti programą tiesiogiai naudojant „Pickit 3“. Įkėlę programą turėtumėte pamatyti LCD ekraną, rodantį servo valdymą, kuris šiuo metu yra valdomas. Norėdami sužinoti daugiau apie PIC mikrovaldiklio programavimą, tiesiog vadovaukitės ankstesne pamoka.
Iš ten galite tiesiog pasukti puodą ir patikrinti, kaip servo varikliai reaguoja į kiekvieną potenciometrą. Kai suprasite formatą, galite valdyti robotą, kad ji atliktų bet kokį veiksmą, kurio jums reikia norint atlikti ir linksmintis. Išsamų projekto darbą galite rasti žemiau esančiame vaizdo įraše.
Tai yra vaikinai, tikiuosi, kad supratote projektą ir sužinojote iš jo kažką naujo. Jei turite klausimų, palikite juos komentarų skyriuje arba naudokite forumus kitoms techninėms diskusijoms.