swerve が 2021年02月18日23時13分24秒 に編集
初版
タイトルの変更
モールス信号音を文字に変換して入力するデバイス
タグの変更
秋葉原2021
キーボード
Arduino
Arduino_IDE
本文の変更
# 作ったもの ArduinoProMicro互換基板とマイクを使用したモールス信号音を文字に変換してキーボード入力するデバイス  # 動機 モールス信号を読めるようになりたいものの、なかなか覚えられないし、さらに変換表を持っていたとしても次々に流れてくるモールス信号をすぐには変換できないという問題点があります。 そこでモールス信号音が流れたら勝手に文字に変換してくれるデバイスを作ってみることにしました # システム構成  # 回路構成 主な材料(入手先はあってるかは分かりませんが...) | 部品名 | 個数 | 備考 | |:---:|:---:|---| | ArduinoProMicro互換基板 | 1 | | | コンデンサーマイク| 1 | [入手先:秋月](https://akizukidenshi.com/catalog/g/gP-01810/) | | オペアンプ NJM4580DD | 1 | [入手先:秋月](https://akizukidenshi.com/catalog/g/gI-00069/) | | 抵抗 100k,2.2k | 少々 | | | コンデンサ 0.1μF | 2 | | | ブレッドボード | 1 | | 今回はキーボード機能が使用できるArduinoProMicroを使用しました。 回路図  マイクの信号を増幅するためにオペアンプを使用しています。 今回は試験的に作ってみただけなのでブレッドボード工作です # ソースコード ```arduino:モールス信号を文字に変換してキーボードとして出力するコード #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で作ろうと考えていたのですが、色々あって挫折してしまいました...