This shows you the differences between two versions of the page.
pm:lab:lab3-2022 [2022/03/27 20:01] dragos_mihai.ene [4. Exerciții] |
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://www.tinkercad.com/things/cVPb9x8NUbX|Tinkercad Button Led Interrupts]] | + | |
- | </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://www.tinkercad.com/things/2MYGBAcxapa|Tinkercad Auto RGB]] | ||
- | </hidden> | ||
=== Task 2 (Servo / sweep) === | === Task 2 (Servo / sweep) === | ||
+ | {{: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). | ||
Modificați programul astfel încât servomotorul să se oprească atunci când ajunge în oricare din capete. Cu ajutorul interfeței seriale, se va modifica sensul de rotație. | Modificați programul astfel încât servomotorul să se oprească atunci când ajunge în oricare din capete. Cu ajutorul interfeței seriale, se va modifica sensul de rotație. | ||
+ | |||
+ | <note warning>Atenție la limitele de unghi. Depășirea acestora poate avaria servomotorul</note> | ||
* Se pot controla până la 12 servomotoare folosind un singur timer | * Se pot controla până la 12 servomotoare folosind un singur timer | ||
Line 346: | Line 346: | ||
} | } | ||
</file> | </file> | ||
- | |||
- | <hidden> | ||
- | **Soluția** se găsește pe [[https://www.tinkercad.com/things/kLxC5nzUW7L|Tinkercad Auto Servo]] | ||
- | </hidden> | ||
=== Task 3 (Servo / buton) === | === Task 3 (Servo / buton) === | ||
+ | {{: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. | ||
| | ||
- | {{:pm:lab:montaj_lab3.png?direct&700|}} | + | <note warning>Atenție la limitele de unghi. Depășirea acestora poate avaria servomotorul</note> |
- | * Atenție la limite (min, max). Depășirea acestora poate avaria servomotorul. | + | |
* 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> | + | ===== 5. Resurse ===== |
- | **Soluția** se găsește pe [[https://www.tinkercad.com/things/23y5RXDFFVl|Tinkercad Button Servo]] | + | |
- | </hidden> | + | |
- | + | ||
- | + | ||
- | ===== 4. Resurse ===== | + | |
* {{:pm:atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}} | * {{:pm:atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}} | ||
Line 371: | 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 ]] | ||
- | ===== 5. Linkuri utile ===== | + | |
+ | <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 ===== | ||
* [[http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html|AVR Libc - interrupt.h]] | * [[http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html|AVR Libc - interrupt.h]] | ||
Line 379: | 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]] | ||
+ |