This shows you the differences between two versions of the page.
sde:laboratoare:02_microbit_ro [2021/02/14 14:23] alexandra.state2607 [Set up] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 02 - Set up BBC micro:bit ====== | ||
- | |||
- | ==== Resurse ==== | ||
- | [[https://microbit-micropython.readthedocs.io/en/v2-docs/| Documentație BBC micro:bit MicroPython]] | ||
- | |||
- | <hidden> | ||
- | Mai trebuie explicat cum sa folosesca simulatorul de la https://github.com/CodeGuild-co/PythonEditor | ||
- | |||
- | Pune si un link catre toata documentatia https://microbit-micropython.readthedocs.io/en/v2-docs/. Poti face asta intr-o sectiune de | ||
- | resurse la inceput. | ||
- | |||
- | Mai scrie ca vom folosi doua variante de programare: MicroPython (asta de aici) si MakeCode (Python facut de Microsoft) | ||
- | </hidden> | ||
- | |||
- | ===== Obiectivele laboratorului ===== | ||
- | * Conectarea micro:bit-ului la PC | ||
- | * Încărcarea programelor pe micro:bit | ||
- | |||
- | |||
- | |||
- | |||
- | ===== Prezentare BBC micro:bit V2===== | ||
- | BBC micro:bit este o placă de dezvoltare care folosește un **microcontroller**. Scopul acestui device este de a oferi studenților un bun start pentru a începe devoltarea competențelor în programare. Micro:bit V2 este un ARM Cortex M4, mic, ușor de utilizat. Este prevăzut cu 25 de LED-uri, pe care se pot afișa mesaje sau imagini, cu acclerometru pentru a detecta mișcarile, busolă, bluetooth, două butoane prin care se poate intercționa cu user-ul si alți senzori pe care-i vom descoperi pe parcursul laboratorului. | ||
- | |||
- | |||
- | Programele se scriu pe PC și sunt încărcate pe BBC micro:bit, acestea rămân în memoria [[https://www.techopedia.com/definition/24481/flash-memory#:~:text=Flash%20memory%20is%20a%20non,cameras%20and%20solid%2Dstate%20drives.|flash]] și se executa atunci când microcontroller-ul este alimentat. | ||
- | |||
- | Ce este un microcontroller? | ||
- | Microcontroller-ul este un calculator micșorat într-un singur chip, care poate rula câte un program o dată si consuma cu mult mai puțină decât un laptop sau un calculator. În plus, acestea sunt bune în a controla și a detecta semnalele electrice prin intermediul pinilor. | ||
- | Acestea se găsesc peste tot, de exemplu ceasul digital, cuptorul cu microunde, mouse-ul etc. sunt controlate de microcontrollere. | ||
- | Pentru mai multe informații despre acestea poți accesa acest [[https://www.allaboutcircuits.com/technical-articles/what-is-a-microcontroller-introduction-component-characteristics-component/|link]]. | ||
- | |||
- | |||
- | {{ :sde:laboratoare:microbitv2.png?600 |}} | ||
- | |||
- | ====== Set up ====== | ||
- | |||
- | Pentru desfășurarea laboratoarelor, vom folosi MicroPython pentru a scrie programe pe micro:bit. Este un limbaj de programare creat pentru a lucra cu microcontrollere. Acesta este un subset al limbajului de programare numit Python. | ||
- | |||
- | Dacă ai BBC micro:bit V2 urmează instrucțiunile de la secțiunea[[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#connectarea_microbit-ului_la_pc| "Conectarea micro:bit-ului la PC"]]. | ||
- | |||
- | Dacă nu ai un BBC micro:bit urmează instrucțiunile de mai jos pentru a folosi simulatorul. | ||
- | |||
- | ====Utilizarea simulatorului de Micropython==== | ||
- | |||
- | Pentru desfășurarea laboratoarelor se poate folosi și simulatorul de MicroPython. Pentru a-l putea utiliza trebuie să tastați urmatoarele comenzi în terminal, dacă folosiți Windows tastați comenzile în cmd. | ||
- | |||
- | Dacă nu aveți Python3 instalat sau nu sunteți siguri că-l aveți urmați pașii din acest [[https://docs.google.com/document/d/1hnD90b3IgkQVk3QCyn5AMh20U_8qzuxKxSSf-Mxnu5Y/edit?usp=sharing|document]]. | ||
- | |||
- | Urmatorul pas este să tastați urmatoarele comenzi: | ||
- | |||
- | <code> | ||
- | git clone https://github.com/ducklord420/PythonEditor.git | ||
- | cd PythonEditor | ||
- | git submodule update --init --recursive | ||
- | py -m http.server --bind 0.0.0.0 | ||
- | </code> | ||
- | |||
- | Pentru a accesa simulatorul daca folosiți Linux sau MacOS scrieți comanda: | ||
- | <code> | ||
- | $ firefox editor.html | ||
- | </code> | ||
- | Dacă folosiți Windows fie puteți folosi comanda anterioară, fie intrați in folder-ul "PythonEditor" și faceți click pe "editor.html". | ||
- | |||
- | Pentru a simula codul faceți click pe "Sim". | ||
- | {{ :sde:laboratoare:sim.png?250 |}} | ||
- | |||
- | |||
- | ===== Connectarea micro:bit-ului la PC ===== | ||
- | |||
- | Primul pas pentru a conecta microcontroller-ul la calculator este să ne folosim de cablul micro USB din kit. Introduceți capatul USB tip B în partea de sus a micro:bit-ului, iar celălalt capăt în calculator. | ||
- | |||
- | ===== Scrierea primului program în editorul de cod online ===== | ||
- | |||
- | Pentru desfășurarea acestui laborator vom scrie programele într-un editor de cod online, numit [[https://python.microbit.org/v/2 | ||
- | |Makecode]] creat de Microsoft. | ||
- | |||
- | ==== Exemplul 1 ==== | ||
- | |||
- | Primul program pe care îl vom scrie va fi afișarea textului “Hello” pe cele 25 LED-uri, urmat de abrevierea “SdE”, care va fi stocat într-o variabilă. | ||
- | |||
- | <code python> | ||
- | from microbit import display #import "diplay" from microbit library | ||
- | |||
- | name = "SdE" #declaration of a variable with a String | ||
- | |||
- | #all the code that is idented under the loop belongs to it | ||
- | while True: #infinite looop | ||
- | # "display" is an object that refers to the LEDs, this method allows us to control them | ||
- | display.scroll("HELLO" + " " + name) # concatenation of Strings | ||
- | | ||
- | </code> | ||
- | |||
- | |||
- | ===== Încărcarea pe micro:bit ===== | ||
- | |||
- | Transferul de program se numește flashing deoarece programul este copiat în memoria flash a micro:bit-ului. | ||
- | |||
- | ==== Metoda 1: Incarcarea fisierului .hex pe micr:obit ==== | ||
- | |||
- | După conectarea microcontroller-ului în calculator va aparea “MICROBIT” ca un stick de memorie. | ||
- | |||
- | Următorul pas este sa salvam programul din editorul de cod ca fișier .hex. | ||
- | Se apasă pe butonul "Load/Save", apoi acesta downloadează făcând click pe “Download Project Hex”, așa cum este reprezentat în imaginile de mai jos: | ||
- | |||
- | {{ :sde:laboratoare:load.png?250 | }} | ||
- | {{ :sde:laboratoare:downloadhex.png?250 |}} | ||
- | |||
- | Ultimul pas pentru a încarca programul pe micro:bit este să deschideți folder-ul unde s-a salvat fisierul .hex downloadat și să-l copiați în “MICROBIT”. Programul se va compila automat pe microcontroller. | ||
- | |||
- | ==== Metoda 2: Direct flash ==== | ||
- | |||
- | Pentru această metodă este suficient să se utilizeze doar editorul de cod online dintr-un browser **Chrome** sau **Edge**. | ||
- | Primul pas este să se conecteze placuța apăsând pe butonul “Connect” din meniul editorului de cod. | ||
- | |||
- | {{ :sde:laboratoare:connect_editor.png?250 | }} | ||
- | |||
- | Va apărea o fereastra similara cu cea de jos. Tot ce rămane de facut este să faceți click pe placuta “BBCmicrobit” pe care editorul o dectează, apoi click pe butonul “Connect”. | ||
- | |||
- | {{ : sde:laboratoare:connect.png?250 | }} | ||
- | |||
- | Ultimul pas pentru a flash-ui programul este să apasați pe butonul “Flash”. Este posibil să așteptați câteva secunde pana când programul va fi încarcat pe placută. | ||
- | |||
- | {{ :sde:laboratoare:flash.png?250 | }} | ||
- | |||
- | |||
- | ===== Input devices sau butoane ===== | ||
- | |||
- | În schema microcontroller-ului prezentată anterior, se poate observa faptul că [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#prezentare_bbc_microbit|micro:bit-ul]] are trei butoane. | ||
- | |||
- | Cel de pe spate este pentru **reset**. Dacă acest buton este apăsat timp de cinci secunde microcontroller-ul va opri rularea programului care este încarcat. Totodată, dacă butonul de reset este apăsat scurt programul care este flash-uit pe placuță se va reseta. | ||
- | |||
- | Pe partea din față se pot observa două butoane A și B, care pot fi accesate în cod astfel //button_a// și //button_b//. Acestea au o metoda //is_pressed()//, care va returna //True// dacă butonul este apăsat, în caz contrar metoda va returna //False//. | ||
- | |||
- | În acest exemplu vom folosi condiționalul “if” sau “if statement”. | ||
- | |||
- | <code python> | ||
- | # Simple decision | ||
- | a = 33 | ||
- | b = 200 | ||
- | if b > a: | ||
- | print("b is greater than a") | ||
- | </code> | ||
- | |||
- | <code python> | ||
- | # Use "elif" to add an additional condition | ||
- | a = 33 | ||
- | b = 33 | ||
- | if b > a: | ||
- | print("b is greater than a") | ||
- | elif a == b: | ||
- | print("a and b are equal") | ||
- | </code> | ||
- | |||
- | <code python> | ||
- | # The "else" keyword takes anything that has not been included before | ||
- | a = 200 | ||
- | b = 33 | ||
- | if b > a: | ||
- | print("b is greater than a") | ||
- | elif a == b: | ||
- | print("a and b are equal") | ||
- | else: | ||
- | print("a is greater than b") | ||
- | </code> | ||
- | |||
- | <code python> | ||
- | # Else without elif | ||
- | a = 200 | ||
- | b = 33 | ||
- | if b > a: | ||
- | print("b is greater than a") | ||
- | else: | ||
- | print("b is not greater than a") | ||
- | </code> | ||
- | |||
- | ==== Exemplul 2 ==== | ||
- | |||
- | Programul urmator va afișa pe display litera ”A” daca butonul A este apăsat, respectiv litera “B” daca butonul B este apăsat. Dacă niciun buton nu este apăsat va afișa pe dislapay o imagine, care reprezintă un emoticon confuz. | ||
- | |||
- | <code python> | ||
- | from microbit import display, button_a, button_b, Image | ||
- | |||
- | while True: #infinite looop | ||
- | if button_a.is_pressed(): #check if the button A is pressed | ||
- | display.scroll("A") | ||
- | elif button_b.is_pressed(): #check if the button B is pressed | ||
- | display.scroll("B") | ||
- | else: | ||
- | display.show(Image.CONFUSED) | ||
- | </code> | ||
- | |||
- | |||
- | ===== Accelerometru. Gesturi ===== | ||
- | |||
- | Micro:bit poate să recunoască gesturi precum înclinare sau scuturare. | ||
- | Pe spatele microntroler-ului, în partea de jos, se poate vedea un chip mic, care reprezintă un **accelerometru**, numit [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#prezentare_bbc_microbit|"Compass and Accelerometer”]]. Acesta poate măsura acclerarea în toate cele trei dimensiuni, anume accelerarea stânga-dreapta, accelerarea față-spate și accelerarea sus-jos. | ||
- | |||
- | Ce este un accelreometru? Un accelerometru are rolul de a măsura și a analiza accelerațiile liniare și unghiulare, de exemplu, masinile moderne folosesc un accelerometru care detectează un accident pentru a declansa airbag-urile. | ||
- | |||
- | ==== Exemplul 3 ==== | ||
- | În acest exemplu vom explora acclerometrul afișând pe display-ul micr:obit-ului un pătrat dacă acesta este înclinat către stânga, un tringhi dacă acesta este înclinat către dreapta și un diamant dacă este pus cu fața în sus. | ||
- | |||
- | <code python> | ||
- | from microbit import display, accelerometer, Image | ||
- | |||
- | while True: | ||
- | if accelerometer.current_gesture() == "left": | ||
- | display.show(Image.SQUARE) | ||
- | elif accelerometer.current_gesture() == "right": | ||
- | display.show(Image.TRIANGLE) | ||
- | elif accelerometer.current_gesture() == "face up": | ||
- | display.show(Image.DIAMOND) | ||
- | else: | ||
- | display.clear() | ||
- | </code> | ||
- | |||
- | ===== Direcții. Busolă ===== | ||
- | |||
- | Senzorul pentru [[https://www.youtube.com/watch?v=a3P6LWwPBqM&feature=emb_logo|busolă]] deceteaza câmpuri magnetice ale Pământului și este amplasat tot pe spatele micro:bit-ului, precum acclerometrul. Acesta este folosit pentru a decta dacă un magnet se afla prin preajma micro:bit-ului sau pentru navigare, poate arata direcțiile Nord, Sud, Est și Vest. | ||
- | |||
- | ==== Exemplul 4 ==== | ||
- | |||
- | În acest exemplu vom vedea cum micr:obit-ul poate fi folosit ca o busolă. __Atenție__: Imediat după ce ați rulat codul trebuie să așteptați puțin pană se afisează textul care spune “TITLING FILL”, iar apoi pe rând se va afișa căte un LED; trebuie să înclinați micro:bit-ul până display-ul se va lumina complet. | ||
- | |||
- | <code python> | ||
- | from microbit import display, compass | ||
- | compass.calibrate() | ||
- | |||
- | while True: | ||
- | degrees = compass.heading() | ||
- | if degrees < 45 or degrees > 315: | ||
- | display.show('N') | ||
- | elif degrees < 135: | ||
- | display.show("E") | ||
- | elif degrees < 225: | ||
- | display.show("S") | ||
- | elif degrees < 315: | ||
- | display.show("W") | ||
- | else: | ||
- | display.show(' ') | ||
- | </code> | ||
- | |||
- | ===== Microfonul și Speaker-ul ===== | ||
- | |||
- | BBC micro:bit V2 are fixat pe spate microfonul, iar pe partea din față se observa indicatorul, care lumineaza atunci cand acesta aste accesat. Acesta poate măsura nivelul de sunet din jurul plăcuței și poate reacționa la sunete înalte sau mai joase. | ||
- | |||
- | Tot in partea din spate exista pe [[https://www.allaboutcircuits.com/technical-articles/what-is-a-printed-circuit-board-pcb/|PCB]] un difuzor(speaker) magnetic din care rezultă ca output sunetul. | ||
- | |||
- | |||
- | ==== Exemplul 5 ==== | ||
- | Acest exemplu simulează o lumânare. După importarea bibliotecilor se declară un contor numit //lit//, care inițial are valoarea True. Apoi se verifica dacă a fost înregistrat un sunet puternic folosind funcția //was_event()//, care totodată șterge istoricul evenimentelor sonore înainte de a returna. Dacă cea din urma returnează True se schimba valoare contorului, anume valoarea lui //lit//. În cazul în care lumânarea este aprinsă se va afișa pe display o imagine care o simuleaza o lumânare și care va face flacăra să licarească la o poziție random de la 1 la 3. | ||
- | |||
- | Pentru a crea **imaginea** este necesar să dăm valori fiecarui pixel de pe display. Valoarea 0 însemna ca led-ul respectiv este oprit, nu luminează. Valorile între 1 și 9(valoarea maximă) arată nivelul de luminozitate al pixelului. Pentru a reprezenta o linie valorile sunt închise în //""// și se termină cu //:// . În acest exemplu, se observă faptul că fiecare linie din //Image()// reprezintă poziționarea led-urilor de pe display-ul fizic al mico:bit-ului. Prin urmare, analizând prima linie, care sugerează flacăra, toate led-urile sunt oprite cu exceptia celui de pe pozitia 3, care are pixel-ul setat la luminozitate maximă. Restul liniilor sunt asemenea pentru a forma restul lumânării, pozițiile 1 și 5, au pixel-ul setat la valoarea 0, iar restul la valoarea 9. | ||
- | |||
- | Pentru a crea **efectul de licărire** se folosește funcția //set_pixel()//, caruia i se dau ca parametrii linia, coloana și valoarea pixelului. | ||
- | |||
- | <code python> | ||
- | from microbit import display, microphone, SoundEvent, Image, sleep | ||
- | import random | ||
- | |||
- | lit = True | ||
- | |||
- | while True: | ||
- | if microphone.was_event(SoundEvent.LOUD): #check if a loud sound was | ||
- | lit = not lit | ||
- | sleep(500) | ||
- | if lit: | ||
- | display.show(Image( #candle image | ||
- | "00900:" | ||
- | "09990:" | ||
- | "09990:" | ||
- | "09990:" | ||
- | "09990")) | ||
- | sleep(150) | ||
- | flicker = random.randint(1, 3) | ||
- | if flicker != 2: | ||
- | display.set_pixel(2,0,0) | ||
- | display.set_pixel(flicker,0,9) | ||
- | sleep(150) | ||
- | else: | ||
- | display.clear() | ||
- | </code> | ||
- | |||
- | |||
- | ===== Senzorul de atingere ===== | ||
- | |||
- | Micro:bit-ul are senzorul de atingere amplasat pe [[https://www.youtube.com/watch?v=spFD3SxxxHQ&feature=emb_logo|logo]], care poate fi folosit ca și input. Acesta poate interacționa cu user-ul precum un buton. | ||
- | |||
- | |||
- | |||
- | ==== Exemplul 6 ==== | ||
- | În acest exemplu se verifică dacă senzorul este atins atunci, se va afișa mesajul “Hello” altfel, display-ul va fi neluminat. | ||
- | |||
- | <code python> | ||
- | from microbit import display, pin_logo | ||
- | |||
- | while True: | ||
- | if pin_logo.is_touched(): | ||
- | display.scroll("Hello") | ||
- | else: | ||
- | display.clear() #display stays empty | ||
- | </code> | ||
- | |||
- | ===== Senzorul de temperatura și de lumină ===== | ||
- | |||
- | Senzorul de [[https://youtu.be/mrHn8eZ9eqg|temperatură]] înregistrează cu aproximație temperatura din jurul micr:obit-ului, iar senzorul de [[https://youtu.be/ii0U_FMr-Z4|lumină]] poate înregistra nivelul de lumină prin intermediul LED-urilor. | ||
- | |||
- | ==== Exemplul 7 ==== | ||
- | |||
- | Exemplul urmator afisează temepratura dacă butonul A este apăsat, iar dacă deasupra LED-urilor micro:bit-ul înregistrează o lumină puternică va afișa pe display un soare. Pentru a testa senzorul de lumină, în acest exemplu puteți îndrepta lumina de la lanterna telefonului către plăcuță. | ||
- | |||
- | <code python> | ||
- | from microbit import display, button_a, Image, temperature | ||
- | |||
- | while True: | ||
- | if button_a.was_pressed(): | ||
- | display.scroll(temperature()) #displat the temperature | ||
- | elif display.read_light_level() > 100: #check the light level | ||
- | display.show(Image( #sun image | ||
- | "90909:" | ||
- | "09990:" | ||
- | "99999:" | ||
- | "09990:" | ||
- | "90909")) | ||
- | else: | ||
- | display.clear() | ||
- | </code> | ||
- | |||
- | ===== Exerciții ===== | ||
- | |||
- | - Scrieți un program care la apăsarea simultană a butoanelor A și B va afișa o imagine care reprezintă "DA", iar dacă niciun buton nu este apăsat va apărea o imagine care reprezintă "NU". Pentru imagini vezi [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/images.html|documentația]]. | ||
- | - Modificați exercițiul anterior astfel încât la apăsarea butonului A se va afișa litera "A", iar la apăsarea butonului B se va afișa litera "B". | ||
- | - Scrieți un program care afișeaza pe display numărul curent de scuturări. Când micro bit-ul înregistrează 9 scuturări pe display va apărea o imagine. | ||
- | - Creați un program care înregistrează numarul de înclinări către stanga și către dreapta. De fiecare data când micro:bit-ul este îndreptat în una dintre cele două părți să se afișeze numărul curent de înclinări către partea respectivă. //Hint//: folosiți metoda [[https://microbit-micropython.readthedocs.io/en/v1.0.1/microbit.html#microbit.sleep|sleep]] | ||
- | - Scrieți un program care la atingerea logo-ului(senzorul de atingere) să faca toggle între o imagine cu diamant și imagine cu diamant mic. | ||
- | - Să se scrie un program, care la înregistrarea unui sunet va afișa pe display o imagine și va rosti cu ajutorul speech-ului "ON". Dacă nu este înregistrat niciun sunet display-ul rămâne gol. Afișati nivelul de sunet la o acțiune la alegere(apăsare unui buton, atingerea logo-ului, înclinare etc.) | ||
- | - Modificați codul de la [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#senzorul_de_temperatura_si_de_lumina|exemplul 7]] astfel încât micro:bit-ul detectează lumină să folosească speaker-ul pentru a reda muzica JUMP_UP, iar când lumina este oprită să redea muzica JUMP_DOWN. Pentru acesarea bibliotecii "music" vezi [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/music.html|documentația]]. | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||