OPIS

Keyer za morsejevo abecedo na osnovi Arduino micro ali ATmega328 z GUI

Na računalniku imate aplikacijo s terminalom in 12 gumbi. V terminal vpišete bsedilo, ki ga želite poslati. Gumbi so namenjeni besedilu, ki ga pogosto pošiljate. 12. gumb omogoča ponavljanje. S "slide-barom" nastavljate razmak med ponavljanjem v sekundah. Vpišete kolikokrat hočete, da se besedilo ponovi. Lahko tudi nastavljate hitrost pošiljanja morsejeve abecede. Vse časovne dolžine se računajo iz dolžine pike. Dolžina pike se nastavlja v ms. Privzeta vrednost je 80ms.

Pri projektu smo sodelovali: Lovro7, MaliMedo, maj, kroko, airwolf, redix.

DELOVANJE

Računalnik skbi za pošiljanje podatkov preko serijskega protokola na Arduino. Mikrokrmilnik pa prevaja stringe, ki jih dobi v morsejevo abecedo.

PREVAJANJE



Ko mikrokrmilnik prebere string in ugotovi, čemu služi ga pošlje v del kode, ki ga prevede v morsejevo abecedo. Prevajalnik uporablja for loop. Ta vzame 1. znak (mesto 0) iz sringa in ga pošlje v funkcio, ki z switch case poišče pravi znak.

string_to_converte.toLowerCase(); for (unsigned i = 0; i < string_to_converte.length(); i++) { write_char(string_to_converte.charAt(i)); }

switch case ima v "casu" znak npr: s. Tam se kličejo funkcije dot(), line() in m_pause().

case 's': dot(); dot(); dot(); m_pause(); break;

Obe funkciji za znak imata vse delay() funkcije v sebi. m_pouse() je razmak med črkami.

void dot(){ pinMode(PIN_MORSE, OUTPUT); digitalWrite(PIN_LED, 1); delay(DOT); pinMode(PIN_MORSE, INPUT); digitalWrite(PIN_LED, 0); delay(S_PAUSE); } void line(){ pinMode(PIN_MORSE, OUTPUT); digitalWrite(PIN_LED, 1); delay(LINE); pinMode(PIN_MORSE, INPUT); digitalWrite(PIN_LED, 0); delay(S_PAUSE); } void s_pause(){ delay(S_PAUSE); } void m_pause(){ delay(M_PAUSE) } void l_pause(){ pinMode(PIN_MORSE, INPUT); digitalWrite(PIN_LED, 1); delay(L_PAUSE); }

KOMUNIKACIJA

Računalnik in mikrokrmilnik med sabo komunicirata po USB protokolu. Arduino micro ima ATmeega32u4, ki ima USB pine. ATmega328 jih nima, zato ima na vzju zunanji pretvornik FT232.

Sistemski ukazi za nastavitve imajo na začetku '#', ki ga morsejeva abeceda ne vsebuje. Tako mikrokrmilnik loči med suistemskimi ukazi in besedilom za prevod. Na koncu vsakega besedila je '\n', ki pove da je konec.

Računalnik najprej pošlje zahtevo za vsebino gumbov ("#start_transmition"). Mikrokrmilnik malo počaka in pošlje "btn1_content_set". To računalniku pove, da bo prejel vsebino prvega gumba. Mikrokrmilnik nato pošlje vsebino gumba brez '#'. Računalnik shrani to besedilo kot string. Ko prejme vsebino vseh 12 gumbov zapiše vsebino v gumbe.

if(Serial.available() > 0){ input_text = Serial.readStringUntil('\n'); if(input_text == "#start_transmition"){ input_text = ""; string_to_converte = ""; DOT = 80; digitalWrite(12, HIGH); delay(100); Serial.write("btn1_content_set"); delay(50); Serial.write(btn1_content); Serial.write('\n'); delay(100); Serial.write("btn2_content_set"); delay(50); Serial.write(btn2_content); Serial.write('\n'); delay(100); Serial.write("btn3_content_set"); delay(50); Serial.write(btn3_content); Serial.write('\n'); delay(100); Serial.write("btn4_content_set"); delay(50); Serial.write(btn4_content); Serial.write('\n'); delay(100); Serial.write("btn5_content_set"); delay(50); Serial.write(btn5_content); Serial.write('\n'); delay(100); Serial.write("btn6_content_set"); delay(50); Serial.write(btn6_content); Serial.write('\n'); delay(100); Serial.write("btn7_content_set"); delay(50); Serial.write(btn7_content); Serial.write('\n'); delay(100); Serial.write("btn8_content_set"); delay(50); Serial.write(btn8_content); Serial.write('\n'); delay(100); Serial.write("btn9_content_set"); delay(50); Serial.write(btn9_content); Serial.write('\n'); delay(100); Serial.write("btn10_content_set"); delay(50); Serial.write(btn10_content); Serial.write('\n'); delay(100); Serial.write("btn11_content_set"); delay(50); Serial.write(btn11_content); Serial.write('\n'); delay(100); Serial.write("btn12_content_set"); delay(50); Serial.write(btn12_content); Serial.write('\n'); } }

if ser and ser.is_open: ser.write("#start_transmition".encode("utf-8")) ser.write("\n".encode("utf-8")) # btn1 while True: if ser.in_waiting > 0: input_string = str(ser.read_all().decode('utf-8')) if "btn1_content_set" in input_string: while True: if ser.in_waiting > 0: input_string = str(ser.read_all().decode('utf-8')) if '\n' in input_string: input_string = input_string.replace('\n','').replace('\r','') btn1_content = input_string confrm_serial_data_recive += 1 break break




Takrat se v oknu pojavijo gumbi, terminal in ostala vsebina.





PONAVLJANJE

Funkcija ponavljanja omogoča ponavljanje pošiljaja vsebine gumba 12. Ta proces deluje v ozadju aplikacije. Za ta namen sem v kodo vključil knjižnico threading, ki ustvari threade.


Ko premaknem slide-bar se vrednost zamika sama posodobi. Ker je besedilo (#btn1_pressed") poslano takoj mora program izračunati časovni interval pošiljanja. To naredi tako, da preveri koliko znakov ima string. Formula izglea tako:
Časovi interval = število znakov * povprecen cas posiljanja znaka * dolzina pike + razmak med ponovitvijo

Število ponavljanj je omejeno na 99.

def on_delay_change(delay_value): global delay_betwin_repeat delay_betwin_repeat = delay_value

def repeat_transmition(): global number_of_chars_in_repeat_string interval = number_of_chars_in_repeat_string * (float(selected_speed_value) / 100) + float(delay_betwin_repeat) times_to_resend_string = int(enter_n_of_string_repeat.get()) if times_to_resend_string > 99: times_to_resend_string = 0 show_eror_warning("Vneseno število ponovitev presega 99") global stop_repeating_string stop_repeating_string = False def transmit_string_to_repeat(): for _ in range(times_to_resend_string): ser.write("#btn12_pressed".encode("utf-8")) ser.write('\n'.encode("utf-8")) time.sleep(interval) if stop_repeating_string == True: break; t = threading.Thread(target=transmit_string_to_repeat) t.start()

Ponavljanje se lahko tudi prekine. Ko pritisnete gumb "Ustavi pošiljanje gumba 12" računalnik ne bo več pošiljal mikrokrmilnika a to bo dokončal besedilo, ki ga pošilja.

def stop_repeating_transmition(): global stop_repeating_string stop_repeating_string = True

PYTHON

Ostale zanimivosti in novice s področja elektronike in programiranja.

C++

Informacije o projektu TopoTest.

SAMOGRADNJA

Informacije o projektu TopoTest.

PCB

Informacije o projektu TopoTest.

PRILOGE

Vsa potrebna dokumentacija in priloge za samogradnjo.

Koda in računalniški program

Shema vezja

Spodnji del ohišja samo za Arduino

Zgornji del ohišja samo za Arduino

Navodila