はじめに
たまたま先日@piacerex さんが距離センサー探されていたのがきっかけで、ちらっと検索してしてみて面白そうだったので、興味本位に6メートル程まで計測できる超音波距離センサーを購入しました
せっかくなのであえて既存のElixirライブラリーの無いものを選んで自分でデバドラを書いてみることにしました
できたもの
- ElixirでDYP-A01超音波距離センサーをいごかすコードをHexパッケージdypa01としてリリースしました
-
Raspberry Pi ZeroとRaspberry Pi 4にDYP-A01超音波距離センサーを接続し距離測定に成功しました
- Raspberry Pi Zero
- UART Rxピン (GPIO 15)
- Raspberry Pi 4
- UART Rxピン (GPIO 15)
- USBポート
- Raspberry Pi Zero
ファームウェア
ファームウェアについてここでは特にお話しませんが、ElixirプログラミングでRaspberry Pi等で使える組み込みLinuxファームウエアが作れるNervesというプラットフォームを利用しました
もしまだNervesを使ったことが無い方は、いろんな資料がありますのでぜひNervesをお試しください
ドキュメント
サンプルファームウエア
Nerves作者Frank Hunlethさん解説YouTube
使用した部品
DYP-A01 超音波距離センサー | |
USB〜TTL 変換シリアルケーブル | |
ジャンパーワイヤー | |
Raspberry Pi 4 | |
Raspberry Pi Zero W (ヘッダー付) |
配線
USBを使う場合と、GPIOピンを使う場合との2通りが可能なようです
USB を使う場合
カタログの説明を見た印象では簡単に USB に接続できそうに見えましたが、実際に品物が届いたときに少し戸惑いました
距離センサーのコネクターと USB〜TTL 変換シリアルケーブルの先端部とが全く異なる形状をしてるのです
結局、ジャンパーワイヤーでハックできることを知り、一旦わかれば即解決しました
4本のうち1本は使いません
データシートによると「UART auto output」という機能だそうで、センサー側が自動で定期的に 250msごとに計測データをコントローラ側に送ってくれるとのことです
DYP-A01 | USB to TTL Serial Cable |
---|---|
赤 (3.3-5V) | 赤 (5V) |
黒 (Ground) | 黒 (Ground) |
橙 (RX / Receive) | - |
白 (TX / Transmit) | 白 (RX / Receive) |
GPIO を使う場合
GPIOを使い場合も同様に全部で4本あるうちの3本を配線します
DYP-A01 | Raspberry Pi |
---|---|
赤 (3.3-5V) | 5V |
黒 (Ground) | Ground |
橙 (RX / Receive) | - |
白 (TX / Transmit) | GPIO 15 (RX / Receive) |
DYP-A01をいごかすためのElixirコード
DYP-A01をいごかすためのコードはHexパッケージdypa01としてリリースしましたので、ファームウエアのmix.exs
ファイルに依存関係に追加してインストールできます
def deps do
[
{:dypa01, "~> 0.1"}
]
end
シリアルポート名を探す
Raspberry PiとDYP-A01センサーとで通信するためには先ずRaspberry Piのどのシリアルポートを使用しているのか、シリアルポート名で把握する必要があります
dypa01ライブラリーはシリアル通信にcircuits_uartライブラリーをしようしています
シリアルポート名を探すにはCircuits.UART.enumerate/0
関数が便利です
iex> Circuits.UART.enumerate
%{
"ttyAMA0" => %{},
"ttyS0" => %{},
"ttyUSB0" => %{
description: "CP2102 USB to UART Bridge Controller",
manufacturer: "Silicon Labs",
product_id: 60000,
serial_number: "0001",
vendor_id: 4292
}
}
複数リストに上がる場合がありますが、デフォルトで使用されるポートは設定ファイル /boot/config.txt
に記述されているようです
iex> cmd "cat /boot/config.txt | grep tty"
# Enable the UART (/dev/ttyS0)
0
Raspberry Pi Zero はttyAMA0
、Raspberry Pi 4はttyS0
がGPIO 14~15ピンに割り当てられているようです
Raspberry Pi GPIOを使用したシリアル通信 by Indgeniousによると機種によって設定がことなるようです
Raspberry Pi 4 でUSBを使う場合は、ttyUSB0
で通信ができるようです
距離測定
あとは以下のような簡単なElixirコードで距離測定ができます
iex> {:ok, pid} = DYPA01.start_link(port_name: "ttyAMA0")
{:ok, #PID<0.1407.0>}
iex> DYPA01.measure(pid)
{:ok, %DYPA01.Measurement{distance_mm: 1680, timestamp_ms: 321793}}
さいごに
@piacerex さんのおかげで新しいことが学べました
距離センサーを使って何をされるのかが気になります
たのしみですね