Arduino nano + TWE-Lite Dip でアナログリモコン(2CH)をつくってみた

これまでの実験を踏まえて、いよいよTWE-Lite DipとArduinoをつないでみた。
【これまでの実験】
・超簡単!無線マイコンTWE-Lite DIPが本当に超簡単だった。
・無線マイコンTWE-Lite DIPで無線通信。C#編。
・Arduino + ジョイスティック(可変抵抗)
・超小型オシロXprotolabでTWE-LITE DIPのアナログ入出力を測ってみた

ジョイスティックでアナログ送受信テスト

まずは、TWE-Lite Dipを2個使って、ジョイスティックからのアナログ電圧の無線送受信を確認してみる。

送信器はこんな感じ。
送信機01
今回は電源にエネループを2本つかったので約2.6V。

受信機はこんな感じ。
受信機01
Arduinoと接続する予定なので電源は3.3Vを用意。

送信機・受信機の端子の電圧をテスタで測ってみると以下のような結果になった。
送信機のアナログ入力が送信機の供給電圧の50%のときに、受信機のPWM出力が受信機の供給電圧の100%になるのかな?
result02

Arduinoのアナログ入力と接続(失敗例)

続いて、TWE-Lite DipのPWM1をArduinoのアナログピンに接続してみた。
(ちなみにこれは失敗例です。)
受信機側はこんな感じに接続。
受信機02

【Arduinoのスケッチ】
以前実験で使ったものを流用。A0ピンの入力電圧を100ms毎にシリアル通信で送信するコード。

int analog_in = 0;
int val = 0;
String str_send_data;
unsigned long sTime = 0;
unsigned long rTime = 0;
unsigned long cTime = 0;

void setup() {                
  Serial.begin(38400);
  sTime = millis();
}

void loop() {
  cTime = millis() - sTime;
  rTime = millis();
  val = analogRead(analog_in);
  str_send_data = String(cTime) + "," + String(val);
  Serial.println(str_send_data);
  while(millis() - rTime < 100){
    delay(1);
  }
}

【結果】
ジョイスティックの中立状態での結果はこんな感じだった。
result03
約738と約3が交互にでてきた。
ジョイスティックをD側に倒したときはずっと約3。
ジョイスティックをU側に倒したときはずっと約738。

えーと、期待した結果とはだいぶ異なるので理由を考えてみよう。
とりあえずミニオシロで波形を見てみよう。ジョイスティックの中立状態の波形はこんな感じだった。周期1msec・電圧3.4V・デューティ比50%の矩形波だった。
result04
よく考えれば、パルス波形の平均電圧をArduinoのアナログ入力で測れないのは当然か。
ちなみに約738という数値は3.4Vを入力したときの値だった。

Arduinoでパルス幅測定

それでは、気を取り直してTWE-Lipe DipのPWM出力のパルス幅をArduinoではかることにチャレンジしてみよう。さっそくGoogle先生に聞いてみる。pulseIn(pin, value, timeout)という関数があった。調査終了(さすがArduino)。

pulseIn関数用にスケッチを改良。
【Arduinoのスケッチ】

int inPin = 7;
int val = 0;
unsigned long duration;
String str_send_data;
unsigned long sTime = 0;
unsigned long rTime = 0;
unsigned long cTime = 0;

void setup() {                
  Serial.begin(38400);
  sTime = millis();
  pinMode(inPin, INPUT);
}

void loop() {
  cTime = millis() - sTime;
  rTime = millis();
  duration = pulseIn(inPin, HIGH, 100000);
  str_send_data = String(cTime) + "," + String(duration);
  Serial.println(str_send_data);
  while(millis() - rTime < 100){
    delay(1);
  }
}

【結果】
無事成功!ジョイスティックと連動して数値が0~1000の間で変動することが確認できた。
一点問題点があった。ジョイスティックをU側にいっぱい倒した場合、1000になって欲しいのだが、0になってしまった。これはパルスがつながってしまった為だろう。送信機側の電圧で調整しよう。

Arduino + TWE-Lite Dip アナログリモコン完成版

これまでの問題点を踏まえて、更に2CH用として仕上げてみよう。

【送信機の材料】
TWE-Lite Dip:@1,940
ブレッドボード:@257
ミニブレッドボード:@130
電池ボックス:@110
単四乾電池:2本
ジョイスティック(可変抵抗):@400
10kΩ抵抗:4個

【回路】
送信機02

【受信機の材料】
TWE-Lite Dip:@1,940
ブレッドボード:@257
Arduino nano (互換機):@1,990

【回路】
IMG_201408038515
ブレッドボードにぴったり!!

これでだいぶラジコンに近づいた。次はサーボにチャレンジだ。

Arduino nano + TWE-Lite Dip でアナログリモコン(2CH)をつくってみた」への6件のフィードバック

  1. >ジョイスティックをU側にいっぱい倒した場合、1000になって欲しいのだが、0になってしまった。これはパルスがつながってしまった為だろう。送信機側の電圧で調整しよう。

    もしよろしければ、この部分をどう対策したのか教えて頂けないでしょうか。

    1. コメントありがとうございます。

      最後の手書きの回路図にあるように、ジョイスティックに供給する電源ラインに20kΩの抵抗をいれます。こうすることで、送信機側のTWE-LIte Dipへの入力電圧が0~33%になります。この場合、受信機側のTWE-LIte Dipから出力されるパルス幅は0~666 μsとなるので、ArduinoのpulseIn関数で測定した場合、0~666の値を取得することができます。(中立状態は333)

      1. 回答ありがとうございます。

        とても分かりやすい説明で、理解できました!
        分圧して電圧を絞って、パルスが繋がらないようにしているということですね。

        同じやりかたで、ジョイスティックのアナログ送信ができました。
        とても参考になる情報、ありがとうございます。

  2. arduinoの電圧は5V
    TWE-LITEの電圧は約3V だと思うのですが
    入出力の時その差はどうするのでしょうか?

    1. コメントありがとうございます。
      電圧に関して補足します。
      【供給電圧】
       ・Arduino : USB から 5V
      ・TWE-LITE : Arduino の3V3ピン から 3.3V
      【入出力電圧】
       ・ TWE-LITE 出力 Hレベル 約3.3V
       ・ Arduino 入力 約3V以上をHレベルとして認識してくれる。

      ※注意
       今回は TWE-LITE  → Arduinoの一方通行でしか使っていないので上記で動いてますが、Arduino → TWE-LITE を行うには電圧のレベル変換等が必要になります。

  3. 回答ありがとうございます。
    実験したら3VでもHIGHを認識しました。
    シュミットトリガをつけるとよく安定しました。
    また、いろいろと質問させていただくと思いますが、
    どうぞよろしくお願いいたします。

shirotsuku へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です