Bezpłatna biblioteka techniczna ENCYKLOPEDIA RADIOELEKTRONIKI I INŻYNIERII ELEKTRYCZNEJ Arduino. Cyfrowe operacje wejścia/wyjścia. Encyklopedia elektroniki radiowej i elektrotechniki Encyklopedia radioelektroniki i elektrotechniki / Projektant radioamatorów Po załadowaniu środowiska programistycznego Arduino IDE widać, że szablon przyszłego programu wyświetlony w oknie, które zostanie otwarte, zawiera dwie funkcje: setup() i pętlę(). Funkcja setup() uruchamia pracę dowolnego programu. Wykonuje ją jednorazowo zaraz po włączeniu zasilania płytki, a także każdorazowo po naciśnięciu przycisku RESET na płytce, co przywraca mikrokontroler do stanu początkowego. Wewnątrz tej funkcji ustawia się tryby pracy portów, inicjuje się interfejs szeregowy oraz inne urządzenia peryferyjne, zarówno te znajdujące się wewnątrz mikrokontrolera, jak i podłączone do niego zewnętrzne. Funkcja ta, nawet jeśli jest pusta, musi być obecna w programie. Funkcja pętli() zawiera nieskończoną pętlę, którą mikrokontroler wykonuje wielokrotnie, aż do wyłączenia zasilania. Odpytuje czujniki zewnętrzne, wysyła polecenia do elementów wykonawczych, wykonuje obliczenia i inne operacje. Jako przykład podamy prosty program, który zapala, a następnie wyłącza diodę LED wbudowaną w płytkę Arduino, oznaczoną na niej literą L i podłączoną do cyfrowego pinu D13, z okresem jednej sekundy. Ten program jest jednym ze standardowych przykładów dołączonych do Arduino IDE. W tabeli 1 pokazuje jego tekst w formie, w jakiej jest załączony. Należy pamiętać, że w żargonie przyjętym wśród fanów Arduino kod źródłowy programu nazywany jest „szkicem” – szkicem. Tabela 1 Fragmenty programu należące do tego samego bloku oddzielane są nawiasami klamrowymi { i }. W dalszej części będziemy je nazywać nawiasami operatorowymi. Tekst programu może zawierać komentarz wyjaśniający jego istotę i niuanse pracy. Komentarze wielowierszowe są ograniczone do kombinacji /* (na początku) i */ (na końcu). Znaki // rozpoczynają komentarz kończący się na końcu tej samej linii. Podczas tłumaczenia (konwersji tekstu programu w języku programowania zrozumiałym dla człowieka na kod maszynowy wykonywany przez mikrokontroler) ta część tekstu jest całkowicie ignorowana. Jedyna wykonywalna linia w ciele funkcji setup() pinMode(13, WYJŚCIE); ustawia pin D13 płyty Arduino w tryb wyjścia. Funkcja loop() zaczyna się od wiersza zapis cyfrowy(13, WYSOKI); Ustawia pin D13 na wysoki poziom logiczny. W Arduino UNO jest ono równe napięciu zasilania (+5 V) względem przewodu wspólnego. Spowoduje to włączenie diody LED. Po nim następuje linia opóźnienie (1000); Powoduje, że wykonujący program nie przechodzi do następnej linii przez czas podany w nawiasach w milisekundach. Po przerwie program ustawia wyjście D13 na niski poziom logiczny odpowiadający potencjałowi przewodu wspólnego, co powoduje wyłączenie diody LED. Operację tę opisuje linia zapis cyfrowy(13, LOW); Następnie program ponownie robi pauzę na 1 sekundę, po czym powtarza od początku całą sekwencję operacji opisaną w treści funkcji pętli(). Trwa to do momentu wyłączenia mikrokontrolera. Funkcji opóźnienia() należy używać ostrożnie. Jeżeli w określonym w nim przedziale czasu nastąpi jakieś ważne zdarzenie (np. na krótko zadziała czujnik), program nie zareaguje na to zdarzenie. Należy pamiętać, że maksymalny prąd dostarczany przez pin Arduino pełniący funkcję wyjścia wynosi 40 mA, a sumaryczny prąd wszystkich wyjść nie powinien przekraczać 300 mA. To wystarczy do zasilania zwykłych diod LED, można też bezpośrednio podłączyć do wyjścia kontaktron niskiego napięcia lub silnik wibracyjny małej mocy z telefonu komórkowego. Bez wzmacniacza nie da się podłączyć nic mocniejszego, a to jest niebezpieczne - można uszkodzić mikrokontroler. Wejścia analogowe A0-A5 mogą być, jeśli to konieczne, używane razem z D0-D13 jako wejścia i wyjścia cyfrowe, uzyskując do nich dostęp odpowiednio pod numerami od 14 do 19. Teraz zmodyfikujmy trochę program. Dla tak prostego algorytmu te modyfikacje nie są istotne, natomiast w bardziej skomplikowanych przypadkach takie zmiany są istotne. Przede wszystkim zamieńmy komentarz w języku angielskim na rosyjski. Na przykład skomentujemy linię włączającą diodę LED w następujący sposób: „Włącz diodę LED”. Nie należy pisać: „Ustawiamy wysoki poziom w linii D13”, wynika to już z tekstu programu. Oczywiście szczegółowy komentarz do każdej linijki jest zwykle zbędny, ale mimo to nie powinieneś się lenić, pisząc go. Po pewnym czasie szczegóły działania programu zostaną zapomniane, nawet samemu autorowi pomoże jedynie komentarz, aby szybko zrozumieć jego istotę. Następnie zmienimy program tak, aby dioda podłączona nie do pinu D13, a do pinu D12 Arduino, migała. Ponieważ na płytce podłączonej do D12 nie ma diody LED, potrzebna będzie zewnętrzna dioda LED z dodatkowym rezystorem. Należy go podłączyć zgodnie ze schematem pokazanym na rys. 1. Rezystor dodatkowy dobieramy tak, aby dioda LED punkt-punkt znajdowała się w zakresie 5...10 mA. Dzięki temu większość diod LED będzie wystarczająco jasna. Płytkę Arduino UNO z podłączoną zewnętrzną diodą LED pokazano na rys. 2.
Wskazane jest wykonanie kilku diod LED z dodatkowymi rezystorami. Przydadzą się nie tyle do wykonania maszyny do efektów świetlnych, ile do szybkiego sprawdzenia poziomów napięć na wyjściach płytki i monitorowania ich zmian zgodnie z debugowanym programem. Aby sterować diodą LED podłączoną nie do D13, a do D12, w rozpatrywanym przypadku wystarczyłoby w tekście programu poprawić wszystkie cyfry 13 na 12. Nie licząc komentarzy, liczba 13 pojawia się tylko w tekście programu trzy razy, więc zmiana nie jest trudna. Jednak wraz ze wzrostem wolumenu programu sytuacja ulega zasadniczej zmianie. Zastąpienie trzech liczb to jedno, a zastąpienie kilkudziesięciu identycznych liczb w różnych miejscach długiego programu to zupełnie inna sprawa. Poza tym może się okazać, że gdzieś ta liczba oznacza coś zupełnie innego i nie ma potrzeby jej zmieniać. Aby ułatwić dokonanie takich zmian, na początku programu deklarujemy zmienną i przypisujemy jej wartość odpowiadającą numerowi żądanego pinu: wewn. LEDPIN = 12; Dodatkowo, gdziekolwiek pojawi się pin numer 13, zastąpimy go nazwą tej zmiennej. Jeśli teraz zajdzie potrzeba ponownej zmiany połączenia LED, wystarczy zmienić tylko jedną cyfrę w opisie zmiennej LEDPIN. Zmodyfikowany program pokazano w tabeli. 2. Należy go załadować do pamięci mikrokontrolera płytki Arduino. W tym celu z głównego menu IDE wybierz opcję „Plik → Załaduj”. Jeżeli program wpisany w oknie edycji nie został wcześniej zapisany do pliku, IDE poprosi o podanie nazwy pliku, w którym ma zostać zapisany. Po pewnym czasie wymaganym przez Arduino IDE do przetłumaczenia programu na kody maszynowe zrozumiałe dla mikrokontrolera, diody „Rx” i „Tx” na płytce zaczną migać, sygnalizując odbiór i transmisję komunikatów poprzez interfejs szeregowy układu mikrokontroler. Tabela 2 Jeżeli wszystko zostało wykonane poprawnie, na dole okna programu pojawi się raport informujący o poprawnym załadowaniu. Wyświetli informację o tym, ile z dostępnych 32 KB pamięci programu mikrokontrolera zostało zajęte przez załadowany program oraz ile pamięci RAM potrzeba na przyjęcie zmiennych. Dioda podłączona do pinu D12 zacznie migać co 2 s. Jeżeli podłączymy linię pięciu diod LED do pinów D8-D12 Arduino (rys. 3) i załadujemy do mikrokontrolera program podany w tabeli. 3, będzie naprzemiennie włączać na 500 ms każdą z tych diod oraz diodę podłączoną do D13 zainstalowanego na płytce. Ten program mógłby okazać się znacznie dłuższy, gdyby problem został rozwiązany bezpośrednio, po prostu powtarzając wymaganą liczbę razy w wierszach funkcji setup() z różnymi numerycznymi numerami pinów, ustawiając je na wyjście i w funkcja pętli() - sekwencja linii zawierająca następną diodę LED, pauzę i jej wyłączenie. Operatory pętli for pomogły skrócić program.
Tabela 3 W nawiasach po słowie kluczowym for podana jest wartość początkowa zmiennej pętli - LEDPIN=8, warunek wykonania treści pętli - LEDPIN<14 oraz operacja wykonywana na zmiennej pętli po każdym wykonaniu jej treści - LEDPIN++, która oznacza zwiększenie wartości zmiennej o jeden. W razie potrzeby parametry pętli for można łatwo zmienić. Treść pętli w nawiasach operatorowych jest zgodna z warunkiem. W pierwszym przypadku (w funkcji setup()) składa się z pojedynczej linii, która zostanie wykonana sześciokrotnie z wartościami LEDPIN od 8 do 13. W drugim przypadku (w funkcji pętli()) pętla instrukcja określa sześciokrotne wykonanie sekwencji trzech linii z takimi samymi wartościami zmiennych. Oprócz sterowania urządzeniami zewnętrznymi w dowolnym systemie konieczne jest pozyskiwanie informacji z różnych czujników. Bez nich nawet najbardziej skomplikowany robot będzie jedynie nakręcaną zabawką, niezdolną do zmiany swojego zachowania w zależności od warunków zewnętrznych. Przy napięciu zasilania 5 V, a w Arduino UNO właśnie tak jest, wejścia cyfrowe mikrokontrolera z pewnością będą odbierane jako logicznie wysokie (odpowiadające logicznemu) napięcie większe niż +3 V, a jako logicznie niskie (odpowiadające zeru logicznemu) napięcie mniejsze niż +1,5 V Wartości pośrednie (także gdy wejście nie jest nigdzie podłączone) dają nieprzewidywalny, chaotycznie zmienny wynik w zależności od instancji mikrokontrolera, jego napięcia zasilania, temperatury i innych czynników . Dlatego pożądane jest, aby na wejście cyfrowe zawsze podawane było napięcie o znanym wysokim lub niskim poziomie logicznym. Najprostszym czujnikiem jest zwykły przycisk bez blokady, podłączony jak pokazano na rys. 4 do jednego z zewnętrznych pinów płytki Arduino, w tym przypadku do D7. Po zwolnieniu przycisku SB1 poziom napięcia na wejściu mikrokontrolera będzie niski (zapewnia go rezystor R1), po naciśnięciu będzie wysoki. Jeśli zamienisz przycisk i rezystor (ryc. 5), poziomy również zamienią się miejscami. Teraz rezystor R1 po zwolnieniu przycisku zapewni wysoki poziom, a naciśnięcie go ustawi poziom niski.
Rezystancja rezystora R1 nie powinna być zbyt mała, ponieważ przepływający przez niego prąd po naciśnięciu przycisku jest pobierany ze źródła zasilania i zmniejsza wydajność urządzenia. W przypadku zasilania z komputera stacjonarnego lub zasilacza sieciowego nie jest to aż tak istotne, jednak w przypadku Arduino zasilanego bateryjnie, niska rezystancja rezystora R1 znacznie skróci możliwą żywotność baterii urządzenia. Należy pamiętać, że mikrokontroler posiada wewnętrzne rezystory, które pełnią funkcję rezystora R1. Domyślnie są one wyłączone. Aby jednak podłączyć np. wewnętrzny rezystor do wejścia D2 wystarczy dodać linię do funkcji setup() tryb pin(2, INPUT_PULLUP); Rozważmy wejście cyfrowe na przykładzie podanym w tabeli. 4 programy gaszące diodę podłączoną do pinu 13 po naciśnięciu przycisku podłączonego do pinu D7. Opiera się na operatorze warunkowym if (stan) { /*Działania w przypadku spełnienia warunku*/ } więcej { /*Działania w przypadku niespełnienia warunku*/ } Tabela 4 Służy do wyboru akcji w zależności od tego, czy określony w niej warunek zostanie spełniony, czy nie. Jeśli nie trzeba nic robić, jeśli warunek nie jest spełniony, fragment else {...} można pominąć. Użycie instrukcji warunkowych zapewnia elastyczność programu. W zależności od stanu czujników zewnętrznych zmieniają one kolejność programu i zachowanie urządzenia wyposażonego w mikrokontroler. Właściwe sprawdzenie stanu przycisku jest wykonywane przez operatora logicznego digitalRead (A) = WYSOKI W tym przypadku porównuje wartość zwróconą przez funkcję odczytu stanu pinu ALE, do którego podłączony jest przycisk, ze stałą logiczną HIGH i jeśli są one równe, ocenia na PRAWDA, a w przeciwnym razie na FAŁSZ. Należy zauważyć, że operacja testu równości jest oznaczona dwoma kolejnymi znakami równości. A jeden znak równości oznacza operację przypisania wartości zmiennej. Nie należy ich mylić, gdyż prowadzi to do błędów trudnych do wykrycia. Na przykładzie omówionego właśnie programu łatwo zobaczyć, do czego prowadzi niedokładne użycie funkcji opóźnienia(). Jeżeli w przedostatniej linii programu „odkomentujesz” (usuniesz dwa poprzedzające miejsca po przecinku) funkcję opóźnienia (10000), to po każdym wykonaniu treści funkcji pętli () program będzie odczekał 10 s przed kontynuowaniem pracy . Oczywiście wszystkie naciśnięcia przycisków w tym okresie zostaną zignorowane. Bardzo przydatna jest możliwość komunikacji Arduino z komputerem osobistym poprzez interfejs szeregowy. Można go wykorzystać nie tylko do załadowania programu do mikrokontrolera, ale także do dwustronnej wymiany informacji w trakcie jego wykonywania. Za pośrednictwem tego interfejsu Arduino może przesyłać zebrane informacje do komputera w celu złożonego przetwarzania lub przechowywania oraz odbierać z niego polecenia i nieprzetworzone dane. W ten sposób dwa urządzenia mikrokontrolerowe mogą ze sobą współdziałać. Port szeregowy mikrokontrolera wykorzystuje cyfrowe piny płytki D0 i D1, zatem organizując i korzystając z komunikacji poprzez port szeregowy, nie można ich wykorzystać do niczego innego. Rozważmy na przykład program podany w tabeli. 5, który przekazuje informację o stanie pinu D12 do komputera. Jeśli poziom jest wysoki, program wysyła do komputera kod znaku H, a jeśli jest niski, kod znaku L. Każdy program, który może współpracować z portem COM komputera, może otrzymać tę informację. Arduino IDE posiada wbudowany monitor portu szeregowego, za pomocą którego komputer może wyświetlać komunikaty tekstowe otrzymane z płytki Arduino oraz przesyłać komunikaty wpisywane przez użytkownika na klawiaturze komputera. Tabela 5 Linia Serial.begin(9600) w funkcji setup() inicjuje port szeregowy mikrokontrolera i ustawia prędkość transmisji i odbioru na 9600 bodów. Można ustawić inne standardowe wartości prędkości: 1200, 2400, 4800, 9600, 19200, 38400, 57600 lub 115200 bodów. W tym przypadku prędkość ustawiona w mikrokontrolerze musi być zgodna z prędkością, z jaką skonfigurowany jest port COM komputera lub innego urządzenia, z którym ma być wymieniana informacja. Dopuszczalna prędkość, z jaką zapewniony jest niezawodny odbiór informacji, zależy od długości kabla łączącego Arduino z komputerem. Przykładowo, korzystając ze standardowego kabla USB o długości 1,8 m, komputer będzie odbierał informacje z Arduino nawet z prędkością 115200 bodów. A jeśli do tego kabla dodamy pięciometrowy przedłużacz, dopuszczalna prędkość spadnie do 4800 bodów. Funkcja Seri-al.print() wysyła informację na port szeregowy, gdzie w nawiasie podaje nazwę zmiennej, której wartość Send ma zostać przesłana, lub ciąg znaków do przesłania. Aby odróżnić ją od nazwy zmiennej, ciąg znaków ujęto w cudzysłów. Istnieje modyfikacja tej funkcji Serial.println(). Różni się tym, że po przesłaniu informacji zawartych w nawiasach (jeśli występują), uzupełnia je znakami powrotu karetki i przejścia do wiersza. Rozpoczyna nową linię i kombinację znaków w przesyłanym ciągu. Korzystając z powyższego programu łatwo sprawdzić, że jeśli na pin mikrokontrolera skonfigurowanego jako wejście nie zostaną podane żadne zewnętrzne sygnały, to jego stan może być dowolny i zmieniać się chaotycznie w trakcie pracy. Można także określić rzeczywistą wartość napięcia, którą mikrokontroler przestaje postrzegać jako niski poziom logiczny i zaczyna postrzegać jako poziom wysoki. Następnie rozważmy program (tabela 6), który zapala i wyłącza diodę LED na płytce zgodnie z poleceniami otrzymanymi z komputera przez port szeregowy. Należy pamiętać, że informacje przez port szeregowy przesyłane są w bajtach. Odbiornik portu szeregowego, działający niezależnie od procesora mikrokontrolera, odbiera te bajty i przechowuje je w swoim 64-bajtowym buforze. 6 stołowy. Aby program mógł określić, czy w buforze znajdują się odebrane bajty, dostępna jest funkcja Serial.available(), która zwraca ich liczbę. Jeśli tak, program używa metody Serial. read() odczytuje bajt z bufora i przypisuje jego wartość (kod odebranego znaku) do zmiennej C typu char. Następnie instrukcje warunkowe porównują kod z próbkami i, jeśli istnieje dopasowanie, włączają lub wyłączają diodę LED. Polecenia można wysyłać za pomocą tego samego monitora portu szeregowego, który był używany do odbierania informacji. W górnej części jego okna (rys. 6) znajduje się linia służąca do wprowadzania przesyłanych znaków. Po wprowadzeniu z klawiatury symbolu lub jego sekwencji kliknij przycisk ekranowy „Wyślij”. Dioda „Rx” na płytce Arduino powinna krótko migać, wskazując, że mikrokontroler odbiera informacje. Oczywiście ręczne przesyłanie kodów jest prostą, ale daleką od najlepszej metodą kontroli. Zwykle pisany jest w tym celu specjalny program komputerowy sterujący.
Tym samym wykorzystując płytkę mikrokontrolera Arduino można stosunkowo łatwo stworzyć całą gamę prostych urządzeń elektronicznych. Jeśli ograniczymy się wyłącznie do wejść/wyjść cyfrowych, mogą to być maszyny z efektem świetlnym, proste alarmy bezpieczeństwa, mierniki różnych parametrów z czujnikami cyfrowymi. Co więcej, interakcja urządzenia z komputerem nie jest trudna. Oczywiście możliwości Arduino nie ograniczają się do tych opisanych w tym artykule. Płytka ta może także współpracować z sygnałami analogowymi, co zostanie omówione poniżej. Wspomniane w artykule programy dla Arduino można pobrać z ftp://ftp.radio.ru/pub/2016/08/diginout.zip. Autor: D. Lekomtsev Zobacz inne artykuły Sekcja Projektant radioamatorów. Czytaj i pisz przydatne komentarze do tego artykułu. Najnowsze wiadomości o nauce i technologii, nowa elektronika: Hałas drogowy opóźnia rozwój piskląt
06.05.2024 Bezprzewodowy głośnik Samsung Music Frame HW-LS60D
06.05.2024 Nowy sposób kontrolowania i manipulowania sygnałami optycznymi
05.05.2024
Inne ciekawe wiadomości: ▪ Poruszające się obiekty z promieniami świetlnymi ▪ Chipy syntezatorów RF STW81101 i STW81102 ▪ Fragment neuronu do przetwarzania próbki ▪ Naukowcy wszczepili chip do mózgu Wiadomości o nauce i technologii, nowa elektronika
Ciekawe materiały z bezpłatnej biblioteki technicznej: ▪ część witryny internetowej elektryka. Wybór artykułu ▪ artykuł Jedź poza Mozhai. Popularne wyrażenie ▪ artykuł Pomoc przy udarze cieplnym. Opieka zdrowotna
Zostaw swój komentarz do tego artykułu: Wszystkie języki tej strony Strona główna | biblioteka | Artykuły | Mapa stony | Recenzje witryn www.diagram.com.ua |