Kurs Arduino dla początkujących - Michał Jaworski str. 1 Lekcja 5 Z piątej lekcji kursu dowiesz się jak obsługiwać analogowe porty Arduino. Zbudujesz urządzenie, które będzie służyło do... dręczenia innych. Przecież musisz łączyć naukę z zabawą wtedy wiedza jest lepiej przyswajana. 5.1. Piszczyk dręczyciel Dręczyciel wyposażony jest w element reagujący na zmieniające się natężenie światła. Tym elementem może być fotorezystor, fotodioda lub fototranzystor. My posłużymy się tym ostatnim, ale układ można łatwo przerobić pod fotodiodę lub fotorezystor. Element optyczny pozwoli układowi, który za chwilę zbudujesz, wykryć czy znajduje się on w oświetlonym, czy zaciemnionym miejscu. Jeśli wykryje ciemność (naszą intencją jest dręczenie w nocy) rozpoczyna swoje działanie. Działanie układu polega na wydawaniu krótkich, cichych, irytujących pisków. Gdy nasza ofiara wstanie z łóżka, aby poszukać źródła denerwujących pisków, zaświeci światło a wtedy nasz układ zamilknie kamuflując miejsce ukrycia. A wszystko to w imię zdobywania wiedzy :) 5.1.1. Co będzie potrzebne dowolna płytka kompatybilna z Arduino, fototranzystor, rezystor o wartości około 220 kω oraz drugi o wartości 1 kω, buzzer z generatorem, tranzystor BC548, płytka stykowa, przewody
Kurs Arduino dla początkujących - Michał Jaworski str. 2 5.1.2. Schemat 5.1.2. Elementy Tranzystor BC548 jest tranzystorem typu NPN ogólnego przeznaczenia. Idealnie nadaje się do sterowania typu włącz / wyłącz jak w naszym przypadku. Na poniższej ilustracji możesz zobaczyć jak wygląda taki tranzystor oraz przekonać się w jaki sposób powiązane są ze sobą jego wyprowadzenia z wyprowadzeniami na schemacie.
Kurs Arduino dla początkujących - Michał Jaworski str. 3 Fototranzystor jest to element podobny do tranzystora, przy czym jedno z jego wyprowadzeń (baza) sterowana jest natężeniem światła. Zwróć szczególną uwagę na to jak podłączasz ten element. Zauważ, że np. w kondensatorach elektrolitycznych krótsze wyprowadzenie oznacza potencjał ujemny. W przypadku fototranzystora krótsza nóżka oznacza kolektor C, który my podłączamy do zasilania +5V. Buzzer jest to przetwornik piezo z wbudowanym generatorem. Aby uzyskać z niego dźwięk, wystarczy go zasilić. Przeważnie na obudowie znajduje się symbol +, który wskazuje wyprowadzenie podłączane do dodatniego potencjału.
Kurs Arduino dla początkujących - Michał Jaworski str. 4 5.1.3. Model 5.1.4. Kod const int analoginpin = 0; const int buzzer = 9; int sensorvalue = 0; int iryt = 0; int i = 0; void setup() digitalwrite(buzzer,low); Serial.begin(9600); void loop() sensorvalue = analogread(analoginpin); Serial.print("sensor = " ); Serial.println(sensorValue); if(sensorvalue < 10) iryt = 1; else if(sensorvalue > 100) iryt = 0;
Kurs Arduino dla początkujących - Michał Jaworski str. 5 if(iryt) if(i > 1000) digitalwrite(buzzer,high); delay(10); digitalwrite(buzzer,low); i = 0; delay(10); // 10ms i++; 5.1.5. Uruchomienie Na początek proponuję złożyć układ według schematu i wgrać do niego program. Gdy już to zrobisz uruchom w środowisku Arduino tzw. Serial Monitor klikając w ikonkę:. Serial Monitor pozwala Ci wysyłać i odbierać dane przez port szeregowy, czyli daje Ci możliwość komunikacji z Arduino. 5.2. Działanie programu Program po zainicjowaniu portu szeregowego (funkcja Serial.begin() na końcu tej lekcji przeczytasz o niej coś więcej) w pętli setup (pamiętasz jest ona wykonywana tylko raz), rozpoczyna pomiar napięcia na nóżce A0 płytki za pomocą funkcji analogread(analoginpin). Dana zapisywana jest do zmiennej sensorvalue i wysyłana przez port szeregowy: Serial.print("sensor = " ); Serial.println(sensorValue); Zostawmy na razie dalszą część programu. Jeśli prawidłowo zmontowałeś układ, wgrałeś program i uruchomiłeś Serial Monitor zaobserwujesz ciągle przychodzące dane. Są to liczby będące kolejnymi odczytami wartości analogowej (napięcia) na nóżce A0.
Kurs Arduino dla początkujących - Michał Jaworski str. 6 Sprawdź teraz co się dzieje z liczbami, gdy np. oświetlisz lub zaciemnisz fototranzystor. Układ celowo jest dość nieczuły (duża wartość R2). Dzięki temu wykrywana jest noc, a nie zmierzch. Zachęcam Cię do eksperymentów z rezystorem o wartości np. 1 kω zobaczysz, że zmiany będą bardziej wyraźne. Przejdźmy teraz do dalszej części programu, w której zawarty jest algorytm irytacji :) Informacja o tym, czy układ znajduje się w zaciemnionym otoczeniu i powinien irytować przechowywana jest w zmiennej iryt. Spójrz na poniższy fragment kodu: if(sensorvalue < 10) iryt = 1; else if(sensorvalue > 100) iryt = 0; Uaktywnienie irytowania (iryt = 1) następuje, gdy wartość zmiennej sensorvalue spadnie poniżej 10 (wartość dobrana eksperymentalnie przyjrzyj się wartościom pojawiającym się w Serial Monitor), natomiast wyłącza po osiągnięciu wartości powyżej 100. Zauważ, że gdy układ odczyta z A0 wartość np. 8, a w następnym kroku będzie to 15, to iryt nadal będzie równe 1 (irytacja aktywna). Sytuacja zmieni się dopiero, gdy natężenie światła padające na fototranzystor wzrośnie znacząco. Dzięki temu unikamy ciągłego włączania i wyłączania irytacji na granicy progu przełączania (stosujemy tzw. histerezę). Gdy irytacja jest aktywna, generujemy pisk w określonym odstępie czasu: if(iryt)
Kurs Arduino dla początkujących - Michał Jaworski str. 7 if(i > 1000) digitalwrite(buzzer,high); delay(10); digitalwrite(buzzer,low); i = 0; Generacja pisku polega na włączeniu na krótki czas (10ms) buzzera. Możesz spróbować samemu dobrać wartość tego opóźnienia, tak aby pisk był słyszalny (irytujący :)) ale na tyle krótki, aby trudno było zlokalizować jego źródło. 5.3. Opis zastosowanych funkcji 5.3.1. Port szeregowy Port ten służy do komunikacji z otoczeniem. W naszym przypadku, jest on wykorzystywany do wymiany danych z komputerem. Serial.begin(speed); Funkcja otwiera port szeregowy i ustawia prędkość transmisji danych. Typowa dla Arduino prędkość to 9600, ale możliwe są również inne ustawienia. Przykład: void setup() Serial.begin(9600); Informacja: gdy używasz portu szeregowego, piny 0 (RX) oraz 1 (TX) nie mogą być wykorzystane jako porty cyfrowe w tym samym czasie. Serial.print(val); Funkcja powoduje wysłanie danych (val) w postaci tekstu do portu szeregowego. Przykład: int x = 5; void loop() Serial.print(x); //wysłanie do portu szeregowego znaku '5' Serial.println(val); Działa podobnie jak powyższa funkcja. Jedyna różnica polega na wysłaniu
Kurs Arduino dla początkujących - Michał Jaworski str. 8 dodatkowych dwóch znaków na końcu przesyłanego ciągu. Znaki te to koniec linii (LF) i powrót karetki (CR), które powodują przejście kursora do nowej linii. 5.3.2. Wejścia / wyjścia analogowe analogread(pin); Funkcja odczytuje wartość analogową z podanego wejścia z 10-bitową rozdzielczością. Wynik zawiera się w przedziale 0 1023. Oznacza to, że napięcie wejściowe z przedziału od 0 do 5V reprezentowane jest z rozdzielczością 5V / 1024 czyli 0,0049V (4,9 mv). Przykładowo, jeśli odczytana wartość to 20, to zmierzone napięcie ma wartość 20 * 4,9 mv = 98 mv. Przykład: val = analogread(pin); Informacja: funkcja ta działa tylko na analogowych pinach wejściowych (A0 A6). Piny analogowe, w przeciwieństwie do cyfrowych, nie wymagają wcześniejszego określenia trybu pracy (jako wejściowe czy wyjściowe). Maksymalna częstotliwość odczytywania danych z wejścia analogowego wynosi około 10000 razy na sekundę (odczyt twa około 100 us). 5.4. Zadanie domowe W ramach zadania domowego dotyczącego piątej lekcji kursu: dowiedz się jak zwiększyć rozdzielczość pomiarową przetwornika analogowo-cyfrowego. Podpowiedź: zapoznaj się z funkcją analogreference(type), spróbuj zmienić program tak, aby wysyłał dane przez port szeregowy z prędkością 115200 i odczytaj prawidłowo te dane w Serial Monitor, zmień kod tak, aby przez port szeregowy wysyłana była zmierzona wartość, ale podana w woltach, obecna postać kodu, sprawia, że pisk generowany jest co 10 sekund (gdy panuje ciemność). Spróbuj zmienić tę wartość. A może uda Ci się generować pisk w bardziej przypadkowych odstępach czasu?