This shows you the differences between two versions of the page.
si:iot2025:lab02 [2025/08/09 21:48] robert_ionut.alexa |
si:iot2025:lab02 [2025/08/11 12:53] (current) dan.tudose [DRV2605L - senzor haptic] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 02. I2C - Haptics, Accelerometru ===== | + | ===== Laboratorul 02. I2C - Haptics, Accelerometru, Giroscop ===== |
- | În laboratorul de astăzi veți învăța cum să interactionați cu diferite periferice prin I2C și cum datele de la hardware sunt transmise utilizatorului prin diferite niveluri de indirectare. Vom explora atât noțiuni low-level cât și aspecte mai high-level (arhitectura software a driver-elor in NuttX) construite peste. | + | În laboratorul de astăzi veți învăța cum să interactionați cu diferite periferice prin I2C și cum datele de la hardware sunt transmise utilizatorului prin diferite niveluri de redirectare. Vom explora atât noțiuni low-level cât și aspecte mai high-level (arhitectura software a driver-elor in NuttX) construite peste. |
Un modul de kernel (sau un device driver) este o bucată specializată de cod care este compilată și adăugată la kernel-ul sistemului de operare. În acest mod, sistemul de operare are posibilitatea de a interacționa cu diferite periferice - în absența driverelor, un kernel nu ar putea accesa lumea exterioară CPU-ului. De exemplu, dacă ne dorim ca sistemul nostru să poată transfera date prin controller-ul de I2C, avem nevoie de un driver pentru I2C care să programeze aceste tranzacții de transfer de date. Analog, dacă ne dorim să interacționăm cu un senzor, avem nevoie de un device driver care știe să programeze acel senzor. | Un modul de kernel (sau un device driver) este o bucată specializată de cod care este compilată și adăugată la kernel-ul sistemului de operare. În acest mod, sistemul de operare are posibilitatea de a interacționa cu diferite periferice - în absența driverelor, un kernel nu ar putea accesa lumea exterioară CPU-ului. De exemplu, dacă ne dorim ca sistemul nostru să poată transfera date prin controller-ul de I2C, avem nevoie de un driver pentru I2C care să programeze aceste tranzacții de transfer de date. Analog, dacă ne dorim să interacționăm cu un senzor, avem nevoie de un device driver care știe să programeze acel senzor. | ||
Line 11: | Line 11: | ||
Din punct de vedere al user-ului, driverele pot să fie expuse în două moduri: | Din punct de vedere al user-ului, driverele pot să fie expuse în două moduri: | ||
- | * char device driver - în Linux sunt folosite pentru mouse și tastatură, de exemplu, iar în NuttX pentru senzori, printre altele. Pe scurt, dispozitive cu rată mică de transfer de date, care functionează la nivel de caracter (byte). | + | * **char device driver** - în Linux sunt folosite pentru mouse și tastatură, de exemplu, iar în NuttX pentru senzori, printre altele. Pe scurt, dispozitive cu rată mică de transfer de date, care functionează la nivel de caracter (byte). |
- | * block device driver - folosite pentru hdd-uri, sdd-uri, device-uri care au nevoie să transfere date la nivel de blocuri (4KB de obicei). | + | * **block device driver** - folosite pentru hdd-uri, sdd-uri, device-uri care au nevoie să transfere date la nivel de blocuri (4KB de obicei). |
==== I2C ==== | ==== I2C ==== | ||
Line 32: | Line 32: | ||
{{ :si:iot2025:i2c-communication-how-it-works.png?500 }} | {{ :si:iot2025:i2c-communication-how-it-works.png?500 }} | ||
- | ==== DRV2605L - senzor haptic ==== | + | ==== DRV2605L - driver haptic ==== |
- | DRV2605L este un senzor haptic proiectat cu scopul de a controla motoare de vibratie care in final sa poata oferi feedback utilizatorului prin vibratii. Avantajul acestui device este ca, desi poate fi programat sa genereze vibratii constante, vine cu o biblioteca interna de efecte haptice, fara a fi nevoie ca user-ul sa creeze undele manual. | + | DRV2605L este un driver haptic proiectat cu scopul de a controla motoare de vibratie care in final sa poata oferi feedback utilizatorului prin vibratii. Avantajul acestui device este ca, desi poate fi programat sa genereze vibratii constante, vine cu o biblioteca interna de efecte haptice, fara a fi nevoie ca user-ul sa creeze trenul de vibrații manual. |
- | In cadrul NuttX, arhitectura software prin care o aplicatie interactioneaza cu hardware-ul presupune mai multe niveluri de redirectare: | + | In cadrul NuttX, arhitectura software prin care o aplicatie interactioneaza cu senzorul DRV2605L presupune mai multe niveluri de redirectare: |
{{ :si:iot2025:screenshot_2025-08-09_at_21.19.01.png?200 }} | {{ :si:iot2025:screenshot_2025-08-09_at_21.19.01.png?200 }} | ||
Line 50: | Line 50: | ||
Spre deosebire de DRV2605L, arhitectura software este mai simpla in cazul acestui device, sistemul de operare oferind doar un singur nivel de redirectare: | Spre deosebire de DRV2605L, arhitectura software este mai simpla in cazul acestui device, sistemul de operare oferind doar un singur nivel de redirectare: | ||
- | {{ :si:iot2025:screenshot_2025-08-09_at_21.00.13.png?200 }} | + | {{ :si:iot2025:screenshot_2025-08-09_at_21.53.41.png?200 }} |
Apelurile de sistem sunt interceptate de catre driver-ul dispozitivului prin char device-ul expus in ''/dev/lsm6dsl'', iar mai apoi comenzile de read/write sunt trimise direct device-ului hardware, fara a mai exista o componenta intermediara uniforma pentru toate device-urile. Acest API este imprumutat din Linux si este considerat "obsolete" in NuttX, doar device-urile "legacy" utilizand aceasta abordare. | Apelurile de sistem sunt interceptate de catre driver-ul dispozitivului prin char device-ul expus in ''/dev/lsm6dsl'', iar mai apoi comenzile de read/write sunt trimise direct device-ului hardware, fara a mai exista o componenta intermediara uniforma pentru toate device-urile. Acest API este imprumutat din Linux si este considerat "obsolete" in NuttX, doar device-urile "legacy" utilizand aceasta abordare. | ||
Line 96: | Line 96: | ||
<note tip> | <note tip> | ||
**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 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). | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | **Hint:** pentru a putea face polling mai des pe senzor si sa obtineti date mai accurate este nevoie sa folositi ''usleep''. | ||
</note> | </note> | ||
**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. | **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 ===== | ||
+ | * [[https://www.ti.com/lit/ds/symlink/drv2605l.pdf|DRV2605L Effect library]] |