![](https://jhalfmoon.com/dbc/wp-content/uploads/2018/11/JH-2-150x150.png)
特価品(見切り品?)のGR-CITRUSボード(RX631搭載)で組み込みRuby(mruby)してます。今回は「念のため」端子を出力設定(オープンドレイン)にしておいたときに、digitalReadが出来るよねという確認の回です。そんなもん出来るに決まっているじゃん、と思うのですが念のため。疑り深いな。
※Rubyと一緒 投稿順indexはこちら
Rubyのコードを練習するのに、以下のルネサス様のページにはいつもお世話になっております。
上記をみれば、出力端子の設定 pinModeの3番はオープンドレイン出力になっています。ということは以下のような操作ができるってことだよね。
-
- 端子をオープンドレイン出力に設定する
- その端子にハイ(1)を出力する
- その端子は外部にプルアップ抵抗つけておく
- 外部からその端子をロウ(0)にドライブ
- digitalReadしたらロウが読める
ソースにしたらこんな感じ。
@pin=4 pinMode(@pin, 3) digitalWrite(@pin, 1) ival = digitalRead(@pin)
これにて上記端子は双方向の入出力端子となりました。大丈夫だろうな。
テスト回路
実際には現物スイッチは3接点なのでちょっと違うけれども、ショートでGND、オープンでNCということで。プルアップ抵抗は4.7kΩにしましたがRX631のデータシートちゃんと確認してません。まあそのくらいの値なら問題なく引けるよね。いい加減だな。
実験用のソース
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出来ました。こんな感じ。
これでソフトウエア制御の双方向入出力は出来るな。それで何を?