US-100超音波センサーをRaspberry Pi 3Bで使ってみる

#はじめに
超音波センサーといえば、HC-SR04が有名で、そっちのセンサーはいろいろと情報が日本語でもあるのですが、US-100はほとんど情報がなかったので、使ってみた感じを残そうと思います。

#US-100とは
US-100は見た目上はHC-SR04とほぼ同じですが、違う点が2つあります。[2]

・入力電圧が2.4V～5.5Vまで対応している
・「HC-SR04」モードと「シリアルUART」モードの2つがある

1点目に関しては、HC-SR04は5Vが基本的な入力電圧なので、RaspberryPiで扱おうと思うと、GPIOの電圧が3.3Vなので、減圧が必要になってくるのです。それが、US-100だと不要になります。
2点目に関しては、「HC-SR04」モードはHC-SR04と同じ方法で測定をするモードで、「シリアルUART」モードはUARTという通信を用いて、距離と温度をはかれるモードです。超音波センサーで距離を測るとき、音波の進むスピードは温度によって変わるため、温度を測ることによって距離をより正確に測ることができます。
今回はUARTモードにて測定しました。HC-SR04モードも試そうと思ったのですが、プログラムが作れなかったので、試していません。(配布されているPythonライブラリにHC-SR04モードの関数がない?)

#配線図
配線図は次の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718856/8f59e35a-8f00-d6a2-f2c9-ac9b9e5c8449.png)
赤線がVCC(3.3V)、黒線がGNDです。Raphberry Pi3B、US-100のTx、Rx同士を接続しています。__本来、UART接続はTxに対してRx、Rxに対してTxを接続するのですが、このセンサーは例外となっています。__[1]
実際に配線したものが次の画像になります。どこがどう繋がってるかわかりにくいですが。すみませぬ。(別のセンサーも同時につなげていますが、お気になさらず。ちなみに、こちらのセンサーも使ってみた感じを後日書く予定です。[追記：[書きました。](https://qiita.com/BlueWindows/items/d98b323f789bdc62fc3b)])
![IMG_5678.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718856/939c59e0-bdaa-8070-999c-2babab817200.jpeg)




#プログラム
プログラムはPythonで記述しました。

```Sample_US100_UART.py
import time
import serial
import adafruit_us100

uart = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1)
us100 = adafruit_us100.US100(uart)

try:
    while True:
        input("Press Enter to measure...")
        print("-----")
        print("Temperature: ", us100.temperature)
        time.sleep(0.5)
        print("Distance: ", us100.distance)
        print("-----")
        time.sleep(0.5)
except KeyboardInterrupt:
    pass
```
基本的には参考サイト[1]に載っているサンプルをそのまま書いています。
uart = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1) でUARTのセットアップを、
us100 = adafruit_us100.US100(uart) でUS100のセットアップをしています。
try - except KeyboardInterruptはキーボード割り込み(Ctrl+C)をするまではtryの中をループするという文です。このtry文の中はサンプルから少し変更しています。Enterキーを押した後に測定をするようにしています。測定はus100.temperatureで温度を、us100.distanceで距離を測定しています。

#実行
このプログラムを動かしてみるとこんな感じになりました。
![測定結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718856/f5a66f44-bc05-2e6b-949a-b5efa8bf8689.png)
最初の測定結果は、動かし始めてすぐに測定したので、正常な結果が出なかったと思われます。それ以下の結果はそれっぽい値が出ています。巻き尺を用いて精度も確認してみました。それが以下の表になります。なお、5回測ったその平均を書いています。

|距離(cm)|10|20|30|40|50|60|70|80|90|100|
|---|---|---|---|---|---|---|---|---|---|---|
|測定結果(cm)|10.0|19.8|29.2|39.3|49.6|60.8|71.8|80.1|91.8|99.5|

|距離(cm)|110|120|130|140|150|160|170|180|190|200|
|---|---|---|---|---|---|---|---|---|---|---|
|測定結果(cm)|111.5|121.6|131.4|141.0|152.4|159.1|169.5|182.0|192.0|199.8|

これらを見るに、おおむね正確かな？と思います。ただ、170㎝以降を測定していた時、ときたま163㎝付近の値を出す時がありました。その付近を見てみると、物が置いてあったので、それに超音波が反射していたと思われます（ちなみに巻き尺から物までの距離は約29㎝でした）。障害物にはあまり強くないかも？

#感想
実はこれが初めての電子工作だったりするのですが、うまく測定できてよかったと思います。超音波センサーで距離を測ったわけですが、正直2センチ、3センチぐらいは誤差が出るかな？と思っていた部分もあったので、意外と精度がいいものなんだなと思いました(まあ2センチ以上誤差が出ているときもありますが)。また、US-100は幅広い電圧で動作するので、電圧についてあまり考えなくてもよい点もいいと思います。(厳密にはちゃんと考慮したほうがいいのかもしれませんが…)。ここまでご覧くださりありがとうございました。

#参考サイト
[1]Python & CircuitPython | Ultrasonic Sonar Distance Sensors | Adafruit
https://learn.adafruit.com/ultrasonic-sonar-distance-sensors/python-circuitpython

[2]US-100搭載　超音波距離センサ 3V/5V
https://www.switch-science.com/catalog/5512/