This shows you the differences between two versions of the page.
|
pm:lab:lab3-2022 [2022/03/28 00:03] dragos_mihai.ene |
pm:lab:lab3-2022 [2023/03/19 14:41] (current) alexandru.predescu |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Laboratorul 3: Întreruperi externe. PWM ====== | + | /** |
| + | * uncomment this to publish the solution: | ||
| + | * ~~SHOWSOLUTION~~ | ||
| + | */ | ||
| + | ~~SHOWSOLUTION~~ | ||
| + | |||
| + | ====== Laboratorul 3: Întreruperi externe. PWM (old) ====== | ||
| Acest laborator are ca scop familiarizarea voastră cu lucrul cu întreruperile externe și cu modul de generare a semnalelor PWM folosind timer-ele prezente în microcontroller-ul Atmega328p. Vom folosi întreruperi externe pentru a detecta apăsarea unui buton, independent de programul principal. Folosind semnale PWM vom controla un LED RGB și poziția unui servomotor. | Acest laborator are ca scop familiarizarea voastră cu lucrul cu întreruperile externe și cu modul de generare a semnalelor PWM folosind timer-ele prezente în microcontroller-ul Atmega328p. Vom folosi întreruperi externe pentru a detecta apăsarea unui buton, independent de programul principal. Folosind semnale PWM vom controla un LED RGB și poziția unui servomotor. | ||
| Line 271: | Line 277: | ||
| } | } | ||
| </file> | </file> | ||
| - | |||
| Line 277: | Line 282: | ||
| === Task 0 (întreruperi / butoane) === | === Task 0 (întreruperi / butoane) === | ||
| - | Folosiți întreruperea externă INT0 (consultați schema PINOUT) pentru a detecta apăsarea unui buton. Modificați starea LED-urilor RGB la fiecare apăsare de buton. | + | Folosiți întreruperea externă INT0 (consultați schema PINOUT) pentru a detecta apăsarea unui buton. Modificați starea LED-urilor RGB (ON / OFF )la fiecare apăsare de buton. |
| - | * Configurați întreruperea externă (INT) pe front descrescător (falling edge) sau PCINT-ul corespunzător pinului folosit | + | * Configurați întreruperea externă (INT) pe front descrescător (falling edge) |
| * La apăsarea butonului, LED-ul își schimbă starea o singură dată? Adăugați o metodă de [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce|debouncing]] pentru a detecta o singură apăsare pe buton | * La apăsarea butonului, LED-ul își schimbă starea o singură dată? Adăugați o metodă de [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce|debouncing]] pentru a detecta o singură apăsare pe buton | ||
| * NU este recomandat să folosiți delay în ISR. | * NU este recomandat să folosiți delay în ISR. | ||
| * Se poate folosi funcția //millis()// pentru a verifica intervalul de timp de la ultima apăsare (100 ms ar trebui să fie suficient pentru un pushbutton/microswitch, dar ajustați după caz) | * Se poate folosi funcția //millis()// pentru a verifica intervalul de timp de la ultima apăsare (100 ms ar trebui să fie suficient pentru un pushbutton/microswitch, dar ajustați după caz) | ||
| - | {{:pm:lab:montaj_lab3.png?direct&700|}} | + | {{:pm:lab:lab3_task0.png?direct&600|}} |
| - | + | ||
| - | <hidden> | + | |
| - | **Soluția** se găsește pe [[https://github.com/cs-pub-ro/laborator-pm/tree/master/laborator/lab3/task0|Github PM Task 0]] | + | |
| - | </hidden> | + | |
| === Task 1 (LED RGB) === | === Task 1 (LED RGB) === | ||
| - | {{:pm:lab:montaj_lab3.png?direct&700|}} | + | {{:pm:lab:lab3_task1.png?direct&600|}} |
| Observați ceva special în montajul de mai sus modul de conectare al led-ului RGB ? (Hint: diagrama PINOUT, PWM) | Observați ceva special în montajul de mai sus modul de conectare al led-ului RGB ? (Hint: diagrama PINOUT, PWM) | ||
| Line 305: | Line 306: | ||
| * Pentru a urmări corespondența dintre cele 2 reprezentări (RGB și HSV) există selectoare de culori precum [[https://colorpicker.me/#3237b9|Online Color Picker]] | * Pentru a urmări corespondența dintre cele 2 reprezentări (RGB și HSV) există selectoare de culori precum [[https://colorpicker.me/#3237b9|Online Color Picker]] | ||
| {{ :pm:lab:hue-wheel.png?direct&400 |}} | {{ :pm:lab:hue-wheel.png?direct&400 |}} | ||
| - | |||
| - | <hidden> | ||
| - | **Soluția** se găsește pe [[https://github.com/cs-pub-ro/laborator-pm/tree/master/laborator/lab3/task1|Github PM Task 1]] | ||
| - | </hidden> | ||
| === Task 2 (Servo / sweep) === | === Task 2 (Servo / sweep) === | ||
| - | {{:pm:lab:montaj_lab3.png?direct&700|}} | + | {{:pm:lab:lab3_task2.png?direct&600|}} |
| Rulați exemplul standard din Arduino de mai jos, prin care se modifică în mod “continuu” poziția (0-180). | Rulați exemplul standard din Arduino de mai jos, prin care se modifică în mod “continuu” poziția (0-180). | ||
| Line 349: | Line 346: | ||
| } | } | ||
| </file> | </file> | ||
| - | |||
| - | <hidden> | ||
| - | **Soluția** se găsește pe [[https://github.com/cs-pub-ro/laborator-pm/tree/master/laborator/lab3/task2|Github PM Task 2]] | ||
| - | </hidden> | ||
| === Task 3 (Servo / buton) === | === Task 3 (Servo / buton) === | ||
| - | {{:pm:lab:montaj_lab3.png?direct&700|}} | + | {{:pm:lab:lab3_task3.png?direct&600|}} |
| Folosind o întrerupere de tip PCINT (Pin Change INTerrupt), modificați incremental poziția servomotorului (0-180 și 180-0) cu ajutorul butonului. | Folosind o întrerupere de tip PCINT (Pin Change INTerrupt), modificați incremental poziția servomotorului (0-180 și 180-0) cu ajutorul butonului. | ||
| Line 363: | Line 356: | ||
| * Folosiți debouncing pentru a obține o funcționare corectă (o apăsare va incrementa o singură dată poziția) | * Folosiți debouncing pentru a obține o funcționare corectă (o apăsare va incrementa o singură dată poziția) | ||
| * Există și servomotoare care folosesc un alt interval de comenzi (ex. 0.7ms-2.3ms), se poate folosi funcția //writeMicroseconds// pentru a controla direct durata pulsului. [[https://www.arduino.cc/en/Reference/ServoWriteMicroseconds|Servo.writeMicroseconds]] | * Există și servomotoare care folosesc un alt interval de comenzi (ex. 0.7ms-2.3ms), se poate folosi funcția //writeMicroseconds// pentru a controla direct durata pulsului. [[https://www.arduino.cc/en/Reference/ServoWriteMicroseconds|Servo.writeMicroseconds]] | ||
| - | |||
| - | <hidden> | ||
| - | **Soluția** se găsește pe [[https://github.com/cs-pub-ro/laborator-pm/tree/master/laborator/lab3/task3|Github PM Task 3]] | ||
| - | </hidden> | ||
| - | |||
| ===== 5. Resurse ===== | ===== 5. Resurse ===== | ||
| Line 375: | Line 363: | ||
| {{:pm:lab:uno.jpg?direct&200|pinout Arduino UNO}} | {{:pm:lab:uno.jpg?direct&200|pinout Arduino UNO}} | ||
| * Responsabili: [[dragos_mihai.ene@stud.acs.upb.ro | Dragoș Ene ]] | [[sebastian.gherman99@stud.acs.upb.ro | Sebastian Gherman ]] | * Responsabili: [[dragos_mihai.ene@stud.acs.upb.ro | Dragoș Ene ]] | [[sebastian.gherman99@stud.acs.upb.ro | Sebastian Gherman ]] | ||
| + | |||
| + | <solution> | ||
| + | <hidden>Arhiva cu soluțiile o puteți descărca de aici: {{:pm:lab:lab3_2021:lab3-solved.zip}}</hidden> | ||
| + | </solution> | ||
| + | |||
| ===== 6. Linkuri utile ===== | ===== 6. Linkuri utile ===== | ||
| Line 383: | Line 376: | ||
| * [[https://en.wikipedia.org/wiki/Comma-separated_values|CSV]] | * [[https://en.wikipedia.org/wiki/Comma-separated_values|CSV]] | ||
| * [[https://www.arduino.cc/en/Reference/ServoWriteMicroseconds|Servo.writeMicroseconds]] | * [[https://www.arduino.cc/en/Reference/ServoWriteMicroseconds|Servo.writeMicroseconds]] | ||
| + | |||