catch-img

CONEXIOBlackBearでDI/DO(デジタル入出力インターフェース)を操作してみる

こんにちは。コネクシオIoTブログ 技術記事担当のHです。

さて、今回はCONEXIOBlackBearのDI/DO(デジタル入出力インターフェース)の操作について取り上げます。

CONEXIOBlackBear は、無線通信としてLTE・Wi-Fi・Bluetooth・GNSS、有線通信としてEthernet・USB・CAN・Serial(RS-232,485)など多種多様なインターフェースを備えています。これらを活用することで、周辺機器やクラウドサーバとのデータ通信による幅広いIoTシステムのニーズに適用可能です。

しかし、一般的でない独自のインターフェースを持つ機器や、単純なスイッチやLEDだけ、あるいは何らかの2値の電圧信号を出力する回路を接続したいといったニーズもあるかと思います。そのような場合に便利なのがDI/DOインターフェースです。

実は、私は今までCONEXIOBlackBear向けのソフト開発で、一度もDI/DOを触っていませんでした。なので、私自身試しに使ってみた結果を今回記事にしようと思います。


1. DI/DOの特徴を調べる

CONEXIOBlackBearのDI/DOポートは、取扱説明書(V1.1.7)4.7節を見ると、入力、出力とも4系統が備えられています。

具体的には、取扱説明書に詳しく書かれていますが、それぞれが、ソフトウェアで使用可否を決められます。


さらに、無電圧接点、pullupという設定項目の記載があります。

無電圧接点は、CONEXIOBlackBearとは動作電圧の異なるハードウェアを接続する場合に使用を想定したものといえます。

DOで考えると、いわゆるオープンコレクタ接続です。CONEXIOBlackBearから電圧を供給せず、CONEXIOBlackBear側端子の電流吸い込み有無によって接続先が制御される接続方法です。

入力の場合では、端子に印加する電圧が、単純にCONEXIOBlackBearでLOW/HIGH判定されます。

pullupは、無電圧設定とは逆に接続機器側(=CONEXIOBlackBear)から接続先に電圧を供給する接続方法といえます。電圧を供給した状態において動作する回路の使用を想定します。

DO側は、出力値の設定により、CONEXIOBlackBearから電源電圧(=12V)または0Vが供給されました。

DI側は、設定により、約4.3V/約0Vが出力されていました。

ただし、DI/DOはあくまで信号伝達、通信のための端子であり、電源ではないので、回路構成上あまり大きな電流供給または電流吸い込みはできません。大きな電流を取り出そうとすると、供給電圧が下がって(上がって)しまいます。したがって、上記の電圧値と電流供給能力を考慮して接続先を選ぶ必要があります。

私が使ってみた結果、以下のようになりました。

※下記の電圧の値は、本記事における実験値であり、保証値ではありません。

1.1 入力

  • プルアップモード
    • DIとGND間に抵抗を接続、値を入れ替えて実験
    • 端子電圧が約0.7V未満のとき 1になる
    • 端子電圧が約0.7V以上のとき 0になる
  • 無電圧接点モード
    • DIに外部から電圧を印加
    • 端子電圧が約0.7V未満のとき 1になる
    • 端子電圧が約0.7V以上のとき 0になる


1.2 出力

  • プルアップモード
    • 1のとき LOW(0V)を出力(無負荷)
    • 0のとき HIGH(電源電圧)を出力(無負荷)
  • 無電圧接点モード
    • 1のとき 電流吸い込みあり
    • 0のとき 電流吸い込みなし




2.DIでスイッチ読み取り

DIの簡単な使用方法として、物理的なプッシュスイッチを接続してみます。

スイッチ単体は、自身で電源をもたないため、pullupによる接続が適しています。以下のような接続になります。


また、無電圧接点モードでもやってみましょう。接続先がCONEXIOBlackBearと独立にプルアップ電圧を供給している場合などに適します。以下は3.3Vの回路の例です。



コード(シェルスクリプトの例)は、以下のようになります。

#!/bin/bash

# ポート有効化
echo 9 > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio9/direction

# プルアップ設定 -----------------------------
echo 2 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio2/direction 
# 無電圧接点の場合
echo 0 > /sys/class/gpio/gpio2/value 
# pullupの場合
echo 1 > /sys/class/gpio/gpio2/value 

# 1秒ごとに読み取り
while true;
do
    cat /sys/class/gpio/gpio9/value
    sleep 1
done


3.DOでLED点灯

DOに、無電圧接点モードでLEDを接続してみます。接続先のほうでLEDへ電流を供給できる場合に適します。以下は3.3Vの電源を持つ回路を接続した例です。


一方、pullupモードでは、内部のプルアップ抵抗の大きさから、最大で1mA強程度しか取り出すことができない(私の実験値です)ので、LEDの直接駆動は明るさが許せば使えます。

#!/bin/bash

# ポート有効化
echo 167 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio167/direction

# 無電圧接点 --------------------------------------
echo 5 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio5/direction
echo 0 > /sys/class/gpio/gpio5/value

# 点滅
while true;
do
    echo 0 > /sys/class/gpio/gpio167/value
    sleep 0.5
    echo 1 > /sys/class/gpio/gpio167/value
    sleep 0.5
done


4.DI/DOのスイッチング速度

時間精度には目をつぶって、シェルスクリプトでずっとHIGH/LOWを繰り返したところ、最速で7msec程度の周期でスイッチングできました。(※あくまでシェルスクリプトによる呼び出しのみを試していますので他の方法での速度については試していません。)無電圧接点モードの出力で、3.3Vの電源とDO端子の間に負荷として2kΩの抵抗を接続しています。

実際には、接続する回路によって使用できる周波数範囲は大きく変わりますが、一般的でないインターフェースについても、DI/DOへの接続で通信に対応できるかもしれませんので検討していただくとよいと思います。



まとめ

CONEXIOBlackBearのDI/DO(デジタル入出力インターフェース)の操作について取り上げました。一般的でない規格を持つ機器や、単純なスイッチなども接続したいと思ったら、DI/DOの使用をご検討ください。

当ブログは担当書き手の個人的感想を述べるもので、コネクシオ株式会社を代表する意思表示をするものでは有りません。