2009年03月30日

ラジコンで

ラジコンプロポで動かしてみました。


(Li-Po 6cell 重量約2500g)

ちなみに場所は家の台所です。

前日に先端ものづくりチャレンジ2009イン習志野の展示ブース部門に参加して、この相撲ロボットも体験操縦に駆りだされました。
狭いスペースなので、木の板の上で体験操縦。スピードも1/4近くに抑えて操縦してもらいました。(私たちのデモ操縦は1/2の速度で行いました)
で、じゃんじゃん動かして酷使させたものの、特に回路が壊れることもありませんでした。耐久試験的な意味で動かしまくったのですが、なんとも無かったです。

あとは、プロポの通信に難があることと、カーブが出来ないことですね。
暴走防止の安全思考で、プロポの信号が予期しないものになったら、緊急停止モードが働いて停止するようになっています。今回の体験では、結構通信エラーで停止してしまったので、受信機電圧を上げたり、通信エラー検知の方法を若干変える必要があるみたいです。
それと、前進後進と旋回しか現状では出来ないので、カーブも動けるようにするつもりです。

自立化はもう少し先かな…。他にもやらなきゃいけないことがあるので、暫く相撲ロボットはいじらないかも。
posted by Tmk at 23:53 | Comment(14) | MCR以外
この記事へのコメント
教えていただけませんかH8マイコンで RCプロポの受信機からの信号を 検知し 新たにミキシングして 4つのブラシレスモーターを 制御するプログラム 作りたいのですが。 C言語入門に近いため
難しく困っており お力をお借りしたく コメントしました。
ブラシレスモーターの コントローラーは 市販の物を使うため 組みません RCサーボ用PWMで コントロールできます。
受信機からのPWM信号を H8にいれ 演算 ミキシング PWM信号に戻すのですが。 
RC送信機のスティックを右に倒せば
ABCDのモーターのAのスピードが
調整できる 左に倒すとBのモーターのスピードが調整できる 上はC下は
D 二番目のスティック
では 下から上で ABCDすべてのモーターの同じ回転で調整できる
左に倒すとABが調整される右はCDが調整される この様なプログラム
製作したいのですが。 基本となる
プログラム ありましたらそれを元に考えて見ます。基本となるプログラム
有りましたら教えていただけませんか
Posted by シュリンターザー at 2009年06月14日 13:40
はじめまして。
H8でということですが、具体的なCPU名が書かれていないので大雑把にしか説明できませんが…。

とりあえず、以下の話は秋月で売っているH8/3694(20MHz)で行った場合の話です。(ちなみに動画も同じCPUです)
このCPUはH8のTinyですが、TinyでないCPUだと、やり方も少し変わってきます。

----------------------------------------

私が信号を読み込んだときは、外部信号の割り込みでプロポ受信機からのデータを読んでいました。
IRQ指定のピンをそれぞれ初期設定します。
H8のTinyは、両エッジ読み込み(信号の立ち上がり立下り共に見ることが出来る設定)が出来ないので、最初は立ち上がりに設定した後、立ち上がりの信号が来たときにかかる割り込みで立下りに設定、同時にカウンターも0にしておきます。
立ち下がり信号が着たら、その結果を結果専用の変数に移し変えておきます。
要は、信号の立ち上がりから立下りまでの時間をタイマで計っているのです。

また、プロポスティックのX軸方向とY軸方向のデータは基本的に別信号で、同時にデータが来ることはないです。(例外もあるのかもしれませんが私は聞いた事ないです。)

割り込みの中にswitch文で何か計算とか変数セットとかをしても良いです。いらなかったら消してもかまいません。
g_Count_0ch, g_Count_1ch, g_Count_2ch, g_Count_3chのそれぞれに最終的に入るのが左右スティックのX軸方向とY軸方向のデータです。
プロポなら大体10〜20位で値が変わるかと思います。
分解能をもっと上げたいなら、違うタイマを使って細かい時間の割り込みをすると、もっと細かく読み込めます。

http://hts.sakura.ne.jp/sblo_files/hts/image/rajikon_ex.c(右クリックで保存してください)
Posted by Tmk at 2009年06月15日 00:00
教えていただけませんか
秋月H8/3664FマイコンでRCプロポの受信機からの信号を検知し、単純に2つのDCモーターを別々に正転逆転させるPWMなしの場合(モータ1つに対し信号線2個 1,0で前進、0,1で後退、1,1 0,0ともにブレーキになっています)また、PWMありの場合のプログラムを作りたいのですが。ロボット相撲での使用を考えています。プロポ・受信機ともにフタバを使用しております。C言語初心者に近いため難しくて困っております。力をお借りしたくコメントしました。
よろしくお願いします。
Posted by kin at 2009年09月16日 07:15
開発環境が分からないため、一応GDLであるものとして仮定します。

プロポ信号読み取りについては上の私のレスの通りです。
モータを動かす場合、上記のプログラムでプロポデータの読み取り値の閾値を決めて(15がニュートラルとしたときは、18以上と12以下、とか)それらの値を超えた場合、2つの信号線に1/0を与えてやれば良いんじゃないでしょうか?

P80とP81に信号をつなげたとしたら、
if(g_Count_0ch >= 18){
IO.PDR8.BIT.B0=1;
IO.PDR8.BIT.B1=0;
} else if(g_Count_0ch <= 12) {
IO.PDR8.BIT.B0=0;
IO.PDR8.BIT.B1=1;
} else {
IO.PDR8.BIT.B0=0;
IO.PDR8.BIT.B1=0;
}

みたいな。

PWMについては、
http://www9.plala.or.jp/fsson/NewHP_elc/Link_nH8.html
を参考にしてやってみるといいと思います。

PWMを行うときは、モーターの信号線2本を適当にロジックICで回路を組んで、PWM入力と方向入力に変換したほうがやりやすいと思います。(「モータを回す/止める」の信号線と、「正転/逆転」の信号線にする)

その後プロポの取得値からPWMの出力値を変えてみると良いでしょう。(多くまわせばPWMデューティー比も大きくなるように)
Posted by Tmk at 2009年09月17日 04:06
ありがとうございました。早速試して考えてみたいと思います。また、わからないことがあれば質問したいと思いますので、そのときはよろしくお願いします。
Posted by kin at 2009年09月17日 23:21
昨年は大変お世話になりました。おかげさまで無事RC信号を取り込むことができました。PWMはまだ完成していませんが・・・
話は変わりますが、H8/3664FでIRQ0〜IRQ3割り込みを使用して白線前後左右を検出しているのですが、ひとつだけ検出する場合は問題ないのですが進入する角度によって時間差で2個反応する場合が出てきます。その場合右前の動作をした直後に左前の動作を連続して動作してしまい土俵から落ちてしまいます。いろいろと調べましたが、H8/3664Fの場合IRQ割り込みは多重割り込みがかからないとのことですが、私の場合が多重割り込みなのかそうでないのかはわかりませんが、それを回避する方法があれば教えていただければ幸いです。
現在はIRQ関数に白線の動作をそれぞれ書いているだけです。開発環境はGDLです。
Posted by kin at 2010年05月04日 21:04
H8/3664Fの場合の外部割込みは、仰る通り多重割り込みがかかることがありません。いくつか原因は考えられるのですが、おそらく一番の原因として割り込みの動作がどうなっているかを知っておくべきでしょう。

ある割り込み(これを@とします)がかかった瞬間に割り込み時の動作が書かれた場所にジャンプして、そのプログラムを実行するわけですが、その動作中に他の割り込み要因が発生する(これをAとします)と、多重割り込みがかからないのですぐに実行されることはありません。
しかし、Aの割り込み要因は発生しているので、先に動作していた@の割込みプログラムが終了し次第、Aの割込みプログラムが発生してしまいます。

相撲ロボットの場合、複数個のセンサが反応する状態も必ず発生しうるわけです。(勢いがあると、白線を検出したあとに止まりきらないので、反応た直後から土俵の内側に戻る動作を行うときに若干タイムラグが発生します。そのタイムラグで他の白線センサが反応することも十分考えられます)

回避方法としては私がぱっと考えて2つぐらい
1、割り込みが発生して割込みプログラムに飛んだ際に、一旦全てのIRQの動作を切ってしまい、割込みプログラムから脱出する直前に全てのIRQ割り込みを再び動作させる方法

2、IRQ機能を動作させずに、適当な微小時間(例えば1msごと)のタイマ割り込みを発生させ、その時に全てのセンサの状態を判断してフラク等を立てて、メインの関数の中(対戦中にプログラムが動作する場所)にif文で条件式を作り、対戦動作の前に実行させる。
プログラムの反応速度より、機械的な反応速度の方が十分遅いので、この方法でも応答は十分です。

int main(void){
//初期化とか試合前の待機状態プログラム

while(1){
if(白線センサ右前が反応したか?){
//土俵の内側へ方向転換の動作
}
if(白線センサ左前が反応したか?){
//土俵の内側へ方向転換の動作
}

 …

 //対戦中の動き方

}

return 0;
}


長くなりましたがこんな感じです。1番の方法のほうが簡単かもしれません。

ロボットのプログラムで共通して言えることですが、プログラムが判断して実行に移る時間より、機械系の応答時間の方がかなり長いです。その点でどうやってバランスを取るかが、ロボットにおけるプログラミングで重要になるところだと思います。

関連して、「試合中にロボットの下に白い板でも突っ込ませて誤動作させれば、そのプログラムを作った人のプログラムの腕がわかる。例えば前後のセンサが同時に反応するなんて状態はありえないけれど、それぐらいで止まるなら、そいつはまだまだだね。」ってサークルのOBさんが言ってました。
Posted by Tmk at 2010年05月05日 07:39
とても丁寧な回答をありがとうございます。毎回助けられてとても助かっています。

1、割り込みが発生して割込みプログラムに飛んだ際に、一旦全てのIRQの動作を切ってしまい、割込みプログラムから脱出する直前に全てのIRQ割り込みを再び動作させる方法

ですが下記が白線動作の部分です。

void int_irq0(void)
{
DI; この部分もよく判りません

IRR1.BIT.IRRI0=0;

  下記の3行追加
IENR1.BIT.IEN1 = 0;
IENR1.BIT.IEN2 = 0;
IENR1.BIT.IEN3 = 0;

direction(2); 後退
msecwait(100);
direction(4); 左回り
msecwait(50);


   下記の3行追加
IENR1.BIT.IEN1 = 1;
IENR1.BIT.IEN2 = 1;
IENR1.BIT.IEN3 = 1;

EI;  この部分もよく判りません
}

こんな感じでいいのでしょうか?何度も申し訳ありませんが、可能であれば回答お願いします。

Posted by kin at 2010年05月05日 15:16
おそらくそれで良いと思います。たぶん大丈夫だとは思うのですが…。

DIとEIですが、
DI:全ての割り込み無効化
EI:全ての割り込み有効化

です。よく初期設定の記述ないにも出てきます。
なので、他の割り込みが動作しても受付ないと言うことになります。
上記のプログラムのように、割り込み中に無効化するとどうなるかはちょっとわかりません。
Posted by Tmk at 2010年05月05日 23:19
ありがとうございました。今日早速試してみましたが、うまくいきませんでした。結果としては改良する前と同じ結果になりました。これからいろいろ調べなおしてみて再度挑戦しようと思います。ありがとうございました。
これかれも可能であればヒント等ご教授お願いします。
Posted by kin at 2010年05月07日 22:00
白線センサの件もどうにかうまくい解決することができました。結局割り込みを使用せずに解決できました。ありがとうございました。


以前にお聞きしたPWMについて詳しく教えていただけないでしょうか?

PWMを行うときは、モーターの信号線2本を適当にロジックICで回路を組んで、PWM入力と方向入力に変換したほうがやりやすいと思います。(「モータを回す/止める」の信号線と、「正転/逆転」の信号線にする)
適当なロジックを組むことや「回す/止める」「正転/逆転」の信号線にすることなどを詳しく教えていただけないでしょうか。


P50とP51P、P52とP53にモータの信号がつながっています。
1,0で前進、0,1で後退、1,1 0,0ともにブレーキになっています。
現在考えていることは、タイマWのP82とP83を使用してPWM信号を出力し、P51とP53はそのままで、P50とP52の信号にそれぞれAND回路でPWM信号とまぜて一つの信号にしてモータの信号として出力しようと考えています。できる限りの範囲で教えていただけると嬉しいです。毎回無理なお願いばかりで申し訳ありませんがよろしくお願いします。


Posted by kin at 2010年09月14日 21:42
PWM関連についてですが、

>現在考えていることは、タイマWのP82とP83を使用してPWM信号を出力し、P51とP53はそのままで、P50とP52の信号にそれぞれAND回路でPWM信号とまぜて一つの信号にしてモータの信号として出力しようと考えています。

とのことですが、私としては「はいそうですか、そのまま組めばいいのではないでしょうか?」と言わざるを得ません。

P82,P83からそれぞれPWMを出すのはわかりました。P51,P53はそのままでということですが、どの様な役割で使うピンなのでしょうか?
同様に、P50,P52はどの様な役割のピンで、PWMとANDをとって作る「モータの信号」とはどの様な信号なのでしょうか?



最終的にどの様なことが実現できればいいかが私にはさっぱりわかりませんので、こちらで適当に予想させていただきます。
えっと、こういう事でしょうか?
http://hts.sakura.ne.jp/sblo_files/hts/image/sumo_drive.jpg

これは簡易型の相撲ロボットモータードライバです。(1ch分)
>1,0で前進、0,1で後退、1,1 0,0ともにブレーキ
とあったので、ロジックIC(NAND)を除くと、動作が同一なはずです。
その前に、NAND3つ(1つはNOTの代わりとして)を組んであげて、PWM信号とCW/CCWの信号を分離させてあげます。
このようにしてロジックを組みます。
これ自体はネットにもありふれているものなので、少し調べれば他サイト様でも出てくるはずです。

推測で答えさせていただいたので、このような答えで良いのかわかりませんが…。
Posted by Tmk at 2010年09月16日 03:25
ありがとうございました。忙しくて、今頃から回路を製作しています。私が考えていることはY軸のスティックで相撲ロボットが前進・後退し、X軸のスティックで左右旋回、前進しながら右にスティックを倒すと右へカーブするような制御を目指しています。上記のようなことは自分で解決したいのですが、なかなかできづに困っています。教えていただいたPWMの回路を使用したとして左右モータそれぞれ独立の正転逆転のPWM制御をラジコンのプロポで行うサンプル的なプログラムを教えていただけないでしょうか?開発環境はGDLでH8/3664を使用しています。よろしくお願いします。
Posted by kin at 2010年12月09日 23:35
まずはじめに、ここまでのやり取りから察するに、まだ貴方には、知識が足りなすぎるのではないでしょうか。貴方の言葉には、何をやりたくて、最終的にどのような事ができる様にしたいか、ということが見えてきません。
まず
・やりたいことが何であって
・それを行うために何が必要で
・それをどう組み合わせればよいのか
をハッキリさせてからです。

失礼ながら、それと同時に、相手に的確に伝えるための文章を作る練習もされた方が良いのではないかと思います。

正直言って、貴方がやりたい事を、すべて私がやらされている様な気がしてならないのです。

とりあえず、http://www9.plala.or.jp/fsson/NewHP_elc/Link_nH8.htmlのサイト様で勉強されることをお勧めします。
Posted by Tmk at 2010年12月15日 06:31
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]