立命館守山高校 Sci-tech部 ロボット

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ロボカップジュニア京滋奈・兵庫・関西オープン大会てなものをやるらしいですよ!

後輩がまったく更新しないのでまたまた大学生のkuroです。

2011年8月20日(土)、大阪市立咲くやこの花中学校・高等学校にて「京滋奈・兵庫・関西オープン大会」を開催いたします。近畿圏でもともと一つのブロックだった京滋奈・兵庫・関西ブロックの合同で交流競技会を行います。また、エントリーは全国より募ります。夏休み、旅行の計画の一つにぜひ加えてください!

ロボカップ・ジュニア 関西ブロック公式HP | 京滋奈・兵庫・関西オープン大会を8月20日に開催します。

だそうです。
交流会だし殺伐してなさそうで良いですね。

ちなみに、京滋奈兵庫関西ブロックだけじゃなくて、全国から参加者を募集するんだそうです。
種目はサッカーレスキューダンス。
許されるなら俺も世界大会行ったときのロボット直して出ようかな?


ちなみに、会場の大阪市立咲くやこの花中学校・高等学校ってのはこのあたりだそうで。

大きな地図で見る

多分色々得られる物があると思うので、是非参加を。
スポンサーサイト

レゴ用のクローラー?

そういえば、日本大会終わりましたね。
なぜ自分が
DSC_0109.jpg
こいつを修復して出なかったのか謎で仕方がありません。
まぁ、Arduinoという素敵マイコンに出会ってしまったからですね。

そういえば、後輩はボロ負けしておりました。
大会当日にハード組み替えるのは死亡フラグだとあれほど(ry

さて本題。
自分はレゴ使わないし今後使う予定もないのですが、色々ネット巡回しててレゴのキットでクローラーが付いてるのを見つけて、RCXやNXTのよりなんか格好良かったので報告だけ


こんなやつです。
ゴムじゃなさそうなので摩擦は不安ですね。地雷踏む覚悟がある方是非挑戦してみてはいかがでしょうか。

ちゃんと組めてるレゴロボットには脱輪の心配はないので必要無いと思いますが


ところで、ロボットの実機リーグに使えそうなサイズのクローラって売ってませんね。
歯付きベルトを改造して作るしかないのか…

加速度センサで傾斜を測ろう!

どうも、卒業して今や大学生活を送っているkuroです。
なんというか更新されなさそうなので
上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。
という表示が出る前に更新しようかと思います。

ということで、今回は微妙に暇な講義中に考えた加速度センサで角度を求める方法についてです。
逆三角関数という概念を知って感動の余り勢いで作りました。
むしろ今まで知らなかったのかとか言わないで…
関数電卓一昨日買ったんです。

で、早速本題ですが
今回は、3軸加速度センサがあったとしてもXYの2軸、地面と平行な軸を使います。

概要

アークサイン、アークコサイン、アークタンジェントのテーブルを作成する。asin()関数を使っても構わない。
傾きの方向(XY軸の加速度ベクトルの向き)をアークタンジェントで求める。
加速度の大きさ(ベクトル)を三平方の定理で求める。
加速度からアークサインでZ方向の傾きを求める。

といった感じになっています。
サインとかコサインとかベクトルとか加速度とかルートとかが意味不明だとちょっと難しいかも知れません。
ただ、一度関数に実装してしまえば誰でも使えるので、わからなかったらおとなのひとにきいてみよう!(責任転嫁
一応今回は、概念だけなので関数は作りません。ていうか作りたいけど手元にArduinoも加速度センサも無いので作っても動作確認できません。


ではまずは、逆三角関数の求め方です。
Arduinoのリファレンスにちょこっと書かれてますが、ArduinoはAVR LibcにリンクされているのでAVR Libcの関数は全て使えます。AVR Libcの関数一覧を見ればわかりますが、とても豊富です。
ということで、math.hのasin()なども普通に使えます。
ただ、math.hがどういう風に計算を行っているかは知りませんし、もし浮動小数点演算をばりばり使っているなら、プログラムの実行速度に影響を与える可能性があります。気になるなら一度測ってみる必要がありますね。

もうひとつの方法は、値を1万倍した逆三角関数テーブルを作るという方法です。
これだと、確実に浮動小数点演算は必要無いですが、代わりに303個の値を収納する必要があるのでRAMを食います。
intに収納すると、606バイトほど使うことになります。
ArduinoUNOのメモリサイズは2kbですので、かなり宜しくない状況だと思います。
1個おきか2個おきの値にすれば、容量は半分か1/3で済みますが、それでも大きいですよね。
そして何より、Arctanは無限に続くので、作りにくい。

どっちが良いか分かりませんが、お手軽なのはasin(),acos(),atan()を使うことだと思います…


ここから本題
accel2.jpg
加速度センサの状態はがこんな感じになっているとします。
黒矢印が重力加速度、赤がX軸、青がY軸で、白がX軸とY軸から求められる重力加速度のベクトルです。
重力加速度は静止していれば1Gなので、白矢印が求まればアークサインから角度が求まります。

XY軸の加速度ベクトルの向きを求める
まず、白矢印が、X軸から何度の位置にあるかを計算します。
これはアークタンジェントを使えば簡単に求まります。
θ_xy=tan^(-1)(y/x)
これだけだとどの象限にあるのか分からないので、XY軸の正負から判断します。
その場合角度は全てX軸からになるので、例えば第二象限では180からθを引くみたいな処理が必要です。
後、

ベクトルの大きさを求める
こっちは更に簡単。
ピタゴラスの定理、若しくは三平方の定理を使うだけです。
α=(x^2+y^2)^(1/2)

これで加速度ベクトルの大きさが求まりました。


角度を求める
アークサインで角度を求めます。
θ_z=sin^(-1)(α/1)
以上です。


これで、傾いている向きと角度がわかりました。
ちなみに、角度の方は
θ=sin^(-1)(x^2+y^2)^(1/2)
みたいな感じで一発で求めた方が早いですね。


そういえば、数式書くのが面倒だったので^とか使ってますが、分かりますよね。
^は上付き文字です。
1/2乗してるのはルートです。




さて、webで文章を書くと無駄に文章が長くなるのは自分の悪い癖ですが、上の長ったらしい説明わかりましたでしょうか?
高校数学+αぐらいの知識があれば理解できると思います。何せ数学の成績が3.0ぎりぎりだった自分が言うんですから間違いない。
実装するとなると20行ほどで書けると思います。


float x = 0.3;
float y = 0.5;
float xyangle, zangle;

xyangle = atan(y/x);
if(x>=0){
  if(y>=0){
  }else{
    xyangle = 360 - xyangle;
  }
}else{
  if(y>=0){
    xyangle = 180 - xyangle;
  }else{
    xyangle = 180 + xyangle;
  }
  
zangle = asin(sqrt((x*x+y*y)));



ちなみに上のソースはコンパイルは通りましたが、実機で動かしてないので、あくまで参考程度に考えてください。
ていうか間違ってる気がするのと、0度や90度の場合にどっちの象限に入るかの判定が超適当です。

そういえば、アークタンジェントは90度という答えを返すことは出来ないので(90度の極限にならできますが)、90度丁度が欲しいときは、例えばX軸が0でY軸が正なら90度、といった例外処理を入れた方が良いかもしれません。
それと、上のソースコードは浮動小数点演算使いまくりなのでマイコンには重いかも知れません。
実際に使う前に、処理にかかる時間を測定してみることをオススメします。もし重ければ、例えばアークサインを1万倍して整数にしてから計算に使うといった方法もあります。




おわかりいただけただろうか?

京滋奈ブロック終了!

結果、私kuroのチーム、TeamQBは3位
そして、1年のチーム、レイラがなんと2位でした。

やはり、足回りに時間がかかりすぎてプログラムの練度が低かったのが問題ですね。
Arduinoで6CHモータードライバは使えたとしても他のI2Cやシリアルなど全体的に不安定になるので、止めた方が良いかもしれません。
DSC_0338.jpg
既にご昇天されたこのモータードライバですが、フォトカプラの反応時間が悪すぎる、というかTA8429HQは電源部完全絶縁してあるから必要無いとZEROさんに教えて頂きました。
後は、外付けで保護回路も付いてますが、これも内蔵されてるので十分動くので必要ありません。
ということはかなり簡単に作れそうです。
後輩がArduino使いたいらしいので、もう一台作ることになりそうです。
ていうか後輩が作れと思わなくもないですが…
実態配線図だけ書いて、これ通りに作れ。みたいな感じで
むしろ、せっかくモデリングマシンがあるので生基板とエンドミル買ってきて作ってみても良いですね。
って、後4日ほどで自分大学生ですが…

調子に乗って9個もセンサー積んだけどあんまり活用し切れてなかったかも。
センサー幅は、あんまり広いと横の線を読んだりするし、逆に狭いと復帰が難しくなる。
自分は基本的に、ミスが起こりにくいプログラムを書いていますが、むしろ、ミスなどが起こった際に正常に復帰できる、若しくは、センサーに反応があった際にもっと確かめるようなプロセスを入れた方が良いのではないかなと、3PKさんのロボットを見てて思いました。
まぁ、もう出ないですけどね。
ただ、後輩のサポートには回るつもりです。

ところで、今早速実態配線図加工と思ってPasSをDownloadしたのですが
Unexpected error; quitting
とかエラーが出て起動しません。

後、やっぱりコースは3日に1回は変えて問題点を色々見つけた方がいいです。
うちのコースでもかなり難しいコース作ってたと思いましたが、やはり、自分に甘くなりがちですね。

大学には、シミュレーションレスキューに出場してるサークルとロボットのサークルがあるので、そのどっちかに参加して、もし上手くいけば実機リーグ行くかも知れません。

そういえば、京滋奈ブロックのメーリングリストに参加したので、多分来年は京滋奈の審判やりに行きますのでよろしく。


ということで、お疲れ様でした。

Arduinoとダイセン6CHモータードライバ

先日完成したTA8429HQで組んだモータードライバが、多分デッドタイムの入れ忘れで見事に昇天したっぽいので、結局6CHMCBで動かすことに。

ということで、俺の2週間を返せと叫ぶ時間ももう無いので、とにかくArduinoMega2560で6CHMCB(最新ファームウエア)を動かすためにI2Cで繋いでみたのですが、どうにも、1/3ぐらいの確率で一番初めの回転時にフリーズ・リセットを起こしました。
一旦動き出せば、いくら動かしてもフリーズは発生しないので、どうやら初回の駆動時に何かが起こっていると。

で、色々測ってみたところ、SDAとSCLの電圧が、接続時に4.6V付近まで下がっていることが分かりました。
接続してないときには普通に5Vですが、接続したときだけ4.6V~4.8Vぐらいになる。
試しに、あまり賢い方法ではありませんが電源装置で5.2Vほどの電圧を使って無理矢理5Vにプルアップしたらリセットは起こらなかったので、初回の駆動時に電圧降下が発生してマイコンがリセットするのではないかと考えました。

一旦動き始めるとSDA・SCLの電圧は5Vで安定するようですので、setupの時にモーターが動かない程度(10%出力を10msほど)の命令を出せば電圧が安定してなんとか動くようになりました。

ただ、他のI2C機器(コンパス)が正確に動くかはわかりませんが。

ていうか間に合うのか
プロフィール

立命館守山高校 Sci-tech部

Author:立命館守山高校 Sci-tech部
立命館守山高校、Sci-tech(サイテック)部のブログです。
研究の途中結果や、日記、連絡事項などを載せていきます。

主な成績
ロボカップジュニアレスキューセカンダリ2010
世界大会5位

やってること
バイオディーゼル燃料を使ったバイオカートの制作
AR(拡張現実)の研究
クルーレスソーラーボート大会への出場
ロボカップジュニアへの出場
レールガン制作
など

リンク
過去ログ
最新記事
最新コメント
アクセスカウンタ
合計閲覧者数

現在の閲覧者数
カテゴリ
検索フォーム
アクセス解析
    ブロとも申請フォーム

    この人とブロともになる

    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。