Dlugi_03 Napisano Luty 11, 2020 Udostępnij Napisano Luty 11, 2020 Wstęp Na wstępie opiszę krótko projekt: Będzie to prosty układ, projekt głównie opiera się na kodzie w Arduino IDE (zamiana tekstu na alfabet morse'a i zapalanie diody) oraz którkim kodzie w Python do komunikacji arduino z PC. Potrzebne rzeczy: Potrzebne elementy: Arduino Uno/Leonardo, Płytka stykowa, dioda LED, rezystor min. 230 Ohm (u mnie 330 Ohm), 2x przewód męsko-męski Układ jest bardzo prosty do zmontowania 🙂 Program w Arduino IDE: //zmienne String aM[25] = { //Kod alfabetu: 1-kropka, 2-kreska, 0-koniec (dla kodów o ilości kropek i kresek mniejszej od 4, optymalizacja) //A B C D E "1200", "2111", "2121", "2110", "1000", //F G H I J "1121", "2210", "1111", "1100", "1222", //K L M N O "2120", "1211", "2200", "2100", "2220", //P Q R S T "1221", "2212", "1210", "1110", "2000", //U W X Y Z "1120", "1220", "2112", "2122", "2211" }; char alfabet[25] = { //Alfabet łaciński - index aM[] i alfabet[] jest taki sam dla każdego znaku "abcdefghijklmnopqrstuwxyz" }; char message[100]; //Wiadomość otrzymana z komputera String msgGet; //Zmienna pomocnicza int aM_Delay = 300; //Czas kropki, wg zasad alfabetu morse'a kresta to 3x kropka int ledPin = 13; //Pin diody void setup() { // put your setup code here, to run once: pinMode(ledPin, OUTPUT); //ustawienie pinu diody na OUTPUT } void loop() { delay(2500); //Opóźnienie między komendami, nie jest wymagane for(int x=0; x<100; x++) //Wyczyszczenie całej wiadomości message[x] = '0'; bool waiting = true; //Zmienna pomocnicza while(waiting) { if(Serial.available() > 0) //Jeśli otrzymano wiadomość { msgGet = Serial.readString(); //Odczytanie wiadomości if(msgGet.length() > 100) //jeśli wiadomości jest za długa, zignoruj iteracje pętli - oczekiwanie na kolejną wiadomość continue; for(int i=0; i < msgGet.length(); i++) //Zapisanie wiadomości ze zmiennej string do tablicy char - ułatwia nadanie wiadomości message[i] = msgGet.charAt(i); msgGet = '0'; //Wyczyszczenie otrzymanej wiadomości waiting = false; //Koniec pętli while } } for(int m=0; m < 100; m++) //Pętla dla każdego znaku wiadomości { for(int i=0; i<=25; i++) //Pętla dla każdego znaku alfabetu { if(message[m] == alfabet[i]) //znalezienie indeksu znaku wiadomości w alfabecie { for(int x=0; x < 4; x++) //Znak może mieć max 4 kropki lub kreski { if('2' == aM[i].charAt(x)) //Jeśli 2 (kreska) - zapala diodę na aM_Delay * 3 - aM_Delay to też odstęp między sygnałami { digitalWrite(ledPin, HIGH); delay(aM_Delay * 3); digitalWrite(ledPin, LOW); delay(aM_Delay); } else if('1' == aM[i].charAt(x)) //Jesli 1 (kropka) -;;- { digitalWrite(ledPin, HIGH); delay(aM_Delay); digitalWrite(ledPin, LOW); delay(aM_Delay); } else if('0' == aM[i].charAt(x)) //Jeśli 0 - zakończ pętlę (koniec znaku) { delay(aM_Delay); break; } } } } } } Myślę, że komentarze w kodzie pozwolą wszystkim zrozumieć, o co chodzi 😛 Program w Python: import serial #biblioteka do komunikacji port = input("Enter port: ") #zmienna z ustawionym przez użytkownika portem do komunikacji ser = serial.Serial(port, 9600) #zainicjowanie płytki na wybranym porcie myMessage = "" #zmienna do zapisu wiadomości while 1: #pobieranie wiadomości w nieskończoność, dopóki nie wyłaczymy programu myMessage = input("Enter a message: ") #zapisanie wiadomości w zmiennej ser.write(myMessage.encode('UTF-8')) #wysłanie wiadomości przez port, z kodowaniem UTF-8 Aby poprawnie wprowadzić nazwę portu, najłatwiej podłączyć arduino do komputera i w arduino IDE sprawdzić port, u mnie np. jeszt to COM5 (Arduino Leonardo) - wpisujemy więc COM5 🙂 A tak wygląda program w Pythonie po odpaleniu, jednak aby nie odpalać go za każdym razem z poziomu CMD, ułatwimy sobie zadanie kolejnym plikiem: run.bat w którym podajemy ścieżkę do pliku python (wraz z rozszerzeniem!) @echo off start G:\ArduinoProjects\MorseCodeNadajnik\MorseCode_Nadajnik.py Plik .bat nie jest wymagany, ale ułatwia odpalanie komunikacji 🙂 Należy również pamiętać, że każdu port USB w komputerze to inny port w do wpisanie w Pythonie (wielu o tym zapomina) Mam nadzieję, że komuś to pomoże 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Luty 11, 2020 Udostępnij Luty 11, 2020 (edytowany) Ciekaw jestem po co to zbudowałeś. Jeśli po to by nauczyć się Morse'a, to muszę Cię wyprowadzić z poważnego błędu: tego nie odbiera się oczami a uszami. Nikt poważny nie bawi się w mrugnie diodkami, bo to bez sensu. Twoje oczy mają być zwrócone na kartkę papieru, gdzie zapisujesz odebrany komunikat a jedynym naszym "interfejsem" do sygnału są uszy. To urządzenie ma pikać a nie mrugać. No chyba, że poszedłeś za przykładem oscarowych Parasitów, ale tam gość nie miał innego wyjścia 🙂 Swoją drogą polecam film. Czasem komunikację świetlną stosuje się (dzisiaj?) np. na statkach, ale to także jest wymóg konkretnych warunków i ograniczeń. W każdym razie oczami jesteś w stanie odebrać może kilkanaście znaków na minutę i brzmi to jak żart w porównaniu do kilkudziesięciu - których możesz nauczyć się w miesiąc titania w słuchawkach. Nie mówiąc już o bardziej zaawansowanych umiejętnościach.. Druga sprawa to odległość między znakami: powinna wynosić ok. jedną kreskę. W kodzie chyba tak nie jest. No i trzecia: definiujesz dwie osobne tablice: jedną z kodami Morse'a a drugą z kodami znaków ASCII. To potencjalne źródło błędów i konieczność synchronizacji dwóch różnych rzeczy. Gdy będziesz chciał dodać i/lub usunąć jakieś znaki, musisz bardzo uważnie grzebać w kodzie. Pomyśl o tablicy struktur. wystarczy, że jeden rekord będzie zawierał kod znaku i string z zakodowanym Morsem a sprawa zacznie wyglądać dużo ładniej. Dobry program to nie tylko algorytm wykonania, ale także dobrze zdefiniowane struktury danych na których operuje. Na marginesie: trochę bez sensu jest brak przerywania pętli wyszukiwania znaku: nawet jeśli znajdziesz i "wymrugasz" co trzeba, dalej przeszukujesz tablicę znaków na zgodność z tym już wyświetlonym. No i dziwny jest dobór kodów dla symboli kropki i kreski. Zamiast jedynki i dwójki dużo bardziej intuicyjne byłyby np. podkreślenie i kropka lub minus i gwiazdka, nie sądzisz? Obecnie muszę odszukać w kodzie funkcję dekodującą i dopiero w niej zobaczyć, co który symbol oznacza.No i te zera na końcu są zbędne. Wystarczy sprawdzać długość stringu kodującego i wtedy nie jesteś dziwnie ograniczony do 4 symboli w znaku i konieczności rozpoznawania osobnego znaku końca. Bo co teraz z cyframi i innymi znakami? EDIT: Teraz widzę (jednak o 1 w nocy myśli się dużo lepiej.. ), że masz break po napotkaniu zera więc pętla się dalej nie kręci. Tu oddaję honor 🙂 Edytowano Luty 12, 2020 przez marek1707 Cytuj Link do komentarza Share on other sites More sharing options...
Anonim Luty 12, 2020 Udostępnij Luty 12, 2020 Zrób mały eksperyment i spróbuj czytać tekst z diody przez godzinę to zrozumiesz co Marek miał na myśli, że interfejsem do alfabetu morse'a są uszy xD Poza tym pojedyncze znaki fajnie się mieszczą w połówkach bajtu więc drugą połówkę można wykorzystać jako separator między znakami/wyrazami. Potrzebny przy tym będzie jakiś literał jako znacznik rozpoczęcia/zakończenia sekwencji cyfr ale i tak jest to chyba najwydajniejszy sposób na odczytywanie/nadawanie morsa, niekoniecznie za pomocą światła czy dźwięku 😉 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!