10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

#NervesJPAdvent Calendar 2021

Day 10

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

10
3
0

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
  3. You can use dark theme
What you can do with signing up
10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?