plik


ÿþKurs programowania Arduino KURS Kurs programowania Arduino (6) ObsBuga wy[wietlacza LCD, cyfrowych linii I/O i przetwornika A/C W tej cz[ci kursu zostan opisane praktyczne przykBady u|ycia oprogramowania Arduino. Zaznajomienie si z nimi uBatwi tworzenie programu a dodatkowo, gotowe przykBady mo|na po niewielkich modyfikacjach zastosowa we wBasnych projektach. PrzykBady zostaBy przygotowane dla zestawu Arduino UNO oraz wspóBpracujcych z nim moduBów AVTDuino LCD i AVTDuino LED. ObsBuga interfejsu RS232 Arduino UNO nie ma wy[wietlacza. Naj- pro[ciej do komunikacji z u|ytkownikiem u|y interfejsu komunikacyjnego RS232 i programu terminala, w który wyposa|o- no Arduino IDE. Komunikacja za pomoc Serial.print(78, DEC) da  78 Dodatkowe materiaBy na CD/FTP: ftp://ep.com.pl, user: 15352, pass: 760hp6s5 interfejsu szeregowego przebiega z zastoso- Serial.print(78, HEX) da  4E " poprzednie cz[ci kursu waniem konwertera USB-RS232 i linii TXD/ Serial.println(1.23456, 0) da  1 RXD mikrokontrolera. Do komunikacji za po- Serial.println(1.23456, 2) da [rednictwem sprztowego interfejsu RS232  1.23 szesnastkowej. Po ka|dym wykonaniu in- s dostpne nastpujce funkcje: Opcjonalny drugi parametr tej funkcji strukcji wysyBajcych dane wykonywana jest " begin()  ustalenie prdko[ transmisji, wskazuje na typ danych. Na listingu 1 po- instrukcja bajt++ zwikszajca o 1 warto[ " end()  wyBczenie transmisji szeregowej, kazano przykBadowy program obsBugujcy zmiennej bajt. Po wysBaniu tablicy wyko- " available()  pobranie liczby otrzyma- komunikacj za pomoc interfejsu szerego- nywane s instrukcje w nieskoDczonej ptli nych bajtów, wego. Program wysyBa tablice znaków ASCII. while(1). W warunku if (Serial.available() > " read()  odbiór ramki danych, Ma równie| mo|liwo[ odebrania kodu zna- 0) za pomoc funkcji available() sprawdzane " peek()  odczyt kolejnego znaku z bufora, ku którego nastpnie odsyBa w formie dzie- jest czy zostaB otrzymany jakikolwiek znak. " flush()  opró|nienie bufora odbiornika, sitnej i szesnastkowej. Wtedy funkcja zwraca warto[ wiksz od " print()  wysBanie znaku, W pierwszej kolejno[ci w programie za 0. Je[li tak jest wykonywana jest instrukcja " println()  wysyBanie cigu znaków z ko- pomoc funkcji Serial.begin(9600) konfi- bajt = Serial.read() odbierajca otrzyman dami koDca i nowej linii, gurowana jest prdko[ transmisji na 9600 warto[ i zapisuje ja do zmiennej bajt. W ko- " write()  wysBanie bajtu. bodów. Funkcja Serial.println drukuje nagBó- lejnych instrukcjach wysyBana jest otrzyma- Zazwyczaj czsto u|ywa si funkcji wek tablicy ASCII. Nastpnie zmienna bajt na warto[ w bajt w formie dziesitnej oraz print() lub println() umo|liwiajcych prze- o pocztkowej warto[ci 33 wskazuje pocz- szesnastkowej. Na rysunku 1 pokazano dzia- sBanie cigu znaków. Kilka przykBadów za- tek kodów ASCII. Nastpnie w programie Banie programu obsBugujcego komunikacj mieszczono ni|ej: wykonywane s instrukcje w ptli while- szeregow z u|yciem interfejsu RS232. Serial.print(78, BYTE) da  N (bajt<127), która jest wykonywana a| war- Serial.print(78, BIN) da to[ bajt jest mniejsza od 127. W ptli wyko- ObsBuga wy[wietlacza LCD  1001110 nywane s instrukcje drukujce kody tablicy Ka|dy system musi wskazywa u|ytkow- Serial.print(78, OCT) da  116 ASCII w formacie tekstowej, dziesitnej oraz nikowi swoje dziaBanie i rezultaty obliczeD. ELEKTRONIKA PRAKTYCZNA 12/2011 99 KURS Listing 1. PrzykBadowy program obsBugujcy komunikacj za pomoc interfejsu szeregowego void setup() //procedura konfigurujca { Serial.begin(9600); //konfigurowanie prdko[ci transmisji Serial.println( Tablica kodow ASCII ); //wysBanie tekstu } int bajt = 33; //zmienna kodów ASCII z warto[ci pocztkow tablicy 33 void loop() //procedura programu gBównego { while(bajt<127) //ptla wykonywana a| bajt mniejszy od 127 { Serial.print(bajt, BYTE); //wysBanie znaku z warto[ci BYTE Serial.print( , dec:  ); //wysBanie opisu warto[ci DEC Serial.print(bajt); //wysBanie znaku Serial.print( , hex: 0x ); //wysBanie opisu HEX Serial.println(bajt, HEX); //wysBanie warto[ci w formie HEX bajt++; //zwikszenie o 1 warto[ci zmiennej bajt } while(1) //pocztek nieskoDczonej ptli { if (Serial.available() > 0) { //je[li odebrano bajt danych z interfejsu RS232 to bajt = Serial.read(); //odczyt odebranego znaku do zmiennej bajt Serial.print( dec:  ); //wysBanie opisu Serial.print(bajt); //wysBanie odebranego znaku Serial.print( , hex: 0x ); //wysBanie opisu HEX Serial.println(bajt, HEX); //wysBanie odebranego znaku w formie HEX } } } Listing 2. PrzykBadowy program obsBugujcy wy[wietlacz LCD Rysunek 1. Ekran programu terminala #include <LiquidCrystal.h> //biblioteka obsBugi LCD z danymi przesBanymi za pomoc RS232 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //konfigurowanie linii do których doBczono LCD int wart_temp=24; //przykBadowa zmienna z zapisan warto[ci temperatury byte st[8] = { //tablica znaku stopnia dla wy[wietlacza LCD Bardzo czsto do tego celu s wykorzystywa- B00100, ne wy[wietlacze. Dlatego te| zostanie poka- B01010, B00100, zana obsBuga wy[wietlacza LCD w Arduino B00000, B00000, z wykorzystaniem moduBu AVTDuino LCD. B00000, ModuB ten wyposa|ono w wy[wietlacz, kilka B00000, }; przycisków oraz diody LED. Do obsBugi wy[wietlaczy z kontrolerem void setup() { //funkcja inicjalizacji lcd.begin(16, 2); //konfiguracja rozdzielczo[ci wy[wietlacza LCD HD44780 w Arduino IDE jest przeznaczona lcd.createChar(0, st); //funkcja utworzenia wBasnego znaku z tablicy st o kodzie 0 biblioteka LiquidCrystal (LCD) która dziaBa } ze sterowaniem LCD 4-bitowym lub 8-bito- void loop() { //ptla gBówna programu lcd.clear(); //czyszczenie LCD wym. Ma ona nastpujce funkcje: lcd.setCursor(2, 0); //ustawienie kursora w 2 kolumnie pierwszego wiersza lcd.print( Arduino w EP ); //wy[wietlenie napisu " LiquidCrystal()  definiuje piny do któ- lcd.setCursor(0, 1); // 1 kolumna, 2 wiersz rych zostaB doBczony LCD, lcd.print( Temp:  ); //wy[wietlenie na LCD napisu Temp: lcd.print(wart_temp); //wy[wietlenie zmiennej wart_temp " begin()  definiuje rozdzielczo[ zastoso- lcd.write(0); //wy[wietlenie znaku stopnia wanego LCD, lcd.print( C ); //wy[wietlenie znaku C lcd.setCursor(12, 1); //12 kolumna, 2wiersz " clear()  czy[ci ekran LCD, lcd.cursor(); //wBczenie kursora lcd.blink(); //wBczenie migajcego kursora " home()  ustawia kursor na pocztku while(1); //ptla nieskoDczona ekranu LCD, } //koniec ptli gBównej " setCursor()  ustawia kursor w zadanym miejscu LCD, " write()  zapisuje znak do LCD, " print()  zapisuje znak lub znaki do LCD, " cursor()  wBcza kursor, " noCursor()  wyBcza kursor, " blink()  wBcza migajcy kursor, " noBlink()  wyBcza migajcy kursor, " display()  wBcza ekran LCD, " noDisplay()  wyBcza ekran LCD, " scrollDisplayLeft()  przesuwa zawarto[ LCD w lewo, " scrollDisplayRight()  przesuwa zawar- to[ LCD w prawo, " autoscroll()  automatyczne przesuwanie zawarto[ci na LCD, " noAutoscroll()  wyBczenie automatycz- nego przesuwania zawarto[ci na LCD, " leftToRight()  ustawia kierunek zapisu tekstu od prawej do lewej, " rightToLeft()  ustawia kierunek zapisu tekstu od lewej do prawej, 100 ELEKTRONIKA PRAKTYCZNA 12/2011 Kurs programowania Arduino " createChar()  umo|liwia definicje wBa- Listing 3. PrzykBadowy program do obsBugi linii I/O const int Led1 = 13; //definiowanie aliasów snego znaku. const int Led2 = 12; PrzykBadowy program obsBugujcy wy- const int Led3 = 11; const int Led4 = 10; [wietlacz LCD pokazany zostaB na listingu 2. const int SW1 = 3; Wy[wietla on na wy[wietlaczu kilka przy- const int SW2 = 2; const int SW3 = 1; kBadowych komunikatów wraz z przykBa- const int SW4 = 0; const int Buzzer = A5; dem wy[wietlenia wBasnego zdefiniowanego znaku. void setup() { //funkcja inicjalizacji pinMode(Led1, OUTPUT); //Konfiguracja linii do których s doBczone diody W pierwszej kolejno[ci w programie jako wyj[cia wykonywana jest instrukcja #include <Li- pinMode(Led2, OUTPUT); pinMode(Led3, OUTPUT); quidCrystal.h> doBczajca do programu pinMode(Led4, OUTPUT); pinMode(Buzzer, OUTPUT); //linia I/O sterujca brzczyk bibliotek obsBugujc LCD. Za pomoc pinMode(SW1, INPUT); //linie wej[ciowe przycisków funkcji LiquidCrystal lcd(8, 9, 4, 5, 6, 7) s pinMode(SW2, INPUT); pinMode(SW3, INPUT); konfigurowane linie, do których doBczono pinMode(SW4, INPUT); wy[wietlacz. Zmienna wart_temp o warto- digitalWrite(SW1, HIGH); //doBczenie rezystorów podcigajcych digitalWrite(SW2, HIGH); [ci domy[lnej  24 zawiera liczb, która b- digitalWrite(SW3, HIGH); digitalWrite(SW4, HIGH); dzie interpretowana jako temperatura 24°C. digitalWrite(Led1, HIGH); // wyBczenie diód LED W tablicy byte st[8] zdefiniowano znak stop- digitalWrite(Led2, HIGH); digitalWrite(Led3, HIGH); nia. Tablica ta odzwierciedla wygld znaku, digitalWrite(Led4, HIGH); gdzie bit ustawiony oznacza piksel wBczo- digitalWrite(Buzzer, HIGH); // wyBczenie brzczyka } ny, a wyzerowany  wyBczony. W funkcji void loop() { //ptla gBówna konfiguracyjnej jest wywoBywana procedura if (digitalRead(SW1) == LOW) { //Sprawdzenie czy naci[nity S1 lcd.begin(16, 2) okre[lajca typ wy[wietla- digitalWrite(Led1, LOW); //za[wiecenie LED1 while(digitalRead(SW1) == LOW); //oczekiwanie na zwolnienie S1 cza. Wy[wietlacz zostaB skonfigurowany jako } 2 wiersze po 16 znaków. Funkcja lcd.create- else { //w przeciwnym razie digitalWrite(Led1, HIGH); //wyBczenie diody LED1 Char(0, st) przesyBa do wy[wietlacza defini- } cj znaku zapisanego w tablicy st o kodzie 0 if (digitalRead(SW2) == LOW) { //Sprawdzenie czy naci[niety S2 (znak stopnia). while(digitalRead(SW2) == LOW) //je[li wci[nity { Umieszczona na pocztku programu digitalWrite(Led2, LOW); //wBczenie LED2 gBównego instrukcja lcd.clear() czy[ci ekran delay(200); //opóznienie 200 ms digitalWrite(Led2, HIGH); //wyBczenie LED2 LCD. Nastpnie, funkcja lcd.setCursor(2, 0) ustawia jest kursor w pierwszej linii i trze- REKLAMA ciej kolumnie. Dalej, za pomoc funkcji lcd. print() jest wy[wietlany jest w pierwszej linii LCD przykBadowy tekst. Nastpnie kursor zostaje ustawiony w drugiej linii LCD i jest wy[wietlany komunikat Temp: oraz warto[ zmiennej wart_temp. Funkcja lcd.write(0) wy- [wietla wcze[niej zdefiniowany znak stopnia o kodzie 0. Na koDcu programu zostaje wy- [wietlony kursor, a za pomoc komendy lcd. blink() jest wBczane jego migotanie. ObsBuga cyfrowych linii I/O ObsBuga linii cyfrowych mikrokontrolera w gBównej mierze polega na konfiguracji ich czy maj pracowa jako wyj[cia lub wej[cia z rezystorem podcigajcym. Do konfiguracji kierunku pracy linii cyfrowej sBu|y komenda pinMode(), do zapisu stanu linii digitalW- rite() a odczytu digitalRead(). Na listingu 3 pokazano przykBad programu który obsBugu- je wyj[cia do których doBczono diody LED, generator PIEZO oraz 4 przyciski które s dostpne w module AVTDuino LCD. Przy- cisk S1 powoduje zapalenie LED1, przycisk S2 miganie LED2. Po naci[niciu przycisku S3 generowany jest kod Morse A SOS a na- ci[nicie S4 generuje efekt [wietlny biegn- cego [wiatBa. Za pomoc komendy const przypisano nazwy wyprowadzeniom I/O, do których do- Bczono diody, przyciski oraz brzczyk. Linie, 50-506 WrocBaw, ul. Pikna 58a, www.wago.com do których doBczono diody oraz brzczyk s skonfigurowane jako wyj[ciowe, a linie do ELEKTRONIKA PRAKTYCZNA 12/2011 101 KURS których doBczono przyciski  wej[ciowe. Listing 3. c.d. delay(200); //opoznienie 200 ms Dodatkowo, do linii wej[ciowych za pomoc } komend digitalWrite() doBczono rezystory } else { //w przeciwnym razie podcigajce. Przyci[nicie przycisku spowo- digitalWrite(Led2, HIGH); //wyBczenie diody LED2 duje wyzerowanie poziomu na wej[ciu. } if (digitalRead(SW3) == LOW) { //sprawdzenie czy naci[niety S3 W ptli gBówniej programu, instrukcja while(digitalRead(SW3) == LOW) //je[li wci[nity warunkowa if (digitalRead(SW1) == LOW) { for (int i=0; i<3; i++) { //ptla generujca trzy kropki sprawdza czy naci[nito przycisk S1. Je[li digitalWrite(Led3, LOW); //wBczenie LED3 tak, to przez wyzerowanie odpowiedniej li- digitalWrite(Buzzer, LOW); //wBczenie brzczyka delay(150); // opoznienie 150 ms nii zostaje za[wiecona dioda LED1. W ptli digitalWrite(Led3, HIGH); // wyBczenie LED3 while(digitalRead(SW1) == LOW) program digitalWrite(Buzzer, HIGH); //wyBczenie brzczyka delay(100); // opóznienie 100 ms czeka na zwolnienie przycisku S1. Po jego } zwolnieniu, dioda LED1 zostaje zgaszona for (int i=0; i<3; i++) { //ptla generujca trzy kreski digitalWrite(Led3, LOW); //wBczenie LED3 (instrukcje w klauzuli else). W kolejnym digitalWrite(Buzzer, LOW); //wBczenie brzczyka warunku jest rozpatrywany stan przycisku delay(400); //opóznienie 400 ms digitalWrite(Led3, HIGH); //wyBczenie LED3 S2. Po jego wci[niciu dioda LED2 migo- digitalWrite(Buzzer, HIGH); //wyBczenie brzczyka cze, za co odpowiada ptla while(digital- delay(100); // opóznienie 100 ms } Read(SW2) == LOW). Po wci[niciu przy- for (int i=0; i<3; i++) { //ptla generujca trzy kropki cisku S3 jest generowany sygnaB [wietlny digitalWrite(Led3, LOW); //wBczenie LED3 digitalWrite(Buzzer, LOW); //wBczenie brzczyka oraz dzwikowy SOS. Instrukcje w pierw- delay(150); // opoznienie 150 ms szej ptli for generuj trzy kropki, w kolej- digitalWrite(Led3, HIGH); //wyBczenie LED3 digitalWrite(Buzzer, HIGH); //wyBczenie brzczyka nej trzy kreski, a w ostatniej ponownie trzy delay(100); //opóznienie 100 ms } kropki. Generowanie sygnaBu SOS powtarza delay(2000); //opóznienie 2 sekundy si co 2 sekundy (instrukcja delay(2000)). } } Po przyci[niciu przycisku S4, za pomoc else { //w przeciwnym razie diod LED1& LED4, jest wy[wietlany pewien digitalWrite(Led3, HIGH); //wyBczenie diody LED3 digitalWrite(Buzzer, HIGH); //wyBczenie brzczyka efekt [wietlny. } if (digitalRead(SW4) == LOW) { //sprawdzenie czy wci[niety S4 while(digitalRead(SW4) == LOW) //je[li przyci[nity ObsBuga linii analogowych { Mikrokontroler zestawu Arduino UNO digitalWrite(Led1, LOW); //wBczenie LED1 delay(100); //opóznienie 100 ms ma wej[cia analogowe oznaczone A0& A5. digitalWrite(Led2, LOW); //wBczenie Led2 Warto[ci napi doprowadzone do nich delay(100); digitalWrite(Led3, LOW); //wBczenie LED3 mog by zmierzone przez przetwornik A/C. delay(100); Na listingu 4 zamieszczono program mierz- digitalWrite(Led4, LOW); //wBczenie LED4 delay(100); cy i wy[wietlajcy napicie z potencjometru digitalWrite(Led1, HIGH); //wyBczenie LED1 znajdujcego si w module AVTDuino LCD delay(100); digitalWrite(Led2, HIGH); //wyBczenie Led2 i doBczonego do linii A0. delay(100); W pierwszej kolejno[ci tworzone s digitalWrite(Led3, HIGH); //wyBczenie LED3 delay(100); zmienne, w których bdzie zapamitana digitalWrite(Led4, HIGH); //wyBczenie LED4 warto[ zmierzona i odczytana z przetwor- delay(100); } nika A/C oraz napicie obliczone na jej } podstawie. Z wykorzystaniem funkcji ana- delay(300); } //koniec ptli gBównej programu logReference(DEFAULT) konfigurowane jest napicie odniesienia dla przetwornika A/C. Listing 4. PrzykBadowy program mierzcy napicie na wyj[ciu potencjometru Wybrano warto[ domy[ln, to jest 5 V  na- #include <LiquidCrystal.h> //biblioteka obsBugi LCD picie zasilajce. Tym samym zakres mie- LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //konfigurowanie LCD rzonych napi zostaje ustalony na 0& 5 V. int wart_pot; //zmienna na warto[ zmierzon Komenda analogRead(A0) uruchamia po- float wart_nap; //zmienna na warto[ zmierzonego napicia miar napicia na linii A0 i odczyt zmierzo- void setup() { //funkcja inicjalizacji nej warto[ci z przetwornika A/C. Warto[ ta lcd.begin(16, 2); //liczba kolumn i liczba linii LCD jest zapamitywana w zmiennej wart_pot. analogReference(DEFAULT); //napicie odniesienia dla przetwornika A/C Na jej podstawie wylicza si warto[ zmie- //(domy[lnie 5V) } rzonego napicia za pomoc wyra|enia void loop() { //ptla gBówna programu wart_nap=(5.0*wart_pot)/1024.0, w którym lcd.clear(); //czyszczenie LCD warto[  5 to napicie odniesienia dla A/C, lcd.setCursor(3, 0); natomiast  1024 to rozdzielczo[ przetwor- lcd.print( Analog I/O ); //wy[wietlenie na LCD napisu Analog I/O wart_pot = analogRead(A0); //pomiar napicia nika. Obliczona warto[ napicia jest zapa- wart_nap=(5.0*wart_pot)/1024.0; //konwersja liczny na napicie mitywana w zmiennej wart_nap. W ko- lcd.setCursor(0, 1); lejnych instrukcjach, warto[ci odczytana lcd.print( U= ); //wy[wietlenie napisu U= lcd.print(wart_nap); //wy[wietlenie napicia z potencjometru i obliczona s wy[wietlane w drugiej linii lcd.print( V ); //wy[wietlenie znaku V wy[wietlacza LCD. Ka|da zmiana poBo|enia lcd.setCursor(8, 1); osi potencjometru bdzie powodowa zmia- lcd.print( A/C= ); //wy[wietlenie napisu A/C= n napicia mierzonego przez przetwornik lcd.print(wart_pot); //wy[wietlenie zmierzonej warto[ci przez A/C delay(300); //opóznienie 300ms A/C. } //koniec ptli gBównej programu Marcin Wizania, EP 102 ELEKTRONIKA PRAKTYCZNA 12/2011

Wyszukiwarka

Podobne podstrony:
Kurs Arduino 2 Oprogramowanie Arduino IDE(1)
Kurs Arduino cz3
Kurs Arduino cz5
Kurs Arduino cz4
Kurs Arduino cz2
Kurs Arduino 4 Obsluga modulu LED
Kurs Arduino cz1
Kurs Arduino
Kurs Arduino 3 Obsluga modulu LCD
Kurs Arduino 5

więcej podobnych podstron