Mikrokontroleri – Quercus Lab http://www.quercus-lab.com Blog o softverskom razvoju, elektronici ... Wed, 30 Oct 2013 08:40:37 +0000 en-US hourly 1 https://wordpress.org/?v=4.9.8 Netduino – mikrokontroleri na objektni načinhttp://www.quercus-lab.com/netduino-mikrokontroleri-na-objektni-nacin/ Wed, 30 Jan 2013 08:45:32 +0000 http://www.quercus-lab.com/?p=1024 Tjekom razvoja tehnologije kod programera je došlo do  uske specijalizacije područja interesa. Možemo govoriti o dvije osnovne grupe: prva grupu čine programeri aplikacija za osobna  računala  dok drugu  grupu predstavljaju programeri aplikacija koje se izvode na specijaliziranim uređajima nestandardiziranih platformi.  Programeri prve grupe rade  uglavnom na vrlo apstraktnoj razini programiranja dok oni drugi još uvijek moraju imati dobra znanja o hardverskim karakteristikama ciljane opreme. Razvoj telekomunikacija, ponajprije mobilnih uređaja, uvjetovao je potrebu približavanja ove dvije kategorije te je Microsoft odlučio svoje razvojne alate  unificirati za upotrebu u  oba segmenta. Nakon što je izdao reduciranu varijantu osnovnog .NET Frameworka koju je nazvao Compact Framework,  namijenjenu uglavnom  uređajima multimedijskih karakteristika,  pojavila se i inačica koja cilja na  uređaje u segmentu robotizacije i automatizacije pod nazivom Micro Framework. Širenje znanja o ovim programskim proizvodima potaknula je pojava sklopovske opreme za njihovu primjenu. Jedna takva , uslovno rečeno, platforma je  i Netduino. Netduino je modul otvorenog koda dizajniran na  Arduino konceptu koji je vrlo popularan u amaterskoj mikrokontrolerskoj zajednici. Osnovni princip ove filozofije je da za ulazak u svijet mikrokontrolera gotovo ne trebate alat. Dovoljno je da kupite modul uz koje dolaze osnovni set kablova i žica, stavite modul na stol do računala, pokrenete razvojnu aplikaciju, napišete kod i stisnete Run tipku i odmah vidite rezultata svoga rada.

Što je Microsoft .NET Micro Framework

Microsoft .NET Micro Framework je mala i efikasna .NET runtime okolina za izvršavanje takozvanog upravljanog koda (eng. menaged code) na malim i resursima ograničenim računarskim platformama na kojima se ne može izvršavati operativni sustav Windows CE i njegov .NET Compact Framework.  .NET Micro Framework je sličan .NET Comapact Frameworku kao i punom .NET Frameworku što znači da se aplikacije za njega mogu razvijati istim alatima i razvojnim okruženjima. Ovo je tek uvjetno točno jer  je razvoj mikrokontrolerskih aplikacija ovog trenutka moguć samo u Visual Studiju 2010 s programskim jezicima C# i Visual Basic na Windws platformi te programskim jezikom Mono na Linux platformi. Micro Framework ne zahtjeva temeljni operativni sustav za svoje izvršavanje jer se Common Language Runtime nazvan TinyCLR instalira direktno na hardversku platformu pa se on još naziva i bootable runtim.  On je relativno mali i zauzima  samo nekoliko stotina kilobajta RAM memorije i ne zahtjeva procesor koji im jedinicu  za upravljane memorijom (eng. memory management unit-MMU). Osim toga Micro Framework se može izvršavati na  jeftinim 32-bitnim mikrokontrolerima koji troše vrlo malo energije. Razvoj programa za mikrokontrolerske uređaje upotrebom .NET Micro Framework-a razlikuje se od dosadašnjeg  pristupa. Klasična pristup  uzima u obzir specifičnosti odabrane sklopovske opreme kao što su sabirnice, memorijska mapa, prekidni vektori i slično i napisani program se može izvršavati samo na ciljanoj platformi. Micro Framework ima apstraktni pristup sklopovskoj opremi preko baznih klasa koji tu opremu tretira kao objekte što vam omogućava i objektni pristup programiranju. Stoga  ne morate brinuti o konfiguraciji specifičnih sklopovskih komponenti nego samo postaviti određena svojstava korištenih sklopova u baznoj klasi. Ovaj pristup se još  naziva  upotreba managed driver-a  i omogućava razvoj aplikacija koje nisu vezane uz određenu sklopovsku opremu. Kao i ostali frameworki  i Micro Framework izvršava upravljani kod odnosno kompajler  generira, o procesoru neovisan, kod koji se naziva intermediate language  a onda se TinyCLR brine da se taj kod izvrši na određenoj platformi. Micro Framework nije sustav za rad u realnom vremenu (eng. real-time) i od njega se ne može očekivati strogo determinističko ponašanje. To znači da nemamo pristup definiranju raspoređivanja odnosno ne možemo egzaktno definirati način i parametre raspoređivanja. Isto tako određeni očekivani događaji mogu biti odgođeni za nekoliko milisekundi  a uzrok tome može biti neki  sistemski zahtjev za prekid ili rad sustava za oslobađanje memorije (eng. Garbage collection) bez obzira što se on aktivira u slobodno sistemsko vrijeme. Isto tako moramo znati da je izvršavanje upravljanog koda u pravilu sporije nego nativnog koda. Razlog  je što se s Micro Framework-om upravljani kod izvršava kao interpreter   za razliku od punog Framework-a i Compact Framework-a gdje postoji takozvani just-in-time  kompajler koji kod prvog izvršavanja pretvara upravljani u nativni kod.

Netduino

Netduino je elektronička platforma bazirana na ARM mikrokontrolerima koju možete programirati koristeći Micro Framework. Razvojno okruženje je Microsoft Visual Studio 2010 ali se može koristiti i  besplatna varzija ( Visual Studio 2010 Express). Netduino je hardverski otvorena platforma što znači da se  firmware kod kao i električne sheme i PCB projekti mogu koristi pod Apache 2.0 i BSD open source licencom. Ovoga trena postoje 4 varijante Netduino modula:

  1. Netduino
  2. Netduino Plus
  3. Netduino mini
  4. Netduino Go

Moduli su prilagođeni za amatersku primjenu dok se dizajn bazira na popularnom konceptu Arduina koji je napravljen za AVR mikrokontrolere. To zapravo znači da se na Netduino modulima mogu koristiti gotovo svi dodaci, koji se popularno nazivaju shields,  za Arduino module. Ovih dodataka  ima mnogo, od jednostavnih  senzora do složenih sustava kao što su GSM i drugi komunikcijski moduli.   Shodno tome  Netduno moduli imaju digitale ulaze/izlaze, analoge ulaze, serijske portove te I2C i SPI sučelja. Napajanje modula je izvedeno korištenjem nestabiliziranog napona 9-12 V koji se potom stabilizira te su na konektore izvedeni naponi 5V i 3.3V koje možete koristiti za ostatak  hardvera. Napajati module moguće je i preko USB porta koji istovremeno služi i za programiranje modula.

Netduino i Netduino Plus (najnovija inačica Netduino Plus 2 ) dizajnirani su upravo na Arduino konceptu i razlikuju se po količini memorije i korištenim sučeljem (Netduino Plus 2 ima Ethernet) dok je Netduino mini baziran na Basic Stamp dizajnu. Netduino mini je modul je izveden kao 24 pinski DIP chip i njega možete koristiti u svojim projektima upravo kao da  je riječ o standardnom mikrokontroleru. Netduino Go je najnovija inačica i od ostali  se razlikuje po konektorima  i filozofiji univerzalnog sučelja za proširenja koji je nazvan GoBus . GoBus je zapravo virtualni  hadrversko/softverski I/O koncept definiran kao open source protokol baziran na master-slave principu.    Na bilo koji GoBus port se može priključiti bilo koji GoBus modul sa podržanom  plug and play funkcionalnošću.

Da bi mogli programirati Netduino module potrebna nam je i određena programska oprema. To se u prvom redu odnosi na Visual Studio prilagođen za Netduino platformu. Potrebne alate možemo podjeliti u tri skupine a to su:

  1. Visual Studio  2010 razvojna okolina
  2. .Net Micro Framework razvojni SDK (eng. Software Development Kit)
  3. Netduino razvojni SDK

Ove programske pakete najbolje je i instalirati ovim redoslijedom. Kao što sam prije napisao kao razvojna okolin koristi se Microsoft Visual Studio 2010 i o tome kako se on koristi možete naći puno materijala na internetu. Valja samo napomenuti da se može koristiti i besplatna inačica Visual Studio 2010 Express koji možete skinuti sa stranica http://www.microsoft.com/express/downloads/ . Kao osnovni jezik za programiranje zamišljen je   C# ali je kasnije napravljeno da se može koristi i Visual Basic te Mono na Linux platformi. Ove mogućnost  ovisi o firmware-u koji se nalazi u modulu koji ste kupili. Trenutno je aktualna varijanta NETMF4.2 koja podržava i Visual Basic. Ako nabavite module  koji imaju firmaware 4.1 a želite programirati u Visual Basicu potrebno je upisati novi firmware koji možete skinuti s službenih stranica Netduino projekta http://forums.netduino.com/index.php?/topic/5120-announcing-net-mf-42-upgrade-for-all-netduino-hardware/  a proceduru kako to napraviti  možete naći nai wiki stranicama Netduina. Zamjena firmware ne mora biti isključivo radi ovoga razloga nego, kao što je slučaj sa svim platformama otvorenog koda, neke nove mogućnosti i funkcije te ispravljanje grešaka iz prethodnih verzija te će te vjerojatno jednom u budućnosti mijenjati firmware.  .Net Micro Framwork SDK je su sistemske datoteke Visual Studia za spomenuti framework dok je Netduino razvojni SDK prilagođenje Visual Studia za podršku Netduino modula. Zahvaljući njemu će te nakon instalacije u svom VS imati pridodane predloške (eng. template ) za sve spomenute Nedtuino module.

Prvi program

Nakon uspješne instalacije navedenih programskih pakete i otvaranja kutije s vašim Netduinom spremni ste za pisanje prvog programa.Nakon startanja VS uz ostale predloške naći će se i predlošci za Netduino module. Na vama je da odaberete predložak koji odgovara vašem moduli i VS će izgenerirati vaš prvi projekt.

Kao i ostali VS projekti i Neduino projekti se spremanju u jedan folder gdje se nalazi sve vezano uz projekt. Ako do sada niste radili s Visual Studiom pogledajte strukturu projekt foldera koji se po defaultu nalazi na …userDocumentsVisual Studio 2010Projects.  Struktura foldera projekta je gotovo identična kao i za ostale tipove VS projekata osim razlike u Debug i Release subfolderu gdje  će te naći subfoldere [be] i [Ie].  Nakon otvaranja projekta na zaslonu će te imati otvoren editor za pisanje vašeg koda. Za razliku od oubičajnog Visual Basic projekta ovdje nećete imati formu kao polazišnu klasu  nego VB  modul.

Kao što sam rekao program se piše unutar klase Module1.vb a jednostavan program može izgledati ovako:

Module Module1
	Sub Main()
		Dim led As OutputPort = New OutputPort(Pins.ONBOARD_LED, False)
	        Do
	            led.Write(True)
	            Thread.Sleep(1000)
	            led.Write(False)
	            Thread.Sleep(1000)
	        Loop
	End Sub
End Module

Ovaj primjer ima zadatak da na Netduinu pali i gasi ugrađenu LE diodu  Pins.ONBOARD_LED u taktu od 1 Hertza a to se izvršava unutar beskonačne DO…Loop petlje.

Nakon što ste napisali kod potrebno je program prebaciti u Netduino. Za razliku od programiranja mikrokontrolera na klasičan način ovdje vam nije potreban nikakav programator (niti hardverski niti softverski)  već je sve spremno za programiranje i startanje vašeg programa. Naravno na početku rada ste trebali spojiti Netduino na vaše računalo korištenjem micro usb kabela koji ste dobili uz modul. Ako je sve ispravno instalirano nakon priključivanja modula računalo će prepoznati modul i instalirati potrebne drivere kao i kod priključivanja  drugog usb uređaja. Da bi ste provjerili da li imate vezu s vašim Netduino modulom kliknite na  My Project    na desnoj strani i otvorit će vam se prozor sa svojstvima vaše aplikacije (Project  Properties). Ovdje možete vidjeti postavke aplikacije, kompajlera, referenci i slično.  Izaberite  .NET Micro Framework i provjerite aktivne postavke.  U polju Device trebao bi se pojaviti vaš Neduino modul dok bi polje Transport  trebalo biti postavljeno na USB. Ako je to tako spremni ste za programiranje vašeg Netduino modula  odnosno “deplojanje” kako se to ovdje naziva. To će te učinit na nači da odete u glavni izbornik i izaberete Debug/Start Debug ili jednostavno kliknete na zeleni trokutić (strelicu) u osnovnoj  traci s alatima. U  donjem statusnom  prozoru možete pratiti trenutne operacije programiranja i nakon nekog vremena LED dioda na vašem Netduini bi trebala veselo žmirkati. Sada kada je vaš program u Netduini vi možete zatvoriti VS  bez utjecaja na program u modulu koji je trajno pohranjen. Svaki put kad uključite napajanje (na bilo koji način ) program u Netduinu će se početi izvršavati.

Moram napomenuti da sam pri pisanju ovoga posta polazio od pretpostavke da ste bar jednom pokušali pisati program u Visual Basicu. Ako to nije tako i ako se, uz upoznavanja s Netdunom, trebate upoznati i sa  osnovama pisanja Visual Basic programa to će te morati učinit sami.  Nadam se da  sam vam bar približio metodologiju programiranja mikrokontrolera u .Net okruženju i želim puno zabavnih trenutaka s Netduinom .

Još jednom ću ponoviti linkove gdje možete dobiti više informacija i preuzeti potrebne alate:

Službene stranice Netduino projekta: http://netduino.com/

Microsoft Micro Framework: http://www.microsoft.com/net/multiple-platform-support

Microsoft Visual Studio 2010 Express : http://www.microsoft.com/visualstudio/eng/products/visual-studio-2010-express

Netduino forum: http://forums.netduino.com/

Netduino Wiki stranice: http://wiki.netduino.com/

 

 

]]>
Kapacitivne dodirne tipkehttp://www.quercus-lab.com/kapacitivne-dodirne-tipke/ Wed, 25 Jan 2012 07:22:47 +0000 http://www.quercus-lab.com/?p=489 Do danas su razvijeni raznorazni senzori na dodir,  počevši od čisto vodljivih tipova apliciranih na televizijskim aparatima osamdesetih godina  prošlog stoljeća, pa  preko optičkih, do današnjih otporničkih i kapacitivnih koji se koriste na modernim mobilnim telefonima. Njihov razvoj i primjena  uvjetovana je razvojem tehnoloških postupaka i elektronskih komponenti a veliki napredak je napravljen masovnom produkcijom i primjenom mikrokontrolera. Kapacitivna metoda detekcije dodira danas je najraširenija koristi se  gotovo na svim elektronskim uređajima počevši od kontrolnih panela u kabinama za tuširanje do prijenosnih računala i mobitela.  Mnogi proizvođači elektronskih komponenti u svom proizvodnom programu imaju integrirane krugove koji omogućavaju razvoj dodirnog sučelja. Na zadovoljstvo mnogih zaljubljenika elektronike ona je aplikativna na najmanjim mikrokontrolerima i  ovdje je opisana jedna jednostavna metoda na mikrokotroleru  Atmel ATtiny2131

Princip rada

Osnovni princip rada kapacitivnih senzora osjetljivih na dodir je promjena kapaciteta područja dodira. Metoda detekcije promjena je različita a ovdje će se objasniti metoda koja je uobičajena u većini mjerača kapaciteta a radi se integracijskoj metodi mjerenja. Algoritam metode je usporedba vremena trajanja nabijanja kondenzatora poznatog kapaciteta sa vremenom nabijanja nepoznatog a na osnovu njihovog omjera se izračunava kapacitet nepoznatog kondenzatora. Za primjenu metode kod dodirne tipke nama treba samo sigurna detekcije promjene kapaciteta i to je osnovni zahtjev jer je promjena kapaciteta vrlo mala.Poznato je iz osnova elektrotehnike da svaka  elektronska komponenta pa tako i mikrokontroler odnosno njegov I/O port posjeduje parazitni kapacite i on se koristi kao etalonski kondenzator Cs. Nepoznati kondenzator  Cx je kapacitet ljudskog tijela  koji po modelu za ESD ima kapacitet do 100 pF  i koji se formira kada se prstom dodirne metalna  površina izolirana nekim tankim izolatorom. Ako za mikrokontroler izaberemo ATTiny2313 odnosno  parazitni kapacitet  je oko 15 pF i prijelazna pojava punjenja toga kondenzatora na napon koji  se detektira kao logička 1 ( a to je po specifikacijama 2,65 V kod napajanja 5V) traje oko 9 mikrosekundi. Ako kao jednu elektrodu drugog kondenzatora pripremimo područje bakra na tiskanoj pločici površine 16×16 mm to vrijeme punjenja se produžuje na oko 16 mikrosekundi  i to je ta vremenska razlika koju moramo iskoristiti kao detekciju dodira odnosnu “pritisnute” tipke.

Da bi osigurali detekciju promjene kapaciteta poslužit će mo se standardnim I/O portom mikrokontrolera Atmel ATTiny2313 jer on sadrži sve električne i programske komponente potrebne za to. Koristit ćemo registre DDRx.n, PORTx.n i PINx.n gdje x označava korišteni port (A,B ,C, D) dok n označava broj bita porta(0-7). DDR registar služi za definiranje da li će port biti korišten kao ulazni ili izlazni. Ako je njegova vrijednost 0 port se koristi kao ulaz te će  registar PORT biti odspojen od pina mikrokontrolera tako da stanje registra PORT neće imati utjecaja na stanje pina. Druga namjena DDR registra je uključivanje pull-up otpornika koji su integrirani u mikrokontroler. Ako je  port definiran kao ulaz (DDRx.n=0)  s registrom PORTx.n se uključuje (PORTx.n=1)  odnosno  isključuje (PORTx.n=0) navedeni otpornik. Osnovna namjena registra PORTx.n  je jasno odnosno on spaja pin mikrokontrolera na Vcc odnosno Gnd ako je I/O  port definiran kao izlaz (DDRxn=1).  Namjena Registar PINx.n  je  uvijek ista a to je da čita logičko stanje pina mikrokontrolera. Od ostalih vanjskih komponenti potrebna nam je jedan otpornik preko kojeg ćemo trajno spojiti pin mikrokontrolera na Vcc napajanje te površina bakra tiskane pločice koja će služiti kao jedna ploča kondenzatora odnosno imati ulogu senzora i  ova površina mora biti pokrivena nekim  izolatorom.

Navedene komponente će nam poslužiti za generiranje dva osnovna stanja a to je pražnaje i punjenje kondenzatora. Pražnjenje se ostvaruje na način da se stanje registra  PORTx.n postavi u logičku nulu a potom se stanje DDRx.n registra promjeni u logičku jedinicu. Na taj način će se pin mikrokontrolera postaviti u nulu  što će rezultirati pražnjenjem kondenzatora Cs.  i sada je sustav spreman za mjernu sekvencu. Postavljanjem DDRx.n registra u logiču nulu odspaja se pin mikrokontrolera od PORTx.n registra te je omogućeno  punjenje kondenzatora preko vanjskog otpornika R.

Istovremeno s početkom punjenja aktivira se mjerenje vremena i  čitajući stanje registra PINx.n provjerava se logičko stanje ulaza odnosno napon na kondenzatoru. Kada je vrijednost PINx.n registra logička jedinica zapamti se vrijeme punjenja i to etalonsko vrijeme i označava stanje “dodir nije detektiran” odnosno “tipka nije stisnuta”. Kada se prstom dodirne površina “senzora” na tiskanoj pločici spaja se kondenzatoru Cs još jedan Cx (paralelno) a vrijeme potrebno da se detektira logička jedinica registra PNx.n se produžava. To prekoračenje prije izmjerenog etalonskog vremena omogućava da se detektira prisutnost prsta na senzoru odnosno stanje “taster je stisnut”.

Programska izvedba

Gore opisane sekvence vrlo je jednostavno izvesti i to ćemo napravit u BASCOM programskom jeziku. Na početku je potrebno izmjeriti vrijeme da se parazitni kondenzator Cs bez prisutnosti prsta na senzoru nabije na logičku jedinicu i to spremiti u varijablu TouchTreshold. Učiniti ćemo to u DO… LOOP u petlji  u koji će biti sekvenca pražnjenja kondenzatora (2 milisekunde), početak punjenja, čekanje od TouchTreshold mikrosekundi  te provjeravanje da li je pin u logičkoj jednici. Poslije toga na početku slijedeće  iteracije  petlje povečavamo varijablu TouchTreshold za 1. Kada se detektira logička jedinica na pinu izlazimo iz DO ..LOOP petlje i trenutna vrijednost  varijable TouchTreshold   je  prije spomenuto etalonsko vrijeme . Tom vremenu dodajemo još 2 mikrosekunde da bi sa sigurnošću  detektirali neprisutnost prsta.

DO
   TouchTreshold = TouchTreshold + 1
   DDRD.3 = 1 : PORTD.3 = 0                      ' prazni
   waitms 2
   PORTD.3 = 0 : DDRD.3 = 0                      ' start punjenja
   waitus TouchTreshold
   IF PIND.3 = 1 THEN                            ' provjera napunjenosti
      TouchTreshold = TouchTreshold + 2
      EXIT DO
   endif
LOOP

Nakon što smo ovo napravili možemo u glavnom programu skenirati sve naše senzor, detektirati dodir i izvršiti određene akcije. Program je sličan inicijalizacijskom dijelu samo što ovdje kao rezultat na provjeru  napunjenosti palimo ili gasimo signalizacijsku diodu. Dakle nakon što smo ispraznili kondenzator počinjemo ga puniti  te  testiramo da li je on pun nakon  vremena koje je dobiveno u inicijalizacijskoj sekvenci. Ako je nakon toga vremena pin nije logičkoj jedinici znači da je ukupni kapacitet  koji se puni veći od parazitnog kapaciteta Cs odnosno površina senzora je dotaknuta prstom. U listingi programa je kod samo za 1 kanal i koristi se pin 7 (PD3) kao senzor a pin 18 (PB6) kao indikacija  dodirnutog senzora.

LED1 ALIAS PORTB.6
DO
   ' Channel 1
   DDRD.3 = 1 : PORTD.3 = 0                     ' prazni
   waitms 2
   PORTD.3 = 0 : DDRD.3 = 0                     ' start punjenja
   waitus TouchTreshold
   IF PIND.3 = 0 THEN                           ' provjera napunjenosti
      LED1=1
   ELSE
      LED1=0
   endif
LOOP

Praktična realizacija

Kao prototip je napravljena tipkovnica s četiri dodirne tipke. To je ustvari elektronski modul koji  bi trebao zamijeniti četiri standarne tipke na malom operatorskom panelu u  mojem projektu kučne automatizacije. Svaka dodirna tipka ima svjetlosnu  indikaciju kao povratnu informaciju  “pritiska” tipke. Upotrebljeni mikrokontroler je ATtiny2313 a sam modul nema   stabilizirano napajanje već se napaja s 5V iz uređaja na kojem će biti. Izlazni signali su četiri digitalna izlaza koji poprimaju  stanje dodirne tipke a pomoću kratkospojnika na pinu 3 (PD1) može se definirati signal “pritisnute” tipke . Izlazni signal da je tipka  “pritisnuta” bit će onog  logičkog nivoa koji je trenutno na pinu 3.

Tipkovnica je napravljena na dvostranom  tiskanoj pločici  tako da su na gornjem layeru dodirni senzori odnosno bakrene površine velićine 16×16 milimetara.  Ostali elementi su smješteni odozdola te  su,  iako standarne veličine, lemljeni su  kao smd elementi  dok bi finalna variajanta svakako trebala biti prava smd.  Žice koje se vide su za napajanje (plava i crvena) i za eksterni ISP programator.

Električna shema je jedostavn i iz nje se vidi da je korišten ATtiny2313  s vlastitim  generatorom takta i rudimentarnim reset krugom. Otpornici na senzorima dodira su 680 kilooma i njihova vrijednost je utvrđeni  eksperimentalno. Oni ovise površini dodirnog senzora te debljine i tipu izolacije (prednje maske) pa će te vjerojatno njih morati utvrditi eksperimentalno u neki drugim izvedbama. Prototipni modul je u  fazi testiranja radio vrlo pouzdano ali nije testiran u težem radnom okruženu (što mu nije bila ni namjena).

[jwplayer mediaid=”1030″]

Datoteku koja sadrži  shemu, tiskanu pločicu, izvorni te izvršni kod možete skinuti ovdje: TouchKeypad_quercus-lab

]]>