はじめに
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による距離測定
距離測定手順
秋月電子通商のWebサイトのHC-SR04のページにあるデータシート(中国語だったのでChatGPTで要約させた)などによると次の手順で距離を測定します。
- HC-SR04のTRIGピンにRaspberry Pi Picoから10マイクロ秒以内のハイレベルの信号を入力すると40kHzの信号が8周期分HC-SR04から送信されます
- 40kHz超音波の送信が完了するとECHOピンからハイレベルの信号が出力され、反射波の受信が終わるまで継続されます
- 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
を定義しました。
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
のプログラムを示します。
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秒間隔でクラス
HCSR04
のDISTANCE
メソッドを使って距離を取得し、表示します- DISTANCEメソッドの引数にHC-SR04のTrig、Echoに接続するRaspberry Pi PicoのGPIOピン番号を指定します
以下に、メインプログラムを示します。
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.BAS
をmachikania-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がサポートされるようなのでそちらを購入するのが良いのかななどと思っていたりします。
参考サイトなど
- 入門MachiKania
- HC-SR04はデータシート