This shows you the differences between two versions of the page.
iothings:laboratoare:lab5 [2021/10/12 19:16] 127.0.0.1 external edit |
iothings:laboratoare:lab5 [2022/04/06 19:35] (current) cosmin.chenaru [Exerciții] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Protocoale de transmisie ====== | + | ===== Laborator 05. MicroPython pe ESP32 ===== |
- | Pentru lucrarea curentă de laborator veți folosi biblioteca SparrowTransfer ce folosește clasele definite în laboratorul anterior pentru transmisia radio. Clasa implementează un protocol peste functiile de transmisie și recepție obișnuite și poate fi descărcată de {{:iothings::sparrowradio.zip|aici}}. | + | În laboratorul de astăzi vom instala MycroPython pe plăcuța ESP32 pentru a folosi funcționalitatea acesteia cu ajutorul limbajului de programare Python. |
- | Instalarea bibliotecii este foarte facilă, trebuie doar să dezarhivați arhiva în Arduino\libraries | + | ==== 1. Instalarea aplicației Thonny ==== |
- | Mai jos aveți un exemplu care vă permite să trimiteți și să recepționați pachete de date de pe interfața radio. Pentru aceasta aveți nevoie de două noduri: primul rulează codul care transmite (Tx) și al doilea recepționează (Rx). | + | Vom folosi [[https://randomnerdtutorials.com/getting-started-thonny-micropython-python-ide-esp32-esp8266/|acest tutorial]] pentru a instala tool-ul Thonny și pentru a scrie imaginea de MycroPython pe plăcuța ESP32. |
- | Codul pentru Transmitter: | + | O scurtă introducere cu cele mai folosite construcții în Python găsim [[https://randomnerdtutorials.com/micropython-programming-basics-esp32-esp8266|aici]]. |
- | <code C> | + | |
- | #include "SparrowTransfer.h" | + | |
- | + | ||
- | //create object | + | |
- | SparrowTransfer ST; | + | |
- | + | ||
- | struct SEND_DATA_STRUCTURE{ | + | |
- | //put your variable definitions here for the data you want to send | + | |
- | //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO | + | |
- | uint16_t data; | + | |
- | }; | + | |
- | //give a name to the group of data | + | ==== 2. Documentația MicroPython pentru ESP32 ==== |
- | SEND_DATA_STRUCTURE mydata; | + | |
- | void blinkLED() //blinks the LED | + | MicroPython este o implementare optimizată a limbajul de programare Python3, destinată microcontroller-elor cu puține resurse disponibile, ce conține un mic subset din funcționalitatea standard a limbajului. |
- | { | + | |
- | digitalWrite(8,LOW); | + | |
- | delay(20); | + | |
- | digitalWrite(8,HIGH); | + | |
- | } | + | |
- | + | ||
- | void setup(){ | + | |
- | Serial.begin(9600); | + | |
- | + | ||
- | //start the library, pass in the data details | + | |
- | ST.begin(details(mydata)); | + | |
- | + | ||
- | pinMode(8, OUTPUT); | + | |
- | digitalWrite(8, LOW); | + | |
- | + | ||
- | mydata.data = 0; | + | |
- | + | ||
- | } | + | |
- | void loop(){ | + | Documentația pentru ESP32 o avem [[https://docs.micropython.org/en/latest/esp32/quickref.html|aici]]. |
- | + | ==== Exerciții ==== | |
- | mydata.data++; | + | |
- | + | ||
- | //send the data | + | |
- | ST.sendData(); | + | |
- | blinkLED(); | + | |
- | delay(1000); | + | === Ex. 1 - WiFi Scan === |
- | } | + | |
+ | Scanați retelele WiFi locale folosind următorul program: | ||
+ | |||
+ | <code> | ||
+ | import network | ||
+ | |||
+ | sta = network.WLAN(network.STA_IF) | ||
+ | sta.active(True) | ||
+ | |||
+ | nets = sta.scan() | ||
+ | for net in nets: | ||
+ | print(net[0]) | ||
</code> | </code> | ||
- | Codul pentru Receiver: | + | Un mic exemplu cu partea de retea găsim [[https://docs.micropython.org/en/latest/library/network.WLAN.html|aici]] |
- | <code C> | + | === Ex. 2 - Web Server === |
- | #include "SparrowTransfer.h" | + | |
- | + | ||
- | //create object | + | |
- | SparrowTransfer ST; | + | |
- | + | ||
- | struct RECEIVE_DATA_STRUCTURE{ | + | |
- | //put your variable definitions here for the data you want to send | + | |
- | //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO | + | |
- | uint16_t data; | + | |
- | + | ||
- | }; | + | |
- | //give a name to the group of data | + | |
- | RECEIVE_DATA_STRUCTURE mydata; | + | |
- | uint16_t old_index, received_index, lost; | + | Urmăriți [[https://randomnerdtutorials.com/esp32-esp8266-micropython-web-server|acest]] tutorial pentru a porni un server web. Testați conexiunea din browser și aprindeți led-ul din pagina web. |
- | void setup(){ | + | <note> |
- | Serial.begin(9600); | + | Tutorialul din link-ul de mai sus folosește aplicația uPyCraft, dar noi vom folosi tot aplicația Tonny. |
- | + | </note> | |
- | //start the library, pass in the data details | + | |
- | ST.begin(details(mydata)); | + | |
- | + | ||
- | pinMode(11, OUTPUT); | + | |
- | digitalWrite(11, HIGH); | + | |
- | + | ||
- | } | + | |
- | void blinkLED() | + | {{:iothings:laboratoare:lab5-web-server-2.png?300|}} |
- | { | + | |
- | digitalWrite(11, LOW); | + | |
- | delay(20); | + | |
- | digitalWrite(11, HIGH); | + | |
- | } | + | |
- | void loop(){ | + | === Ex. 3 - Simularea unei intreruperi === |
- | //check and see if a data packet has come in. | + | |
- | if(ST.receiveData() == SUCCESS){ | + | |
- | + | ||
- | blinkLED(); | + | |
- | + | ||
- | received_index++; | + | |
- | + | ||
- | if(old_index != 0) | + | |
- | lost += mydata.data - old_index - 1; | + | |
- | + | ||
- | Serial.print("Frame arrived: "); | + | |
- | Serial.print(mydata.data); | + | |
- | Serial.print(" "); | + | |
- | Serial.print(", lost: "); | + | |
- | Serial.print(lost); | + | |
- | Serial.print(", loss: "); | + | |
- | Serial.print(lost*100.0/(lost+received_index), 3); | + | |
- | Serial.println("%"); | + | |
- | + | ||
- | old_index = mydata.data; | + | |
- | } | + | |
- | + | ||
- | //optional delay, to disable flooding serial interface | + | |
- | //delay(250); | + | |
- | } | + | |
+ | Folosiți programul de mai jos pentru a "asculta" interuperi pe PIN-ul 23. | ||
+ | |||
+ | <code> | ||
+ | from machine import Pin | ||
+ | from time import sleep | ||
+ | |||
+ | shortCircuit = False | ||
+ | |||
+ | def handle_interrupt(pin): | ||
+ | global shortCircuit | ||
+ | shortCircuit = True | ||
+ | print("Interrupt") | ||
+ | |||
+ | led = Pin(2, Pin.OUT) | ||
+ | |||
+ | # Setting a ping on 3.3 volts | ||
+ | highVoltagePin = Pin(22, Pin.OUT) | ||
+ | highVoltagePin.value(1) | ||
+ | |||
+ | # This pin should receive 3.3 volts to trigger an interrupt | ||
+ | pir = Pin(23, Pin.IN) | ||
+ | |||
+ | pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt) | ||
+ | |||
+ | while True: | ||
+ | if shortCircuit: | ||
+ | led.value(1) | ||
+ | sleep(1) | ||
+ | led.value(0) | ||
+ | print('Interrupt stopped!') | ||
+ | shortCircuit = False | ||
</code> | </code> | ||
- | <note>**Task 0:** Rulați exemplele de mai sus.</note> | + | Din cauza lipsei unui device fizic care să livreze o întrerupere, vom pune PIN-ul 22 pe 1 logic (3.3 volți) iar cu ajutorul unui pix vom scurt-circuita PIN-ul 23. |
- | <note>**Task 1:** Modificați structura de date pentru a conține urmatoarele câmpuri: adresa nodului care face transmisia (un octet), sequence number pentru transmisie (doi octeți) și payload (32 octeți). Trimiteți mesaje și afișati-le pe serială.</note> | + | |
- | <note>**Task 2:** Modificați biblioteca pentru a permite transmisia bidirecțională de date.</note> | + | {{:iothings:laboratoare:lab5-scurt-circuit.jpg?300|}} |
+ | |||
+ | Dacă nu merge cu un pix, puteți încerca cu partea de grafit dintr-un creion mecanic. | ||
+ | |||
+ | {{:iothings:laboratoare:lab5-scurt-circuit-grafit.jpg|}} | ||
+ | |||
+ | Sau in cel mai ne-ingineresc caz, cu o furculiță :). | ||
+ | ===== Resurse ===== | ||
+ | * https://randomnerdtutorials.com/getting-started-thonny-micropython-python-ide-esp32-esp8266/ | ||
+ | * https://randomnerdtutorials.com/micropython-programming-basics-esp32-esp8266/ |