July 19, 2006

マイコンと超音波センサの接続

室内で飛行する模型飛行機の自動制御ですが、超音波センサを利用して壁までの距離、あるいは床までの距離を検出することを考えています。超音波センサは加速度計やジャイロのように単体で使うことができるわけではなく、超音波の送受信回路が付加回路として必要になるため、付加回路を制御するためのPICを含めたモジュール構成になっています。詳細は機体搭載基板をどうぞ。
従って、その超音波センサモジュールとメインのマイコンをなんらかの方法で接続する必要があるのですが、今回はどのように通信すればデータをやりとりできるか考えてみた話です。

世の中にはこういった通信規格が山のようにあり、電子工作的メジャーなものだとシリアルEEPROMやA/D変換機に搭載されているI2Cがあります。しかし今回は超音波センサモジュールから受信するだけなので、お手軽プロトコルを自作してみました。回路と通信方式は図のとおりです。

us_protocol.png

要点は中央のマイコンがモジュール側にデータを送るタイミングを一方的に指示していることです。このため、超音波センサの計測時間によるタイムラグを無視していることになるので、なんらかの対策を講じる必要があります。つまり、マイコン側からデータ要求を受けた時点で計測していたのでは、間に合わないことになります。
そこで、超音波センサモジュール側は一定間隔で計測しており、最新の値を常に更新しているものとして、マイコンから要求があったときにその最新の値を返すようにすることにしました。これならデータを送信するだけですので、十分余裕をもって対応できると思います。

概念的なコードを書いてみました。続きをどうぞ。

マイコン(受信)側

unsigned char external_read(unsigned char ch){
    unsigned char mask = 0x80; // MSB first!!
    unsigned char result = 0x00;
    select_low(ch);
    do{
        clk_low();
        wait();
        clk_high();
        if(is_data_high()){result |= mask;}
    }while(mask >>= 1);
    select_high(ch);
    return result;
}

超音波センサモジュール(送信)側

// This function is invoked by select_low interrupt!!
void external_write(unsigned char data){
    unsigned char mask = 0x80; // MSB first!!
    do{
        (data & mask) ? data_high() : data_low();
        while(is_clk_low());
    }while(mask >>= 1);
}

16:44 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/501
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。