SSブログ

ダイソーの500円モバイルバッテリーは電子工作でも使えるぞ [Gadget]

以前に、電子工作で使えるモバイルバッテリーとして"cheero Canvas 3200mAh IoT機器対応 モバイルバッテリー"の紹介をしました。
これはオートパワーオフ機能がなく、微弱電流を流し続けることができるバッテリーです。
リモートコントロール(RC)戦車をつくる【IoT機器対応モバイルバッテリー】

用途として少々特殊だったりするので、お値段が少しお高めなのがネックなのですが、最近気になる記事を見つけてさっそく購入してみました。
100均(ダイソー)の500円モバイルバッテリーがArduino用電源になるかあれこれ試してみた:ウェブ情報実験室
"https://japanese.engadget.com/jp-2019-06-07-100-500-arduino.html"


で、これです↓
ダイソー500円モバイルバッテリー①.JPG

ダイソー500円モバイルバッテリー②.JPG

ダイソー500円モバイルバッテリー③.JPG
この春にモデルチェンジしたそうで、お値段据え置きで3,000mAhから4,000mAhに容量アップしています。
縦横はcheero Canvasよりやや一回り大きいですが、厚みは薄くなっています。
性能等々の解説はネットで検索してもらうといろいろ出てきますのでそちらにお譲りして、電子工作としての実用度なのですが”あり”だと思います。

cheero Canvasのような電源オンオフスイッチはありませんので、オートパワーオフ機能は実装されています。ただ、オートパワーオフを検知するしきい値がそれなりに低いのでパワーオフになりにくい、ということだと思います。
具体的には、Arduino UNO単体であれば電源は切れずに動作しました。
Arduino Pro Mini単体では電源が切れてしまいましたが、超音波測距センサ「SEN136B5B」とXBeeを接続した場合では電源は切れずに動作しました。
出力も5V 1Aなので、モータドライバを駆動するのには少し厳しいかもしれません。

このように利用シーンを選ぶわけですが、500円でお手軽に5V電池を確保できるのはメリットは大きいと思います。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Arduinoで距離を測る(1)【超音波測距センサ with XBee(動作確認)】 [Arduino]

前回で2byteのシリアル通信ができたので、本番です。

測定した距離をバイナリデータとしてXBee間でシリアル通信して、PCのシリアルモニタに表示をさせます。
一度実測した値をもとに、誤差を修正するための補正値を組み入れました。
補正値を入れる前後の実績値を示します。
SEN136B5B実測データ.jpg
超音波測距センサの「SEN136B5B」の測定レンジは3cm~4m(400cm)ですので、測定レンジを外れたら"Out of Range"と表示します。

【スケッチ】
<送信側>
/*******************************************************************************
超音波測距センサ(SEN136B5B)用XBeeトランスミッタ

++++++ note ++++++
超音波測距センサ(SEN136B5B)用にArduinoUNO-XBee送信機

*******************************************************************************/
// this constant won't change. It's the pin number of the sensor's output:
const int pingPin = 7;

// 初期化(電源投入/リセット時1回のみ実行):
void setup() {
  Serial.begin(9600);                       //9600bpsでシリアルポートを開く
}

// main loop:
void loop() {
  long duration;                            //変数を定義
  int cm;                                   //変数を定義
  
  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // モジュールに超音波発信のためのトリガーを与える
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  pinMode(pingPin, OUTPUT);                 //pingPinを出力ピンに定義
  digitalWrite(pingPin, LOW);               //LOW出力
  delayMicroseconds(2);                     //2us停止
  digitalWrite(pingPin, HIGH);              //HIGH出力
  delayMicroseconds(5);                     //5us停止
  digitalWrite(pingPin, LOW);               //LOW出力
/*
 ①トリガー信号により40kHzの超音波パルスをモジュールは発信する。
 ②超音波パルス発信中に、pingPinを出力→入力ピンに変更する。
 ②超音波パルスを発信し終えたら、pinPinはHIGHに遷移する(超音波パルスをモジュールが受信する
  間HIGHを継続(受信したらLOWに遷移))。
 ④pinPinのHIGH継続時間を測定することで、距離に変換することができる。
 */

  // The same pin is used to read the signal from the PING))): a HIGH pulse
  // whose duration is the time (in microseconds) from the sending of the ping
  // to the reception of its echo off of an object.
  pinMode(pingPin, INPUT);                  //pingPinを入力ピンに定義
  duration = pulseIn(pingPin, HIGH);        //pingPinがHIGHになっている時間(パルスの長さ)を計測する

  // convert the time into a distance
  cm = microsecondsToCentimeters(duration); //パルスの長さ(時間)を距離(センチ)に変換

  sendIntData(cm);
  delay(100);                               //シリアルポートを溢れさせないように ※delay():単位ms
}

 //パルスの長さ(時間)を距離(センチ)に変換する関数
long microsecondsToCentimeters(long microseconds) {
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the object we
  // take half of the distance travelled.
  return microseconds / 29 / 2;
}

 // int型のデータを送信する関数
void sendIntData(int value) {
  Serial.write('H'); // ヘッダの送信
  Serial.write(lowByte(value)); // 下位バイトの送信
  Serial.write(highByte(value)); // 上位バイトの送信
}


<受信側>
/*******************************************************************************
超音波測距センサ(SEN136B5B)用XBeeレシーバ

++++++ note ++++++
超音波測距センサ(SEN136B5B)用にArduinoUNO-XBee受信機
・実測データより受信データが195以上(約2m)には+5cmの補正を加える
・距離データが3(約3cm)未満又は400(約4m)を超えたら、Out of Rangeと表示する

*******************************************************************************/
#define VERSION "1.00a0"
#define hosei 5;                                      //補正値(実測データより求めた)

int recv_data;                                        //受信データ
int range_data;                                       //距離データ

// 初期化(電源投入/リセット時1回のみ実行):
void setup() {
  Serial.begin(9600);                                 //9600bpsでシリアルポートを開く
}
// main loop:
void loop(){
  // 受信バッファに3バイト(ヘッダ+int)以上のデータが着ているか確認
  if ( Serial.available() >= sizeof('H') + sizeof(int) ) {
    // ヘッダの確認
    if ( Serial.read() == 'H' ){
      int low = Serial.read();                        //下位バイトの読み取り
      int high = Serial.read();                       //上位バイトの読み取り
      recv_data = makeWord(high,low);                 //上位バイトと下位バイトを合体させてint型データを復元

  // 受信データから表示させる距離データを作成      
      if(recv_data >= 195){                           //195以上ならば補正値を加算する
        range_data = recv_data + hosei;
      }
      else{
          range_data = recv_data;
      }

  // 距離データの表示 range_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)
      if((range_data >= 3) && (range_data <= 400)){   //range_dataが3以上400以下ならば、距離を表示する
        Serial.print("Range= ");
        Serial.print(range_data);
        Serial.println("[cm]");
      }
      else{                                           //range_dataがそれ以外ならば、Out of Rangeと表示する
        Serial.println("Out of Range");
      }
    }
  }
}

これで遠隔から距離データを取得することができました。
同じプログラムを使い回せば、他にも温度センサからのデータだったりとか、いろいろと応用できそうです。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Arduinoで距離を測る(1)【2バイトのシリアル通信】 [Arduino]

超音波測距センサの「SEN136B5B」の測定レンジは3cm~4m(400cm)です。
測定した距離をバイナリデータとしてXBee間でシリアル通信して、PCのシリアルモニタに表示をさせたいのですが、ここで問題があります。
Serial.write(val)では送信する値(val)は1バイトなのです。
これでは測定レンジの最大値4m(400cm)は送ることができません。。。実際、テストスケッチで試してみても255はシリアルモニタに表示されましたが、256は0となってしまいました。

"それでは1バイトを超えたバイナリデータを送信するためには?"とネットを探し回ってみたところ、
kougaku (id:kougaku-navi)さんの『Imaginary Code』というタイトルのブログから「Arduinoのシリアル通信でint型のデータをやりとりする」のページが分かりやすかったので、参考にしたいと思います。
"https://kougaku-navi.hatenablog.com/entry/20140501/p1"
このページでは「12345」と「-12345」の2バイトのバイナリデータを交互に送信します。

【配線図】
最初はXBeeを使わずに、シリアルポートのTX/RXを有線でつなげて試してみます。
Arduino_シリアル通信_ブレッドボード.jpg

【スケッチ】
送信側から「12345」と「-12345」の2種類のデータを交互に送り、受信側でどちらのデータがきたかチェックして13番ピンに繋がっているLEDをON/OFFします。500ms間隔でLEDが点滅すればOKです。
また、受信側に接続したシリアルモニタで数値を表示します。←追加

<送信側>
 ・int型のデータを上位バイトと下位バイトに分けて送信する
 ・データを正しい順序で受信するためにヘッダをつけて送信する
/*******************************************************************************
テスト用シリアル通信プログラム2byte(送信側)

++++++ note ++++++
・テスト用シリアル通信プログラム(2byte送信)
 TX→RX→PCモニタの一連の流れを確認する。
・下記URLのサイトからサンプルプログラムをコピー
 https://kougaku-navi.hatenablog.com/entry/20140501/p1

*******************************************************************************/
void setup() {
  Serial.begin(9600);
}

void loop() {
  sendIntData(12345); // int型データの送信
  delay(500);
  
  sendIntData(-12345); // int型データの送信
  delay(500); 
}

// int型のデータを送信する関数
void sendIntData(int value) {
  Serial.write('H'); // ヘッダの送信
  Serial.write(lowByte(value)); // 下位バイトの送信
  Serial.write(highByte(value)); // 上位バイトの送信
}


<受信側>
 ・3バイト(ヘッダ+int)以上のデータが着ているか確認
 ・データが着てたらまずヘッダがあるか確認
 ・ヘッダがあったら、下位バイトと上位バイトを読み取り、その値を合体してint型のデータを復元
/*******************************************************************************
テスト用シリアル通信プログラム2byte(受信側)

++++++ note ++++++
・テスト用シリアル通信プログラム(2byte送信)
 TX→RX→PCモニタの一連の流れを確認する。
・下記URLのサイトからサンプルプログラムをコピー
 https://kougaku-navi.hatenablog.com/entry/20140501/p1
・recv_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)

*******************************************************************************/
int recv_data; // 受信データ

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() { 

  // 受信バッファに3バイト(ヘッダ+int)以上のデータが着ているか確認
  if ( Serial.available() >= sizeof('H') + sizeof(int) ) {
    // ヘッダの確認
    if ( Serial.read() == 'H' ) {
      int low = Serial.read();        // 下位バイトの読み取り
      int high = Serial.read();       // 上位バイトの読み取り
      recv_data = makeWord(high,low); // 上位バイトと下位バイトを合体させてint型データを復元
      Serial.println(recv_data);      //recv_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)←追加
    }
  }

  // 受信したデータに基づいてLEDをON/OFF
  if ( recv_data == 12345 ) {
    digitalWrite(13, HIGH);
  }
  if ( recv_data == -12345 ) {
    digitalWrite(13, LOW);
  }
}




profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Arduinoで距離を測る(1)【超音波測距センサ with XBee】 [Arduino]

一旦、それなりにRC戦車のベーシック部分ができたので、これからの応用編に向けて、基礎知識(ネタ?)も集めます。

Arduinoで距離を測ります!
このネタって、まぁネットで検索すれば、ここより100倍は良いサイトがあちこちにあるので、別にここで取り上げる必要も無いんだけど、自分の備忘録なんで。。。

最初は、超音波測距センサを取り上げます。よくロボットとかの目のように見える部分ですね。
それで使うのは、超音波測距センサの「SEN136B5B」です。
これも買ってから一度も使う間もなくディスコン?になってしまったようで、ネットで探しても在庫が見当たりません。。。物持ちがいいのも考えものです。

これです↓
超音波距離センサモジュール 3cm-4m
SEN136B5B.JPG
"https://www.switch-science.com/catalog/795/"


ただ、単純にArduinoに繋げてスケッチで動かして、というのも少し面白みがないので、今後への応用のために取得したデータをXBeeで無線伝送しPCのシリアルモニタで表示できるようにしたいと思います。
※"https://www.arduino.cc/en/tutorial/ping"

【配線図】
超音波測距センサ with XBee_ブレッドボード.jpg

今回、受信側はArduino UNO(以下UNO)とXBeeを使います。UNOとXBeeとの接続には、配線図ではうまく表現できなかったのですが、XBeeシールドを使いたいと思います。

KKHMF XBeeシールド V03 モジュール 拡張ボード Bluetooth対応 Arduino用
XBeeシールド①.JPG
"https://www.amazon.co.jp/gp/product/B07SN3YHZF/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1"
中華製ですね。値段が安いのが決め手でした。

XBeeの確認をします。このときUNOはただPCとXBeeをつなぐ基板として使います。
最初、UNOに何も載せないでPCに接続します。
Arduino IDEを立ち上げて、
 メニュー> スケッチ例>01.Basics>BareMinimum
でUNOに書き込みます。
書き込みが終わったら、UNOをPCから取り外します。

シールドにはスイッチがついています。XBeeがやり取りする相手に合わせて切り替えます。
 USB:PC(USB接続)⇔XBee
 XBEE:UNO⇔XBee
しっかし、表示に統一感がないので分かりにくいですねー。XBeeから見ての接続先を表示するなら、下段はXBEEでなくてUNOだと思うんですけどね。未だにどっちがどっちだか分からなく時があります。。。
XBeeシールド②.JPG

今回は、PCとXBeeで直接やり取りするので、シールドのスイッチを「USB」側にします。
シールドをUNOに載せ、PCに接続します。
XCTUを立ち上げて、XBeeモジュールを認識できればOKです。

改めてスケッチを書き込む場合には、いったんUNOをPCから取り外し、シールドも外します。
再度UNOをPCに接続しArduino IDEを起動してから、受信側のスケッチを書き込みます。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

序章:Papilioで遊ぶ(その1):はじめに →中止しました。。。 [ZPUino]

2014年と言えば、今から6年前。その年に生まれた赤ちゃんも小学校に入学するくらい、それなりに長い月日が経つわけですが、そんな期間、押し入れにあったジャンクを2020年に引っ張り出してみます。
勢いで買った割には、そのまま押し入れ行き!?になっているものって、それなりにあると思いますが、前回までのRC戦車作製の調子に乗ったままに、掘り起こしてみました。

これ↓です。
FPGA版Arduino!!Papilioで作るディジタル・ガジェット
Papilio.JPG
"https://www.cqpub.co.jp/hanbai/books/48/48141.htm"

ArduinoとFPGAがコラボするなんて[exclamation&amp;question]、夢の競演[ぴかぴか(新しい)]と、当時は心躍ったものです。記録を見ると、初版が2014年11月1日発行で、購入日が11月22日(買った本に日付スタンプを押すほうなんで)ですので、ほぼ速攻で買ってるくらい盛り上がっていますね。
ただ、なんとなく世間の評価は低く?、ネットで検索しても、正直、ヒットしてなそうな雰囲気を感じて”自分は経営者には向いてないんだなー”、ちょっと切なくなるわけです。。。

ただ、やっぱり今でもコンセプトには共感していて、”これを使いこなせたら楽しいんだろうなー”という想いは捨て切れないものもあるので、しばらくこのネタで遊んでみようと思います。

で、やっぱり最後は戦車!?に行き着くのですが。。。(笑)



profile_picture_40×40.JPG

続きを読む


nice!(0)  コメント(0) 

リモートコントロール(RC)戦車をつくる【(XBeeコントロール)組み上げ~動作確認】 [RC戦車]

【組み上げ】
【車体(上面)】
XBeeリモコン戦車_プロト.JPG

【XBeeリモコン戦車とXBeeコントロール送信機】
XBeeリモコン戦車_プロト XBeeコントロール送信機と受信機.JPG
XBeeコントロール送信機で見えるピンクのリボンは、電池をケースから外すときに引っ張るリボンです。これが無いと固くて外れません。。。

【動作確認】
XBeeコントロールRC戦車のシェイクダウンです。なかなかスムーズに動作できたと思います。



【このシリーズはこれで完了します】
最初にリモートコントロールの戦車を作ろうと思い立ってから、2年も経っているんですねー[あせあせ(飛び散る汗)]。途中休み休みでしたが、何とかこのレベルまでは自作することができました。
赤外線とXBeeの両方で、前後左右とコントロールしてRC戦車を動作させることは出来ましたので、一旦はこのシリーズを完了としたいと思います。ベーシックな動作のところが出来れば、あとは、センサーだったりカメラだったり制御のためのインプットデータの違いはあるにせよ、応用編かな、と考えるからです。
これからも、興味の向くままに基礎知識を身につけて、バージョンアップができればいいなー、と思います。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

リモートコントロール(RC)戦車をつくる【XBeeコントロール受信機】 [RC戦車]

XBeeコントロール受信機を作製します。

RC戦車搭載のArduino Pro Miniとモータドライバが5V仕様なので、XBeeとの接続するためにBee3.3V⇔5V変換アダプタを使います。
XBeeエクスプローラ5Vマイコン用
"https://www.switch-science.com/catalog/1166/"

コネクタは6ピンインターフェースに合わせて、L字型をチョイスして付けました。
XBeeエクスプローラ5Vマイコン用.JPG

【スケッチ】
/*******************************************************************************
XBeeコントロール受信機

++++++ note ++++++
・ペアとして、XBeeコントロール送信機が必要
・ジョイスティックの方向と出力値のマッピング
7     8     9
 [左斜め上][右斜め上]
4 ←   5  → 6
 [左斜め下][右斜め下]
1     2    3

*******************************************************************************/
#define VERSION "1.00a0"

#define SPEED_0 0               //モータへの電圧(スピード)を3種類用意
#define SPEED_1 153             //0~255(MAX):Vref電圧を3Vまでに制限

int val = 0;                    //ジョイスティックからの受信データを一時格納する変数を定義

// set pin numbers:
 // 右キャタピラ用ピン
const int R_Vref = 5;           //D5(PWM)
const int R_OUT1 = 3;           //D3
const int R_OUT2 = 4;           //D4
 // 左キャタピラ用ピン
const int L_Vref = 6;           //D6(PWM)
const int L_OUT1 = 7;           //D7
const int L_OUT2 = 8;           //D8

// 初期化(電源投入/リセット時1回のみ実行):
void setup() {
// initialize the motor driver pin as an output(Arduinoにモータドライバへのピンが出力であることを伝える)
  pinMode(R_Vref, OUTPUT);
  pinMode(R_OUT1, OUTPUT);
  pinMode(R_OUT2, OUTPUT);
  pinMode(L_Vref, OUTPUT);
  pinMode(L_OUT1, OUTPUT);
  pinMode(L_OUT2, OUTPUT);
  
  Serial.begin(9600);                 //9600bpsでシリアルポートを開く
}
// main loop:
void loop() {
  if(Serial.available() > 0){         //受信したデータが存在する
    val = Serial.read();              //受信データを読み込み、その値をvalに代入
    switch(val){
      case '8':                       //前進
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '6':                       //右超信地旋回
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '4':                       //左超信地旋回
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case '2':                       //後進
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;  
      case '9':                       //右前進緩旋回
        analogWrite(R_Vref, SPEED_0); //右キャタピラの速度を遅く(停めて)
        analogWrite(L_Vref, SPEED_1); //左キャタピラの速度を速く

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '7':                       //左前進緩旋回
        analogWrite(R_Vref, SPEED_1); //右キャタピラの速度を速く
        analogWrite(L_Vref, SPEED_0); //左キャタピラの速度を遅く(停めて)

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '3':                       //右後進緩旋回
        analogWrite(R_Vref, SPEED_0); //右キャタピラの速度を遅く(停めて)
        analogWrite(L_Vref, SPEED_1); //左キャタピラの速度を速く
          
        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case '1':                       //左後進緩旋回
        analogWrite(R_Vref, SPEED_1); //右キャタピラの速度を速く
        analogWrite(L_Vref, SPEED_0); //左キャタピラの速度を遅く(停めて)

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case '5':                       //中立ニュートラル(Stop)
        analogWrite(R_Vref, SPEED_0); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_0);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);   //ブレーキ
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, HIGH);

        digitalWrite(R_OUT1, LOW);    //ストップ
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        break;
      default:
        break;
    }
  }
}




profile_picture_40×40.JPG

続きを読む


nice!(0)  コメント(0) 

リモートコントロール(RC)戦車をつくる【XBeeコントロール送信機③】 [RC戦車]

XBeeコントロール送信機の送信回路部を作製します。

XBeeはリモコンボックスの電源回路から3.3Vを印加できるので、XBee用2.54mmピッチ変換基板("http://akizukidenshi.com/catalog/g/gP-05060/")の電圧レギュレータを取り除いて、直付けします。
XBee用2.54mmピッチ変換基板加工.JPG

Arduino Pro MiniとXBeeは24ピンDIPソケットで実装しています。
コネクタは電源とGNDで2ピン、ジョイスティックからの信号用を4ピンコネクタとしました。
ジョイスティックのレバーが中立(ニュートラル)の状態では、モータを停止状態にしてRC戦車をしっかりと停めたいわけですが、電気的にオープン(どこにも繋がっていない状態)のようですので、このままでは電圧がフラフラしてしまいます。そこで、Arduinoのジョイスティックからの入力信号ピンを33kΩの抵抗を介してGNDに接続しています(プルダウン抵抗)。これでジョイスティックがニュートラル時でも入力ピンの値をLOWに確定できます。

【基盤実装】
・Top view
XBeeコントロール送信機_送信回路①.JPG
・Bottom view
XBeeコントロール送信機_送信回路②.JPG

【回路図】
XBeeコントロール送信機_送信回路図.jpg

【組み立て】
XBeeコントロール送信機_送信回路③.JPG

XBeeコントロール送信機forRC_Tank.JPG


【スケッチ】
/*******************************************************************************
 XBeeコントロール送信機

++++++ note ++++++
・ジョイスティックの方向と出力値のマッピング
7     8     9
 [左斜め上][右斜め上]
4  ←  5  → 6
 [左斜め下][右斜め下]
1     2    3

*******************************************************************************/
#define VERSION "1.00a0"

const int L_RED = 2;
const int L_WHITE = 3;
const int R_RED = 6;
const int R_WHITE = 7;

// 初期化(電源投入/リセット時1回のみ実行):
void setup() {
// initialize the remote_box signal pin as an input
//(Arduinoにリモコンボックスからのピンが入力であることを伝える)
  pinMode(L_RED, INPUT);
  pinMode(L_WHITE, INPUT);
  pinMode(R_RED, INPUT);
  pinMode(R_WHITE, INPUT);
  Serial.begin(9600); //9600bpsでシリアルポートを開く
}
// main loop:
void loop() {
  if((digitalRead(L_RED) == HIGH)&(digitalRead(R_RED) == HIGH)){ //前進
    Serial.print('8');
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
  else if((digitalRead(L_RED) == HIGH)&(digitalRead(R_WHITE) == HIGH)){ //右超信地旋回
    Serial.print('6');
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
  else if((digitalRead(L_WHITE) == HIGH)&(digitalRead(R_RED) == HIGH)){ //左超信地旋回
    Serial.print('4');
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if((digitalRead(L_WHITE) == HIGH)&(digitalRead(R_WHITE) == HIGH)){ //後進
   Serial.print('2');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(L_RED) == HIGH){ //右前進緩旋回
   Serial.print('9');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(R_RED) == HIGH){ //左前進緩旋回
   Serial.print('7');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(L_WHITE) == HIGH){ //右後進緩旋回
   Serial.print('3');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(R_WHITE) == HIGH){ //左後進緩旋回
   Serial.print('1');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
  else{
    Serial.print('5'); //中立ニュートラル(Stop)
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
}




profile_picture_40×40.JPG
nice!(1)  コメント(0) 

リモートコントロール(RC)戦車をつくる【ミスったー。。。】 [RC戦車]

やっちゃいましたー、プラスとマイナスの逆挿し!
見事にショートです。 orz

もちろん、注意していたつもりなんですけどねー。ちょっと手元が暗かったかなー?
ジャンパー線の赤と黒、交差にもなっていたので、見誤って挿しちゃいましたね。
すぐに白煙が上がって、焼けた臭いが凄いです。

ショートの跡.JPG

損害は、
・XBee × 2
・XBee3.3V⇔5V変換アダプタ × 1

XBeeは”s2"という販売終了品を使っていたので、片方がダメになったらペアで不用品となってしまいました。せっかく利活用出来ていたのに、残念です。。。

XBee3.3V⇔5V変換アダプタは、RC戦車搭載のArduino Pro Miniとモータドライバが5V仕様なので、XBeeとの接続するために準備したものでした。作成記事を書く前に召されてしまいましたね。。。
XBeeエクスプローラ5Vマイコン用
"https://www.switch-science.com/catalog/1166/"

XBeeとXBeeの変換アダプタは買い直さないとダメだから、大体6,000円強ですかね、被害総額は。。。 注意一秒、6,000円ですね。
#後日、XCTUでXBeeにアクセスしたところ、設定値とか読み出せたので壊れていなかったようです。買い直しもXBeeの変換アダプタだけで済んだので、よかったです。次は失敗しないように、電源を入れる前には念入り確認ですね。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

リモートコントロール(RC)戦車をつくる【XBeeコントロール送信機②】 [RC戦車]

------------------------------------------------------------------------
【トピックス】2020年5月。前回更新から約4ヶ月程度経ちました。その間に世界中で新型コロナウイルスの感染が広がり、日本でも”緊急事態宣言”が出されて極端な外出自粛となっています。そのため、この今年のGWは「ステイホーム週間」として家に留まることを強く要請され、観光や繁華街の人通りもまばらとなり、経済にも大きな影を落としています。たとえ感染拡大が落ち着いたとしても今まで通りの生活に戻ることはなく、ウイルスとの共生を前提とした新しいライフスタイルを模索していくことになる、と言われています。
------------------------------------------------------------------------

一応、送信機の方針は決めたのですが、レイアウトや実装をどのようにするか?は別問題です。
配置に失敗してもそう簡単には一からやり直すことができませんので、ここでのアイデアを慎重にまとめるため、多くの時間がかかっています。。。

XBeeコントロール送信機_リモコンボックス加工①.JPG
単三電池ケースをリモコンボックスの電池ケース内に入れたいので、リューターでプラスチックの出っ張りを削っていきます。

XBeeコントロール送信機_リモコンボックス加工②.JPG
リモコンボックスからの電源ラインを外へ引き出すため、ドリルで穴を開けました。φ3mmです。

XBeeコントロール送信機_昇圧回路結線.JPG

XBeeコントロール送信機_ミニユニバーサル基板.JPG
昇圧回路を結線します。昇圧回路はミニユニバーサル基板の上に載せて、単三電池ケースからのラインとジョイスティックへの電源ライン、あと先ほどのドリルで開けた穴を通すXBeeとArduino用の電源ラインを結線します。

XBeeコントロール送信機_リモコンボックス加工③.jpg
リモコンボックス内に単三電池と昇圧回路を両面テープ(超強力タイプ)で取り付けます。
テープ基材がクッションのようで柔らかいので多少のでこぼこは吸収してくれて、なかなかいい感じです。

XBeeコントロール送信機_XBee-Arduino部品配置_r2.JPG
次に、XBeeとArduino、コネクタの部位配置を検討しています。
下に見えるユニバーサル基板が、リモコンボックスの外側で搭載するのにちょうど良い大きさなので、このまま使用するとして、キツキツの実装になりました。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。