- Piirikaavio
- PWM-signaalien luominen GPIO-nastalle servomoottorin ohjausta varten
- PIC16F8771A: n ohjelmointi robottivarrelle
- PIC-robotti-käsikoodin simulointi
- Piirilevysuunnittelu EasyEDA: n avulla
- Näytteiden laskeminen ja tilaaminen verkossa
- PIC-robottivarren toiminta
Robotti-aseita on kaikkialla autojen valmistusteollisuuden kokoonpanolinjasta telesurgery-robotteihin avaruudessa. Näiden robottien mekanismit ovat samanlaisia kuin ihmisen, joka voidaan ohjelmoida vastaavaan toimintaan ja lisääntyneisiin ominaisuuksiin. Niitä voidaan käyttää toistuvien toimintojen suorittamiseen nopeammin ja tarkemmin kuin ihmiset, tai niitä voidaan käyttää ankarissa olosuhteissa vaarantamatta ihmisen elämää. Olemme jo rakentaneet Record and Play -robotti-arman Arduinolla, joka voidaan kouluttaa suorittamaan tietty tehtävä ja saada toistamaan ikuisesti.
Tässä opetusohjelmassa käytämme alan standardia PIC16F877A 8-bittistä mikro-ohjainta ohjaamaan samaa robottivarsi potentiometreillä. Tämän projektin haasteena on, että PIC16F877A: lla on vain kaksi PWN-yhteensopivaa nastaa, mutta meidän on ohjattava robotillemme noin 5 servomoottoria, joka vaatii 5 erillistä PWM-nastaa. Joten meidän on käytettävä GPIO-nastoja ja luotava PWM-signaalit PIC GPIO-nastoihin käyttämällä ajastinkeskeytyksiä. Nyt tietysti voisimme päivittää parempaan mikrokontrolleriin tai käyttää multiplekseri-IC: tä helpottaaksemme asioita täällä paljon. Mutta silti kannattaa kokeilla tätä projektia oppimiskokemuksen saamiseksi.
Robotivarren mekaaninen rakenne, jota käytän tässä projektissa, tulostettiin täysin 3D-muodossa edellisessä projektissani; löydät täydelliset suunnittelutiedostot ja kokoonpanomenettelyt täältä. Vaihtoehtoisesti, jos sinulla ei ole 3D-tulostinta, voit myös rakentaa yksinkertaisen robottivarren käyttämällä pahvia, kuten linkissä näkyy. Olettaen, että olet jotenkin saanut käsiinsä robotti-käsivartesi, voit jatkaa projektia.
Piirikaavio
Tämän PIC-mikrokontrolleripohjaisen robottivarren täydellinen kytkentäkaavio on esitetty alla. Kaaviot piirrettiin EasyEDA: lla.
Piirikaavio on melko yksinkertainen; koko projekti saa virtansa 12 V: n adapterista. Tämä 12 V muunnetaan sitten + 5 V: ksi kahdella 7805-jännitesäätimellä. Yksi on merkitty nimellä + 5V ja toinen on merkitty numerolla + 5V (2). Syy kahdelle säätimelle on, että kun servo pyörii, se vetää sisään paljon virtaa, mikä aiheuttaa jännitehäviön. Tämä jännitehäviö pakottaa PIC: n käynnistymään uudelleen itsestään, joten emme voi käyttää sekä PIC- että servomoottoreita samalla + 5 V: n kiskolla. Joten + 5V -merkittyä käytetään PIC-mikrokontrollerin, LCD-näytön ja potentiometrien virranottoon, ja erillistä säätimen lähtöä, joka on merkitty numerolla + 5V (2), käytetään servomoottoreiden virran saamiseksi.
Potentiometrien viisi ulostulotappia, jotka tarjoavat vaihtelevan jännitteen 0 V - 5 V, on kytketty PIC: n analogisiin nastoihin An0 - AN4. Koska aiomme käyttää ajastimia PWM: n tuottamiseen, servomoottorit voidaan liittää mihin tahansa GPIO-nastaan. Olen valinnut servomoottoreille nastat RD2 - RD6, mutta se voi olla mikä tahansa valitsemasi GPIO.
Koska ohjelmaan liittyy paljon virheenkorjausta, 16x2 LCD-näyttö liitetään myös PIC: n porttiin B. Tämä näyttää ohjattavien servomoottoreiden toimintajakson. Tämän lisäksi minulla on myös laajennetut yhteydet kaikille GPIO- ja analogisille nastoille, siltä varalta, että antureita on jatkossa liitettävä. Lopuksi olen myös liittänyt ohjelmointitapin H1 ohjelmoimaan PIC suoraan pickit3: lla ICSP-ohjelmointivaihtoehdolla.
PWM-signaalien luominen GPIO-nastalle servomoottorin ohjausta varten
Kun piiri on valmis, meidän on selvitettävä, kuinka tuottaa PWN-signaaleja PIC: n GPIO-nastalle servomoottorin ohjaamiseksi. Olemme jo väsyttäneet jotain vastaavaa ajastimen keskeytysmenetelmällä ja onnistuimme. Täällä aiomme vain rakentaa sen päälle, joten jos olet uusi täällä, suosittelen sinua lukemaan tämä edellinen opetusohjelma ennen kuin jatkat.
Kaikki harrastus servo moottorit toimivat taajuudella 50Hz. Tarkoittaen, että servomoottorin yksi täydellinen syklijakso on 1/50 (F = 1 / T), joka on 20 ms. Tästä täydellisestä 20 ms: sta ohjaussignaali on vain 0 - 2 ms, kun taas loput signaalista on aina pois päältä. Alla olevassa kuvassa näkyy, kuinka ON-aika vaihtelee vain 0: sta 2 ms: iin moottorin kiertämiseksi 0 ° - 180 ° 20ms: n kokonaiskestosta.
Tämän vuoksi meidän on kirjoitettava ohjelma siten, että PIC lukee potentiometriltä 0-1204 ja kartoittaa sen arvoon 0-100, joka on servomoottorin toimintajakso. Tätä työjaksoa käyttämällä voimme laskea servomoottorin ON-ajan. Sitten voimme aloittaa ajastimen keskeytyksen ylivuotoon säännöllisin väliajoin siten, että se toimii samalla tavalla kuin Arduinon millis () -funktio. Tällä tavoin voimme vaihtaa GPIO-tilan nastan korkeaksi halutuksi ajaksi ja sammuttaa sen 20 ms: n (yhden kokonaisen jakson) jälkeen ja toistaa sitten saman prosessin. Nyt, kun olemme ymmärtäneet logiikan, päästäkäämme ohjelmaan.
PIC16F8771A: n ohjelmointi robottivarrelle
Kuten aina, koko video-ohjelma löytyy tämän sivun lopusta, myös koodi voidaan ladata täältä kaikista tarvittavista tiedostoista. Tässä osassa keskustellaan ohjelman logiikasta. Ohjelma käyttää ADC-moduulia, ajastinmoduulia ja LCD-moduulia robotin varren ohjaamiseen. Jos et ole tietoinen ADC- tai ajastinominaisuuksien käytöstä tai nestekidenäytön liittämisestä PIC: n kanssa, voit palata vastaaviin linkkeihin oppiaksesi ne. Seuraava selitys annetaan olettaen, että lukija tuntee nämä käsitteet.
Ajastin 0 Portin määritys
Koodin tärkein osa on asettaa ajastin 0 ylivirtaamaan jokaiselle viiveelle. Kaavat tämän viiveen laskemiseksi voidaan antaa muodossa
Viive = ((256-REG_val) * (Prescal * 4)) / Fosc
Käyttämällä OPTION_REG- ja TMR0-rekisteriä olemme asettaneet ajastimen 0 toimimaan preskalariarvolla 32 ja REG-arvoksi on asetettu 248. Laitteistossamme käytetty kristallitaajuus (Fosc) on 20 MHz. Näillä arvoilla viive voidaan laskea
Viive = ((256-248) * (32 * 4)) / (20000000) = 0,0000512 sekuntia (tai) = 0,05 ms
Joten nyt olemme asettaneet ajastimen ylivuotamaan 0,05 ms välein. Koodi saman tekemiseksi on annettu alla
/ ***** Portin määritys ajastimelle ****** / OPTION_REG = 0b00000100; // Ajastin0 ulkoisella taajuudella ja 32 preskalaarina // Mahdollistaa myös PULL UPs TMR0 = 248; // Lataa aika-arvo 0,0001 sekunnille; delayValue voi olla välillä 0-256 vain TMR0IE = 1; // Ota ajastimen keskeytysbitti käyttöön PIE1-rekisterissä GIE = 1; // Ota globaali keskeytys käyttöön PEIE = 1; // Ota käyttöön oheislaitteiden keskeytys / *********** ______ *********** /
Servomoottorin 0–2 ms: n ohjausikkunasta voimme ohjata sitä tarkkuudella 0,05 ms, mikä antaa meille mahdollisuuden (2 / 0,05) 40 eri asentoon moottorille välillä 0–180 astetta. Voit pienentää tätä arvoa edelleen, jos MCU voisi tukea sitä saadakseen enemmän sijainteja ja tarkkaa hallintaa.
Keskeytä palvelurutiini (ISR)
Nyt kun ajastin 0 on asetettu ylivirtaamaan 0,05 ms välein, TMR0IF-keskeytyslippu asetetaan 0,05 ms: iin. Joten sisällä ISR funktio voimme palauttaa että lippu ja kasvu muuttuja nimeltä laskea mukaan yksi. Joten nyt tämä muuttuja kasvaa yhdellä 0,05 ms: n välein.
void keskeytys timer_isr () { if (TMR0IF == 1) // Ajastinlippu on lauennut ajastimen ylivuodon takia -> asetettu ylivuotoon 0,05 ms välein { TMR0 = 248; // Lataa ajastin Arvo TMR0IF = 0; // Tyhjennä ajastimen keskeytyslippujen määrä ++; // Laske lisäykset yhdellä 0,05 ms: n välein }
Lasketaan käyttöjakso ja käynnistysaika
Seuraavaksi meidän on laskettava kaikkien viiden servomoottorin käyttöjakso ja ajo. Meillä on viisi servomoottoria, joista kumpaakin käytetään yksittäisen varsiosan ohjaamiseen. Joten meidän on luettava kaikkien viiden ADC-arvo ja laskettava kullekin käyttöjakso ja ajo.
ADC-arvo on välillä 0-1024, joka voidaan muuntaa 0%: sta 100%: n käyttöjaksoksi kertomalla yksinkertaisesti 0,0976 (100/1024 = 0,0976) saatuun arvoon. Tämä 0-100%: n käyttöjakso on sitten muunnettava ON-aikaan. Tiedämme, että 100%: n käyttöjakson aikana ON-ajan on oltava 2 ms (180 astetta varten), joten kertomalla 0,02 (2/100 = 0,02) muunnetaan 0: sta 100: een työjaksoksi 0 ms: ksi 2 ms. Mutta sitten ajastimen muuttujien määrä asetetaan kasvamaan kerran 0,05 ms: n välein. Tämä tarkoittaa, että laskenta-arvo on 20 (1 / 0,05 = 20) 1 ms: n välein. Joten meidän on kerrottava 20 arvolla 0,02 laskeaksesi tarkan aikataulun ohjelmallemme, mikä antaa meille arvon 0,4 (0,02 * 20 = 0,4). Saman koodi näkyy alla, näet sen toistuvan 5 kertaa kaikille 5 potille for-silmukan avulla. Tuloksena olevat arvot tallennetaan T_ON-ryhmään.
for (int pot_num = 0; pot_num <= 3; pot_num ++) { int Pev_val = T_ON; POT_val = (ADC_Lue (pot_num)); // Lue POT: n arvo käyttämällä ADC Duty_cycle = (POT_val * 0.0976); // Kartta 0-1024 - 0-100 T_ON = Duty_cycle * 0,4; // 20 * 0,02
Kierrettävän moottorin valinta
Emme voi hallita kaikkia viittä moottoria yhdessä, koska se tekee ISR-koodista raskasta hidastamalla koko mikro-ohjainta. Joten meidän täytyy kiertää vain yhtä servomoottoria kerrallaan. Kierrettävän servon valitsemiseksi mikrokontrolleri valvoo kaikkien viiden servomoottorin ON-aikaa ja vertaa sitä aikaisempaan aikaan. Jos ON-aika muuttuu, voimme päätellä, että tiettyä servoa on siirrettävä. Saman koodi näkyy alla.
jos (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:");} muuten if (pot_num == 1) {Lcd_Set_Cursor (1,6); Lcd_Print_String ("B:");} muu if (pot_num == 2) {Lcd_Set_Cursor (1,11); Lcd_Print_String ("C:");} muuten if (pot_num == 3) {Lcd_Set_Cursor (2,1); Lcd_Print_String ("D:");} muuta jos (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');
Tulostamme myös servosyklin LCD-näytölle, jotta käyttäjä voi olla tietoinen sen nykyisestä sijainnista. Päällä-ajan muutoksen perusteella muuttuja servo päivitetään numeroilla 0 - 4, joista kukin edustaa yksittäisiä moottoreita.
Servomoottorin hallinta ISR: n sisällä
ISR: n sisällä muuttujien lukumäärä kasvaa 0,05 ms: n välein, mikä tarkoittaa, että jokaista 1 ms: tä kohden muuttujaa lisätään 20: llä. Tätä käyttämällä meidän on hallittava nastoja PWM-signaalin tuottamiseksi. Jos laskennan arvo on pienempi kuin on time, kyseisen moottorin GPIO kytketään päälle alla olevan rivin avulla
PORTD = PORTD - servokoodi;
Tässä taulukossa servo_code on kaikkien viiden servomoottorin nastatiedot ja muuttuvassa servossa olevan arvon perusteella käytetään kyseisen servomoottorin koodia. Sitten se on loogisesti TAI (-) olemassa olevilla PORTD-biteillä, jotta emme häiritse muiden moottoreiden arvoja ja päivitämme vain tätä moottoria. Vastaavasti tapin sammuttamiseksi
PORTD = PORTD & ~ (servokoodi);
Olemme kääntäneet bittiarvon käänteislogiikkaoperaattorin (~) avulla ja suorittaneet sitten PORTD: lla AND (&) -operaation sammuttaaksesi vain halutun tapin ja jättämällä muut nastat edelliseen tilaansa. Koko koodinpätkä näkyy alla.
void keskeytys timer_isr () { if (TMR0IF == 1) // Ajastinlippu on lauennut ajastimen ylivuodon takia -> asetettu ylivuotoon 0,05 ms välein { TMR0 = 248; // Lataa ajastin Arvo TMR0IF = 0; // Tyhjennä ajastimen keskeytyslippujen määrä ++; // Laske lisäykset yhdellä 0,05 ms: n välein -> laskenta on 20 1 ms: n välein (0,05 / 1 = 20)) } int servo_code = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100}; jos (laskenta> = 20 * 20) laskea = 0; if (määrä <= (T_ON)) PORTD = PORTD - servokoodi; muuten PORTD = PORTD & ~ (servokoodi); }
Tiedämme, että koko jakson on kestettävä 20 ms ennen GPIO-nastan käynnistämistä uudelleen. Joten tarkistamme, onko lukumäärä ylittänyt 20 ms vertaamalla laskennan arvoa 400: een (sama laskelma kuin yllä on käsitelty) ja jos kyllä, meidän on aloitettava luku uudelleen nollaksi.
PIC-robotti-käsikoodin simulointi
On aina parempi simuloida koodi ennen sen viemistä todelliseen laitteistoon. Joten käytin Proteusta simuloimaan koodiani ja vahvistin sen toimivan oikein. Simulaatioon käytetty piiri on esitetty alla. Olemme käyttäneet oskilloskooppia tarkistaaksemme, muodostetaanko PWM-signaaleja tarpeen mukaan. Voimme myös tarkistaa, pyörivätkö LCD- ja servomoottorit odotetusti.
Kuten näette, nestekidenäytössä näytetään moottorin D käyttöjakso 07 potin arvon perusteella, joka on kolmas moottori. Samanlainen, jos toista astiaa siirretään kyseisen potin käyttöjaksoksi ja sen moottorin numero näkyy nestekidenäytössä. Oskilloskoopilla esitetty PWM-signaali on esitetty alla.
Syklin kokonaisjaksoksi mitataan 22,2 ms oskilloskoopin kohdistinvaihtoehdolla, joka on hyvin lähellä haluttua 20 ms. Lopuksi olemme varmoja, että koodi toimii, joten jatkaaksemme piiriä voimme joko juottaa sen täydelle levylle tai käyttää piirilevyä. Se ei toimi helposti leipälaudalla, koska POT: lla on taipumus aina aiheuttaa ongelmia huonojen yhteyksien takia.
Piirilevysuunnittelu EasyEDA: n avulla
Tämän PIC-robottivarren suunnittelemiseksi olemme valinneet online-EDA-työkalun nimeltä EasyEDA. Olen käyttänyt sitä jo pitkään, ja pidän sitä erittäin kätevänä, koska sen jalanjälki on laaja ja helppokäyttöinen. PCB: n suunnittelun jälkeen voimme tilata PCB-näytteet niiden edullisten PCB-valmistuspalveluiden avulla. Ne tarjoavat myös komponenttien hankintapalvelua, jossa heillä on suuri määrä elektronisia komponentteja ja käyttäjät voivat tilata tarvittavat komponentit piirilevytilauksen mukana.
Piirejä ja piirilevyjä suunniteltaessa voit myös tehdä piireistä ja piirilevyistä julkisia, jotta muut käyttäjät voivat kopioida tai muokata niitä ja hyötyä työstäsi. Olemme myös julkistaneet koko piirin ja piirilevyasettelut tälle piirille, tarkista alla oleva linkki:
easyeda.com/circuitdigest/pic-development-board-for-robotic-arm
Tämän linkin avulla voit suoraan tilata saman piirilevyn, jota käytämme tässä projektissa, ja käyttää sitä. Kun suunnittelu on valmis, levyä voidaan tarkastella 3D-mallina, mikä on erittäin hyödyllistä visualisoida, kuinka levy näyttää valmistuksen jälkeen. Käytämme piirilevyn 3D-malli on esitetty alla. Tämän lisäksi voit tarkastella levyn ylä- ja alakerrosta tarkistaaksesi, onko liukas näyttö odotettua.
Näytteiden laskeminen ja tilaaminen verkossa
Kun olet suorittanut tämän PIC-robottipiirilevyn suunnittelun, voit tilata piirilevyn JLCPCB.com -sivuston kautta. Jos haluat tilata piirilevyn JLCPCB: ltä, tarvitset Gerber-tiedoston. Lataa PC: n Gerber-tiedostot napsauttamalla Luo valmistustiedosto -painiketta EasyEDA-editorisivulla, lataa sitten Gerber-tiedosto sieltä tai voit napsauttaa Tilaa JLCPCB : ssä alla olevan kuvan mukaisesti. Tämä ohjaa sinut osoitteeseen JLCPCB.com, josta voit valita tilattavien piirilevyjen määrän, kuinka monta kuparikerrosta tarvitset, piirilevyn paksuuden, kuparin painon ja jopa piirilevyn värin, kuten alla oleva tilannekuva:
Kun olet valinnut kaikki vaihtoehdot, napsauta "Tallenna ostoskoriin" ja sinut siirretään sivulle, jonne voit ladata GerED-tiedostosi, jonka olemme ladanneet EasyEDA: lta. Lataa Gerber-tiedosto ja napsauta "Tallenna ostoskoriin". Ja lopuksi klikkaa Checkout Secure loppuun tilauksesi, niin saat piirilevyt muutama päivä myöhemmin. He valmistavat piirilevyä erittäin alhaisella nopeudella, joka on 2 dollaria. Niiden rakennusaika on myös hyvin lyhyt, mikä on 48 tuntia, kun DHL-toimitus on 3-5 päivää, periaatteessa saat piirilevyt viikon kuluessa tilauksesta.
Kun olet tilannut piirilevyn, voit tarkistaa piirilevyn tuotannon edistymisen päivämäärän ja kellonajan kanssa. Tarkistat sen siirtymällä Tilisivulle ja napsauttamalla "Tuotannon edistyminen".
Muutaman päivän PCB: n tilaamisen jälkeen sain PCB-näytteet mukavissa pakkauksissa alla olevien kuvien mukaisesti.
Ja saatuaan nämä kappaleet olen juotanut kaikki tarvittavat komponentit piirilevylle. Juotin myös POT: n suoraan liitäntäjohtojen sijasta, koska alun perin käyttämäni naaras-naaras-johdot, joissa annoin outoja analogisia lähtöjännitteitä todennäköisesti löysien koskettimien takia. Kun kaikki komponentit oli koottu, piirilevy näytti tältä.
Olet ehkä huomannut, että tällä taululla on vain yksi 7805. Tämä johtuu siitä, että aluksi ajattelin, että voisin päästä eroon vain säätimestä sekä PIC- että servomoottorin virran saamiseksi, ja myöhemmin tajusin, että tarvitsen kaksi. Joten olen käyttänyt ulkoista piiriä servomoottoreiden virran saamiseksi täällä näkyvien vihreiden johtojen läpi.
Siitä huolimatta sinun ei tarvitse huolehtia siitä paljon, koska; Olen tehnyt muutokset piirilevyyn nyt. Voit käyttää muokattua piirilevyä ja juottaa molemmat säätimet itse aluksella.
PIC-robottivarren toiminta
Kaiken rasittavan työn jälkeen on aika maksaa takaisin. Juota kaikki piirilevyn osat ja lataa ohjelma PIC-ohjaimeen. Täydellinen koodi on annettu alla tai sen voi ladata täältä. Taululla olevan ohjelmointiliittimen pitäisi auttaa sinua lataamaan ohjelma suoraan Pickit 3: n avulla ilman suurta vaivaa. Kun ohjelma on ladattu, sinun pitäisi nähdä nestekidenäyttö, joka näyttää tällä hetkellä ohjattavan servon. Jos haluat lisätietoja PIC-mikrokontrollerin ohjelmoimisesta, seuraa vain edellistä opetusohjelmaa.
Sieltä voit yksinkertaisesti kääntää pottia ja tarkistaa, kuinka servomoottorit reagoivat jokaiseen potentiometriin. Kun ymmärrät muodon, voit hallita robottiosaa suorittamaan mitä tahansa toimintoa, jota tarvitset sen suorittamiseen ja hauskanpitoon. Löydät projektin täydellisen toiminnan alla olevasta videosta.
Kaverit toivovat ymmärtävänne projektin ja oppineen siitä jotain uutta. Jos sinulla on kysyttävää, jätä ne kommenttiosioon tai käytä foorumeita muihin teknisiin keskusteluihin.