Pomysł na lekcję z Pythonem w tle – uczymy się kodu Morse’a

Mechatronika, programowanie, elektronika, kodowanie informacji, zawody przyszłości, innowacje.

Wszystkie te magiczne słowa klucze, które prawie każdy odmienia przez przypadki. Ja chciałbym dać Wam przepis na projekt/lekcję, gdzie możemy uczyć dzieci i historii, i innowacji.
Wg nowej PP Najważniejsze umiejętności rozwijane w ramach kształcenia ogólnego w szkole podstawowej to m. in. kreatywne rozwiązywanie problemów z różnych dziedzin ze świadomym wykorzystaniem metod i narzędzi wywodzących się z informatyki, w tym programowanie.

A w wymaganiach szczegółowych dla klas 7-8 możemy przeczytać :
Programowanie i rozwiązywanie problemów z wykorzystaniem komputera i innych urządzeń cyfrowych. Uczeń:
1) projektuje, tworzy i testuje programy w procesie rozwiązywania problemów.
W programach stosuje: instrukcje wejścia/wyjścia, wyrażenia arytmetyczne i logiczne, instrukcje warunkowe, instrukcje iteracyjne, funkcje oraz zmienne i tablice.

Dodatkowo w przedmiocie Technika możemy przeczytać:
konstruuje, m.in. z gotowych elementów, zabawki, roboty, modele mechaniczno-elektroniczne, w tym programowalne.

My zatem zbudujemy programowalny model mechaniczno-elektroniczny, którym będziemy sterować z programu napisanego w Pythonie.
Do naszej lekcji będziemy wykorzystywać układ mechatroniczny bazujący na Arduino UNO R3, diodę, rezystor (opornik), oraz Python’a 3 i jakiś edytor kodu, np. Geany.

Zatem do dzieła, a właściwie do schematu, połączeń i programowania. Bazując na darmowym oprogramowaniu OpenSource Fritzing zbudowałem schemat, który pozwala połączyć odpowiednio diodę. Wykorzystuję pin nr 13 w Arduino, gdyż wówczas mam test działania diody, ponieważ na płytce jest wlutowana dioda, która reaguje na polecenia dla pin’u 13.

 

Teraz sam program – poniżej kod, który działa dla systemów Linux, dla Windows trzeba dodatkowo zadbać o sterownik USB-Serial dla samej płytki Arduino. Oczywiście dla Windows port COM trzeba zawsze sprawdzić. W Linuksie będzie to ttyUSB0 na 99,9% – ale czasami tam tez trzeba sprawdzić.

[kod]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# kod_morse.py
# 
# Copyright 2018 ABIX Edukacja <adasiek@abixedukacja.eu>
#

from pyfirmata import *
from time import sleep

#definicja kodu

morse = { 'a' : '.-' , 'b' : '-...' , 'c' : '.-.-' , 'd' : '-..' , 
        'e' : '.' , 'f' : '..-.', 'g' : '--.' , 'h' : '....' ,
        }

'''
uwaga - kod niekompletny, ale proszę zauważyć, że na końcu
jest znak przecinka mimo, że dalej nic nie ma
to daje możliwości lepszej edycji kodu.... dobra praktyka
'''


# definicje funkcji
def swiec( obiekt_arduino, pin , znak ):
    '''
    obiekt_arduino ( obiekt stworzony z klasy Arduino )
    pin - numer pinu na płytce (integer)
    znak - '.' lub '-' (string)
    '''

    if znak == '.':
        obiekt_arduino.digital[ pin ].write(0)
        sleep(0.1)
        obiekt_arduino.digital[ pin ].write(1)
        sleep(0.4)
        obiekt_arduino.digital[ pin ].write(0)
    if znak == '-':
        obiekt_arduino.digital[ pin ].write(0)
        sleep(0.1)
        obiekt_arduino.digital[ pin ].write(1)
        sleep(0.7)
        obiekt_arduino.digital[ pin ].write(0)

# teraz testowy string do wyswietlania
napis = 'beddhgdeaabccdd'

# definicja obiektu połączenia do Arduino, standardowo pierwsze urządzenie USB w systemie Linux otrzymuje numer USB0

plytka = Arduino('/dev/ttyUSB0')
# dla Windows definicja portu jest inna,np.
# plytka = Arduino('COM12')

for litera in napis:
    znaczek = morse[litera]
    print('Litera ' + litera + ' => ' + znaczek)
    for kod in znaczek:
        swiec(plytka, 13, kod)

To jest jedna z możliwych implementacji, oraz ważna uwaga. Kod powyżej jest przeze mnie ręcznie formatowany, aby wyglądał tu ładnie na stronie. Jednak jeśli chcecie go skopiować i sprawdzić, jak działa, wówczas raczej skorzystajcie z mojego repozytorium na GitHub. https://github.com/abixadamj/Abix.Edukacja/blob/master/Python101xEDU/kod_morse.py

Innym możliwym rozwiązaniem jest użycie innego sposobu na organizację diód LED:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  kod_morse.py
#  
#  Copyright 2018 ABIX Edukacja <adasiek@abixedukacja.eu>
#  

from pyfirmata import *
from time import sleep

#definicja kodu

morse = { 'a' : '.-' , 'b' : '-...' , 'c' : '.-.-' , 'd' : '-..' , 
        'e' : '.' , 'f' : '..-.', 'g' : '--.' , 'h' : '....' ,
	'i' : '.' , 'j' : '..-.', 'k' : '--.' , 'l' : '..--' ,
	 }
		   

'''
uwaga - kod niekompletny, ale proszę zauważyć, że na końcu
jest znak przecinka mimo, że dalej nic nie ma
to daje możliwości lepszej edycji kodu.... dobra praktyka
'''


# definicje funkcji
def swiec( obiekt_arduino, pin , znak ):
	'''
	obiekt_arduino ( obiekt stworzony z klasy Arduino )
	pin - numer pinu napłytce (integer)
	znak - '.' lub '-' (string)
	'''
	if znak == '.':
		siwec_dioda(obiekt_arduino, pin , 0.4)
	if znak == '-':
		siwec_dioda(obiekt_arduino, pin , 0.7)

def siwec_dioda(obiekt_arduino, pin , czas):
	obiekt_arduino.digital[ pin ].write(0)
	sleep(0.1)
	obiekt_arduino.digital[ pin ].write(1)
	sleep(czas)
	obiekt_arduino.digital[ pin ].write(0)
		
# teraz testowy string do wyswietlania, do wyboru ;-)

# napis = 'befaBghAdbh'.lower()
napis = 'beddhgdeaabccdd'

# definicja obiektu połączenia do Arduino
plytka = Arduino('/dev/ttyUSB0')
truskawka = Arduino('/dev/ttyUSB1')

for lqlk in napis:
	znaczek = morse[lqlk]
	print('Litera ' + lqlk + ' => ' + znaczek)
	for kod in znaczek:
		swiec(plytka, 13, kod)
		swiec(truskawka, 13, kod)

Dodatkowo w tym kolejnym kodzie możecie zauważyć, że zdefiniowane są dwa połączenia do Arduino: plytka oraz truskawka, aby pokazać, jak działa programowanie obiektowe, dlaczego jest łatwe i dlaczego warto od razu się go uczyć.

https://github.com/abixadamj/Abix.Edukacja/blob/master/Python101xEDU/kod_morse3.py

Pamiętajcie – w Pythonie wszystko jest obiektem.

Jak widzicie, sam kod nie jest specjalnie zawiły, a już spełnia wszystkie zalecenia Podstawy Programowej. Mamy instrukcje wejścia/wyjścia, wyrażenia arytmetyczne i logiczne, instrukcje warunkowe, instrukcje iteracyjne, funkcje oraz zmienne i tablice.

To wszystko, co widzicie, zrobiłem z wykorzystaniem systemu FREE_Desktop

Dzięki temu mam dostępny Python oraz odpowiednie moduły, które służą komunikacji z Arduino. Pamiętajcie – każdy może ZA DARMO i LEGALNIE mieć to całe oprogramowanie u siebie w szkole, np. jako system „obok” MS-Windows. Nikt nie każe Wam kasować Waszych Windowsów 😉 Ani nikt nie może zabronić Wam instalacji Linuksa obok. Jeśli chcecie to za udostępniam go na stronie https://free-desktop.pl

Oczywiście warto przy tej okazji pokazać też młodzieży informacji o samym kodzie Morse’a (można wspomnieć o Titanicu), o układach Arduino, kabelkach, diodach, napięciu elektrycznym, opornikach, diodach.

Jest tyle rzeczy, o których możemy przy tej okazji opowiedzieć. A może ktoś się zainteresuje?

By Tucker M. Yates - http://www.navy.mil/view_image.asp?id=22943, Domena publiczna, https://commons.wikimedia.org/w/index.php?curid=91632
By Tucker M. Yates – http://www.navy.mil/view_image.asp?id=22943, Domena publiczna, https://commons.wikimedia.org/w/index.php?curid=91632

Może zamiast kolejnych challenge na YT pomyślą o transmisji danych kodowanych Morsem? A może w ogóle zainteresuje się szyfrowaniem?

Na koniec chciałbym dać Wam drobną zagadkę: zostawiam tu zaszyfrowaną wiadomość (wykorzystałem prosty i popularny rodzaj szyfrowania). Kto go rozszyfruje i wyśle mi na adres adasiek@abixedukacja.eu, wówczas może liczyć na niespodziankę 😉

dgdp mzunlhalfc mhwy kdnhuhp hgzndfml

 

Cóż dalej?
Myślę, że za jakiś czas przygotuję modyfikację kodu, aby można było z klawiatury inicjować kropki i kreski, a może macie jakieś własne pomysły? W komentarzach możecie napisać, z wielką chęcią będę zamieniał Wasze pomysły w realny kod.

 


Adam Jurkiewicz – haker edukacji, członek nieformalnej grupy SuperbelfrzyRP. Absolwent kursów Massachusetts Institute of Technology z języka programowania Python.

Trener języka programowania Python, robotyki, mechatroniki, technologii komputerowych ze szczególnym uwzględnieniem otwartych zasobów edukacyjnych oraz oprogramowania OpenSource. Programista, administrator systemów UNIX/Linux, twórca remiksu edukacyjnego FREE_Desktop – remiksu systemu operacyjnego dla wolnych ludzi, legalnego i darmowego dla wszystkich.  
Współpracownik Centrum Edukacji Obywatelskiej, w projekcie „Koduj z Klasą” ambasador i trener nauczycieli w zakresie języka programowania Python.

Adam Jurkiewicz
Jestem w:
Podoba się? Podziel się z innymi.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.