Introduction: もう一つの倒立振子(デジタル版)

Picture of もう一つの倒立振子(デジタル版)

半年前に投稿した「半日で作る倒立振子」の別バージョン(改良版)です。主な変更点は次の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に、これらファイルのリンクを追加したので参照してください。

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

Step 1: 材料をそろえる

Picture of 材料をそろえる

(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: 電装の準備

Picture of 電装の準備

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

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


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

Step 3: 躯体の組み立て

Picture of 躯体の組み立て

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

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


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

Step 4: 電装の組み立て

Picture of 電装の組み立て

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

  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: プログラムの書き込み

Picture of プログラムの書き込み

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番目の変数(躯体の傾きの変化率)を計測し、これを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 (C) 2014 ArduinoDeXXX All Rights Reserved.


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

Step 6: 動作の確認

Picture of 動作の確認

振子(倒立ロボット)の動作を確認します。

  1. プログラムの書き込みが終わったら、躯体を起こして電池スナップを接続する(写真②)
  2. 車輪が回転を始めるので、両手でその回転を止める
  3. 車輪を床に接地させ、躯体重心が車輪軸上に乗るあたりで、躯体が動かないように静止させる(写真③)
  4. ロボットが静止を確認すると、モーターの回転が緩み、「ミー」という小さなノイズがモータから出る
  5. そっと手を離し(写真④)、ロボットの上端を指で軽く押さえる
  6. この指を前後させ、ロボットが追従して動くことを確認する
  7. 押さえていた指を離すと、ロボットが少しバランスを取ろうとした後、転倒するのを確認する


作業の解説動画(ステップ5~6)


■解説(8)
本ステップの1段目の操作では、角度の変化をロボットが感知することで車輪が回転し始めます。そこでロボットに、倒立時の標準的な姿勢(角度)を覚えさせる必要があります。このロボットは、躯体が0.05秒間静止していたら、その時の角度を標準とするようプログラムされています。

したがって、躯体を起こして車輪が回り始めたら、両手でロボットの下部を持って車輪の回転を強制的に止め、ステップ6の4段目以降の操作を実行してください。

なお、しばらく静止させてもモーターの回転が緩まない場合、ジャイロ・モジュールの出力に一時的な異常が生じている可能性があります。この場合、ステップ1の【注意】の「ジャイロ・モジュールの問題点(2)」を参照して、モジュールのリカバリを試してください。

■トラブルシューティング(1)
躯体を起こしても車輪が回転しない場合、もっとも疑われるのは配線の誤りです。ステップ4に戻って慎重に確認して下さい。あと考えられるのはジャイロ・モジュールの不良です。この点については、ステップ1の【注意】を参照してください。

また、車輪は回っているのに指の動きに追従しない場合、もっとも疑われるのは、モータのリード線もしくはジャイロ・モジュールの配置が逆になっているケースです。さらに、モータ・ドライバICとarduinoのデジタル・ピンの配線に誤りがあるケースもこれに準じます。まずはステップ4に戻って慎重に確認してください。

なお、配線に誤りがないにもかかわらず、車輪が逆回転して指の動きに追従しない場合、ジャイロ・モジュールの出力値の符号が逆転している可能性があります。ステップ1の【注意】の「ジャイロ・モジュールの問題点(1)」を参照して、プログラムを修正してください。

■参考:追従振子の動作確認の動画

Step 7: パズルを解く

転倒振子から倒立振子になるための壁をスケッチ(プログラム)の修正でクリアします。

  1. ロボットが転倒する理由を考える
  2. ステップ5のプログラムに修正を加えて、転倒が防げるかどうか試す
  3. 試行錯誤が上手くいけば、転倒振子から倒立振子に脱皮して完成! (おめでとうございます)
  4. 完成したらステップ8を覗いた後、ステップ9のロボット操作を試してみる
  5. 試行錯誤が上手くいかなかったら、「1.」に戻るかステップ8(解答案)を見るかどうか悩む

Step 8: パズルの解答案

Picture of パズルの解答案

プログラムを修正して、振子を倒立させます。

  • ステップ5のプログラムの76行目と77行目を次の3行に書き換える(上書きする)

vE5 = sumPower; //76a
xE5 = sumSumP / 1000; //77a
// Copyright (C) 2014 ArduinoDeXXX All Rights Reserved.

  • ステップ6を実行する(6行目以降の指による追従確認は不要)
  • 手で静止させた状態で躯体の重心が車輪の軸上に近いところにあれば、ロボット(振子)は前後に少し往復した後で倒立状態に移行する
  • 振子がバランスをとりながら倒れないことを確認する
  • 振子がバランスを取りながら、少しずつ移動していく場合、74行目の「power」の後に、適当な数値(1~5程度の整数)を足し引きしてみる


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


■トラブルシューティング(2)
ステップ6をクリアしたにもかかわらず、振子が倒立せずに倒れてしまう場合、まず電池(単3×4本)を新しいものに換えてみてください。それで解決しない場合、ステップ5のプログラムの10行目から13行目の数値を変えてみてください。この内、最も効果があるのはたぶん12行目の数値だと思います。

Step 9: シリアル・モニタを使った振子の操縦

Picture of シリアル・モニタを使った振子の操縦

シリアル・モニタを使って、振子の向きと前進/後退の操縦を行います。

  1. ステップ8で修正したプログラムに後述の修正(4か所)を追加する
  2. 追加修正したプログラムをIDEでarduinoに書き込む
  3. 書き込みが終了したら、IDEからシリアル・モニタを起動する
  4. シリアル・モニタの右下を確認し「LFのみ」「115200 baud」に変更する
  5. ステップ6を実行して振子を倒立させる(5行目以降の指による支持は不要)
  6. シリアル・モニタの上部の入力窓に、0〜3の数字を入力して送信ボタン(もしくはEnterキー)を押す
  7. 振子の姿勢や動作が変わることを確認する


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


■解説(9)
シリアルモニタを使って、振子を回転させたり前後に移動させたりします。例えば、「00」と入力すると、「0」を2回入力したことになり回転幅が大きくなります。
・右回転・・・「0」を入力
・左回転・・・「1」を入力
・前進・・・「2」を連続して入力すると前方向に加速します
・後退・・・「3」を連続して入力すると後方向に加速します

■スケッチ(プログラム)の追加修正(4か所)

(1)ステップ8で修正したプログラムの17行目と18行目(*)の間に、次の5行を追加(コピー)する (*行番号は、ステップ5のpdfファイルで各行右側に付記している行番号(//xx)に準じます)

int drct = 0;
boolean right = false;
boolean left = false;
int fwdBck = 0;
// Copyright (C) 2014 ArduinoDeXXX All Rights Reserved.

(2)次に元のプラグラムの32行目を削除し、代わりに次の26行を追加(コピー)する

if ( Serial.available() ) {
drct = Serial.read();
Serial.println(drct);
}
if( drct == 48 ) { right = true; }
else if ( drct == 49 ) { left = true; }
else if (drct == 50 ) { fwdBck++; drct = 0; }
else if (drct == 51 ) { fwdBck--; drct = 0; }
if ( right == true ) {
analogWrite( 6, 140 );
digitalWrite( 4, HIGH );
digitalWrite( 5, LOW );
analogWrite( 9, 140 );
digitalWrite( 7, LOW );
digitalWrite( 8, HIGH );
delay(40);
} else if ( left == true ) {
analogWrite( 6, 140 );
digitalWrite( 4, LOW );
digitalWrite( 5, HIGH );
analogWrite( 9, 140 );
digitalWrite( 7, HIGH );
digitalWrite( 8, LOW );
delay(40);
} else if ( power > 0 ) {
// Copyright (C) 2014 ArduinoDeXXX All Rights Reserved.

(3)さらに元のプラグラムの55行目とDL26行目の間に、次の4行を追加(コピー)する

drct = 0;
right = false;
left = false;
// Copyright (C) 2014 ArduinoDeXXX All Rights Reserved.

(4)最後に元のプラグラムの74行目を削除し、代わりに次の2行を追加(コピー)する

sumPower = sumPower + power + fwdBck * 4; // 74a
// Copyright (C) 2014 ArduinoDeXXX All Rights Reserved.

Step 10: USBケーブルの切り離し

Picture of USBケーブルの切り離し

arduinoの電源を電池に代えて、倒立振子を完成させます。

  1. arduinoからUSBケーブルを抜く
  2. 2つ目の電池スナップに9V電池を接続する
  3. この電池をロボットの背部に、電池ホルダと共に輪ゴムで取り付ける
  4. この電池スナップのプラス側の線をarduinoのVinピンに刺す
  5. この電池スナップのマイナス側の線をarduinoのGNDピンに刺す
  6. 電池ホルダー(単3×4本)に1つ目の電池スナップが接続されていれば、車輪が回転し始める
  7. Step.6を実行して振子を倒立させる(完全な自立)
  8. 完成


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

Step 11: 発展

Picture of 発展

完成したロボット(倒立振子)を使って、発展的な課題に取り組んでみましょう。(これらの課題まで半日で行うのは、さすがに難しいと思います)

(1)無線で倒立ロボットを遠隔操作
部品点数を増やさないようにテレビの赤外線リモコンを使います。

操縦動画(ステップ11-1)


(2)Excelでシミュレーション
振子を車輪と胴体と頭の3つに簡略化して考えると、高校物理の範囲で運動方程式が書けます。これもパズル感覚ですが、運動方程式が書ければ、Excelでシミュレータを作れます。ステップ5の2つの係数(k1とk2)の大きさは、これで概略あたりを付けることができます。


(3)状態のキャプチャと分析
振子の状態をキャプチャして、その動きをパソコン上でリアルタイムに動画表示します(バーチャルな2Dアニメーションです)。さらに、キャプチャしたデータのログを用いて、プログラムが動作する様子を詳細に分析します。これらテーマについては、別のインストラクタブルとして改めて紹介したいと思います。

状態キャプチャに基づくリアルタイム2D動画(ステップ11-3)

Comments

yukono (author)2016-08-19

非常に勉強になる制作例ありがとうございます。一点気になったのですが、ジャイロモジュールl3gd20のspc,sdi端子に5Vが流入している様に思います。このモジュールは3.3Vで動作しているので、信号といえどマズイように感じます。動作が不安定になるのもこれが原因ではないかと思いますが如何でしょうか?

ArduinoDeXXX (author)yukono2016-08-20

ご指摘の点、普通は良くないですね。
ただ個人的になるべく簡素な工作が好きなので、信頼性を考慮しながら経験的に不要なものは外しています。

> 動作が不安定になるのもこれが原因では、、、
レベルシフトは試していないので分かりませんが可能性はありますね。(滅多に出ない症状ですが)

hiro_GSX1100 (author)2016-05-21

楽しい制作例をありがとうございます。私も作成してみましたが、残念ながら半日では作ることができず、随分苦労しました。ポイントはパラメータがハードコーディングされており、その調整に一々書き込みを行う点でした。シリアルで変更でき、EEPROMに格納する事を考えていましたが、本当に立つのか疑心暗鬼だったので、、疑ってすみません。

結局、たまたま設定したパラメータで立つことが分かったので、前述の点をプログラムに落とし込み、パラメータをシリアルで変更し、EEPROMに書き込むことができるプログラムを作成しました。これでパラメータの変更は超簡単になり、動作を確認しながらPCからパラメータを細かく調整できるようになりました。

今後の製作を試みる方々が、少しでも容易に、かつ失敗なく制作できるように、ArduinoDeXXXさんがよろしければプログラムを公開しようと思っています。如何でしょうか?

なお、ジャイロは安価はMPU6050を使用しています。

こんにちは
上手く倒立できて良かったです。サンプル・プログラムはできる限り短く簡明に表記しています。なので、皆さんの工作で、記事の内容を適宜追加・修正してもらうのは全く構いません。

ただ、サンプル・スケッチの追加・変更のご紹介は、この記事への投稿に限らせて頂きたいと思います。紹介の要領は、本記事のステップ9をご参照ください(サンプル・スケッチには行番号を適宜記入しています)。

この記事の利用は、皆さんの趣味の工作に留めたいと考えています。不用意な拡散は避けたいので主旨をご理解いただけると幸いです。

WhiteRenard (author)2015-10-22

The bot looks very interesting! I wish I knew Japanese. I'm gonna try google translate, hopefully it'll do!

WhiteRenard (author)WhiteRenard2015-10-22

Oh nevermind, just realized you have an English version! awesome!

MunakataT (author)2015-04-12

はじめまして、とても判りやすい解説で失敗なく倒立振子を製作出来ました。ジャイロが小型一般化した頃から作りたいと思っていたのですが機会に恵まれず半日で作るという表題に釣られました。公開ありがとうございます。短いですが製作記事をブログにしました。http://trhk.exblog.jp/21706931/

ArduinoDeXXX (author)MunakataT2015-04-13

こんにちは、ブログ拝見しました。

躯体のプレートは3Dプリンタで自作されたのですね。パーツの配置や取り付け等、個性的で興味深いです。また何か進展があれば教えてください。

K715km4Matu (author)2015-03-19

はじめまして。Arduinoを始めたばかりの初心者です 倒立振子に使われているArduinoは

3.3V動作のものでしょうか?レベルコンバーターは必要ないのですか?

教えていただければ幸いですが!

ArduinoDeXXX (author)K715km4Matu2015-03-19

こんにちは。デジタル版の方に初めての日本語のコメントを頂きました。
ご照会の件、使用しているボードは5V駆動の「UNO」です。
5V駆動のボードの場合、デジタル読み取りの閾値は3Vと2Vとのこと。http://www.musashinodenpa.com/arduino/ref/index.ph...

使用したジャイロ・モジュールには3.3Vを給電しています。
このモジュールの出力電圧は未計測ですが、上記の閾値は余裕含みのようなので問題ないと考えています。
http://traintrain.jp/blog/detail/mid/19270/date/20...

K715km4Matu (author)ArduinoDeXXX2015-03-19

返信ありがとうございます。

部品等を集めてまねして作ってみたいと思います、又わからない事があったら

質問させて下さい。

Shimejist (author)2014-11-05

https://twitter.com/YAMIKOMA_PR/status/528491180120489985

About This Instructable

55,051views

11favorites

License:

More by ArduinoDeXXX:ミニビーストを卓上ペットにするTraining Theo Jansen's Mini BEESTA Levitating Sphere Rotates Glows and Blinks with Arduino
Add instructable to: