Si5351Aを使用したSGの製作を検討していますが、SGらしくテンキーで周波数設定をしようと思い、AD変換方式で4x4マトリクスの16キーの実験をしました。
以前製作したCWデコーダーのように複数のAD変換ポートを使用すればいいのですが、既存の4x4マトリクスユニットを使用するので、配線の変更は避けたいと思います。
ネットで調べたところ、「まごころせいじつ堂さんのアナログ入力1本でマトリックスキーを扱う」で4x3マトリクスキーの例があったので、これを参考に4x4版のテストをしました。
表計算ソフトで縦横に接続した抵抗値から、各キーを押した時のAD変換値を求めます。
まごころせいじつ堂さんで採用された値を参考に適当に各抵抗値を入れて、試算値をソートし各キーを押した時のAD変換値が近くならないように試行錯誤します。
等間隔にはなりませんので、適当なところで妥協します。
![](https://blogimg.goo.ne.jp/user_image/28/07/40ae489df7c861f731545cad57e332c3.jpg)
回路図です。
![](https://blogimg.goo.ne.jp/user_image/52/32/35a58dc5df3a0c0b03f1ff14e303014b.jpg)
この値を基に実装して、各キーを押した時のAD変換値を測定します。
実装した基板です。
![](https://blogimg.goo.ne.jp/user_image/4d/da/74049101b45360aaf3d38a52e69adb5d.jpg)
裏側です。
オリジナルでは8ピンのコネクタで各ローとカラムの信号を取り出せるようになっていますが、キーと接近していて押しにくいにで、3ピンコネクタに装換しました。
マトリクス自体の配線は温存していますので、必要であれば元に戻せます。
![](https://blogimg.goo.ne.jp/user_image/5b/9a/2f7673f830c9060965408600facb162f.jpg)
実測値をソートして各値の中間値を求めます。
![](https://blogimg.goo.ne.jp/user_image/3a/0a/3b83594975d2c5ec2066fd6980840f3d.jpg)
中間値で比較してどのキーが押されたかを判定しています。
byte GetSw()
{
int val;
val = analogRead(adSw);
if(val > 976) return(5);
if(val > 884) return(4);
if(val > 806) return(3);
if(val > 751) return(9);
if(val > 718) return(2);
if(val > 674) return(8);
if(val > 602) return(7);
if(val > 553) return(6);
if(val > 520) return(13);
if(val > 475) return(12);
if(val > 426) return(11);
if(val > 348) return(10);
if(val > 284) return(1);
if(val > 259) return(16);
if(val > 232) return(15);
if(val > 109) return(14);
return(0);
}
表示装置はまだ決めていませんが、とりあえずLCDを想定して周波数入力ルーチンを作ろうと思います。
以前製作したCWデコーダーのように複数のAD変換ポートを使用すればいいのですが、既存の4x4マトリクスユニットを使用するので、配線の変更は避けたいと思います。
ネットで調べたところ、「まごころせいじつ堂さんのアナログ入力1本でマトリックスキーを扱う」で4x3マトリクスキーの例があったので、これを参考に4x4版のテストをしました。
表計算ソフトで縦横に接続した抵抗値から、各キーを押した時のAD変換値を求めます。
まごころせいじつ堂さんで採用された値を参考に適当に各抵抗値を入れて、試算値をソートし各キーを押した時のAD変換値が近くならないように試行錯誤します。
等間隔にはなりませんので、適当なところで妥協します。
![](https://blogimg.goo.ne.jp/user_image/28/07/40ae489df7c861f731545cad57e332c3.jpg)
回路図です。
![](https://blogimg.goo.ne.jp/user_image/52/32/35a58dc5df3a0c0b03f1ff14e303014b.jpg)
この値を基に実装して、各キーを押した時のAD変換値を測定します。
実装した基板です。
![](https://blogimg.goo.ne.jp/user_image/4d/da/74049101b45360aaf3d38a52e69adb5d.jpg)
裏側です。
オリジナルでは8ピンのコネクタで各ローとカラムの信号を取り出せるようになっていますが、キーと接近していて押しにくいにで、3ピンコネクタに装換しました。
マトリクス自体の配線は温存していますので、必要であれば元に戻せます。
![](https://blogimg.goo.ne.jp/user_image/5b/9a/2f7673f830c9060965408600facb162f.jpg)
実測値をソートして各値の中間値を求めます。
![](https://blogimg.goo.ne.jp/user_image/3a/0a/3b83594975d2c5ec2066fd6980840f3d.jpg)
中間値で比較してどのキーが押されたかを判定しています。
byte GetSw()
{
int val;
val = analogRead(adSw);
if(val > 976) return(5);
if(val > 884) return(4);
if(val > 806) return(3);
if(val > 751) return(9);
if(val > 718) return(2);
if(val > 674) return(8);
if(val > 602) return(7);
if(val > 553) return(6);
if(val > 520) return(13);
if(val > 475) return(12);
if(val > 426) return(11);
if(val > 348) return(10);
if(val > 284) return(1);
if(val > 259) return(16);
if(val > 232) return(15);
if(val > 109) return(14);
return(0);
}
表示装置はまだ決めていませんが、とりあえずLCDを想定して周波数入力ルーチンを作ろうと思います。
※コメント投稿者のブログIDはブログ作成者のみに通知されます