This shows you the differences between two versions of the page.
iothings:laboratoare:lab4 [2021/10/12 19:16] 127.0.0.1 external edit |
iothings:laboratoare:lab4 [2024/07/13 10:51] (current) robert_ionut.alexa |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Sparrow WSN - Transmisia radio ====== | + | ===== Laborator 04. Interfețele SPI și I2C ===== |
- | Pentru a folosi transceiver-ul radio cu care sunt dotate nodurile senzoriale, vom utiliza o bibliotecă scrisă pentru Arduino ce ne va smplifica foarte mult codul. Această bibliotecă se numește ZigduinoRadio și poate fi descărcată de {{:iothings::zigduinoradio_201111130010.zip|aici}}. | + | În laboratorul de astăzi vom lucra cu două interfețe foarte des intâlnite în domeniul IoT, mai exact interfața SPI și interfața I2C. |
- | Instalarea bibliotecii este foarte facilă, trebuie doar să dezarhivați arhiva în //Arduino\libraries// | + | ==== SPI ==== |
- | Mai jos aveți un exemplu care vă permite să trimiteți și să recepționați date de pe interfața radio. | + | Interfața SPI (Serial Peripheral Interface) este o interfața serială dezvoltată in anul 1979 de către Motorola. |
- | <code C> | + | {{:iothings:laboratoare:lab4-spi_three_slaves.png|}} |
- | /* | + | |
- | Run this sketch on two Zigduinos, open the serial monitor at 9600 baud, and type in stuff | + | Interfața SPI folosește patru semnale (conexiuni): |
- | Watch the Rx Zigduino output what you've input into the serial port of the Tx Zigduino | + | |
- | */ | + | * SCLK: Serial Clock |
+ | * MOSI: Master Out Slave In | ||
+ | * MISO: Master In Slave Out | ||
+ | * CS /SS: Chip/Slave Select | ||
- | #include <ZigduinoRadio.h> | + | {{:iothings:laboratoare:lab4-spi-timing.png|}} |
- | void setup() | + | Cel mai mare avantaj al conexiunii SPI este comunicația full-duplex, dar un dezavantaj este faptul că necesita 4 fire/pini către periferice, plus incă un fir/pin pentru fiecare periferic adăugat. |
- | { | + | |
- | ZigduinoRadio.begin(11); | + | |
- | Serial.begin(9600); | + | |
- | + | ||
- | ZigduinoRadio.attachError(errHandle); | + | |
- | ZigduinoRadio.attachTxDone(onXmitDone); | + | |
- | } | + | |
- | void loop() | + | ==== I2C ==== |
- | { | + | |
- | if (Serial.available()) | + | |
- | { | + | |
- | ZigduinoRadio.beginTransmission(); | + | |
- | + | ||
- | Serial.println(); | + | |
- | Serial.print("Tx: "); | + | |
- | + | ||
- | while(Serial.available()) | + | |
- | { | + | |
- | char c = Serial.read(); | + | |
- | Serial.write(c); | + | |
- | ZigduinoRadio.write(c); | + | |
- | } | + | |
- | + | ||
- | Serial.println(); | + | |
- | + | ||
- | ZigduinoRadio.endTransmission(); | + | |
- | } | + | |
- | + | ||
- | if (ZigduinoRadio.available()) | + | |
- | { | + | |
- | Serial.println(); | + | |
- | Serial.print("Rx: "); | + | |
- | + | ||
- | while(ZigduinoRadio.available()) | + | |
- | Serial.write(ZigduinoRadio.read()); | + | |
- | + | ||
- | Serial.println(); | + | |
- | Serial.print("LQI: "); | + | |
- | Serial.print(ZigduinoRadio.getLqi(), 10); | + | |
- | Serial.print(", RSSI: "); | + | |
- | Serial.print(ZigduinoRadio.getLastRssi(), 10); | + | |
- | Serial.print(" dBm, ED: "); | + | |
- | Serial.print(ZigduinoRadio.getLastEd(), 10); | + | |
- | Serial.println("dBm"); | + | |
- | } | + | |
- | + | ||
- | + | ||
- | delay(1000); | + | |
- | } | + | |
- | void errHandle(radio_error_t err) | + | Interfața I2C (Inter-Integrated Circuit) este tot o interfața serială, dezvoltată în anul 1982 de către Philips Semiconductor, ce permite conectarea perifericelor folosind doar două fire/pini. |
- | { | + | |
- | Serial.println(); | + | |
- | Serial.print("Error: "); | + | |
- | Serial.print((uint8_t)err, 10); | + | |
- | Serial.println(); | + | |
- | } | + | |
- | void onXmitDone(radio_tx_done_t x) | + | {{:iothings:laboratoare:lab4-i2c-slaves.png|}} |
- | { | + | |
- | Serial.println(); | + | |
- | Serial.print("TxDone: "); | + | |
- | Serial.print((uint8_t)x, 10); | + | |
- | Serial.println(); | + | |
- | } | + | |
- | </code> | + | |
- | <note>**Task 0:** Rulați exemplul de mai sus și adăugați un identificator unic fiecărui nod (de ex. numele vostru).</note> | + | Marele avantaj este numărul scăzut de conexiuni, indiferent de câte periferice sunt inter-conectate, dar comunicația este half-duplex. |
- | <note>**Task 1:** Proiectați un protocol de transmisie simplu pentru pachete în rețea. Fiecare pachet va fi de lungime fixă (39 octeți), primul octet va fi adresa nodului care face transmisia, următorii doi octeți vor codifica un sequence number pentru transmisie, urmează 32 de biți pentru payload și 4 octeți la final pentru CRC. Pentru CRC-32 puteți să folosiți implementarea de [[http://excamera.com/sphinx/article-crc.html|aici]] | + | {{:iothings:laboratoare:lab4-i2c-bitstream.png?700|}} |
- | </note> | + | |
- | {{ ::payload.png |}} | + | ==== Exerciții ==== |
- | <note>**Task 2:** Folosind protocolul de mai sus și codul din laboratorul trecut, trimiteți datele de la senzori periodic prin radio. Dacă reușiti, veți putea vedea toate datele de la toti ceilalti senzori (inclusiv ale senzorilor vostri). Datele de la senzori vor fi codificate în payload-ul pachetelor de rețea în perechi de tipul: <sensor_id><sensor_value>, unde sensor_id are 1 octet iar sensor_value are 2 octeți lungime. Sensor_id poate avea următoarele valori: 0-temperatură, 1-umiditate, 2-luminozitate, 3-tensiune baterie. </note> | + | |
- | <note>**Task 3:** Scrieți un sketch Processing care să vă afișeze grafic toate datele de la toți senzorii conectați </note> | + | === Ex. 1 === |
+ | |||
+ | Vom folosi simulatorul Wokwi pentru a converti un proiect deja existent, de la o plăcuța Arduino Uno la ESP32. Vom folosi ca referință [[https://wokwi.com/projects/289186888566178317|acest proiect]], de la care vom copia codul (disponibil și [[lab4-cod-arduino.c.txt|aici]]) și îl vom ajusta pentru plăcuța ESP32. | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-proiect-arduino-uno.png|}} | ||
+ | |||
+ | Dar mai întâi, folosiți imaginea de mai jos cu pinout-ul de la Arduino pentru a urmări traseele de la Arduino Uno către periferice, și identificați urmării pini de pe Arduino: | ||
+ | * SDA, SCL (pentru I2C) | ||
+ | * SS, SCK, MISO, MOSI (pentru SPI) | ||
+ | * Pinul 2 conectat la DHT22. | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-arduino-uno-pinout-diagram.png?700|}} | ||
+ | |||
+ | === Ex. 2 === | ||
+ | |||
+ | Creați un proiect nou in Wokwi și alegeți plăcuța ESP32. Adăugați componentele de la proiectul luat ca referință cu ajutorul butonului "Add". | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-pic1-add-simulation.png}} | ||
+ | |||
+ | == MAX7219 == | ||
+ | |||
+ | https://docs.wokwi.com/parts/wokwi-max7219-matrix | ||
+ | |||
+ | MAX7219 este o matrice de LED-uri formată din 4 blocuri 8x8. Funcționează peste interfața SPI iar cu ajutorul [[https://github.com/MajicDesigns/MD_Parola|bibliotecii]] "Parola" de la MajicDesigns este foarte ușor de creat text si animații ale textului. | ||
+ | |||
+ | Adăugați modulul MAX7219 din Wokwi cu un click pe butonul "Add", iar apoi selectând "LED Dot Matrix (MAX7219)". | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-pic2-matrix.png|}} | ||
+ | |||
+ | == DHT22 == | ||
+ | |||
+ | https://docs.wokwi.com/parts/wokwi-dht22 | ||
+ | |||
+ | DHT22 este un senzor de temperatură și umiditate care are nevoie doar de un singur fir conectat la orice pin GPIO de pe plăcuță. După ce conectați firul la plăcuță, ajustați valoarea constantei "DHTPIN" la noul pin GPIO (ex. GPIO 5). | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-pic3-dht22.png|}} | ||
+ | |||
+ | == DS1307 == | ||
+ | |||
+ | https://docs.wokwi.com/parts/wokwi-ds1307 | ||
+ | |||
+ | DS1307 este un modul de la care putem lua ora și data curentă (RTC - Real Time Clock). Funcționează peste I2C iar adresa dispozitivului este 0x68. | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-pic4-ds1307.png|}} | ||
+ | |||
+ | Faceți modificările necesare codului pentru a rula simularea la fel ca și în proiectul original cu Arduino Uno. Pentru a determina ce pini puteti folosi, consultati pinout-ul de mai jos al unui ESP32 similar celui din simulator. | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-esp32-pinout-mapping.png?900|}} | ||
+ | |||
+ | Alternativ, puteti folosi urmatoarele 2 resurse pentru a determina pinii pentru [[https://randomnerdtutorials.com/esp32-spi-communication-arduino/|SPI]] si [[https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/|I2C]]. | ||
+ | |||
+ | |||
+ | |||
+ | === Ex. 3 === | ||
+ | |||
+ | Adaugati o animație nouă pe afișajul LED cu textul "IoThings". | ||
+ | |||
+ | {{:iothings:laboratoare:lab4-iothings-gif.gif|}} | ||
+ | |||
+ | ===== Resurse ===== | ||
+ | |||
+ | * https://wokwi.com/projects/289186888566178317 | ||
+ | * https://docs.wokwi.com/parts/wokwi-max7219-matrix | ||
+ | * https://docs.wokwi.com/parts/wokwi-ds1307 | ||
+ | * https://docs.wokwi.com/parts/wokwi-dht22 | ||
+ | * https://en.wikipedia.org/wiki/Serial_Peripheral_Interface | ||
+ | * https://en.wikipedia.org/wiki/I%C2%B2C | ||
+ | * https://arduino.stackexchange.com/questions/16348/how-do-you-use-spi-on-an-arduino | ||
+ | * https://www.digikey.de/en/maker/projects/getting-started-with-stm32-i2c-example/ba8c2bfef2024654b5dd10012425fa23 | ||
+ | * https://piembsystech.com/i2c-protocol/ | ||
+ | * https://www.circuito.io/blog/arduino-uno-pinout/ |