- armadillo300のシリアルデバイス経由でプログラムにより距離センサから信号を受け取る.ここで,センサに係わる機器としては以下のものがある.
- AGB65-ADC
- シリアルポート経由で受けた指令を元にセンサからの信号を数値化・整形して返す機器である.この機器が扱うシリアルデバイスはTTLレベル信号であり,論理0が0V,論理1が5Vである.
- 距離センサ
- 物体との距離を電圧で表すデバイスである.測定できる距離はデバイスによって異なる.
実験前準備等†
準備・確認†
- 全ての電源が入っていることを確認
- TeraTermでarmadillo300にログインできていることを確認
- 演習用のディレクトリを作成し,そのディレクトリに移動していることを確認
- 演習後は消すこと
- 演習用ディレクトリにて,プログラムファイルを作成し,コンパイル,実行を行うこと.
- コンパイル例:プログラムファイル:sample.c, 実行ファイル:sample
- 実行
- AGB65-ADCへシリアル信号で個別の命令を送ることで,その命令に合った形式で結果が返ってくる.つまり,まずarmadillo300上のプログラムがどのようなデータが欲しいかコマンド送信すると(データリクエスト),AGB65-ADCは要求されたデータを返信する(データリプライ).
- AGB65-RSCと基本的な使い方は同じであるが,返ってくる値を読み取る必要がある.
- 以下のように配列を定義して用いる.
- データリクエスト用データ.以下の配列をシリアル送信する.
- unsigned char command[4] = {255, 120, 1, 1};
シンクロバイト(255) | ADCにデータの通信開始を知らせるデータで,常に「255」である. |
ID(120) | ADCに設定された固有のID(AGB65シリーズを複数接続したときの判別用.ADCの場合,出荷時のIDは「120」.) |
送信バイト数(1) | 送信される命令の(バイト)数.シンクロバイト,ID,送信バイト数は数えない. |
命令1(1) | 全ポート(16ポート)読み取り(精度8bit) |
- データリプライ用データ.データリクエストした後,以下の配列をシリアル受信する.
data[0]:シンクロバイト(255) | ADCからデータの通信開始を知らせるデータで,常に「255」である. |
data[1]:ID(120) | リクエストされたADCのID(ID=120にリクエストした場合,120の値が入っている.) |
data[2]:データバイト数(17) | ADCからarmadillo300に向けて送信される命令のバイト数.シンクロバイト,IDは数えない. |
data[3]:命令1(1) | armadillo300からADCにリクエストされた命令を返信.command[4]の値. |
data[4]〜data[19]:[ポート1の結果]〜[ポート16の結果] | 各ポートにささっているセンサの取得結果 |
- 上記のデータを以下のように送受信すると配列dataの中にセンサの情報が格納されている.厳密には,data[0]〜[3]の値を使って正常にデータを受信できているか確認する必要がある(プログラムを参照)
- int main(){ ...
- ...
- write(fd, command, sizeof(command));
- read(fd, data, sizeof(data));
- ...
- }
- 電源投入後、約40mS後から信号線に距離に応じて出力される.
- この出力は28〜48mS毎にアップデートされる.
- 出力電圧と距離の関係は図1のようになる.
プログラミング演習†
- 下記のプログラムを作成,実行してサーボの制御について学ぶ.
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/シリアル通信によるデバイス制御/センサ情報取得プログラム作成/センサ値読取プログラム
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/シリアル通信によるデバイス制御/センサ情報取得プログラム作成/センサ値読取距離(cm)表記
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/浅草ギ研AGB65シリーズ/AGB65-ADC命令仕様