Zakres materiału:
- biblioteki arduino – link
- interfejs komunikacyjny UART – biblioteka Serial
- biblioteka do LCD – LiquidCrystal
- przetwornik analogowo-cyfrowy – biblioteka Analog
- układ regulatora – fotorezystor
- sygnał PWM – dioda RGB – biblioteka analogWrite
- cyfrowa dioda RGB WS2812 – biblioteka FastLed
Zadanie 1:
Zapoznać się z funkcją millis(). Utworzyć program, który wykorzystuje funkcję millis do mrugania diodami LED w następujący sposób:
- LED1 – mruga co 500ms
- LED2 – mruga co 2000ms
Dalsze zadania należy wykonywać w sposób nie blokujący mrugania diodami LED. Mają działać niezależnie i jednocześnie.
Zadanie 2 (ocena 3):
Uruchomić pomiar analogowy na czujniku światła typu fotorezystor, wyprowadzenie na płytce “A_photo”. Schemat układu z fotorezystorem znajduje się na rysunku poniżej.
Utworzyć program który, dokonuje odczytu napięcia na fotorezystorze i potencjometrze 1. Napięcia są wyświetlane w jednostkach [V] z dokładnością do jednego miejsca po przecinku na wyświetlaczu LCD.
Dodatkowo program powinien realizować funkcję regulatorów dla których sygnałem rzeczywistym jest pomiar napięcia na fotorezystorze, a sygnał zadany podajemy przy pomocy potencjometru:
- regulator dwustawny (link)
- regulator dwustawny z histerezą
stany regulatorów należy wyświetlacz na wyświetlaczu LCD lub wyświetlać na terminalu komputera.
Program ostatecznie powinien symulować działanie automatycznego włącznika światła po zmierzchu.
Każdy regulator powinien zostać utworzony jako osobna funkcja w programie, która przyjmuje wartość zadaną i rzeczywistą, a zwraca wartość sterującą.
Jak działają progi przełączania, co się dzieje na granicy progów, co daje histereza?
Zadanie 3 (ocena 3.5):
Wykorzystać sygnał PWM do sterowania diodą RGB – co to jest za sygnał PWM?
Sprawdzić na jakich wyprowadzeniach można używać sygnału PWM.
Dioda RGB ma wspólna anodę podłączoną do napięcia zasilania an stałe. Na złączą “J18” dostępne są piny “LED_R”, “LED_G”, “LED_B”, każdy z tych pinów to osobna katoda diody RGB.
Należy podawać sygnał PWM tak aby uzyskać efekt przełączającej się tęczy.
Wartości sygnału PWM dla poszczególnych wyprowadzeń wyświetlać na wyświetlaczu LCD.
Zadanie 4 (ocena 4):
Utworzyć program naśladujący sygnalizację diodą RGB poziomu nagrzania wody w czajniku elektrycznym. W zależności od symulowanej temperatury wody, dioda RGB powinna wskazywać barwą jej ciepło jak na rysunku poniżej.
temperaturę wyznaczyć za pomocą wzoru:
temp=Vx20, gdzie V to napięcie w woltach odczytane z potencjometru,
więc dla napięcia 5.0V mamy 100 stopni, dla 3.0V-60stopni itd.
Napięcie i symulowaną temperaturę należy wyświetlać na wyświetlaczu LCD. Dodatkowo należy wyświetlać napis z opisem słownym o stanie wody (zimna, ciepła, gorąca, wrzątek), progi ustalić samodzielnie.
Zadanie 5 (ocena 4.5):
Utworzyć menu z 3 opcjami odpowiadającymi programom z zadań 2-4.
Po menu poruszamy się przy użyciu impulsatora.
Informacje są wyświetlane na wyświetlaczu LCD.
Niezależnie od wybranej opcji w menu i jego stanu działają diody LED z zdania 1.
Zadanie 6 (ocena 5):
Uruchomić diodę cyfrową WS2812 – “LED_WS”. Pin danych tej diody dostępny jest na złączu “J18-LED_WS”. Do obsługi diody cyfrowej można wykorzystać bibliotekę “FastLED”. Jak działa taka dioda? jak można dodać kolejne diody. Narysować schemat z 4 diodami cyfrowymi sterowanymi z mikrokontrolera.
Oprogramować działanie diody cyfrowej tak jak działa dioda analogowa w zadaniu 4.
Umożliwić użytkowniki wybranie w menu programu jaka dioda ma być aktywna w danym momencie w zadaniu 4. Tylko jedna dioda ma symulować czajnik, dioda analogowa lub dioda cyfrowa.
Zakres laboratorium 2017-2021 (nie aktualne)
Zajęcia stacjonarne:
Wykonać notatki z odpowiedziami na poszczególne pytania.
Zadanie 1 – ocena 3
Funkcje biblioteki pgmspace: link
Zapoznanie się z rodzajami pamięci SRAM, FLASH, EEPROM.
- czym różnią się poszczególne pamięci?
- Jaka jest pojemność poszczególnych pamięci w mikrokontrolerze Atmega32a?
- Jakie są ich wady i zalety?
Uwagi:
należy dodać odpowiednie pliki nagłówkowe: #include <avr/eeprom.h> #include <avr/pgmspace.h>
czasem kompilator zauważy, że tablica nie jest używana i może dokonać optymalizacji kodu przez jej usunięcie. W takim przypadku można w pętli “while” wykonać jakaś operację na tablicy np. tab[0]=5;
podgląd rozmiaru programu jest możliwy po jego skompilowaniu w konsoli kompilatora (w programie eclipse znajduje się na dole ekranu w zakładce “Console”) tak jak na rysunku 1.
Utworzyć program z nieskończoną pętlą while, skompilować i sprawdzić wykorzystanie pamięci:
- przed funkcją “main” utworzyć jednoelementową tablicę typu “uint32_t”, jaki jest rozmiar tak skompilowanego programu w poszczególnych pamięciach?
- zmienić tablicę aby zawierała miejsce na 100 elementów, jak teraz zmieni się rozmiar programu? W której pamięci jest przechowywana tablica?
- zmienić rozmiar tablicy na 1000 elementów – czy taka tablica jest możliwa do przechowywania w wybranym mikrokontrolerze?
- zmodyfikować program aby tablica 1000 elementów została zapisana do pamięci flash. Czy teraz jest możliwe uruchomienie programu? Czy do takiej tablicy możemy zapisywać jakieś zmienne? Do czego można wykorzystać zapisywanie dużych elementów w pamięci flash w czasie kompilacji?
Wykorzystanie pamięci Flash do przechowywania dużych stałych elementów.
- Utworzyć nowy program na podstawie poniższego kodu. W jakiej pamięci jest umieszczona zmienna “tab” i “tab2”?
- Zmodyfikować program tak aby na wyświetlaczu były wyświetlone zmienne z tablicy “tab” – odczyt należny wykonać z wykorzystaniem funkcji “pgm_read_”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <avr/io.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <util/delay.h> #include <avr/sfr_defs.h> #include <math.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <avr/eeprom.h> #include "HD44780.h" #ifndef _BV #define _BV(bit) (1<<(bit)) #endif #ifndef sbi #define sbi(reg,bit) reg |= (_BV(bit)) #endif #ifndef cbi #define cbi(reg,bit) reg &= ~(_BV(bit)) #endif const uint8_t tab[10] PROGMEM = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; const uint8_t tab2[10] ={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int main() { LCD_Initalize(); LCD_Home(); char text[20]; uint8_t zmienna1=0; uint8_t zmienna2=0; while (1) { zmienna1=tab2[1]; zmienna2=tab2[2]; LCD_Clear(); LCD_GoTo(0, 0); sprintf(text, "Z1: %d", zmienna1); LCD_WriteText(text); LCD_GoTo(0, 1); sprintf(text, "Z2: %d", zmienna2); LCD_WriteText(text); _delay_ms(250); } } |
Zadanie 2 – ocena 4
Funkcje biblioteki EEPROM: link
Zrobić program, który po uruchomieniu wyświetla zapisaną liczbę z pamięci eeprom przez 5 sekund w formie “Zapisania liczba: n”. Następnie przechodzi do odliczania wartości od 1-200, naciśnięcie przycisku powoduje zapisanie aktualnej wartości do pamięci eeprom i jest potwierdzone komunikatem “Zapisano: n”.
- zapis do pamięci EEPROM wykonujemy przy użyciu funkcji “eeprom_write_byte”,
- odczyt z pamięci EEPROM wykonujemy przy użyciu funkcji “eeprom_read_byte”,
Zadanie 3 – ocena 4,5
Funkcje biblioteki WDT: link
Do czego służy moduł Watchdog? Po co go stosować i kiedy?
Wykorzystać program z poprzedniego zadania i zmodyfikować go:
- dodać biblioteki do obsługi watchdog,
- uruchomić moduł wadtchdog aby następowało jego działanie jeśli w ciągu 2s nie zostanie on zrestartowany,
- dodać obsługę kolejnego przycisku (przycisk 2), który po przyciśnięciu dokonuje restartu modułu watchdog,
- program powinien odliczać kolejne liczby jak w poprzednim zadaniu, dodatkowo należy cyklicznie wciskać przycisk 2 aby program działał,
- co się stanie jeśli nie dokonamy restartu modułu watchdog?
Zadanie 4 – ocena 5
Utworzyć program obsługujący dwa przerwania na różnych Timerach. Z ich wykorzystaniem zbudować stoper odliczający minuty, sekundy i setki sekund. Wyświetlać pomiary na wyświetlaczu LCD.
- przerwanie 1 – uruchamiane z częstotliwością 100Hz, służy do odliczania czasu
- przerwanie 2 – uruchomić z różnymi częstotliwościami (10-50Hz), obsługuje wyświetlanie na ekranie czasu, czas dobrać aby program działał poprawnie i interaktywnie
- w pętli main programu należy umieścić obsługę stopera, tylko funkcje start i stop (dwa przyciski) ustawiające odpowiednie flagi/ uruchamiające przerwania, reszta kodu powinna znaleźć się w odpowiednich przerwaniach
- przycisk start uruchamia zawsze nowe odliczanie, przycisk stop zatrzymuje odliczanie i wyświetla zmierzony czas
- dodać przycisk 3, który po naciśnięciu wykona restart mikrokontrolera przy wykorzystaniu modułu watchdog
Zajęcia zdalne:
Zakres laboratorium:
- Przetwornik A/D
- Timer – generator sygnału PWM (link, link2)
- Regulator dwustawny (link)
- Regulator dwustawny z histerezą
- Regulator trójstawny
- Regulator PID(link)
Przed wysłaniem programu należy sprawdzić jego działanie dla wszystkich wykonanych regulatorów i w każdym zakresie ustawienia potencjometrów.
Czy program poprawnie reaguje na wartości ujemne itd.
Zastanowić się nad przykładami urządzeń, w jakich występują zaprezentowane regulatory, potrafić wymienić minimum 3 urządzenia dla każdego regulatora.
Zadanie 1 – ocena 3
Program realizujący funkcję woltomierza:
- umieścić na schemacie mikrokontoler, dwa potencjometry zadający napięcie w zakresie 0-5V, dwa mierniki napięcia (Voltimeter) do mierzenia napięcia z potencjometrów i wyświetlacz LCD
- podłączyć elementy i napisać program, gdzie mikrokontroler wykorzystuje przetwornik A/D do pomiaru napięcia i wyświetla je na wyświetlaczu LCD
- w pierwszej linii LCD wyświetlana jest wartość mierzonego napięcia w woltach i wartość od 0-100, proporcjonalnie odpowiadająca mierzonemu napięciu, 0V to 0, 2,5V to 50 itd.
- w drugiej linii LCD wyświetlamy wartości z drugiego potencjometru
Przełączanie kanałów działa na symulatorze, proszę zapoznać się z rejestrem ADMUX. Najłatwiej przełączyć kanały przez wykorzystanie funkcji:
- sbi(ADMUX, MUX0) – ustawia 1 w bicie MUX0, ustawia pomiar na 1 kanale
- cbi(ADMUX, MUX0) – zeru bit MUX0, ustawia pomiar na 0 kanał
Zadanie 2 – ocena 4
Program realizujący funkcję regulatora dwupołożeniowego bez histerezy i z histerezą oraz regulatora trójpołożeniowego:
- do programu z zadania 1 dodajemy:
- diodę LED opisaną jako L1
- diodę LED opisaną jako L2
- 2 diody LED opisane jako L3A i L3B
- tworzymy 3 funkcje, jedna funkcja to jeden regulator, funkcja przyjmuje parametr (uint8_t wartośćZadana, uint8_t wartoscRzeczywista)
- zadaniem każdej funkcji jest realizacja następującego działania:
- regulator dwupołożeniowy – realizuję działanie regulatora dwustanowego i wyświetla swoje stany na diodzie L1
- regulator dwupołożeniowy z histerezą – realizuję działanie regulatora dwustanowego z histerezą i wyświetla swoje stany na diodzie L2, histerezę ustawić na 0,5V
- regulator trójpołożeniowego – realizuję działanie regulatora trójpołożeniowego i wyświetla swoje stany na diodach L3A i L3B
- wartość zadana to wartość z 1 potencjometru, a wartość rzeczywista to napięcie z 2 potencjometru,
- jak działają poszczególne regulatory, jakie są ich wady i zalety?
Zadanie 3 – ocena 4,5
Do programu z zadania 2 dodajemy regulator PID:
- dodajemy funkcję, realizującą zdanie regulatora PID – przyjmuje takie same parametry jak pozostałe funkcje regulatorów
- w obecnym zadaniu działanie regulatora PID ograniczamy tylko do członu “P”,
- wyliczamy uchyb regulacji,
- uchyb przeliczamy przez współczynnik członu proporcjonalnego “Kp” i otrzymujemy wartość sterującą,
- wartość sterująca powinna być w zakresie 0-100, gdzie 50 to gdy uchyb wynosi 0 a pozostałe wartości są proporcjonalne i wypełniają cały zakres sterowania,
- wartość wyświetlamy w 3 linijce wyświetlacza LCD (dodatkową linię do LCD można dodać przez wywołanie “Properties” na elemencie wyświetlacza i używamy funkcji LCD_GoTo(20, 0) i LCD_GoTo(20, 1)), MOC:xxx%
Zadanie 4 – ocena 5
Do programu z zadania 3 dodajemy wyjście PWM ustawiane przez regulator PID:
- należy ustawić Time1 do pracy w trybie PWM, należy wybrać odpowiedni tryb i skonfigurować układ licznikowy,
- funkcja PID z zdania 3 powinna sterować wypełnieniem sygnału PWM w zakresie 0-100,
- podłączyć do wyprowadzenia mikrokontrolera (tam gdzie będzie generowany sygnał PWM) oscyloskop, na którym będzie można obserwować sygnał PWM,