Î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
:
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. 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.