Î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:
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:
I2C (Inter-Integrated Circuit) este un protocol serial master–slave, folosit pentru a conecta microcontrolere la senzori și alte periferice, prin doar două linii:
Masterul (ex: ESP32S3) controlează comunicația și ceasul, iar fiecare dispozitiv slave are o adresă pe 7 biți. Transferul de date poate fi:
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:
Senzor 3D cu funcționalități:
Î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”.
Pentru a putea rula exercițiile, compilați NuttX folosind hacktorwatch:iot și activați manual următoarele opțiuni din make menuconfig:
Activați și CONFIG_SCHED_WORKQUEUE!
315 | syslog("ERROR: Failed to initialize LMS6DSL accelero-gyro driver %s\n",
Modificați fișierul ./boards/xtensa/esp32s3/hacktorwatch/src/esp32s3_bringup.c
Si adăugați la syslog: syslog(LOG_ERR, ).
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.
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.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.
nuttx/include/nuttx/. Puteți căuta recursiv din linia de comandă folosind grep -r <string>.
2. (Bonus) In cadrul acestui exercitiu, vrem ca ceasul sa ne ofere informatii (prin vibrare) atunci cand viram stanga, respectiv dreapta.
lsm6dsl_reader vom citi datele oferite de accelerometru si vom determina directia de mers.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.
play_effect. Parametrul care ne intereseaza si trebuie modificat este play.value (trebuie sa fie setat pe 0 - disabled).
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.