2011年2月22日火曜日

シャープの赤外線のほうが便利だった


MAXSONAR と GP2Y0A21YK をつないでみた。

MAXSONAR は電源 3.3V 5V どちらでもOKだ。A/Dが3.3Vなので一応3.3V電源にしてみる。
昨日つないだVRとすげかえてみた。
正常に動作しているらしいが部屋が狭いので、半分くらいしか振らない。
まあいいや。

続いて、シャープの赤外線のやつ。GP2Y0A21YK。
データシートを見ると、電源5V で出力は 概ね3V強まで。 ということは、GEMMYのコネクタに直接つなぐのに便利だ。
サーボ用のコネクターと線をハンダ付けしてアナログ入力に挿す。

なんなく動いた。

プログラムは昨日の短いやつそのままで良い。

GP2Y0A21YKの方が簡単だった。
=================
超音波タイプは当然指向性があるのだが、狭い部屋では余計な反射が入って不安定である。
つまり音波のマルチパス。

シャープの超音波センサーはロングレンジタイプもあるので、近距離用と遠距離用2つくっつけて
プログラムで切り替えるのがいいかもしれない。
ショートレンジは10cmから60cmぐらい、ロングレンジは 50cmから2mぐらいまでつかえる。
(データシートではもう少し広い範囲で書かれている)

=================
PINGもつなごうとおもってライブラリを検索してみたが意外にも見つからなかった。
もう、過去のものなったか・・・・

=================
話は横道にそれる。

GEMMYをいじり始めるとサーボ用のケーブルが結構必要になる。
GEMMYを購入するときにはサーボ延長ケーブルの長さを変えて
何本か一緒に買っておくと良い。オス~オスタイプの方が使うかな。

自分は飛行機で古くなったやつを流用しているが、その在庫も尽きてきたので、
次回なにか注文するときにまとめ買いすることにしよう。

距離センサーを考える


手元にある距離センサーを引っ張り出してみる。

左から "PING" "MAXSONAR EZ1" "SRF10" "GP2Y0A21YK"(ごちゃごちゃの基板についているやつ)
最初の3つは超音波、4番目は赤外線。

PING
超音波では一番ポピュラー。といっても以前はお手軽なのがこれしかなかったからだ。
ディスカバリーチャンネルの工作系番組でも時々見かける。
使い方はやや面倒で、発信トリガーを送ったらピンを入力に切り替えてパルスの長さを測る。
このパルス幅が音速での往復時間になる。
mbedならば、たぶん誰かが簡単に使えるライブラリを書いているだろうから簡単かもしれない。

遠い方は3m ぐらい、近い方は10cm ぐらいまで取れる。

このセンサーでハマるのは、なにも考えずにループでパルス幅をカウントしたりすると、
近い時にはループが速く回り、遠くでは遅くなる。
微分して速度を求めようとしたりするとトンチンカンなことになる。

まあ、障害物があったらよける程度の制御ではあまり難しいことを考えなくても大丈夫である。

MAXSONAR
PINGと同じだがスピーカーとマイクが兼用になっている。
アナログ(電圧)出力、シリアル出力、パルス出力があって、アナログでつなぐととても簡単。
電圧も3.3V 5V どちらでも良い。
ハマるポイントはPINGと同じなのだが、アナログ出力の場合気がつかないまま使える。

SRF10
これはI2C。 小さくて性能は上記2つに比べて少し良い。
といってももらったままお蔵になっていたので、使ったことはない。
あとでI2Cの勉強するときにやってみよう。

GP2Y0A21YK
これは赤外線センサーである。片方の目から赤外線を発して、もうひとつの目で受ける。
光の速度はあまりに速いのでこの程度のセンサーでは往復時間を測ることはできない。
このセンサーは、対象が近くにあるときと遠くにあるときで反射した赤外線の入射角が異なることを
利用している。
ゆえに、出力が線形ではなく離れると分解能が低下する。
大体 10cm~50cmが実用域なので、障害物よけなどに使える。

前述の超音波センサーは意外と感度がよく棒などでも拾えるが、こいつは仕組の関係で
面をセンスするのが得意である。

===========
一番簡単な、MAXSONARのアナログ入力でもやってみようかな。

2011年2月21日月曜日

A/Dは3.3Vなのね


A/Dのお試し。VRの両端に電源電圧をかけて、真ん中の端子から分圧された電圧を取り出して使うのが常套手段であります。
サーボのコネクタはVRと順番が異なるが電源電圧と信号線があるので都合がいい。
(順番は入れ替えねばならない)

で、
5VがVRの両端にかかるようにしてGEMMYのアナログ入力ピンに接続して動いた。
VRを回すと0.0-->1.0の値が表示されサーボが然るべき角度になる。

あれ・・・・?

VRの上のほうが余っている。回しきらないのに 値が1.0になって当然サーボもそれ以上回らない。

はは~んと、VRから出る電圧をあたる。やはり3.3V で値が1.0になる。
A/Dの入力がフルスケールで3.3V。

テストだから理由がわかればそれでおしまいなのだが、そこは趣味だから、
好きなところまでやってみる。

A/Dコンバータに外から基準電圧を入れる方法があるのだがmbedのデータシートを見ても見つからない。
これは安易に信号の方を3.3Vにしたほうが良さそうだ。電流も僅かなのでVRの両端にかける電圧を  5Vから分圧すれば十分である。例えば、33KΩのVRに17KΩの抵抗を直列に入れれば良い。

なのだが、このあと3.3V動作のセンサーをつなぐことも多そうなので、簡単な電源を作っておくことにした。と言っても5Vに3.3Vの3端子レギュレータをつなぐだけである。
ワークベンチにユニバーサル基板をくっつけたが、この前リセットボタン用にGEMMYにくっつけた
基板でも十分乗る。

実はmbedに3.3v出力があるのだがショートでもさせてレギュレータを焼失すると、まるごと使用不能は痛いのでこのようにした。
実際に使うときセンサーの消費電流がはっきりわかっていればmbedからとっていいだろう。

VR式のサーボテスター。
プログラムは、たったこれだけ。

#include "mbed.h"
#include "TextLCD.h"
#include "Servo.h"

TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7

Servo myservo(p26); //GEMMY C1 CONNECTOR

AnalogIn ad(p15);   //GEMMY A1 CONNECTOR

int main() {


while(1){
double a = ad.read();
myservo = a;
lcd.cls();
lcd.printf("AD TEST %4.2f",a);
wait(0.1);
}

}

リセットボタンをつけるより良い方法とワークベンチ

LABOARさんからmbedのソケットの空いている列は同じ並びのmbedピンにつながっているんですよ~
と教えていただいたので、リセットの工作を修正。

基板用のピンヘッダ オスに線をつなぐ。mbed基板に接触すると気持ち悪いので、
若干頭を外側に曲げておくと良い。

で、このように挿せばOK。最初から90度曲げたピンが売っているので、
新しく買うならそれを使ったほうが良い。

アナログ入力のテストを行うのだが、だんだんとぶら下がりもんが増える。
このように部材を固定したワークベンチを作ると良い。
GEMMYは下面からビスで元々の穴を利用して固定してあるが、
ほかは、強力両面テープで固定しただけ。簡単なものだがケーブルに引っ張られて、
基板が移動したりしないので、イライラがかなり減らせる。
VRを回すときに片手で回せるし、オシロのプローブをあてるときも相手が固定されていれば
とても楽である。

ブレッドボードはまだ固定していない。
ブレッドボードを使うか、ユニバーサル基板を使うか、
両方乗っけるか考えているところである。

2011年2月19日土曜日

15分でサーボ動く


リセットボタンができたので、調子にのってサーボをつないでみる。
普通ならここで、ユニバーサル基板にサーボ用のピンを立てて・・・・となるから、
めんどくさいのだが、GEMMYはサーボ用にピンが立っている。
寝る前にもうひとつ進んでおこうと、気軽に行ける。

mbedのライブラリからservoで検索して、なにも考えす一番最初のをインポートする。
サンプルのコードからぺぺっと カットアンドペーストして、
この前作ったボタンテストのプログラムに足す。

とりあえずめんどうだから、USB給電でも負荷にならなそうな、
ちっちゃいサーボをつないだ。

コンパイルして実行~~~??? あれ 動かん。

オシロで信号ピンをあたると、パルスはちゃんと出ている。

しばし考えてサーボコネクターのプラス側をあたる。

おお、USBから給電してしまわないように出来てるぞ。
それは正しい!

で、一昨日作った間に合わせ電源をつないだら動いた。
めでたしめでたし。

ここまで、トラブルシュートいれて15分。
まあ、楽なもんですよ。

------------------
プログラムは、ボタンテストにちょっと足して、白、黒ボタンで、サーボが
いっぱいに切れる。赤ボタンでニュートラル。
即席サーボテスター出来上がり。

コードは、ほとんど変わりませんわ。

#include "mbed.h"
#include "TextLCD.h"
#include "Servo.h"

TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7

DigitalIn swWhite(p13);
DigitalIn swRed(p14);
DigitalIn swBlack(p9);

Servo myservo(p26); //GEMMY C1 CONNECTOR



int main() {

lcd.printf("SERVO TEST");

swWhite.mode(PullUp);
swRed.mode(PullUp);
swBlack.mode(PullUp);

while(1){
if(swWhite==0){
lcd.cls();
lcd.printf("#### ---- ----");
myservo = 1.0;
}
else if(swRed==0){
lcd.cls();
lcd.printf("---- #### ----");
myservo = 0.5;
}
if(swBlack==0){
lcd.cls();
lcd.printf("---- ---- ####");
myservo = 0.0;
}

}
}

2011年2月18日金曜日

やっぱりリセットをつけてみた

話は少し長い。
次はなにを試そうかと思い、サーボをつなぐことにした。
サーボをつなぐのにUSB給電は心もとない。
5VのACアダプタがなかったので、一昨日3端子レギュレータで間に合わせの電源を作った。
机の上に部材が散らかってくると、線が引っ張られて動いたりして落ち着いて作業ができない。
で、開発作業をするときは、これらをアクリル板などに固定する。
片付ける時もそのまま立てかけられて便利である。

さて、そこで・・・・・・

GEMMYをアクリル板に固定するとリセットスイッチが押せない。
一晩考えた作戦が以下である。

まず、下側のスペーサー2本に2mmの穴をあける。
写真は組み立てた状態だが、スペーサーを外して工事をするのは言うまでもないだろう。(^_^)/


この穴を使って、前面にユニバーサル基板を取り付ける。
それにタクトスイッチを取り付けて配線をする。
・・・・・・ というのは 構造をわかり易く説明するためで、実際は基板にスイッチを付け、
配線が終わってから基板を固定するのは、工作に慣れている人には言うまでも無いだろう。(^_^)/


前面から見るとこうなる。
あとから、ちょっとした回路を組む場所にもできる。

リセットの配線先であるがmbedボードの説明を読むと、
nR ピンは「リセットスイッチと同じ機能」でオープンコレクタでプルアップされてます・・うんぬんと
書いてあるのここででいいだろう。たぶん。

GEMMYのソケットからジャンパしたいところだが、
完成状態で送ってもらったので、ソケットピンはLCDの下。線をつなぐことはできない。
もし、組み立て前だったら線をひっぱておくと良い。

野蛮で気が引けるが、確実なところでmbedのnRピンに直接ハンダ付けした。
0V側は、すぐ近くのサーボコネクタのGNDに付けてみた。

とりあえず、異常なく動いているようだ。

2011年2月13日日曜日

横道にそれて中華PAD


サーバーサイドで開発システムが動くんだからこれでも行けるよね〜???
と、中国製PCタブレットで試す。
一番ダメそうなエディターのところまで来たら動いている。
まあ、できないことはないようだ。

が、しかし・・・・

このPCでは、あまりに処理が重い。画面も小さくてこれ以上やる気にならない。
つながれてるmbedとどっこいのCPUだから当然である。

10インチのガラパゴスかiPadなら 行けるかな〜

2011年2月12日土曜日

ボタンを読む



ボタンを読んで、LCD の対応する位置に"####"を表示させる。

まず DigitalIn で ピンと名前を対応付ける。
あとは、その名前でピンの値を見る。押されているときはゼロ。はなすと1になる。

・・・・・ はずであるが???  ゼロしか返ってこない。

ピンは In/Out  設定可能であるし、アナログの場合もあるので、外付けの
プルアップが無い。スイッチがオープンになっても電圧がかからないのだ。
これも、設定できて、

swWhite.mode(PullUp);

とかやれば、チップが自分でプルアップしてくれる。



#include "mbed.h"
#include "TextLCD.h"

TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7

DigitalIn swWhite(p13);
DigitalIn swRed(p14);
DigitalIn swBlack(p9);

int main() {

lcd.printf("BUTTON TEST");

swWhite.mode(PullUp);
swRed.mode(PullUp);
swBlack.mode(PullUp);

while(1){
if(swWhite==0){
lcd.cls();
lcd.printf("#### ---- ----");
}
else if(swRed==0){
lcd.cls();
lcd.printf("---- #### ----");
}
if(swBlack==0){
lcd.cls();
lcd.printf("---- ---- ####");
}

}

}

LCDに表示してみる


LCDは黒い四角が表示されているので、これもUSBの給電だけで動きそうだ。

まず、
http://www.eleki-jack.com/arm/2010/08/mbedlcd2.html
を参考に、ライブラリの追加をする。
このページで紹介しているライブラリはLCDデータピンが下位4bitを使うようになっているので、

一覧の中から
TextLCD library for controlling various LCD panels based on the HD44780 4-bit interfac
と書いてあるやつを選んだ。
これは上位4bitを使うようになっている。

ポートとの対応とかどうなってるのかいね~? と思いつつサンプルのコードを見ると、

TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7

という具合に設定するらしい。
な~るほど。最近の芸風はこういうのか。

で、これを main.cpp に書くとこうなる。

#include "mbed.h"
#include "TextLCD.h"

TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7


int main() {

lcd.printf("Hello enRoute\nGEMMY LCD TEST");

}


GEMMYが来た


GEMMYが届いた。サーボなどをつながなければUSBの給電で動きそうなので、とりあえず、mbedボードのUSBコネクタでつないでみる。PC側にmbedのリムーバブルdiskが現れたので大丈夫なようだ。
htmlファイルがあるのでクリック。mbedのwebにつながる。

http://mbed.org/users/nxpfan/notebook/lets_get_started_jp/

を参考にユーザー登録。
サンプルのhelloWorld をダウンロードする。
これを、リムーバブルdiskにコピー。

リセットすると、LEDが点滅するはず。
GEMMYのボタンはリセットではないらしいので、mbedのボタンを押したいが、
指が入らず。



裏のアクリル板を外して押す。
おお、動いた。

プログラムをボードに入れるには、大概は転送ツールが必要である。
操作を習得するのは煩わしいので、このようにコピーで済むのは便利。

実際に使い始めるとリセットボタンはあまり使わないのかもしれないが、
しばらくはプログラムのお勉強で頻繁にリセットするかもしれないので、
アクリル板を外したついでに、リセットボタン位置に3mmの穴をあけておいた。

考えてみると、プログラム中は外しておけばいいので、無駄だったか。(^^;
まあいいや。

------
次にプログラムを書いてコンパイルする手順を確認。
webからCompilerを開くとブラウザー上で開発環境が起動する。
組み込み系のツールを使ったことのある人ならば、いきなり使える簡単さである。

新規作成すると、LED点滅のコードが書きこまれたメイン関数が生成される。
これに書き足していけばいいわけだ。(多分 HelloWorldの中身はこのプログラム)

書き換え、コンパイル、実行の手順確認だけが目的なので、点滅間隔を変えて、
コンパイル。コンパイルすると、そのままPCへのダウンロードが始まる。
一旦DISKにおいてもいいし、mbedドライブに直接saveしてもいいだろう。

わざと、先のHelloWorldは消さずに、新しいプログラムをコピーしてみた。
mbedドライブには2つのプログラムがある事になるがリセットすると、
あとで書いたほうが実行された。
多分、一番新しいものが実行されるのだろう。