Rubyと一緒(7) GR-CITRUS、出力端子(OD)、読み取りも出来るよね、念のため

Joseph Halfmoon

特価品(見切り品?)のGR-CITRUSボード(RX631搭載)で組み込みRuby(mruby)してます。今回は「念のため」端子を出力設定(オープンドレイン)にしておいたときに、digitalReadが出来るよねという確認の回です。そんなもん出来るに決まっているじゃん、と思うのですが念のため。疑り深いな。

Rubyのコードを練習するのに、以下のルネサス様のページにはいつもお世話になっております。

GR-CITRUS 特設:クラス、メソッド早見表

上記をみれば、出力端子の設定 pinModeの3番はオープンドレイン出力になっています。ということは以下のような操作ができるってことだよね。

    1. 端子をオープンドレイン出力に設定する
    2. その端子にハイ(1)を出力する
    3. その端子は外部にプルアップ抵抗つけておく
    4. 外部からその端子をロウ(0)にドライブ
    5. digitalReadしたらロウが読める

ソースにしたらこんな感じ。

@pin=4
pinMode(@pin, 3)
digitalWrite(@pin, 1)
ival = digitalRead(@pin)

これにて上記端子は双方向の入出力端子となりました。大丈夫だろうな。

テスト回路

実際には現物スイッチは3接点なのでちょっと違うけれども、ショートでGND、オープンでNCということで。プルアップ抵抗は4.7kΩにしましたがRX631のデータシートちゃんと確認してません。まあそのくらいの値なら問題なく引けるよね。いい加減だな。OpenDrainTestCircuit

実験用のソース

mrubyソースといって超簡単っす。ハイを出した後はただdigitalReadを繰り返すだけ。

#!mruby
usb = Serial.new(0, 9600)
usb.println("digitalRead, OpenDrain output Pin.4")
@pin=4
pinMode(@pin, 3) #output, opendrain
loop_interval = 2000
usb.println("digitalRead from OpenDrain pin")
digitalWrite(@pin, 1)
while true do
    rval = digitalRead(@pin)
    usb.println("Value:    " + rval.to_s)
    delay(loop_interval)
end
実験結果

当然、問題なくdigitalRead出来ました。こんな感じ。BidirectionalEC2

これでソフトウエア制御の双方向入出力は出来るな。それで何を?

Rubyと一緒(6) GR-CITRUS、digitalRead、ポーリングするしかない? へ戻る

Rubyと一緒(8) GR-CITRUS、DHT11、ソフトで読み取り、湿度だけ? へ進む