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.
Računalnik skbi za pošiljanje podatkov preko serijskega protokola na Arduino. Mikrokrmilnik pa prevaja stringe, ki jih dobi v morsejevo abecedo.
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);
}
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.
Ostale zanimivosti in novice s področja elektronike in programiranja.
Informacije o projektu TopoTest.
Informacije o projektu TopoTest.
Informacije o projektu TopoTest.
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