LoginSignup
4

ElixirでDYP-A01超音波距離センサー

Last updated at Posted at 2021-09-04

English

はじめに

たまたま先日@piacerex さんが距離センサー探されていたのがきっかけで、ちらっと検索してしてみて面白そうだったので、興味本位に6メートル程まで計測できる超音波距離センサーを購入しました
せっかくなのであえて既存のElixirライブラリーの無いものを選んで自分でデバドラを書いてみることにしました

できたもの

ファームウェア

ファームウェアについてここでは特にお話しませんが、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ごとに計測データをコントローラ側に送ってくれるとのことです

20210831_173325
20210831_173120

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)

Raspberry Pi pinout

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 ZerottyAMA0Raspberry Pi 4ttyS0が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 さんのおかげで新しいことが学べました
距離センサーを使って何をされるのかが気になります
たのしみですね

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4