PCからAGB65-ADC経由でセンサの値を読み取る
|
はじめに
マイクロソフトのWindowsアプリ開発環境が、xx2005にバージョンアップし、特定の言語だけなら無償で入手できるようになりました。また、PC−ロボット間の通信でよく使われるシリアルポートを駆動する、SerialPortコンポーネントも標準装備になって、ますますホビーロボット製作のツールとして使いやすくなってきました。
ここでは VisualC#2005(以下VC#)を使って浅草ギ研製感圧センサーボード「AGB65−ADC(Analog Digital Converter)」をPCから駆動してみます。
尚、C#以外の言語でも基本的な考え方は同じですのでこのページを参考にしてください。
VC#2005のインストールについてはこちらを参照願います。
VC#2005でシリアル通信をする方法、シリアル通信、RS232Cについてはこちらを参照願います。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※ここではビギナー向けに解説していますが、このページは、プログラミング技術の向上を狙っておりません。VC#に関する質問はご遠慮下さい。(他所で良いページがたくさんありますのでインターネットで調べてください。もしくは本を買って勉強してください。プログラム本は高いですが、図書館に申請すると無料で読めます。ついでにギ研の本も申請してもらうえたら幸いです。)
AGB65シリーズとAGB65−ADC
ロボット神経システムAGB65シリーズはPCやマイコンのシリアル通信機能を使えるスキルがあれば簡単に動かすことのできるモータコントローラ、センサー群です。1つのシリアルラインを複数のAGB65シリーズで共有でき、取り外しや追加も簡単に行えますのでPCをホストコンピュータとしたロボットの作成が容易にできます。
AGB65シリーズについてはこちらにも情報があります。
今回使用するAGB65−ADCは1つのボードに16個までの電圧変化型センサーを付けて、それぞれのセンサの値を数値で取得できます。解像度は8bit又は12bitの2通りに指定できます。
4点感圧センサー AGB65-ADCの詳細はこちらを参照願います。<−このページは必ず参照してください。
(以後、このページをADCのページといいます)
PCとマイコンのシリアル通信の電圧は違いますが、AGB65シリーズは標準ではマイコンと接続するようになっておりますのでこれを変換する必要があります。変換にはAGB65−232Cというオプションボードが用意されております。
COMポートが無いノートPCなどは、USBシリアルアダプタを使用することになります。市販の簡易的なUSBシリアルアダプタの場合は正常に通信できないものがありますのでご注意ください。浅草ギ研で販売しているものは動作確認済みです。
実際の接続
まずはAGB65-232Cを経由してPCのCOMポートへつなぎます。詳しい接続についてはADCのページを参照してください。COMポートが無いノートPCなどを使う場合は、市販のUSB-シリアルアダプタを使用してください。
ここではまだセンサーなどは付けていませんが、とりあえず、ADCとPCを通信させてみます。尚、実際のセンサーの接続もこのページ下で行います。
モジュールは内部5Vで動いており、6.5V以上(15Vまで)の電源が必要です。添付されている電源ケーブルは9V乾電池用のスナップがついてます。供給する電源はできるだけ6.5Vに近い電圧の方がロスが少ないのでできるだけ低くしましょう。
プログラミング中はずっと通電することもあるかと思いますので乾電池を使いたくない場合はケーブルを加工して外部電源化するのもよいでしょう。今回は1Aまで出力できる9VのACアダプタが手元にありましたのでそれを使いました。ACジャックと、ADCに添付されている9V乾電池用のケーブルを切ってハンダ付けしたのが下の右の写真です。
その他細かい接続や注意点はADCのページを参照願います。
プログラミング〜値を読んでみる
以下、プログラミング経験がある方を想定して進めます。C#や.NET環境をまったく使ったことが無い方は前のページ(ココとココ)を見てください。VC#2005(エクスプレスエディションというもの)はマイクロソフトより無償で入手できます。VBもC++もJ#も無償ですが、以下C#ですすめます。
C#は大文字と小文字を判断しますので、打ち間違いに注意してください。 textBox と TextBox は別ものと判断されます。
まずは簡単に、ADCの各ポートの情報を読み取ってみます。各ポートにはまだなにも接続されていませんが、0に近い適当な値が読み取れるはずです。
,NET FreamWorks Ver2.0の環境では、SerialPort(シリアルポート)コンポーネントが標準でサポートされています。データを送信するには、SerialPortコンポーネントでCOMポートをオープンし、通信速度などの設定をしてWriteメソッドであらかじめデータを格納していた配列を指定すると、配列のデータが送信されます。
受信は _DataReceived というイベントがありますのでこの中で受信の記述をします。
注意点としては、Serialportコンポーネントは、ユーザーが作ったFormとは別スレッドで動きますので、プログラムをスレッドセーフで書かないと、デバックモードでデバック実行できません。これらの詳細と回避方法はソースにコメントを入れましたのでそちらを参照願います。
ADCのページを見ると、各ポートの読み取り命令は4種類あります。よって、ボタンを4つ配置して4種類の送信イベントを作り、受信は1つの受信イベントで、来た値によって表示を変えるというものにします。
ということで作ったプログラムが次になります。尚、exeではなく、全ソースもありますので詳細はそちらを参照してください。各、右クリックして「対象を保存」で保存してください。(圧縮してますので解凍してください)。
コンポーネントの配置などのプログラム作成の基本についてはこちらのページでも解説しています(あくまでもサンプルですのでご質問はご遠慮願います。)。
<実行ファイル>
■Release.lzh
(右クリックで対象を保存)
*解凍して、フォルダの中の AGB65-ADC_test.exe を実行してください。
<全ファイル>
■AGB65-ADC_test.lzh
(右クリックで対象を保存)
*解凍して、C#からプロジェクトファイル AGB65-ADC_test.sln を開いてください。
とりあえず、実行してみた結果が下のようになります。
ボタンを押すと、右のRichTextBoxに返信結果が表示されます。( )が付いているところは返信ヘッダで、1:以降が結果データです。
1:5
はポート1の読み取り結果が5、を表します。
8bitで全チャンネルを読んでみました。なにもつないでいないので低い値が表示されます。
12bitモードでも大体同じ。結果は2バイトで返されるので、1:〜16:は合体して表示しています。12bit合体方法はADCのページのシリアルコマンドの中に書いてあります。(簡単に言うと、ビックエンディアンで上位4ビットには0が入って送られます。)
プログラムの説明は、コメントを参照してください。
ADCに対する命令送信部分はこのような感じ。
データ受信は下のような感じです。スレッドセーフにするために、デリゲートでメソッドを渡すようにしています。このイベントはSerialPortのスレッドで動いているのでForm1のコンポーネントにアクセス、たとえばテキストボックスに数値を表示、などするのは直接できませんのでInvokeで行っています。このため、配置するテキストボックスはあらかじめ、テキスト表示メソッドを持ったクラスを定義しています(ソースの一番下に記述されているクラス)。
と、ここまでやったのですが、たまにコケる場合があるので、実行する場合には「デバック−>デバックなしで実行」を選んだ方が無難です。
(簡単につくったのであまりテストしていません。どこかおかしい可能性あり。出きれば、命令長を読み込んだ後、1バイトづつ命令長回数を読み込んだ方がよいとおもいます。この時、DataRecivedイベントを外しておかないと二重にイベントが発生するので注意。)
3軸加速度センサの値を読んでみる
それでは実際にセンサを接続してみます。まずは浅草ギ研で販売している「3軸加速度センサVer2」で、重力加速度、つまり傾きを測定してみましょう。
3軸加速度センサVer2は、内部3.3Vで動きますが、レギュレータICが付いているので4.3V〜16Vの電源でも動きます。AGB65−ADCはセンサに対して5.5V電源を供給できますので、加速度センサの電源はADCからとることができます。
3軸加速度センサVer2は、3.3V電源入力と4.3V以上の電源入力の端子が異なりますので注意して下さい。VCCとあるのが4.3V以上の電源の端子です。この端子だけは2.54mmピッチになっています。その他は2mmピッチです。
浅草ギ研では2mmピッチピンヘッダに接続できる3ピンコネクタを販売しています。VCCは2.54mmピッチなのでこれをそのまま接続することはできません。ここでは、浅草ギ研で販売している2550コネクタを使用しました。センサーケーブルの片方のコネクタの赤・黒を切って、2550コネクタ1x2をつないだところが下の写真になります。白い線はセンサのX出力につないでいます。
YとZ出力は、センサーケーブルを加工してケーブルを作りました。センサーケーブルは3Pなので、余分な1ピンをニッパで切り取っています。
切り取った部分はカッターなどできれいに成型します。これを両端行います。
こうしてできた2P−2PケーブルをYとZ出力につないだところです。
全体的な接続は次のようになります。
#1=X
#2=Y
#3=Z
となります。
重力加速度(最大1G)を測定するので、3軸加速度センサは1.5Gモード(出荷時とはスイッチが逆)にします。
理論値ですが、3軸加速度センサは0Gのときに出力が1.65V(プラスマイナス10%)になります。AGB65-ADCは0V〜5Vの値を
8Bitの場合:0(0V)〜255(5V)
12bitの場合:0(0V)〜4095(5V)
で返します。
たとえば、12bitモードのとき、0G=1.65Vの時の値は理論的には (1.65V/5V)×4095=約1351 という値になるはずです。
では実際に測定してみましょう。XとYは水平時に0Gなので、まずは水平時を測定してみます。
*絶縁手袋をつけてます。
X=1354
Y=1375
Z=1987
という結果になりました。X,Yは(大体)水平なので(大体)理論値の1351近辺になっています。ということで測定できていることがわかりました。Z軸の値ですが、常に下方向に1Gが加わっていることになりますので大きな値が出ています。
理論値ですが、1.5Gモードは1Gで800mV変化します。800mVの変化は
(0.8V/5V)×4095=655.2
の値変化に相当します。0G時には1351ですので1G時(完全に水平時)は1351+655=約2006 となることが予想されます。上の値は1987なので大体合ってます。
(Z軸の値が違う方は、3軸加速度センサのDIPスイッチが1.5Gモードになっているか確認して下さい。)
次にX方向に左に傾けてみましょう。
X=1986
Y=1336
Z=1590
写真では完全に傾けていませんのでX方向に1Gまでは加わっていません。しかし、X軸が1354−>1986と、大体0G−>1Gぐらいに変化したことがわかると思います。Y軸はあまり変化していません。Z軸は0Gに近づいてきました。
次にY方向に傾けてみましょう。写真ではわかりづらいかもしれませんが、センサを手前側に傾けています。
X=1408
Y=767
Z=1535
今度はYが大きく変化しましたが、XとZは0G付近です。
最後に、ひっくり返してみましょう。予想されるのは、XとYが0G近辺で、Zが−1Gになることが予想されます。
X=1410
Y=1430
Z=698
結果は予想通り、XとYが0G付近、Zが−1G付近となりました。
このようにして重力加速度をPCで測定することができます。今回の例では重力加速度、つまり傾きを測定しましたが、XYZ方向の「加速度」ももちろん測定できます。たとえば、モードを6GモードにしてXYを常に測定し、大きな衝撃が加わったかを検知することができます。また、Z軸を常に測定することで上下運動の激しさなどを測定することもできます。
ここでは実験していませんが、測定周期を調整し測定値を積分(加減算)することで物体の移動距離を割り出すこともできると思います。(高速なサンプリングが必要なので、もしかすろとADCを経由するとあまり精度ができないかもしれません。マイコンなどで3軸加速度センサを直接駆動すれば間違いなく可能です。)
近接センサの値を読んでみる
浅草ギ研では6cm以内の近接距離を測定する近接センサも販売していますので、これをつないで値を読んでみます。
このセンサはもともとは機器の取っ手部分に取り付けて、手でにぎったかどうかの判定をするスイッチが主な目的らしいです。
この 近接センサは赤外線反射型のセンサで出力は非線形です。6cm以内に赤外線を反射する物体が無い場合はほぼ0Vの出力、物体が接近するごとに電圧が上がっていきます。但し、約2mm以内になると近すぎて赤外線の反射を拾えないので逆に2mm以内は接近するほど電圧が下がります。
ということで、取り付けする場合は2mm以上の空間を設けることによって、距離による単調増加の出力が出るセンサとして使うことができます。
AGB65−ADCとの接続ですが、浅草ギ研で販売しているセンサーケーブルをそのまま使うことができます。
下の写真はADCの#1に近接センサをつないだところです。ここで値を測定してみます。とりあえず近くに反射するものがなにも無い場合の値は、
値=89
となりました。12bitで読み取っていますのでかなり低い値が出ています(最高値は4095)。
ここで、1ch読み取り(12bit)でセンサ番号を1で指定して読み取れば見やすいとおもうかもしれませんが、プログラムにバグがありました。すいません。とりあえず簡単なサンプルプログラムなのでこのままにします。全ch読み取りで#1の値だけを見てください。
赤外線反射型なので、同じ距離でも赤外線を反射しやすいものとしにくいものでは値が違います。白いものは反射しやすいので値が大きく出ます。ということで白いものを近接距離で測定してみます。
値=3927
ということで、ほぼ最高値が出ました。6cm以内なら、距離を遠くすれば値は下がります。
次に、白いものではなく、人間の色で試してみました。(親指にあてている)
*右手はカメラを持っているので指しか写せない。
値=1418
これは何度か試しましたが、大体1400前後の値が出ます。対象物の反射率(特に色)によって値が変わるので、正確な距離が測れない、と思うかもしれませんが、逆に、対象物が何か決まっていない場合は、「1400ぐらいの数値が安定して出力されている場合は、人間が触れている」という判定で、人間接触センサとして使うことも考えられます。
最後に、明らかに反射率が低そうな、黒い物体を測定してみました。
値=275
ということで、近接距離でも値は低いです。但し、接近するまえの状態との比較(なにも無い場合は#1は大体80前後の値だった)により、ものが近づいてきたかどうかは判定できます。
PSD距離センサGP2D12の値を読んでみる
おそらく、ホビー用の距離センサで一番多く使われているのはこのGP2D12ではないでしょうか?このセンサはツクモロボット王国や、秋葉の千石電商などで販売されています。どちらも通販を行っているので地方の方はネットで調べてくみてください。浅草ギ研製品も販売しています。赤外線PSD方式で、出力は線形ではありません。また、数センチ以内になると値が逆になります。もともとは数十センチの近接スイッチ(トイレの自動水洗など)用のセンサのようです。
※GP2D12は浅草ギ研では販売していません。
GP2D12を販売しているところでは、大抵の場合GP2D12のコネクタに合うケーブルか、コネクタ端子を売っています。今回はコネクタ端子を購入しました。
GP2D12の端子の配置は、センサを正面から見た場合
センサ出力:GND:電源+
の順番になっています。
AGB65−ADCのセンサポートは
センサ入力:電源+:GND
の順になっており、GP2D12と接続するときには電源線がクロスするので注意しましょう。
とりあえず、浅草ギ研で販売しているADC用のセンサーケーブルを使って、ケーブルを作って見ます。とりあえず、センサーケーブルの片側を切断します。
次に、購入した端子をかしめます。下の写真のように、圧着工具があると便利です。
GP2D12用のコネクタ(白いコネクタ)に端子を差し込んだところです。配線が左から
白:黒:赤
になっています。
反対側はセンサケーブルのコネクタ(黒)そのままです。配列は左から
白:赤:黒
になっています。つまり、電源線がクロスになってます。
接続は下の図のようになります。
実際の写真は下のような感じになりました。
では早速、距離を測定してみましょう。まずは距離が遠い場合。GP2D12は80cmまでの距離を測るので、2m先のカベに向けてみました。
12bitで全ch読み取りをしたところです。#1の値だけを確認してみると
値=17
となっています。距離が80cm以上だと低い値になるようです。
この距離センサは、近接センサと同じよううに赤外線を使っていますが、測定方式が違いますので測定結果は対象物の色には左右されません。
近くに手をかざして見ますと、
値=508
となりました。
もう少し近づけてみると
値=2011
となり、距離によって測定結果が変わります。
PSD距離センサはあまり近いと距離を測定できません。試しに3cmぐらいまで接近すると、
値=665
となり、近づいているのに値が下がってしまいます。
PSDセンサは手軽に距離が測定できて、価格も安いので、この部分だけに気をつければ簡単に距離測定のシステムが作れます。
感圧センサの値を読んでみる
浅草ギ研では荷重を測定できる感圧センサを販売しています。ここではこのセンサを接続してみます。
ADCは5Vの電源をセンサに供給できます。感圧センサの場合、5V電源はVCC/GNDに接続しますが、この端子は2.54mmピッチのため、センサーケーブル3P−3Pを改造する必要があります。ということで、3軸加速度センサ(上で説明)の時と同じように電源線を切り離して2550コネクタ1x2(浅草ギ研で販売)を取り付けました。
全体的な接続は下のようになります。
では値を読んでみましょう。まずは無荷重の場合。
値=1335
となりました。値から電圧を逆算してみますと、(1335/4096)×5V=1.63Vとなり、無荷重状態ではこの電圧が出るようです。感圧センサのページにあるグラフを見ますと大体合ってます。
では、少し押してみます。
値=897
となりました。(897/4095)×5V=約1.1Vとなりますので、先のページのグラフから大体1kgfで押したことがわかります。
AGB65−ADCを使うと、最大128個までのセンサを読み取れるので、ロボットもしくは人間の体中に感圧センサをつけてサンプリングデータを取るということも可能でしょう。
もっと実験してみたいけど時間が無いのでこの辺にしておきます。
抵抗変化型センサ(曲げセンサ)の値を読んでみる
AGB65-ADCは電圧変化を読み取れますが、抵抗変化型センサも電圧を加えれば変化を読み取ることができます。抵抗変化型センサではRCサーボの角度を読み取っているポテンショメータが有名です。浅草ギ研では曲げると抵抗が変わる「曲げセンサー」を販売していますので、これを読んでみます。抵抗変化型センサーであれば考え方は同じですのでいろいろと試してみてください。
抵抗値を読むには?
抵抗に電流を流すと抵抗の両端には電圧差が生じます。
この抵抗を2つ直列にすると
このように電圧は2等分されます(電流も減りますがここでは電圧だけに注目)。このように直列抵抗の両端電圧は電源の電圧差を維持しますが、抵抗の間は分圧されます。この分圧の度合いは抵抗値に(ほぼ)比例しますので、例えば下の抵抗を大きくすると中間点の電圧は上がります。
ということで下の抵抗を曲げセンサーに変えて、ADCに接続した回路が下のようになります。
実際にはブレッドボードをつかって接続しました。
では早速、今までと同じように、C#で作ったプログラムで読んでみましょう。
まずは曲げていないとき。理論値では10kオーム2つで5Vが分圧されているので、出力は2.5V、12bit諧調の場合は最大値9095の半分の値で2048前後になるはずです。
*16ch全部読んでますが#1だけを見てください。
値=2044
となり、予想と大体合ってます。
次に、曲げて見ました。抵抗が上がるので値も上がるはずです。
値=3135
となりました。
このようにして「曲げ」具合もPCで計測できます。
おわりに
このような感じで簡単に、電圧出力型や抵抗変化型のセンサーの値をPCで読むことができます。これらを組み合わせてリモートブレイン型ロボットを作ることもできるかもしれません。是非、面白いアプリケーションを考えてみてください。
2007年7月12日
|
|
|