2019/08/03

[hw]I2Cとレベルコンバータ (1)

久々にハードウェアが絡んだ話だ。

 

夏休みが近いので、何か工作をしようと考えていた。
出てきたのは、ArduinoとFeliCa Link。
そういえば、この組み合わせはまだやったことがなかったな。


ネットで検索して出てきたのは4年以上前のライブラリだった。

https://os.mbed.com/users/hiro99ma/code/RCS730/

MbedのAPIを使っていたので、それをArduinoのAPIに置き換えればなんとかなるだろう。

 

それよりも問題は電圧だ。
FeliCa Linkは3.7Vまでなのだが、Arduinoは5Vだ。
そのままでは接続できない。

幸いなことに、スイッチサイエンスさんから購入したレベルコンバータが手元にあった。

https://www.switch-science.com/catalog/1466/

Arduinoからは3.3Vもとれるので、FeliCa Linkは3.3V、Arduinoは5Vで動かせば問題なかろう。


接続するだけなので、電圧を確認しつつもブレッドボードで配線した。
FeliCa Linkで一番簡単に確認できるのは、RFDETピン、つまり搬送波検出だ。
電源を入れて、スマホなりNFCのR/Wなりをかざすと立ち下がってくれる。
レベルコンバータを経由してRFDETをポーリングし、搬送波を検出したらArduinoのLEDを点灯させる、というところも動いた。

ならば、あとはI2Cのところだけだから簡単だろう。

 

 

・・・簡単じゃなかった。
そもそも、私はI2Cが苦手なのだ。
たった2本でデータをどちらからも読み書きできるし、なによりもオープンドレインだ。
オープンドレインだからどうのこうのというのはわからんのだが、私のイメージとしては「早い者勝ち」で、手を離すタイミングと相手がつかむタイミングがずれると泥沼にはまってしまうという恐怖感がある。

そして、プルアップ抵抗。
計算方法は分からんのだけど、ダメな値の抵抗値を使うとダメだ。
計算方法を理解すればいいのだろうが・・・そこは真面目にやる気が起きず、なんとなく5kΩ前後を選べばいいんじゃなかろうか、くらいの経験則でやっている。

 

自業自得とも言えるが、都合が悪いことは忘れよう。


どううまくいかないのか調べていったところ、スタートコンディションになってない、ということがわかった。
(一行で書いたけど、配線調べたり実装調べたり、そこに至るまでも大変だったのだ。)

ArduinoはI2Cのマスターだからスタートコンディションにすることくらいはできるだろうと考えていたのに、最初からうまくいっていないのだ。
以前、I2Cで失敗したときはプルアップ抵抗の大きさが問題だったので適当に変えてみたが、やはりダメ。

 

あれこれやって気付いたのだが、どうもレベルコンバータがあるとダメなようだ。
外すと(もちろんI2Cのデバイスも外れるが)、スタートコンディションなどはできていた。

 

そこでようやく、レベルコンバータというものの動作を理解できていなかったことに気付いた。
電圧のレベルをうまいこと変換してくれるもの、という程度の認識だったのだが、お互いが直結しているわけではないのだった。
お互いがHIGHになっていることが確認できないと、I2Cとしてはスタートコンディションしてよいかどうか判断できないので、Arduino側はArduino側でプルアップし、FeliCa Link側はFeliCa Link側でプルアップしないといかんのじゃなかろうか。

そして、ArduinoのI2Cライブラリ(Wire.h)を使った場合、内部でプルアップしているということだった。
ならば、FeliCa Link側だけプルアップしてやればよさそうだ。


ただ・・・まだi2cdetectができただけで、I2Cの通信はこれから出会った。。。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。