GreenPAK(SLG46826)をI2C経由で触ってみる その1 入力

概要

上記で公式DIPを購入して触ってみました。

上記シリーズでツールの使い方を勉強してみました。まだ細かい回路は作れないのですが、当初目的としていたI2C経由でGreenPAKを触ってみたいと思います。

環境

上記で自作した学習用基板をつかっていきたいと思います。基本的には特殊な回路はついておらず、素のDIPとそれほど変わらない基板となっています。そのため公式のDIPでも同じことができると思います。

接続

私はGrove接続が好きなので、上記のように接続して完了です。DIPでもI2Cを結線すればすぐに利用可能です。

M5StickCGreenPAK
GPIO32(SDA)SDA
GPIO33(SCL)SCL
GNDGND
5VVDD, VDD2

自分でDIPに接続する場合には上記の結線になります。気をつけないといけないのはSLG46826は2電源対応のGreenPAKですのでVDDとVDD2の2つ電源を接続する必要があります。VDD2は3.3Vなど別の電圧を入れることも可能ですので、今後検証する予定です。

実際の接続はI2Cですので、SDAとSCLを接続します。これも注意が必要でSLG46826はパッケージが2種類あり、公式DIP化で利用されている外に足がみえない小さいSTQFN-20と、普通のICっぽい見た目のTSSOP-20があります。パッケージによってPINの配列が異なりますので注意して接続してください。

自作基板であればGroveケーブルのみですので、このへんは接続が楽になっています。

I2Cスキャナ

===================
I2C Scan

SDA:21 SCL:22
34 51 68 

SDA:32 SCL:33
08 09 0A 0B 

SDA: 0 SCL:26

I2CなのでまずはI2Cスキャンをしてアドレスを確認してみます。最初はなにも書き込んでいないSLG46826を接続してみますと、上記の結果でした。

上記のスキャナを利用しました。今回はM5StickCのGrove端子に接続しているのでSDA:32 SCL:33の欄を確認します。

SDA:32 SCL:33
08 09 0A 0B

0x08から0x0Bまでの4アドレスみえますね。SLG46826はI2Cアドレスを変更可能ですが、デフォルト値だとこの値のようでした。

IOの状態取得

データシートを確認します。

上記のあたりで入力値が取れそうですね。

取得してみる

#include <M5StickC.h>

void setup() {
  M5.begin();
  Wire.begin(32, 33);
  Wire.setClock(100000);
}

void loop() {
  Wire.beginTransmission(0x08);
  Wire.write(0x74);
  Wire.endTransmission();
  Wire.requestFrom(0x08, 1);
  uint8_t val = Wire.read();
  for (int i = 0; i < 8 ; i++) {
    Serial.printf("%d", val & (1 << i) ? 1 : 0);
  }

  Wire.beginTransmission(0x08);
  Wire.write(0x75);
  Wire.endTransmission();
  Wire.requestFrom(0x08, 1);
  val = Wire.read();
  for (int i = 0; i < 8 ; i++) {
    Serial.printf("%d", val & (1 << i) ? 1 : 0);
  }

  Serial.println();
  delay(1000);
}

今回はM5StickCで、0x08のSLG46826に対して0x74と0x75のデータを取得しています。

自作ボードで一番上のGPIO0と、一番下のGPIO14をVDDに接続しました。左のLEDが光っているIOがHIGHになっています。

0100000000000100

上記の結果になりました。

0100000000000100
 ||||||||||||+---GPIO14
 |||||||||||+----GPIO13
 ||||||||||+-----GPIO12
 |||||||||+------GPIO11
 ||||||||+-------GPIO10
 |||||||+--------GPIO 9
 ||||||+---------GPIO 8
 |||||+----------GPIO 5
 ||||+-----------GPIO 4
 |||+------------GPIO 3
 ||+-------------GPIO 2
 |+--------------GPIO 1
 +---------------GPIO 0

データシートと突き合わせると上記の結果になります。GPIO0とGPIO14がHIGHになっていますね。他のIOも値を変更して、正しい反映になっているかを確認しました。

注意するのがGPIO6とGPIO7は出力専用のため入力が取れません。そのためデータの並びが飛んでいます。

また、私の基板はGPIOの信号レベルを確認するためにLEDが接続されています。そのため実質的にプルダウンされている状態になっています。もう一つのブレイクアウト基板や一般のDIPを接続した場合にはGPIOがフローティングのどこにも接続されていない状態になっています。そのため入力値を取得しても値が安定しません。

値を取得する場合にはフローティング状態ではなく何かに接続するか、SLG46826でプルダウンかプルアップ状態にしておくと安定して取得できるはずです。

参考資料

まずは日本でのGreenPAKの伝道師であるあおいさやさんの資料をみるのが良いと思います。この中でESP32を使ってI2C経由で回路を書き込む方法なども紹介されています。

まとめ

今回は何も書き込んでいないSLG46826を利用して、I2C経由でGPIOの値を取得しました。本来はI2C経由で回路を書き込んで使うと思いますが、最低限の動作確認はできました。

書き込み方法はGreenPAK公式が公開しているスケッチを、あおいさやさんがESP32向けに改修をしたものがありますが、このサイトではそれは利用せずに自作のライブラリを作りながら進めていきたいと思います。

最終的にI2Cで回路を書き込んだり、内部データを取得するライブラリをArduinoライブラリマネージャ経由で公開をしていきたいと思っております。

続編

コメント