2016年5月24日火曜日

Edisonのリアルタイム性を確認してみる。

MakerFairに申し込みました。結果は5月末までに返ってくるそうですが、どうかな?
とりあえず通るつもりで作業を進めていきます。

一応跳びましたので、ここからは腕つけてバランスとるのがメイン作業となります。
設計は本分なので、まぁどうにかなるとして、テスト機を作った感じだと、制御がちょっと課題かな・・・と思ってます。
というのも、現状の制御周期が200Hzと遅く、制御がやりにくくなっています。
もともとのロボットの固有ダイナミクスも、小型化の影響で高周波よりになっているので、制御周期はもっと短くしたいところ。

とはいえ、200Hzより周期を上げると、タイマー割り込みのタスクが時間内に終わらずに、遅延が出る状況です。
なので、下記3つのどこかを短くする必要があります。

 ①単純な演算時間
 ②センサの計測値取得の際の、I2Cの通信時間
 ③他のプログラムにCPUを奪われている時間

①は、大した計算していないので、効かないんじゃないかと。せいぜいフィルタの行列演算に少し時間がかかってるくらい。
②は、加速度センサ、距離センサ、エンコーダ、ホールICと複数相手に通信しているので、結構かかっていそう。
でも通信速度上げるくらいしか手が無い。
③はOSを積んでいることの弊害といいますか。ココのサイトによれば、標準のイメージであるYoctoLinuxはAlmost real time OS らしいですが、
やっぱりRTOSでは無いので、他のプログラムに処理時間を奪われているのかも。
であれば、タスクの優先度の設定等で改善するかもしれません。

そこで③で改善できるのを期待しつつ、タスクの優先度の設定3種類で、処理時間を計測してプロットしてみました。縦軸は処理時間で、横軸は割り込みの発生回数です。プロットデータはフィルタ演算時間(Kfilt)と、センサ群との通信時間(I2C)の2つ。
他のプログラムにCPUを取られると、少なくともこの2つのどちらかで、時間がかかって見えるはずです。 

1番上のグラフはタスクの優先度の設定無しの、デフォルトの場合です。タスクの処理時間が、回毎にばらついています。
2番目のグラフはMRAAでタスクの優先度をmaxに設定した場合。設定無しの場合に比べると、実行時間が僅かに短くなって、一定の処理時間に落ち着いているのが分かります。
3番目はRRポリシーでは無く、単純にFIFOで優先度を1に下げた場合です。2番目と大差ありませんので、上記サイトの記述通り、無暗に優先度を99まであげてもしょうがない、という事みたいです。

と言う事で、結論としては③は効いてはいるものの、②の方が改善の余地が大きいと言えそうです。
一応、EdisonのI2Cでは今の400KHzより早い3.4MHzが設定可能ではありますが、これがまた上手くいかない。
オシロが無いので憶測ですが、恐らく波形がなまってるのかな。これも調べるか、それとも手っ取り早くSPIに鞍替えするか・・・。

ちなみに、①のフィルタ処理も時間がかかっているように見えますが、こちらはリリースモードで走らせると劇的に短くなります。


使っている線形代数の演算ライブラリ(Eigen)の仕様なんでしょうかね?


***Edisonのタスク優先度設定のメモ***

・MRAAを使う場合
mraa::setPriority(99); //RR 0~99

・ポリシーなども設定する場合
#include <sched.h>
const struct sched_param priority={1}; // 0~99
sched_setscheduler(0,SCHED_FIFO,&priority);

2016年5月7日土曜日

2016年5月2日月曜日

アセン完了~

テスト機用の部品も回路も仕上がりましたので、組み上げとセンサチェックを行いました。
いやーアセンブリは癒しの工程ですね~ (と同時に組みあがらない恐怖もありますがw)

まずはモータとエンコーダの配線、エンコーダは回路の下段にくっつけます。 


次にモータと駆動軸を組み立てて、エンコーダの相方となるマグネットを取り付けます。
エンコーダの下に開けた穴に嵌るように、両者合体。


一旦センサチェックします。結果は良好で、マグネットの位置の調整は不要でした。



 他にホールセンサと、測距センサ等も取り付けて、全部組み上げたのがコレ。

?なんじゃこれ


って感じですが、ニョキッと生えてるのが実は脚でして、1軸のホッピングロボットになる・・・・予定。
まずはちゃんと跳べるか、という訳でバランスとるための腕は付けてません。

とりあえず跳んだらMake申し込んでみるつもりです。

2016年4月19日火曜日

Edisonのブートアップ時のピン設定って



回路作りますよ。

設計は以前買ったEdisonをメインにしましたが、これが意外と厄介でした。

回路図を見ていたところ、使用するモータドライバはデフォルトでプルダウン抵抗がついていて、初期LOWになっていました。
Edisonのハードウェアマニュアルには「GPIOピンは初期プルアップ」みたいに書いてあったので、
プルアップの強さによっては、電源投入時にモータドライバが予期せぬ動作を起こすかも?

という訳で、電源投入~プログラム起動までのピンの状態を確認しておくことに。
ついでに使用予定の他のピンも調べてみると、

はにゃ?ピンごとに状態が違う?


確かに、プルアップのピンもあるけど、プルアップの強さという以前に、浮いてる(nopull)ピンもあるぞ?というか、既にIOピンの方向がoutで出力がHIGHの奴までいる・・・。
しかもマルチプレクサでモードが選べるピンの場合だけ、といった事も無さそう。

ピン設定変えられないのかな・・・で見つけたのが

   Edison GPIO boot up configuration
  https://communities.intel.com/thread/78421?start=0&tstart=0

え?設定できないの?どうやら根が深い問題のようです。
他に余り情報が出てこないのですが、どうにかなっているという事でしょうか。詳しい方教えて下さい。

本当はプログラムの設定が走るlinuxのカーネル起動終了まで、周りの回路は落としておくのが良いのかもしれませんが、面倒なのでとりあえず、調べた初期ピン設定に合わせて設計する事にしました。


初期のピン状態の都合のいいピンを引っ張ったりして、ちょっと遠回りになりましたけど、とりあえずドライバ、IMU、ADCモジュールその他諸々、載せてみました。

次はセンサチェックですね。


*ちなみに、ピンの状態は以下の場所で調べられます。
/sys/kernel/debug/gpio_debug/gpio**

2016年4月14日木曜日

アルマイトかけてもらいました

 Makeの募集が始まりました。
締切を見ると、G.W.の前半ぐらいまでは作業進められそうかな。
頑張らねば。

さて、回路設計とかしている内に、アルマイト処理を頼んでいた部品が返ってきました。

頼んだ業者さんは会社のラジコン好きの先輩に教えて頂きました。注文用のパックがヨドバシで手に入るとは意外・・・。
元々スライダに使う部品の表面処理をしようと思ったのがキッカケですけど、既定量まで同じ値段で出来るので、折角なので他の部品もかけてもらいました。


左がアルマイト前、右がアルマイト後です。
アルマイトかけてもらうと、自前の部品でも一気に「ぽく」なりますね。発色も中々良い感じです。
ちなみに、ベアリングの嵌めあいはそこまで変化なしでした。
普通アルマイトって被膜厚で若干肉厚になるので、若干きつくなるかな?と思いましたが、むしろ気持ち入りやすくなった印象。
寸法きちんと測っておけば良かったですね。

2016年4月3日日曜日

マグネティックロータリーエンコーダーを買ってみました

ただいまテスト機の電装系の作業推進中です。
必要なセンサが割と多いので時間がかかりましたが、選定と設計は終了。

センサ選定の中でも、モータの回転数制御用に欲しい回転角センサ(エンコーダ)は、余り良いのが無くて悩んでました。テスト機のメインアクチュエータには、ジャンクMaxonDCモータを使用して設計してますが、安物なのでエンコーダついて無いんですよね。
後から付けるとなると、普通は光学式エンコーダ単体で買ってきてギヤなりカップリングなりで繋ぐんですが、意外と大きくて邪魔だし、値段も高いし、そも軸つなげんの面倒だし・・・。

出来るだけシンプル、小型に設計したいという思惑もあり、「安い早い旨い」なエンコーダを探していたら、Poloruのシャフトに付けられる小型エンコーダを見つけました。しかも丁度ジャンクMaxonモータは両軸仕様だから、穴径さえ加工すればくっつくかもしれない・・・!
というので、SwitchScienceさんに在庫があったので買ってみました。

手持ちのモータと比較
うん、 無理だこれは。
シャフト径2mmぐらいのモータになら何とか加工すれば付きそうな感じでしたが、今回シャフト径が3mmだったので、断念。


実はこの時点で、大きなエンコーダを入れない前提で機械の設計は進めていたので、シャフトに付かないとなると、エンコーダ用の軸は別途用意する事になり、加工と設計の手間が増えそう・・・。
ここはやっぱりセンシング側で頑張れないだろうか、非接触センサとかで。

で、候補に思いついたのが以下二つ。
①ホールセンサで歯車の凸凹を数える近接センサ
②ホールセンサアレイで磁石の角度を測る磁気式ロータリセンサ

①は秋月に売っていたので、すぐ試せそうだったんですが、分解能が歯数依存+センサ位置調整がシビアなのがネック。
②はアブソリュートエンコーダとして使える+センサ位置調整はシビアでは無い、というメリットがあります。
なので②に的を絞って探したところ、AMSのセンサでI2Cも使えるというモノを見つけたので早速購入。

左:AMS磁気式エンコーダ 右:Poloru光学式エンコーダ

チップ自体は小さいのですけど、扱いやすいDIPピンサイズで買ったのでpoloruのエンコーダより大きいです。とはいえ、十分小さいので取付は簡単そう。
分解能は驚きの14bit。実はPoloruにも似たようなシリーズで、マグネットタイプのエンコーダもありますが、方式が全く違うようで、そこまで分解能は高くありません。ただし、ノイズが大きいとそこまで分解能があっても意味が無いので、試しに出力の安定度を見てみました。

ギヤにくっつけてテスト
 結果としては、磁石が十分に近ければ値は最下位1bitが変動する程度で、遠い(今の磁石では3mm以上)と値がブレブレになります。実際に使う際は、センサが磁力の適切具合を判定して出力してくれるので、それを見ながらワッシャを挟んだりして距離を調節する必要がありそうですね。

というわけで、テスト機はこのエンコーダでやってみようと思います。磁石を貼り付けるだけでアブソリュートエンコーダが使えるという手軽さがあるので、制御含めて上手く行ったら他の軸にも使いたいな。

注)磁石は径方向着磁のモノでないとセンシングできません。

2016年3月29日火曜日

そろそろ・・・?

 今年のMakerFairも去年と同じで8月に開催ですね。
そろそろ募集が始まる時期が近づいてきました・・・。

今年こそ参加したいな!というわけで、年明けくらいからコツコツ検討を開始し、シンプルなロボットを作る事に。
小粒でピリリと辛い、くらいのネタになると良いな。


今はテスト機の設計と加工まで終わって、徐々に作業が軌道にのってきた感じがしています。

4月中に目指せテスト終了ー