CircuitPython 10行プログラミング (6) UART
Trinket M0マイコン・ボードとCircuitPythonを使って、調歩同期式シリアル通信UARTにつながるセンサを利用します。基板の裏にはTx/Rxのシルク印刷があります。
距離センサTFMiniは、赤外線を発して対象物にぶつかって戻ってくる時間を測定することで、距離を測ります。外形は43×15×16mmと小型、測定範囲は30cmから12mと広めで解像度は5mmです。
Sparkfunから購入しましたが、スイッチサイエンスでも扱っています。利用方法は、こちらのページを参照しました。
●TFMiniのおもなスペック
- 動作電圧;4.5~6V
- 消費電力;120mW以下
- UARTの信号レベル;3.3V
- 通信速度;115200ボー、8ビット・データ、パリティなし、1ストップ・ビット
- 解像度;5mm
- 確度;6m以下では1%、6~12mでは2%
●接続
本体には、4ピンのコネクタで接続するケーブルが付属しています。電源電圧は5Vですが、Tx/Rxの信号レベルは3.3Vです。
1ピン(緑) | 2ピン(白) | 3ピン(赤) | 4ピン(黒) | |
---|---|---|---|---|
TFMini | Tx | Rx | +5V | GND |
Tinket M0 | Rx | Tx | USB | GND |
●データ・フォーマット
センサ・モジュールの出力は9バイトで構成されており、1、2バイトは目印で、9バイト目はチェック・サムです。それぞれ16進のデータです。
byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 | byte9 |
---|---|---|---|---|---|---|---|---|
0x59 | 0x59 | 距離データ下位バイト | 距離データ上位バイト | 信号強度下位バイト | 信号強度上位バイト | 予約 | 元の信号品質の程度 | チェックサム |
●UARTのライブラリ
I2C、SPIと同じbusioを使います。
busio.UART(tx, rx, *, baudrate=9600, bits=8, parity=None, stop=1, timeout=1000, receiver_buffer_size=64)
from board import *
from busio import UART
from time import sleep
uart = UART(TX, RX, baudrate=115200)
while True:
data = uart.read(9) # read up to 9 bytes
print(hex(data[4]), hex(data[3]), data[4] << 8 | data[3],"cm")
sleep(2.0)
実際に受信をすると、このライブラリでは、最初に意味不明な1バイトを読み込んできます。したがって、5バイト目の上位バイトと4バイト目の下位バイトを読み、距離データとします。読んできたデータはそのままcmの単位のデータになっています。
●Adafruitのライブラリ
CircuitPythonのライブラリは、いままでと同じく、最新版のライブラリをダウンロードします。adafruit-circuitpython-bundle-3.x-mpy-20190202.zipを解凍して、adafruit_tfmini.mpyとadafruit_bus_deviceフォルダを、CIRCUIYPYドライブの中にlibの名前のフォルダを作って入れます。
I2C、SPIと利用してきたライブラリがそのまま入った状態です。CIRCUIYPYドライブの空き容量は33Kバイトです。
サンプルのtfmini_simpletest.pyをすっきり整理して実行します。