lider projektu: finansowanie:
Prosty robot sterowany algorytmem warunkowym (1 czujnik - dotyku) sejf. Cel: - zastosowanie struktury switch-case ( jeśli-to ) Materiały: - naładowane zestawy Lego Mindstorms w tym co najmniej jeden motor pomocniczy (Medium Motor) i co najmniej jeden czujnik dotyku - komputer PC z oprogramowaniem Lego Mindstorms Ev3 - pomoce dla trenera gotowy program, instrukcja złożenia przykładowego robota Problem : - stworzenie sejfu zabezpieczonego przed otworzeniem bez wiedzy o kluczu Przykładowy opis: Chcieliście kiedyś schować coś przed kimś, na przykład przed rodzicami, albo nieznajomymi? Najlepiej w takim przypadku mieć sejf. Z czego składa się taki sejf? To pytanie pozwoli nam rozpocząć i naprowadzić uczestników na to, jakie elementy robota z jakimi funkcjonalnościami będą potrzebne. Powinny pojawić się odpowiedzi, że sejf zawsze musi posiadać miejsce na przechowywanie skarbu oraz jakieś drzwi z zamknięciem.
Przebieg zajęć: 1.Omówienie możliwości stworzenia mechanizmu drzwi z automatycznym zamykaniem lub bez takiego elementu: a) z poziomu klocków: czego musimy użyć? jakich klocków? jakie elementy będą nam potrzebne: - zwykłe klocki, z których zbudujemy wnętrze sejfu (ono nic nie robi, jest tylko przestrzenią), - zwykłe klocki, z których zbudujemy same drzwi, - klocek, który pozwoli naszym drzwiom się ruszać, - klocki, które pozwolą nam sterować zamykaniem i otwieraniem drzwi. Wszystkie elementy zapisujemy na tablicy. b) z poziomu programu: - uzgadniamy z uczestnikami, które elementy sejfu musimy zaprogramować (drzwi oraz mechanizm ich otwierania I zamykania). 2. Omówienie różnych kombinacji otwierania drzwi i wybranie jednej w oparciu o możliwości zastosowania czujnika dotyku sugerowana to przytrzymanie przycisku, ale w przypadku dodatkowego czasu na zajęciach można rozbudować program: - pytamy uczestników, jakie mogą być rodzaje zamykania i otwierania drzwi (tu można naprawdę zrobić burzę mózgów: możemy zapisać na tablicy _dowolną ilość różnych pomysłów) - możemy popracować z uczestnikami w ten sposób, że od razu spróbujemy skreślić te, które odpadają ze względu na to, że nie mamy odpowiednich _klocków do ich zbudowania - dla ułatwienia możemy podpowiedzieć czym dysponujemy (czujniki i motory, które możemy wykorzystać) - drogą eliminacji, pamiętając o tym, że najlepszy kod to możliwie najprostszy kod - wybieramy opcję z przytrzymywaniem czujnika przycisku W tym momencie mogą pojawić się różne pomysły. Powinniśmy tak uporządkować pracę nad projektem, żeby wszystko było jasne dla całej grupy.
3. Budujemy robota za pomocą klocków, które wybraliśmy na początku i zapisaliśmy na tablicy. 4. Część programistyczna: proponujemy otwarcie środowiska do programowania EV3 i zapytanie uczniów o to, jakie bloki będą nam niezbędne. - Przypominamy o tym, aby dopilnować, żeby bloczek startowy pozostał w odpowiednim miejscu. - W następnej kolejności możemy porozmawiać o bloczku, który poruszy naszymi drzwiami, czyli bloczku motora. Odnajdujemy w zielonej zakładce _bloczek Medium Motor i przeciągamy na razie na pole, na którym będziemy programować, mówiąc, że żeby zaprogramować i podłączyć ten klocek, _musimy wiedzieć, co będzie otwierać i zamykać drzwi. - Kolejnym ważnym krokiem jest więc wymyślenie jak za pomocą czujnika dotyku będzie można kontrolować zamykanie i otwieranie drzwi. - Sugerujemy, że może dobrym sposobem na użycie tego przycisku, jest przedłużenie czasu jego wciśnięcia? Nie każdy złodziej na nie wpadnie :) Wiemy _już w takim razie, że w którymś momencie naszego programu, musi się pojawić oznaczenie czujnika dotyku. - Skoro ustaliliśmy, że przyciśnięcie przycisku na czujniku będzie trwało jakiś czas, musimy również wprowadzić klocek odpowiedzialny za czekanie, _czyli klepsydrę ( wait ), z pomarańczowej zakładki. - Właściwie najważniejszym elementem programu będzie warunek, po którego sprawdzeniu, sejf zostanie otwarty lub nie. Pytamy uczestników, co - na _podstawie dotychczasowych ustaleń - będzie tym warunkiem. Powinni pamiętać, że sejf ma działać w ten sposób, że jeśli przycisk zostanie dłużej _przytrzymany to sejf się otworzy, jeśli nie - nic nie zadziała. Przypominamy, że aby wprowadzić do programu taki warunek, potrzebujemy pętli z _pomarańczowej zakładki, która nazywa się switch, czyli - sprawdza czy jakiś warunek został spełniony i jeśli tak - robi określone rzeczy. Jeśli _warunek nie został spełniony - program robi zupełnie inną rzecz, albo nie robi nic. Przeciągamy na razie switch na pole kodowania. - Mówimy, że teraz, kiedy wiemy jakich bloczków użyć, powinniśmy tylko odpowiednio je poukładać i nadać odpowiednie wartości.
- Program zaczyna się od startu - to już wiemy. Później, program sterujący powinien chcieć się dowiedzieć, kiedy przycisk zmieni swoje położenie _- z wciśnięcia do odciśnięcia. Dołączamy więc klocek z klepsydrą, na którym wybieramy zamiast time - touch sensor (czujnik dotyku) => _ compare => state. Ten klocek wymusza na programie, żeby czekać z wykonaniem kolejnej części programu, aż coś się stanie - w tym przypadku _zmieniamy to coś z czekania, aż upłynie określony w sekundach czas, na czekanie na sygnał z czujnika dotyku. - Jeśli uznaliśmy, że klocek musi być wciśnięty lub odciśnięty (czyli mieć pozycję zmienioną względem stanu początkowego) przez jakiś czas żeby _otworzyć sejf, to znów musimy użyć klocka z klepsydrą. Umieszczamy go w ciągu i wpisujemy w okienku obok zegarka ilość sekund, przez które czujnik _musi być wciśnięty, żeby uruchomić otwieranie sejfu. Powiedzmy, że rozsądną wartością są tu na przykład 3 sekundy. UWAGA! Wszędzie, gdzie pojawia się bloczek związany z czujnikiem ruchu (a później - każdym innym czujnikiem) musimy w jego prawym górnym rogu wpisać, w które gniazdo kostki sterującej, został on wpięty. Przypominamy, że czujniki wpinamy w gniazda z numerami, a silniki w gniazda oznaczone literami. - Teraz musimy do naszego programu wprowadzić pętlę warunkową jeśli (coś), to (coś). W tym przypadku będzie to warunek, jeśli czujnik dotyku został przyciśnięty przez trzy sekundy, otwórz sejf, jeśli nie - nie rób nic. Pętla warunkowa, której potrzebujemy, to switch z pomarańczowej zakładki. Dopinamy ją do pozostałych bloczków i pytamy, co musimy umieścić w jej rozpoczęciu? Odpowiedź: jeśli po trzech sekundach pozycja czujnika dotyku ulegnie zmianie to warunek zostanie spełniony i wtedy program musi otworzyć sejf. Znajdujemy więc odpowiednią opcję ( touch sensor => compare => state w rozwijanym menu) i za jej pomocą określamy jak ma działać cała pętla.
- Przedostatnim etapem kodowania tego robota, jest powiedzenie mu, co ma robić, kiedy warunek zostanie spełniony, a co - jeśli nie. Po pierwsze _musimy zapytać, na jaki element robota będzie wpływać spełnienie warunku? Oczywiście na silnik, który będzie otwierał i zamykał drzwi. Spoglądamy _więc razem z uczestnikami na strukturę switch i pytamy, o to, gdzie powinniśmy umieścić bloczek silnika? Widzimy, że ma ona dwa pola - nad jednym _jest znaczek - ptaszek oznaczający zazwyczaj ok lub prawda, a pod spodem - krzyżyk oznaczających zazwyczaj fałsz. Mówimy, że takie _właśnie jest znaczenie tych symboli również tutaj. Jeśli więc chcemy, żeby nasz silnik otwierał drzwi sejfu po spełnieniu warunku trzysekundowego _naciśnięcia czujnika, umieszczamy bloczek silnika w górnej części switcha. - Musimy teraz porozmawiać z uczniami o odpowiednich ustawieniach silnika. * Pamiętajmy, aby w prawym górnym rogu wpisać literkę odpowiadającą gniazdu na kostce sterującej, do której wpięliśmy silnik. * Najpierw w opcjach pod rysunkiem silnika, musimy wybrać sposób, w jaki poruszy on drzwiami. Najłatwiej będzie sterować naszymi drzwiami _zmieniając ich położenie za pomocą ustawienia odpowiedniej wartości zmiany kąta. Ustawimy więc w tym polu On for Degrees. Do wytłumaczenia takiej operacji możemy użyć zwykłego pudełka. Pokazujemy dzieciom zamknięte pudełko i pytamy, jaki kąt jest między drzwiami, a ścianą? Oczywiście to kąt zero stopni, ponieważ przylegają one do siebie. Teraz otwieramy drzwi i pytamy, jaki możemy ustawić kąt między drzwiami, a ścianą, żebyśmy się dostali do środka. Sugerujemy, że może to być kąt 90 stopni - czyli kąt prosty.
* Kolejnym polem, w którym musimy ustawić odpowiednią wartość jest moc silnika. Żeby drzwi nie odskakiwały zbyt gwałtownie ustawmy tu niewielką _wartość, na przykład 15%. UWAGA! To bardzo ważne, aby nie ustawiać w przypadku ruchomych części robota zbyt wielkich mocy bez testów - innymi słowy, musimy mieć pewność, że wielka moc jest potrzebna w danym przypadku, ponieważ może to spowodować uszkodzenie klocków i przedwczesne wyładowanie się kostki, zwłaszcza przy włączonym trybie break, gdy motory aktywnie używają hamulców. * Teraz ustawiamy kąt, o jaki powinny zmienić ustawienie nasze drzwi. W zależności od tego, jak zbudowaliśmy robota, będzie to -90 (jeśli drzwi mają odchylać się w lewo) lub 90 (jeśli drzwi mają odchylać się w prawo) stopni. Oczywiście dobrany kąt zawsze zależy od tego, z której strony patrzymy na silnik - my proponujemy umówić się, że zawsze będziemy patrzyli na silnik osiowy (podłużny) od przodu - wtedy obroty na plus będą zgodne z ruchem wskazówek zegara. Z silnikami bocznymi jest większy problem - mają w końcu dwie symetryczne strony, z których można obserwować ich działanie. Dlatego proponujemy, żeby patrzeć na silnik w następujący sposób - kiedy wyjście kablowe silnika jest po lewej stronie czerwonego koła silnika, które jest skierowane w dół, to obroty na plus są zgodne z ruchem wskazówek zegara W bloczku silnika jest jeszcze jedno pole: Brake at End - na razie nie będziemy się nim zajmować - pozostawimy jego ustawienia niezmienione, tak, aby po najechaniu na nie kursorem wyświetlał się napis: Brake at End: True. - Możemy wymyślić kilka sposobów na to, kiedy drzwi mają się zamykać, jednak na potrzeby prostego i podstawowego projektu, najłatwiej będzie chyba jeśli dodamy tu po prostu ustawienia czasowe. Do bloczka silnika dołączamy więc bloczek wait z klepsydrą i wpisujemy dowolną (rozsądną) wartość czasową (1-3 sekund na testowanie robota).
- Właściwie ostatnim elementem, który musimy umieścić w naszym switchu jest to, co ma zrobić silnik, kiedy robot odczeka ustawiony przez nas czas. _Oczywiście - zamknąć drzwi. W tym celu dodajemy bloczek motora i ustawiamy go prawie tak samo, jak zrobiliśmy to w przypadku, kiedy dodawaliśmy _bloczek motora po raz pierwszy. Warto zadać dzieciom pytanie: który element w ustawieniach silnika musi się zmienić, aby drzwi się zamknęły? W celu _naprowadzenia ich na prawidłową odpowiedź, możemy znowu posłużyć się prawdziwym pudełkiem. Uczestnicy powinni dojść do wniosku, że wartość _zmiany kąta musi być odwrotna do tej, którą wpisaliśmy w pierwszym bloczku silnika. To znaczy: jeśli tam mieliśmy -90 teraz musimy wpisać 90, a jeśli _wtedy wpisaliśmy 90, teraz musimy wpisać -90. Resztę ustawień powtarzamy z poprzedniego bloczka silnika. - Mówimy, że to już właściwie koniec działania naszego programu, ale brakuje nam jeszcze jednego bloczka. Dzieci powinny przypomnieć sobie, że _chodzi o bloczek kończący program. W środowisku do programowania robotów Lego, znajduje się on w niebieskiej zakładce i nazywa End Program. 5. Podłączenie robota do komputera i wgranie programu na kostkę. - testy i rozbudowa projektu Dodatkowe wyzwania do rozwiązania: - rozbudowa sejfu i oprogramowania do projektu pozwalającego na zamykanie drzwi, co też wymagałoby klucza niekoniecznie takiego samego jak klucz otwierający drzwi - budowa sejfu opartego o dwa przyciski i ich wzajemne kombinacje - rozbudowa projektu do sejfu z dwoma drzwiami, np. sterowanymi dwoma czujnikami dotyku - modyfikacja programu w celu stworzenie bardziej zaawansowanego klucza otwierającego - dla zaawansowanych, wymagające znajomości bloczków pozwalających na operowanie na zmiennych budowa sejfu z programowalnym kluczem
FAZY BUDOWY ROBOTA: 1. 3. 2.
6. 4. 5.