Buzzer i czujnik odległości oraz własne funkcje

W pierwszej części lekcji uczniowie wykonają prosty projekt bazujący na wiadomościach zdobytych w czasie poprzednich lekcji. Poznają kolejne funkcje sterownika LOFI. Następnie nauczą się tworzyć własne funkcje z parametrami.

CELE, POJĘCIA, MATERIAŁY ▼

Cele zajęć

Cele ogólne:

• Wyrabianie umiejętności rozumienia, analizowania i rozwiązywania problemów na bazie logicznego i abstrakcyjnego myślenia.
• Doskonalenie myślenia algorytmicznego.
• Programowanie i rozwiązywanie problemów z wykorzystaniem komputera oraz
innych urządzeń cyfrowych, poprzez układanie i programowanie algorytmów.
• Zgłębianie znajomość zasad działania urządzeń cyfrowych oraz wykonywania programów.
• Rozwijanie kompetencji społecznych, takich jak: komunikacja i współpraca w grupie, udział w projektach zespołowych oraz organizacja i zarządzanie projektami.

Cele szczegółowe

Uczeń potrafi:

• Dokonywać poprawek, zapisywać, weryfikować i wgrywać na płytkę.
• Deklarować zmienną liczbową i przypisać jej wartość początkową.
• Posługiwać się funkcjami write(), read(), delay(), buzzer(), distance();
• Przypisać wartość z funkcji read() i distance() zmiennej i wykorzystać ją jako wartość funkcji write(), delay() lub buzzer(), np. do sterowania czasem migania dwóch diod, czy częstotliwością buzzera.
• Napisać program sterujący miganiem dwóch diod, w którym częstotliwość sterowana jest potencjometrem.
• Definiować własne funkcje.
• Definiować funkcje z parametrem.

Treści programowe (związek z podstawą programową)

Podstawa programowa z informatyki – szkoła podstawowa:
Etap II – klasy IV – VIII, w tym klasy VII – VIII: I.1.b, I.2.a, I.2.b, I.2.c, I.3, II.1.b, II.3, III.3, IV.1, IV.2, IV.3, IV.4,
Etap II – klasy VII-VIII: I.1, I.2.a, I.4, II.1, II.2, II.5, III.3, IV.1.

Pojęcia kluczowe

• Arduino IDE
• szkic / program.
• otwórz, zapisz, zweryfikuj, wgraj.
• funkcje (setup, loop, write, delay, read, buzzer, distance)
• zmienna / deklaracja zmiennej / przypisanie zmiennej wartości
• funkcja / deklaracja funkcji / odwołanie się do funkcji
• sterownik Arduino
• adapter LOFI Brain
• dioda
• potencjometr
• buzzer

Metody pracy

• Wykład problemowy,
• Dyskusja dydaktyczna związana z wykładem,
• Pokaz,
• Ćwiczenia laboratoryjne,
• Projekt.

Materiały pomocnicze

• Zestaw LOFI Robot CODEBOX,
• Wyświetlacz LED 8×8 pikseli RGB,
• Komputery stacjonarne lub przenośne z zainstalowanym Arduino IDE,
• Komputer nauczyciela z zainstalowanym Arduino IDE, projektor, tablica projekcyjna.

ZWIŃ ▲

Czas na realizację zajęć:

2 godziny lekcyjne (2×45 minut)*
alternatywnie 1 godzina lekcyjna (45 minut) wówczas rezygnujemy z tworzenia funkcji

Przebieg zajęć

1. Wprowadzenie w tematykę i integracja grupy:
Czas na realizację tej części: ok 5 minut.

Pytamy uczniów co robiliśmy podczas ostatniej lekcji?
• znamy składnię kodu w środowisku Arduino IDE,
• wykorzystujemy funkcje: write i read z biblioteki LOFI,
• deklarujemy zmienne,
• piszemy proste programy sterujące miganiem diod,
• umiemy wgrywać je na płytkę Arduino UNO,
• podłączamy do płytki urządzenia wyjścia.

Dziś poznamy kolejne funkcje z biblioteki LOFI (sterowanie buzzerem i odczyt odległości) oraz *nauczymy się definiować własne funkcje. Będziemy pisać proste programy, wgrywać ja na płytkę Arduino i testować ich działanie, podłączając różne urządzenia wejścia i wyjścia.

2. Część zasadnicza:

Czas na realizację tej części: ok 80 minut* / alternatywnie 35 minut

Przedstawiciel każdej grupy uczniów bierze od nauczyciela przypisany danej grupie zestaw. Uczniowie siadają przy komputerach.

Prosimy uczniów aby włączyli komputery, zalogowali się i uruchomili Arduino IDE. Wyjaśniamy uczniom zadanie, które bazuje na wiadomościach i umiejętnościach z poprzednich lekcji.

Zadanie 8

Napisz program sterujący dwiema diodami podłączonymi do OUTPUT1 i OUTPUT2, które mają migać naprzemiennie jak pojazd uprzywilejowany. Szybkość migania diod powinna być sterowana potencjometrem podłączonym do INPUT1. Zapisz plik jako “zadanie_8”, zweryfikuj program i wgraj na płytkę.

Wskazówka 1: odczyt z potencjometru dzięki funkcji read zwraca nam zawsze jakąś wartość liczbową w zakresie od 0 do 100. Chcąc sterować “szybkością” migania diod, możemy tę zmienną wykorzystać jako parametr funkcji czekaj – delay.

Wskazówka 2: chcąc, aby diody migały wolniej, parametr funkcji delay musi być większy niż 100. Ile razy większy? 2? 3 razy? Jak to zrobić? (Wprowadzając kolejną zmienną, która będzie iloczynem zmiennej pochodzącej z funkcji read oraz liczby 2, 3 lub innej).

Przykładowe rozwiązanie:

#include <LOFI.h>
LOFI robot;

void setup() {
}

void loop() {
int potencjometr = robot.read(INPUT1); 
//definicja zmiennej potencjometr i przypisanie jej wartości z urządzenia INPUT1

int szybkosc = potencjometr * 2; 
/* definicja nowej zmiennej szybkosc i przypisanie jej podwójnej 
lub potrójnej wartości zmiennej potencjometr 
(aby światła nie migały zbyt szybko potrzebne są nam wartości około 200, 
podczas gdy maksymalny odczyt z potencjometru to 100)
*/

robot.write(OUTPUT1, 100);
delay(szybkosc); //wykorzystanie zmiennej szybkosc jako czasu świecenia diody
robot.write(OUTPUT1, 0);
robot.write(OUTPUT2, 100);
delay(szybkosc);
robot.write(OUTPUT2, 0);
}

Po zakończeniu zadania przechodzimy do omówienia nowego zagadnienia:

Kolejną funkcją, którą poznamy jest buzzer(stan); służy do uzyskiwania sygnału dźwiękowego z wbudowanego na płytkę Arduino brzęczyka (buzzera). Parametrem funkcji buzzer jest stan, który może przyjmować wartości true lub false. Wartość true określa, że buzzer ma być włączony, a falsewyłączony.

Przykład / Ćwiczenie 9

Napisz program, który będzie powodował wysyłanie krótkich sygnałów dźwiękowych. Zapisz plik jako “zadanie_9”, zweryfikuj program i wgraj na płytkę.

Przykładowe rozwiązanie:

#include <LOFI.h>
LOFI robot;

void setup() {
}

void loop() {
robot.buzzer(true);
delay(500);
robot.buzzer(false);
delay(500);
}

Drugą funkcją, jaką dziś poznamy jest distance(); służy do odczytania wartości z czujnika odległości podłączanego do specjalnego wejścia DISTANCE. Wartość tą możemy przypisywać do zmiennych, podobnie jak wartość odczytywaną z urządzeń wejścia podłączanych do gniazd INPUT1-4 dzięki poleceniu read(wejście);

Zadanie 10

Napisz program sterujący buzzerem tak jak czujnik parkowania w samochodzie. Częstotliwość sygnału dźwiękowego ma zależeć od odczytu odległości. Zapisz plik jako “zadanie_10”, zweryfikuj program, podłącz czujnik odległości do Arduino (metalowymi stykami na zewnątrz) i wgraj na płytkę.

Podpowiedź 1: odczyt z czujnika odległości będzie zmienną, która przyjmuje wartości od 0 do 100. Chcąc uzyskać efekt wolnego piszczenia, w funkcji delay(); należy wstawić wartość około 1000 (=1 sekunda), czyli około 10 * większą, niż wartość odczytana z czujnika odległości. Jak to zrobić?

Podpowiedź 2: należy zdefiniować dwie zmienne. Jednej przypisać wartość odczytaną z czujnika odległości. Druga powinna być iloczynem liczby 10 i pierwszej zmiennej.

Przykładowe rozwiązanie:

#include <LOFI.h>
LOFI robot;

void setup() {
}

void loop() {
int odleglosc = robot.distance();
int czas = odleglosc * 10;
robot.buzzer(true);
delay(czas);
robot.buzzer(false);
delay(czas);
}

Na tym etapie możemy zakończyć realizację scenariusza lekcji nr 5, jeśli przeznaczyliśmy na nią 1 godzinę lekcyjną. Wówczas rezygnujemy z nauki tworzenia własnych funkcji – wszystkich poniższych treści i ćwiczeń – i przejść do podsumowania.

*Jeśli na lekcję 5. możemy przeznaczyć 2 godziny lekcyjne i zależy nam na nauce tworzenia własnych funkcji, to scenariusz realizujemy dalej:

Po wykonaniu zadania odłączamy kable USB od komputera, aby buzzery przestały piszczeć i przechodzimy do omówienia tworzenia własnych funkcji.

Mówimy uczniom: Zapewne zauważyliście, że w przypadku zaledwie kilku sygnałów świetlnych i dźwiękowych program staje się bardzo nieczytelny. Możemy jednak temu zaradzić. Chcąc uczynić nasz kod bardziej przejrzystym można z pewnych fragmentów naszego programu, które się często powtarzają, zdefiniować odrębne własne funkcje (poza pętlą loop(); i wewnątrz tej funkcji odwoływać się do nich.

Oto przykład z Zadania 6.

#include <LOFI.h>
LOFI robot;

int czasswiecenia = 500;
int czasprzerwy = 200;

void setup() {
}

void loop() { 
robot.write(OUTPUT1, 100);
delay(czasswiecenia);
robot.write(OUTPUT1, 0);
delay(czasprzerwy);
robot.write(OUTPUT1, 100);
delay(czasswiecenia);
robot.write(OUTPUT1, 0);
delay(czasprzerwy);
robot.write(OUTPUT2, 100);
delay(czasswiecenia);
robot.write(OUTPUT2, 0);
delay(czasprzerwy);
robot.write(OUTPUT2, 100);
delay(czasswiecenia);
robot.write(OUTPUT2, 0);
delay(czasprzerwy);
}

Jak można uprościć powyższy skrypt odpowiedzialny za miganie 2 diodek? Np. definiując nowe funkcje: jedną odpowiedzialną za mignięcie (włączenie i wyłączenie) pierwszej diody, drugą za miganie drugiej diody.

W tym celu, przed funkcją loop(), definiujemy własne funkcje np. dioda1() i dioda2(). Do definiowania funkcji służy polecenie void

void dioda1(){ //definicja własnej funkcji o wymyślonej nazwie dioda1
robot.write(OUTPUT1, 100);
delay(czasswiecenia);
robot.write(OUTPUT1, 0);
}

void dioda2(){
robot.write(OUTPUT2, 100);
delay(czasswiecenia);
robot.write(OUTPUT2, 0);
}

Dzięki temu wewnątrz pętli loop() pozbędziemy się kilku powtórzeń. Zamiast tego będziemy mogli posługiwać się nazwami własnych funkcji:

#include <LOFI.h>
LOFI robot;

int czasswiecenia = 500;
int czasprzerwy = 200;
void setup() {
}

void dioda1(){
robot.write(OUTPUT1, 100);
delay(czasswiecenia);
robot.write(OUTPUT1, 0);
}

void dioda2(){
robot.write(OUTPUT2, 100);
delay(czasswiecenia);
robot.write(OUTPUT2, 0);
}

void loop() { 
dioda1(); // odwołanie do własnej funkcji odpowiedzialnej za mignięcie 1 diody
delay(czasprzerwy);
dioda1();
delay(czasprzerwy);
dioda2();
delay(czasprzerwy);
dioda2();
delay(czasprzerwy);
}

Czy kod stał się bardziej przejrzysty? Wykonaj powyższe ćwiczenia i zapisz jako “zadanie_11”. Przetestuj jego działanie.

Zadanie 12 Projekt radiowóz.

Napisz program, w którym wykorzystasz dwie diody podłączone do OUTPUT1 i OUTPUT2. Będą to sygnały świetlne radiowozu. Częstotliwość migania sygnałów ma być zależna od natężenia światła (czujnik natężenia podłączony do INPUT1), a częstotliwość syreny alarmowej (buzzera) ma być regulowana potencjometrem podłączonym do INPUT2. Zapisz plik jako “zadanie_12”, zweryfikuj program, podłącz diody, czujnik natężenia światła i potencjometr oraz wgraj na płytkę.

Przykładowe rozwiązanie:

#include <LOFI.h>
LOFI robot;

void setup() {
}

void dioda1(byte czujnikswiatla) { 
// definicja nowej funkcji “dioda1” z parametrem - zmienną “czujnikswiatla” 
// (zmienna typu byte przyjmować może zakres od 0 do 255), odpowiadającej 
// za mignięcie i zgaszenie diody nr 1,

robot.write(OUTPUT1, 100);
delay(czujnikswiatla);
robot.write(OUTPUT1, 0);
delay(czujnikswiatla);
}


void dioda2(byte czujnikswiatla) {
robot.write(OUTPUT2, 100);
delay(czujnikswiatla);
robot.write(OUTPUT2, 0);
delay(czujnikswiatla);
}


void syrena(byte czujnikswiatla) {
robot.buzzer(true);
delay(czujnikswiatla);
robot.buzzer(false);
delay(czujnikswiatla);
}

void loop() {

int czujnikswiatla = robot.read(INPUT1);

dioda1(czujnikswiatla); 
// odwołanie do własnej funkcji “dioda1” z parametrem “czujnikswiatla”, 
// który jest jednocześnie linijkę wcześniej zdefiniowaną zmienną odczytywaną 
// przez funkcję read z wejścia INPUT1

dioda2(czujnikswiatla);
syrena(czujnikswiatla);

}

3. Podsumowanie i ewaluacja:

Czas na realizację tej części: ok. 5 minut.

Prosimy aby uczniowie ostrożnie spakowali zestawy. Jeden przedstawiciel każdej grupy przynosi zestaw na wyznaczone przez nauczyciela miejsce w klasie.

Zadajemy uczniom pytanie: Czego nauczyliśmy się na dzisiejszej lekcji?

• wykorzystujemy różne funkcje z biblioteki LOFI,
• deklarujemy własne zmienne,
• *definiujemy własne funkcje,
• piszemy proste programy i wgrywamy ja na płytkę Arduino,
• podłączamy do płytki urządzenia wejścia (potencjometr, czujnik odległości, czujnik natężenia światła) i wyjścia (diody, buzzer).

Na zakończenie opowiadamy uczniom, co będziemy robić i czego się nauczymy podczas kolejnej lekcji: będziemy programować serwomotor – specjalny rodzaj silnika używany przy różnego rodzaju siłownikach, np. drzwiach, ramionach robota itp.

O autorze scenariusza:

Grzegorz Zawistowski

Grzegorz Zawistowski

Nauczyciel informatyki w szkole podstawowej. Miłośnik komputerów, nowinek technicznych i robotyki. Szkoleniowiec i trener m.in, w #Superkoderach i Mistrzach Kodowania.