Laborator 02. I2C – Haptics, Accelerometru, Giroscop

În acest laborator veți învăța cum să interacționați cu periferice prin I2C și cum datele hardware sunt transmise aplicațiilor, de la nivel low-level (driver) până la cel high-level (aplicație).

Vom folosi două dispozitive:

  • DRV2605L – driver haptic (motor de vibrații)
  • LSM6DSL – accelerometru + giroscop

Ce este un driver

Un driver este o componentă software a kernel-ului care permite sistemului de operare să comunice cu un dispozitiv hardware. Fără drivere, kernel-ul nu poate interacționa cu lumea externă CPU-ului.

Tipuri de drivere:

  • char device driver – lucrează cu date la nivel de caracter (byte), folosit pentru senzori, tastaturi etc.
  • block device driver – folosit pentru dispozitive care transferă date în blocuri (ex: HDD, SSD).

Aproximativ 80% din codul unui OS este dedicat driverelor.

I2C

I2C (Inter-Integrated Circuit) este un protocol serial master–slave, folosit pentru a conecta microcontrolere la senzori și alte periferice, prin doar două linii:

  • SDA (Serial Data) – transmite date
  • SCL (Serial Clock) – transmite semnalul de ceas

Masterul (ex: ESP32S3) controlează comunicația și ceasul, iar fiecare dispozitiv slave are o adresă pe 7 biți. Transferul de date poate fi:

  • Write – master → slave
  • Read – slave → master

DRV2605L - driver haptic

DRV2605L controlează motoare de vibrație și include o bibliotecă internă de efecte haptice, fără a genera manual semnalul de vibrare.

Arhitectura software în NuttX:

Codul este împărțit în două componente:

  • Upper half driver – oferă un API standard pentru aplicații.
  • Lower half driver – implementează accesul efectiv la hardware.

LSM6DSL - accelerometru și giroscop

Senzor 3D cu funcționalități:

  • Accelerometru – măsoară accelerația (în *mg*, unde 1g ≈ 9.81 m/s²)
  • Giroscop – măsoară rotația (în *mdps*, adică 0.001 dps)

În NuttX, senzorul este expus direct printr-un char device în /dev/lsm6dsl, fără nivel intermediar. Această arhitectură este preluată din Linux și considerată „legacy”.

Exerciții

Pentru a putea rula exercițiile, compilați NuttX folosind hacktorwatch:iot și activați manual următoarele opțiuni din make menuconfig:

Haptics (DRV2605L)

  • CONFIG_FF_DRV2605L
  • CONFIG_DRV2605L_TS2200_LIBRARY_A
  • CONFIG_EXAMPLES_DRV2605L

Activați mai întâi toate dependințele pentru CONFIG_FF_DRV2605L.

Dacă ceasul vibrează la boot, configurația este corectă.

Accelerometru și giroscop (LSM6DSL)

  • CONFIG_SENSORS_LSM6DSL
  • CONFIG_EXAMPLES_LSM6DSL_READER

Verificați și activați dependințele acestor config-uri.

1. Pentru a va acomoda cu API-ul pe care NuttX il ofera pentru a interactiona cu cele doua device-uri, in cadrul acestui exercitiu va trebui sa inspectati codul si sa rulati aplicatiile de demo disponibile in repository-ul nuttx-apps.

  1. nuttx-apps/examples/drv2605l/ initializeaza device-ul cu anumite efecte de vibrare (upload_rom_effect, upload_constant_effect). Apelarea acestora se face ulterior, “on demand”, prin play_effect.
  2. nuttx-apps/examples/lsm6dsl_reader afiseaza la consola o data la doua secunde datele obtinute de la accelerometru si giroscop. Observati modul de interactiune cu senzorul: acesta este expus printr-o intrare in /dev/ care va trebui folosita in cadrul apelului de sistem open, iar mai apoi folosim apeluri de ioctl pentru a interactiona cu hardware-ul.
  3. Cautati definitiile pentru structurile de date folosite in ambele aplicatii.

Toate fișierele de tip header le puteți găsi în nuttx/include/nuttx/. Puteți căuta recursiv din linia de comandă folosind grep -r <string>.

2. In cadrul acestui exercitiu, vrem ca ceasul sa ne ofere informatii (prin vibrare) atunci cand viram stanga, respectiv dreapta.

  1. Folosindu-ne de lsm6dsl_reader vom citi datele oferite de accelerometru si vom determina directia de mers.
  2. Daca ceasul este nemiscat sau merge inainte nu va oferi niciun fel de feedback utilizatorului.
  3. drv2605l are o biblioteca interna de efecte de vibrare pe care o puteti consulta aici, la pagina 63. Alegeti doua efecte din acest tabel si incarcati-le pe ceas.
  4. In functie de directia de mers, vom rula in mod constant unul dintre cele doua efecte pana cand ceasul va reveni in stare initiala (ceasul este nemiscat sau sau se misca doar inainte).

Hint: pentru a opri un efect, trebuie sa scrieti o functie care realizeaza inversul lui play_effect. Parametrul care ne intereseaza si trebuie modificat este play.value (trebuie sa fie setat pe 0 - disabled).

Hint: pentru a putea face polling mai des pe senzor si sa obtineti date mai accurate este nevoie sa folositi usleep.

3. (Bonus) La exercitiul anterior, intensitatea de vibrare era absoluta (on/off). Ne dorim sa avem un mecanism mai complex prin care sa folosim vibrare graduala in functie de nivelul acceleratiei - cu cat acceleratia este mai mare, cu atat vibratia va fi mai puternica.

Resurse

si/laboratoare/2025/02.txt · Last modified: 2025/10/08 17:43 by farhad_ali.gul
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