〜Bluetooth遠隔操作対応PWMコントローラー〜 コントローラー単体での操作とスマートフォンからの遠隔操作の両方に対応したコントローラーです。 「☆改良版☆ ショート検知機能付き仕様回路」をベースに、本体での操作用のボリュームとスイッチを足して、
「ポイントを切り替える」の機能を組み合わせました。 スマートフォンからも操作できますが、スマホの電池を気にせずに本体だけでも遊べます。 材料費はおおよそ¥4,000、基本的な部品は秋月電子、Bluetoothモジュールはaitendoで購入しました。
回路図と主なパーツリストは下の方にある画像をクリックしてPDFでご覧ください。
初心者の方はいきなり組み立てに入らずに、先に「Arduino/Arduino互換マイコンで模型を走らせよう」の1〜7を
試してみることをお勧めします。 本体での操作は一般的なPWMコントローラーと同じで、メインボリュームと調整用のボリュームが付きます。
方向転換はトグルスイッチ、ポイントは押しボタン式で押すたびに進路が切り替わります。 線路上でショートすると赤LEDが点灯して非常停止状態になり、線路への出力が止まります。
解除するには方向切替を停止位置に切り替えてください。
また、本体操作とスマートフォン操作を切り替えた場合も同様です。
マイコンに書き込むスケッチは以下のとおりです。
ArduinoIDEにコピペして書き込んで使ってください。
Bluetoothから1byteの数値を受信して表のように対応します。
1−140 PWM出力(線路への出力値)
201 前進
202 中立(停止)
203 後退
210 ポイント1切替
212 ポイント1切替
214 ポイント2切替
216 ポイント2切替
回路図・部品リスト
|
///PWM周波数設定
void analogWrite3(int op1){
TCCR2A=0b00100011;
TCCR2B=0b00001010;
OCR2A=150;
OCR2B=op1;
}
void analogWrite10(int op2){
TCCR1A=0b00100011;
TCCR1B=0b00011010;
OCR1A=150;
OCR1B=op2;
}
void setup() {
Serial.begin(9600);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,INPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
pinMode(17,INPUT);
pinMode(18,INPUT);
}
int v=0;
int v0=10;
int v1=0;
int v2=0,v3=0;
int fw=0;
int res=0;
int cmd=0,ocmd=0;
int a1=0,a2=0;
int afw[]={202,201,203};
int fw1;
int p1=1,p2=1,pt;
void loop(){
//非常停止
int ar=analogRead(0);
if (fw!=0){
if (ar<800){
fw=0;
res=1;
v1=0;
digitalWrite(11,HIGH);
}
}
// モード切替
if (digitalRead(9)==HIGH){cmd=1;}
else {cmd=0;}
if (cmd!=ocmd){
ocmd=cmd;
for (int i=v1;i>10;i--){
if (fw==1){
analogWrite3(i);
}
if (fw==-1){
analogWrite10(i);
}
delay(20);
}
res=1;
digitalWrite(11,HIGH);
delay(500);
}
///
///Bluetooth
if (cmd==1){
v=Serial.read();
if (0<v && v<150){
v1=v;
}
}
////本体操作
if (cmd==0){
v=0;
v0=int(analogRead(2)/12);
v2=int(analogRead(1)/10.2);
v3=130-v0;
v1=10+v0+(v3*v2/100);
a1=0;
if (digitalRead(17)==HIGH){a1=1;}
if (digitalRead(18)==HIGH){a1=2;}
if (a1!=a2){
v=afw[a1];
delay(100);
a2=a1;
}
if (digitalRead(2)==HIGH){
v=211+p1;
p1=p1*-1;
}
if (digitalRead(4)==HIGH){
v=215+p2;
p2=p2*-1;
}
}
////方向転換
if (res==0){
if (v==201){
fw=1;
digitalWrite(13,LOW);
digitalWrite(3,LOW);
delay(10);
}
if (v==203){
fw=-1;
digitalWrite(12,LOW);
digitalWrite(10,LOW);
delay(10);
}
}
else {
fw=0;
v1=0;
digitalWrite(3,LOW);
digitalWrite(10,LOW);
}
if (v==202){
res=0;
fw=0;
digitalWrite(11,LOW);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
}
/////ポイント
if (209<v && v<217){
pt=(v-200)/2;
digitalWrite(pt,HIGH);
delay(100);
digitalWrite(pt,LOW);
if (cmd==0){
delay(500);
}
}
////出力
if (fw==1){
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
analogWrite3(v1);
digitalWrite(10,LOW);
}
if (fw==-1){
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
analogWrite10(v1);
digitalWrite(3,LOW);
}
delay(5);
}
|
|