2024年8月23日金曜日

CWデコーダ製作

 arduino Unoが一つ余っていたので、LCDを339円でアマゾンから購入して、作ってみた。

CWデコーダと言えば、デンマークの方が作成されたものが有名。

http://oz1jhm.dk/content/very-simpel-cw-decoder-easy-build

上記リンクを参考にして、コードや配線図も公開されていたので、それをもとに試してみた。配線図では、LCDの配線とLEDの極性が違っていたので修正必要だったが、なんとかうまく動作させることができた。以前作ったアプリで生成させたCW音であれば、ほぼ正しくデコードできている。

配線には、以前、壊れた炊飯ジャーから取り出したエナメル線が役立った。細くて目立たないので、電子工作にはいいようだ。スズメッキ線だとショートの恐れがあるし、ビニル線だとかさばってしまう。

和文モードを追加して、タッチセンサスイッチTPP223を12番Pinにつなぎ、Bのみショートして、オルタネートにして、切り替えるようにしてみた。プルダウン抵抗2k入れています。
(写真の左側で赤く光っているところがTPP223)

 原作者の許可を得てないので、コードは公開できませんが、変更点は以下のとおりです。
 これで、いちおう、和文モードにも切り替えられるようになりました。

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //ここは、元のサイトの配線図に合わせました
const int colums = 16; /// have to be 16 or 20 16列×2行タイプなので
const int rows = 2;  /// have to be 2 or 4
bool JEflg=true; //flag for Japanese 追加
setup()に  pinMode(12, INPUT);  // japanese/english mode change 追加
loop()に  int sensorValue = digitalRead(12);
  if (sensorValue == HIGH ) {
    JEflg=true;    
  } else {
    JEflg=false;
  } 追加
decode()を以下のように変更
void docode(){
 if(JEflg){
  decodeJ(); 
 }else{
  decodeE(); //これまでの decode()です
 }

void decodeJ(){
if (strcmp(code,".--.-") == 0) printascii(176); // -
  if (strcmp(code,"--.--") == 0) printascii(177);    
  if (strcmp(code,".-") == 0) printascii(178);
  if (strcmp(code,"..-") == 0) printascii(179);
  if (strcmp(code,"-.---") == 0) printascii(180);
  if (strcmp(code,".-...") == 0) printascii(181);
  if (strcmp(code,".-..") == 0) printascii(182);
  if (strcmp(code,"-.-..") == 0) printascii(183);
  if (strcmp(code,"...-") == 0) printascii(184);
  if (strcmp(code,"-.--") == 0) printascii(185);
  if (strcmp(code,"----") == 0) printascii(186);
  if (strcmp(code,"-.-.-") == 0) printascii(187);
  if (strcmp(code,"--.-.") == 0) printascii(188);
  if (strcmp(code,"---.-") == 0) printascii(189);
  if (strcmp(code,".---.") == 0) printascii(190);
  if (strcmp(code,"---.") == 0) printascii(191);
  if (strcmp(code,"-.") == 0) printascii(192);
  if (strcmp(code,"..-.") == 0) printascii(193);
  if (strcmp(code,".--.") == 0) printascii(194);
  if (strcmp(code,".-.--") == 0) printascii(195);
  if (strcmp(code,"..-..") == 0) printascii(196);
  if (strcmp(code,".-.") == 0) printascii(197);
  if (strcmp(code,"-.-.") == 0) printascii(198);
  if (strcmp(code,"....") == 0) printascii(199);
  if (strcmp(code,"--.-") == 0) printascii(200);
  if (strcmp(code,"..--") == 0) printascii(201);        
  if (strcmp(code,"-...") == 0) printascii(202);
  if (strcmp(code,"--..-") == 0) printascii(203);
  if (strcmp(code,"--..") == 0) printascii(204);  
  if (strcmp(code,".") == 0) printascii(205);  
  if (strcmp(code,"-..") == 0) printascii(206);
  if (strcmp(code,"-..-") == 0) printascii(207);
  if (strcmp(code,"..-.-") == 0) printascii(208);
  if (strcmp(code,"-") == 0) printascii(209);
  if (strcmp(code,"-...-") == 0) printascii(210);
  if (strcmp(code,"-..-.") == 0) printascii(211);
  if (strcmp(code,".--") == 0) printascii(212);
  if (strcmp(code,"-..--") == 0) printascii(213);
  if (strcmp(code,"--") == 0) printascii(214);
  if (strcmp(code,"...") == 0) printascii(215);
  if (strcmp(code,"--.") == 0) printascii(216);
  if (strcmp(code,"-.--.") == 0) printascii(217);
  if (strcmp(code,"---") == 0) printascii(218);
  if (strcmp(code,".-.-") == 0) printascii(219);
  if (strcmp(code,"-.-") == 0) printascii(220);
  if (strcmp(code,".-.-.") == 0) printascii(221);
  if (strcmp(code,"..") == 0) printascii(222);
  if (strcmp(code,"..--.") == 0) printascii(223);  
  if (strcmp(code,".---") == 0) printascii(166);
  if (strcmp(code,".----") == 0) printascii(49);
  if (strcmp(code,"..---") == 0) printascii(50);
  if (strcmp(code,"...--") == 0) printascii(51);
  if (strcmp(code,"....-") == 0) printascii(52);
  if (strcmp(code,".....") == 0) printascii(53);
  if (strcmp(code,"-....") == 0) printascii(54);
  if (strcmp(code,"--...") == 0) printascii(55);
  if (strcmp(code,"---..") == 0) printascii(56);
  if (strcmp(code,"----.") == 0) printascii(57);
  if (strcmp(code,"-----") == 0) printascii(48);
  if (strcmp(code,"..--..") == 0) printascii(63); // ?
  if (strcmp(code,".-.-.-") == 0) printascii(161); // full stop
  if (strcmp(code,"--..--") == 0) printascii(164); // comma
  if (strcmp(code,".--.-.") == 0) printascii(64);//@
  if (strcmp(code,"---...") == 0) printascii(58);//:
  if (strcmp(code,"-.--.-") == 0) printascii(40);// (
  if (strcmp(code,".-..-.") == 0) printascii(41);// )
  if (strcmp(code,"...-.") == 0) printascii(126);//correction
  if (strcmp(code,".-.-..") == 0) printascii(163); //square brackets
  if (strcmp(code,".-..-") == 0) printascii(168); // old katakana i
  if (strcmp(code,".--..") == 0) printascii(170); // old katakana e
}


※その後、マイクのMAX9814をアマゾンで買って、スピーカ音を拾うこともできるようにしてみた。
※また、感知する音の周波数も変えられるようだったので、2種類の周波数を切り替えられるようにしてみた。そのために、タッチセンサーを追加するのも面倒だったので、Off>On>Offの切り替えを素早く行うと、切り替えるようなものにしてみた。(家の玄関のセンサーライトの切り替え設定がこの方式を使っているので、参考にした。)

0 件のコメント:

コメントを投稿