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.

Print Friendly, PDF & Email

Adam Jurkiewicz

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

Zdobywca wyróżnienia Szerokiego Porozumienia na Rzecz Umiejętności Cyfrowych Polsce, 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 - dostępnego na stronie http://free-desktop.pl

Twórca portalu http://robotgame.edu.pl - platformy do współzawodnictwa wśród uczniów, w oparciu o RGKit (OpenSource) - bibliotekę walk robotów w Pythonie. Twórca portalu http://robotyka.cyfrowaszkola.waw.pl - środowiska do sterowania robotami na ekranie w oparciu o projekt Open Source Reeborg - Blockly i Python.
Adam Jurkiewicz

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.