This is an old revision of the document!


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 acestor config-uri.

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. Înțelegeți API-ul oferit de NuttX pentru aceste două device-uri:

  1. nuttx-apps/examples/drv2605l/ – inițializează efecte haptice (upload_rom_effect, play_effect etc.).
  2. nuttx-apps/examples/lsm6dsl_reader – afișează valorile de la accelerometru și giroscop la fiecare 2 secunde.

Folosiți grep -r <string> nuttx/include/nuttx/ pentru a găsi structurile de date relevante.

2. Implementați feedback prin vibrație în funcție de direcția de mișcare:

  1. Folosiți lsm6dsl_reader pentru a determina direcția (stânga/dreapta).
  2. Alegeți două efecte haptice din biblioteca DRV2605L (pagina 63).
  3. Asociați efectele:
    • viraj stânga → efect 1
    • viraj dreapta → efect 2
    • staționar / înainte → fără vibrație
  4. Scrieți o funcție pentru oprirea vibrației (play.value = 0).
  5. Folosiți usleep() pentru citiri mai dese ale senzorului.

3. (Bonus) Faceți vibrația proporțională cu intensitatea accelerației – cu cât accelerația e mai mare, cu atât vibrația e mai puternică.

Resurse

si/laboratoare/2025/02.1759934461.txt.gz · Last modified: 2025/10/08 17:41 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