CircuitPython 10行プログラミング (6) UART

 Tinket 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をすっきり整理して実行します。