Who is さくふわめろんぱん

さくふわめろんぱん(@skfwMelonpan)はロボットとか人工知能に興味があるパンです。
自分のために調べたことがみんなの役に立ったらいいなぁ。

2020年4月29日水曜日

二酸化炭素濃度を計測した話(1)

自宅で仕事をするようになり、換気の大切さを感じたという話です。
事務所ではたくさんの人が働いて窓も閉め切っていますが、床面積も広く以前よりはよく換気されている状態だと思います。(以前は昼過ぎになると妙に暑く、集中力がもたずウトウトするほどでした。)

一方、我が家はマンションの一室で、近くに幹線道路があるため防音対策がされている物件です。防音は良いのですが窓を閉め切るとほぼ密閉された状態になり、換気扇をつけると室内が減圧され玄関のドアが開きにくくなるほどです。閉じこもって作業するには良い環境とは言えません。

在宅勤務になる以前から、在宅勤務では換気が大切であることをTwitterで目にしていたので、以前買っていて使ってなかったCO2センサモジュールを用いて測定することにしました。(なぜセンサモジュールがあるのでしょうか)

用いたCO2センサはこれ
NDIR二酸化炭素センサーモジュール MH-Z14A

RaspberryPiに繋いだので以下のサイトを参考に(ほぼそのまま利用)させていただきました。
『Raspberry PiでCO2センサーモジュール(MH-Z14A)を使って室内のCO2濃度測定 』https://qiita.com/_shin_/items/dfdab160a49feaf4ba66 

計測結果は以下です。
1日の二酸化炭素濃度[ppm]の変化

二酸化炭素濃度はppmという単位で計測され、
一般に外気は370~400ppm程度、ビル衛生管理法では1000ppm以下にすることが義務付けられています。

計測結果を見ると以下のことがわかります。
・睡眠時も緩やかに増加している(0:00~7:00)
・料理で換気扇を利用すると一時的に減少する(12:00)
・窓を全開 にして換気扇を使用すると急激に減少する(13:30)
・窓を全開にしても400ppmくらいになるには30分程度の時間が必要(13:30-14:00)
・換気終了後は増加する(増加量は大きい)(14:00-18:00)
・外出すると減少する (18:15)
・窓を開放するだけでは外気と同等になるまで時間がかかる(23:00-)

気付きをまとめると、以下の3点です。
・就寝時にも換気が必要
・換気しても1時間たたずに基準値を超える
・出社していた頃は外出時間として濃度が減少していたので問題なかった

一方、気になる点がいくつかあります。
①換気後の曲線が急激に増加して、ある値に漸近するのはなぜでしょうか。
②ほとんどの時間で基準値の1000ppmを超えていますが、特に気分が悪いなどの症状がでているわけではありません。なぜでしょうか。
③常に窓を開放するわけにもいかないし、1時間ごとに換気するというのも面倒です。実用上どの程度の換気が必要なのでしょうか。濃度を制御することは可能なのでしょうか。

これらの問いについて考えたことをこの休暇期間に記事にしていきたいと思います。

2019年4月22日月曜日

マラソンに挑戦したこと

技術的なことを共有するために作ったこのブログですが、
現在は個人的な製作活動はしていないので、ずっとほったらかしになっていました。
ここ最近考えていたことがひと段落したので3年半ぶりに投稿します。


フルマラソンを走りました

給水所に置いてあったドーナッツに飲んだはずの水分を奪われる

先日、友人と初めてフルマラソンを走りました。ちゃんとトレーニングできた期間は1ヶ月くらいでしたが、無事完走(歩き含む)できました。そもそも私は中学時代に陸上部で長距離を走っていました。高校でも陸上部に入部したのですが、1年の夏に退部しました。簡単に言うなれば挫折ですが、他にも色々ありました。それから10年以上、運動経験などの説明を求められれば元陸上部(胸を張って言えない)ですと小声で言う人生を送ることになります。

趣味:映画鑑賞 の人

近所のTSUTAYAが返却もセルフレジになって子供向けアニメとかを借りる気まずさが消える

陸上部を辞めた私には趣味という趣味もなく、趣味の欄があれば映画鑑賞とでも書いていました。確かに映画を観ることは好きで、学生時代も今もTSUTAYAに足しげく通う日々です。

趣味:映画鑑賞の人曰く、映画の良さとは「映画の登場人物に自分を投影することでいろんな人生を味わうことができる」ことらしいです。かく言う私も映画の世界に没入する楽しみのために作品を貪り続けていた訳です。

そして時は流れ、今年の2月の終わり頃、観ていた映画があまりにも面白くなく、なぜ好みではないのかを考えていました。そこで、私が映画に求めているのは、劇的に主人公のマインドが変化していくドラマチックなストーリーであることに気づきます。そして、自分の生活には起こらないドラマチックな変化を、フィクションに求めては消費し続けてることを省みて、少々落ち込みました。

趣味:ジョギング の人

何かを目指して努力することに憧れてフルマラソンに参加登録し、完走を目指して週3くらいでジョギング(努力)していました。完走できたことにより、私は晴れて趣味:ジョギング の人になることができました。

趣味:ジョギングの人曰く、ジョギングの良さとは「誰かと競争する訳ではなく、自分の限界を広げることができる」ことらしいです。かく言う私も自分の限界を広げる楽しみと健康志向な生活のためにジョギングをしていた訳です。
3時間分くらいのプレイリストを用意していたが、手違いにより終盤で聴きたいアゲアゲな曲が最初に流れる


何かを目指して努力すること

今後もジョギングを続けていきますが、マラソン大会に出ようとか、タイムを縮めようとかは考えていません。そもそもジョギング程度で自分がドラマチックに変わったとも思いません(体重もあまり変わりません)。ただ、漫然と他人のドラマを消費するのではなく、自らが何かを目指して努力することを続けていきます。

2015年10月6日火曜日

RaspberryPiをロボットに使うこと

コンテスト用のロボットにLinuxボードを使うことについて


RaspberryPiが登場したとき、当時マイコンに挫折してた僕の目は輝きました。そしてRaspberryPiを使ったロボットで2つのコンテストに参加しました。周囲にLinuxボードを使う人が増えてきたのは感じますが、ロボットのコンテスト界隈に変化は起きていないように感じます。対してArduinoは確実に浸透して、変化をもたらしたように思えます。そこで、なんでRaspberryPiでロボコンが難しいのかを考えてみました。

難しさ1:初期設定の手間


マイコンは基本的に初期設定とかないし、あるとしても決まった手順を行えばいいです。RaspberryPiなどの初期設定は自分の持っている環境にもよるし、そもそもOSが違えば全く別物なわけです。さぁ買って使おうというときにこうやってつまづくのはテンション下がる。調べた通りにやってるけど自分の環境のせいでうまくいかないなんてことがザラです。

難しさ2:起動時間


これがマイコンからRaspberryPiにすんなり移行できない最大の要因です。マイコンは電源を投入したらすぐ動いてくれます。(モノによってはスタートボタンがあったり)RaspberryPiの場合は電源を入れてプログラムが勝手に動くようにもできますが、OSの起動時間がしばらくあるのでコンテストの競技開始時にスイッチを入れる訳にはいかないのです。電源はあらかじめ入れておいて、スイッチか通信でプログラムを実行する他ありません。

難しさ3:できることの多さ


これはRaspberryPiを使う目的でもあるので、はまりがちなところ。ネットで調べれば分かるように何でもできるのですが、すべてを同時にできるとは限らなかったり、重要でない処理のために全体の処理能力に負担をかけたりします。

難しさ4:複数のプログラムの実行


LinuxというかOSというものは、複数のプログラムを実行するために存在しています。その技術の恩恵をうけて複雑なプログラムを機能ごとに分割したりできます。それに対してマイコンでは基本的に大きな1つの(全部入り)プログラムを書き込むという発想しかなかったので、こういった知識が足りず難儀します。(しました)
例えば...
・実行するプログラムが増えると処理が落ちる
・どれか1つのプログラムが異常終了してたりする
・機能を細分化しすぎて無駄ができる

難しさ5:ノウハウ


研究でLinuxベースのロボットを作ってたりとなると、ここに書いたようなノウハウがあるのだろうけどみんながそうではないですよね。そういうのってノウハウが一般的(あたりまえ)なことすぎて教科書レベルのことから勉強しなくちゃいけなかったり、それこそ経験しないと身に付かないものだったり。RaspberryPi用のロボットOSを勉強するのもアリかもしれません。

結論


コンテスト用のロボット制作というのは、プログラムを書いてテストして修正するのを何回できるかが大きく結果に関わります。そのルーチンをどれだけ速く回せるかにかかってるのに、OSの起動時間なんて待ってられません。今のところの経験をまとめると3点。

  • RaspebrryPiは起動した状態で扱うこと
なるべく早い段階からモバイルバッテリーなど駆動用とは別の長時間つかえる電源で開発を進めましょう。
  • 確実な通信を確保すること
有線LANで直接パソコンにつなぐ通信がベスト。代替えとしてシリアル通信もあり。とにかく通信できないのが一番焦る。
  • 操作基板をつくること
スイッチやインジケーターを載せた基板を使って開発する。単独でも機能するのが1番強い。

従来のマイコンの代わりように使うことが必ずしも良いとは限りません。また、RaspberryPiを使いこなせばマイコンなんて要らないということもないでしょう。うまく使っていきたいものです。

2015年10月4日日曜日

ArduinoでのGPSのデータ処理(ver2)

このブログのアクセス解析を見るとArduinoでGPSを使う記事がよく見られています。
だけど昔に書いたコードだし、いろいろプログラムとしては微妙だなぁと心苦しかったので書き直しました。

String型のDataという配列のData[0]から順番にNMEAのデータが入っていくようになっています。緯度と経度と方位を取得したいのでGPRMCのフォーマットを想定して書いてあります。

学部1年生にも理解してもらえるようにしたかったので、本当はString型の変数を使わないで、char型だけで数値まで持ってきたかったのだけど、汚くなるので断念。String型はメモリも消費する気がするので、多用したくないね。便利だけど。
あと、文字を判定するif文はswitch case文にしてもいいかもね。

フローチャートはこんな感じ。
まだ一般性のあるプログラムとも言えないですが、前よりは良くなったと思います。

簡単に説明すると、
・1文字ずつ読み込んで、文字列にしています。
・NMEAデータをカンマ区切りで文字列型の配列に入れています。
・NMEAデータを1行ごとにデータ処理(数値に変換)しています。
・緯度と経度をlong int 型に変換しているけれど、本当に使う下部分だけにすればint型で十分です。

そのタイミングでロボットの制御をすれば取得周期(だいたいのGPSモジュールは1秒)で制御できます。
もっと制御したい場合は工夫してください(丸投げ)

2015年9月3日木曜日

能代宇宙イベント2015に参加してきました


すこし報告が遅くなったけど、能代宇宙イベントに参加してきました。
能代に行くのは2度目で2年ぶりです。

機体名は「CLOVER」(クローバー)で、ミツバのクローバーのように3方向にプロペラがついています。パラシュートによって減速しながら推進する方針です。

CLOVERの外観
オレンジのがプロペラで
上についてる白いのがパラシュート
ハードウェア構成は
・RaspberryPi
・ブラシレスモータ
・ブラシレスモータ用のスピードコントローラ
・Li-Poバッテリー
・センサ類(地磁気、加速度ジャイロ、気圧、距離)
・GPS
・Xbee

ソフトはほぼ全てPythonで書きました。
プログラムについては備忘録の意もこめてまた後で詳しく書きます。

結果はブラシレスモータが駆動せず、投下、ログ取り実験に終わりました。
それ以外のセンサやGPSやXbeeの通信はうまくいったので悔しいです。
自作のパラシュートがうまく開いてきれいに減速できてたのは満足しました。

ブラシレスモータが駆動しなかったことを詳しく説明すると、
ブラシレスモータのスピードコントローラの設定がうまくできませんでした。
原因はおそらくRaspberryPiのソフトウェアPWMが安定していないことです。
回路的に作り出したPWM信号ではないため、他の処理に影響されて信号のduty比が乱れます。
設定がうまくいったとしても、実際の駆動が安定したかも保証できません。

現在はPWM信号の発生を専用のICに任せる方針で調整しています。


2015年8月2日日曜日

RaspberryPi 起動したらプログラムが動いてほしい


RaspberryPiを買って、ずっとHDMIとかでディスプレイにつなげて使ってる人は稀ですよね。最初の設定でちょっと使うけれど、ネットワークの設定とかが済んだらパソコンからssh接続したほうが楽ですからね。

そうやってRaspberryPiを使ってて不安なのは、起動はしてるだろうけど、どこまで起動したかわからない。ssh接続したいけど、もう起動したかな・・もうちょっとかな・・。っていうのを毎回考えてしまいます。

それとはまた別で、自律ロボットのためにRaspberryPiを使っている人は分かるとおもうのですが、毎回電源入れてネットワークで接続してプログラムを起動するというのは手間です。それに、ネットワークがない場所(屋外とか)で動かすときや万が一ネットワークがダメなときに、電源を入れ直したら動作するようになっていて欲しいのです。

少なくとも「GPIOピンに繋げたスイッチを押すとプログラムが動き出す」っていうプログラムが起動して欲しいわけです。(ややこしいけどわかるかな?)

最初に書いた起動してるか分からない問題も、起動したらLEDを点滅させるとかネットワークでなんかするとかいうプログラムを書けば解決ですよね。

起動したらプログラムが動く方法その1

Linuxが起動するときに実行させる

LinuxのOSが起動するときに、最初から入ってるプログラムがばーっと動いて実行されます。RaspberryPiをディスプレイに繋げて起動したときに見える大量の文字列は、初期設定とかネットワーク接続とかいろんな作業をしてくれているわけです。

そのうちの1つとして実行する方法があります。
/etc/rc.local
というファイルの exit 0 の前に書き込む方法です。
このファイルで実行するのは初期設定の変更関係にしましょう。
ネットワークのIPアドレスだとかの設定に使えます。

起動したらプログラムが動く方法その2

ログインしたときに実行させる

もう1つの方法はログインしたときに実行する方法です。
ログインしたときにプログラムを起動するのはMacやWindowsでもある機能ですよね。
/etc/profile
にrc.localと同様に書き込むとログイン時に動作します。
あとは起動したときに自動ログインをするようにすればよいですね。
/etc/inittab  の
1:2345:respawn:/sbin/getty 38400 tty1
をコメントアウトしてその下に
1:2345:respawn:/bin/login -f ユーザー名 tty1 </dev/tty1>/dev/tty1 2>&1
って書いて保存っと。

これで起動→ログイン→プログラムが起動という流れになります。
ちなみにsshでログインするともう1つ余分にプログラムが回るので注意。

ちょっとしたメモ

Pythonのプログラムを起動するとき普通は、
$    Python ./program.py
見たいなコマンドにしますが、GPIOとかファイル操作をするときは実行権限がないとプログラムが途中で止まってしまいます。なので自動実行させる時はsudoで実行しましょう。
$   sudo python ./program.py
それと、バックグラウンド処理(背後でプログラムを動かして他の処理をする) をしたい場合はアンパサンドをつけましょう。
$   sudo python ./program.py &
sudoで実行することのもう一つの利点は、sudoのプロセスを止めるとプログラムが止まってくれることです。 killallってコマンドで一斉停止ができます。
$   sudo killall sudo
なんかプログラムが暴走してるときとかに便利です。 

2015年7月31日金曜日

3軸デジタルコンパスHMC5883L 3軸の謎

Amazonとかで手軽に買えるデジタルコンパスにHMC5883Lがあります。
データシート(http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/HMC5883L_3-Axis_Digital_Compass_IC.pdf

これは3軸コンパスといってX軸、Y軸、Z軸方向にかかっている磁場を測定できます。
普通のコンパス用途ならX軸、Y軸の値だけでかまわないし、海外のサイトでもZ軸を扱っていない場合が多いです。

基本的なデータの取得に関しては他のサイトやブログで十分なので、取得できた値をどうすればよいかという話を書いていきます。

補正

まず、重要なのはデジタルコンパスは使うためには補正が必要だということです。
このコンパスをきれいに使うには2つの補正が必要!
理解するためには計測している対象である地磁気について知っておく必要があるかもしれません。(参考:国土地理院のページ
地磁気は地球上どこでも、南極から北極にむかう方向の矢印だと思ってください。
その大きさは東京付近で約45000nTだそうです。(wikipedia より)
(※)1nT(テスラ) = 10μG(ガウス)なので 45000nT=0.45G
センサは±8Gまで測定できます(0.45 < 8 はずいぶん大きい)
測定範囲を設定することができるようです。(データシートP13)
こうした方が精度良く測定できそうですね。(最小範囲は±0.88G : 分解能は0.73mG)
デフォルトでは±1.33G : 分解能は0.92mGになっています。
よく scale = 0.92 という変数がプログラムに散見されたが、このことだったのか。
つまり、センサの値を丁寧にガウスに変換してたのね。
でも最終的に角度が欲しいだけならそんな几帳面さ要りません。
角度は比率でとっちゃうし、地磁気の大きさなんて実際つかえない。
地磁気の大きさ以外に、向きも場所によって変わります。
それが変わっちゃお手上げなのですが、そんなにコロコロ変わるものでもありません。

偏角と伏角(へんかくとふっかく)


偏角は水平方向の角度で、コンパスが指す方向と北極の方向のズレです。
東京では+7°くらいずれます。最終的な方角に-7°してあげましょう。
GPSによって取得できる緯度は北極方向の測地線なので、GPSとコンパスを使う場合には少し気にしましょう。
伏角は磁場が地面にめりこんでる角度です。
僕もこれを知るまでは地磁気は地面に平行だとおもっていたのですが、結構めりこみます。東京で地面の下に49°くらいの角度です。
つまりデジタルコンパスのZ軸方向の値は負です。
図にするとこんな感じ。

センサの内部的な問題


偏角と伏角のように場所に依存するのではなく、センサの内部的な問題で磁気が記憶されて電圧が多く乗ってしまったりということがあるようです。(よくわかってない)
具体的にどういうことになるかというとこんな感じです。



定常的に誤差がのるので使う直前にこの誤差をオフセットとして算出して打ち消すようにします。
どうやるかというと、一定時間センサで値を取り続けながらセンサをグルグル回します。センサをいろんな角度になるようにしてください。グルグルというより、ぐるんぐるんに回さないといい補正はできません。そのようにして取った値を3次元空間にプロットすると、上の図のような球面になります。その中心を計算してオフセットとして差し引きます。簡単に計算するために
球の中心のx座標 = (xの最大値 - xの最小値) /2
球の中心のy座標 = (yの最大値 - yの最小値) /2
球の中心のz座標 = (zの最大値 - zの最小値) /2
としてますが、もっと正確には、数値解析的に最適にフィットする球面で近似して中心を求めた方が良さそうです。(あ、これやってみたい)

角度へ変換

ここまでだとまだセンサの値はx,y,z方向にかかる地磁気の強さです。
補正されたとしても、これを見て方角が分かる人はそんなにいないでしょう。
(x,y,z)という変数の直行座標系を(r,θ,φ)という変数の球面座標系に変換します。
r : 地磁気の大きさ
θ : z軸からの角度
φ: xy平面に投影したときのx軸からの角度
基本的に方角を知る上で必要となるのはφ(xy平面上の角度)だけですね。
θを使えばセンサの傾きも取得できるはずなのですが、うまくできません。

変換公式

逆三角関数をつかうのでマイコンによってはヘビーかもしれません。
また、地磁気の向きがz軸と重なるとφの値が定まりません。
(なるべく水平に使った方がφが安定するよということ)
置き方によってそうなるかもしれない場合は変数を調整するといいかもしれません。

式を見るとわかるようにφの式にzは使われません。
ということで結局z軸の値はあまり使われないということでした。
でも3軸である以上は何か使い道があるはず。

1つは傾きを知れることなのですが、傾きすぎると方位の値がぶれます。
よく考えたら、方位磁針を縦向きに置いたら方位がわからなくなるのはあたりまえですね。

地磁気センサ単体で傾きを知るのは難しいかもしれないので、加速度ジャイロセンサと組み合わせることで、加速度ジャイロセンサの示す姿勢に対して地磁気がどちらに働いているかというのを提示するというのがいいのかもしれません。

球体方位磁針のように考えて、制御に活かせると新しいかもしれませんね。
3次元方向に制御できる対象というのも普及していることですし。

2015年7月28日火曜日

RaspberryPi でセンサーを使おう

今回のCansatに搭載するのは

  • GPSモジュール PA6C
  • デジタルコンパス HMC5883L
  • 加速度ジャイロセンサ MPU6050
  • 気圧センサ BMP180
  • 超音波センサ 
の5つ。
これらを統合して20msec周期での制御ができればよいと考えています。
今回の記事では上3つを扱うPythonプログラムを公開します。
拾ってきたプログラムを改変して、ある一定の時間だけログをとり続けるためのプログラムにしました。
ファイルの読み書きをするプログラムを書くよりも、標準出力するプログラムを
$ ./Program.py > data.txt
のように実行した方が楽です。


GPS PA6C

今回のGPSの取得はRapsberryPi (B+) のGPIOピンにあるTX0,RX0を使ってシリアル通信をします。とりあえず読み込んでファイルに書き込むだけのプログラムです。他のセンサも同様ですが、行頭にプログラム開始からの時間を出力しています。

デジタルコンパス HMC5883L

通信はI2Cです。pythonでI2C通信をするためにはインポートしなくてはいけないモジュールがあります。
今後は35行目のスケールを自動補正するプログラムが必要となります。
加速度センサ MPU6050


通信はI2Cです。
加速度は距離を時間に関して2回微分した値なので2回積分しなくてはいけません。
ジャイロは角速度なので1回微分すると角度になります。
積分操作をする場合は何かデータを処理してからではないと、多くの誤差を含んでしまいます。
そのための操作(フィルタリング)について考える必要があります。

2015年7月12日日曜日

Processingで3D描画してドヤ顔しよう

僕はよくProcessingで3Dの描画をして遊ぶのですが、
これが意外と簡単な割に「なんかすごい」感を出せる。

・キーボード操作 keycheck()
・XYZ軸の描画 drawAxis(float length);
・XYグリッド平面の描画 drawGrid(int size, float length);
という関数に分けて使い回しています。

キーボード操作は、
・矢印:左右回転、上下回転。
・Z,X:ズームイン、ズームアウト
変数を追加すればもっと操作を増やせます。
回転の向きは逆に感じる人もいるかもしれません。正負を逆にしてみてください。

Simple3D.pde (Google Drive)
https://goo.gl/quQW4O

2015年7月11日土曜日

パラシュートを作ろう

Cansatに使用するパラシュートを作ろうと思います。
パラシュートはいろんなところで利用されているので、パラシュートの研究ってのはたくさんされてて、理論的なことがネットにもたくさん書いてあります。
色々調べた結果がこれです。

・落下方向に垂直な面積が大きいほどゆっくり落ちる
・上に穴を開けると、風にながされにくく、安定する
・穴を大きくするだけ、はやく落ちる

いろんな数式をつかった理想的なパラシュート設計をしても、僕らが作れる限界というのがあるわけでして、「とにかくでかくていいの」という曖昧な目標でがんばります。

そこでここ最近考えていたのは、そもそもパラシュートを何枚かのパーツで作るには、その1枚の形ってどうつくればいいのだろうと。


ご存知のとおり、地球儀を平面地図にするように丸い球面は平面にできません。同様に平面からも球面をつくることもできません。(布とかを伸び縮みさせるならできなくはなさそう)

よって、平面の張り合わせで近似した球面をつくる方法を考えました。
試行錯誤の結果到達したのが、多角形を積み重ねる方式です。
(なんだそんなことか・・って思うかもだけど、結構なやみました。)
つまりどういうことかというと
このように球面に内接する6角形をつくって...

頂点を結びます。


これは単純に曲げただけの平面なので、平面にのばすとこんな感じに。


これはProcessingでゴリゴリ描いたのだけど、
もっとスマートに数式にするとこんな感じです。


とまぁ。こんな感じでパラシュートができるとうれしいな。

2015年7月2日木曜日

能代宇宙イベントに参加します

久しぶりの投稿です。
今年の8月、能代宇宙イベントに参加します。

ピクトラボの使用許可がおりたので、これからはピクトラボで活動します。
とはいっても残り1ヶ月ちょっとしかないので結構あせってます。
必要なモノとかの発注が間に合うかどうか。


試作の試作みたいな段階です。
でもまぁ勝算はあります。

頭で考えるより実際に作らないとわからないことだらけなのに、
頭やメモ帳で考えてばかりで、モノができてない状況。

今週末までに何かできてればうれしい。

2015年3月9日月曜日

春休み2015予定

来年度からは大学院に進学します。

春休みは研究室のデモ用ロボットの修繕とか趣味のプログラミングとかをして過ごします。

研究室のデモ用ロボットはLEGOでつくられていて、今まではUNIXのPCで動いてたのだけど、老朽化というか研究系のシステム移行により見放されてしまったという悲しいモノです。

そこで、最近流行のLinuxボード、BeagleBone Blackをつかって復活させようというのを僕がやります。復活したころには僕も多少は新しいことを学んでいることでしょう。

あとは、プログラミングの勉強を兼ねて、評価値を基準に解を探索するプログラムをつくります。大学院に入ったら機械学習とかも勉強したいので、それまでは泥臭い方法を学んでおきたいです。

どちらも経過で学んだことは公開していきます。
BeagleBone Black

2014年11月10日月曜日

[GPSRCC]ToCoStickでRaspberryPiと通信

ロボットカーをRaspberryPiで動かすので大変だったのはwifi環境。
家ではwifi使えるのでそれで良いのだけれど、外ではwifiがないから動かない。
(大会ではwifiルーターを持参して通信してました。)
以前はこんな感じ

wifiに頼らない開発環境を!ということで、以前買っておいたToCoStickと、今回買ってもらったToCoStickを使って何とかしてやろうじゃん?っていう記事です。
これからはこうします


もちろん家ではwifiでsshが最強なのでwifiを使います。

【ToCoStickとは】
TWE-LITEっていう通信用のモジュールをUSBに挿せるようになってるやつ。
今まで有線だったシリアル通信を無線化できるでしょ?っていう感じ。
チャットとか色んな機能があるんだけど、正直いらない。
きれいなんだけど、もうちょっと小型化できないのかな。


【ToCoStickの準備】
ざっくり基礎知識(細かいとこは自分で調べて)
・ToCoStickやTWE-LITEはアプリ(ファームウェア?)を書き込んで動かす。
・最初に入ってるのはIOとか制御するアプリ。ToCoStickだとほぼ意味ない。
・シリアル通信専用アプリの「透過モード」が一番便利そう。
  (http://tocos-wireless.com/jp/products/TWE-ZERO/App_Uart/)
・書き込み用ソフトがWindowsにしか対応してない(おこ)

【ToCoStickを使う】
Macに1つ、RaspberryPiに1つ挿します。
Macでは「CoolTerm」を使ってシリアル通信します。
RaspberryPiでは、おなじみ?の「minicom」でシリアル通信します。

親機の設定(どっちでもいいからとりあえずMac側にしてる)
・i: Device IDを121に。
・m: uart modeをT(透過モード)に。
・そして S: save Configuration 設定を保存

子機の設定
・i: Device IDを1に。
・m: uart modeをT(透過モード)に。
・そして S: save Configuration 設定を保存

なんか文字とか打つと1文字ずつ転送される。これでオッケー。

【コンソールを使う】(こっからが本題)
このままで、デバッグ情報をシリアルで送ってくれたりするようにできます。
競技中はそれでいいんだけど、RaspberryPiの場合はまずプログラムを起動しなきゃいけないですね。
シリアル通信でコンソールをいじれる必要があるわけです。
RaspberryPiの場合はGPIOピンに有線でつなぐとコンソールをいじれます。
USBでもこの機能を使わない訳にはいきませんね。

ここのブログでは逆に、シリアルで繋ぐとコンソールになっちゃうのを回避しています。
(http://www.soramimi.jp/raspberrypi/rs232c/index.html)


/boot/cmdline.txtttyAMA0ttyUSB0に変えましょう。
dwc_otg.lpm_enable=0 console=ttyUSB0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait 

/etc/inittab の最後のttyAMA0ttyUSB0に変えましょう。
...
#Spawn a getty on Raspberry Pi serial line

T0:23:respawn:/sbin/getty -L ttyUSB0 115200 vt100

一応、再起動してToCoStickで通信はじめると、Mac側のシリアル通信ソフトにコンソールが飛んできます。

という訳で、wifi環境がなくても開発が可能になりました。
TWE-LITEの仕様のせいで使いにくい分はあるけど、特に問題はないです。

もちろん家ではwifiでsshが最強なのでwifiを使います。
アディオス!

2014年10月28日火曜日

[エレコン]Arduino IDEとLeonardoでAVRマイコンに書き込み


こんにちは。
この度、AVRマイコン(ATMEGA328P,ATtiny2313,ATtiny13A)を買ったり買ってもらったりして、どのように使っていこうか考えていました。

【ことのいきさつ】
Arduinoを使って書き込む方法があると知る
KosakaLab
  探すとここに行き当たる。丁寧な解説つきでとてもありがたい。
  でもどこの説明もArduino UNOでやってる。

僕のArduino UNOは現在故障中で使えない
 スイッチサイエンスの永久保障
  Arduino UNO R3の永久保障の内容が最強。みんなここで買うべきっしょ。
(はやく直してもらえばいいのに)

Arduino Leonardoは元気に使える
  Arduino LeonardoはUNOとほぼ同等なボード。
使ってる人はUNOより少ない。ちょっと安い。

Arduino Leonardoでやってるページを見つける
 G2SS Diary: LeonardoでAttiny85にスケッチを書き込んでみた http://g2ss.blogspot.jp/2013/01/leonardoattiny85.html
  できないことはないけど、一手間必要なんだなと知る。

Arduino Leonardoでやる詳細のページも見つける
 Arduino Leonardo as ISP
  英語だけど絵がいっぱいで一番くわしくわかりやすい

できた!

というわけで僕もG2SS Diaryさん同様、やり方の手順を公開します。

0. 準備 用意するもの

・Arduino Leonardo USBケーブル
・AVRマイコン(上記3つで動作を確認)
・ブレッドボードとジャンパ線
・確認用LEDと抵抗

・パソコン(OSはMacOSX、Windows7で確認)
・Arduino IDE1.0.6 (1.5.8 BETAではうまくいかない)

1. Leonardoを書き込み装置にしよう

[ファイル]->[スケッチの例]->[Arduino ISP] を開く。
  内容を書き換える。(SS->10 , 9->13)
  [Arduino ISP Leonardo]とか別名で保存しておくといい。

  
  hardware.zipをダウンロード&解凍&[Arduino]ディレクトリの中に置いておく。
   (http://make.kosakalab.com/arduino/use/source/hardware.zip)
  Arduino IDEを再起動して[ツール]->[マイコンボード]でなにやらたくさん出てきたらオッケー。


  [hardware]ディレクトリの中に[leofix]というディレクトリをつくります。
  [leofix]ディレクトリの中に[programmers.txt]というテキストファイルをつくります。
  テキストファイルには以下の4行を書いておく。
arduinoispleo.name=Arduino as ISP (Leonardo)
arduinoispleo.communication=serial
arduinoispleo.protocol=arduino
arduinoispleo.speed=19200

再起動すると[ツール]->[書き込み装置]に[Arduino as ISP (Leonardo)]がある。



2. マイコンと配線しよう

  Arduino Leonardo側 <ーーー> マイコン
        SCK      <-->    SCK
        MISO    <-->    MISO
        MOSI    <-->    MOSI
        10     <-->   RESET
        5V     <-->   VCC
        GND    <-->   GND
        0(RX1)   <-->   RX (必要ないかも)
        1(TX1)   <-->   TX (必要ないかも)
(参考画像)


3. Arduino IDEをつかって書き込もう

 まず、前述のArduinoISPLeonardoをLeonardoに書き込む
 設定は マイコンボード:Arduino Leonardo
     ポート:Leonardoを認識してるポート
     書き込み装置:AVRISP mkII
 
 次に、前述のLEDチカチカスケッチをマイコンに書き込む
 設定は マイコンボード:ATtiny2313 (internal 8MHz clock) <-- 自分の使うマイコン
     ポート:Leonardoを認識してるポート
     書き込み装置:Arduino as ISP (Leonardo)

 LEDチカチカスケッチ
 void setup( ) {
   pinMode(2, OUTPUT);
 }
 void loop( ) {
  digitalWrite(2, HIGH);
    delay(125);
    digitalWrite(2, LOW);
    delay(125);
  }
ピンで2番を指定しているので、RXD,TXD,の隣くらいのピンにLEDを刺しておくと光る


という感じで僕はできました。
Arduinoの関数とかがどの程度使えるのか分からないので、今後検証していきたいと思います。

以上、Arduino IDEとLeonardoでマイコンに書き込みしてみようのコーナーでした。












2014年10月19日日曜日

[GPSRCC]GPSロボットカーコンテスト2014が終わりました!

GPS・GNSSロボットカーコンテスト2014に出場してきました。
結果は
ダブルパイロンレース:棄権
QZスクランブル:災害通知の受信をできずリタイア
でした。

くやしい結果ですが機体としてはいいものができて満足です。
GarlicToastでいい結果を残せたら新しい機体を作る事を考えていましたが、この現状では今後もGarlicToastで調整を進めることにします。本来ならハードウェア的な問題点を作り直す必要があるのですが、今回は満足しているので基本の枠組みは変えずに続投です。

ちょっとリベンジしたい気持ちもあるので、来年も使えるレベルに手直ししてから封印するつもりです。
また来年もよろしくお願いします

以降反省です。
【ハードウェア】
・最終的には満足のいくものができてよかった。(もう少し早くできていれば・・。)
・インホイールモーターは期待通りに動いてよかった。
・分解組み立てが少々面倒なところが難点。
・電圧最大でストールすると配線が電流を許容できなさそう。
・キガタメール(木固め剤)については今後の経過を見て評価。
・ギア比をあげればもっと電流を抑えて同じ挙動ができるかもしれない。

【回路】
・今後の課題が一番多い部分
・安価なモータードライバICではパワーが足りずにMOS-FETを使ったが今後はそれでいい。(逆転はできない仕様はローバーの機構上問題はない)
・大電流を許容できる配線、基板を作成する。
  今後は基板発注,電源の完全な分離をおこなう
・基板間の配線をちゃんとまとめる。RasberryPi<-->モータドライバ基板間は一本にまとめる。
・モータードライブ用にマイコンがあっても良いかもしれない。
・確実な無線通信をできるようにする

【ソフトウェア】
・Pythonでの記述に慣れることができた。
・マルチプロセスは強い。今までにない制御周期を実現できた。
・プログラムをモジュール化しすぎてデバッグが大変になってしまった。
  一斉実行するためのプログラムが必要
・プログラム間通信を何か考えないといけない。
・簡単にパラメータを変更できる仕組みも必要
・欲を言えばグラフィカルに挙動を確認したい。

【しまう前にしておくべき手直し】
・電源回路の修復
・プログラムの簡略化・自動実行できるように
・QZスクランブルの通知信号の受信問題の解決
・通信をもっと楽に行う

【おまけ】
今回のタイヤのスポンジはこれ。これで100円は去年のウレタンフォームより安い。


前日の試走会にも行ってきました。このときはバッテリーやらの問題でうまく走らず。


2014年10月11日土曜日

[GPSRCC]ピンチと打開策

ご覧のように完成しました!
室内でゴロゴロ走るのを確かめたので今日は屋外テストをしてきました。


そしたらなんと、走らない!
比較的平坦なコンクリートの上ならゆっくり走るのですが砂利道やオフロードではうんともすんとも。
完全にパワー不足です。
無負荷での回転数が結構速いので減速不足というのが正しいかもしれません。

今日家の近所の公園で走行テストして、明日は芝生のある公園でのGPS誘導のテストを想定してたので、予定がだいぶ狂いました。

いやはや大会1週間前にしてこの現状。
しかも来週は台風が来ることなので早めに行動しなくては。

こんなときに考えられる対策はこんなもんでしょうね。
・モーターを出力の大きいものに変更(購入とタイヤ丸ごとの再設計が必要)
・モーターの連装数を増やす(購入とモーターマウントの設計が必要)
・減速比をあげる(ギアの歯数を増やす/減速の段数を増やす)
・機体を軽くする
・タイヤの径を小さくする

最後の2つでも対応できるのですが、そんなに変わらないでしょうね。
減速比については構造上難しいものがあります。
確実に状況を打開するためにはタイヤの変更が必要そうです。

という訳で、モーター変更/タイヤ再設計によるパワーアップ作戦を選びます。
(現在1.6kg程あるのが更に重くなる・・)

2014年9月29日月曜日

[GPSRCC]ロボットカーの制御について

先日、今回出場する大宮工業高校のはなしを少し聞いたりインタビューの記事を読んだところ、プログラムが難しいかもなぁって思いました。ので、今回はプログラムについて書きます。
こちらは機体がだいたいできあがりました!

【はじめに】
大前提として、使うのは「目的位置」と「現在位置」と「(現在)角度」の状態。今回は現在の状態をGPSと地磁気センサで取得しますが、GPSモジュールから出力されるデータの中に方位のデータがあるのでこれでもいいです。

そして作るのは「目的地にロボットを誘導するプログラム」で、特にルールにしばられるアルゴリズムではありません。巡回するルールでは目的地を順に変更していけばいいです。

【緯度経度の扱い方】
座標空間は緯度経度に定数を掛けて得る直交座標です。y軸正が北、x軸正が東となるようにとります。適当な定数を掛けた値なので単位はmでもmmでもなんでもよく、"単位距離"というのが妥当かもしれません。
ここで注意!世界地図や日本地図を見ると分かりますが方眼が北方向に伸びてますね。距離を正しく表そうとすると緯度には経度の1.2倍くらい掛ける必要があります。(1.2ってのは東京の緯度だとだいたいこれくらいという値です。)
図で見るとこんな感じ。


【目標方位の求め方】
 dx = (目標経度 - 現在経度)×定数
 dy = (目標緯度 - 現在緯度)×定数×1.2
まず目標位置と現在位置の差をこんな感じで定義します。
そしたら角度は逆三角関数arcTanをつかって
 θ = arcTan(dy/dx)
で求められます。(高校生だとここが難しいのかな)
プログラムを書く時はatan関数を使えばいいのですが、atan関数を使える状態であればatan2関数も使えるはずです。atan2はatanと違って値域を考えなくて良いので便利です。

図にして考えるといい。


【アルゴリズム】
上のような準備が済んだら
次の式で左右のモータに与えるゲイン(電圧)を決定します。

 左モータゲイン = 直進ゲイン - 回転ゲイン×(目標方位 - 現在方位)
 右モータゲイン = 直進ゲイン + 回転ゲイン×(目標方位 - 現在方位)

この式の直進ゲインと回転ゲインのパラメータを調整してください。簡単に説明するとこんな感じ。
直進ゲイン:目標にまっすぐ向かう時の速さ
回転ゲイン:目標の角度に向ける速さ

【これができたら】
次は競技に合わせて目標地点に着いたら、目標地点を変更するようにすればいいでしょう。
上で紹介したのは角度しか制御してませんが、距離や他のパラメータを制御して自分流にしてくのがいいと思います。が、GPSロボットカーコンテストについて言えるのはあまり凝った制御は必要ないということです。それよりはハードウェアの調整に力を注いだ方がいいとおもいます。

地磁気が指す北と緯度経度座標の北は違ったり、方位は北から右回り正の値なのに対して数学の角度は東から左回り正のあたいだったり、他にも注意しなきゃいけないことがあるはずです。