本文へスキップ

未来の科学技術を子供たちに託す。 ジュニロボ <JRO>

〒619-0237 京都府相楽郡精華町光台8丁目

TEL. 070-5263-2200

jun@kinet-tv.ne.jp

【 作業場所 】初めに!!RECRUI

   このコーナーは、安価なセンサを教育用Robotに使えるようにしてみたり、新しいセンサを簡単に教育Robotに接続
  できるインターフェース基板を作ってみる作業場所です。
  これらの作業を行う為、技術アドバイザーとして、北海道在住の大湯さんにお願いして進めて行きます。

  大湯さんのHP : http://okgnz.web.fc2.com/index.htm

  ここで紹介している内容すべてに関しては、大湯さんに版権がありますので無断転用を禁止しています。

超音波距離センサRECRUI


   教育用Robot 用の標準センサは、品番:PING として現在の定価は \3,500−<数年前は¥5,500->です。
  通常、競技用Robotには数個(3個~6個)使いますので、超音波センサだけで1万円以上かかってしまいます。
  反面、ネットで調べると制御方法が異なるものであれば同性能で、1/10以下で購入する事が可能なので、なんとか
  付加回路を付けても ¥5,000-以下(4個のセンサ付き:ケーブル・コネクタ別)を目標に製作したいと思います。



























   大湯さんからのアドバイスで、付加回路(制御回路)には、AVRマイコンを使って教育用Robotにつなげてみます。
  1台の Robot に 2個のマイコンが必要かと考えますが、AVRマイコンは、\100/個程度なので1つの機能性電子部品と
  考えた方が当たっています。
  また複雑な制御とか、インターフェースの統一といった面をAVRマイコンに担当させるという事で、教育用Robot本体に
  負担をかけないし、入出力の規格の統一が可能となります。

   使用する超音波センサは、SainSmart社の HC-SR04 ¥190-〜 \500- ( 量産購入・円レート変動 )を使ってみます。
  標準品は、センサの入出力ピンは3本(内電源2本)ですが、HC-SR04は、4本(内電源2本)となっています。

   下図は、HC−SR04(4本足タイプ:入力1本、出力1本)の、タイミングチャートです。



   @ 外部から10μsのトリガーパルスを、センサへ出力します。
   A センサは、上記トリガーパルスにより、送信モジュールから 40kHz の周波数のパルスを 8 波 出力します。
   B センサから発信された超音波は、障害物にはね返ってセンサの受信モジュールに帰ります。
   C センサからの出力端子( Echo Pulse Output )には、距離に比例したパルス幅を持った信号が出力されます。
   D 距離=μs/58 で計算すると、実際の距離が算出されます。
   E トリガー信号の最短間隔は、60ms以上が必要です。(この間に他のセンサをトリガーして高速化を図る。)

  標準センサ(PING)は、入出力ピンが1本の為、1本の信号線が入出力となり時間差切り替えをしています。
  従って、1台のロボット(PICマイコン)には、最大4個しか接続できず接続ポートも固定されています。
  下記のプログラムは、TJ3BでPINGをコントロールしている部分です。( PING を CN10 に接続している)
  距離換算は、パルス幅を計測するのではなくDAコンバーターによりアナログに変換しています。




超音波センサ制御基板の製作(試作基板)RECRUI

   上記の様にTJ3B標準センサ(PING)では、TJ3B の PIC 内で入出力を切り替えて制御しています。

  今回は、TJ3B 標準の PING を使わずにローコストな超音波センサを使うので外部にセンサ制御する回路が必要となります。
  この制御回路をAVRマイコンを使って4個(最大)のセンサを接続し、制御と距離値に比例したアナログ値を出力する
  基板を製作します。

  

  上記回路図、下段中央部にWriter Connection がありますが、これはAVRへの書込み基板への接続コネクタです。

  AVR書込み基板回路は、「千秋ゼミ」HPに掲載せれている回路そのままです。

  























  コネクタ接続(ピンアサイン)は下記の通りです。




NC : Non-contact(接続されていない)

VCC : DC+5V












  再び、AVRマイコン基板の製作に説明を戻します。
  この基板には、RS232Cコネクターが2個< AVRーPC、Rasp PiーPC >取り付けてありますが、RS232C関係の
  参考資料を見てハンダ付けをします。











  同基板の、RS232C RxD、TxD に Tr( トランジスタ )を使っています。Tr の足は下図の様になっています。
  足は、Tr を下から見ているので、間違いが無いようにしましょう。
  コンデンサの表示の読み方は、下右図のようになっています。(拡大可)



日本橋で販売されている物は、一般にランク ’Z’ が多い。
ランク ’Z’ は、表示容量の -20% 〜 +80% と誤差大です
が、私たちが使用するうえでは、あまり問題にはなりません


















AVRマイコンに「Boot Loader」を書き込みRECRUI

   使用しているAVRは、ATmega168 を使っています。Atmega168 は内部にフラッシュROMを持っており
  内部消去、書き込みが出来ます。

   フラッシュROMの中に、「Bootloader」を書き込み電源をONすると「Bootloader」が約10秒間だけ
  動作して外部からのフラッシュROMに書き込むデータを待ちますが、その間に書き込みデータが来なけれ
  ば、自分がフラッシュROM内に持っているプログラムを実行します。

   今回使用する「Bootloader」は、ATmegaBOOT_168_diecimila.hex を使います。
  上記 ATmegaBOOT_168_diecimila.hex を書き込む為に「hidspxG」を使います。「hidspxG」はCUIソフト
  のhidspx を GUI化したもので<USBのHIDクラスを利用しています。
  HIDクラスは、Human Interface Device を扱うのでOSがUSBをサポートしていれば、特別なドライバを
  インストールしなくても使用できます。



  以下 「hidspxG」インストール手順です。

  ネット上から、「hidspx-2012-0326」をダウンロードします。
  最近は、もっと新しい物がありますが使い勝手であえて古いものをダウンロードしています。


  上記ファイルを解凍します。


  解凍後のファイル内容です。


  セットアップの実行です。


  セットアップ(STEP1)


  セットアップ(STEP2)


  C:\bin フォルダーが作られます。


  C:\bin 内の hidspxG 実行ファイルを選択


  hidspxG 立ち上がり画面 <Flash(*.hex)へ「ATmegaBOOT_168_diecimika.hex」を読み込み>


  RST ボタンを押すとDevice窓に接続しているデバイス名が表示される。


  デバイスが確認出来たら、まずフューズビットの書き込みをします。
  AVRマイコンには、Fuse Bits の書き込みが必要です。これによりAVRの内部回路の各種設定を行います。
  今回は、無条件に下記の様に設定してください。


  書き込みが正常に終了したかは、最下段の出力窓に表示されます。
  念の為、AVR の Fuse Bits を確認する場合は、隣にある Read ボタンを押して確認ができます。


  次に、Flash(*.hex)にある「ATmegaBOOT_168_diecimila.hex」をAVRに書き込みます。


  書き込みが始まると、下段にある出力窓に進行状態が表示されます。


  書き込みが終了すると、Verifying が実行され書き込みの確認が行われ無事終了すれば<OK>表示


  書き込み器を取り外して、右側の RS232C のコネクタにUSB-RS232C変換ケーブルを接続します。




  

「Arduino」で、プログラム作成                        RECRUI


  4チャネル超音波距離センサ制御プログラム仕様<スケッチ仕様>

  ■ スケッチ概略仕様

   * 接続ピン

    各チャネルと接続番号の関係<入力部>

    PING チャネル番号  AVRピン名  AVRピン番号  PINGピン名
      チャネル 0     D2       3     TRG 0
      チャネル 0     D3       4     ECHO 0
      チャネル 1     D4       5     TRG 1
      チャネル 1     D5       6     ECHO 1
      チャネル 2     D6       7     ECHO 2
      チャネル 2     D7       8     TRG 2
      チャネル 3     D8      14     TRG 3
      チャネル 3     D9      15     ECHO 3

    各チャネルと接続番号の関係<出力部>

    DACピン名      AVRピン名    AVRピン番号
    DAC0_nCS0      D14       23
    DAC0_nCS1      D15       24
    SCK           D16       25
    DI            D17       26
    nLOAD         D18       27

    チャネル 0、1 は、DAC0_nCS0 を「L」にしてアクセス。
    チャネル 2、3 は、DAC0_nCS1 を「L」にしてアクセス。
    チャネルに用意されているレジスタに、情報を転送する為、クロック(SCK)、データ(DI)、ロード(nLOAD)を利用します。

    動作確認モニターLEDは、定番のD13(19)に接続しています。

   * Loop 処理

    120msごとに、イベントトリガーを受け取り、「計測」−「計算」−「電圧出力」を4回繰り返し。

  ■ スケッチ詳細仕様

   * 割り込み

    割り込みは、タイマー割り込みだけを使用。
    MsTimer2 ライブラリを利用し、「120ms」ごとにトリガーフラグをセットすると同時にLEDを点滅させる。

    割り込みハンドラは、関数 update_trigger が担当。
    LED点灯消灯は、関数 send_led が担当。

   * 計測

    超音波距離センサにトリガーを与え、組み込み関数 pulseln で ECHO の時間長を測定。
    チャネル間のインターバルは、「23ms」ほど、pulseln で「13ms」、測定後処理に「2ms」、他のチャネルのトリガーによる反射波の
    影響を受けなくする為に「8ms」の間隔を開けています。

    トリガー出力は、関数 send_trg が担当。
    パラメータは、チャネル番号( 0−>3 )とした。

   * 計算

    エコー測定で、4チャネル分の時間を保存しておき、時間から距離に変換。
    時間から距離への変換は、関数 convertv が担当。
    物体までの距離が「400mm」のとき、「4000」とする。

    「400」としないのは、浮動小数点計算による時間消費とDAC出力の数値変換誤差をすくなくするため。

   * 電圧出力

    ひとつ前の計測と異なると計算する。

    距離から電圧への変換は、関数 calcx が担当。
     関数 calcx は、距離を16ビット符号なし整数で入力し、計算結果を16ビット符号なし整数で出力する。

    電圧出力は、関数 send_dac が担当。
     関数 send_dac は、1つ前の距離と異なれば再計算して、4チャネル分の電圧を出力後、関数 send_dac_primitive に情報転送を委託。

  ■ 関数仕様

   * update_trigger
     タイマー割り込み発生時の処理を記述。
      入力パラメータ : なし
      出力パラメータ : なし
      イベントフラグをセット後、モニターLEDを点滅。
      モニターLEDの点滅は、関数 send_led を利用。
      イベントフラグには、eflag を利用。
      出力パラメータを使えないので、eflag をグローバル変数で定義する。
      モニターLEDの点滅は、カウンタ xcnt の最下位ビットの値を利用。

   * send_led
     モニターLEDの点滅制御。
      入力パラメータ : 点灯、消灯指定の1ビット
      出力パラメータ : なし
      点灯、消灯の判定をし、Arduino のD13ピンに、1 か 0 を出力。

   * send_trg
     超音波距離センサの TRG のパルスを出力。
      入力パラメータ : 超音波距離センサの番号( 0 ~ 3 )
      出力パラメータ : なし
      対応ピンに 1 を出力後、11μs後に 0 に戻す。

   * get_duration
     超音波距離センサのECHO パルスの時間長を計測。
      入力パラメータ : 超音波距離センサの番号( 0 ~ 3 )
      出力パラメータ : 時間長( 32ビット符号なし整数 )
      対応ピンの H パルスの時間を計測。
      Arduino の組み込み関数に pulseln を利用。
      「13ms」でタイムアウトする。
      タイムアウトまで、H パルスが到達しないとゼロとする。

   * convertv
     時間長を距離に換算
      入力パラメータ : 時間長( 32ビット符号なし整数 )
      出力パラメータ : 距離の10倍( 16ビット符号なし整数 )
      デフォルトは、「4000
      時間長が 「2352.7μs」の時、「4000」になる様に計算。
      入力が「0μs」より大きく、「2353μs」を下回る時に計算。

   * calcx
     距離を電圧に換算
      入力パラメータ : 距離の10倍( 16ビット符号なし整数 )
      出力パラメータ : 換算値( 16ビット符号なし整数 )
      係数( 4096/5000 )を乗算

   * send_dac
     電圧値を出力
      入力パラメータ : なし
      出力パラメータ : なし
      ひとつ前の測定値と異なれば、更新し距離を電圧換算値に変換。
      距離電圧値換算は、関数 calcx を利用。
      情報転送を転送後、電圧出力を指示。

   * send_dac_primitive
     DACに情報を転送。
      入力パラメータ : DAC番号( 0 ~ 3 )
                値1 ( 16ビット符号なし整数 )
                値2 ( 16ビット符号なし整数 )
      出力パラメータ : なし
      DACは、デバイスに 2 レジスタを持つので、値1、値2で指定する。
      2レジスタは、A,B となっているので値1はAレジスタに転送、値2はBレジスタに転送する。

   仕様が決まった所で、PCに Arduino をインストールします。



   解凍後、フォルダー内の arduino.exe を選択します。



   Arduino の画面です。



   ここまで準備が完了すれば、あとは仕様書に基づき「Arduino」プログラムを作成して行きます。

   ここからは、次のページへ移動します。