Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 Circuiteste 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)err10); +
-  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țun protocol ​de transmisie simplu pentru pachete în rețeaFiecare pachet va fi de lungime fixă (39 octeți), primul octet va fi adresa nodului care face transmisia, următorii doi octețvor codifica un sequence number ​pentru ​transmisie, urmează 32 de biți pentru ​payload ​și 4 octeți la final pentru ​CRCPentru 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 radioDacă reușitiveț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 lungimeSensor_id poate avea următoarele valori0-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 ESP32Vom folosi ca referință [[https://​wokwi.com/​projects/​289186888566178317|acest proiect]], de la care vom copia codul (disponibil ș[[lab4-cod-arduino.c.txt|aici]]șî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 8x8Funcț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 folosiconsultati pinout-ul de mai jos al unui ESP32 similar celui din simulator. 
 + 
 +{{:​iothings:​laboratoare:​lab4-esp32-pinout-mapping.png?​900|}} 
 + 
 +Alternativputeti folosi urmatoarele ​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. === 
 + 
 +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/​
iothings/laboratoare/lab4.1634055375.txt.gz · Last modified: 2022/02/11 16:52 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0