概要
前回はunion実装してみました。これでライブラリ側は最低限の準備ができたので、ちょっと回路を触って実験をしてみたいと思います。I2C関係ないのですが、、、
2電源とは?
IO | 電源 | 用途 |
IO0 | VDD | 入出力 |
IO1 | VDD | 入出力 |
IO2 | VDD | 入出力 |
IO3 | VDD | 入出力 |
IO4 | VDD | 入出力 |
IO5 | VDD | 入出力 |
IO6 | VDD | 出力 |
IO7 | VDD2 | 出力 |
IO8 | VDD2 | 入出力 |
IO9 | VDD2 | 入出力 |
IO10 | VDD2 | 入出力 |
IO11 | VDD2 | 入出力 |
IO12 | VDD2 | 入出力 |
IO13 | VDD2 | 入出力 |
IO14 | VDD2 | 入出力 |
SLG46826はIOが0から14までの15ピンあります。0から6までの7ピンがVDDに接続。7から14までの8ピンがVDD2に接続されています。
Wide Range Power Supply
SLG46826データシート
■2.5 V (±8 %) to 5 V (±10 %) VDD
■1.8 V (±5 %) to 5 V (±10 %) VDD2 (VDD2 ≤ VDD)
VDDは2.5Vから5Vまで、VDD2には1.8Vから5Vまでを接続できます。そしてVDD2の方が低い電圧である必要があります。通常は両方5Vとか3.3Vとかで問題ありません。
さて、M5StickCなどでGrove端子を使う場合には電源が5Vです。ただし、実際の信号は3.3Vとなります。これは歴史的経緯だと思うのですがM5Stack社のGrove端子には5Vが出ています。昔はArduino UNO用が多かったので、5Vで動くモジュールが多かったんですよね。
最近は逆に3.3Vや1.8Vなどの低電圧で動くモジュールが増えています。Grove接続の場合5Vなので直接接続することができません。そこでレベルコンバータなどを使って、信号の電圧レベルを変換する必要があります。
2電源に対応しているGreenPAKではロジックレベルでレベルコンバータが可能とのことですので、確認してみたいと思います。
基本は直結で一方向

上記がサンプル回路です。IO2はVDD(5V)でIO9はVDD2(3.3V)に接続してあります。

上の回路をみてみると、IO2の外部端子からINPUTして、OUT端子からIO9のIN端子に接続され、IO9の外部端子に出力されています。
下の回路は同じようにIO10からIO4への出力ですね。ピンの色が違うのがわかると思いますが、青色がVDDで、オレンジ色がVDD2になります。2電源の場合にはどの色かで電圧を確認してから利用するようにしてください。
また結線についてですが、緑線が内部配線です。右上に青線は回路の外部で結線されていることを表します。シミュレータでは影響されるかもしれませんが、GreenPAK内部ではなにも配線されていませんので、出力した回路データにも含まれません。基本青線の配線は実機で実験する場合には利用しないほうがよいと思います。

このへんの配線もシミュレータ用なので青線ですね。
双方向にしたい(アクティブHIGH)
UARTとかSPIとかは通信方向があるので、基本は一方向でいいですよね。ただ双方向にもしたいですよね?

こんな回路を作ってみました。ちょっと線がわかりにくいですよね。

ちょっと色をつけてみました。IO5ピンにHIGH入力があった場合には緑線でIO8の出力を有効にして、出力もHIGHにします。

あれ、出力はHIGHにしかならないのでPORをつけておいたほうがスッキリ見えるかな(動作未検証)。肝はIOの下にある端子です。この端子は出力を有効にするかの端子になります。ピンを入出力モードにした場合には、この下の端子をHIGHにすると出力、LOWだと入力です。
この回路は基本はLOWで入力ですが、ピンにHIGH入力があった場合に、相手側の出力を有効化してHIGHを伝達しています。
さて、2-L0というバッファが回路にあると思います。これも肝なのですが、この回路は両端のピンが両方出力状態になるとその状態で状態がロックされて、変化しなくなります。このバッファがないとHIGHに変化した瞬間に両方が出力モードになってHIGHで固定されます。
このバッファは実際のところ、どう動いているのかよくわからいません。信号が遅れるはずですので、タイミングがずれてうまく動いているみたいです。最初両端につけていましたが、片方だけでも動きました。なぜ?
双方向(アクティブLOW)
前回のはアクティブHIGHですので、基本はLOWで信号がくるとHIGHを出力する回路でした。今回はI2Cなどで使われている通常がHIGHで、信号がくるとLOWになるアクティブLOWを実現したいと思います。
回路を作れず!
反転すればいいと思っていましたが、両端のピンが同時に出力になってしまい回路がロックしてしまいます。LUTで排他制御をつけてみましたが動きませんでした。。。
GreenPAKは実際のロジック回路とは違い、計算したその瞬間のみの状態で計算をします。排他処理的なロジックを組んでも、その瞬間に成立していたら、排他処理がおかしい矛盾した状態が発生します。通常はさらにロジックが動くので、排他処理が働いて正常な状態に戻ると思います。GreenPAKだとおそらく信号に変化がある時だけロジック計算が動くで、一度変な状態になっても再計算されずに排他処理が動きません。
こちらは、もうちょっと研究したいと思います。
まとめ
ちょっと謎な動作をしていますが、実際に触ってみるといろいろわかってくることがありますね。
アクティブLOWはいろいろ実験が面倒でした。学習基板はLEDがあるので基本はプルダウンされている回路です。学習基板のみではプルアップできないので、10kΩの抵抗をつかって外部からプルアップを作りました。この抵抗がショートしそうでちょっと怖いです(笑)
ジャンパピン型で抵抗付きのプルアップできるものを作ろうかな。。。
コメント