Powrót do scenariuszy
Szkoła podstawowa
Klasa: 7-8
Szkoła ponadpodstawowa
Klasa: 1-4
test
Autor:

Mateusz Chmielewski

Programowanie Photona w Pythonie #9 Sztafeta robotów

informatyka • programowanie
Czas:
45 min.
Roboty:
x3+
Akcesoria:
Accessory
Interfejsy:
Python (Photon Magic Bridge)
alt
Powrót do scenariuszy
Scenario Image

Odniesienie do podstawy programowej

Szkoła ponadpodstawowa, Informatyka II./2., I./2.
Szkoła podstawowa, Informatyka II./1, 2.

Cele zajęć

Uczeń/uczennica:
  • poznaje rozszerzenie pozwalające na prowadzenie w kodzie równoległych wątków
  • stosuje metody i definiuje funkcje w Pythonie

Metody pracy

  • metoda poszukująca
  • ćwiczenie

Formy pracy

  • praca grupowa
  • praca indywidualna

Materiały

  • komputer na grupę

Załączniki

#9 sztafeta.py
Pobierz
#9 sztafefa zaawansowana.py
Pobierz

Przebieg zajęć

Podczas tego warsztatu przygotujemy program obsługujący sztafetę kilku robotów. Po zakończeniu sztafety, roboty będą się wspólnie cieszyły i kręciły w kółko - żeby było to możliwe poznamy rozszerzenie pozwalające prowadzić równoległe wątki w kodzie.

1. Olimpijskie zwyczaje

Zaczynamy zajęcia od pytania, jakie zwyczaje związane z igrzyskami olimpijskimi są znane uczniom. W rozmowie staramy się naprowadzić na sztafetę ze zniczem olimpijskim. Czy braliście kiedyś udział w jakiejś sztafecie? Dzisiaj w sztafecie wezmą udział nasze roboty.

2. Jazda w sztafecie

Program ma działać w ten sposób, że robot #1 jedzie, do czasu gdy wykryje, że zbliżył się do robota #2. Wtedy zatrzymuje się, a robot #2 rusza. Ta część programu zakończy się, gdy robot #3 dotrze do przeszkody. Na etapie wprowadzenia do zadania dajemy uczniom chwilę, by każdy samodzielnie przemyślał problem i wypracował wstępny pomysł na jego rozwiązanie. Zbieramy pomysły uczniów. Zależenie od pomysłów z sali, możemy wesprzeć uczniów w dopracowaniu zgłaszanych propozycji. 

Można to zrobić na dwa sposoby - prostszy, ale mniej zoptymalizowany i bardziej elegancki, ale trudniejszy. Najpierw omówimy pierwszy sposób.

  • Zaczynamy od znanego nam już zdefiniowania nazw robotów. Omówione zostało dokładnie w scenariuszu #4. W tym wypadku definiujemy robota1, 2 i 3. Zwracamy uwagę, że robot1 na liście ma numer 0.
    robot1 = Photon(get_connected_robots()[0])
  • Program możemy stworzyć z 3 kolejnych po sobie pętli while True: po jednej dla każdego robota. W pętli umieszczamy kolejną pętlę if i else.
  • Jeśli (if) robot1 ma do przeszkody odległość większą niż 15 cm, jedzie przed siebie, w przeciwnym razie (else) zatrzymuje się (robot1.stop()) i uwalnia program z pętli while True (break)

  • W kolejnych pętlach robota1, podmieniamy odpowiednio na robota2 albo robota3. Pętlę skopiować możemy nawet 8 razy i przygotować kod dla sztafety 8 robotów. Jednak im więcej robotów, tym to rozwiązanie staje się mniej wygodne.

Program możemy też przygotować używając jednej sparametryzowanej pętli. Będzie nieco dłuższa, ale zadziała bez potrzeby przebudowywania dla dowolnej liczby podłączonych robotów.

  • Zaczynamy od zdefiniowania funkcji korzystającej z parametru i. Zapisujemy to jako def jazda (i): 
  • Aby zamiast 3 pętli while True: powtórzyć jedną kilka razy, zamykamy ją w pętli for i in range (i):. Dzięki temu kod w pętli zostanie uruchomiony i razy.
  • W programie zaawansowanym nie potrzebujemy definiować nazw robotów. Aby pętla while True: była uniwersalna i działała dobrze przy każdym powtórzeniu, w miejsce nazwy robota wpisujemy Photon(get_connected_robots()[i]). Dzięki temu każda kolejna iteracja będzie dotyczyła kolejnego robota z listy. 

Później w treści programu zapisujemy tylko funkcję jazda(), a w nawiasie wpisujemy liczbę podłączonych robotów.


3. Wspólna radość

Jedną z pierwszych cech Pythona, którą wymienia się opisując go, jest to, że to język wielowątkowy. Oznacza to, że istnieje możliwość, żeby program niezależnie od siebie prowadził dwa zakodowane procesy w tym samym czasie. W Scratchu moglibyśmy to zrobić zaczynając dwa algorytmy od bloczka "kiedy flaga naciśnięta". Po wciśnięciu flagi obydwa algorytmy uruchamiają się jednocześnie. 

Jednak w interfejsie do kodowania w Pythonie nie możemy zapisać dwóch kodów obok siebie, a zauważyliśmy już na pewno, że funkcje i metody realizowane są kolejno od góry do dołu.

Do wprowadzenia wątków, czyli z języka angielskiego threadów, potrzebować będziemy odpowiedniego rozszerzenia. Na górze programu importujemy bibliotekę threading.

  • Po ukończeniu sztafety przez ostatniego robota, chcielibyśmy, aby wszystkie roboty zaczęły wspólnie świętować. Niech w tym samym czasie obracają się i wydają radosne odgłosy.
  • Działanie wątków ma swoje ograniczenia - nie możemy naraz prowadzić dwóch procesów wykorzystujących to samo urządzenie np. dwóch wątków, z których w pierwszym robot Photon jedzie do przodu, a w drugim się obraca, albo dwóch wątków, które jednocześnie zmieniają światło robota na dwa różne kolory.
  • Niezależnie od tego, czy zakodowaliśmy sztafetę w podstawowy, czy zaawansowany sposób, musimy zdefiniować grupę wszystkich robotów. all_robots = Photons(get_connected_robots()). Wszystkie roboty to robot Photon podłączone do urządzenia. Tworzenie grupy robotów opisane jest w dokumentacji w sekcji "Tryb wielu robotów".
  • Przygotowanie threadów zaczynamy od zdefiniowania funkcji np. taniec i radosc, których podmiotem są all_robots
    • def taniec():
          all_robots.rotate_left_infinity(80) parametr w nawiasie to prędkość (z przedziału od 1 do 100)
    • def radosc():
          all_robots.make_sound(38) 
      wpisany w nawiasie parametr to numer zdefiniowanego dźwięku. Lista dźwięków znajduje się w dokumentacji Photona inne->sounds.
  • Po zdefiniowaniu taniec i radosc definiujemy funkcję główną main w jej obrębie definiujemy thread1 i thread2. Do ich zdefiniowania używamy metody Thread, którą zapisujemy jako nazwa_biblioteki.Thread(target=nazwa_funkcji). Po definicji używamy na obu wątkach metody start.

Zależnie od wariantu pełny program wygląda tak, a im więcej robotów, tym kod robiony pierwszą metodą byłby dłuższy.

 

4. Podsumowanie

Podsumowujemy z grupą, co udało nam się zrobić. Szczególnie zwracamy uwagę na nowy element - wątki. Jakie modyfikacje moglibyśmy wprowadzić jeszcze w programie? Może dodatkowy wątek w funkcji głównej?

Współautorem scenariusza jest Michał Nowak.

Dyskusja (brak komentarzy)

Zaloguj się, aby rozpocząć dyskusję