Skocz do zawartości

Nadajnik Alfabetu Morse'a z komunikacją w języku Python


Pomocna odpowiedź

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

PotrzebneElementy.thumb.jpg.7ab2d63fef589c0332998b018701a17e.jpg

Układ jest bardzo prosty do zmontowania 🙂

666853884_Ukad.thumb.jpg.2cbbbb42f3176c57d20b12d24d50f5ec.jpg1442689792_Ukad.thumb.png.1b06570b6f0aa7e60afeb3f209399fd5.png

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 🙂

KonsolaKomunikacja_Python.thumb.png.fbae74738c414cefbf15f86d2c48d774.png

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)

Miniaturka.thumb.jpg.9a0b954eeedf93a4aa5eaa0daae2f0ee.jpg

Mam nadzieję, że komuś to pomoże 🙂

Link do komentarza
Share on other sites

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 przez marek1707
Link do komentarza
Share on other sites

Anonim

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 😉

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.