Hatena::ブログ(Diary)

熊工房 ohgumaの腹凹ませたい日記

2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |

2015-06-30

[]オムニホイール

ロボットショップに安価なオムニホイルが掲載されている。

寸法図を見ると4mmシャフトは使えなさそう。値段はGoodなんだが。

2015-06-29

[]ベクトル

id:ohguma:20150602 で紹介したボールセンサアイデア検討してみる。


対象はTJ3Bの3輪オムニのこれ。ボールセンサは前後左右の4つ。

f:id:ohguma:20150628171433j:image


センサを起点に時計回りCW:clockwise)に1〜4の番号を割り当てる。各ボールセンサは90度ごとに外向きに配置しており、それぞれを長さ1(半径1の円上)の単位ベクトルとして表す。

センサ基準時計回りの角度を計算するために、前センサをX軸+、右センサをY軸+の向きにする。

f:id:ohguma:20150627210036j:image


ボールセンサは「電子工作関係: 赤外線リモコン受信モジュールについて1」のコメントにあるTSOP4038にローパスフィルタ(R:39KΩ、C:33uF(334))を組み合わせたものを使う。

出力はC-Style上ではボールがない場合が1023、近いほど小さな値となる。

f:id:ohguma:20150627210635j:image


計測値をボールがなければ0、近いほど大きな値となるよう変換して使う。

計測値を単位ベクトルに掛け、各センサの信号の強さをベクトルで表す。

(下の4式のCNxはCNx'の誤記

f:id:ohguma:20150627211146j:image

センサベクトル値(X,Y)を足して、合成したベクトルVallのX,Y座標からatan2()で求めた角度がボールのある向きとなる。

atan2()の結果はX=0,Y=0の場合処理系実装依存するので、X=0,Y=0の場合atan2()を使わないようにする。

f:id:ohguma:20150627211635j:image

2015-06-26

[]モーターとコントローラ

ダイセン電子工業サイトダウンロードページができていた。が、以前ほど資料登録されていないように見える。


モーターに配線する際、+と−に注意する。端子のどちらかに+・−を識別するマークがあるので、オムニホイール等で複数のモーターを使う場合は、マークを基準に全モーターを同じように結線する。コネクタ側もマークがあるので、同様に結線する。

f:id:ohguma:20150624082800j:image

▲これはマブチのRC-280。赤線を繋ぐ端子のそばに(+)のマークがある。

f:id:ohguma:20150627033656j:image

JSTのXHコネクタ三角マークやサイドの切り欠きで1番ピンが判断できるので、そこに(+)を繋ぐなどし、全モーターを同じように結線する。

結線の異なるものがあると、修理などで入替えた際にモーターが逆転するので、配線をし直すかプログラムを変更する必要がなる。そのような面倒は避けられうよう、普段から注意しておく。


6chコントローラは、1/3/5番と2/4/6番では同じモーター、同じ出力値であっても回転方向が逆になる。

f:id:ohguma:20150625081902j:image

▲これは6chの裏面。


3輪オムニなら、6chコントローラの1/3/5番か2/4/6番にモーターを繋ぎ、C-Styleで3つの出力を同じ値にしたときには、ロボットが回転するよう設定する(と今後の話が進めやすい)。

4輪オムニで「no title」を使うならば、板に書いてある番号通りにモーターを6chコントローラの1〜4番に接続して、C-Styleで4つの値が全て+で同じ値にしたときに、ロボットが前進するように設定するのが一般的と考える。

(この板はいい値段なので、シナベニヤ板(4mm厚・A4サイズ程度で数百円)から切り出してもいいと思う。)

愛媛ノード愛媛ノード 2016/04/11 14:24 なるほど!
モーターについている印で+−をわけるのは思いつきませんでした!

2015-06-21

[]C-STyleでコンパス活用(その2)補足

id:ohguma:20150620#p1 の補足。

Facebook経由で次のコメントを頂いたので紹介。

----

実はIF中で方位判定は使わないほうがいいです^_^ 特にelseifで判定が繰り返し続くと判定のたびにコンパス読みに行くので、どこにも当てはまらなくなったりしますし、すごく時間を食います。判定前にコンパス値を変数に代入してから判定回す方がいいです^_^

----

先の記事方式で if〜 elseif を繰り返すと、方向チェックのたびに「get_hmc()」が実行されることになり、その処理にすごい時間かかるのは事実で、実際に「get_hmc()」の処理時間を調べるとこんな感じ。

f:id:ohguma:20150621101010p:image

1000回のget_hmc()に約2秒=1回約2ミリ秒も掛かるため(A=Bのような変数代入だと1000回で0.2ミリ秒=1回0.002ミリ秒)、elseifで方向チェックを繰り返した分だけプログラムが遅くなるので、方向チェックの多用には注意する。

C-Codeが理解できれば、get_hmc()を使わない方向チェック関数を自作することも可能なので、興味がある方は調べて見て欲しい。



Teratermに出力する部分が見づらいので、csyファイル掲載する。

下の枠内をテキストエディタに貼り付けて「時間計測.csy」というファイル名で保存すれば、C-Styleで開ける。Teratermの設定方法については id:ohguma:20150425記載した。

sprintf()の第2引数の「%ld」はパーセント、小エル、小ディ。

C-Codeで利用するC言語の詳細はこちら。

Title:Main - [ 時間計測 ] DAISEN C-Style for TJ3B  [ Ver.20141024 ] - [Main - [ 時間計測 ]]
CN01:Ball
CN02:Line
CN03:L-Touch
CN04:R-Touch
CN05:C-Touch
CN06:
CN07:
CN08:
CN09:RED3
CN10:RED2
[0000]:sno:08,cno:07,val:111111-110010-000020,cmt:
[0001]:sno:33,cno:33,val:000000-000000-000000,cmt:char str[16+1];  	// sprintf() tx_puts() で使う変数strは最初に定義する
[0002]:sno:33,cno:33,val:000000-000000-000000,cmt:  	// 何も実行しない1000回ループの時間計測
[0003]:sno:30,cno:30,val:000000-000000-000000,cmt:
[0004]:sno:05,cno:05,val:000010-000000-000000,cmt:
[0005]:sno:05,cno:05,val:000100-000000-000000,cmt:
[0006]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0007]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0008]:sno:31,cno:31,val:250270-000000-000000,cmt:
[0009]:sno:33,cno:33,val:000000-000000-000000,cmt:  	// 方向取得の1000回ループの時間計測
[0010]:sno:30,cno:30,val:000000-000000-000000,cmt:
[0011]:sno:05,cno:05,val:000010-000000-000000,cmt:
[0012]:sno:05,cno:05,val:000100-000000-000000,cmt:
[0013]:sno:31,cno:31,val:000410-000000-000000,cmt:
[0014]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0015]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0016]:sno:31,cno:32,val:240272-000026-000000,cmt:A=Dir(HMC)の処理以外に掛かった時間を引く
[0017]:sno:33,cno:33,val:000000-000000-000000,cmt:sprintf (str,"[Y]%ld ", gV[VAR_Y]);
[0018]:sno:33,cno:33,val:000000-000000-000000,cmt:tx_puts(str);
[0019]:sno:33,cno:33,val:000000-000000-000000,cmt:  	// 変数代入の1000回ループの時間計測
[0020]:sno:31,cno:31,val:010000-000000-000000,cmt:
[0021]:sno:30,cno:30,val:000000-000000-000000,cmt:
[0022]:sno:05,cno:05,val:000010-000000-000000,cmt:
[0023]:sno:05,cno:05,val:000100-000000-000000,cmt:
[0024]:sno:31,cno:31,val:000020-000000-000000,cmt:
[0025]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0026]:sno:00,cno:04,val:000000-000000-000000,cmt:
[0027]:sno:31,cno:32,val:230272-000026-000000,cmt:A=B の処理以外に掛かった時間を引く
[0028]:sno:33,cno:33,val:000000-000000-000000,cmt:sprintf (str,"[X]%ld\r\n", gV[VAR_X]);  	// \r\nで改行
[0029]:sno:33,cno:33,val:000000-000000-000000,cmt:tx_puts(str);

2015-06-20

[]C-STyleでコンパス活用(その2)

コンパスセンサでチェックする向きを東西南北などに相当する数値を直接記述すると、基準の向きを変えるたびにプログラムを入れ替える必要があり、実用的できない。

そこで基準の向きを変数に置き換えてみる。とりあえず、先日のプログラム基準の向きをスタート時の向きとしてみる。プログラム開始時にその時の向きを調べて変数に代入しておく。また先日のプログラムでは北向きと東向きをチェックしていたが、「北向き→スタート時の向き(A[度])」ならば「東向き→スタート時の右手方向(A+90[度])」として表現する。

f:id:ohguma:20150620010110p:image:w360

TJ3Bの内部でどのような計算がされているか理解できれば、このような変数で方向チェックも無理がないことが分かると思う。


上のプログラムビルドし、ビルドパス中の「User.c」をテキストエディタで開いてみる。

方向チェックに関わるのは、「get_hmc()」と「judge_hmc()」の2つの関数になる。

#include "D_Main.h"
#include "D_I2C.h"
#include "D_SIO.h"
//--------------------------------------------------------------------------------
// Program Name : NewFile-00.C
//--------------------------------------------------------------------------------
void user_main(void)
{
    gV[VAR_A] = get_hmc();
    gV[VAR_B] = gV[VAR_A] + 90;
    while (TRUE) {
          	// 前処理
        if (judge_hmc(gV[VAR_A], 10)) {
              	// だいたい正面向き
        } else if (judge_hmc(gV[VAR_B], 90)) {
              	// だいたい右向き
        } else {
              	// だいたい左向き
        }
          	// 後処理
    }
}
//--------------------------------------------------------------------------------

ビルドパス中のファイルから、「get_hmc()」と「judge_hmc()」の定義されているファイルを探すと、D_I2C.cに

UINT get_hmc(void)
{

BOOL judge_hmc(UINT deg, UINT range)
{

という関数定義が見つかる。「get_hmc()」は単純にセンサの計測値を返すだけなので、あまり見るところは無いが、「judge_hmc()」は現在の向きが指定した向きから誤差±何度の範囲内にあるかどうかを10行ほどで計算し、その結果を返すように作られており、その計算の仕組みは理解しておきたい。

ちなみに、「judge_hmc()」中で使用されている「%」(パーセント記号)の演算子は、剰余(割り算で,割り切れずに残った余り部分)を返す演算子であり、C-Styleでも使用できる。


指定フォルダ(サブフォルダも含む)に存在する複数のファイルから指定の文字列を含むファイルを抽出するには次のようなツールを使う。

2015-06-19

[]C-STyleでコンパス活用

ダイセン電子工業の「HMC6352デジタルコンパスDSR1302」を使えば、今の向きが基準の方向に向いているかどうかが判断できる。

なお、同じセンサ素子を使うストロベリーリナックスの「ディジタルコンパスモジュール HMC6352」も同じようにTJ3Bで使用でき、こちらのほうが安価だが、コネクタや固定用の穴などは自分で用意する必要がある。

f:id:ohguma:20150619002130j:image

▲左はダイセン工業電子、右がストロベリーリナックス。右はユニバーサル基板にセンサコネクタをハンダ付けし、基板に開けた穴で固定した。I2CコネクタはTJ3Bと同じピン配置にしておくと後で悩まない。


いろいろなところで安価(数百円〜)に売られているHMC5883Lを使ったものはTJ3Bではそのまま使用できないので注意する。使用するためにはC-Styleの改造が必要になる。以下のサイトが参考になるが、内容が理解できない場合は使用をお勧めしない。


C-Style上でコンパスセンサを使った方向チェックでは、今の向きが指定した向きから誤差±何度の範囲であるかどうかを調べることができる。以下は方向チェックの一例。

f:id:ohguma:20150617230047p:image

このプログラムは北向き(0度)を基準として、

  • ifでだいたい北向き(350〜10度)
  • elseifで東向き(10〜180度 0〜10度部分はifで除外済)
  • elseで上記以外の西向き(180〜350度 350〜0(360)度部分はifで除外済)

の3方向をチェックしている。

elseif では 10〜180度170度分の範囲をチェックしたいので、条件を「95 Deg(+/-)85」としても同様に動作するが、そうするとifの範囲を調整するたびにelseifの条件も調整し直す必要がある。例のように「90 Deg(+/-)90」としておけばifの範囲を変更しても、elseifの範囲は変更する必要がない。なるべく手間がかからない条件設定になるよう工夫する。

2015-06-10

[]C-Styleでfabs()

fabs()を使い絶対値計算できるようになると、これが、

f:id:ohguma:20150611035936p:image


こうなる。

f:id:ohguma:20150610124551p:image


C-Code中では、変数AはgV[VAR_A]、…、変数ZはgV[VAR_Z]で利用できる。

2015-06-07

(6/27) math.hを組み込まなくてもビルドはできるが、math.hにある関数意図する動作をしていないようなので、やっぱり、math.hは追加する。


(6/10) C-Style 141024版を再インストールして標準のビルドパス(C:\Daisen\C-Style for Tj3B\Build\Build_V141022)のまま、C-Codeでfabs()などを含んでいてもビルド成功することを確認したので、下記は訂正する。

[] C-Style で C言語の math.h

ビルドパスに含まれるファイルに以下を加えると、math.hで定義されている三角関数など計算有用関数をC-StyleのC-Codeで扱うことができる(とりあえずD_Main.hの先頭に追加した)。

#include "../../../mcc18_v337/h/math.h"

math.hで定義されている関数についてはこちらなどを参考にする。

絶対値を返す「fabs()」あたりは利用できると大変便利だと思う。


高校数学で習う三角関数はややこしく、小中学生には難しいと思うが、これを使うと直角三角形底辺と高さが分かれば底辺と斜辺の角度などが計算できる。公式理解する必要はないので、プログラムで使ってみて欲しい。

2015-06-06

[]TJ3BのC-Styleの改造の前に

TJ3BにLCD増設したりする場合にC-Styleのビルドパス中にあるファイルを変更する場合デフォルトビルドパスのままでいると、バージョンアップなどでC-Styleをアンインストールした時点でビルドパス指定したフォルダごと削除されてしまい、変更したファイルもなくなるので、変更前にデフォルトビルドパスをまるごとコピーリネームし、コピーしたフォルダビルドパスにしておく。

f:id:ohguma:20150607062325p:image

▲「C-Style Ver.141024」ならデフォルトビルドパスは「C:\Daisen\C-Style for Tj3B\Build」フォルダにある「Build_V141022」フォルダなので、これをまるごとコピーリネームする。

f:id:ohguma:20150607062326p:image

ビルドパスは、C-Styleの「プロジェクト」メニューで確認・変更できる。

f:id:ohguma:20150607062327p:image

▲変更時は変更先のビルドパスにある「BuildPath.BAT」を「開く」

f:id:ohguma:20150607062328p:image

▲メニューからビルドパスが変更されていることを確認し、ビルドできるかどうか試す。


また、PCトラブル等に備え、変更したビルドパスの内容もC-Styleのプログラム同様にUSBメモリなどにバックアップしておく。

2015-06-02

[]ボールの向きと距離

せとうちオープンではボールまでの距離を簡単に求める方法アイデア(ボールセンサの値を全て足す)を聞き、実装してその正当性確認できたが、方向を求めるアイデアまでは思いつかなかった。とりあえず、どのボールセンサが強く反応しているか判断していたので、ボールセンサの隙間にボールがある場合考慮できなかった。

たまたま訪れたサイトナイスアイデアが紹介されていた。C-Styleで三角関数をどう扱うかよく調べる必要があるが、真似したい。