Lab 7.1 Comunicare cu periferii - I²C

Lab 7.1: Comunicații cu module periferice – I²C – Protocol HW

Scopul lucrării
Familiarizarea cu protocolul de comunicație I²C și implementarea unei aplicații de comunicație între două microcontrolere (master și slave), în care slave-ul colectează date reale de la senzori ultrasonici, iar masterul interoghează periodic datele prin I²C. Aplicația va utiliza sistemul de operare în timp real FreeRTOS pentru organizarea logicii în taskuri separate.

Obiectivele lucrării

  • Înțelegerea principiilor protocolului I²C și a structurii hardware de comunicație între microcontrolere.

  • Configurarea comunicației între două microcontrolere prin magistrala I²C (master ↔ slave).

  • Integrarea unuia sau mai multor senzori ultrasonici cu MCU-ul slave.

  • Organizarea aplicației în taskuri FreeRTOS pentru colectare, actualizare buffer și comunicare.

  • Interogarea de către master și afișarea datelor colectate folosind STDIO (Serial) și/sau LCD.

Definire Problemă
Să se realizeze o aplicație în care două microcontrolere comunică prin protocolul I²C, având următoarele comportamente:

  • MCU Slave:

    • Integrează unul sau mai mulți senzori ultrasonici (ex. HC-SR04) conectați pe GPIO.

    • Rulează în FreeRTOS cel puțin două taskuri:

      • Task de achiziție periodică a distanței de la senzori.

      • Task de actualizare buffer partajat pentru răspuns I²C.

    • Răspunde cererilor I²C de la master cu datele cele mai recente din buffer.

  • MCU Master:

    • Trimite periodic comenzi de interogare către slave.

    • Primește datele înapoi prin I²C și le afișează:

      • fie pe LCD (opțional),

      • fie în interfața serială, utilizând funcții STDIO (printf).

    • Formatul de date transmis trebuie să fie structurat: HEAD, LENGTH, PAYLOAD, CHECKSUM.

Materiale și resurse
Componente hardware:

  • 2 x Microcontrolere (ESP32, STM32 sau Arduino Uno/Nano)

  • 1 sau mai mulți senzori HC-SR04

  • Rezistențe de pull-up 4.7 kΩ pentru SDA și SCL

  • LCD (opțional, pentru afișare alternativă)

  • Breadboard, cabluri jumper

  • Sursă de alimentare USB

Resurse software:

  • Visual Studio Code cu extensia PlatformIO

  • FreeRTOS (inclus în framework-ul Arduino pentru ESP32 / STM32)

  • Biblioteca Wire pentru I²C

  • Biblioteci pentru senzori HC-SR04

  • Simulator hardware (opțional: Proteus)

Recomandări

  • Structurați aplicația slave astfel încât senzorii să fie integrați modular.

  • Pentru achiziția HC-SR04 folosiți delay precis (vTaskDelayUntil) pentru stabilitate.

  • Masterul poate interoga toți senzorii simultan (pachet mare) sau individual (adresare logică).

  • Utilizați semnale de sincronizare sau mutex dacă bufferul de răspuns este partajat între taskuri.

  • Reutilizați logica de afișare STDIO și LCD din lucrările anterioare.

Pontaj
Cerințe obligatorii:

  • Respectarea structurii modulare a proiectului.

  • Prezentarea schemei bloc, a arhitecturii comunicației, a FSM-ului (dacă este cazul) și a interfețelor HW/SW.

  • Respectarea formatului raportului conform normelor UTM.

Notare:
50% – Funcționarea completă a comunicației I²C între cele două MCU-uri cu date reale de la senzori
10% – Utilizarea corectă a taskurilor FreeRTOS pentru achiziție și partajare date
10% – Structura clară și sigură a datelor transmise și afișarea corectă la master
10% – Prezentarea diagramei de sistem, a arhitecturii taskurilor și a interfețelor HW/SW
10% – Prezentarea schemelor electrice și a conexiunilor fizice
10% – Implementarea unui comportament adițional improvizat (ex.: adresare multiplă de senzori, calibrare automată, semnal de alertă în caz de apropiere excesivă)

NOTĂ: Pontajul maxim este posibil doar la prezentarea funcționării fizice complete a soluției și a unui comportament adițional improvizat.

10% penalizare pentru fiecare săptămână întârziere față de termenul stabilit.

Întrebări de control

  • Cum se configurează o magistrală I²C între două microcontrolere?

  • Ce rol are fiecare componentă a pachetului de date: HEAD, PAYLOAD, CHECKSUM?

  • Cum se gestionează sincronizarea între taskuri în FreeRTOS (semnale, mutexuri)?

  • Ce problemă apare dacă masterul interoghează slave-ul în timp ce acesta actualizează datele?

  • Ce diferență este între I²C hardware și un protocol logic software?

  • Care sunt avantajele rulării în FreeRTOS față de programarea secvențială pentru această aplicație?