目次 [ Contents ]
以前に書いたHiLetgoのOLEDをまた手に入れたので、デフォルトのSPI接続で試してみました。
このOLEDは裏の配線を変えることでI2CとSPIどちらでも動作するグラフィックディスプレイです。前回の時は初期設定のSPIでうまく動かせず、結果、I2C仕様に変更して動作確認したんですが、戻すのが大変そうだったのでSPIでの再確認はしてませんでした。
そこで、別件でのAmazon注文ついでに入手して試したんですけど、サクッと成功しまして…どうもデバイス、ライブラリに対する認識不足があったみたいです。
とりあえず、動作確認時の環境です。
- ArduinoUNO R3
- Windows 7
- Arduino IDE 1.8.1
- u8glib、又はu8g2
配線
サンプルスケッチ
動作確認のためのスケッチはu8glibのサンプルスケッチ「GraphicTest」を使用。以下の設定をコメントアウトから外します。
U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9, 8);
// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9;
設定コードにはReset用のピン(8)のコメント説明がありません。が、他のドライバチップで似たピン設定のコメントを見るとD8ピンがリセット用と書かれているし、u8g2ライブラリのサンプルスケッチでは8がリセットピンと表記されています。
とにかく、上記の配線・設定なら、I2C接続のように自分でリセット手順を追記しなくても描画できました。
ちなみに、他のサンプルスケッチでD8ピンの記述がない場合があったので(“Hallo World”等)、もし描画できなかったら、設定を上記のように書き直してみてください。
SPIとI2C
自分で理解を整理することも含め、2つの通信をまとめてみます。参考までに。詳しく正確に理解したければ、「SPI 通信」で検索してください。
I2C
I2Cは2本の通信線を使ってやりとりします。
SCL (SerialCLock)
SDA (SerialDAta)
通信規格としては半二重通信とよばれるもので、SCLで同期を取りながら、データ自体の送信受信をSDA線で交互に切り替えて行います。例えるなら1車線しかない道路です。車速の規制(SCL)で整理しながら、上り下りの車(SDA)が交互に行き来する感じです。
SPI
対してSPIは全二重通信で(半二重で行う形式もあるらしいですが)、送信受信用の2車線ある状態です(MOSIとMISO)。ただ、それでも、事故を防ぐための「車速の規制」ルール(SCK)は必要になります。
SCK (SerialClocK)
MOSI (MasterOutSlaveIn)
MISO (MasterInSlaveOut)
CS (ChipSelect? – SlaveSelectの別表記)
これだと3本の線で済みそうなんですが、複数のデバイスを並列で繋げた時、ごちゃ混ぜにならないよう切替の合図が必要になります(CS)。つまり、4つのデバイスを繋げたら、マイコン含めて5叉路ということになり、合図(CS)で「指定した交差点からだけ」と進行方向を切り替えることで、交差点内がグチャグチャになるカオスを防ぐ仕組みになっています。
結果、4本の通信線が必要となります。
ただ、この記事の配線、u8gサンプルスケッチだと1対1です。なので、CSの設定はそこまで重要ではないようで、試しにCSのピンだけ外しても何となく描画してくれたりします。
最後に、このOLEDに苦労した「表記」と「Reset」について書いておきます。
以前購入したSPI接続のOLEDでは、ピンの表記がu8glibのコメントに即したものになっていて迷うことがありませんでした。D/Cの表記も消去法で埋まるので。
対して、このHiLetgoOLEDではそうなっていません。単純に見ると、0がOに、1がIに見えたりして、DO→MOSI、DI→MISOかなと右往左往したり…。というか、そもそも「DC」は何なのか、と。
Arduino Pins | u8glib comment | HiLetgo OLED Pins | Other OLED Pins |
13 | SCK | D0 | CLK |
11 | MOSI | D1 | MOSI |
10 | CS | CS | CS |
9 | A0 | DC | D/C |
8 | (RESET) | RES | – |
結果的にDCが「MISO」に相当するんだろうと推測できますが、それが何の略名なのかよく分かりません。
また、このHiLetgoOLEDの場合、リセット処理が外部接続前提になっている点も苦労の原因でした。他のOLEDやLCDでも、リセット命令はプログラム上から(直接ドライバチップへ)してるものだろう、と思っていたので、こうやって外部ピンから直接叩くのが前提だったとは、考えもしてなかったです。
日々勉強です。