Mikrokontrollerikitit - loppuraportti AS-0.3200 Automaatio- ja systeemitekniikan projektityöt Aihe: S13-04 Design and assembly of microcontroller kits Työn laajuus: 5 op Hannu Leppinen 78673R, AUT, hannu.leppinen@aalto.fi Petri Niemelä 221643, AUT, petri.niemela@aalto.fi Markus Peltola 84765H, AUT, markus.peltola@aalto.fi Työn valvojat: Mika Strömman, Konsta Hölttä 8.5.2013
Työn kuvaus Projektityön tarkoituksena oli koota mikrokontrollerikittejä, jotka mahdollistavat erilaisten sensorien ja toimilaitteiden helpon ja nopean kytkemisen Teensy-mikrokontrolleriin. Projektityön alussa kitteihin oli olemassa alustavat suunnitelmat ja jonkin verran hankittuja komponentteja. Projektityön puitteissa suunniteltiin ja valmistettiin piirilevyt ja kolvattiin niihin komponentit, sekä toteutettiin kolme kittejä käyttävää demoa. Työn lopputulos Työn lopputuloksena saatiin aikaiseksi 4 kpl valmista mikrokontrollerikittiä. Lisäksi saatiin aikaan dokumentaatio, joka mahdollistaa kittien käyttämisen opetuksessa sekä lisäkittien rakentamisen. Kittejä on mahdollista rakentaa ylijääneistä osista vielä 1-2 kappaletta. Työn kulku Työ käynnistyi tammikuussa 2013 suunnittelemalla aikataulua sekä tutkimalla Konsta Höltältä saatuja suunnitelmia. III periodin aikana päätettiin toteuttaa piirilevysuunnittelu, ja varsinainen kittien valmistus jäisi IV periodiin. III periodille haluttiin vähemmän kuormitusta aikatauluongelmien vuoksi. III periodissa aikataulussa päästiin jopa edelle, sillä ensimmäiset prototyypit olivat jo kurssin väliraporttiin mennessä valmiita. Loppuraporttiin mennessä kitit olivat valmiita, mutta dokumentaatio ja käyttöohje oli vielä viimeistelyä vailla. Toteutunut aikataulu Projektin suunnitellussa aikataulussa pysyttiin melko hyvin. Väliraporttiin mennessä oli jo saatu valmiiksi prototyyppiversiot kitin piirilevyistä. Lopulliset levyt tilattiin EuroCircuitsilta ja niihin kolvattiin komponentit vapun tienoilla. Samoihin aikoihin piirilevyt kiinnitettiin pleksiin ja dokumentaatiota alettiin kirjoittamaan. Työ hiottiin loppuun keskiviikon 8.5. loppudemoa edeltävänä maanantaina ja tiistaina. Toteutunut työnjako Alunperin suunniteltu työnjako oli: Piirilevysuunnittelu: Petri ja Markus Esitestaus: Markus Kokoonpano: yhteisesti Demot: Hannu, Petri Dokumentointi: yhteisesti Suunnittellussa työnjaossa eri työvaiheita oli jaettu eri ihmisille, mutta käytännössä kaikki ryhmäläiset osallistuivat kaikkiin työvaiheisiin. Myöhemmin vastuuta jaettiin toteutettavien PCB:eiden perusteella.
Pää-PCB (mikrokontrolleri): Petri Moottoriohjain-PCB: Markus Analogi-PCB: Hannu LCD-PCB: Hannu Vastuualueet menivät kuitenkin lopulta melko päällekkäin, ja kaikki ryhmäläiset tekivät kaikkia osa-alueita: piirilevyjen kolvailua, piirisuunnittelua, pleksin sahausta, demojen ohjelmointia, dokumentointia ja niin edelleen. Käytetyt työtunnit Tässä on kuvattu keskimääräinen projektin tekijän tuntityömäärä. Tuntimäärät saattoivat vaihdella hieman henkilöittäin riippuen päivästä. Ajankäyttö poikkesi suunnitellusta pääasiassa siten, että prototyyppi tehtiin valmiiksi ennen välidemoa ja varsinaiset kitit ennen loppudemoa. Alkuperäisessä suunnitelmassa ei mainittu prototyyppiä. 1. Suunnitelmademoon valmistautuminen, alustava kittien ja demojen suunnittelu ja materiaalien kokoaminen 10h 2. Piirilevyjen suunnittelu 20 h 3. Prototyypin valmistus 15 h 4. Välidemoon valmistautuminen 5h 5. Piirilevyjen tilaus, kolvaus, pleksien tekeminen, kittien kokoaminen 30 h 6. Demon tarkempi suunnittelu 10 h 7. Demon toteutus (ja kittien testaus) 25 h 8. Loppudemoon valmistautuminen, dokumentointi ja viimeistely 15 h Yhteensä 130 h Tuntimäärä vastaa hyvin projektiin varattua viittä opintopistettä. Työn tulokset Kitit Työn lopputuloksena syntyi 4 kappaletta kuvassa 1 näkyvän kaltaista mikrokontrollerikittiä. Lisäksi suunniteltiin kiteillä toteutettavia demoesimerkkejä kolme kappaletta. Kittejä varten myös kirjoitettiin käyttöohje. Yli jääneistä osista ja levyistä olisi mahdollista rakentaa vielä 1-2 kittiä lisää.
Kuva 1. Mikrokontrollerin sisältö (ilman kaapeleita): 1. Potentiometrimoduuli, 2. Moottoriohjainmoduuli, 3. Näppäinmatriisi, 4. Analogi/etäisyysmittausmoduuli, 5. Päämoduuli. Mikrokontrollerikitti koostuu mikrokontrollerin sisältävästä päälevystä sekä lisämoduuleista, jotka toimivat mikrokontrollerin ohjaamina sensoreina tai toimilaitteina. Lisämoduulit voi kytkeä 10-pinnisillä kaapeleilla suoraan päälevyyn. Kuvassa 2 on esitetty 10-pinnisen liittimen pinnijako. Mikrokontrollerikitti koostuu seuraavista moduuleista: Päämoduuli: Mikrokontrollerilevy 8 painiketta LCD-moduuli Lisämoduuli 1: Näppäinmatriisi (valmis moduuli) Lisämoduuli 2: A/D-testaus- ja haaroitinlauta potentiometreillä (valmis moduuli) Lisämoduuli 3: Etäisyysmittaus/analogimuunnoslevy Lisämoduuli 4: Servomoottorilevy
Kuva 2. 10-pinnisen liittimen pinnit, kun PCB:llä olevaa liitintä katsotaan ylhäältä päin. Pinneissä 1-8 kulkevat analogi- ja digitaalisignaalit, VCC on käyttöjännite ja GND on maa. Vaikka lisämoduulit 1 ja 2 olivat kaupasta ostettuja, tehtiin myös niihin jalusta pleksistä. Pleksit suunniteltiin, mitattiin, sahattiin ja porattiin, Lisämoduulit voidaan kytkeä päämoduuleihin 10-pinnisellä liittimellä, jonka pinnijako on joka kitissä sama. (8 signaalia, käyttöjännite ja maa). Yhdessä päämoduulin liittimistä on kuitenkin myös analogimahdollisuus, jota lisämoduulit 2 ja 3 hyödyntävät. Päämoduulin mikrokontrollerilevyssä on mikrokontrollerin lisäksi virtaliitin, 8 lediä, RS232 - UART-muunnin ja I2C-liitäntä, JTAG-liitin debuggaukseen ja jännitereferenssiliitin. Kaksi päälevyistä toteutettiin ulkoiselle virtalähteelle tarkoitetuksi ja kaksi USB-virransyötölle. USB-virransyöttö havaittiin riittäväksi jopa moottoreita käytettäessä. Demot Työssä suunniteltiin kolme mikrokontrollerikiteillä toteutettavaa demoa, jotka esittelevät kittien mahdollisuuksia. Demoilla voidaan myös testata, että kitit toimivat suunnitellulla tavalla. Kuvassa 3 on nähtävissä demon 3 prototyyppiversio. Demojen koodit ovat liitteessä 2. Demojen toteutus on kuvattu tässä melko ylimalkaisesti, ja käyttöohjeeseen tulee tarkempi kuvaus. 1. Ledien vilkutus Mikrokontrolleri vilkuttelee päälevyn ledejä Knight Rider -tyyliin. Demossa tarvitaan ainoastaan päämoduulia. 2. Etäisyys LCD-näytöllä LCD-näyttö näyttää infrapunaetäisyyssensorin mittaaman etäisyyden. Etäisyys lasketaan kolmen mittauksen keskiarvosta. Toimii huonevalaistuksessa käytännössä n. 10-30 cm etäisyyksillä suht tarkasti. Demossa käytetään päämoduulia ja analogi/etäisyysmittausmoduulia. Analogi/etäisyysmittausmoduuli kytketään analogisignaalin vuoksi päämoduulin porttiin F.
3. Moottorin pyörimisnopeus LCD-näytöllä Moottorin pyörimisnopeus on säädettävissä potikalla. Moottorin pyörimisnopeus näkyy LCD-näytöllä. Potentiometrimoduuli kytketään analogisignaalien vuoksi päämoduulin porttiin F. Demossa tarvitaan päämoduuli, moottoriohjainmoduuli ja potentiometrimoduuli. Kuva 3. Moottoridemon protoilua. Käyttöohje Työn tuloksena syntyy myös PDF-muotoinen käyttöohje. Tätä loppuraporttia kirjoitettaessa käyttöohje on vielä keskeneräinen, mutta se tulee olemaan englanniksi ja se sisältää teknisen kuvauksen mikrokontrollerikiteistä, ohjeet niiden ohjelmointiin sekä suunnitellut kolme esimerkkidemoa. Työssä opittua Työssä opimme pääasiassa piirilevysuunnittelua Eaglellä ja KiCadillä. Opimme myös ettei kahta piirilevysuunnitteluohjelmaa kannata käyttää rinnakkain. Moottoriohjain suunniteltiin alun perin KiCadillä, mutta yhteensopivuusongelmien vuoksi se jouduttiin käsin suunnittelemaan uudestaan Eagleen. Työssä päästiin myös prototyyppiversiota valmistettaessa tutustumaan Kone 3:n piirinlevyvalmistusmahdollisuuksiin. Prototyypin ja valmiiden kittien kokoaminen myös opetti TUASin elektroniikkahuoneen ja prosessihallin käyttöä, vaikka tiimin kaikilla jäsenillä oli näihin liittyvistä toimenpiteistä jo aiempaa kokemusta elektroniikkaharrastelujen vuoksi.
Ohjelmoinnin suhteen ei tapahtunut suurempaa oppimista, sillä käytimme Arduino-kirjastoa Teensylle. Arduino oli kaikille tiimin jäsenille tuttu entuudestaan. Jatkotyöehdotuksia Jos kittien parissa työskentelyä jatketaan, seuraavia parannusehdotuksia voi käyttää jatkotyön pohjana: lisämoduulin toteutus: analoginen viiden vapausasteen IMU (kiihtyvyysanturit ja gyrot) lisämoduulin toteutus: langaton ZigBee-radiolinkki kommunikointiin tietokoneen tai toisen mikrokontrollerin kanssa kahden lisäkitin kokoaminen jäljelle jääneistä osista lisädemojen kehittäminen, jotta kaikki olemassa olevat moduulit tulevat hyödynnetyksi uusien lisämoduulien ideointi jonkin järjestelmän toteuttaminen kitin mahdollisuuksia hyödyntäen uusien ominaisuuksien dokumentointi Yhteenveto Projektityön tarkoituksena oli tuottaa opetustarkoitukseen soveltuvia mikrokontrollerikittejä. Asetetut tavoitteet saavutettiin, sillä kittejä toteutettiin 4 kappaletta. Myös ylimääräisiä osia jäi jäljelle, joista voisi rakentaa vielä muutaman kitin. Opetustarkoitusta korostaa myös se, että kitteihin tuotetaan käyttöohje. Käyttöohjeessa tulee olemaan kuvattuna esimerkkidemoja, jotka hyödyntävät kittien ominaisuuksia. Demojen koodit myös kommentoidaan paremmin käyttöohjeeseen. Työhön käytettiin noin 8 henkilökohtaista tuntia (4 tuntia ryhmätyötä ja 4 tuntia yksilötyötä) viikossa koko kevään ajan, mikä vastaa melko hyvin työn 5 opintopisteen laajuutta.
Liite 1. Toteutettujen levyjen suunnitelmat Päälevy
Analogilevy
LCD-adapteri
Moottoriohjainlevy
Liite 2. Demojen koodit (esimerkkejä) Viimeisimmät versiot ovat käyttöohjeessa 1. Ledien vilkutus /* *Knightrider */ voidsetup(){ DDRA=0xFF; PORTA=0x00; voidloop(){ PORTA=0x01; while(pina!=0x80){ delay(200); PORTA<<=1; PORTA=0x80; while(pina!=0x01){ delay(200); PORTA>>=1; 2.Etäisyysmittaus /* *IRdistancesensor */ #include<liquidcrystal.h> LiquidCrystallcd(20,21,22,23,24,25,26); floatread_gp2d12_range(bytepin){ inttmp; tmp=analogread(pin); if(tmp<3)
return-1;//invalidvalue return(6787.0/((float)tmp-3.0))-4.0; voidsetup(){ lcd.begin(16,2); voidloop(){ floatval=0.5f*read_gp2d12_range(38); lcd.clear(); lcd.setcursor(0,0); lcd.print("distance:"); lcd.setcursor(0,1); lcd.print(val); lcd.print("cm"); delay(200); 3. Moottorin pyörimisnopeus LCD-näytöllä /* MOTOR */ #include<liquidcrystal.h> LiquidCrystallcd(32,33,34,35,28,29,30);//PORTA voidsetup() { //Initializelcd lcd.begin(16,2); pinmode(22,output);//in1 pinmode(23,output);//in2 voidloop() { //Readvalue
intval=analogread(38)/2; // lcd.clear(); lcd.print("setpoint:"); lcd.print(val-256); if(val>240&&val<280){ //Freespinning digitalwrite(22,low); digitalwrite(23,low); analogwrite(27,0); elseif(val>280){ //Spinfoward digitalwrite(22,high); digitalwrite(23,low); analogwrite(27,val-257); else{ //Spinbackward digitalwrite(22,low); digitalwrite(23,high); analogwrite(27,255-val); delay(100);