Programowanie systemów autonomicznych

Podobne dokumenty
Systemy Wbudowane. Arduino C. Arduino C - stałe. Arduino C - Stałe. Arduino C - Stałe. Funkcje matematyczne. Arduino C - Stałe

Uwaga: dioda na wyjściu 13 świeci gdy na wyjście podamy 0.

Wprowadzenie do programowania urządzeń Arduino (Arduino dla Informatyków)

Schemat blokowy architektury AVR

Systemy Wbudowane. Arduino - rozszerzanie. Podłączanie wyświetlacza LCD. Podłączanie wyświetlacza LCD. Podłączanie wyświetlacza LCD

Wprowadzenie do programowania urządzeń Arduino (Arduino dla Informatyków)

Systemy Wbudowane. Arduino C. Arduino C - stałe. Arduino C - Stałe. Arduino C - Stałe. Funkcje matematyczne. Arduino C - Stałe

Systemy Wbudowane. Arduino, AVR. Arduino. Arduino. Arduino. Oprogramowanie. Mikrokontroler. Mikrokontroler Platforma Arduino. Arduino IDE: Arduino C:

Uczeń/Uczennica po zestawieniu połączeń zgłasza nauczycielowi gotowość do sprawdzenia układu i wszystkich połączeń.

LABORATORIUM - ELEKTRONIKI Układy mikroprocesorowe cz.2

Język C. Wykład 9: Mikrokontrolery cz.2. Łukasz Gaweł Chemia C pokój 307

Klawiatura matrycowa

Szkolenia specjalistyczne

LABORATORIUM - ELEKTRONIKA Układy mikroprocesorowe cz.2

Pomiar odległości z Arduino czujniki, schematy, przykładowe kody

1. Wprowadzenie Programowanie mikrokontrolerów Sprzęt i oprogramowanie... 33

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Rafał Staszewski Maciej Trzebiński, Dominik Derendarz

Systemy Wbudowane. Arduino, AVR (wersja ) Arduino. Arduino. Arduino. Oprogramowanie. Mikrokontroler

Systemy Wbudowane. Arduino, AVR (wersja 2018) Arduino. Arduino. Oprogramowanie. Rys historyczny. Mikrokontroler

Przetwornik analogowo-cyfrowy

o Instalacja środowiska programistycznego (18) o Blink (18) o Zasilanie (21) o Złącza zasilania (22) o Wejścia analogowe (22) o Złącza cyfrowe (22)

Arduino dla początkujących. Kolejny krok Autor: Simon Monk. Spis treści

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Programowanie mikrokontrolerów AVR

Systemy Wbudowane. Arduino, AVR (wersja 2019) Arduino. Arduino. Oprogramowanie. Rys historyczny. Mikrokontroler

Tematem projektu jest oparty na Arduino zegar pokazujący godzinę oraz datę.

Język programowania. KURS Kurs Arduino (1)

start Program mikroprocesorowego miernika mocy generowanej $crystal = deklaracja

Programowanie mikroprocesorów w systemie Arduino. Instrukcja do ćwiczenia laboratoryjnego

1.2. Architektura rdzenia ARM Cortex-M3...16

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Zmierzyć się z żywiołami, czyli jak zbudować własną stację badawczą! Zaczynamy! Pole komunikatów programu. Nawigacja w programie Arduino

Instytut Teleinformatyki

ADVANCE ELECTRONIC. Instrukcja obsługi aplikacji. Modbus konfigurator. Modbus konfigurator. wersja 1.1

Bootloader programming

Przyrząd do grania bluesa Projekt zaliczeniowy z przedmiotu Programowanie Mikrokontrolerów

2. Architektura mikrokontrolerów PIC16F8x... 13

Wykład 4. Przegląd mikrokontrolerów 16-bit: - PIC24 - dspic - MSP430

1. Podstawowe wiadomości Możliwości sprzętowe Połączenia elektryczne Elementy funkcjonalne programów...

dokument DOK wersja 1.0

1. Wstęp Różnice pomiędzy mikrokontrolerami ST7 a ST7LITE Rdzeń mikrokontrolerów ST7FLITE... 15

Krótki wstęp o wyświetlaczach. Jak zmusić wyświetlacz do pracy?

6 ARDUINO DLA POCZĄTKUJĄCYCH. PODSTAWY I SZKICE

Wstęp Architektura... 13

SCL > Pin 21 SDA > Pin 20 VCC > 5V GND > GND

Zastosowanie procesorów AVR firmy ATMEL w cyfrowych pomiarach częstotliwości

Wprowadzenie do podstaw programowania AVR (na przykładzie mikrokontrolera ATmega 16 / 32)

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Konfigurator Modbus. Instrukcja obsługi programu Konfigurator Modbus. wyprodukowano dla

LabVIEW PLATFORMA EDUKACYJNA Lekcja 5 LabVIEW i Arduino konfiguracja środowiska i pierwszy program

Mikrokontrolery AVR Wprowadzenie

Programowanie mikrokontrolerów AVR z rodziny ATmega.

LabVIEW PLATFORMA EDUKACYJNA Lekcja 6 LabVIEW i Arduino programy wykorzystujące wyświetlacz LCD, czujnik temperatury, PWM i diodę LED

AN ON OFF TEMPERATURE CONTROLLER WITH A MOBILE APPLICATION

Szkoła programisty PLC : sterowniki przemysłowe / Gilewski Tomasz. Gliwice, cop Spis treści

Instytut Teleinformatyki

Projekt MARM. Dokumentacja projektu. Łukasz Wolniak. Stacja pogodowa

Instrukcja do oprogramowania ENAP DEC-1

by Jody Culkin PIERWOTNY WZÓR BĘDĄCY PODSTAWĄ DO STWORZENIA GOTOWEGO PRODUKTU.

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Instrukcja do ćwiczeń

Systemy Wbudowane. Arduino rozszerzanie Wersja Plan. Biblioteka EPROM Arduino bez płytki Arduino. Czyli... Co musimy mieć, aby uruchomić chip?

Wyświetlacz LCD. Ogólne zasady działania

ĆWICZENIE 5 WPŁYW KONWEKCJI NA ROZKŁAD TEMPERATURY W POMIESZCZENIU

Technika Mikroprocesorowa

Systemy Wbudowane. Arduino dołączanie urządzeń Wersja Arduino więcej portów I/O. Układy serii 74. Układy serii 74xx a seria 40xx

MoboLab roboty i tablety w Twojej szkole Obszar II. Stwórz własnego robota Scenariusze lekcji i zajęć pozalekcyjnych

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Programowanie mikrokontrolerów. 8 listopada 2007

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

MIKROKONTROLERY I MIKROPROCESORY

PRUS. projekt dokumentacja końcowa

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

MODBUS RTU wersja M1.14 protokół komunikacyjny wyświetlaczy LDN

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

M-1TI. PRECYZYJNY PRZETWORNIK RTD, TC, R, U NA SYGNAŁ ANALOGOWY 4-20mA Z SEPARACJĄ GALWANICZNĄ. 2

Opis procedur asemblera AVR

PROGRAM TESTOWY LCWIN.EXE OPIS DZIAŁANIA I INSTRUKCJA UŻYTKOWNIKA

1. Tworzenie nowego projektu.

Programowanie Mikrokontrolerów

Pilot RF 4-kanałowy + odbiornik XY-DJM-5V umożliwia zdalne sterowanie do czterech urządzeń. Nadajnik pilot MX804. Odbiornik XY-DJM.

HC541 8-bitowy bufor jednokierunkowy HC245 8-bitowy bufor dwukierunkowy HC244 dwa 4-bitowe bufory jednokierunkowe

Moduł komunikacyjny Modbus RTU do ciepłomierza SonoMeter 30

Instrukcja dla: Icomsat v1.0 SIM900 GSM/GPRS shield for Arduino oraz dla GPRS Shield produkcji Seeedstudio.

MoboLab roboty i tablety w Twojej szkole Obszar II. Stwórz własnego robota Scenariusze lekcji i zajęć pozalekcyjnych

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego

GND(VSS) i VCC - masa i zasilanie. V0 - regulacja kontrastu

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

MultiTool instrukcja użytkownika 2010 SFAR

Kurs Arduino dla początkujących - Michał Jaworski str. 1. Lekcja 5

Instrukcja podstawowego uruchomienia sterownika PLC LSIS serii XGB XBC-DR20SU

Instytut Teleinformatyki

Oscyloskop (007; ; arduino; processing)

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Instytut Teleinformatyki

Silnik prądu stałego. Sterowanie silnika prądu stałego

Rozdział 2. Programowanie Arduino i kodowanie społecznościowe (29)

ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Transkrypt:

Programowanie systemów autonomicznych Blok obieralny: Inteligentne Systemy Autonomiczne Instytut Informatyki Stosowanej Stefanowskiego 18/22 al. Politechniki 11 Tomasz Jaworski Piotr Duch

Programowanie systemów autonomicznych Wprowadzenie do programowania Arduino 2

Komputer (PC) + urządzenia wejścia/wyjścia 3

Komputer (Arduino) + urządzenia wejścia/wyjścia 4

Różnice? Podobieństwa? 5

Charakterystyka Arduino DUE Mikrokontroler: Atmel AT91SAM3X8E Architektura: 32 bitowy ARM Taktowanie: 82 MHz Wielkość pamięci RAM: 96 kb Wielkość pamięci Flash (pamięci programu): 512 kb Napięcie zasilania (zalecane): 7-12 V (napięcie stałe) Napięcie zasilania (limit): 6-16 V (napięcie stałe) Napięcie wewnętrzne: 3,3 V Liczba wejść/wyjść cyfrowych: 54 w tym 12 ma możliwość działania jako wyjścia PWM. Liczba wejść analogowych (ADC): 12 Liczba wyjść analogowych (DAC): 2 Brak RTC Obciążalność prądowa pojedynczego wyjścia logicznego: 6-9 ma (zależnie od wejścia) Obciążalność prądowa całkowita: 150 ma - suma prądów pobieranych z wszystkich wyjść Arduino nie może przekroczyć tej wartości. 6

Arduino Due - omówienie interfejsów I/O 7

Środowisko programisty Arduino IDE jest to rozbudowane środowisko programistyczne, przeznaczone do pisania kodu na różne wersje jednoukładowego komputera Arduino. Systemy operacyjne: Windows, Mac OS oraz Linux. Wbudowany kompilator architektury ARM - gcc, g++ (arm binutils) Używany język: C z elementami C++ głównie metody na rzecz obiektów, brak wyjątków (-fno-exceptions) dostępne malloc/free, new/delete 8

Własna instalacja - konfiguracja środowiska Arduino IDE nie obsługuje natywnie wersji DUE, należy ją zainstalować: Menedżer płytek (Narzędzia -> Płytka -> Menedżer płytek), wybrać i zainstalować Arduino SAM Boards. 9

Własna instalacja - połączenie środowiska z modułem DUE Zainstalowany dodatek do Arudino Due należu uaktywnić: Narzędzia -> Płytka, wybrać Arduino Due (Programming Port). następnie Z Narzędzia -> Port należy wybrać port USB, do którego podłączono Arduino DUE. (system sam wykryje listę portów, łącznie z Arduino) 10

Pierwsze uruchomienie 11

Przydatne narzędzia Pasek narzędzi: Kompiluj/weryfikuj Wgraj i uruchom Nowy Otwórz Zapisz Monitor portu szeregowego Przydatne ustawienia (Plik -> Ustawienia): Numerowanie linii Zwijanie kodu (code folding) 12

Arduino API 13

Arduino API - typy danych int, unsigned int 16 bitów (2 bajty) - Arduino UNO 32 bity (4 bajty) - Arduino DUE long, unsigned long 32 bity (4 bajty) - niezależnie od platformy float 32 bity (4 bajty) - -3.4E+38 -- 3.4E+38 (pojedyncza precyzja) double 64 bity (8 bajtów) - -1.7E+308 -- 1.7E+308 (podwójna precyzja) 14

Arduino API - typy danych Ciągi znaków, identycznie z językiem C char Str1[15]; char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'; char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino"; 15

Arduino API - typy danych Klasa String (https://www.arduino.cc/en/reference/stringobject) void loop() { // here's a String with empty spaces at the end (called white space): String stringone = "Hello! "; Serial.print(stringOne); Serial.print("<--- end of string. Length: "); Serial.println(stringOne.length()); // trim the white space off the string: stringone.trim(); Serial.print(stringOne); Serial.print("<--- end of trimmed string. Length: "); Serial.println(stringOne.length()); // do nothing while true: while (true); 16

Arduino API - typy danych Tablice, jak w języku C: int myints[6]; int mypins[] = {2, 4, 8, 3, 6; int mysensvals[6] = {2, 4, -8, 3, 2; char message[6] = "hello"; 17

Arduino API - budowa programu Szkic (sketch) Wymaga napisania dwóch funkcji: void setup(void) - wykonywana raz, po restarcie/podłączeniu zasilania void loop(void) - wykonywana w pętli; zakończenie funkcji loop powoduje jej restart Odniesienie do klasycznego schematu z języka C: void main(void) { setup(); while(1) loop(); 18

Arduino API - budowa programu -- różnice? int licznik; void setup(void) { licznik = 0; Serial.begin(9600); void loop(void) { Serial.write(licznik); licznik++; void setup(void) { Serial.begin(9600); void loop(void) { static int licznik = 0; Serial.write(licznik); licznik++; int licznik = 0; void setup(void) { Serial.begin(9600); while(1) { Serial.write(licznik); licznik++; void loop(void) { 19

Arduino API - funkcje/procedury 20

Arduino API - obiekt LiquidCrystal - wyświetlacz LCD 21

Arduino API - obiekt LiquidCrystal - wyświetlacz LCD Biblioteka LiquidCrystal (jeśli nie ma, to trzeba dodać: Sketch -> Include Library) Plik nagłówkowy: #include <LiquidCrystal.h> Konstruktor (notacja C++) LiquidCrystal lcd(26, 28, 29, 30, 31, 32); // sygnały: RS, E, D4, D5, D6, D7 Konfiguracja: void setup() { lcd.begin(16,2); 22

Arduino API - obiekt LiquidCrystal - wyświetlacz LCD Dostępne metody (https://www.arduino.cc/en/reference/liquidcrystal): begin(cols, rows) - inicjuj wyświetlacz (wejście: liczba wierszy i kolumn) clear() - czyść wyświetlacz home() - ustaw kursor w lewym górnym rogu (0, 0) setcursor(x, y) - ustaw kursor na współrzędnych x i y (licząc od 0) print(val [, format]) - wyświetl wartość (liczbę, tekst, znak) z formatowaniem write(ch) - wyświetl znak ch nocursor() - ukryj kursor cursor() - pokaż kursor blink() - włącz miganie kursora noblink() - wyłącz miganie kursora createchar(ch, bmap) - utwórz własny znak ch z bitmapy bmap (5x8) 23

Arduino API - obiekt LiquidCrystal - wyświetlacz LCD #include <LiquidCrystal.h> LiquidCrystal lcd(26, 28, 29, 30, 31, 32); void setup() { lcd.begin(16,2); lcd.setcursor(0,0); lcd.print("hello, World!"); void loop() { static int i = 0; lcd.setcursor(0,1); lcd.print("i="); lcd.print(i++); delay(250); 24

Arduino API - obiekt LiquidCrystal - wyświetlacz LCD #include <LiquidCrystal.h> LiquidCrystal lcd(26, 28, 29, 30, 31, 32); void setup() { lcd.begin(16,2); void loop() { delay(1000); lcd.setcursor(0,0); lcd.print("programowanie "); delay(3000); lcd.setcursor(0,1); lcd.print("urzadzen Arduino"); delay(3000); lcd.setcursor(0,0); lcd.print("urzadzen Arduino"); lcd.setcursor(0,1); lcd.print("jest BANALNIE ;)"); delay(3000); lcd.setcursor(0,0); lcd.print("jest BANALNIE ;)"); lcd.setcursor(0,1); lcd.print("proste. "); delay(3000); lcd.clear(); 25

26

Arduino API - obiekt Serial - komunikacja/konsola Port szeregowy: https://www.arduino.cc/en/reference/serial Dostępne metody: begin(speed) - uruchom port szeregowy z prędkością speed begin(speed, config) - j/w + dodatkowa konfiguracja print(val [, format]) - wyślij wartość (tekst, liczbę, znak) do odbiornika println(val [, format]) - wyślij wartość + znak nowej linii do odbiornika int available() - pobierz liczbę danych w buforze wejściowym int read() - wczytaj i zwróć wartość bajta z bufora wejściowego lub -1 String readstring() - pobierz dane z bufora jako tekst (String) String readstringuntil(char) - wczytuj dane z bufora aż do napotkania char lub przekroczenia czasu settimeout(ms) - ustaw limit czasu oczekiwania na dane [ms] 27

Arduino API - obiekt Serial - komunikacja/konsola void setup() { Serial.begin(9600); void loop() { static int licznik = 0; Serial.print("Licznik wynosi: "); Serial.println(licznik++); delay(500); 28

Arduino API - obiekt Serial - komunikacja/konsola void setup() { Serial.begin(9600); void loop() { static int licznik = 0; Serial.print("Licznik wynosi: "); Serial.println(licznik++, HEX); delay(500); 29

Arduino API - obiekt Serial - komunikacja/konsola void setup() { Serial.begin(9600); void loop() { if (Serial.available() > 0) { byte b = Serial.read(); Serial.print("Bajt: "); Serial.println(b, HEX); 30

Arduino API - obiekt Serial - komunikacja/konsola void setup() { Serial.begin(9600); void loop() { int data = Serial.read(); Serial.print(data); Serial.println(); delay(100); 31

Arduino API - obiekt Serial - komunikacja/konsola void setup() { Serial.begin(9600); void loop() { String text = Serial.readStringUntil('\n'); Serial.print("Tekst: "); Serial.print(text); Serial.print("(dlugosc="); Serial.print(text.length()); Serial.println(")"); 32

Arduino API - obiekt Serial - komunikacja/konsola void setup() { Serial.begin(9600); Serial.setTimeout(-1); void loop() { String text = Serial.readStringUntil('\n'); Serial.print("Tekst: "); Serial.print(text); Serial.print("(dlugosc="); Serial.print(text.length()); Serial.println(")"); 33

Arduino API - Funkcje do obsługi czasu Opóźnienie czasowe: void delay(unsigned long ms); void delaymicroseconds(unsigned int mc); Wstrzymuje działanie programu na ms milisekund lub mc mikrosekund. 1 sekunda = 1,000 ms = 1,000,000 us Punkt czasowy: unsigned long millis(void); unsigned long micros(void); Pobiera wartość czasu od startu/restartu urządzenia (brak RTC!) 34

Arduino API - Funkcje matematyczne Arduino/hardware/tools/avr/avr/include/math.h Makra: min(a, b), max(a, b), abs(x), constraint(x, low, high) Funkcje: float/float: sqrtf double/double: pow, sqrt, sin, cos, tan, floor, ceil, exp, log, log10 int/float: isnan, isinf long/long: map(value, slow, shigh, dlow, dhigh) 35

Arduino API - Funkcje matematyczne Makra - uwaga na efekty uboczne int a = 10, b = 20; int z = min(a++, b++); a =?, b =?, z =? int a = 10, b = 20; int z = (a++) > (b++)? (a++) : (b++) a =?, b =?, z =? 36

Arduino API - Generator liczb pseudolosowych Losuj wartość z zakresu 0 - high: long random(long high); Losuj wartość z zakresu low - high: long random(long low, long high); Ustaw wartość początkową generatora: void randomseed(unsigned long); Odpowiedniki w CRT: rand(), srand(). 37

Arduino API - Generator liczb pseudolosowych void setup(void) { randomseed(0); Serial.begin(9600); void loop(void) { Serial.print(random(100)); void setup(void) { long seed = 0; for (int i = 0; i < 12; i++) seed += analogread(i); randomseed(seed); Serial.begin(9600); void loop(void) { Serial.println(random(100)); 38

Arduino API - operacje na bitach (makra!) Odczytaj wartość bitu (x=0/1): x = bitread(number, bit); Ustaw bit: bitset(number, bit); Zeruj bit: bitclear(number, bit); Zapisz nową wartość bitu: bitwrite(number, bit, newvalue); 39

Arduino API - IO Wejście/wyjście cyfrowe (binarne) Wyjście: Pozwala na wystawienie wartości logicznej (sygnału cyfrowego), do wykorzystania przez inne urządzenia (np. włącz/wyłącz silnik). Wejście: Pozwala na pobranie wartości logicznej od zewnętrznego urządzenia (czujnik: czy okno zamknięte?) Możliwe stany logiczne: 0 (LOW, fałsz) oraz 1 (HIGH, prawda) Wartości napięciowe sygnałów: Arduino DUE: LOW = 0V, HIGH = 3V3 Arduino UNO: LOW = 0V, HIGH = 5V Uwaga na wydajność prądową wyjść cyfrowych! 40

Arduino API - IO - wejścia/wyjścia binarne Ustawienie kierunku przepływu informacji dla danego pinu: pinmode(pin, mode) pin - numer pinu 0-53 mode - tryb: INPUT, OUTPUT, INPUT_PULLUP Pobranie stanu logicznego (wartości sygnału) danego pinu: bool digitalread(pin) Ustawienie stanu logicznego (wartości sygnału) danego pinu: void digitalwrite(pin, value) value - wartość logiczne: LOW, HIGH 41

Arduino API - IO - wejścia/wyjścia binarne Obciążalność prądowa pinów Arduino DUE Prąd Kierunek=WYJŚCIE; Numer pinu - parametr pin w funkcji pinmode 3 ma 0 15 ma 2 1 13 3-12 16-20 14 Prąd 15 43 23-42 52 44-51 53 Kierunek=WEJŚCIE; Numer pinu - parametr pin w funkcji pinmode 6 ma 9 ma 0 2 1 13 3-12 16-20 14 15 43 23-42 52 44-51 53 42

Arduino API - IO - Przykład int ledpin = 5; void setup() { pinmode(ledpin, OUTPUT); void loop() { digitalwrite(ledpin, HIGH); delay(1000); digitalwrite(ledpin, LOW); delay(1000); 43

Arduino API - IO - Przykład void setup() { pinmode(2, OUTPUT); pinmode(3, OUTPUT); pinmode(4, OUTPUT); void loop() { digitalwrite(2, 1); digitalwrite(3, 1); digitalwrite(4, 1); delaymicroseconds(20); digitalwrite(4, 0); delaymicroseconds(60); digitalwrite(3, 0); delaymicroseconds(150); digitalwrite(2, 0); delaymicroseconds(770); 44

Arduino API - IO - Przykład void setup() { for (int i = 0; i < 8; i++) pinmode(2 + i, OUTPUT); void loop() { static byte value = 0; for (int i = 0; i < 8; i++) digitalwrite(2 + i, bitread( value, i)); Podpowiedź (podłączenie diod): PIN 2 = LED 8 PIN 3 = LED 7 PIN 4 = LED 6 PIN 5 = LED 5 PIN 6 = LED 4 PIN 7 = LED 3 PIN 8 = LED 2 PIN 9 = LED 1 value++; delay(100); 45

Arduino API - IO Wejście/wyjście analogowe Wyjście: Pozwala na wygenerowanie sygnału napięciowego, do wykorzystania przez inne urządzenia (np. sterowanie poziomem gazu w samochodzie) Wejście: Pozwala na zmierzenie wartości napięcia, podanego na wejście przez urządzenie zewnętrzne (czujnik jasności). Możliwy zakres wartości: 0-1023 (10 bitów) lub 4095 (12 bitów) Liczba wejść: 12 (A0-A11), wyjść: 2 (DAC0, DAC1) Wyjścia i wejścia to różne piny Wartości napięciowe sygnałów w Arduino DUE: 0 = 0V; 512 = 1,65V; 1023 = 3,3V (dla 10 bitów) 0 = 0V; 2048 = 1,65V; 4095 = 3,3V (dla 12 bitów) 46

Arduino API - wejście analogowe Odczytanie wartości napięcia w jednostkach przetwornika: int analogread(int pin); Ustawienie liczby bitów przetwornika (10 lub 12) int analogreadresolution(int bits); bits = 10 -> max=1024; 12 -> max=4096 Dostępne wejścia analogowe (piny): A0 - A11 (12 pinów) Przykład: int value = analogread(a3); float voltage = 3.3f * (float)value / 1024.0f; 47

Arduino API - wejście analogowe (napięciowe) void setup() { Serial.begin(9600); void loop() { int int int int x1 y1 x2 y2 = = = = analogread(a1); analogread(a0); analogread(a11); analogread(a10); Serial.print(x1); Serial.print('/'); Serial.print(y1); Serial.print(' '); Serial.print(x2); Serial.print('/'); Serial.print(y2); Serial.print('\n'); 48

Arduino API - wyjście analogowe Ustawienie wartości analogowej val na pinie : int analogwrite(int pin, int value); Dostępne wyjścia analogowe: 0 (DAC0), 1 (DAC1) - wyjścia napięciowe, max = 1024 2 13 - generatory PWM, max = 255, fpwm = 1k Hz 49

Arduino API - wyjście analogowe (PWM) void setup() pinmode(2, pinmode(3, pinmode(4, { OUTPUT); OUTPUT); OUTPUT); analogwrite(4, 5); analogwrite(3, 20); analogwrite(2, 59); void setup() { pinmode(2, OUTPUT); pinmode(3, OUTPUT); pinmode(4, OUTPUT); void loop() { digitalwrite(2, 1); digitalwrite(3, 1); digitalwrite(4, 1); delaymicroseconds(20); digitalwrite(4, 0); void loop() { delaymicroseconds(60); digitalwrite(3, 0); delaymicroseconds(150); digitalwrite(2, 0); delaymicroseconds(770); 50

Arduino API - Przerwania Wystąpienie przerwania powoduje wstrzymanie aktualnie wykonywanego kodu oraz wykonanie procedury obsługi przerwania (ISR - Interrupt Service Routine). Podstawowe źródła przerwań: Wejściowe piny cyfrowe Timery/liczniki Przerwania są domyślnie aktywne. Przerwania nie są od wykonywania długich operacji (np. mnożenie wartości typu double) a jedynie do zmiany stanu programu. Pamiętaj o volatile! 51

Arduino API - Przerwania Aktywacja/deaktywacja interrupts(); Aktywuje kontroler przerwań nointerrupts(); Deaktywuje kontroler przerwań. Niektóre funkcje (np. komunikacja) może przestać działać. Przykład: nointerrupts(); // tutaj kod, który nie może być przerwany, precyzyjny pomiar czasu, itd interrupts(); 52

Arduino API - Przerwania WE/WY Dodanie obsługi przerwania attachinterrupt(intno, ISR, mode); Ustaw funkcję obsługi ISR przerwania o wektorze intno. Funkcja ISR będzie uruchamiana w zależności od trybu mode. Wektor przerwania na podstawie numeru pinu: digitalpintointerrupt(pin) Wykorzystanie: attachinterrupt(digitalpintointerrupt(pin), ISR, mode); Konwerter digitalpintointerrupt nie jest wymagany dla DUE ale zalecany, ze względu na możliwe problemy z kompatybilnością. 53

Arduino API - Przerwania WE/WY Dostępne wartości parametru mode: LOW - gdy pin jest w stanie niskim (LOW, 0) HIGH - gdy pin jest w stanie wysokim (HIGH, 1) CHANGE - gdy na pinie wykryto zmianę stanu (0->1 lub 1->) RISING - gdy wykryto zbocze narastające (0->1) FALLING - gdy wykryto zbocze opadające (1->0) 54

Arduino API - Przerwania WE/WY Usunięcie obsługi przerwania detachinterrupt(intno); Wyłącz obsługę przerwania o wektorze intno. Wektor przerwania na podstawie numeru pinu: digitalpintointerrupt(pin) Wykorzystanie: detachinterrupt(digitalpintointerrupt(pin)); 55

Arduino API - Przerwania WE/WY void setup() { Serial.begin(9600); for (int i = 46; i <= 49; i++) pinmode(i, INPUT); attachinterrupt(digitalpintointerrupt(46), key_right, FALLING); attachinterrupt(digitalpintointerrupt(47), key_up, FALLING); attachinterrupt(digitalpintointerrupt(48), key_left, FALLING); attachinterrupt(digitalpintointerrupt(49), key_down, FALLING); void loop() { void key_right(void) { Serial.println("right"); void key_up(void) { Serial.println("up"); void key_left(void) { Serial.println("left"); void key_down(void) { Serial.println("down"); 56

Arduino API - Przerwania WE/WY volatile byte state = 0; void blink(void); void setup(void) { pinmode(47, INPUT); // strzałka w górę pinmode(3, OUTPUT); // dioda LED attachinterrupt(digitalpintointerrupt(47), blink, CHANGE); void loop(void) { digitalwrite(3, state); void blink(void) { state =!state; A czy digitalwrite można użyć w blink? 57

Arduino API - Przerwania WE/WY - Problem z przyciskami Źródła: drganie mechaniczne zestyków, zaburzenie parametrów elektrycznych podczas ruchu powierzchni kontaktowych 58

Arduino API - Przerwania timerów - biblioteka DueTimer GitHub: https://github.com/ivanseidel/duetimer Instalacja biblioteki DueTimer: 1. Sketch -> Include Library -> Manage libraries 2. Sketch -> Include Library -> DueTimer Wynik: #include <DueTimer.h> 59

Arduino API - DueTimer Biblioteka zewnętrzna, dedykowana wyłącznie dla Arduino DUE (nieportowalna ze względu na sprzęt) Na starcie udostępnia 9 timerów: Timer0 Timer8, będących obiektami klasy DueTimer W przypadku korzystania z biblioteki Servo, niedostępne są timery 0-5 (należy aktywować dyrektywę #define USING_SERVO_LIB true w pliku nagłówkowym DueTimer.h) Wszystkie metody klasy DueTimer zwracają DueTimer& (za wyjątkiem getfrequency i getperiod) Podobnie jak dla przerwań WE/WY, timery mogą mieć tylko jedną funkcję ISR 60

Arduino API - DueTimer Metody klasy DueTimer: DueTimer& getavailable() - Zwraca ref. do pierwszego wolnego timera attachinterrupt(void (*isr)()) - Podłącza obsługę isr przerwania detachinterrupt() - Usuwa obsługę przerwania start(long microseconds = -1) - Uruchom timer; opcjonalnie ustaw okres w mikrosekundach. stop() - Zatrzymaj timer setfrequency(double frequency) - Ustaw częstotliwość timera [Hz] double getfrequency() - Pobierz częstotliwość timera setperiod(long microseconds) - Ustaw okres timera [us] long getperiod() - Pobierz okres timera [us] 61

Arduino API - DueTimer #include <DueTimer.h> void setup() { Serial.begin(9600); Timer4.attachInterrupt(handler).start(); void loop() { void handler(void) { Serial.print("test"); #include <DueTimer.h> void setup() { Serial.begin(9600); Timer4.attachInterrupt(handler); Timer4.setFrequency(1); Timer4.start(); void loop() { void handler(void) { Serial.print("test"); 62

Płytka edukacyjna - dostępne zasoby 1/2 Diody LED (L): L8=p2, L7=p3, L6=p4, L5=p5, L4=p6, L3=p7, L2=p8, L1=p9 Serwonapędy (S): S1=p10, S2=p11, S3=p12, S4=p13 Dźwięk: Brzęczyk=p24, Audio=dac0 Joysticki: J1X=a11, J1Y=a10, J2X=a1, J2Y=a0 Potencjometr POT=a9 Klawiatura - strzałki: Prawo=p46, Góra=p47, Lewo=p48, Dół=p49 Przełączniki konfiguracyjne SW1=p50, SW2=p51, SW3=p52, SW4=p53 Czujnik ultradźwiękowy: Ping=p45, Echo=p44 63

Płytka edukacyjna - dostępne zasoby 2/2 Czujnik ultradźwiękowy: Ping=p45, Echo=p44 Wyświetlacz 7SEG: Dane=p38, Zegar=p39, Strob1=p33, Strob2=p34, Strob3=p35, Strob4=p36, OE=p37 Wyświetlacz alfanumeryczny LCD (2x16): RS=p26, E=p28, D4=p29, D5=p30, D6=p31, D7=p32 Klawiatura 4x4: Zegar=p41, DaneWe=p42, Zatrzask=p40 Wyświetlacz matrycowy 8x8: CS=43, standardowy interfejs SPI 64

Wyświetlacz OLED Rozdzielczość: 128x64 (8192 punkty) Technologia: OLED Sterowanie z Arduino: klasa SH1106_SPI_FB Biblioteka: https://github.com/inteligentnesystemyautonomiczneiis/fast-sh1106library-for-arduino-due 65

Obsługa OLED - Klasa SH1106_SPI_FB #include <SH1106_SPI.h> void loop() { oled.clear(); SH1106_SPI_FB oled; oled.gotoxy(0, 1); oled.print("processing..."); void setup(void) { oled.renderall(); oled.begin(); for (int i = 0; i <= 100; i++) { oled.print("start"); oled.gotoxy(4, 2); oled.renderall(); oled.print(i); oled.print("% "); delay(1000); oled.renderall(); delay(100); delay(1000); oled.clear(); oled.gotoxy(10, 3); oled.print("ready!"); oled.renderall(); delay(1000); 66

Obsługa OLED - Klasa SH1106_SPI_FB #include <SH1106_SPI.h> void loop() { oled.clear(); SH1106_SPI_FB oled; oled.gotoxy(0, 1); oled.print("processing..."); void setup(void) { oled.renderall(); oled.begin(); for (int i = 0; i <= 100; i++) { oled.print("start"); oled.gotoxy(4, 2); oled.renderall(); oled.print(i); oled.print("% "); delay(1000); oled.renderall(); delay(100); delay(1000); oled.clear(); oled.gotoxy(10, 3); oled.print("ready!"); oled.renderall(); delay(1000); film 67

Obsługa OLED - Klasa SH1106_SPI_FB #include <SH1106_SPI.h> SH1106_SPI_FB oled; void setup(void) { oled.begin(); film void loop() { for (int x = 0; x < 128; x++) for (int y = 0; y < 64; y++) oled.setpixel(x, y, random(2)); oled.renderall(); 68

Obsługa OLED - Klasa SH1106_SPI_FB #include <SH1106_SPI.h> SH1106_SPI_FB oled; int y[128] = {, dx = 0; void setup(void) { oled.begin(); void draw(bool s) { for (int i = 0; i < 128; i++) oled.setpixel(i, 32 + y[i], s); void loop() { draw(false); for (int i = 0; i < 128; i++) y[i] = 30*sin((float)(i+dx) / 10.0f); dx++; draw(true); oled.renderall(); film 69

Obsługa OLED - Klasa SH1106_SPI_FB Dostępne API: begin() - Inicjuje wyświetlacz (automatyczne czyszczenie zawartości) write(data) - Wyświetla znak na podstawie kodu data; znaki nie-ascii nie są wyświetlane. clear() - Czyści zawartość ekranu. gotoxy(cx,cy) - Ustawia pozycję wyświetlania tekstu na pozycję x,y. Uwaga! cx i cy to nie współrzędne pikselowe, tylko znakowe. setpixel(x, y, v) - Ustawia piksel (x, y) wartością v. writeline(x1, y1, x2, y2) - Rysuje linię (tylko pionowe/poziome) writerect(x, y, w, h, fill) - rysuje/wypełnia prostokąt print(value) - wyświetla wartość (tekst, liczbę, itd) w aktualnej pozycji println(value) - działa jak print(); znak \n nie jest obsługiwany 70

Płytka edukacyjna - zasoby sprzętowe Definicje słowne w języku C (#define): https://github.com/inteligentnesystemyautonomiczneiis/isadefinitions 71

Dziękuję za uwagę 72