「花鳥風月」のロボットには、ジャイロセンサーが搭載されています。
このジャイロセンサーは、正確なのですが・・・高いです。(高価ってこと)
それから、このメーカーの日本支店が撤退したようで、普通に購入することはできなくなりました。
韓国に直接注文することはできるようですが・・・まあ、いまのところ、そこまでする必要は無いかと・・・
「花鳥風月」も、先が短そうだし・・・
ところで、このジャイロセンサーの中身だけのモジュールが販売されているようです。
R1350N というものですが・・・
これも、韓国に直接注文すると めっちゃ高い!!
しかし、スイッチサイエンスで売られているのを見つけました。
しかも安い!! 3,394円
これは、買ってみるしかありませんねぇ。
Arduinoに接続できるようなので、届いたら実験してみたいと思います。
ただし・・・3.3V仕様なので、そこのところだけ面倒ですね。
Arduinoにサーボーモーターを接続する実験をしてみます。
これまで、秋月電子で買ってきた一番小さな PICO というサーボだったのですが・・・
なんか、パワーも小さくて、何もできそうになかったので、もうちょっと強そうなのを買ってきました。
GWS MICRO 2BBMG JR タイプ というものです。
まあ、比べてみると、確かに重くて頑丈、剛性感も全然違います。
ところで・・・
PICOのリード線は、白黒赤の3色だったのですが・・・
MICROのリード線は、橙赤茶の3色です。
白黒赤の方は、白:VSS 黒:GND 赤:コントロール ということで、何となく直感的に分かりますが・・・
橙赤茶は、直感的な色分けでは無いですね。
これはJRコネクターと言うらしく・・・
茶:VSS 赤:GND 橙:コントロール なんだそうです。
上のと並びも一緒なんだから、統一してくれよ・・・
ところで・・・これらのサーボモータは、結構な電力を食らうのか・・・
サーボモーターを動かすと、LCDのバックライトなどが一瞬消えます。
というか、MICROの方は、まともに動作しません。
やっぱり、ラジコンのようにLiPoなどの電源が必要なのでしょうか!?
ということで、素人が簡単に実験できるのは・・・やっぱり PICO 程度なんですね。
こちらも Windows8 ねたです。
PCを新しくしたので、Arduinoの開発環境も入れなおしました。
IDEの 1.0.5 を本家のHPからダウンロードしてきて、インストールするところまでは順調です。
IDEを起動して、Nanoを接続して、サンプルのプログラムを転送しようとすると、エラーになります。
ポートが違う・・・らしい
じゃあ、ポートを変えようと思っても、ポートが変わりません。
どうも、ドライバ自体が動いていない状況のようです。
ネットで調べたら・・・
やっぱり、ドライバが普通には入らないようです。
PC側で、「ドライバー署名の強制を無効にする」の作業をしないとダメなようです。
ということで、コチラを参考にインストール作業をしてみました。
概要としは・・・ドライバー署名の強制を無効にして、再起動します。その後にドライバのインストールをします。
その結果、なんとか、ドライバを設定することができました。
Windows8って、便利なようで・・・いちいち面倒くさいですねぇ。
なんとなく思いついて、温度センサーを試してみました。
レスキューBに使う、遠くの温度を測るものではなく、普通の温度センサーです。
秋月電子で見つけたのは、ADT7410 というヤツで500円でした。
Arduino とは I2C で接続します。
プログラムは、他のI2C接続のセンサーと同じで、簡単です。
ただ、固定小数点なので、そこだけがちょっと特殊です。
unsigned int ADT7410_read( )
{
unsigned int val;
Wire.requestFrom(ADT7410_I2C_ADDRESS, 2);
val = Wire.read() << 8; // データの読み出し(上位)
val += Wire.read(); // データの読み出し(下位)
val >>= 3; // 13bit化
val = val*10>>4; // 10進数に変換(0.1度単位)
return( val );
}
とりあず、こんなプログラムで実験してみました。
取り出した数値をLCDに表示してみると・・・
「217」と表示されました。
摂氏 21.7 度ということですね。
センサーに息を吹きかけると、数値が大きくなります。
そのままにしておくと、少しづつ下がって、また「217」表示に戻ります。
しつこく HC-SR04 に関してですが・・・
今度は、TRIG と ECHO を抵抗で結ぶと、3ピンの超音波センサーとして使えるらしい・・・
という情報を得ました。
http://letsmakerobots.com/node/36885
1.8kΩ位が良いようなのですが・・・
私は、適当な抵抗がなかったので、1kΩを2本直列にして、2kΩで接続してみました。
確かに・・・普通の4線式と同じ値が表示されますねぇ。
これなら、使える・・・かも・・・
ただ、何となく・・・このセンサーは製品としてのバラツキがあるように思います・・・
まあ、一個160円だから・・・
とっても安い超音波センサーのHC-SR04
あまりの安さに10個も買ってしまったけれど・・・
4線式で配線(半田付け)が多いのが嫌で使っていませんでした。
で・・・
ネットを俳諧していて・・・HC-SR04を3線で使う方法を見つけました。
https://code.google.com/p/arduino-new-ping/wiki/NewPing_Single_Pin_Sketch
普通は、4Pinで、Vcc、TRIG、ECHO、GND なのですが、今回の実験では、TRIG と ECHO を0.1μFのコンデンサで結びます。 信号線はTRIGから引き出します。
すると・・・
普通の3線の超音波センサーと同じようなプログラムで、普通に距離を読み出せます。
・・・が・・・
私の実験のやり方の問題なのかもしれませんが・・・
この方法だと、何故か5cm以下を検知することができません。
(元の4線式だと、1cmでも検知できます)
ちなみに、TRIG と ECHO をコンデンサで接続せずに、直接短絡すると・・・
普通に動作して、しかも1cmも検知できます。
(ただし・・・電気的に安全なのかどうかは、ハード屋ではない私にはわかりません。)
SRF-05 をやったので、TPA-81 もやっときますかねぇ。
レスキューBは、被災者が壁に貼り付いたヒーターなので、何らかの温度センサーで壁の温度を検知することになります。
普通は、壁に触れたまま走ることができないので、離れたところから温度を測れる赤外線式の温度センサーを使うことになります。 (非接触型の赤外線温度センサーが一般的です。)
M&Yは、2010年の競技の時には、NIIT-BLUEに教わったACTLASの赤外線温度センサーを使っていたのですが、値段が高かったので1個しか買えませんでした。
2010年のシンガポール大会の時に仲良しになった、スウェーデンのチームに教わったのがTPA-81です。
これも、Devantech社の製品です。
テクニカルデータはここにあります。
http://www.robot-electronics.co.uk/htm/tpa81tech.htm
一つのモジュールの中に、一列に並んだ8組のサーモパイル組み込まれています。
接続は I2C(あいすくえあどしー)です。
しかも、その8組の温度センサーの値がそれぞれのレジスターに対応しているので、単純にレジスター番号を指定して読み出すだけです。
レジスタ番号2から9が、8組の温度センサーに対応しているので、それらを読み出すと、単純に摂氏の温度が返されます。
このセンサーは、やろうと思えば、NXTのセンサーポートにも直接接続できます。
で、最近気が付いたのですが・・・
このセンサーは8組の温度センサーだけでなく、9組目を搭載しているらしい・・・
それは、モジュール自体の温度です。
つまり、対象物の温度を測ると共に、自分自身の温度(モジュールの周りの室温)を測ることができるらしいです。
これが、レジスタ1番で、資料には「Ambient Temperature」と書かれていました。
(訳すと「周囲温度」ですね。)
では、早速実験してみます。
レジスタ1を読み出すと・・・確かに周囲温度らしきものが表示されます。
センサーに手をかざしても、変化しません。
役に立つかどうか判りませんが・・・・
これなら、周囲温度と計測した温度との差を計算して、その差が一定以上なら、「被災者発見」というようにすれば、毎回閾値を変更する必要がなくなるのではないでしょうか!?
この温度センサーですが・・・M&Yは円高の時に買ったので5,000円ちょっとだったのですが・・・昨今の円安では、めっちゃ高い感じが・・・
そうすると、ACTLASのセンサーも価格勝負に参加できますねぇ。
う~ん これも Arduinoねた か悩む所ですが・・・
ここのところ、「SRF-05を何処で購入したのですか?」と質問がつづいたので・・・
その方達には、私が購入したサイトを紹介したのですが・・・
急に思いついて・・・怪しいサイトを検索してみました。
すると・・・
SRF05が沢山ヒットしましたヨ・・・
そして、安い!!
一個300円くらいです。
写真を見ると・・・確かにモジュールに「SRF05」と刻印されています。
でも、HY-SRF05 という型番のようです。
これは、わざと似せているのか!?
それとも偶然!?
値段からすると・・・HC-SR04と同様な感じでしょうか・・・
まあ、間違って買わないように・・・(笑)
SRF-05 は、1cm~4mが検知できるそうです。
(まあ、本当に1cmを検知できるかっていうと、ちょっと疑問ですが・・・)
で、これは超音波センサーなので・・・
当たり前ですが、センサーが超音波を発して、何かに当たって反射して帰ってきた超音波をセンサーが受け取って検知します。
超音波を発してから受け取るまでに掛かった時間を計れば、距離が判る訳です。
ということは、近くに物があれば、すぐに「あったよ」と判断できるのですが・・・物が近くに無い場合は計測に時間が掛かることになります。
レスキューBでは、ロボットは迷路の中に居るので、前や横に壁が無いことは無いハズです。
ただ、いつもは10cm程度の近さにあるけど、数タイルの直線などがあれば100cmくらいの距離になることもあります。
でも、遠く離れた壁までの距離を測る必要はなく・・・
ロボットの居るタイルの前後左右に壁があるかを検知できれば、事足ります。
つまり、1mも2mも測る必要はなく、単に30cm程度を測れれば十分です。
どうもそんな時の為に、pulseIn( ) には、第3のパラメータが用意されています。
timeout(タイムアウト)までの時間で、単位はマイクロ秒です。
例えば、
d = pulseIn( port , HIGH , 2000 ) / 58;
とすれば、超音波を発してから2000マイクロ秒(つまり2ミリ秒)経っても超音波が帰って来なかったら、そこで計測を終わりにします。
そうすると、対象物までの距離が30cm以下の場合は、その距離が返されます。 対処物が30cm以上離れていると、タイムアウトになり 「0」 が返されます。
(つまり、0が返されたら、対象物までの距離が30cm以上であると判断する)
こうすることで、ほんのちょっとだけ処理時間を短縮できるのですが・・・
タイムアウトになったからといって、発した超音波が消えるわけではなく、対象物に当たると、いずれ帰ってきます。 これをセンサーが間違って受けてしまうと、誤計測になってしまいます。
(これを、干渉というのでしょうか!?)
この方法を使う場合は、よく考えて、誤検知が起こらないように考慮する必要がありますねぇ。
ちなみに、音速は 340.29m/s(海面の場合) なので・・・
発した超音波が1m進むのに掛かる時間は、2.939ミリ秒になります。
対象物までの距離が4mの場合は、往復で8mあるので、23.509ミリ秒掛かることになります。
これを速いと見るか、遅いと見るか・・・
M&Yが使っている超音波センサーは SRF-05 というものです。
なんで、これを選択したか!? というと、安かったから・・・
当時、超音波センサーは、結構な値段でした。
LEGO MINDSTORMS の超音波センサーは(確か)5,500円だし・・・
有名な PING))) も5,000円位していました。
安い超音波センサーを探していて見つけたのが SRF-05 で、当時は1,500円位でした。
ところが、最近、いくつかのチームから「SRF-05」について問合わせを受けました。
なんか、「SRFシリーズは、干渉に強い・・・」らしいです。
(本当にそうなの!?)
ということで、改めて、SRF-05のおさらいをしておこうかと・・・
SRF-05はDevantech社の超音波センサーです。
M&Yが、このセンサーを選択したのは、上にも書いたように単に安かったからです。
価格は11.49GBP(英ポンド)で、当時は1,500円くらいでした。(今は、円安なので、2,000円程度)
それと、最短検知距離が1cmだったから・・・
テクニカルシートはこちらです。
http://www.robot-electronics.co.uk/htm/srf05tech.htm
まあ、これを読めば、私が変な説明をする必要は無いですよね。(笑)
Arduinoとの接続は、3本で、5VとGNDと信号線、だけです。(Mode2の場合)
信号線1本で、入力と出力を切り替えて共用します。
プログラムは単純明快で・・・
int SRF05( )
{
int d;
pinMode( PORT , OUTPUT );
digitalWrite( PORT , HIGH );
delayMicroseconds(10);
digitalWrite( PORT , LOW);
pinMode( PORT , INPUT );
d = pulseIn( PORT , HIGH )/58;
return( d );
}
これで、PORT で指定したピンに信号線を接続したSRF-05で距離を測ります。
返す値は 1cm 単位になります。
まあ、これが普通だと思うのですが、これを実験していて・・・気が付いたのですが・・・
上のプログラムでは、1本の信号線を出力と入力に切り替えて使っています。
これを切り替えなくても、なんか動く(動いちゃう)みたいです。
ポートを入力に設定したままで
int SRF05( )
{
int d;
digitalWrite( PORT , HIGH );
delayMicroseconds(10);
digitalWrite( PORT , LOW);
d = pulseIn( PORT , HIGH )/58;
return( d );
}
を実行しても、普通に計測できます。(何で!?)
しかし、ポートを出力にしたままでは、計測できません。
まあ、ちゃんと、入力と出力を切り替えた方が、精神的にも良いと思います。(笑)
一応、Arduinoねたにしておきます・・・
LEGO ロボットのチームとして言っちゃいけないことかもしれませんが・・・
M&Yのロボットの中で、一番要らないもの・・・できれば外したいもの・・・
それは、NXT本体です。
何故かって・・・でかい、重い・・・
ロボカップジュニアレスキューのルールが年々複雑化、高度化していく中で、ロボットも小型化、低重心化したいところですが・・・NXTを使っている限り、限界があります。
せめて、NXTのコントローラの部分と電池の部分が別々になればいいのに・・・
という前書きが終わりで・・・
ネットを俳諧していて見つけたもの
BrickPi for Raspberry Pi
Raspberry Pi を拡張するインターフェースボードで、NXT用のセンサーやモーターを接続できるものです。 センサー用が5ポート、モーター用が4ポート・・・なかなか充実していますねぇ。 しかも、大きさはクレジットカードサイズです。
これは、なかなか良いですね。
もう一つ
面白いセンサーや周辺機器をリリースしてくれている mindsensors.com の製品で
Multiplexer for NXT/EV3 Motors (NXTMMX-v2)
というものです。
元々は、NXTに沢山のモーターを接続するもの・・・らしいです。
で・・・
HPにもあるように、Arduinoのマークが掲載されています。
この機器は、Arduinoに接続することができるようです。
そう、Arduinoで LEGO Mindstorms のサーボモ-ターを制御できるんです。
マニュアルが英語なので、ちゃんと読んで無いのですが・・・
ぱっと読んだ限りでは、モーターを動かす(正転、反転、強弱など・・・)は勿論、モーターの回転数を読み出すことも出来そうです。
ちょっと、これは試してみたいです。
なんとなく、これを使いこなせるようになれば、NXTは要らなくなりますねえ。
このセンサーの説明というか、リファレンスというか・・・そういう資料が何処にも無いのですが・・・汗;
Arduinoとの接続の sample program があったので、それを参考に実験しました。
すると・・・
値の読み出しは簡単でした。
GY-521には読み出し用のレジスタが備えられていて、それを読み出すだけです。
順に
加速度センサーX軸
加速度センサーY軸
加速度センサーZ軸
温度
ジャイロセンサーX軸
ジャイロセンサーY軸
ジャイロセンサーZ軸
となっています。
それぞれは16ビットの大きさなので、8ビットを2回づつ読み出します。
何で温度が測れるの!? と疑問はありますが・・・別に、必要がなければ使わなければ良いだけですから・・・
まずは、加速度ですが・・・
はい、普通に読み出せました。
水平にすると0 傾けると正の値、逆に傾けると負の値になります。
秋月電子で売られているI2Cの加速度センサーが1,000円であることを考えても、これだけで十分元がとれるように思います。(笑)
では、肝心のジャイロセンサーの方を確認します。
と、言っても、ジャイロセンサーの値の読み出しは、レジスタを読み出すだけなので問題ありません。
問題は、取り出した角速度を積分して角度にするのに、どれだけ精度がだせるか・・・
ということですね。
前に、他のジャイロセンサーで実験したように
100m秒単位で読み出した値を合計して1/10にすると、ある程度の精度が出るようです。
10m秒単位で読み出した値を合計して1/100にすると・・・やりすぎかなぁ。
まあ、やる気があれば、これくらいの安物センサーでも実用になると思います。
最近、RoboCupJuniorのロボットにジャイロセンサーを搭載したロボットが増えてきたように思います。
M&Yのロボットにも搭載しています。
ジャイロセンサーは、ロボットの向いている方向を検知するのですが、コンパスセンサーのように絶対的は方向はわかりません。 相対的な方向を検知します。
絶対的な方向が判らないなら・・・やっぱりコンパスセンサーを使った方が良いじゃないですか!?
はいっ、ごもっともでございます。
しかし・・・
コンパスセンサーは磁気に弱い (「巨人の星」の星一徹風に・・・古い)
確かにコンパスセンサーは競技会場の磁気条件に依存して、使用できなかったりします。
で・・・ロボットの向いている方向をジャイロセンサーに頼ることになるのですが・・・
LEGO用のジャイロセンサーは、結構な値段です。
NXT Gyro Sensor は 54.95USD
NXT用の慣性センサー は 1万円前後します。
たかがセンサー、なのですが高価ですよねぇ。
そこで、安いジャイロセンサーが Arduino で使えるのか・・・実験してみました。
購入したのは、 GY-521 というヤツで・・・
怪しい中国の通販サイトで、1個 9.60USD のものです。 (当時だと800円くらい)
3軸のジャイロと3軸の加速度センサーを搭載しているらしいです。
まあ、800円なら・・・ジャイロが使えなくても、3次元加速度センサーとして使えれば問題無い・・・
程度の気持ちでポチリました。
I2C接続なので、Arduinoとの接続は簡単です。
さて・・・