0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MachiKaniaでHC-SR04を使って距離測定

Posted at

はじめに

MMBasicではHC-SR04がシステムでサポートされていて、DISTANCE()関数で距離を測定できます。MachiKani Type Pにはその機能はないのでMMBasicと同様の機能を実現できないかを試して実現できたのでその結果をまとめました。MMBasicと似た感じにするため、HC-SR04を利用するクラスファイブラリを作成しました。

検証環境

  • macOS : 15.6
  • Raspberry Pi Pico
  • MachiKania : Phyllosoma 1.5.2.0
  • 距離センサ : HC-SR04(旧バージョン)

配線

Raspberry Pi PicoとHC-SR04とは次の表と図に示すよう接続しました。

Pico HC-SR04
GP2 Trig
GP3 分圧抵抗経由でEcho
VBUS VCC
GND GND

実体配線図は次のとおりです。

HC-SR04-MachiKa_ブレッドボード.png

HC-SR04による距離測定

距離測定手順

秋月電子通商のWebサイトのHC-SR04のページにあるデータシート(中国語だったのでChatGPTで要約させた)などによると次の手順で距離を測定します。

  1. HC-SR04のTRIGピンにRaspberry Pi Picoから10マイクロ秒以内のハイレベルの信号を入力すると40kHzの信号が8周期分HC-SR04から送信されます
  2. 40kHz超音波の送信が完了するとECHOピンからハイレベルの信号が出力され、反射波の受信が終わるまで継続されます
  3. ECHOピンがハイレベルの信号を出力している時間$T$はHC-SR04から送信された超音波が物体で反射して戻るまでの往復の時間に相当するので、その時間に音速$C$を掛け、1/2にすれば物体までの距離$D$が得られます

通信インターフェイス

現行のHC-SR04はデータシートによるとGPIO、UART、IIC(I2C)の3つの通信インターフェイスが使用できます。手持ちのHC-SR04が旧版なのでデフォルトのGPIOを使います。

プログラム

今回のプログラムはMachiKaniaのククラスライブラリ機能を使ってHC-SR04の機能をクラス化し、メインプログラムでクラスの距離測定メソッドを使って距離を測定するようにしました。

クラスファイル

MachiKaniaのドキュメントに従ってクラスファイルを作成しました。

クラスには次の表に示す非公開(PRIVATE)のフィールド変数を定義しました。

フィールド 役割
TRIG TrigピンのGPIO番号
ECHO EchoピンのGPIO番号
SIGOFF 40kHzの超音波の放射が完了した時点のタイマカウント
SIGOF 40kHzの超音波の反射波の受信終了時点のタイマカウント
RT# 超音波のHC-SR04から物体までの往復時間
DIST# HC-SR04から物体までの距離

非公開のスタティック変数にタイマのカウント間隔を保持するINTUを定義しました。

HCSR04.BAS
FIELD PRIVATE TRIG, ECHO, SIGOFF, SIGON, RT#, DIST#
STATIC PRIVATE INTU

距離測定メソッドDISTANCE

距離測定を開始し、距離をセンチメートル単位で返すメソッドDISTANCEを測定手順にあわせて以下のように定義しました。

  • メソッドのパラメータからTrigピンとEchoピンに接続するGPIOピンを設定します
  • 時間測定にタイマーを使用し、そのカウント間隔を5マイクロ秒に設定します
  • Triggerに指定したピンから10マイクロ秒だけ信号を送信します
  • ECHOに指定したピンの出力がロー(IN(ECHO) = 0)の間のタイマカウントをフィールドSIGOFFに保存します。最終的なSIFOFFの値はECHOがハイになる直前の値、超音波送信完了のタイマカウントになります
  • ECHOピンの出力がハイ(IN(ECHO) = 1)の間のタイマカウントをフィールドSIGONに保存します。最終的なSIGONの値はECHOがローになる直前の値、反射波受信完了のタイマカウントになります
  • ECHO超音波を送信し終えてから受信し終えるまでのタイマカウントの差を求め、タイマのカウント間隔時間INTU(マイクロ秒)を掛けて超音波の往復時間$T$を求めます
  • 超音波の往復時間$T$に音速$C$を掛け、$T$が往復時間なので$1/2$して物体までの距離を求めます(センチメートルにするため100倍しています)

音速を$340m/sec$と決め打ちしているので実行時の気温を考慮していないため、結果には誤差が含まれています。

以下にメソッドDISTANCEのプログラムを示します。

HCSR04.BAS
METHOD DISTANCE
REM Send signal for 10us
  OUT TRIG, 1
  DELAYUS 10
  OUT TRIG, 0

  REM timer count at the end of no signal period
  WHILE IN(ECHO) = 0
    SIGOFF = TIMER()
  WEND

  REM timer count at the end of signaled period
  WHILE IN(ECHO) = 1
    SIGON = TIMER()
  WEND

  REM Calcurate refrection time
  RT# = (FLOAT#(SIGON) - FLOAT#(SIGOFF)) * (1E-6 * FLOAT#(INTU))
  REM Calcurate distance
  DIST# = RT# * 17000
  REM Calcurate distance
  DIST# = RT# * 340 * 100 / 2
RETURN DIST#

メインプログラム

  • メインプログラムではクラスファイルHCSR04の使用を宣言します(USECLASS HCSR04
  • 1秒間隔でクラスHCSR04DISTANCEメソッドを使って距離を取得し、表示します
    • DISTANCEメソッドの引数にHC-SR04のTrig、Echoに接続するRaspberry Pi PicoのGPIOピン番号を指定します

以下に、メインプログラムを示します。

MACHIKAP.BAS
USECLASS HCSR04

PRINT "START!"

DO
  D# = HCSR04::DISTANCE#(2, 3)
  PRINT SPRINTF$("%6.2fcm", D#)
  WAIT 60
LOOP

END

実行

MachiKaniaに対応したLCDを持っていないので作成したプログラムをファームウェアに組み込む形で実行します。

UF2ファイルの作成

クラスファイルHCSR04.BASとメインプログラムMACHIKAP.BASmachikania-p/pico_ili9341/embedに配置し、phpスクリプトでRaspberry Pi Picoに書き込むファームウェアファイルresult.uf2を生成します。

生成されたresult.uf2ファイルをBOOTSELボタンを押してUSBケーブルを接続して表示されるドライブにドラッグ&ドロップして書き込みます。

$ php convert.php
Investigating uf2 file...
MACHIKAP.BAS found: maximum length: 65536 bytes
CLASS001.BAS found: maximum length: 65536 bytes
CLASS002.BAS found: maximum length: 16384 bytes
CLASS003.BAS found: maximum length: 16384 bytes
CLASS004.BAS found: maximum length: 16384 bytes
CLASS005.BAS found: maximum length: 4096 bytes
CLASS006.BAS found: maximum length: 4096 bytes
CLASS007.BAS found: maximum length: 4096 bytes
CLASS008.BAS found: maximum length: 4096 bytes
CLASS009.BAS found: maximum length: 1024 bytes
CLASS00A.BAS found: maximum length: 1024 bytes
CLASS00B.BAS found: maximum length: 1024 bytes
CLASS00C.BAS found: maximum length: 1024 bytes
CLASS00D.BAS found: maximum length: 1024 bytes
CLASS00E.BAS found: maximum length: 1024 bytes
CLASS00F.BAS found: maximum length: 1024 bytes

Investigating BASIC files in current directory...
MACHIKAP.INI found: 4288 bytes (fits to 65536 bytes area; CLASS001)
HCSR04.BAS   found: 701 bytes (fits to 16384 bytes area; CLASS002)
MACHIKAP.BAS found: 342 bytes (fits to 65536 bytes area; MACHIKAP)

done! result.uf2 was created.%

実行結果

ファームウェアの書き込みが完了するとMACHIKAP.BASがコンパイル、実行されます。実行例はUSBシリアル通信でターミナル上に表示されます。
以下に実行結果を示します。うまく動作しているようです。

MachiKania BASIC System
 Ver Phyllosoma 1.5.2.0
BASIC Compiler KM-1509 by Katsumi
LCD, File, & Keyboard systems by KENKEN

Compiling MACHIKAP.BAS
10739 micro seconds spent for compiling

START!
118.40cm
117.30cm
118.83cm
352.58cm
 24.90cm
 17.42cm
 18.87cm
 13.68cm
  9.26cm
  5.69cm
  5.44cm
 14.02cm
 17.42cm
 <以下略>

さいごに

周囲温度を考慮していないため正確さには掛けますがMachiKaniaでHC-SR04による距離測定ができるようになりました。また、クラスファイルの利用もできるようになりました。
そろそろMachiKaniaで使用できるLCDを入手しようかなと思っていたら次期バージョンでWaveshare Pico-ResTouch-LCD-3.5がサポートされるようなのでそちらを購入するのが良いのかななどと思っていたりします。

参考サイトなど

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?