OCTOMBRIE, 2014 NR. 5 VOL. 2 PREţ: 10 LEI
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
DESIGN HOBBY
Sumar
4 Energy Harvesting Reference Design Dispozitivul Energy Harvest este o tehnologie viabilă pentru nodurile senzor, cu aplicații de la diferitele domenii ale industriei până la viața de zi cu zi, acolo unde nu există astfel de alternative.
9 Basys™3 Artix-7 FPGA Board Cea mai importantă schimbare în Basys3 este upgrade-ul la Xilinx Vivado Design Suite, cel mai modern instrument de proiectare folosit de ingineri la nivel profesional, în întreaga lume.
10 Proiectarea, construirea și programarea unui dispozitiv cu comandă numerică (II) Numerical Control (NC) sau controlul numeric implică automatizarea uneltelor folosite în cadrul unui proces tehnologic și controlul precis al acestora. Majoritatea dispozitivelor de acest gen sunt comandate de calculatoare (CNC).
Revista Electronica Azi Hobby poate fi cumpărată de la partenerii noştri: Direct de la magazinele: CONEX ELECTRONIC - Bucureşti Str. Maica Domnului nr. 48, Sector 2 Tel.: 021-242.22.06 office@conexelectronic.ro vinzari@conexelectronic.ro www.conexelectronic.ro
14 Soluții complete de proiectare 3D În ultimii ani, s-a putut observa o adevărată revoluţie în lumea proiectării 3D. Ceea ce odinioară era rezervat numai specialiştilor din industria aerospaţială, a devenit disponibil pentru toată lumea.
Sau online de la:
16 Masă de expunere cu ultraviolet (UV) Proiectul prezentat în următoarele pagini constă în automatizarea unei mese de expunere cu ultraviolet (UV) folosită pentru realizarea de PCB-uri (Printed Circuit Board).
23 Senzor wireless pentru evaluarea parametrilor mediului ambiant
O’BOYLE - Timişoara Tel. +40 256-201346 office@oboyle.ro www.oboyle.ro
În cadrul acestui articol, voi prezenta un senzor wireless care măsoara 3 parametri uzuali (temperatura, umiditatea şi luminozitatea). În funcţie de necesităţile utilizatorului, se pot adăuga 3 senzori analogici, un senzor cu comunicare I2C şi unul cu comunicare UART sau SPI.
26 MPLAB Starter Kit for PIC24H Microcontrollers - Exemplu de aplicaţie
Câştigaţi cu Electronica Azi Hobby
MPLAB Starter Kit for PIC24H Microcontrollers este o soluţie hardware + software pe care Microchip o pune la dispoziţia celor ce doresc să exploreze capabilităţile seriei de procesoare pe 16 biţi PIC24.
29 Cameră video de tip endoscop Basetech BSK-100 Această cameră cu endoscop este utilă pentru a inspecta şi explora cu uşurinţă locurile greu accesibile, beneficiind de o imagine foarte clară.
30 Aplicaţie realizată cu EFM32™ Zero Gecko Starter Kit Placa de dezvoltare dispune de un microcontroller de 32 biţi ARM Cortex-M0+ care lucrează la o frecvenţă de maxim 24 MHz, programator hardware SEGGER J-Link integrat, display de 128 × 128 pixeli cu 2 culori, 2 butoane, 2 LED-uri, 2 senzori touch, soclu pentru baterie, pini pentru accesul la porturile microcontrollerului, senzor de temperatură, sistem de monitorizare a energiei consumate şi altele.
Trimiteţi la redacţie proiectul unei aplicaţii practice şi aveţi şansa de a câştiga un MPLAB Starter Kit pentru microcontrolerele PIC24H de la Microchip.
Colaboratori la această ediţie: Revista Electronica Azi - HOBBY apare de 6 ori pe an.
Management Director General - Ionela Ganea Director Editorial - Gabriel Neagu Director Economic - Ioana Paraschiv Publicitate - Irina Ganea
Revista este publicată numai în format tipărit.
Redacţie:
2014© Toate drepturile rezervate.
office@electronica-azi.ro www.electronica-azi.ro
EURO STANDARD PRESS 2000 srl Tel.: +40 (0) 31 8059955 Mobil: 0722 707-254 office@esp2000.ro www.esp2000.ro
Preţul revistei este de 10 Lei. Preţul unui abonament pe 1 an (6 apariţii Hobby + 10 apariţii Electronica Azi) este de 100 Lei.
O parte din articolele prezentate în această ediţie au fost realizate de către tinerii pasionaţi din cadrul laboratoarelor:
CUI: RO3998003 J03/1371/1993 Tiparul executat la Tipografia Everest
2
ROBOLAB - wonderbots.cs.pub.ro
Ing. Emil Floroiu - emilfloroiu@gmail.com Ing. Daniel Rosner - daniel.rosner@cs.pub.ro Asis. Drd. Ing. Răzvan Tătăroiu razvan.tataroiu@cs.pub.ro Asis. Dr. Ing. Alexandru Radovici msg4alex@gmail.com Șl. Dr. Ing. Dan Tudose dan.tudose@cs.pub.ro Daniel Ghiţă - daneelg@yahoo.com Alina Ştefania Petre - alina.petresq@yahoo.com Mihai Crăciunescu - mihaiacr@gmail.com Cristian Dobre - dobrecristian@nighttime.ro Andrei Duluţă - andrei.duluta@gmail.com Pătru Cristian - georgecristian.patru@gmail.com Răzvan Tilimpea - razvan.tilimpea@gmail.com Cătălin Ionuţ Neagu - neagu.catalin.ionut@gmail.com
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Energy Harvesting Reference Design Autor: Alina Ştefania Petre alina.petresq@yahoo.com
Senzorii wireless economici devin din ce în ce mai răspândiți în industrie și în aplicațiile medicale, putând măsura de la distanţă solicitări aplicate în clădirile industriale, pe poduri şi până la efortul cardiac în cazul oamenilor. Este necesar ca senzorii folosiți să aibă un consum foarte mic de energie întrucât anumite aplicații nu permit schimbarea cu ușurință a acumulatorilor. Pentru a verifica acest tip de aplicaţii, putem folosi kit-ul Energy Harvesting de la Silicon Labs. Acesta este alcătuit dintr-un nod senzor și un adaptor USB. Alimentarea cu energie se face prin intermediul unei celule solare, iar ca alternativă, încărcarea prin USB de la calculator. Nodul senzor utilizează microcontrolerul wireless Silicon Labs Si1012 pentru măsurarea temperaturii, luminozității și nivelului de încărcare al bateriei, urmând să transmită, wireless, informațiile către EZRadio Pro, un circuit care folosește microcontrolerul Silicon Labs C8051F342 și cip-ul de emisie-recepție Si4431. Energia este stocată în bateria ultrasubțire Infinite Power Solutions THINERGY™ dotată cu un chip regulator LTC4071. Bateriile ultrasubțiri sunt similare celor convenționale, cu diferența că în alcătuirea lor Conținutul kit-ului: • Nod Senzor Wireless Energy Harvesting Si1012 intră materiale de dimensiuni mult mai mici. • Dispozitiv USB EZRadioPRO Acestea au un substrat, colector, electrolit, anod, • Adaptor ToolStickBase • Cablu USB extensibil [1m] catod și separator și pot primi orice formă. 4
ENERGY HARVEST RD Scurtă caracterizare a kit-ului Scopul aplicației este de a demonstra caracteristicile senzorului wireless ultraeconomic, alimentat de la o sursă de energie regenerabilă. Aceasta descrie un sistem ce măsoară și transmite periodic rezultatele dintr-o stare de consum minim de energie. Un avantaj este faptul că sistemul nu necesită baterii pentru funcționare, iar durata de viață este mai mare de 15 ani. Acesta este alcătuit dintr-o rețea de senzori wireless, care folosește microcontrolerul wireless Silicon Labs Si1012 și dispozitivul EZRadioPro dotat cu microcontrolerul Silicon Labs C8051F342 și transceiverul Si4431. Rețeaua de senzori wireless (nodul senzor) operează la 919.84 MHz și este alimentată cu energie solară. Dacă nu există transmisie de date, nodul trece într-o stare de consum redus de numai 50nA. Această proprietate permite sistemului să funcționeze timp de 7 zile în condiții de iluminare redusă (de exemplu dulap întunecat) sau pe timp nelimitat în condițiile în care există o sursă de iluminare astfel încât rezervele de energie să poată fi refăcute. Sistemul funcționează atât în incinte închise cu iluminare interioară, naturală sau artificială (200lx) cât și în condiții de exterior, unde iluminarea poate ajunge până la 10.000 lx. Detalii hardware Nodul Senzor
Nodul senzor Si1012 - vedere frontală
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Senzorul de temperatură de la bordul nodului funcționează cu precizie diferită în funcție de intervalul măsurat; şi anume: în intervalul [-64, 64], precizia este de 0,5°C, în intervalul [-64, 192] se măsoară cu precizie de 1°C, iar în intervalul [0, 128] se măsoară cu precizia de 0,5°C. Nodul are 16kB flash, programabil în sistem în sectoare de 512 biți cu funcționalitate completă de citire, scriere și ștergere și 768 byte RAM. Transceiverul are o bandă de frecvență cuprinsă între 240 şi 960Mhz, senzitivitate -121dBm și calibrare automată a frecvenței. Viteza de transmisie a datelor de la 0,123 până la 256 kbps. EZRadio Pro
Transceiverul Si4431 are banda de frecvență în plaja 240-920MHz, sensibilitate -121dBm, viteza de transmisie a datelor de la 0.123 până la 256 kbps și tensiunea de alimentare de la 1.8 până la 3.6V. Acesta dispune de un temporizator de trezire din modul “sleep”, mod de oprire automată în condițiile unui procent scăzut al bateriei, calibrare automată a frecvenţei, detector pentru nivelul de descărcare a bateriei, regulator de tensiune integrat, rezonator cuarț cu posibilitate de modificare a parametrilor prin intermediul programului WDS, senzor de temperatură cât și convertor analog-digital pe 8 biţi, cu o plajă a temperaturii cuprinsă între -40 și +85°C. Ü
Buton selectare mod alimentare LED indicator alimentare Conexiune pentru depanare Si1012 Antenă imprimată Buton pornire Panou solar
LTC4071 Antenă imprimată Baterie ultrasubțire LDO putere mică şi detector Brownout Nodul senzor Si1012 - vedere din spate 5
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Rezonatorul de cuarț la 30MHz are timpul de pornire 600μs şi poate fi programat pentru a acomoda cristale cu capacitanţa diferită.
aproximativ 15-30 secunde pentru încărcarea condensatorului celulei solare la minimum 200 lumeni. • LED-ul verde de pe nodul senzor va clipi
C8051F342 Microcontroler Si4431 Antenă imprimată Dispozitivul USB EZRadio Pro Dispozitivul radio are mai multe regimuri de funcționare şi anume Shutdown, Idle, Standby, Sleep, Sensor, Ready și Tune, dintre care, starea Shutdown are un consum de energie de maxim 15nA.
de 3 ori, indicație corespunzătoare încărcării. O combinație între lumina verde și roșie indică faptul că sistemul are energia necesară pentru a porni, dar nivelul bateriei este sub 75%.
LED-uri RUN/STOP Microcontroler Conexiune depanare LED Power
va asocia dispozitivul EZRadio Pro, iar un LED roșu sau verde va indica dacă această asociere a fost efectuată cu succes sau nu. • La fiecare apăsare a butonului, nodul va transmite un set nou de date. De asemenea, la un interval de o secundă va fi transmis nivelul de iluminare. După 3 minute, nodul va trece automat în modul sleep, iar pentru pornirea acestuia este necesară apăsarea butonului.
Adaptor ToolStick Base Toolstick-ul îndeplinește două funcții: Interfața pentru debug și pentru comunicație, dar pe care nu le poate rula simultan.
Buton selectare mod funcționare
Mod funcţionare Nodul senzor sosește din fabrică în stare descărcată. Înainte de prima utilizare este necesară încărcarea completă a bateriei. Aceasta se poate efectua în 30 minute prin conexiune USB, în 2 ore prin expunere la o sursă directă de lumină de aproximativ 100.000 lumeni, timp de 6 ore în condiții de iluminare naturală redusă (1000 lux) și timp de 24 de ore de la o sursă de lumină electrică (200 lux). Dispozitivul EZRadio Pro este alimentat de la USB. Acesta se conectează la calculator și nu este necesară instalarea unui driver. Distanţa optimă dintre dispozitive este de până la 1 metru în condiții de încărcare la nivel maxim. La creșterea distanţei se va observa în tabul Logic descreșterea semnalului de transmisie. În continuare, va fi testată aplicația demo cu ajutorul programului Wireless Development Suite (WDS), disponibil gratuit pentru download pe site-ul Silicon Labs. Etapele aplicației: • Se deschide programul WDS3, având conectat la calculator dispozitivul EZRadio. • Se poziționează butonul modului de alimentare în poziția SOLAR. Sunt necesare 6
Fereastra de selectare a modului demo • Apăsarea butonului de pe nodul senzor, va porni microcontrolerul din modul “sleep”. La prima apăsare a acestuia, nodul
Fereastra aplicației demo înainte de achiziția datelor
ENERGY HARVEST RD
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Node Info este afișat ultimul set de date recepționat. În ultima figură (stânga jos) este prezentată indicația corespunzătoare amplasării în exterior. În partea dreaptă, în tabul Packet, sunt listate pachetele de date care au fost afișate. Selectarea unui pachet implică decodarea datelor și afișarea acestora în câmpurile VBAT, TEMP și LIGHT_LEVEL.
Fereastra aplicației demo după achiziția datelor
Meniul de control al aplicației radio Din meniul de control se poate selecta modul de funcționare și, de asemenea, sunt regăsite date despre tensiune, capacitanţă, frecvența de operare. Fereastra aplicației demo și tabul “Node Info” • Dispozitivul Energy Harvesting poate asocia până la 4 noduri, dar predefinit este nodul 1.
Acestea sunt informațiile corespunzătoare unei poziționări a dispozitivului într-o încăpere, departe de fereastră, iar în tabul
Concluzii Dispozitivul Energy Harvest este o tehnologie viabilă pentru nodurile senzor, cu aplicații de la diferitele domenii ale industriei până la viața de zi cu zi, acolo unde nu există astfel de alternative. Kit-ul demonstrează foarte ușor că poate avea o durata de viață îndelungată, iar faptul că alimentarea cu energie provine de la o resursă regenerabilă, îl transformă într-un dispozitiv prietenos cu mediul și cu posibilitate de utilizare în domenii unde schimbarea acumulatorilor implică o muncă foarte costisitoare sau chiar scumpă.
Fereastra aplicației demo în condiții diferite de poziționare a dispozitivului
Are un consum foarte mic de energie, lucru care îi permite să funcționeze normal până la 7 zile, fără iluminare. Permite monitorizarea cu ușurință a parametrilor luminozitate și temperatură și ar putea fi folosit cu succes în locul unui sistem de achiziție de date, care este mult mai costisitor.
n 7
Cum transformi o imprimantă 3D K8200 de la Velleman într-un echipament CNC? răspunsul îl găseşti la Conex Electronic Conex Electronic s.r.l. Tel.: 021 242.22.06 I Fax: 021 242.09.79 I office@conexelectronic.ro I www.conexelectronic.ro
8
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Felix Electronic Services Digilent Inc. în Romania Servicii complete de asamblare pentru produse electronice Felix Electronic Services execută echipare de module electronice cu componente electronice SMD, componente cu pini în găuri din PCB și respectiv cu terminale, folosind procedee și dispozitive moderne pentru poziționare, lipire și testare. Piesele cu gabarit deosebit (conectoare, comutatoare, fire de conectare etc.) sunt montate și lipite manual. Se execută inspecții interfazice pentru asigurarea calității produselor. Se utilizează numai materiale care nu afectează mediul și nici pe utilizatori. Se pot realiza asamblări complexe și testări finale în standurile de test de care dispune Felix Electronic Services sau folosind standuri de test dedicate unor produse, dar asigurate de client. Produsele se livrează în ambalaje standard asigurate de firma noastră sau ambalaje speciale ale clientului. Personalul are pregătirea, expertiza și experiența lucrativă cerute de execuții de înaltă calitate. Felix Electronic Services este cuplat la un lanț de aprovizionare și execuții pentru a asigura și alte servicii care sunt solicitate de clienți: aprovizionarea cu componente electronice și electro-mecanice, proiectare PCB și execuții la terți, prelucrări mecanice asupra modulelor și a cutiilor în care se poziționează modulele, și orice alte activități pe care le poate intermedia pentru clienți. Adresa noastră: Felix Electronic Services Bd. Prof. D. Pompei nr. 8, Hala Producție Parter, București, sector 2
Tel: +40 21 204 6126; Fax: +40 21 204 8130 stelian.sersea@felix-ems.ro www.felix-ems.ro
ECAS ELECTRO este distribuitor autorizat al produselor Digilent Inc. Digilent Inc. este lider în produsele de proiectare educațională în ingineria electrică pentru studenți, profesori, hobbyști și OEM din toată lumea.
Basys™3 Artix-7 FPGA Board • • • •
Entry level - Xilinx Artix-7: XC7A35T-1COG236C Proiectat exclusiv pentru Vivado Design Suite Conectoare 4 Pmod™, USB-UART, 16 switch-uri și LED-uri Port USB2, port pentru alimentarea plăcii, programare și transfer date Basys3 este o placă FPGA entry-level destinată exclusiv pentru Vivado Design Suite, oferind Xilinx Artix arhitectură 7-FPGA. Basys3 este cel mai nou produs adăugat la populara gamă BASYS de plăci FPGA, pentru începere de aplicații. Basys3 include caracteristicile standard găsite pe toate plăcile BASYS: hardware complet și gata de utilizare, o colecție mare de dispozitive I/O pe placă, toate circuitele de suport FPGA necesare, și o versiune gratuită de instrumente de dezvoltare… și un preț special pentru studenți. Acum, cu Basys3, Digilent Inc. oferă studenților o mai bună reprezentare a ingineriei la nivel profesional, îmbunătățind foarte mult seturile de caracteristici. Aceste îmbunătățiri includ: Mai multe porturi I/O S-au dublat: switch-urile de interfață cu utilizatorul și numărul de ieșiri de pe placă. S-a mărit numărul de porturi externe (de la Pmods cu 6 pini pe un singur rând, la Pmods cu 12-pini, pe două rânduri) și s-a inclus, pentru prima dată, pe clasa de dispozitive BASYS un USBUART bridge. Arhitectura modernă = Programare modernă avansată Având în vedere migrarea de la familia Spartan 3E la clasa Artix-7 de dispozitive, Basys3 oferă o creștere substanțială a capabilităților hardware. Cu noul Artix FPGA crește de 15 ori numărul de celule logice (de la 2160 la 33280) și se dezvoltă calculul de la multiplicatori la piese DSP adevărate. De asemenea, crește de peste 26 ori cantitatea de memorie RAM. SOC însoțit de instrument de proiectare puternic Cea mai importantă schimbare în Basys3 este upgrade-ul la Xilinx Vivado Design Suite, cel mai modern instrument de proiectare folosit de ingineri la nivel profesional, în întreaga lume. Comparativ cu ISE, Vivado oferă o experiență de utilizare îmbunătățită și capabilități extinse. Aceste capabilități includ integrarea bloc pe bază de IP (care poate reduce timpul de dezvoltare de până la 10x) și Vivado Logic/Serial I/O analyzer. Mai multe informații? Vizitați Basys3 Wiki Site. Digilent Inc. este o filială a National Instruments Corporation
www.digilentinc.com
www.ecas.ro
Detalii tehnice: ing. Emil Floroiu emil.floroiu@ecas.ro 9
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Proiectarea, construirea și programarea unui dispozitiv cu comandă numerică (II) Numerical Control (NC) sau controlul numeric implică automatizarea uneltelor folosite în cadrul unui proces tehnologic și controlul precis al acestora. Majoritatea dispozitivelor de acest gen sunt comandate de calculatoare (CNC). În urma rulării unor proceduri, aplicațiile software corespunzătoare mașinilor CNC produc un fișier care conține atât date despre uneltele implicate în realizarea diferitelor sarcini (tăiere, găurire, frezare etc.), cât și diverse instrucțiuni. Aceste instrucțiuni, la rândul lor, sunt preluate și interpretate de procesorul dispozitivului și sunt convertite în comenzi transmise, ulterior, către uneltele fizice. Autori: Mihai Crăciunescu - mihaiacr@gmail.com I Cristian Dobre - dobrecristian@nighttime.ro I Andrei Duluţă - andrei.duluta@gmail.com Urmare din numărul trecut Realizarea părții de programare Sistemul electro-mecanic prezentat anterior constituie doar o parte din întregul proces pe care îl presupune realizarea unui CNC. În absența unei metode de control și de programare a mașinii, toate componentele electrice și mecanice nu își pot îndeplini rolul. Majoritatea dispozitivelor de profil folosesc un calculator separat pentru rularea programului de comandă. Având în vedere că arhitectura sistemului include două mari componente inteligente: calculatorul şi microcontroller-ul, sarcinile trebuie repartizate între acestea două. Pe calculator va rula programul care se ocupă cu transmiterea serială a informaţiilor, iar pe placa Arduino se va executa un interpretor cu ajutorul căruia instrucțiunile trimise de calculator vor fi traduse în comenzi pentru mașină. G-CODE Considerații teoretice Maşina cu comandă numerică realizată în această lucrare are drept scop gravarea, pe o plăcuță cuprată, a traseelor preluate dintrun fișier special. O etapă care necesită o atenție deosebită, în procesul de programare al unui astfel de dispozitiv CNC, este 10
reprezentată de transpunerea layout-ului într-o serie de instrucţiuni pe care maşina să le poată executa. În acest sens, s-a optat pentru folosirea limbajului G-Code. G-Code este un limbaj de programare specific mașinilor de tip CNC. Se numește astfel datorită faptului că majoritatea denumirilor comenzilor pe care le înglobează încep cu litera “G” și se continuă cu un cod numeric. Codul numeric reprezintă instrucțiunea pe care mașina trebuie să o execute. În esență, G-Code este un limbaj prin care utilizatorul transmite informații dispozitivelor numerice despre ce operație să efectueze și modul de lucru. Cele mai des întâlnite instrucțiuni sunt: deplasarea între două
Figura 2.1: Diagrama arhitecturii software
puncte, setarea vitezei de execuție a unei comenzi, parcurgerea distanței dintre nouă punte pe drumul cel mai scurt etc. Primii pași către G-Code au fost facuți de cei din laboratorul de servomecanisme de la MIT (Massachusetts Institute of Technology) la sfârșitul anilor 1950. Prima standardizare a limbajului a fost realizată la începutul anilor 1960 de catre EIA (Electronic Industries Alliance). O formă finală a acestui limbaj a fost acceptată în februarie 1980 sub numele de RS-274-D. În anumite țări, G-Code este cunoscut ca ISO 6983 dar, în Europa, sunt folosite alte standarde. Cu toate că este vorba despre un limbaj standardizat, există, încă, mici diferențe de la un producător de
CNC
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
mașini numerice la altul și de la o țară la alta. Cele mai importante comenzi și instrumente necesare pentru dezvoltarea acestui proiect sunt bine reglementate și sunt recunoscute de orice dispozitiv cu comandă numerică modern:
efectuându-se foarte rapid pe orice sistem de calcul. Algortimul se bazează pe tratarea a două cazuri.
• Mișcare rapidă – Transportă unealta, cât mai repede posibil, către un punct din spațiu de unde aceasta trebuie să înceapă frezarea; • Controlul deplasării prin material în linie dreaptă sau în arc de cerc; • Executarea de diverse tipuri de deplăsări prin material al căror rezultat este o gaură în material sau tăierea unui contur; • Obținerea și memorarea de informații referitoare la unelte (diametrul frezei, viteza de tăiere etc).
La fiecare pas, coordonata corespunzătoare axei Ox se incrementează cu valoarea pantei. În momentul în care partea fracționară a abscisei este mai mare decât 0.5, se va incrementa valoarea ordonatei cu o unitate. În punctul determinat de partea întreagă a abscisei și de ordonata calculată astfel, se va desena un pixel.
partea fracţionară a abscisei depăşeşte 0.5, atunci trebuie incrementată valoarea ordonatei.
• Panta segmentului de dreaptă este cuprinsă în intervalul [-1, 1];
• Panta segmentului de dreaptă nu este cuprinsă în intervalul [-1, 1];
Figura 2.2: Algoritmul bresenham explicitat O versiune uşor modificată a acestui algoritm a fost utilizată pentru interpolările liniare necesare executării comenzilor G-Code. Acestea pot primi ca parametri până la trei axe, iar programul care interpretează
Cod
Denumire
Descrierea
G00
Poziționare Rapidă
Presupune mișcarea rapidă pe două sau trei axe. Deplasarea între punctul curent și destinație nu trebuie să fie în linie dreaptă (în situația în care se dorește evitarea unui obstacol)
G01
Interpolare Liniară
Este cea mai utilizată comandă în cazul debitării de material. Se transmit punctul de unde trebuie să înceapă tăietura și punctul unde aceasta se încheie. Cu ajutorul acestor informații, se calculează (interpolează) punctele intermediare prin care trebuie să treacă mașina pentru a ajunge la destinație.
G02
Interpolare Circulară în Sens Antitrigonometric
Comandă foarte asemănătoare cu G01 al cărei rezultat nu mai este un segment, ci un arc de cerc. G02 primește ca parametru de intrare fie raza arcului, fie un vector conținând punctele intermediare prin care mașina va trece
G03
Interpolare Circulară în Sens Trigonometric
Identic cu G03
G04
Așteaptă în poziția curentă
Primește ca parametru de intrare perioada (de obicei în milisecunde) în care dispozitivul trebuie să stea în punctul curent.
G28
Întoarcere în Poziția Home
Se întoarce la poziția “Home” sau “Safe” a programului (nu a mașinii).
G85
Debitează Cerc
Comandă folosită, în special, pentru a da găuri Tabelul 2.1 – Exemple de comenzi G-Code
Din tabelul de mai sus, se observă că multe dintre instrucțiuni, inclusiv G01 care este una dintre cele mai folosite, necesită interpolare liniară. În cazul dispozitivului construit pentru lucrarea de față, această interpolare este “tradusă” în impulsuri pentru motoarele pas cu pas. Cu alte cuvinte, pentru a desena o linie oblică, este necesar ca două motoare să funcționeze simultan: ambele trebuie să se rotească, fie cu aceeași viteza, fie cu viteze diferite, de la caz la caz. Algoritmul Bresenham Algoritmul Bresenham este folosit pentru a determina ce pixeli de pe ecranul unui monitor trebuie aprinși pentru a desena o linie. Acest algoritm a fost și, încă, este foarte des întalnit datorită faptului că presupune doar operații cu numere întregi (adunări, scăderi și shift-ări pe biți), acestea
La fiecare pas, coordonata corespunzătoare axei Oy se incrementează cu valoarea inversă a pantei. În momentul în care partea fracționară a ordonatei este mai mare decât 0.5, se va incrementa valoarea abscisei cu o unitate. În punctul determinat de partea întreagă a ordoantei și de abscisa calculată astfel, se va desena un pixel. Să presupunem că se dorește trasarea unui segment de dreaptă cu panta 0.4 (primul caz). Conform algoritmului Bresenham, la fiecare pas se va desena câte un pixel corespunzător fiecărui număr întreg pe axa Ox și vom aduna panta la valoarea existentă a abscisei, ca în figura următoare. Cu albastru sunt marcate valorile cumulative ale coordonatei pentru fiecare pixel în parte. Algoritmul spune ca de fiecare dată când
instrucţiunile trebuie să fie capabil să mişte vârful uneltei de-a lungul segmentului format pe una, două sau trei direcții din spațiu. Comenzi G-Code implementate Pentru aceast proiect, s-au implementat doar cele mai importante și mai desfolosite comenzi G-Code precum: G00 și G01 (deplasare în linie dreaptă), G04 (așteptare) și G28 (revenirea la un punct prestabilit – Home). Generarea de fișiere G-Code În subcapitolele anterioare s-a prezentat modul în care se realizează interpretarea și implementarea comenzilor G-Code dar nu s-a abordat tema obținerii unui astfel de fișier. Există multe programe open-source sau cu licență gratuită care preiau o poză sau un text și generează G-Code-ul corespunzător. Ü 11
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Ü
Pentru a grava un text s-a folosit programul Font To G-Code, o soluție simplu de utilizat, open-source, ce oferă rezultate foarte bune și nu limitează utilizatorul la un anumit tip de font. O altă caracteristică placută a acestui program este că pune la dispoziția utilizatorului codul G generat, într-o fereastra separată.
PROCESSING Asemănător cu partea hardware implementantă pentru acest proiect, soluția software se dorește a fi cât mai puțin costisitoare. Există interpretoare comerciale pentru G-Code, dar o licență pentru acestea
Arduino, în acest proiect s-a ales folosirea unui astfel de limbaj. Processing este un limbaj de nivel înalt creat în 2001 de către doi studenţi de la MIT ce permite o comunicare foarte bună cu platforma Arduino (limbajul Arduino a fost scris in Processing).
Acest program oferă posibilitatea de a seta diverși parametri precum : • Safe Z – la ce distantă față de materialul gravat să se ridice când se trece de la o literă la alta; • Depth Z – Cât de mult să se pătrundă în material, în timpul gravării.
Figura 2.4: Cerinţe software minimale pentru controlul dispozitivului CNC variază între 100 și 1000 de euro, astfel că s-a decis scrierea interpretorului de la zero. Având în vedere că multe limbaje de programare oferă pachete compatibile cu
Comandă Descriere G-Code G00
Poziționare Rapidă
G01
Interpolare Liniară
G04
Așteaptă
G20
Unitați folosite – inch
G21
Unități folosite – milimetri
G28
Întoarce-te acasă (Home)
G90
Programare absolută. Referință este setată la începutul programului
G91
Programare incrementală. Referința este preluată pornind de la ultima comandă dată
G92
Setează ca Home poziția în care se află unealta Tabelul 2.2 – Comenzi G-code implementate
Figura 2.3: Program Font to G-Code 12
Interfața grafică Pe lângă interpretorul pentru G-Code, limbajul Processing a fost utilizat pentru a crea o mică interfață grafică. Principala funcționalitate implementată în această interfață este: informarea utilizatorului cu privire la starea programului curent și la poziţia motoarelor pe cele trei axe, în raport cu un punct predefinit (Home). Funcţia draw, prezentată în continuare, gestionează interfața grafică a acestui proiect și se apelează de 60 de ori per secundă. Pentru modificarea acestei valori prestabilite (60), se apelează funcția frameRate cu parametrul Număr_Frame-uri. Programul se poate afla în trei stări principale, fiecare dintre acestea fiind comunicată utilizatorului.
CNC
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Prima stare este cea în care se înștiințează utilizatorul că programul aşteaptă realizarea conexiunii seriale cu Arduino. Figura 2.5: Fereastră corespunzătoare primei stări
Cea de-a doua stare presupune calibrarea maşinii folosind cele două joystick-uri. În timpul reglării, se afişează, pe ecran, informaţii referitoare la poziția relativă a uneltei, în raport cu un punct prestabilit. După ce s-a deplasat vârful uneltei în poziția dorită, se apasă butonul Rst pentru a salva calibrarea (acel punct devine originea sistemului de coordonate). Figura 2.6: Fereastră corespunzătoare stării numărul doi
Aplicația trece în cea de-a treia stare din momentul în care s-a apăsat butonul OK. Pe parcursul gravării, se afișează pe ecran o bară de progres pentru a oferi utilizatorului o estimare referitoare la durata procesului. Figura 2.7: Fereastră corespunzătoare stării numărul trei
Concluzii și dezvoltări ulterioare În ceea ce privește dezvoltarea proiectului, există multe aspecte cărora li se pot aduce îmbunătățiri, atât la partea electro-mecanică cât și la partea de software. Dispozitivul construit s-a dorit a fi unul cât mai flexibil și modular astfel încât orice modificare să necesite un minimum de efort. Soluțiile adoptate au fost atent studiate și comparate cu diverse alte variante posibile în vederea obținerii unui rezultat cât mai bun din punct de vedere funcțional. Cu toate că modelul actual poate fi îmbunătaţit, acesta își îndeplinește funcția de frezare, după cum se poate observa în imaginea următoare. Figura 2.8: Text frezat folosind dispozitivul CNC prezentat n
13
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Soluții complete de proiectare 3D
În ultimii ani, s-a putut observa o adevărată revoluţie în lumea proiectării 3D. Ceea ce odinioară era rezervat numai specialiştilor din industria aerospaţială, a devenit disponibil pentru toată lumea. Pentru a vă forma o idee despre scara acestei revoluţii, peste 70% din toate proiectele ce se fac acum în Europa sunt realizate în 3D. Totul de la un simplu bec până la cele mai complexe vehicule spaţiale sunt proiectate 3D. Vă putem ajuta să vă implicaţi în fascinanta lume a proiectării 3D. Primul lucru de care aveţi nevoie este un pachet software de proiectare 3D. Veştile bune sunt că există o plajă largă de unelte disponibile pentru a vă ajuta să începeţi să proiectaţi. Veştile proaste sunt legate de costuri – multe dintre aceste unelte software sunt destinate utilizatorilor profesionişti, iar costurile de licenţiere sunt aceleaşi ca pentru o maşină nouă. La DesignSpark avem plăcerea de a ajuta inginerii să creeze produse ce pot schimba lumea. De aceea am creat un software de proiectare 3D gratuit disponibil tuturor inginerilor şi proiectanţilor.
Cu DesignSpark Mechanical economisiți timp, proiectați mai uşor, mai rapid şi mai creativ ca niciodată. l l
l
l
Pot fi realizate desene dimensionate cu înaltă detaliere Sunt aduse rapid corecţii şi adăugări în proiect, fără a aştepta departamentul CAD Combinți creaţia dvs. cu componentele gata realizate din biblioteca 3D RS Components şi Allied Electronics Formele geometrice sunt create cu uşurinţă, fără ca utilizatorul să fie expert CAD
l
Şi cel mai important dintre lucruri, este complet gratuit! Aceasta nu este o versiune mai slabă a unui produs scump sau un software cu licenţă limitată în timp.
Bibliotecă de modele 3D Chiar şi cu cele mai bune unelte, proiectarea 3D poate fi mare consumatoare de timp.
Pentru a vă ajuta să creaţi proiectele de care aveţi nevoie, DesignSpark dispune de propria sa bibliotecă cu zeci de mii de modele, unde puteţi găsi produsul dorit, în plus îl puteti descărca gratuit. Uneltele de proiectare 3D nu sunt limitate numai la a crea noi proiecte. Multe dintre ele permit importul fişierelor de la alte unelte pentru ca dvs., ca inginer, să integraţi toate 14
PROIECTARE 3D elementele noii creaţii. Un exemplu perfect în această privinţă vine de la premiatul DesignSpark PCB, software-ul nostru gratuit pentru circuite imprimate. Nu numai că DesignSpark PCB oferă un viewer 3D, dar prin utilizarea convertorului nostru PCB puteţi exporta placa de circuit în SketchUp şi apoi să o integraţi în proiectul dvs. 3D.
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Scopul principal este de a oferi o imprimantă uşor de extins în funcţionalitate, uşor de replicat şi rapid de asamblat şi pus în funcţiune. Acest nou model este construit pe portofoliul RepRapPro. Companii precum 3D systems oferă imprimante 3D ce necesită o pregătire minimală până la punerea în funcţiune. Imprimantele sunt disponibile cu una, două sau trei culori.
Hardware – Imprimare 3D Mână în mână cu proiectarea 3D au fost dezvoltate şi dispozitive de imprimare 3D. Un nume ce ar descrie mai bine procesul ar fi “producere aditivă” – un obiect 3D este creat prin adăugarea succesivă a unor straturi foarte subţiri de material. În acest fel pot fi create relativ ieftin şi repede forme foarte complexe – de fapt unele produse nu pot fi realizate altfel.
Nr. stoc RS: 799-0442
Imprimarea 3D este calea perfectă de realizare a prototipurilor dvs. De asemenea se pot crea cu uşurinţă piese de rezervă. Până de curând, costul şi dimensiunea imprimantelor 3D erau obiective greu de atins. Proiectele open source precum cele create de RepRap au inspirat proiecte pentru imprimante 3D, făcând tehnologia mai accesibilă pentru companiile mici-medii. Cea mai ieftină cale de a intra în lumea imprimării 3D este de a vă construi una singuri. Cea mai simplă variantă este kit-ul produs de RepRap Pro.
Hardware – Scanare 3D Tehnologia de scanare 3D permite capturarea şi importul obiectelor într-un model 3D. Scanerul 3D Sense capturează lumea dvs. în 3D. Dispozitivul poate scana obiecte mari şi mici, oameni şi scene.
RepRapPro Ormerod este una dintre cele mai versatile imprimante 3D.
Scanerul 3D are cea mai diversă plajă de scanare, dispunând de auto-reglare
Nr. stoc RS: 799-0411
optimizată pentru obiecte mici precum o carte şi obiecte mari precum o motocicletă, dar şi corpuri umane întregi şi scene cu lăţime şi înălţime de 3 m. Aparatul are implementată recunoaştere automată a obiectelor, permiţându-se astfel extragerea precisă a ţintelor din cele mai aglomerate situaţii, scanând doar obiectul dorit. Fiind portabil, aparatul vă oferă o mobilitate şi spontaneitate deosebite. Software-ul utilizat de scanerul 3D Sense este intuitiv, rapid, precis şi uşor de utilizat. Procesul de scanare durează numai câteva secunde, rezultatul putând fi apoi tăiat, îmbunătăţit şi solidificat pentru imprimare. Alături de Aurocon COMPEC distribuitor autorizat RS Components în România și DesignSpark Mechanical proiectarea 3D este mai accesibilă acum mai mult ca oricând. Unelte puternice, gratuite precum DesignSpark Mechanical, permit implicarea utilizatorilor cu toate nivelele de pregătire. COMPEC și DesignSpark vă ţine la zi cu cele mai recente ştiri și produse noi din lumea 3D.
Nr. stoc RS: 799-0442
Alături de Aurocon COMPEC distribuitor autorizat RS Components în România și DesignSpark Mechanical proiectarea 3D este mai accesibilă acum mai mult ca oricând. Unelte puternice, gratuite precum DesignSpark Mechanical, permit implicarea utilizatorilor cu toate nivelele de pregătire. COMPEC și DesignSpark vă ţine la zi cu cele mai recente ştiri și produse noi din lumea 3D.
Aurocon COMPEC SRL www.compec.ro 15
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Masă de expunere Autor: Pătru Cristian georgecristian.patru@gmail.com
Proiectul prezentat în următoarele pagini constă în automatizarea unei mese de expunere cu ultraviolet (UV) folosită pentru realizarea de PCB-uri (Printed Circuit Board). 16
MASĂ EXPUNERE Pentru început, voi descrie paşii pentru producerea unei plăci PCB: l Se printează la o imprimantă cu laser pe o folie transparentă cablajul dorit. l Se aşează folia transparentă peste placa fotosensibilă şi se va lăsa la expunere cu lumină UV un timp bine definit pentru a îndepărta lacul fotosensibil nefolositor ce se află pe placă. l După ce timpul de expunere a trecut, se ia placa şi se clăteşte într-un vas cu sodă pentru a se înlătura lacul fotosensibil expus; astfel pe placă se vor defini traseele l Se introduce placa într-un recipient cu clorură ferică şi se lasă la corodat. l După corodarea plăcii, aceasta se şterge cu acetonă pentru a îndepărta şi stratul de lac fotosensibil rămas pe trasee; astfel se pot lipi piese pe acestea. l În final, se vor da găuri şi se vor lipi componentele pe placă. Datorită faptului că pentru realizarea plăcii PCB este nevoie de o anumită perioadă de timp de expunere la UV, diferită de la caz la caz, am fost nevoiţi să dezvoltăm acest proiect cu scopul de a realiza un circuit electronic programabil pentru a seta timpul dorit de expunere. Prin relizarea proiectului se uşurează şi munca depusă, pentru că nu mai este nevoie să aştepţi cu cronometrul în mână şi să opreşti procesul de expunere manual. Pentru a detalia şi mai bine modul de realizare al proiectului, îl vom despărţi în: n Partea electronică n Programarea Partea electronică Din punct de vedere al conţinutului, în schema electrică avem următoarele componente: 1. Datorită faptului că circuitul funcţionează la o tensiune de 5V în curent continuu, am avut nevoie de un transformator pentru a reduce tensiunea de 220V la o tensiune de 6V, iar pentru a transforma curentul electric alternativ în continuu, am avut nevoie de o punte redresoare realizată din diode 1N4004.
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
2. Pentru a putea alimenta circuitul la o tensiune constantă de 5V, am folosit stabilizatorul de tensiune LM7805. Pentru a putea stabiliza şi mai bine tensiunea, am adăugat în schemă doi condensatori, unul de 470uF (C1) pe intrarea stabilizatorului şi unul de 100nF (C3) pe ieşirea acestuia. 3. Pornirea neoanelor UV la o tensiunde de 220V am realizat-o prin două relee care sunt comandate la o tensiune de 5V prin doi tranzistori NPN (BC547).
Am folosit relee deoarece sunt foarte uşor de comandat, căderea de tensiune pe acestea este nulă şi în acelaşi timp şi ieftine. Acestea ofera şi o izolare galvanică foarte bună între partea de comandă şi cea de putere, lucru care dacă nu ar fi fost, putea aduce defectări, deoarece cu acestea deschidem sau închidem circuitul electric la o tensiune alternativă de 220V.
că neoanele de UV sunt aprinse, iar LED-ul verde că neoanele sunt stinse. 5. Afişarea timpului setat şi a celui rămas până la oprirea procesului de expunere şi al altor mesaje am realizat-o pe un LCD alfanumeric 16×2 (RAYSTAR RC1602BBIW-ESX), care conţine un controller integrat ce simplifică folosirea display-ului. Controllerul utilizat este Hitachi 44780 având o interfaţare simplă între microcontroller şi display. Acest LCD are
un număr total de 14 pini conform tabelului următor: Ü
4. Pentru setarea timpului am ales 4 butoane (pushbutton) şi datorită faputului că nu avem acces la neoane pentru a şti dacă acestea sunt pornite sau nu, am montat şi 2 LED-uri pentru a ne indica acest lucru, astfel că LED-ul roşu reprezintă faptul
17
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Ü
Pinii VSS şi VDD se vor conecta la GND, respectiv la 5V, pinul 3, VEE, a fost conectat printr-un potenţiometru de 10K între VSS şi VDD pentru a se putea regla contrastul. Restul pinilor vor fi explicaţi în paragrafele care urmează. Conectarea LCD la uC se va realiza printr-un pinheader. 6. Şi nu în ultimul rând, pentru procesarea tuturor datelor şi afişarea pe LCD am folosit microcontrolerul (uC) PIC18F4550.
Design-ul PCB-ului nu a fost unul foarte complicat, dar pentru realizarea acestuia a fost nevoie de câteva reguli utile. Să începem cu microcontrolerul care are câte doi pini de VCC şi doi de GND, astfel că pe fiecare pereche de VCC şi GND a trebuit montat câte un condensator de 100nF C6, respectiv C7 cât mai aproape de pinii uC, pentru a reduce fluctuaţiile de tensiune de la alimentarea uC, care l-ar putea duce la nefuncţionarea la parametri normali. Pentru
ca uC să se restarteze din cauza zgomotelor din exterior a fost nevoie de montarea unui circuit de tip pull-up cu o rezistenţă de 4k7 între pinul uC de RESET şi VCC şi un condensator de 100 nF între pin şi GND. Datorită consumului de curent, stabilizatorul de tensiune LM7805 se încălzea destul de mult, astfel că pe acesta am montat un radiator pentru a disipa căldura generată mai rapid. Pentru că bobinele releelor la comutare necesită un curent de minim 15mA, am ales să le comandăm prin doi tranzistor BC547 şi nu direct de pe pinii uC. Pentru o ecranare şi o disipare de căldură a circuitului destul de bună, am ales să realizez PCB-ul cu plan de masă atât pe TOP cât şi pe BOTTOM. O altă protecţie pe care am realizat-o în circuit a fost aceea de a pune în paralel cu bobinele releelor câte o diodă în polarizare inversă, deoarece atunci când se va opri alimentarea bobinelor în acestea apare un curent indus ceea ce ar putea duce la distrugerea celor 2 tranzistoare, astfel că vom avea cădere de tensiune pe diode şi nu pe tranzistori. În ceea ce priveşte, partea electronică de comandă a mesei de expunere, aceasta este alcătuită din 3 plăci:
18
MASĂ EXPUNERE l
l
Placa principală pe care se află microcontrolerul (PIC18F4550), sursa de alimentare, modulul de comandă al releelor şi pinheader-ele pentru comunicarea cu LCD, cu butoanele de comandă şi cu releele.
Placa de comandă pe care se găsesc cele 2 LED-uri şi cele 4 butoane pentru a programa timpul.
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Programarea Pentru a realiza şi partea software a proiectului am folosit codul C pe care l-am scris în programul MPLABX. Putem spune că acest cod se împarte în două ramuri: codul scris pentru a creea efectiv un cronometru invers. Utilizatorul va seta timpul dorit, iar după pornirea procesului, microcontrolerul va numerota invers până la terminarea timpului, oprind expunerea. Cea de-a doua parte este reprezentată de codul scris pentru afişarea datelor pe LCD-ul folosit. Acum, pentru a putea înţelege şi mai bine cum am gândit funcţionarea mesei de expunere, vom detalia secvenţe din cod. Pentru început, avem patru funcţii de iniţiere apelate în funcţia main (diagrama 1) 1. pentru iniţializarea porturilor de ieşire şi a variabilelor (diagrama 2) Porturile E0 şi E1 sunt setate ca porturi de ieşire pentru cele două LED-uri, iar porturile B3 şi B4 sunt tot porturi de ieşire pentru cele două relee. Ü
void main(void) { init(); // initializare lcd lcd(); init_interrupt(); // initializare intrerupere init_timer(); // initializare timer while (1) { if (semafor_oprire == 1) { semafor_oprire = 0; oprire(); } if (semafor_afisare == 1) { semafor_afisare = 0; afisare_ceas(); } if (semafor_pornire == 1) { semafor_pornire = 0; pornire(); } if (semafor_setare_timp == 1) { semafor_setare_timp = 0; setare_timp(); } if (semafor_afisare_oprire == 1) { semafor_afisare_oprire = 0; afisare_oprire(); } if (semafor_afisare_timp_setat == 1) { semafor_afisare_timp_setat = 0; afisare_timp_setat(); } } // bucla infinita
Diagrama 1
}
PCB Placă butoane
l
Placa pe care se află cele 2 relee pentru aprinderea tuburilor cu UV.
PCB Placă relee 19
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Ü
Variabilele sec, min şi timp sunt folosite pentru a memora numărul secundelor, minutelor, respectiv timpul total măsurat în secunde. void init() { TRISEbits. TRISE0 = 0 ; TRISEbits. TRISE1 = 0 ; TRISBbits. TRISB3 = 0 ; TRISBbits. TRISB4 = 0 ; TRISBbits. TRISB5 = 0 ; PORTEbits. RE0=0; PORTEbits. RE1=1; PORTBbits. RB3=0; PORTBbits. RB4=0; min=0; sec=0; timp=0; counter=0; start=0; }
3. pentru iniţializarea întreruperilor externe void init_interrupt() { TRISBbits. TRISB0 = 1 ; TRISBbits. TRISB1 = 1 ; TRISBbits. TRISB2 = 1 ; INT0E = 1; INT1E = 1; INT2E = 1; INTEDG0 = 0; INTEDG1 = 0; INTEDG2 = 0; ADCON1 = 15; GIE = 1; }
if (INT1IF) /* Buton incrementare secunde */ { INT1IF = 0; if (start == 0) { sec++; if (sec==60) { sec=0; min++; } semafor_afisare_timp_setat = 1; }
4. pentru iniţializarea timer-ului
void lcd(void) { Wait(500); LCDInit (LS_BLINK); LCDClear (); LCDWriteStringXY (0,0, "Seteaza timpul!"); }
void init_timer() { T0PS0=1; T0PS1=1; T0PS2=1; PSA=0; T0CS=0; T08BIT=1; TMR0IE=1; PEIE=1; GIE=1; TMR0ON=1; }
Această funcţie pregăteşte LCD-ul pentru a putea fi folosit şi pentru a scrie pe acesta mesajul “Setează timpul!”
Setarea timpului de la butoane se bazează pe întreruperile externe, trei la număr INT0, INT1 şi INT2 care se găsesc pe
Diagrama 2
2. pentru iniţializarea LCD-ului
}
pentru incrementarea minutelor se va apasa butonul cu ieşirea pe portul RB1. if (INT2IF) /* Buton incrementare minute */ { INT2IF = 0; if (start == 0) { min++; semafor_afisare_timp_setat = 1; } }
Diagrama 5
Diagrama 6
20
porturile RB0, RB1 şi RB2 setate ca porturi de intrare. Pentru incrementarea numărului de secunde, este necesară apăsarea butonului care are ieşire pe portul RB0,
Butonul de pe portul RB2 are rolul atât de a porni procesul de expunere, cât şi cel de al opri. (diagrama 3)
MASĂ EXPUNERE
Pentru pornirea expunerii este necesar măcar setarea minutelor sau secundelor, altfel dacă butonul este apăsat fără setarea în prealabil a minutelor sau secundelor, pe LCD va fi afişat mesajul: “Setează timpul!”. if (INT0IF) /* Buton pornire countdown */ { INT0IF = 0; //calculez timpul timp = 60*min+sec; if (start == 0) //daca inca nu e pornit, porneste { if (timp != 0) /* Pornesc countdown-ul cu durata specificata */ { start=1; semafor_pornire = 1; } else /* Durata e zero*/ { semafor_setare_timp = 1; } } else /* Era deja pornit, a doua apasare inseamna oprire. */ { semafor_afisare_oprire = 1; timp = 0; sec = 0; min = 0; } Diagrama 3 }
În momentul porniri mesei de expunere, pe LCD vor fi afişate două mesaje, unul cu timpul pe care l-am seatat noi: “Timpul setat:
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
mm:ss”, iar cel de-al doilea cu timpul rămas până la oprirea procesului de expunere: “Timpul rămas: mm:ss”. Dacă, după pornirea procesului este necesară oprirea înainte de terminarea timpului setat, se va apăsa din nou butonul de pe portul RB2. Această acţiune de oprire a procesului duce la afişarea pe ecranul LCD al mesajului: “Operaţie oprită!”. Dacă nu, la terminarea timpului se va opri procesul şi pe LCD va fi afişat mesajul: “Operaţie terminată!”. Odată cu pornirea procesului de expunere, microcontrolerul începe să decrementeze câte o unitate din timpul total la fiecare secundă trecută.Pentru a putea ţine evidenţa secundelor, ne-am folosit de timer-ul pe 8 biţi (TMR0), fiind efectiv un numărător având ca sursă de ceas oscilatorul intern de 4MHz (OSC). Acest timer fiind pe 8 biţi poate să numere maxim până la 255. Când TMR0 ajunge la valoarea maximă, apare depăşirea (overflow) care generează o întrerupere la o perioadă precisă, definită de noi şi anume 65536us. Astfel, pentru a număra o secundă, am folosit un contor ce va fi incrementat la fiecare depăşire a timerului, iar când va ajunge la valoarea 15, vom şti că a trecut o secundă.
Valorile timpilor de mai sus au fost calculate după cum urmează: Timer-ul a fost configurat cu un prescaler de 1/256 care ajută la divizarea ceasului pentru a obţine o frecvenţă mai mică. Acesta numără la o frecvenţă de OSC/4, adică 4MHz/4 = 1MHz (FCPU) ceea ce în timp, reprezintă T = 1/FCPU MHz = 1/1MHz = 1us, deci un ciclu face 1 us. Ü if (TMR0IE && TMR0IF) { TMR0IF = 0; if (start == 1) { counter++; if (counter==15) {
//ciclu pt o secunda
if (timp==0) //daca se termina timpul se opreste operatia { semafor_oprire = 1; } else //daca nu decrementam timpul { timp--; semafor_afisare = 1; } counter=0; } } }
Diagrama 4
21
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Ü
Perioada prescaler-ului este Pp = T*256 = 256us. Rezultă că perioada de depăşire a timer-ului este Pd = Pp*256 = 65535us = 0.065536s. Şi, în final, pentru o secundă va trebui să avem 1/0.065536 = 15 depăşiri. (diagrama 4) Interfaţa de comunicare cu LCD-ul folosit este una paralelă şi poate fi pe 8 sau pe 4 biţi de date. În acest proiect, am preferat interfaţarea pe 4 biţi de date deoarece se folosesc doar 7 pini ai uC pentru controlul complet al LCD-ului. Cei 7 pini se împart în 3 pini de control: E (enable), R/W (read/ write), RS (register select) şi 4 pini de date (D4-D7). Pe partea hardware, interfaţarea s-a efectuat pin la pin, vezi figura alăturată. Cei 3 pini de control ai LCD-ului, RS, R/W, E au fost conectaţi pe pinii RA0, RA1, respectiv RA2 din portul A al uC, iar pinii
22
de date D4-D7 au fost conectaţi pe pinii RD0-RD3 din portul D al uC.
Pentru a putea realiza o comunicare între uC şi LCD, a fost nevoie de respectarea unui protocol de comunicaţie, descris pe scurt în cele ce urmează: 1. Se setează pinul RS pe 0 pentru a transmite o comandă sau pe 1 dacă
dorim să transmitem date. 2. Se setează pinul R/W pe 0 pentru operaţie de scriere sau pe 1 pentru operaţie de citire 3. Se trasmite codul instrucţiunii: - Se setează pinii D4-D7 la valoarea primilor 4 biţi ai instrucţiunii începând de la MSB - Se activează pinul E - Se aşteaptă 250ns - Se dezactivează pinul E - Se aşteaptă 300ns - Se setează pinii D4-D7 la valoarea următorilor 4 biţi ai instrucţiunii - Se activează pinul E - Se aşteaptă 250ns - Se dezactivează pinul E 4. Se aşteaptă 10ns 5. Se dezactivează pinii RS, R/W, D4-D7 n
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Senzorii pentru evalarea mediului ambiant şi-au găsit utilizare în diferite domenii cum ar fi casele inteligente, telemedicina, securitate etc. Evoluţia senzoristicii, a mijloacelor de comunicare wireless şi a circuitelor integrate a permis realizarea unor senzori cu precizie ridicată, portabili, cu costuri şi dimensini reduse. Principalele probleme ridicate de aceşti senzori sunt asigurarea unei autonomii ridicate a senzorilor şi corectitudinea datelor măsurate. În cadrul acestui articol, voi prezenta un senzor wireless care măsoara 3 parametri uzuali (temperatura, umiditatea şi luminozitatea). În funcţie de necesităţile utilizatorului, se pot adăuga 3 senzori analogici, un senzor cu comunicare I2C şi unul cu comunicare UART sau SPI. Pentru comunicarea senzorului cu alte dispozitive, se utilizează un MRF24J40MA. Pentru a putea fi conectat la tablete sau smartphone-uri se poate ataşa un modul Bluetooth. Autori: Răzvan Tilimpea - razvan.tilimpea@gmail.com Daniel Rosner - daniel.rosner@cs.pub.ro Senzorul de temperatură şi umiditate Pentru evaluarea acestor doi parametri am ales senzorul Sensirion SHT10, dar se poate folosi orice produs din gama SHT1X, în funcţie de precizia dorită în efectuarea măsurătorilor. Datele sunt transmise altor dispozitive prin intermediul protocolului I2C. Problemele ridicate de acesta au fost: izolarea de componentele care degajă căldură şi procesul de lipire, care poate deteriora senzorul! Pentru corectitudinea măsurătorilor, este indicat ca senzorul să fie cât mai bine izolat de componentele care degajă caldură (de exemplu regulatoare de tensiune) şi să fie activ mai puţin de 10% din timp. În caz contrar, acesta se va autoîncălzi. Un alt factor care poate duce la decalibrarea senzorului este expunerea îndelungată la condiţii în afara celor normale de funcţionare.
Senzorul de lumină Măsurarea iluminării se realizează cu senzorul Intersil ISL29003. Comunicarea între senzor şi controller se face prin intermediul I2C. Rezoluţia maximă a senzorului este de 16 biţi şi pentru o precizie cât mai bună a măsurătorilor, se poate alege unul din cele 4 intervale pentru măsurare (0 Lux – 1000 Lux, 0 Lux – 4000 Lux, 0 Lux- 16000 Lux, 0 Lux -64000 Lux). Aceste caracteristici oferă senzorului o flexibilitate ridicată în ceea ce priveşte aplicaţiile în care poate fi integrat. Pentru utilizarea în medii cu iluminare artificială, se poate folosi funcţia de integrare a valorilor măsurate. În funcţie de zgomotul specific reţelei de alimentare cu energie, se pot specifica parametrii operaţiei de integrare. O funcţie foarte importantă este aceea de selectare a tipului de lumină măsurat. Senzorul include două fotodiode: una sensibilă în spectrul infraroşu (D1) şi una sensibilă atât în spectrul infraroşu cât şi în cel vizibil (D2). Din această construcţie derivă 3 tipuri de măsurători: intensitatea măsurată de fiecare diodă în parte sau diferenţa dintre D2-D1.
Transceiver MRF24J40MA este un transceiver produs de Microchip şi certificat 2.4GHz IEEE 802.15.4. El nu necesită ataşarea unei antene, are un consum redus de maxim 23mA atunci când funcţionează şi 2uA în modul de Sleep. Protocoalele de comunicare compatibile cu acest modul sunt: ZigBee, MiWi şi MiWi P2P. Puterea semnalului emis este de 0dBm, iar raza de acţiune este de ~30 de metri în spaţii închise şi de ~120 de metri în aer liber
Controller Pentru a controla achiziţia datelor şi comunicarea senzorului cu alte dispozitive, am utilizat un controller PIC24FJ64GA306. Ü 23
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Ü
În cazul unor aplicaţii care necesită resurse mai mari de flash, se poate folosi PIC24FJ128GA306. Una din cele mai importante caracteristici ale controllerului este tehnologia nanoWatt XLP, care permite asigurarea unui consum scăzut şi implicit creşterea autonomiei senzorului. Probleme de design Principalul obiectiv a fost obţinerea unui senzor cu un grad de flexibilitate ridicat în ceea ce priveşte tipul măsurătorilor efectuate şi modul de comunicare cu alte dispozitive. La acesta se adaugă obţinerea unor dimensiuni reduse pentru board. În acest fel, senzorul se poate utiliza în aplicaţii care necesită portabilitate. În îndeplinirea obiectivelor am întâmpinat o serie de dificultăţi cum ar fi: l
Regulatorul de tensiune disipă energie sub formă de căldură şi poate afecta măsurarea temperaturii. De aceea, în zona regulatorului am poziţionat mai multe vias-uri pe planul de masă. În acest fel, căldura se va disipa pe ambele feţe ale board-ului. O altă măsură luată pentru prevenirea acestui efect a fost eliminarea planului de masă în jurul senzorului de temperatură.
l
Un alt aspect care trebuie luat în considerare este zona transceiver-ului. Sub acesta nu este permisă rutarea niciunui traseu din cauza posibilelor interferenţe. În acest fel, o mare parte din spaţiul board-ului nu a putut fi utilizat.
Concluzii Dacă până acum am vorbit despre componentele utilizate, acum vom vedea produsul obţinut prin înglobarea tuturor produselor prezentate mai sus. Din punct de vedere al dimensiunii, senzorul are 4.5cm lăţime şi 7 cm lungime. Pentru alimentare, se pot folosi acumulatori LiPo de 1 sau 2 celule sau orice acumulator cu tensiune cu ieşire asemănătoare. În timpul efectuării măsurătorilor de luminozitate, temperatură şi umiditate, consumul senzorului este de ~1mA. Pentru a reduce consumul de energie se poate reduce rezoluţia senzorilor şi implicit timpul de funcţionare al acestora. În modul de sleep, toate componentele au un consum neglijabil. Din punct de vedere al testelor efectuate, am observat necesitatea implementării unui algoritm de selecţie automată a intervalului în care se află valoarea măsurată. În acest fel, se pot efectua măsurători exacte în spaţii în care luminozitatea variază, de exemplu în aer liber.
n
24
WSN
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
25
Dă-ne un LIKE pe Facebook şi ai şansa să câştigi un un kit de dezvoltare MGC3130 Hillstar 3D Gesture de la Microchip!
MPLAB Starter Kit for PIC24H Microcontrollers Exemplu de aplicaţie Autor: Daniel Ghiţă daneelg@yahoo.com
Kit-ul, printr-o abordare simplă, pas-cu-pas, oferă proiectanţilor ocazia de a dezvolta sisteme controlate prin gesturi 3D bazate pe circuitul MGC3130 şi electrozii de la Microchip care îndeplinesc cerinţele lor de spaţiu. MGC3130 este primul controler de gesturi 3D din lume destinat recunoaşterii gesturilor spaţiale libere. Kit-ul de dezvoltare MGC3130 Hillstar este un sistem de referinţă complet compus din circuitul MGC3130 şi un electrod de referinţă în 4 straturi cu o suprafaţă de detecţie de 95 × 60mm. Cu electrozi de referinţă adiţionali, software-ul Aurea Graphical User Interface Software şi un modul I2C-to-USB Bridge, kit-ul permite pe baza circuitului MGC3130, o proiectare facilă de sisteme cu factori de formă diferiţi. Tehnologia GestIC® activată de MGC3130 oferă oportunitatea dezvoltării unei game largi de aplicaţii în domeniul IT precum laptop-uri, tastaturi, dispozitive de intrare; aplicaţii de iluminat care includ comutatoare de lumină şi control, electronică de larg consum precum sisteme audio, imprimante şi copiatoare, pieţe auto pentru circuitele de control din interiorul autoturismului şi multe altele. Kit-ul de dezvoltare MGC3130 Hillstar permite clienţilor să integreze o interfaţă avansată (3D) cu utilizatorul pentru determinarea poziţiei mâinii şi recunoaşterii gesturilor în aproape orice produs electronic folosind o abordare modulară cu documentaţie completă, referinţă layout, hardware şi interfaţă grafică GUI. Pentru a avea şansa de a câştiga un kit de dezvoltare MGC3130 Hillstar 3D Gesture
(în valoare de 182 USD) daţi un LIKE pe Facebook https://www.facebook.com/ELECTRONICA.AZI în perioada 15 Septembrie - 1 Noiembrie. Câştigătorul va fi anunţat în ultimul număr al revistei Electronica Azi - HOBBY din acest an.
MPLAB Starter Kit for PIC24H Microcontrollers este o soluţie hardware + software pe care Microchip o pune la dispoziţia celor ce doresc să exploreze capabilităţile seriei de procesoare pe 16 biţi PIC24. Partea hardware a acestui kit o reprezintă placa de dezvoltare, construită în jurul unui microcontroler PIC24HJ128GP504. Aceasta este dotată cu o serie de dispozitive hardware pe care utilizatorii le pot folosi în aplicaţii: două butoane tip switch, un accelerometru analogic triaxial, un difuzor, un display OLED monocrom (128×64 pixeli) şi o intrare de semnal analogic. Pe parte de software, kit-ul de la Microchip vine însoţit de un CD ce conţine versiunea completă a mediului integrat de dezvoltare MPLAB® IDE, o versiune de evaluare a compilatorului MPLAB C30 C Compiler for PIC24 precum şi codul sursă al unei aplicaţii demonstrative, demo ce face o trecere prin toate elementele disponibile pe placa de dezvoltare. Pentru exemplul ce urmează, am ales utilizarea a doar două din resursele puse la dispoziţie de placa de dezvoltare: intrarea de semnal analogic împreună cu display-ul OLED. Aplicaţia va realiza citirea valorii de tensiune (milivolţi) dată de un termocuplu tip K şi afişarea valorii citite pe display, atât în milivolţi cât şi convertită în grade Celsius. Terminalele termocuplului se conectează la placă prin intermediul conectorilor TP11 (+) şi TP12 (-). Semnalul este apoi amplificat de un amplificator diferenţial, cu factor fix de amplificare (100) şi este citit pe intrarea AN7 a microcontrolerului. Această soluţie produce însă şi o limitare, respectiv faptul că nu vom putea măsura decât valori pozitive ale semnalului de intrare, în intervalul 0-33mV, ceea ce înseamnă ca vom putea afişa doar temperaturi pozitive, între 0 şi ~790˚C. 26
MPLAB STARTER KIT
Termocuplul se poate conecta direct la terminalele plăcii, caz în care valoarea măsurată este de fapt diferenţa între temperatura joncţiunii şi temperatura terminalelor (dacă termocuplul şi placa de dezvoltare se află la aceeaşi temperatură, valoarea măsurată va fi ...0). Pentru a putea măsura temperatura ambientă este necesară folosirea unui circuit de compensare a joncţiunii reci.
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
primului buffer, se va trece la salvarea datelor în celălalt. În acelaşi timp se
O soluţie relativ simplă ar fi folosirea unei diode, ca în schema următoare (sursa: www.ti.com/lit/ml/slyp161/slyp161.pdf).
respectiv 12 biţi, valorile citite fiind deci numere întregi în intervalul 0-4096. Valorile stocate în buffer-ul curent sunt mediate, valoarea medie obţinută fiind apoi scalată (adusă în domeniul 0-33mV) şi convertită în grade Celsius (pe baza unor formule de aproximare polinomială a variaţiei tensiunii generate prin efect Seebeck cu temperatura). Urmează apoi afişarea datelor obţinute pe ecran, după care programul aşteaptă terminarea următorului ciclu de citire. Pentru realizarea aplicaţiei, se recomandă crearea unui proiect nou în MPLAB, apelând la wizard-ul de proiecte (meniu principal - > Project - > Project Wizard). La pasul 1 se va selecta microcontrolerul pe care va rula aplicaţia: PIC24HJ128GP504. La pasul 2 se alege “Microchip C30 Toolsuite” din lista pentru “Active Toolsuite” şi eventual se verifică faptul că la “Location” avem calea corectă pentru fiecare din executabilele din lista “Toolsuite Contents”. La pasul 3 alegem un nume şi o locaţie pe disc pentru proiectul ce urmează a fi creat (ex. “C:/Lucru/Demo_Project”). La pasul 4 se pot adăuga la proiect fişiere sursă adiţionale. În cazul nostru dăm doar next şi finalizăm procesul de creare a proiectului.
Microcontrolerul realizează eşantionarea şi conversia semnalului în paralel cu execuţia programului principal. Datele rezultate sunt stocate în 2 buffere de memorie, în mod alternativ (“ping - pong”): la umplerea
generează o întrerupere, iar programul principal este anunţat că trebuie sa prelucreze informaţiile (prin intermediul variabilei flag). Convertorul A/D a fost setat să folosească rezoluţia maximă,
Proiectul final va trebui să includă 4 fişiere: main.c, GOLFontDefault.c, GenericTypeDefs.h şi p24HJ128GP504.h. Dintre acestea, ultimele 3 există deja şi pot fi găsite în directorul unde a fost instalat software-ul kit-ului de dezvoltare: Ü 27
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Ü
Câştigaţi cu Electronica Azi
Hobby l
p24HJ128GP504.h este un fişier header ce conţine definiţii de parametri specifici procesorului PIC24HJ128GP504 şi poate fi găsit în directorul “Microchip Starter Kits\PIC24H Starter Kit 1\MPLAB C30\support\PIC24H\h\”;
l GOLFontDefault.c conţine definiţia simbolurilor setului de caractere şi va fi folosit pentru afişare. Poate fi găsit în directorul “Microchip Starter Kits\PIC24H Starter Kit 1\MPLAB_ Starter_Kit_for_PIC24H_Demo\Graphics\”;
Microchip împreună cu Electronica Azi vă propune următorul concurs: Trimiteţi la redacţie proiectul unei aplicaţii practice şi aveţi şansa de a câştiga un MPLAB Starter Kit pentru microcontrolerele PIC24H.
l GenericTypeDefs.h conţine definiţia unor tipuri de date ce vor fi folosite ulterior în aplicaţie (ex. BYTE, SHORT etc). Poate fi găsit în directorul “Microchip Starter Kits\PIC24H Starter Kit 1\MPLAB C30\support\peripheral_24F\”.
Aceste trei fişiere vor trebui copiate în directorul proiectului nostru. În plus, după copiere, fişierul GOLFontDefault.c va trebui adăugat la proiect (click dreapta în fereastra “Workspace” pe “Source Files”, apoi click pe “Add Files” urmat de selecţia fişierului menţionat). Se poate realiza o operaţie similară şi cu cele două fişiere header (GenericTypeDefs.h şi p24HJ128GP504.h) însă nu este obligatoriu. l
Fişierul main.c reprezintă programul propriu-zis, şi va trebui creat de la zero: click dreapta în fereastra “Workspace” pe numele proiectului, apoi click pe “Add New File”. În căsuţa “File name” scriem “main.c” urmat de click pe butonul “Save”. Listing-ul fişierului main.c îl puteţi găsi în varianta on-line a articolului, sau, arhivat, la redacţia noastră, office@electronica-azi.ro
n 28
Toţi cei care vor trimite la redacţie articolul unei aplicaţii practice până la data de 15 Decembrie 2014, vor avea şansa de a câştiga (prin tragere la sorţi) un MPLAB Starter Kit. Articolul câştigătorului va fi publicat în unul din numerele viitoare ale revistei Electronica Azi - Hobby, iar câştigătorul kit-ului va fi anunţat în primul număr al revistei Electronica Azi - Hobby / 2015.
Articolul propus spre publicare trebuie să conţină următoarele elemente: • Introducere (~ 50 cuvinte) • Conţinut (~ 1000 cuvinte) • Poză autor şi pentru aplicaţia propusă • Diagrame (schemă electronică, detalii, circuit PCB).
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Cameră video de tip endoscop Basetech BSK-100 Această cameră cu endoscop este utilă pentru a inspecta şi explora cu uşurinţă locurile greu accesibile, beneficiind de o imagine foarte clară. Se poate folosi în electronică, în atelier, în domeniul auto la verificarea urmelor de coroziune sau citirea codurilor greu accesibile, pentru hobby sau întreţinerea instalaţiei sanitare. Gâtul flexibil, impermeabil, de lebadă, LED-urile cu reglarea intensităţii luminoase şi ecranul TFT cu diagonala de 6,1cm şi rezoluţia 480 × 234 pixeli recomandă acest endocop ca un instrument indispensabil în fiecare atelier. LED-urile cu lumină albă pot fi reglate manual, astfel încât imaginea oferită să nu fie subexpusă sau supraexpusă. Camera oferă balans de alb şi expunere automate. Gâtul flexibil este impermeabil, dar nu trebuie introdus în soluţii acide sau puternic alcaline. Aparatul nu trebuie utilizat în mediu exploziv, pe persoane sau animale, în contactul cu instalaţii aflate sub tensiune.
l l l l l l l l l l l l l l l
Caracteristici: Diagonală ecran: 6,1cm (2.4”) cu 480 × 234 pixeli Grad de protecție: IP67 Rază de curbură max.: 45 mm Câmp vizual: 54° Focalizare: 30 - 60 mm Distanță minimă de focalizare: 30 mm Lungimea sondei: 59 cm Diametrul sondei: 9,8 mm Rezoluție: 480 × 234 pixeli (ecran TFT), 640 × 480 pixeli (cameră) Sursă de lumină: 2 LED-uri albe (max. 600 lux) cu lumină reglabilă Alimentare: 4 baterii AA Consum curent: maxim 280 mA Temperatură de lucru: 0 la +45 °C, 15-85% RH Greutate: 280 g Dimensiuni (L × l × h): 78 × 850 × 61mm Tel.: 0256-201346 office@oboyle.ro, www.oboyle.ro 29
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Aplicaţie realizată cu EFM32™ Zero Gecko Starter Kit Placa de dezvoltare dispune de un microcontroller de 32 biţi ARM Cortex-M0+ care lucrează la o frecvenţă de maxim 24 MHz, programator hardware SEGGER J-Link integrat, display de 128 × 128 pixeli cu 2 culori, 2 butoane, 2 LED-uri, 2 senzori touch, soclu pentru baterie, pini pentru accesul la porturile microcontrollerului, senzor de temperatură, sistem de monitorizare a energiei consumate şi altele. Autor: Cătălin Ionuţ Neagu neagu.catalin.ionut@gmail.com
Componenţa pachetului Pachetul conţine placa de dezvoltare, un cablu USB, un CD cu mediul de dezvoltare IAR Embedded Workbench (ce poate fi utilizat 30 zile sau nelimitat cu limită de mărime pentru cod) şi un fluturaş cu adresa de unde poate fi descărcat gratuit un alt mediu de programare, Simplicity Studio (care a fost folosit şi pentru această aplicaţie).
Cutia EFM32 30
Aplicaţii demo Pentru încărcarea unei aplicaţii demo se procedează astfel: Se conectează placa de dezvoltare la USB cu ajutorul cablului din
pachet, apoi se deschide din Simplicity Studio aplicaţia Demos din meniul Tools, se alege un exemplu din listă şi se apasă butonul Start.
Componenţa pachetului
EFM32™
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
16
13
14
15
8 1
9 7 10
12
3
6
2
11
5 4
Placa de dezvoltare: 1 microcontroller, 2, 3 senzori touch, 4, 5 LED-uri, 6, 7 butoane, 8 display, 9 soclu baterie, 10 switch pentru selectarea modului de alimentare (baterie sau USB), 11 buton reset, 12, 13 ieşiri pentru porturile microcontrollerului (în care poate fi lipită o baretă de pini), 14 mufă pentru conectarea la USB, 15, 16 pini În câteva secunde, aplicaţia va începe să ruleze. Pentru vizualizarea codului sursă al unei aplicaţii demo se deschide, tot din meniul Tools, Simplicity IDE, apoi Project, New, Silicon Labs MCU Project…, în pagina de setare a proiectului se alege din listă modelul kit-ului (cel mai probabil este autodetectat), la tipul proiectului se bifează Example, apoi se alege din listă exemplul demo, se alege un nume şi un folder, la Build Configurations se alege Debug prin dublu-click şi într-un final se
apasă butonul Finish. Pentru compilare, se apasă butonul Build, iar pentru transferul fişierului .hex în memoria flash a microcontrollerului se apasă Flash Programmer, apoi Browse, după care se alege fişierul .hex din directorul în care a fost salvată aplicaţia (calea implicită este următoarea Users / Nume Utilizator / SimplicityStudio / v2_workspace / Proiectul curent / GNU ARM v4.7.3 – Debug / Nume.hex). La final se apasă Program. După transfer, aplicaţia va începe să ruleze imediat.
Crearea unui proiect nou Pentru prima aplicaţie realizată este recomandat să se deschidă un proiect demo, după paşii de la paragraful anterior, care să fie ulterior modificat. În partea stângă, în fereastra Project Explorer, trebuie adăugate toate fişierele sursă care conţin funcţii utilizate de aplicaţia în lucru. Acestea pot fi organizate în directoare. Fişierele se pot afla în orice director. Pentru a adăuga un fişier sau un folder, se alege New, File/Folder din meniul care apare când se dă click dreapta. Lista completă a directoarelor şi fişierelor din aplicaţia X şi 0 este următoarea:
Simplicity Studio
l
BSP: bsp_stk_leds.c
l
CMSIS: startup_gcc_efm32zg.s, system_efm32zg.c
l
Drivers: capsense.c, display.c, displayls013b7dh03.c, displaypalemlib.c, udelay.c
l
Emlib: em_acmp.c, em_cmu.c, em_emu.c, em_gpio.c, em_int.c, em_prs.c, em_rtc.c, em_usart.c
l
Graphics: dmd_display.c, glib_circle.c, glib_line.c, glib_rectangle.c, glib.c
l
Source: MyApp.c (fişierul sursă în care realizăm aplicaţia) Ü 31
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
Ü
Pe lângă fişierele sursă, trebuie adăugate în proiect şi biblioteci. Acest lucru se realizează prin click dreapta pe numele proiectului (în Project Explorer), Properties, C/C++ Build, Settings, Tool Settings, Includes, iar cu ajutorul butoanelor Add / Delete / Edit / Move Up / Move Down se stabilesc directoarele în care se află bibliotecile. Lista bibliotecilor este următoarea:
bsp.h, capsense.h, display.h, em_chip.h, em_cmu.h, em_gpio.h, glib.h, math.h Pentru localizarea fişierelor şi bibliotecilor am folosit funcţia Search în directoarele create de Simplicity Studio, aceasta fiind calea cea mai rapidă. Alte setări necesare pentru proiect sunt deja realizate, întrucât am pornit de la o aplicaţie demo şi nu am creat un proiect nou.
Aplicaţia realizată: “X şi 0” Aplicaţia “X şi 0”, prezentată în continuare, este una simplă, ce foloseşte doar placa de dezvoltare, fără alte echipamente hardware, scopul fiind acela de a arăta cum pot fi programate o parte din elementele prezente pe kit. Algoritmul aplicaţiei Iniţial, pe ecran sunt desenate cele 9 pătrate, cărora le atribuim în codul sursă câte un index de la 1 (colţul stânga sus) la 9 (colţul dreapta jos).
Afişajul în timpul rulării aplicaţiei
Directoarele care conţin bibliotecile utilizate
Simplicity IDE 32
Alegerea celulei în care va fi plasat simbolul se face întâi cu ajutorul senzorilor touch, prin deplasarea acestuia spre stânga sau spre dreapta, şi apoi prin apăsarea butonului PB0.
EFM32™
Pentru a nu confunda simbolurile deja plasate cu cel curent, acesta din urmă are dimensiuni mai mici. Când jocul se încheie, în toate celulele va fi desenat simbolul câştigător sau ambele simboluri în caz de egalitate. Pentru începerea unui joc nou se apasă butonul Reset. Codul sursă Toate setările fiind făcute, se poate trece la realizarea efectivă a aplicaţiei. După codul de includere a bibliotecilor s-au declarat următoarele variabile globale: l
status: un vector de dimensiune 9 care reţine la indexul i starea curentă a celulei i (0 dacă celula conţine simbolul 0, 1 pentru X şi 2 dacă celula este goală);
l
cnt: o structură de 2 variabile întregi, cell (care reţine indexul celulei curente) şi x0 (care reţine simbolul curent);
l
gameover: o variabilă booleană în care se stochează true atunci când jocul s-a încheiat.
l
l
gc: reţine informaţii legate de un element ce urmează a fi desenat pe ecran (de exemplu culoarea de background) gr: reţine informaţii pentru trasarea unui dreptunghi pe ecran
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
În programul principal main() s-au folosit funcţii de iniţializare (app_init şi game_init) şi o buclă infinită care conţine funcţiile Delay şi touch (care execută cod la apăsarea senzorilor touch). Codul pentru apăsarea butonului PB0 se execută prin intermediul sistemului de întreruperi şi nu apare în programul principal. În continuare sunt prezentate toate funcţiile, în ordinea în care apar în codul sursă:
Dacă temp este 0, atunci simbolul desenat are dimensiune mai mare, iar dacă este 1, mai mică. Simbolul X este desenat cu ajutorul a 2 linii, iar 0 reprezintă un cerc. Celulele sunt organizate într-o matrice de 3×3, iar linia şi coloana celulei i se pot calcula cu ajutorul câtului şi restului împărţirii indexului i la 3. La calculul coordonatelor în care se desenează liniile şi cercurile s-a ţinut cont de rândul şi coloana celulei.
static void GpioSetup(void): Această funcţie este copiată dintr-unul din exemplele puse la dispoziţie de Simplicity Studio. Scopul acesteia este de iniţializare a portului C, pinul 8, pe care se află butonul PB0.
void game_init(): Iniţializează variabilele status şi cnt, desenează celulele şi afişează simbolul x mic în prima celulă.
void app_init(): Realizează diverse iniţializări. void draw_background(): Desenează pe ecran cele 9 pătrate cu ajutorul unor linii şi dreptunghiuri şi a variabilelor gr şi gc. Nu insist asupra modului cum au fost calculate coordonatele la care acestea au fost plasate. Atunci când un element este desenat pe ecran, este trimis întâi într-un buffer, după care se utilizează funcţia DMD_updateDisplay() care afişează fizic pe ecran conţinutul acelui buffer. void draw_x0(int x0, int cell, int temp): Afişează pe ecran simbolul X sau 0 într-o anumită celulă, având o anumită dimensiune. Variabila x0 reţine 0 dacă se afişează 0, şi 1 dacă se afişează X. Cell reţine indexul celulei în care se plasează simbolul (de la 1 la 9).
void clear_cell(int cell): Atunci când se apasă un senzor touch, simbolul este mutat din celula curentă, motiv pentru care conţinutul acesteia trebuie şters. Ştergerea se face prin desenarea unui pătrat alb peste celula curentă. Deoarece funcţia GLIB_drawRectFilled foloseşte culoarea de foreground pentru desenarea pătratului, variabilei gc i se aplică mai întâi culoarea de foreground albă. int check_gameover(): Returnează 0 dacă jocul s-a încheiat şi jucătorul 0 a câştigat, 1 dacă a câştigat X, 2 dacă jocul s-a terminat la egalitate şi 3 dacă jocul nu s-a încheiat. Verificarea se face prin parcurgerea vectorului status. Spre exemplu, dacă primele 3 valori din vector sunt egale cu 1, jucătorul X a câştigat prin plasarea simbolului în toate căsuţele de pe prima linie. Ü
Energy Profiler 33
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5
void GPIO_EVEN_IRQHandler(void): Execută codul pentru apăsarea butonului PB0. Această funcţie este copiată dintr-un demo şi modificată. La apăsarea butonului, se şterge celula curentă şi se desenează simbolul de dimensiuni mari, se modifică vectorul status, se verifică sfârşitul jocului şi se modifică starea LED-urilor. void SysTick_Handler(void) şi static void Delay(uint32_t dlyTicks): Funcţii utilizate pentru delay; sunt copiate din exemplele demo. void touch(): Reprezintă funcţia ce se execută în buclă infinită. Aceasta citeşte prin funcţia CAPSENSE_Sense() starea senzorilor touch şi execută cod dacă numai unul din cei 2 senzori a fost apăsat. Desigur, senzorul din dreapta mută simbolul curent spre dreapta şi face modificările aferente în variabilele cnt şi status (analog pentru senzorul stânga). Monitorizarea energiei consumate Pentru monitorizarea energiei consumate se deschide din Simplicity Studio aplicaţia Energy Profiler. După aprinderea acesteia, se selectează Run, Profile Running Program. În partea centrală va apărea un grafic care indică curentul consumat, iar în dreapta graficului sunt afişate curentul mediu, puterea medie şi energia totală consumată. După 5 jocuri de X şi 0, aplicaţia afişează un consum de aproximativ 1J, ceea ce înseamnă 200mJ pentru o partidă. Concluzii Principalele avantaje ale plăcii de dezvoltare EFM32™ Zero Gecko Starter Kit sunt: eficienţa energetică a microcontrollerului şi a afişajului, care împreună cu sistemul de monitorizare a energiei consumate fac posibilă utilizarea plăcii în aplicaţii mobile, prin alimentarea de la baterie; uşurinţa cu care pot fi programate microcontrollerul şi afişajul prin intermediul mediului de programare Simplicity Studio conduce la realizarea de aplicaţii mai complexe într-un timp relativ scurt; prezenţa LED-urilor şi a butoanelor pe placă pot uşura semnificativ testarea aplicaţiei curente. Kit-ul poate fi folosit pentru aplicaţii uzuale microcontrollerelor, cum ar fi achiziţia de date (putând afişa pe display diverse grafice), comanda unor dispozitive dar şi pentru diverse jocuri cum ar fi X şi 0 sau Space Invaders (unul din programele demo)
n 34
Codul sursă complet // Biblioteci #include "bsp.h" #include "capsense.h" #include "display.h" #include "em_chip.h" #include "em_cmu.h" #include "em_gpio.h" #include "glib.h" #include <math.h> // Variabile globale GLIB_Context_t gc; GLIB_Rectangle_t gr; int status [9] = {2,2,2,2,2,2,2,2,2}; bool gameover = false; static volatile uint32_t msTicks; /* counts 1ms timeTicks */ struct current { int cell; // Celula curenta int x0; // Simbolul curent: 0 pt 0, 1 pt X } cnt; // Initializare GPIO (General-Purpose Input/Output) static void GpioSetup(void) { CMU_ClockEnable(cmuClock_GPIO, true); // Configurare PC8 GPIO_PinModeSet(gpioPortC, 8, gpioModeInputPull, 1); GPIO_IntConfig(gpioPortC, 8, false, true, true); NVIC_ClearPendingIRQ(GPIO_EVEN_IRQn); NVIC_EnableIRQ(GPIO_EVEN_IRQn); } // Initializari void app_init() { CHIP_Init(); // Initializare dispozitiv EFM32 GpioSetup(); // Initializare porturi GPIO pentru utilizarea butonului PB0 DISPLAY_Init(); // Initializare display DMD_init(0); // Initializare driver display GLIB_contextInit(&gc); // Initializarea variabilei gc CAPSENSE_Init(); // Initializare senzori touch BSP_LedsInit(); // Initializare leduri BSP_LedsSet(2); // Se aprinde ledul stanga (LED1) } // Se deseneaza cele 9 patrate void draw_background() { DMD_writeColor(0,0,255,255,255,16384); gc.foregroundColor=Black; gr.xMin=23; gr.yMin=23; gr.xMax=105; gr.yMax=105; GLIB_drawRect(&gc, &gr); gr.xMin=24; gr.yMin=24; gr.xMax=104; gr.yMax=104; GLIB_drawRect(&gc, &gr); GLIB_drawLineV(&gc,50,25,103); GLIB_drawLineV(&gc,51,25,103); GLIB_drawLineV(&gc,77,25,103); GLIB_drawLineV(&gc,78,25,103); GLIB_drawLineH(&gc,25,50,103); GLIB_drawLineH(&gc,25,51,103); GLIB_drawLineH(&gc,25,77,103); GLIB_drawLineH(&gc,25,78,103); DMD_updateDisplay(); } // Se deseneaza unul din simbolurile X/O // x0 = 1 => se deseneaza X // x0 = 0 => se deseneaza O // cell = casuta in care se deseneaza // temp = 1 => se deseneaza simbolul x mic / o mic // temp = 0 => se deseneaza simbolul X mare / O mare void draw_x0(int x0, int cell, int temp) { int row, col; cell--; if (temp==1) temp=4; else temp=10; row=(int)floor(cell/3); col=(int)(cell-3*floor(cell/3)); if (x0==0) {
EFM32™ GLIB_drawCircle(&gc,col*27+37,row*27+37,temp); DMD_updateDisplay(); } else { GLIB_drawLine(&gc,col*27+37-temp,row*27+37temp,col*27+37+temp,row*27+37+temp); GLIB_drawLine(&gc,col*27+37+temp,row*27+37-temp,col*27+37temp,row*27+37+temp); DMD_updateDisplay(); } } // Se initializeaza variabilele utilizate pentru memorarea starii curente a jocului, // se deseneaza cele 9 patrate si simbolul x mic in celula 1. void game_init() { int i; for (i=0;i<9;i++) status[i]=2; cnt.cell=1; cnt.x0=1; draw_background(); draw_x0(1,1,1); DMD_updateDisplay(); } // Sterge continutul une casute // cell = casuta care se sterge void clear_cell(int cell) { int row,col; cell--; row=(int)floor(cell/3); col=(int)(cell-3*floor(cell/3)); gr.xMin=col*27+37-12; gr.yMin=row*27+37-12; gr.xMax=col*27+37+12; gr.yMax=row*27+37+12; gc.foregroundColor=White; GLIB_drawRectFilled(&gc, &gr); gc.foregroundColor=Black; DMD_updateDisplay(); } // Se verifica daca jocul s-a incheiat // Se returneaza o valoare intreaga intre 0 si 3 astfel // 0: Jucatorul O a castigat // 1: Jucatorul X a castigat // 2: Egalitate (toate casutele sunt ocupate si nici un jucator nu a castigat) // 3: Jocul nu s-a incheiat (cel putin o casuta este libera si nici un jucator nu a castigat) int check_gameover() { int i,ret=4, c=2; if (status[0]==status[1] && status[1]==status[2]) {if (status[0]==0) ret=0; else if (status[0]==1) ret=1;} if (status[3]==status[4] && status[4]==status[5]) {if (status[3]==0) ret=0; else if (status[3]==1) ret=1;} if (status[6]==status[7] && status[7]==status[8]) {if (status[6]==0) ret=0; else if (status[6]==1) ret=1;} if (status[0]==status[3] && status[3]==status[6]) {if (status[0]==0) ret=0; else if (status[0]==1) ret=1;} if (status[1]==status[4] && status[4]==status[7]) {if (status[1]==0) ret=0; else if (status[1]==1) ret=1;} if (status[2]==status[5] && status[5]==status[8]) {if (status[2]==0) ret=0; else if (status[2]==1) ret=1;} if (status[0]==status[4] && status[4]==status[8]) {if (status[0]==0) ret=0; else if (status[0]==1) ret=1;} if (status[2]==status[4] && status[4]==status[6]) {if (status[2]==0) ret=0; else if (status[2]==1) ret=1;} if (ret==4) { for (i=0;i<9;i++) if (status[i]==2) c=3; if (c==3) ret=3; else ret=2; } if (ret!=3) gameover=true; return ret; } // Codul ce se executa la apasarea butonului PB0 void GPIO_EVEN_IRQHandler(void) //Buton dreapta { int gov,i;
Electronica Azi HOBBY • Octombrie, 2014 • Nr. 5 // Intrerupere GPIO_IntClear(1 << 8); clear_cell(cnt.cell); // Stergerea celulei curente draw_x0(cnt.x0,cnt.cell,0); // Redesenarea simbolului dar de dimensiune mare status[cnt.cell-1]=cnt.x0; // Update vector status // Verificare game over gov=check_gameover(); if (gov==0) for(i=1;i<=9;i++) {clear_cell(i); draw_x0(0,i,0);} if (gov==1) for(i=1;i<=9;i++) {clear_cell(i); draw_x0(1,i,0);} if (gov==2) for(i=1;i<=9;i++) {clear_cell(i); draw_x0(0,i,0); draw_x0(1,i,0);} if (gov==3) { if (cnt.x0==1) cnt.x0=0; else if (cnt.x0==0) cnt.x0=1; cnt.cell=1; while(status[cnt.cell-1]!=2) cnt.cell++; draw_x0(cnt.x0,cnt.cell,1); DMD_updateDisplay(); } // Update leduri BSP_LedsSet(cnt.x0+1); if (gov!=3) BSP_LedsSet(3); } void SysTick_Handler(void) { msTicks++; // incrementare contor necesar in Delay() } // Delay static void Delay(uint32_t dlyTicks) { uint32_t curTicks; curTicks = msTicks; while ((msTicks - curTicks) < dlyTicks) ; } // Se citesc butoanele touch // Daca butonul touch din dreapta a fost apasat si cel din stanga nu se muta simbolul X/O spre dreapta // Daca butonul touch din stanga a fost apasat si cel din dreapta nu se muta simbolul X/O spre stanga void touch() { CAPSENSE_Sense(); //Buton dreapta if (CAPSENSE_getPressed(BUTTON1_CHANNEL) && !CAPSENSE_getPressed(BUTTON0_CHANNEL) && !gameover) { clear_cell(cnt.cell); cnt.cell++; if (cnt.cell>9) cnt.cell=1; while(status[cnt.cell-1]!=2){ cnt.cell++; if (cnt.cell>9) cnt.cell=1; } draw_x0(cnt.x0,cnt.cell,1); } //Buton stanga else if (CAPSENSE_getPressed(BUTTON0_CHANNEL) && !CAPSENSE_getPressed(BUTTON1_CHANNEL) && !gameover) { clear_cell(cnt.cell); cnt.cell--; if (cnt.cell<1) cnt.cell=9; while(status[cnt.cell-1]!=2){ cnt.cell--; if (cnt.cell<1) cnt.cell=9; } draw_x0(cnt.x0,cnt.cell,1); } } // Programul principal int main() { app_init(); game_init(); // Setare timer pentru intrerupere la fiecare milisecunda if (SysTick_Config(SystemCoreClockGet()/1000)) while (1); // Bucla infinita while (1) { Delay(150); touch(); } return 0; }
35