swerveのアイコン画像
swerve 2021年02月18日作成 (2022年01月04日更新)
製作品 製作品 閲覧数 3951
swerve 2021年02月18日作成 (2022年01月04日更新) 製作品 製作品 閲覧数 3951

モールス信号音を文字に変換して入力するデバイス

作ったもの

ArduinoProMicro互換基板とマイクを使用したモールス信号音を文字に変換してキーボード入力するデバイス
キャプションを入力できます

動機

モールス信号を読めるようになりたいものの、なかなか覚えられないし、さらに変換表を持っていたとしても次々に流れてくるモールス信号をすぐには変換できないという問題点があります。
そこでモールス信号音が流れたら勝手に文字に変換してくれるデバイスを作ってみることにしました

システム構成

キャプションを入力できます

回路構成

主な材料(入手先はあってるかは分かりませんが...)

部品名 個数 備考
ArduinoProMicro互換基板 1
コンデンサーマイク 1 入手先:秋月
オペアンプ NJM4580DD 1 入手先:秋月
抵抗  100k,2.2k 少々
コンデンサ 0.1μF 2
ブレッドボード 1

今回はキーボード機能が使用できるArduinoProMicroを使用しました。

回路図
ArduinoProMicroとマイクの配線

マイクの信号を増幅するためにオペアンプを使用しています。

今回は試験的に作ってみただけなのでブレッドボード工作です

ソースコード

モールス信号を文字に変換してキーボードとして出力するコード

#include "Keyboard.h" int sensorPin = A0; int sensorValue = 0; int i=0; int j=0; int k=0; int flag=0; int rd = 0; int chr = 0; int ac =0; char key; unsigned long st; unsigned long ed; unsigned long bw; unsigned long st2; unsigned long ed2; unsigned long bw2; int charctor[4]; int A[26][4]={{1,2,0,0},{2,1,1,1},{2,1,2,1},{2,1,1,0},{1,0,0,0},{1,1,2,1},{2,2,1,0},{1,1,1,1},{1,1,0,0},{1,2,2,2},{2,1,2,0},{1,2,1,1},{2,2,0,0},{2,1,0,0},{2,2,2,0},{1,2,2,1},{2,2,1,2},{1,2,1,0},{1,1,1,0},{2,0,0,0},{1,1,2,0},{1,1,1,2},{1,2,2,0},{2,1,1,2},{2,1,2,2},{2,2,1,1}}; char B[27]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; void setup() { //Serial.begin(9600); Keyboard.begin(); } void loop() { //chr=0 入力待ち //chr=1 入力受付中 //chr=2 入力終了+判別中 // read the value from the sensor: sensorValue = analogRead(sensorPin); if(flag==0){ if(sensorValue>545){//3.3:360 5:545 flag=1; st=millis(); if(chr==0){ k=0; } chr=1; rd=1; } else{ if(rd!=0){ ed2=millis(); bw2=ed2-st2; if(bw2>600){ if(chr==1){ Serial.println("charend"); chr=2; } } } else{ } } } else{ if(sensorValue>545){ ed=millis(); bw=ed-st; if(bw>150&&bw<250){ flag=0; st2=millis(); //Serial.println("ln"); charctor[k]=2; k=k+1; delay(400-bw); } else{ } } else{ ed=millis(); bw=ed-st; if(bw>=200&&bw<210){ flag=0; st2=millis(); //Serial.println("sg"); charctor[k]=1; k=k+1; delay(250-bw); } } } if(chr==2){//何の文字かを判別 Serial.print(charctor[0]); Serial.print(charctor[1]); Serial.print(charctor[2]); Serial.println(charctor[3]); ac=0; while(ac<4){ for(i=0;i<26;i++){ ac=0; for(j=0;j<4;j++){ if(A[i][j]==charctor[j]){ ac=ac+1; if(ac==4){ Keyboard.press(B[i]); delay(100); Keyboard.releaseAll(); for(i=0;i<4;i++){ charctor[i]=0; } chr=0; break; } } else{ } } if(ac==4){ break; } } if(ac!=4){ //Serial.println("none"); } chr=0; break; } chr=0; } delay(10); }

完成した後での改良点、感想

短音と長音の区別に時間がかかりました。
また自分で笛を吹いて実験するので息が切れて疲れることがよくあったり、吹いてるうちに長さが変わったりして誤認識するといった事が発生したのですが、
普通にスピーカーなどで出力した音を認識させたり、そもそも光を検知した方がやりやすかったかもしれないですね...
次改良する機会があれば、文字をモールス信号に変換して光として送る送信側と、光を認識して文字に再変換する受信側の両方のデバイスを作ってみたいと思います。

おわりに

本当は最近出たRaspberryPi Picoで作ろうと考えていたのですが、色々あって挫折してしまいました...

swerveのアイコン画像
東京の大学の学生です。3DCADと電子工作の勉強中です。
  • swerve さんが 2021/02/18 に 編集 をしました。 (メッセージ: 初版)
  • swerve さんが 2022/01/04 に 編集 をしました。 (メッセージ: 記事の種類の設定)
ログインしてコメントを投稿する