- Ķēdes shēma
- PWM signālu ģenerēšana uz GPIO tapas servomotora vadībai
- PIC16F8771A programmēšana robotizētai rokai
- PIC robotizētās rokas koda simulācija
- PCB dizains, izmantojot EasyEDA
- Paraugu aprēķināšana un pasūtīšana tiešsaistē
- PIC robotizētās rokas darbs
Sākot ar automobiļu rūpniecības konveijeru un beidzot ar telekomunikāciju robotiem kosmosā, Robotiskie ieroči ir atrodami visur. Šo robotu mehānismi ir līdzīgi cilvēkam, kurus var ieprogrammēt līdzīgām funkcijām un paaugstinātām spējām. Tos var izmantot, lai atkārtotas darbības veiktu ātrāk un precīzāk nekā cilvēki, vai arī tos var izmantot skarbā vidē, neriskējot ar cilvēka dzīvību. Mēs jau esam izveidojuši ierakstu un spēļu robotu roku, izmantojot Arduino, kuru varētu apmācīt veikt noteiktu uzdevumu un likt atkārtot uz visiem laikiem.
Šajā apmācībā mēs izmantosim nozares standarta PIC16F877A 8 bitu mikrokontrolleru, lai vadītu to pašu robotu roku ar potenciometriem. Šī projekta izaicinājums ir tāds, ka PIC16F877A ir tikai divas tapas, kas spēj nodrošināt PWN, taču mums ir jākontrolē apmēram 5 servomotori mūsu robotam, kam nepieciešamas 5 atsevišķas PWM tapas. Tāpēc mums ir jāizmanto GPIO tapas un jāveido PWM signāli uz PIC GPIO tapām, izmantojot taimera pārtraukumus. Tagad, protams, mēs varētu jaunināt uz labāku mikrokontrolleru vai izmantot multipleksētāja IC, lai šeit viss būtu daudz vienkāršāk. Bet tomēr ir vērts izmēģināt šo projektu mācīšanās pieredzē.
Robota rokas mehāniskā struktūra, kuru es izmantoju šajā projektā, bija pilnībā 3D izdrukāta manam iepriekšējam projektam; Pilnu dizaina failu un montāžas procedūru varat atrast šeit. Alternatīvi, ja jums nav 3D printera, varat arī izveidot vienkāršu robotu roku, izmantojot kartonus, kā parādīts saitē. Pieņemot, ka jūs kaut kā esat saņēmis rokā savu robotu, varat turpināt darbu.
Ķēdes shēma
Pilna ķēdes shēma šim PIC mikrokontrollera robotizētajam rokam ir parādīta zemāk. Shēmas tika izveidotas, izmantojot EasyEDA.
Shēmas shēma ir diezgan vienkārša; visu projektu darbina 12 V adapteris. Pēc tam šis 12 V tiek pārveidots par + 5 V, izmantojot divus 7805 sprieguma regulatorus. Viens ir apzīmēts kā + 5V un otrs ir apzīmēts kā + 5V (2). Divu regulatoru esamība ir tāda, ka tad, kad servo rotē, tas ievelk lielu strāvu, kas rada sprieguma kritumu. Šis sprieguma kritums liek PIC sevi restartēt, tāpēc mēs nevaram darbināt gan PIC, gan servomotorus tajā pašā + 5V sliedē. Tātad vienu, kas apzīmēts kā + 5V, izmanto PIC mikrokontrollera, LCD un potenciometru darbināšanai, un servomotoru darbināšanai tiek izmantota atsevišķa regulatora izeja, kas apzīmēta kā + 5V (2).
Pieci potenciometru izejas kontakti, kas nodrošina mainīgu spriegumu no 0V līdz 5V, ir savienoti ar PIC analogajām tapām An0 līdz AN4. Tā kā PWM ģenerēšanai plānojam izmantot taimerus, servomotorus var savienot ar jebkuru GPIO tapu. Servomotoriem esmu izvēlējies tapas no RD2 līdz RD6, taču tas var būt jebkurš jūsu izvēlēts GPIO.
Tā kā programma ir saistīta ar daudz atkļūdošanu, 16x2 LCD displejs ir savienots arī ar PIC portB. Tas parādīs kontrolējamo servomotoru darba ciklu. Bez tam man ir arī paplašināti savienojumi ar visām GPIO un analogajām tapām, tikai gadījumā, ja nākotnē būs nepieciešams saskarne ar kādiem sensoriem. Visbeidzot, es esmu pievienojis arī programmētāja tapu H1, lai tieši ieprogrammētu PIC ar pickit3, izmantojot ICSP programmēšanas opciju.
PWM signālu ģenerēšana uz GPIO tapas servomotora vadībai
Kad ķēde ir gatava, mums ir jāizdomā, kā ģenerēt PWN signālus PIC GPIO tapā, lai kontrolētu servomotoru. Mēs jau esam noguruši kaut ko līdzīgu, izmantojot Taimera pārtraukšanas metodi, un guvām panākumus. Šeit mēs vienkārši veidosimies tam virsū, tāpēc, ja jūs esat jauns šeit, es iesaku pirms turpmākas darbības izlasīt šo iepriekšējo apmācību.
Visi hobija servomotori darbojas ar 50Hz frekvenci. Tas nozīmē, ka viens pilnīgs servomotora impulsa cikls būs 1/50 (F = 1 / T), kas ir 20 ms. No šiem 20ms vadības signāls ir tikai no 0 līdz 2ms, bet pārējais signāls vienmēr ir izslēgts. Zemāk redzamais attēls parāda, kā ON laiks mainās tikai no 0 līdz 2 ms, lai motoru pagrieztu no 0 grādiem līdz 180 grādiem no kopējā 20ms ilguma.
Paturot to prātā, programma ir jāraksta tā, lai PIC no potenciometra nolasītu 0 līdz 1204 un kartētu to no 0 līdz 100, kas būs servomotora darba cikls. Izmantojot šo darba ciklu, mēs varam aprēķināt servomotora ieslēgšanās laiku. Tad mēs varam inicializēt taimera pārtraukumu, lai tas regulāri pārpildītos tā, lai tas darbotos līdzīgi funkcijai milis () Arduino. Ar to mēs varam pārslēgt GPIO statusa tapu uz vēlamo ilgumu un izslēgt to pēc 20ms (viena pilna cikla) un pēc tam atkārtot to pašu procesu. Tagad, kad mēs esam sapratuši loģiku, ļaujiet mums iekļūt programmā.
PIC16F8771A programmēšana robotizētai rokai
Kā vienmēr, pilnu programmu ar video var atrast šīs lapas beigās, kodu var arī lejupielādēt no šejienes ar visiem nepieciešamajiem failiem. Šajā sadaļā mēs apspriedīsim programmas loģiku. Programma izmanto ADC moduli, taimera moduli un LCD moduli, lai vadītu robotizēto roku. Ja jūs nezināt, kā izmantot ADC vai taimera funkcijas vai saskarni ar LCD ar PIC, varat atgriezties attiecīgajās saitēs, lai tās uzzinātu. Tālāk sniegts skaidrojums, pieņemot, ka lasītājs ir iepazinies ar šiem jēdzieniem.
Taimera 0 porta konfigurācija
Vissvarīgākā koda sadaļa ir taimera 0 iestatīšana, lai tā pārsniegtu plūsmu katrai konkrētai aizkavēšanai. Formulas, lai aprēķinātu šo kavēšanos, var norādīt kā
Kavēšanās = ((256-REG_val) * (Prescal * 4)) / Fosc
Izmantojot OPTION_REG un TMR0 reģistru, mēs esam iestatījuši taimeri 0 darboties ar preskalāra vērtību 32, un REG val ir iestatīts uz 248. Mūsu aparatūrā izmantotā kristāla frekvence (Fosc) ir 20 MHz. Ar šīm vērtībām kavēšanos var aprēķināt kā
Kavēšanās = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 sekundes (vai) = 0,05 ms
Tāpēc tagad mēs esam iestatījuši taimera pārpildi ik pēc 0,05 ms. Kods, lai izdarītu to pašu, ir norādīts zemāk
/ ***** Taima taimera porta konfigurācija ****** / OPTION_REG = 0b00000100; // Taimeris0 ar ārējo frekvenci un 32 kā preskalāru // Iespējo arī PULL UPs TMR0 = 248; // Ielādējiet laika vērtību 0,0001 s; delayValue var būt no 0 līdz 255 tikai TMR0IE = 1; // Iespējot taimera pārtraukuma bitu PIE1 reģistrā GIE = 1; // Iespējot globālo pārtraukumu PEIE = 1; // Iespējot perifēro traucējumu / *********** ______ *********** /
No servomotora vadības loga no 0 ms līdz 2 ms mēs varam to vadīt ar izšķirtspēju 0,05 ms, kas ļauj mums (2 / 0,05) 40 dažādas pozīcijas motoram no 0 līdz 180 grādiem. Jūs varat vēl vairāk samazināt šo vērtību, ja jūsu MCU varētu to atbalstīt, lai iegūtu vairāk pozīciju un precīzu kontroli.
Pārtraucošā pakalpojumu kārtība (ISR)
Tagad, kad taimeris 0 ir iestatīts uz pārplūdi ik pēc 0,05 ms, mums būs iestatīts TMR0IF pārtraukuma karodziņš uz 0,05 ms. Tātad iekšpusē ISR funkcijas mēs varam atjaunotu šo karogu, un pieauguma mainīgo sauc skaits pa vienam. Tātad tagad šis mainīgais palielināsies par 1 par katriem 0,05 ms.
void break timer_isr () { if (TMR0IF == 1) // Taimera karodziņš ir aktivizēts taimera pārpildes dēļ -> iestatīts uz pārplūdi katrai 0.05ms { TMR0 = 248; // Ielādēt taimeri Vērtība TMR0IF = 0; // Notīrīt taimera pārtraukuma karodziņu skaitu ++; // Skaitiet soli par 1 par katrām 0,05 ms }
Darba cikla un ieslēgšanas laika aprēķināšana
Tālāk mums jāaprēķina visu piecu servomotoru darba cikls un laiks. Mums ir pieci servomotori, no kuriem katrs tiek izmantots, lai kontrolētu atsevišķu rokas daļu. Tāpēc mums ir jāizlasa visu piecu ADC vērtība un katram jāaprēķina darba cikls un laiks.
ADC vērtība būs diapazonā no 0 līdz 1024, kuru var pārveidot par 0% līdz 100% darba ciklu, vienkārši reizinot 0,0976 (100/1024 = 0,0976) ar iegūto vērtību. Šis 0 līdz 100% darba cikls pēc tam jāpārvērš ON laikā. Mēs zinām, ka 100% darba ciklā ieslēgšanās laikam jābūt 2ms (180 grādiem), tāpēc reizinot 0,02 (2/100 = 0,02), 0 līdz 100 darba cikls tiks pārvērsts par 0 līdz 2 ms. Bet pēc tam tiek iestatīts, ka mūsu taimera mainīgo skaits palielināsies reizi 0,05 ms. Tas nozīmē, ka skaitīšanas vērtība būs 20 (1 / 0,05 = 20) uz katrām 1 ms. Tāpēc mums jāreizina 20 ar 0,02, lai aprēķinātu precīzu mūsu programmas laiku, kas mums dos vērtību 0,4 (0,02 * 20 = 0,4). Tā paša kods ir parādīts zemāk, jūs varat redzēt, ka tas tiek atkārtots 5 reizes visiem 5 podiem, izmantojot for loop. Rezultātā iegūtās vērtības tiek saglabātas masīvā T_ON.
par (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Read (pot_num)); // Izlasiet POT vērtību, izmantojot ADC Duty_cycle = (POT_val * 0.0976); Kartē no 0 līdz 1024 līdz 0 līdz 100 T_ON = Duty_cycle * 0,4; // 20 * 0,02
Rotējošā motora izvēle
Mēs nevaram kontrolēt visus piecus motorus kopā, jo tas padarīs ISR kodu smagu, palēninot visu mikrokontrolleru. Tāpēc mums vienlaikus jāgriež tikai viens servomotors. Lai izvēlētos, kuru servo pagriezt, mikrokontrolleris uzrauga visu piecu servomotoru ieslēgšanās laiku un salīdzina to ar iepriekšējo laikā. Ja ON laiks mainās, mēs varam secināt, ka konkrētais servo ir jāpārvieto. Tālāk ir parādīts tā paša kods.
ja (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 = (Maksājuma_cikls)% 10; char d1 = (Maksājuma_cikls / 10)% 10; Lcd_Print_Char (d1 + '0'); Lcd_Print_Char (d2 + '0');
Mēs arī izdrukājam servo darba ciklu uz LCD ekrāna, lai lietotājs varētu uzzināt tā pašreizējo stāvokli. Pamatojoties uz ON laika izmaiņām, mainīgais servo tiek atjaunināts ar skaitļiem no 0 līdz 4, kas katrs pārstāv atsevišķus motorus.
Servomotora vadība ISR iekšpusē
ISR iekšienē mainīgo skaits tiek palielināts par katriem 0.05ms, tas nozīmē, ka par katru 1ms mainīgais tiks palielināts par 20. Izmantojot to, mums ir jākontrolē tapas, lai radītu PWM signālu. Ja skaitīšanas vērtība ir mazāka par ieslēgšanas laiku, šī motora GPIO tiek ieslēgts, izmantojot zemāk esošo līniju
PORTD = PORTD - servo_kods;
Šeit masīvā servo_code ir visu piecu servomotoru detaļa un, pamatojoties uz mainīgo servo vērtību, tiks izmantots konkrētā servomotora kods. Pēc tam tas ir loģiski VAI (-) ar esošajiem PORTD bitiem, lai mēs netraucētu citu motoru vērtības un atjauninātu tikai šo konkrēto motoru. Līdzīgi tapas izslēgšanai
PORTD = PORTD & ~ (servo_kods);
Mēs esam apgriezuši bitu vērtību, izmantojot loģisko apgriezto (~) operatoru, un pēc tam PORTD veicām operāciju AND (&), lai izslēgtu tikai vēlamo tapu, bet pārējās tapas atstātu iepriekšējā stāvoklī. Pilns koda fragments ir parādīts zemāk.
void break timer_isr () { if (TMR0IF == 1) // Taimera karodziņš ir aktivizēts taimera pārpildes dēļ -> iestatīts uz pārplūdi katrai 0.05ms { TMR0 = 248; // Ielādēt taimeri Vērtība TMR0IF = 0; // Notīrīt taimera pārtraukuma karodziņu skaitu ++; // Skaitiet soli par 1 par katrām 0.05ms -> skaits būs 20 par katru 1ms (0.05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; ja (skaitīt> = 20 * 20) skaitīt = 0; if (skaits <= (T_ON)) PORTD = PORTD - servo_kods; else PORTD = PORTD & ~ (servo_kods); }
Mēs zinām, ka kopējam ciklam ir jāilgst 20 ms, pirms GPIO tapa atkal tiek ieslēgta. Tāpēc mēs pārbaudām, vai skaitīšana ir pārsniegusi 20 ms, salīdzinot skaitīšanas vērtību ar 400 (tas pats aprēķins, kas tika apspriests iepriekš), un, ja jā, skaitlis atkal jāinicializē uz nulli.
PIC robotizētās rokas koda simulācija
Vienmēr ir labāk simulēt kodu, pirms to nogādāt īstajā aparatūrā. Tāpēc es izmantoju Proteus, lai simulētu savu kodu, un pārbaudīju, vai tas darbojas pareizi. Simulācijai izmantotā shēma ir parādīta zemāk. Mēs esam izmantojuši osciloskopu, lai pārbaudītu, vai PWM signāli tiek ģenerēti pēc nepieciešamības. Mēs arī varam pārbaudīt, vai LCD un Servo motori rotē, kā paredzēts.
Kā redzat, LCD displejā motora D darba cikls ir 07, pamatojoties uz pot vērtību, kas ir trešais motors. Līdzīgi, ja tiek pārvietots cits katls, šī katla darba cikls un tā motora numurs tiks parādīts LCD. Osciloskopā redzamais PWM signāls ir parādīts zemāk.
Kopējais cikla periods tiek mērīts kā 22,2 ms, izmantojot kursora opciju osciloskopā, kas ir ļoti tuvu vēlamajiem 20 ms. Visbeidzot, mēs esam pārliecināti, ka kods darbojas, tāpēc, lai turpinātu ķēdi, mēs to varam vai nu pielodēt uz perf plāksnes, vai arī izmantot PCB. Tas nedarbosies viegli uz maizes dēļa, jo POT vienmēr mēdz sagādāt dažas problēmas sliktu savienojumu dēļ.
PCB dizains, izmantojot EasyEDA
Lai izstrādātu šo PIC robotu roku, mēs esam izvēlējušies tiešsaistes EDA rīku ar nosaukumu EasyEDA. Es to izmantoju jau ilgu laiku, un man tas ir ļoti ērti, jo tam ir plaša pieeja un viegli izmantot dabu. Pēc PCB projektēšanas mēs varam pasūtīt PCB paraugus, izmantojot to zemo izmaksu PCB ražošanas pakalpojumus. Viņi piedāvā arī komponentu iegādes pakalpojumu, kur viņiem ir liels elektronisko komponentu krājums un lietotāji var pasūtīt nepieciešamos komponentus kopā ar PCB pasūtījumu.
Veidojot ķēdes un PCB, jūs varat arī padarīt savu shēmu un PCB dizainu publisku, lai citi lietotāji tos varētu kopēt vai rediģēt un gūt labumu no jūsu darba. Mēs esam arī padarījuši visus mūsu shēmas un PCB izkārtojumus publiski pieejamus šai shēmai, pārbaudiet šī saite:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
Izmantojot šo saiti, jūs varat tieši pasūtīt to pašu PCB, kuru mēs izmantojam šajā projektā, un izmantot to. Kad dizains ir pabeigts, tāfeli var uzskatīt par 3D modeli, kas būs ļoti noderīgs, lai vizualizētu, kā tā parādīsies pēc izgatavošanas. Dēļa 3D modelis, kuru mēs izmantojam, ir parādīts zemāk. Bez tam jūs varat arī apskatīt dēļa augšējo un apakšējo slāni, lai pārbaudītu, vai slidens ekrāns ir paredzēts.
Paraugu aprēķināšana un pasūtīšana tiešsaistē
Pēc šī PIC robota PCB dizaina pabeigšanas jūs varat pasūtīt PCB caur JLCPCB.com. Lai pasūtītu PCB no JLCPCB, jums ir nepieciešama Gerber File. Lai lejupielādētu Gerber failus no sava PCB, vienkārši noklikšķiniet uz pogas Ģenerēt izgatavošanas failu EasyEDA redaktora lapā, pēc tam lejupielādējiet Gerber failu no turienes vai varat noklikšķināt uz Pasūtīt pie JLCPCB, kā parādīts zemāk esošajā attēlā. Tas jūs novirzīs uz vietni JLCPCB.com, kur jūs varat izvēlēties pasūtāmo PCB skaitu, nepieciešamo vara slāņu skaitu, PCB biezumu, vara svaru un pat PCB krāsu, piemēram, zemāk parādīto momentuzņēmumu:
Kad esat izvēlējies visas opcijas, noklikšķiniet uz “Saglabāt grozā”, un jūs tiksiet novirzīts uz lapu, kur varēsit augšupielādēt savu Gerber failu, kuru esam lejupielādējuši no EasyEDA. Augšupielādējiet savu Gerber failu un noklikšķiniet uz “Saglabāt grozā”. Visbeidzot, noklikšķiniet uz Checkout Secure, lai pabeigtu pasūtījumu, pēc dažām dienām jūs saņemsiet savus PCB. Viņi izgatavo PCB ar ļoti zemu likmi, kas ir 2 ASV dolāri. Viņu būvēšanas laiks ir arī ļoti mazāks, tas ir 48 stundas ar DHL piegādi 3-5 dienas, būtībā jūs saņemsiet savus PCB nedēļas laikā pēc pasūtīšanas.
Pēc PCB pasūtīšanas jūs varat pārbaudīt sava PCB ražošanas progresu ar datumu un laiku. Jūs to pārbaudāt, dodoties uz Konta lapu un noklikšķinot uz "Ražošanas progress".
Pēc dažām PCB pasūtīšanas dienām es dabūju PCB paraugus jaukā iepakojumā, kā parādīts zemāk esošajos attēlos.
Un pēc šo gabalu iegūšanas es visus nepieciešamos komponentus esmu pielodējis pie PCB. Es arī tieši pielodēju POT, nevis izmantoju savienojošos vadus, jo sievietes un sievietes vadi, kurus es sākotnēji izmantoju, ja deva dīvainus analogās izejas spriegumus, iespējams, vaļīgu kontaktu dēļ. Kad visi komponenti bija samontēti, mana PCB izskatījās apmēram tā.
Jūs, iespējams, pamanījāt, ka šajā dēlī ir tikai viens 7805. Tas ir tāpēc, ka sākotnēji es domāju, ka varētu iztikt tikai ar regulatoru gan PIC, gan servomotora darbināšanai, un vēlāk es sapratu, ka man vajag divus. Tāpēc es izmantoju ārēju ķēdi, lai darbinātu servomotorus caur zaļajiem vadiem, kurus redzat šeit.
Tomēr jums par to nav daudz jāuztraucas, jo; Es tagad veicu izmaiņas PCB. Jūs varat izmantot modificēto PCB un lodēt abus regulatorus uz kuģa.
PIC robotizētās rokas darbs
Pēc visa nogurdinošā darba ir pienācis laiks atmaksāties. Lodējiet visus komponentus uz tāfeles un augšupielādējiet programmu PIC kontrolierī. Pilns kods ir norādīts zemāk vai to var lejupielādēt šeit. Uz tāfeles esošajam programmēšanas savienotājam vajadzētu palīdzēt bez maksas sagādāt programmu tieši, izmantojot Pickit 3. Kad programma ir augšupielādēta, jums vajadzētu redzēt LCD, kurā parādīts servo, kuru pašlaik kontrolē. Lai uzzinātu vairāk par PIC mikrokontrollera programmēšanu, vienkārši izpildiet iepriekšējo apmācību.
No turienes jūs varat vienkārši pagriezt katlu un pārbaudīt, kā servomotori reaģē uz katru potenciometru. Kad esat sapratis formātu, jūs varat kontrolēt robotizēto roku, lai veiktu jebkuru darbību, kas jums nepieciešama, lai veiktu un izklaidētos. Pilnīgu projekta darbu varat atrast zemāk esošajā videoklipā.
Tas ir, ka puiši cer, ka jūs sapratāt projektu un uzzinājāt no tā kaut ko jaunu. Ja jums ir kādi jautājumi, atstājiet tos komentāru sadaļā vai izmantojiet forumus citām tehniskām diskusijām.