友人からしつこく頼まれた
オーディオのセレクタースイッチを自作したいという友人。
そんなの Arduino + マルチリレーモジュールで作れちゃうんじゃね?とアドバイス。
早速材料揃えたけど、わかんない、できない、ドラえもーん、、、的に泣きつかれ。
会うたび、作ってくれと言われ続け重い腰を上げる。
ハードの材料はこちら
- Aruduino UNOでもnanoでもどちらでもOK.
- 8、もしくは16 リレーモジュール。
- プッシュスイッチ(タクトスイッチ)8pcs ← モーメンタリータイプで!
- 1/4W 10kΩ抵抗器 8pcs
初号機 スイッチポチポチシーケンス式
スイッチを押すたびに リレー1、リレー2、リレー3 と切り替わり、リレー8まで行ったらリレー1に戻ります。
これは実験して動作確認済みです。
Arduino の D10 を入力ポートに割り当てます。
Arduino の D1 ~ D8 をリレー制御の出力ポートに割り当てます。
スイッチ
D10 のスイッチ部分は下記のようにつないで下さい。
5V は Arduino の 5V のポートから取ればいいです。
抵抗の末端はGNDにつなぎます。
リレー制御ポート
片切り、-端子共通式の制御の場合 8リレーの場合
マイナスを共通にしないで、両切りにする場合 16リレー、もしくは8リレーモジュール×2
プログラムソース
int sw_num;
// D10
int sw_PIN = 10;void setup() {
// put your setup code here, to run once:
//initalize
// リレー D1 - D8 出力用に初期化
for(int i=1; i <= 8; i++){
pinMode(i,OUTPUT);
digitalWrite(i ,HIGH);
delay(100);
}
//#1 relay is first.
// 起動時1番リレーON
digitalWrite(1,LOW);
// for switch
pinMode(sw_PIN , INPUT);
// switch number intialize;
sw_num = 1;
}void loop() {
// put your main code here, to run repeatedly:// Checking if sw is pushed.
//D10 のスイッチが押された判定
if(digitalRead(sw_PIN) == HIGH) {
sw_num = sw_num + 1 ;
if (sw_num > 8) sw_num = 1;
int i = 1;
//全てのリレーをオフする
for(i = 1 ; i <= 8 ; i++){
digitalWrite(i , HIGH);
//stop 0.1sec
delay(100);
}
//対象のリレーをONにする。
digitalWrite(sw_num , LOW);
}
// loop 10times per 1sec.
delay(100);
}
弐号機 8ボタン式(動作未確認)
上記でつくってあげたところ、嫌だ言われました。
ボタン8個で切り替えしたいって、、、
なんてワガママな。。。
もうハードくみ上げて実験する気力ありません。
プログラムソースだけ書いてあとは自分でやってくれと投げました。
下記動作未確認です。
動く気がしますけど、実験してみておかしいところがあったら教えてください!
動作確認してないので参考までに。
ここが自信ないところ
入出力で各8ずつほしいです。
Arduinoのデジタル端子が足りません。
調べたら、A0 ~ A5 まで宣言すればデジタル端子の D14 ~ D18 として割り当てれるそうです。
ハードの接続
D0 ~ D7 までをスイッチ端子。接続は初号機参考。
D8 ~ A1 までをリレー制御出力端子に割り当て。これも接続は初号機を参考。
プログラムソース
int sel_num;
void setup() {
// put your setup code here, to run once:
int i;//port No 0 - 7 inupt . connect sw.
for(i=0; i <=7 ;i++){
pinMode(i , INPUT);
}
//port 8 - 15 14(A0) 15(A1)
for(i=8; i <= 15; i++){
pinMode(i,OUTPUT);
digitalWrite(i ,HIGH);
delay(100);
}
//When sysutem boot.
sel_num = 8;
digitalWrite(sel_num ,LOW);
}void loop() {
// put your main code here, to run repeatedly:
int i;
boolean input_flg = false;
for(i=0 ; i <=7 ;i++){
if(digitalRead(i) == HIGH){
sel_num = i + 8;
input_flg = true;
break;
}
}// When push some button.
if(input_flg) {
// All Relay Off
for(i = 8 ; i <= 15 ; i++){
digitalWrite(i , HIGH);
delay(100);
}
// selected Relay ON
digitalWrite(sel_num , LOW);
}
delay(100);
}
共有で置いておきます。
参考までに!