フロント ブレーキパッド ローザ BE640E

By in Robots

63,157

12

12

半年前に投稿した「半日で作る倒立振子」の別バージョン(改良版)です。主な変更点は次の4点です。

 (1)部品入手の容易化(付随して、工作と倒立手順の簡略化)
 (2)部品点数の削減
 (3)プログラムの簡素化
 (4)ロボットの安定性改善

最初の2点は、英語版へのコメントを受けたものです。これら4点の具体的な内容については、紹介動画の下に整理したのでご覧ください。

紹介動画


(1)ジャイロ・モジュールの変更
オリジナル版は、アナログ出力のジャイロ・センサ(村田製作所製)を使っていました(*1)。 しかし、このセンサを載せたモジュール(もしくはその代替製品)は日本以外では入手が難しいようです(*2)。 このため本バーションでは、国内外を問わず広く入手できるデジタル出力のセンサ(STマイクロエレクトロニクス製)を載せたモジュールを使います

(*1)このセンサは静止状態の出力値が一定でないため、倒立動作の度に事前計測が必要でした。今回のデジタル出力センサはこの手順が不要です
(*2)このモジュールは、HPFを通して出力値に角加速度が混入します。このため、HPF無効化の微細な工作(はんだ付け)が必要でした。一方、今回のデジタル出力センサではこの工作は不要です

(2)モータ・ドライバICの変更
オリジナル版では、使用する2つのモータに対して、それぞれドライバIC(東芝製)を用意しました。 これに対し本バージョンでは、1つのIC(STマイクロエレクトロニクス製)で2つのモータを制御します

(3)タイマ・ライブラリを使った割込みの廃止
オリジナル版では、タイマ・ライブラリ(Ms Timer2)による割込み制御を行っていました(*1)。これに対しこの改良版では、外部のライブラリを使った割込み操作を無くしました(*2)。

(*1)これはオリジナル版の企画が、パソコン上のシミュレーションから出発したためです
(*2)下記参照

(4)センサのノイズ対策
上記のプログラム変更に合わせて、ジャイロ・センサのノイズを低減を目的とした変更も加えました(*2)

(*2)オリジナル版にも、これらの変更を施したプログラムを追加しています

以下では、この改良版に基づく倒立振子の作成手順を紹介します。 なお、本バージョン単独で完結した内容にするため、オリジナル版と重複があることをご了解ください。

* The English version of this instructable is available.

** pdfファイルのアイコンを表示するには、アドレス・バーのURL末尾の「?lang=ja」を削除してページを更新してください。それでも上手くいかない場合、オリジナル版のステップ12に 無限 フィット GK3-6 前期 サイドスポイラー 素地 塗装済み、これらファイルのリンクを追加したので参照してください。

*** これらの倒立ロボットの動作を解析し、その改良を試みた「倒立振子の研究」をアップしました(2014年9月)。

Step 1: 材料をそろえる

(1)躯体

 タミヤの「楽しい工作シリーズ」を使用します。


(2)電装

  • arduino UNO
  • ブレッドボード(小)
  • ジャンパ・ケーブル(20本ほど)
  • モータ・ドライバICSTマイクロ L298Nを1個  ← オリジナル版から変更
  • ジャイロ・モジュール秋月電子 AE-L3GD20) ← オリジナル版から変更
  • 単3電池を4本
  • 9V電池(006P形)
  • 電池ホルダ(単3×4本用)
  • 電池スナップを2個
  • 輪ゴム(数本)


材料紹介の動画(ステップ1)


【注意】 ジャイロ・モジュールについて

オリジナル版ではアナログ出力のジャイロ・モジュールを使いました。ここではデジタル出力のモジュール(秋月電子製)を用います。ただ、このモジュールを使って倒立振子を作ったところ、幾つか問題点が見つかりました。具体的には以下の通りです。実際に作る際には、上手くいかない時の原因解明のためにも、2~3個買っておいた方が良いと思います。

■ジャイロ・モジュールの問題点(1)
使用したジャイロ・モジュールの個別性を見るため、同じ型番(AE-L3GD20)のモジュールを2つ用意して動作を比較しました。その結果、驚いたことに、3軸中2軸で出力値の符号が逆転していました。このため、使用するモジュールの個体によっては、ステップ5のプログラムのDL29行目の右辺の「R + ry」を「R - ry」に変える必要があるかもしれません。

■ジャイロ・モジュールの問題点(2)
使用したジャイロ・モジュール(AE-L3GD20)は、何かの拍子に出力に異常が生じることがあります(*1)。そのような時は、arduinoからモジュールへの給電、もしくはarduino自体への給電を一旦カットして復旧を試してください。それでも駄目な時は、このモジュールを使ったより簡易なプログラムをarduinoに一旦アップロードし(*2)、その後改めて本来のプログラムをアップロードしてください。

(*1)静止時の出力がゼロと異なる、もしくはモジュールを動かしても出力値に変化が生じない等
(*2)ステップ5の本来のプログラムの下に「dgtlGYRO_L3GD20_SPI_recover.pdf」として添付します。arduinoへのアップロードの方法は同ステップの「■サンプル・スケッチ(プログラム)」を参照してください

■代替的なジャイロ・モジュール
日本以外では秋月電子製品の入手は難しいようです。一方、同じデジタル・センサを載せたPololu製のモジュールは、国内外を問わず入手できます。幸いデジタル出力のモジュールは、アナログ出力のモジュールと違い、センサが同じであれば出力形式も同じになるはずです。このためステップ5のプログラムは、Pololu製のモジュールを使っても、ほぼそのまま適用できると思います(*1)。なお、ピンの数や名前、配置についてはモジュールによって若干違いがあります(*2)。ちなみに、秋月電子とPololuのモジュールのピン対応は次の通りです(左から、秋月、Pololu、arduinoのピン)。

  • VIN・・・ #1, VIN, 3.3V
  • GND・・・ #8, GND, GND
  • SPC・・・ #2, SCL, D13
  • SDI・・・ #3, SDA, D11
  • SDO・・・ #4, SDO, D12
  • CS ・・・ #5, CS, D10

(*1)実際にPololuのモジュールを試したわけではありません。モジュール上でのセンサの取り付け方向によっては、利用する回転軸が秋月電子のものと異なる可能性があります。この場合、プログラムの一部変更が必要です
(*2)PololuのモジュールでVINピンに給電する場合、VDDピンには何もつながないでください

Step 2: 電装の準備

電装部品にピンとワイヤを取りつけます。

  1. モータにリード線を取り付ける(はんだ付け)
  2. ブレッドボード用のジャンパ・ケーブル(4本)を2つに切る
  3. モータと電池スナップのリード線(全部で8本)に、この切断したケーブルをはんだ付けする
  4. はんだ付けした箇所をテープで覆う(絶縁処理)
  5. 秋月電子製のジャイロ・モジュールにピン(2列)をはんだ付けする


作業の解説動画(ステップ2)

Step 3: 躯体の組み立て

タミヤの「楽しい工作シリーズ」を使って車体部分を組み立てます。

  1. ユニバーサルプレートにV字の切れ込みを作る(2か所)
  2. ユニバーサルアームセットのL字アングル(4個)をユニバーサルプレートに取り付ける
  3. ダブルギヤボックスを組み立てる(ギア比は114.7:1
  4. ダブルギヤボックスに付属モータ(2個)を取り付ける
  5. ダブルギヤボックスをユニバーサルプレートに取り付ける
  6. スリムタイヤセットの大径ホイールを組み立てる
  7. スリムタイヤをダブルギアボックスに取り付ける


作業の解説動画(ステップ3)

Step 4: 電装の組み立て

電装部品を組み立てて、躯体に取り付けます。

  1. 下記の「解説(1)」を参照して、モータ・ドライバIC(L298N)の2列のピンの並びを修正する
  2. ブレッドボードにモータ・ドライバICとジャイロ・モジュールを写真の通りに取り付ける
  3. ブレッドボードに輪ゴムを巻き、躯体のL字アングル(下の方)に取り付ける
  4. 上の配線図を見ながらブレッドボードにジャンパ・ケーブルを刺していく
  5. 配線図を見ながらブレッドボードに電池スナップ(単3ホルダに接続する方)のピン(2本)を刺す
  6. arduinoに輪ゴムを巻き、躯体のL字アングル(上の方)に取り付ける
  7. 配線図を見ながらarduinoにジャンパ・ケーブルを刺し、ブレッドボードと接続する
  8. 電池ホルダーに電池(4本)を入れる
  9. 躯体に輪ゴムを巻き、電池ホルダを取り付ける


作業の解説動画(ステップ4)


■解説(1)
今回使用するモータ・ドライバIC(L298N)は、ブレッドボードの中央の溝を跨ぐ形で取り付けます。しかし、このICのピン配列は少し変わっているので、そのままでは取り付け困難です。このため、ICの2列のピンにそれぞれ修正が必要です。

(1)短いピンの列:全体的にICの後ろの方にシフトする(→列幅を広げる)
(2)長いピンの列:全体的にICの右の方にややシフトする

■解説(2)
L298Nには電流計測用のピンが2つ付いています(#1と#15)。これらのピンを使うと、各モータに流れる電流を比較的簡単に計測できます。今回は電流計測しないので、これらのピンはGNDに接続します。

■解説(3)
ここで作った倒立ロボットにはスイッチが付いていません。電源のON/OFFは電池スナップの接続/取り外しで行ってください。

Step 5: プログラムの書き込み

IDEを使ってarduinoにスケッチ(プログラム)を書き込みます。

  1. arduinoとPCをUSBケーブルでつなぐ
  2. 電池ホルダに接続した電池スナップを外しておく
  3. 躯体を寝かせて静止状態にする
  4. 本ステップの下段にある「■サンプル・スケッチ(プログラム)」以下の内容を読む
  5. サンプル・スケッチを収めたpdfファイル「invertedRobot_v20d_noTimer.pdf」をPCに保存して(*)、その内容を全てコピーし、IDEでarduinoに書き込む (* ブラウザで開いてコピーすると、スケッチの体裁が乱れて上手くいきません。またpdfファイルのアイコンが表示されない場合、冒頭イントロ末尾の注記を参照してください)


■解説(4)
倒立振子の制御は、モータの回転力の調整で行います。この調整は、振子の状態を表す4つの変数を使った簡単な数式で表されます。
モータの回転力= k1 × 躯体の傾き(角度)
          +k2 × 躯体の傾きの変化率(角速度)
          +k3 × 車輪軸の移動速度
          +k4 × 車輪軸の移動距離

ここでk1~k4は、これら4つの変数の重視の程度を表す定数です。末尾のpdfファイルのプログラムでは、72行目の長い式がこの調整式に相当します。倒立振子を立てるには、これら4つの変数を適切に評価するとともに、これらに掛る4つの係数の値を上手く決める必要があります。

ジャイロ・センサは、この式の2番目の変数(躯体の傾きの変化率)を計測し ハリケーン ナロー4型 ハンドルセット 03年-08年 VTR250 クローム H014-048C JP店、これを16ビットの整数で出力します。そして、この出力値をarduinoが積算することで1番目の変数(躯体の傾き)を評価します。

一方、3つ目の変数と4つ目の変数の評価は、モータもしくは車輪の回転速度を計測して行うのが標準的です。このため、ジャイロ・センサとは別のセンサ(回転計)か物理的なメータ(電流計やステッピング・モータ)を用います。

しかしここで作ったロボットは、ジャイロ・センサしか使っていないので、3番目と4番目の変数の評価が問題になります。末尾のpdfファイルのプログラムでは、76行目と77行目の式で、これら2つの変数の評価するのですが、とりあえずパズルとして空白にしています。

■解説(5)
ここで使用するデジタル・ジャイロ・センサ「L3GD20」には、角速度の計測レンジが3つ用意されています。

  • ±250度/秒
  • ±500度/秒
  • ±2000度/秒

このセンサは計測した角速度を16ビットの整数で出力します(*)。したがってレンジが広くなると、分解能がそれに応じて低下します。ここでは、倒立振子ロボットのバランスをできるだけタイトに保つことを前提にして、最も狭いレンジを採用します。このレンジの分解能は、0.00875度/秒なので、センサの出力値にこの数値を乗じることで、直近の角速度を知ることができます。

(*)負の角速度は2の補数表現で出力されます

■解説(6)
センサとarduinoの接続はSPIインターフェースを利用します(*1)。arduinoとの接続に関する直接的な情報は、次の3つの解説記事(解説a解説b解説c)が参考になりました(*2)。本ステップの回路図のピン・マッピングについては説明を割愛しますが、興味のある方はこれらのサイトをご覧ください。なお、ここで取り上げた秋月電子製のジャイロ・モジュールの代わりに、Pololu製のモジュールを使う場合は、ステップ1の【注意】の「代替的なジャイロ・モジュール」をご覧ください(*3)。

(*1)I2Cインターフェースも選べますが、上手く倒立しませんでした。理由は不明ですが(**)、通信にタイマ割込みを使うせいかもしれません(**追記:プルアップしてなかったので、それが原因だと思います。ただし通信速度、部品点数の両面でSPIの方が有利です。Arduino Unoで敢えてI2Cを選ぶのは、PWMのピンを6本使いたい時、もしくはデジタル入出力のピンをできるだけたくさん確保したい時くらいでしょうか。)
(*2)SPIインターフェースに関する一般的な話については、また別のサイトを見た方が良いと思います
(*3)秋月電子製のモジュールをステップ4の通りに取り付けると、倒立振子の姿勢変化がY軸周りの角速度として出力されます。Pololu製のモジュールを使用する場合、これがX軸周りの角速度になるかもしれません。したがって、Pololu製のモジュールを使う場合、対応する回転軸やその方向を調べて、サンプル・スケッチのDL28行目の右辺の符号や2つの引数を変更する必要があるかもしれません。例えば、振子の姿勢変化がX軸周りで計測され、かつ出力値の符号が反転している場合、同式右辺は「- ( (L3GD20_read(0x29) << 8) | L3GD20_read(0x28) )」になります

■解説(7)
使用するジャイロ・センサをアナログ出力からデジタル出力に代えると(*1)、プログラムの一部を省略できます(*2)。その一方で、いくつかの変更と追加も必要になります(*3)。

削除(11行)
 ・出力レベルの初期確認(キャリブレーション)・・・8行
 ・その他・・・3行

追加(25行)
 ・SPIライブラリの呼び出し・・・1行
 ・モジュールとarduinoとの通信設定・・・16行
 ・モジュールの出力モードの各種設定・・・8行

変更(6行→7行)
 ・角速度の計測

(*1)ここで取り上げたのは、ジャイロ・センサの変更に伴うプログラム変更です。このため比較対象は、オリジナル版に追加した修正スケッチ(ver.2.0)を使っています。この修正スケッチは、当初スケッチと同じアナログ出力のジャイロを使いながら、タイマ割込みを廃止し、ジャイロ出力のノイズ低減を図っています。これらの修正については、オリジナル版のステップ5を参照してください。
(*2)使用するデジタル・センサには、温度センサが付いているため、初期の出力レベル確認のプロセスが不要です。したがって、倒立動作に入る前の準備(机上で数秒静止)も省略できます
(*3)プログラムに付記した行番号(例:「//10」)はオリジナル版の当初スケッチ「invertedRobot.pdf」の行番号に合わせています。また、本文の記述もこの行番号に準じています。このため当初スケッチ以外では、実際の行番号とは異なるので注意してください(例えば、「invertedRobot_v20d_noTimer.pdf」の有効行数は96行です)


■サンプル・スケッチ(プログラム)
まず下の「invertedRobot_v20d_noTimer.pdf(*1-5)」をPCに保存し、これをadobe Reader等のアプリで開いてください。次にその中身(全部で3ページ)を全てコピーしてIDEに張り付け、下記の注記のようなミスプリを修正した上でarduinoに書き込んでください。

(*1)ファイルをブラウザで開いてコピーすると、スケッチの体裁が乱れます。必ずダウンロードしてからコピーしてください
(*2)72行目が切れている場合、次に置き換えてください(オリジナル版とは一部異なります)

powerScale = ( kAngle * thetaI / 100 ) + ( kOmega * omegaI / 100 ) + ( kSpeed * vE5 / 1000 ) + ( kDistance * xE5 / 1000 ); //72

(*3)IDEやエディタにコピーすると、「//」の間にスペースが入る(「/ /」)ことがあるので修正してください
(*4)プログラム中にコメントとして付記した行番号は、オリジナル版の当初スケッチに合わせています(解説(7)参照)

(*5)Copyright ©フロント ブレーキパッド ローザ BE640E All Rights Reserved. (C) 2014 ArduinoDeXXX All Rights Reserved.


■ジャイロ・モジュールのリカバリ用スケッチ
ジャイロ・モジュールの出力値に異常が生じた場合、ステップ1の【注意】の「■ジャイロ・モジュールの問題点(2)」に従ってリカバリを試みてください。この内2番目の方法を試す場合、下記のスケッチ「dgtlGYRO_L3GD20_SPI_recover.pdf」を用いてください。このスケッチをarduinoにアップロードする方法は ハリケーン 130クラシックプルバック ハンドルセット 95年-99年 GB250クラブマン クローム H016-077C JP店、上の「■サンプル・スケッチ(プログラム)」に準じます。