Arduino しようぜ!ハードウエア実機編(OLEDをつなぐ)

「Arduino しようぜ!」の3回目、ハードウエア実機編です。(「Arduino しようぜ!」は大谷選手の「野球しようぜ!」へのオマージュです。)
前回は、パソコンを使ったシミュレートで、LCDに文字を表示するスケッチを完成させました。
今回は、実機のArduinoを使って、OLEDディスプレイに文字を表示するためのハードウエアを準備します。
可能な限り専門的な用語を使わずに解説してみます。
(前回のArduinoのシミュレートは、以下をクリック)

実機で「ディスプレイに名前を表示」のために、ハードウエア編とソフトウエア編に分けます。
まずは、ハードウエアの「知っておいたほうが良いこと」です。

注意事項

パソコンにArduinoをつないで電子工作を楽しむときには、それほど注意することはありません。
でも、ちょっと注意するだけで、せっかく買った部品を壊さなくても済みます。

1 通電(USBケーブルをつなぐ)する前に、再度、電源のラインを確認しましょう。
Arduinoにつなぐ部品は、基本的には保護回路などはありません。自己責任でつなぐことになるので、壊さないために、再度プラスとマイナスを確認しましょう。(逆につなぐと物によっては一発で壊れます。)
常に+電源を赤色、GNDを黒色のケーブルにすると間違いが少なくなります。
また、配線を変更する前は、必ずパソコンからUSBケーブルを抜きましょう。

2 十分な作業スペースが確保できる方は良いのですが、テーブルの隅が唯一の実験場という方も多いと思います。すると、何かがぶつかって、落として部品を壊したり、紛失することがあります。注意して作業しましょう。(ボード類を固定できると最高です。)

インターフェース

Arduino(に限らず小型コンピュータ・ボード)には、色々なインターフェースがあります。
その中でも知っておいたほうが良い、よく使うものです。

シリアル通信

便宜上「シリアル通信」としています。(他の通信もシリアルですが。)
パソコンとMCUをつなぐために使います。パソコン側とArduino側の速度をあわせないと正常な通信が出来ません。
Arduinoでは、デジタルピンの1と0にあるTXとRXです。

I2C

今回購入したLCDとOLEDディスプレイに使われている通信方法の名前です。
1992年にオランダのフィリップス社が開発した規格で、低速ですが2本の線だけでデータを送受信できます。
アナログピン 4, デジタルピン側 18 : SDA(Serial Data) : データ線
アナログピン 5, デジタルピン側 19 : SCL(Serial Clock):クロック線,
これを入れ替えると動作しません。
この2本の線には、10 kΩ程度のプルアップ抵抗(信号線を安定させるための+電源につなぐ抵抗)が必要です。
Arduinoには2か所のI2Cがあるように見えますが、デジタルピン側とアナログピン側は内部で導通しています。

I2Cは、2本の線で多数の部品を並列につなぐことが出来ますが、個々の部品を識別するためにアドレスが必要です。
(アドレスと言うと住所ですが、ここでいうアドレスはマイナンバーのように固有番号です。)
ArduinoでI2Cを使う場合のアドレスは、「0x3C」のように16進数で指定します。(16進数は、頭に「0x」を付けます。)

SPI

SPI(Serial Peripheral Interface)は、I2Cと同様に複数の部品をつなぐことが出来ます。
配線は4本で、I2Cの通信速度が1 Mbps以下なのに比べて、SPIは最大数十 Mbps程度と早いです。
デジタルピン 10:SS(Slave Select)
デジタルピン 11:MOSI(Master Out Slave In)
デジタルピン 12:MISO(Master In Slave Out)
デジタルピン 13:SCK(Serial Clock)
今回は、SPIは使いません。

使用感から例えると、パソコンとの通信がオートバイ、I2Cが軽トラック、SPIは大型トラックみたいな感じでしょうか。(タイヤの数からも)

ArduinoとOLEDをつなぐ

前回のシミュレーションと同様に、Arduinoとブレッドボード、OLEDディスプレイをつなぎます。
今回は実際に、線でArduinoとブレッドボード、OLEDを配線します。
(資材の位置や配線の色は、前回を参考にしてください。)

なお、一部のOLEDディスプレイには「SCK」と書かれた端子がありますが「SCL」と同じです。

ArduinoブレッドボードOLED配線の色
GNDー電圧GND黒色
+5 V+電圧VCC赤色
アナログpin5SCL黄色
アナログPin4SDA緑色
Arduino側
OLEDディスプレイ側

全体の写真は、このようになります。(Arduino UNOはaitendoの互換機を使いました。)

全体図

Arduino UNOを接続

私のところではArduinoをつなぐ際に、不具合が発生したので解消します。

Arduino UNO R3とubuntu(Linux)パソコンの接続不良

以前は異常なく動いていたArduinoですが、久々にパソコンにつないだら認識しません。Windows11では問題ありません。
作業部屋のubuntu(Linux)のパソコンとUSBケーブルで接続すると認識しません。
ところが、UNO R4(新型UNO)に変えたら大丈夫です。
USBケーブルの不良か?と思って何本も交換しましたが変わりません。
パソコンのUSBポートの異常か?(でもR4では大丈夫だし。)
色々やってみましたが解決しません

最終的には、「brltty」の不具合でした。
「brltty」は、Linuxで点字ディスプレイを使うためのUSBドライバらしいですが、今のところ自宅では点字ディスプレイを使う予定はないので、削除しました。
「sudo apt remove brltty」でこのドライバを消したら嘘のように快調です。
解決しました。

実際のOLEDテスト

パソコンとArduinoがつながったら、OLEDのテスト用スケッチを「検証」して書き込みます。
(OLEDテスト用スケッチの読み込みは、ソフトウエア編の以下をクリック)

パソコンの性能にもよりますが、少し待つとArduinoに正常に書き込まれて、自動的に一連のOLEDテストが流れます。
もし、正常に書き込まれてもOLEDに表示が出ない場合は、接続ミスが考えられるので、USBケーブルを外して再確認します。
それでもダメなら、アドレスを確認してみてください。

OLEDの裏側にアドレスを設定するジャンパがありますが、アドレスとの対応は下表のようになります。

ジャンパ向きアドレス
0x780x3C
0x7A0x3A

読み込んだOLEDの表示テストのスケッチでは、35行目の
「define SCREEN_ADDRESS 0x3D」でアドレスを設定しています。
(オリジナルのスケッチでは「0x3D」となっていましたが、「0x3C」に書き換えています。)
もし、購入したOLEDが、アドレスが「0x7A」側になっていたら「0x3A」に書き換えれば動きます。

OLED(SSD1306)の検証

検証と言っても、分解して基盤を解析したり各端子の信号を調べたりはしません。
使う上で疑問に思ったことを解消する程度です。

基本性能

ネット情報を総合すると、SSD1306の基本スペックは以下のとおりです。
・ドライバIC: SSD1306
・画面サイズ: 0.96 インチ
・電源電圧: 3.3V~5V
・消費電流: 100 μA/1素子、合計約 20 mA
・解像度: 128×64 ピクセル。
・視野角: 160 度
・外形寸法: 11x27x27mm (コネクタを除く厚さ: 4mm)
・重量: 4g
・動作温度: -30 ~ +70 ℃

根拠の曖昧な資料では、4.7kΩのプルアップ抵抗(R6、R7?)が付いているようです。

基盤裏にあるQ1が電源レギュレータだと思われますが、型番は不明でした。ネット上の情報も探しましたが見つかりません。(配線図も見つかりませんでした。)
このレギュレータで、電源電圧が+5 Vのときに3.3 Vを生成していると思われます。(ドライバICの定格電圧が1.65V ~ 3.3Vのため)

注意事項

1 画面は薄いガラス製なので、非常に壊れやすいです。
2 焼き付きを起こします。同じ場所に表示を続けると4~5年で表示に不具合が発生します。

電源電圧

このOLEDの電源電圧は、5 Vでも3.3 Vでも大丈夫と書かれていますが、検証します。
まずは、5 Vです。Arduinoの5 V端子から電源を供給しています。
以前使用したスケッチで表示テストです。問題ありません。

次に電源をArduinoの3.3 Vからとります。(3.3 Vの配線はオレンジ色を使いました。)
問題なく表示できました。
なお、電源を入れ替えるときには、何があるか分からないので、面倒がらずに毎回USBケーブルを抜きましょう。
特に猫を飼っている方は注意が必要です。(来なくて良い時に限って、邪魔しがちです。)

昇圧回路の設定

ソフトウエア編で解説した内容になりますが、設定のところで「display.begin(SSD1306_SWITCHCAPVCC, 0x3C);」がありました。
その中の「SSD1306_SWITCHCAPVCC」は、データシートによると内蔵の昇圧回路で3.3 VをOLEDパネルの駆動用に7 V(12 V?)へ昇圧すると書いてありました。
外部から7 Vを供給して昇圧回路を停止する場合は、ここを「SSD1306_EXTERNALVCC」に書き換えるとあります。
では、検証してみましょう。
USBケーブルを抜いて、OLEDの電源を5 Vに戻してから「SSD1306_EXTERNALVCC」に書き換えてみました。
Arduino IDEで「検証」してエラーが出なかったので「書き込み」しました。
「・・・表示している?」OLEDの表示は、そのままです。
冷静になって一度USBケーブルを抜いて見てみます。
表示が消えました。
昇圧回路を停止する設定(SSD1306_EXTERNALVCC)にすると、OLEDの表示は消えました。
電源を3.3 Vにしても、もちろん消えたままです。

続いて、データシートには、「SSD1306_SWITCHCAPVCC」は8進数で「2」である。と書かれていました。
本当かどうか、やってみよう!
「display.begin(SSD1306_SWITCHCAPVCC, 0x3C);」を
「display.begin(0x02, 0x3C);」と書き換えます。
USBケーブルを抜いて、電源電圧を5 Vに戻して検証します。
表示できました。3.3 Vでも問題ありませんでした。

最後に、データシートには標準で昇圧回路を使用すると書いてあったので(多分?)その部分を省略してみます。
「display.begin(SSD1306_SWITCHCAPVCC, 0x3C);」を
「display.begin( 0x3C);」と書き換えます。
Arduino IDEで「検証」したらエラーは出ませんでした。「書き込み」も問題なく終了しました。
しかし、ダメでした。書込み後にUSBケーブルを抜き差ししたら、画面は暗いままです。何も表示されません。

検証結果

1 OLED(SSD1306)は、5 Vでも3.3 Vでも問題なく動作する。
2 「display.begin(SSD1306_SWITCHCAPVCC, 0x3C);」は「display.begin(0x02, 0x3C);」と書き換えてもOKだが、それ以外の設定では昇圧回路が停止してOLEDは表示しない。

まとめ

これで、SSD1306を使ったI2CインターフェースのOLEDディスプレイのハードウエア編は終了です。
このディスプレイより大きい「SSH1106」などがありますが、ライブラリを変えれば同じ様に使うことが出来ます。

OLEDは、表示が明るくて遠くからの視認性が良いことから、表示装置としては優れていると思います。
Arduinoは小型のNANOにして、ケースに組み込めば色々な用途に使用できます。
ぜひ、ソフトウエア編とともにご活用ください。

なお、ハードウエア編も予定より長くなったので、LCD(液晶ディスプレイ)編は、別の記事にします。

コメント