google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

Arduino UNO に 0.96インチOLED を接続するアダプタ

前の記事ではブレッドボード上の Arduino NANO に0.96インチOLED (以下単にOLEDと記します) を接続するアダプタを作りましたが、今回はArduino UNO に OLED を接続するアダプタを作ります。

▼これまでのやり方
これまでのやり方
手っ取り早いのは、上の写真のようにオス/メスコネクタ付きのジャンパーワイヤを使って接続する方法です。でもこれ危なっかしい、というか寸法的には干渉しているピンを無理やり差し込んでいるのでまずいです。

他にうまい手が無いかいろいろ考えたのですが発見できませんでした。UNOの互換品にはI2Cと電源をピンを一列のスルホールに並べている場所があったりするのですが、残念ながらOLEDを直付け出来る並びになっている場所はありませんでした。

前回の記事でNANO用のアダプタを作ったのでちょうど良い機会です。UNO用にもちゃんと接続出来るアダプタを作ることにしました。

▼回路図
UNOにOLEDを接続するアダプタ
青色の点線内が今回製作する接続アダプタです。電源電圧3.3V用のOLEDも使えるようにジャンパープラグで切り替えが出来るようににしておきました。
なおOLEDの電源電圧、インターフェイスの信号レベルに付いてはいろいろな仕様の物が出回っているようなので要注意です。
 ・0.96インチ 128x64ドット OLEDディスプレイ
 ・3.3VのI2Cを5VのArduinoに接続する場合の注意事項
 ・Arduino に 0.96インチOLED (SSD1306)を接続する回路

▼アダプタの部品
アダプタの構成部品
部品は見ての通りです。基板は両面スルホールのユニバーサル基板をこの写真のように切り出した物を使います。

以下は完成状態の写真です。

・OLED取り付け側
OLED取り付け面

・配線面
配線面
配線はいつものように芯線径Φ0.26のETFE被覆の単線を使いました。(GNDはすずめっき線)

▼使っている様子
Arduino UNO へ OLED接続アダプタ使用状態
UNO に取り付けた状態です。A0-A3ピンなどの上は開けてあるので、使用上の制約は少ないと思います。

・別アングルから
取り付け状態
ミニシールドのような感じで使えると思います。

◆まとめ
これで0.96インチのOLEDを安全に使えるようになりました。

Arduino用の表示装置と言えば、昔はパラレルインターフェイスのキャラクタ液晶が定番で、LCDシールドを良く使ったものですが最近はほとんど使わなくなりました。これも時代の流れですね。
関連記事

コメントの投稿

管理者にだけ表示を許可する

No title

ラジオペンチさんこんにちは。

似たような機能の、I2C OLED用シールドの基板をPCBWayに発注してたのが届いたので、組み立てて動かしてみました。

とりあえず動くことは確認できたんですが、ラジオペンチさんが以前作られていたような、Arduinoコアのオシロを私も作りたいと画策してて、それへの使用に耐える速度なのかがちょっと気になっていたりします。

以前ラジオペンチさんが作られていたペン型オシロは、I2Cの64ラインOLEDだったと思うのですが、速度的にはどうでしたか?

動作中に表示を書き換える部分は、ほぼ波形だけだと思うので、線(というか横1列のドット列)を1本描くだけなので、ものすごく遅くなるって程でもないのかもしれないんですが、以前作りかけてたオシロはSPI版だったので、表示は2桁ほど速くて、表示速度を気にしたことが無かったんですよ。

なにか速度で工夫されたこととかありましたら、ご教示いただければありがたいです。

re:nekosan

nekosanさん、こんにちは。

基板出来たんですね、かっちょいいです。

オシロの表示速度についてはプログラムを書いている段階から注意してやっていました。コードの中に実行時間が書き込まれているのもその名残です。

工夫というほどではありませんが、
バッファの転送コマンドの display.display() が一番時間がかかるのでループの中で1回だけ使う。
無駄な書き換えを避けるために、
 共通的な画面は最初に書いておいて書き直しはしない。
 波形の書き換えは、波形エリアだけ矩形に消して書き直し。
などをやっています。矩形(のバッファ)クリアは比較的高速でした。

表示デバイスに関係ないですが、低速スイープ時にレンジなどの切り替えがあった場合、波形のキャプチャを中断してレスポンスを改善なんてこともやってます。

おっと、一番大事な話が後になってしまいましたが、u8glib だと高速化が難しいので Adafruit のライブラリを使っています。
後で知ったのですが、u8g2 なら速かったみたいです。

No title

ラジオペンチさん、ご回答いただきありがとうございます。

低速サンプリング時の操作性は、ちょっと悩みどころですよね。最高速サンプリングと、長時間サンプリングは、同じロジックのままでは両立できないので。

いまのところ、1回のスイープが何秒もかかるパターンを入れてない(外してある)ので、ひとまず実用上問題にならないようにしてあるのですが、長時間でサンプリングできるように仕様を拡張すると、今のままではまともに操作できないとおもうので、どうしたものかと。

(まぁ、サンプルレートによって処理を振り分けするしかないんでしょうけど)

グラフィックライブラリは、最初にAdafruitのを使ってみて、画面の端にノイズが載ったり、デモプログラムを動かすと画面の上下が半分ずつ逆に表示されたり、リファレンスやサンプルを探すのに難儀したり…と、あまりしっくりこなかったので、最初にちょっとだけ使って、あとは放置してました。

u8glibも使ってみたんですが、なんかしっくりこず…

で、オレオレライブラリを作って使っているんですが、内部処理がC言語なので、速度的には爆速とは言えないかなぁと思います。
(SPI版は、高速化のために、digitalWrite使わずに、PortB固定で直接ポート叩くようにしてしまいました)

なお、SPI版に作ったOLED・G-LCDの表示をしてみるかぎり、速度的に何の問題もないので、単純にI2Cの通信速度の問題なのかなと思っています。
なので、多分インラインアセンブラとかバリバリ使っても、I2C使う限り速度は期待できないかな…と思うんですよね。ドットの描画位置の計算とか、SPIと全く同じことしてるだけなので。

ちなみに、オレオレライブラリを作る際、最初からオシロに使おうと思っていたので、波形を消す処理を速く行える様に、XOR条件でドットを書いたり消したりできるようにしておいたんですよ。なので、同じ波形を2回描くと、まっさらに戻る…と。
一旦消してから縦横の罫線を書き直すのと、XORでドット単位で波形を消すのと、どっちが速いのかは計測してないので、なんとも言えないんですが…

u8g2は、display.display()みたいな処理が要らなくて、描画命令を実行すると直で表示に反映されるモノですかね。まだ試していないんですよ。あとでちょっと試してみたい気がしています。

nekosanさん、こんにちは

nekosanさん、いろいろ解説ありがとうございます。

そうですか、独自ライブラリですか、流石です。
お話伺っていると、ソフト側にはバッファメモリを持たない方式かなと思いましたが違うかな?。
バッファを持たない方式で複雑な図形を描画すると通信量が増えるので、悩ましいところですよね。

ちなみにu8glibでハードSPIを指定すると4Mbpsで通信していました。
http://radiopench.blog96.fc2.com/blog-entry-535.html
データー量が多い場合はSPIを使うべきなんでしょうね。まあ、ソフトからのデーターの供給が追い付かなくなりそうですが、

あと、XORで画面にカーソルなどを出す処理はやってみたいと思っていて、u8g2で試してみようかと思っていました。ちなみに、マンデルブロ集合の作図位置を会話形式で指定するのに使うことを考えています。

ともあれ、詳しい方からのコメントはとても参考になります。重ね重ね、ありがとうございます。

No title

こちらこそ色々ご教示いただきありがとうございます。助かります。

私の作ったオレオレライブラリは、内部でSRAM上に仮想VRAMを確保してます。(表示中のグラフィックとXOR取ったり、ドット単位でオンオフしたりといった処理に使うので)

Arduinoだと、それだけでSRAMを半分(1kB)消費してしまうので、ホントは液晶(OLED)モジュールから読み出しできればいいんですけど、最初に使った5110液晶に読み出し機能がなく、また、SSD1306のI2Cなんかも読み出しができないので、オレオレライブラリでは一律仮想VRAMを使う仕様にしています。

ハードウェアSPIは、SS信号(CS信号)の制御が厄介だなと思っていて、好き嫌いレベルですがソフトSPIばかり使ってしまうんですよね。
特に複数デバイスを繋ぐ場合、データ転送が終わったことを認識してからSS信号を改めてソフト制御する必要があって面倒なのに加え、ピンが固定になるという制約のわりに、ソフト制御に比べてあまり速くはならない感じがあって、

そうそう。
Arduinoオシロ用に液晶やOLEDを使う場合、とにかくメモリ量との闘いになるので、以前オシロで試みたことの一つは、ライブラリの一部をオシロ専用に改造し、仮想VRAMに持つのを「ドット単位のグラフィック表示が必要な領域の分だけ」にしたことです。レンジなどの文字表示部分(読み出しが要らない部分)は、仮想VRAM持たずに直接書き換えにしました。
文字表示領域が1/4くらいあるので、SRAMの消費もそのくらい浮かすことができ、ギリギリFFT機能とかを入れることができました。
ただ、その後のArduino-IDEのバージョンアップで、Arduino Coreのメモリ使用量が増えてしまって、結局mega328のArduinoではメモリが足らなくなってしまいました。
なので、オシロについては、メモリ量が潤沢なmbedにライブラリを移植して、そっちで改めて作ろうかと思っているところです。

nekosanさん、こんにちは

おー、SRAMにバッファメモリを確保した自前ライブラリだったのですか、勘違いしていて失礼しました。そういえば以前、液晶の初期化のルーチンとかいろいろいじられてましたよね。

あと、私のArduinoオシロもやはりSRAM不足は深刻でした。画面メモリに1kB、波形メモリに400バイト使うので残りはあまりありません。
シリアルを使うだけでもメモリを大量消費する(確か150バイト以上)のでデバッグにはシリアルは使わずOLEDに値を出したりしていました。
その時、おっしゃるような方法で画面メモリを節約出来ないかとちょっと考えたのですが、私には無理っぽかったので諦めました。
波形メモリは10ビットなのに16ビットのintに格納するのはもったいない。パックして隙間無く詰め込んじゃおうか?なんてことも考えました(やりませんでしたけど)。


それと、FFTやってみたいんですよね。もっと高速化もやりたいので実は ESP-WROOM-32 を使うことを考えてます。

そんなことでともかく、nekosanさんとお話しするとすごく刺激になります。コメントありがとうございます。

No title

FFTについては、京都大学の大浦先生が公開されているものが有名みたいで、以前mbed環境や、ESP32のArduino環境で使わせてもらって、しっかり動いてた記憶があります。

http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/

説明のreadme.txtが確か英語で書かれてて読むのが大変だった記憶がありますが、有名なライブラリなので、使用例とかはあちこちで見つかると思います。

このライブラリ、もともとはLinuxとかで使うような想定なので、内部で使っている数値変数はdouble型なんですが、マイコンではdouble型だと処理時間やメモリ量の点でアレだったので、テキスト置換でdoubleをfloatに変えて実行してみたら、サクッと通ったと記憶してます↓。

https://brown.ap.teacup.com/nekosan0/2991.html

float型にしてしまえば、マイコンでオシロ作るとといったいうような話なら、多分実用レベルの速度が出るんではないかと思います。

nekosanさん、こんにちは

アドバイスありがとうございます。
FFTまでやるのはまだ先になりそうですが、その時は参考にさせていただきます。

ちなみに、ESP32のanalogReadの高速化について調べているのですが、検索するとnekosansan の記事がいろいろヒットして参考になってます。

No title

ESP32のADC、そういえばだいぶ癖があるんですよね。
しばらく使ってなかったのでかなり忘れてましたが、自ブログ記事を読み返してみて、なんか色々思い出しました。

ESP32だと、Wi-Fi使えるので、USBで繋がなくてもWi-Fi経由で操作・表示ができるオシロが作れるんじゃないかなと思ってて、ちょっとやってみたいことの一つなんですよね。

nekosanさん、こんにちは

ESP32のADC速度をネットで調べているのですが、最高で9μsくらいらしか出ないようで期待外れなんですよね。もっと早くならないか、さらに調査中です。
ちなみに私のATmega328オシロのサンプリング速度は最高で8μsです。

データーシートを読むとモードによっては最高で2Mspsいけそうな感じなんですが、特殊な使い方しないとダメなのかも知れません。

あと、ESP32には浮動小数点演算ユニット(FPU)も付いているみたいなので、FFTをやらせるには最適かと。

ともかくそんなことで、新しいおもちゃを楽しみながらいじってますです。
カレンダー
06 | 2020/07 | 08
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード