Arduino ile Mors Üreteci
Mors alfabesi veya mors kodu, kısa ve uzun işaretler (• ve –) ile bunlara karşılık gelen ışık veya sesleri kullanarak bilgi aktarılmasını sağlayan yöntem. Günümüzde ses işaretleriyle kullanımı pek kalmasa da ışıkla kullanımı hala bulunmaktadır. Askeriyede ve dağcıların bilmesi gerekli olan bu alfabenin Arduino ile nasıl üretildiğini göreceksiniz.
Yukarıda gösterilen şekildeki gibi basit bir devre kurabilirsiniz. İsterseniz led yerine buzzer bağlayarak Mors Kodunu sesli olarak kullanabilirsiniz.
int ledPin = 12;
char* letters[] =
{ ".-", "-...", "-.-.", "-..", ".", "..-.", "--.",
"....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.",
"--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
char* numbers[] =
{"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."};
int dotDelay = 200;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
char ch;
if (Serial.available())
{
ch = Serial.read();
if (ch >= 'a' && ch <= 'z') {
flashSequence(letters[ch - 'a']);
}
else if (ch >= 'A' && ch <= 'Z') {
flashSequence(letters[ch - 'A']);
}
else if (ch >= '0' && ch <= '9') {
flashSequence(numbers[ch - '0']);
}
else if (ch == ' ') {
flashSequence("-.-.-"); // Boşluğun mors kodu.
}
}
}
void flashSequence(char* sequence) {
int i = 0;
while (sequence[i] != NULL) {
flashDotOrDash(sequence[i]);
i++;
}
delay(dotDelay * 3);
}
void flashDotOrDash(char dotOrDash) {
digitalWrite(ledPin, HIGH);
if (dotOrDash == '.') {
delay(dotDelay);
}
else {
delay(dotDelay * 3);
}
digitalWrite(ledPin, LOW);
delay(dotDelay);
}
Kodu açıklamaya gelirsek ilk olarak harfler ve sonra da numaralar dizisi oluşturulmuş. Buradaki nokta ve çizgiler (. -) mors alfabesindeki harflerin ve sayıların karşılıklarıdır. Harfler dizisinin ilk elemanı olan ".-" a harfini temsil eder ve "--.." ise son harf olan z'yi temsil eder. Sonrasında nokta için bekleme süresi 200 olarak belirtilmiş. Bunu delay metodunun içine yazacağımızdan bu değer 200 ms'yi temsil etmektedir. Sonrasında 12.pin çıkış olarak ayarlanıp seri haberleşme hızı 9600 baud olarak set ediliyor. Bu satır yazılmazsa da bu değer default olarak 9600'e set edilir.
Loop metodunun içinde, seri haberleşme aktifken seri porttan okunan değer ch'a atanıyor. İlk if ile bu gelen karakterinin a ile z arasında olup olmadığı kontrol ediliyor. Girilen harf bu harfler arasında ise kod if'in içine giriyor. Burada kontrol ederken a'nın ASCII karşılığı olan 97 ve z'nin karşılığı olan 122 arasında mı diye bakılıyor. Sonra gelen karakterin ASCII karşılığından a'nınki çıkarılıyor. Örneğin d karakteri girildi. Bunun ASCII karşılığı 100. (100-'a') işleminin sonucu 100-97=3 olur. Böylece flashSequence(letters[3]) çıkar sonuç. Letters dizisinin 3.elemanını olan "-.." değerinin karşılığına bakarsanız d harfi olduğunu görürsünüz. Burada if'lerin içinde küçük ve büyük harf ayrımının yapılması ASCII kodlaması yüzündendir. a'nın karşılığı 97 iken, A'nın karşılığı 65'dir.
Loop metodunun içinde, seri haberleşme aktifken seri porttan okunan değer ch'a atanıyor. İlk if ile bu gelen karakterinin a ile z arasında olup olmadığı kontrol ediliyor. Girilen harf bu harfler arasında ise kod if'in içine giriyor. Burada kontrol ederken a'nın ASCII karşılığı olan 97 ve z'nin karşılığı olan 122 arasında mı diye bakılıyor. Sonra gelen karakterin ASCII karşılığından a'nınki çıkarılıyor. Örneğin d karakteri girildi. Bunun ASCII karşılığı 100. (100-'a') işleminin sonucu 100-97=3 olur. Böylece flashSequence(letters[3]) çıkar sonuç. Letters dizisinin 3.elemanını olan "-.." değerinin karşılığına bakarsanız d harfi olduğunu görürsünüz. Burada if'lerin içinde küçük ve büyük harf ayrımının yapılması ASCII kodlaması yüzündendir. a'nın karşılığı 97 iken, A'nın karşılığı 65'dir.
FlashSequence fonksiyonu parametre olarak string alır. Dikkat ederseniz bu fonksiyona gelen değer letters yada numbers dizisinin elemanlarından biri. Örneğin seri porttan A karakterinin yazıdıldığını düşünelim. FlashSequence fonksiyonuna parametre olarak . - gelecek. Burada önce ilk karakteri flashDotOrDash fonksiyonuna gidiyor.Orada nokta ise 200 ms yanıyor çizgi ise 600 ms. Her bir kısa ve uzun işaretten sonra digitalWrite(ledPin,LOW) metodu ve delay(dotDelay) metodları ile işaret kesiliyor ve 200 ms led sönük kalıyor.
Mors üretecinin çalışması bu şekilde olup kodda yada başka bir yerde anlamadığınız bir şey olursa yorum bırakabilirsiniz. İlk yazım olduğundan dolayı gözümden kaçan bişeyler olduysa şimdiden özür diliyorum.
Merhabalar;
YanıtlaSilKodunuzu çok güzel açıklamışsınız ancak program değerleri yani harfleri nereden alıyor? Bir de flash.sequence fonksiyonu tam olarak ne yapıyor?