はじめてのArduinoで勉強してくださっていますでしょうか?
順番的にはA/D変換した値をシリアル通信でシリアルモニタ上に表示させたくらいでしょう。
今回はもう少しステップアップします。
っというのもarduinoを使用する環境でいつもPCに接続しているばかりじゃないでしょ?
たまにはバッテリか電池駆動で、arduinoを外の世界やスタンドアローンで動かしたいじゃないですかぁ?
そんな時にセンサから読み取った数値などを表示させる手段としてディスプレイという手があります。
今回はずばりOLED有機液晶ディスプレイのはじめての使用方法になりまーす。
ディスプレイを使えるようになると飛躍的にやりたい事が形になります。
なんでも表示可能です。それでは今回も頑張って勉強していきましょう。
目次
今回の目標
今回の目標はずばり有機ELディスプレイに思った通りの表示を行う事です。
もちarduinoでね。
必要物品
- OLED 今回はamzonで安価に売っている0.91インチOLED SSD1306チップを搭載しているそうなものを購入。128×32の表示です。2個で700円程度でした。
- arduino UNO R3
-
u8g2libライブラリ ライブラリは無料です(あとでどのようにインストールするか説明しています。)
- Arduinoで使用するOLED表示プログラムはこちらからダウンロード
とりあえずOLEDが使えるようにする知識と準備
ディスプレイですが、ひと昔前だと7セグLEDなんてもんがあって、人間の目の限界を利用して7つのLEDで数字を表示させるという結構プログラミングにしんどいディスプレイの方法がありました。(今もありますし、ライブラリのおかげでそれほど大変じゃないかも・・でも配線とかやっぱ大変です。)
今は液晶・有機ELディスプレイという大変便利なものがあって、なおかつarduinoで簡単に使えるようにライブラリといってコードの集合体が無料で配布されているおかげで楽ができます。
OLEDとは有機ELの事で色々メリットがあります。各自で調べてください。(笑)
今回のディスプレイはSSD1306というチップが使われているそうで、Adafruitという会社のライブラリなどで表示が可能なのですが、ちとめんどいので違うライブラリで短く少ないコードでプログラミングします。
使用するライブラリはu8g2libを使用します。
動画で説明
動画でも説明しておきますね。↓
IC2通信
ディスプレイをarduinoに接続する方法は大きくわけて2つあります。
それはIICいわゆるI2Cという通信方法とSPIという通信の方法です。
arduinoで使用するセンサはI2C通信をするセンサが多く、I2Cを少し知っておいたほうがよいでしょう。
ちなみにopen AIのchatGPTにI2Cについて尋ねると
I2C(Inter-Integrated Circuit)通信は、2本の信号線(SCL、SDA)を使用して、複数のデバイス間でデータを送受信するためのシリアル通信プロトコルです。I2C通信は、Philips(現在はNXPセミコンダクターズ)が開発したもので、今では多くの電子デバイスで使用されています。
I2C通信では、SCL線はクロック信号を提供し、SDA線はデータ信号を送受信します。各デバイスは、ユニークなアドレスを持っており、通信が開始されると、マスターデバイスが各デバイスのアドレスを指定して、データを送信または受信します。各デバイスは、マスターデバイスからのアドレスを確認して、自分宛のデータであるかどうかを判断します。
I2C通信は、データをシリアルで送受信するため、少ないピン数で多くのデバイスと通信することができます。また、マスターデバイスが各デバイスを制御できるため、デバイス間の競合を回避することができます。I2C通信は、データ転送速度が比較的遅いため、高速なデータ転送が必要な場合には適していませんが、センサーやディスプレイなどの周辺機器との通信には広く使用されています。
だそうです。
arduino初心者としてしっておくべき知識はI2C通信はSDAとSDIという通信線2本でやり取りできて、複数のI2C通信(センサなど)を行う場合にはアドレスを分けなければならない事です。アドレスはセンサによっては変更できない場合があったり、ハンダでジャンパー線をつけたり、とったりしないといけないものもあります。
まぁはじめのうちはI2Cセンサを複数同時に使う事はないですよね。
回路図
回路図は簡単です。
OLEDに印字されているSCLはarduino側のSCLへ
SDAもarduino側のSDAへ接続します。
むっちゃ簡単です。
あとはVCCと印字されているところはarduinoの5Vへ
GNDはardunoのGNDへ。
これで接続完了です。
ライブラリのインストール
ライブラリのインストールも非常に簡単です。
図で示します。
下図のように1のライブラリボタンを押します。
続けて2に”u8g2”と打てばu8g2 by oliverというライブラリが上位にでてくるのでそれをインストールすれば終わりです。むっちゃ簡単。
プログラム
プログラムですがとりあえずみてください。
内容はプログラム中にコメントアウトで記載しております。
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 32 33 34 35 36 |
#include<U8g2lib.h> //↓の文は表示するためのディスプレイに使用されているチップやサイズのことが記入されています。 U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); void setup() { u8g2.begin();//ライブラリのスタート u8g2.clearBuffer();//ゴミを綺麗にクリア u8g2.setFont(u8g2_font_8x13_tf);//使用するフォントを決定 u8g2.drawStr(0, 10, "Hello world!"); u8g2.drawStr(0, 20, "clinical"); u8g2.drawStr(10, 30, "Engineering"); u8g2.sendBuffer();//OLEDに送信 delay(3000); } void loop() { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_maniac_tr); u8g2.drawStr(50, 30, "CE"); u8g2.sendBuffer(); delay(1000); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_maniac_tr); u8g2.drawStr(50, 30, "ME"); u8g2.sendBuffer(); delay(1000); u8g2.clearBuffer(); } |
基本的にu8g2.drawStrで指定した座標の位置に文字列を表示します。
原点は画面左上なので、左端から右に何ピクセル、上端から下に何ピクセル、という形で指定します。
文字列の左下の座標を指定するので、文字の高さを勘定して座標を指定する事になりますね。
とりあえずu8g2.drawStrで指定した文字が表示されますでしょうか?成功です。
フォントを変更したい場合
フォントを変更したい場合はsetFontでフォントを指定してやればいいだけです。
文字の大きさで分けられていますね。
数値を直接表示はできないです
センサのデータを直接ディスプレイにu8g2.drawStrなどを使って表示させる事ができません。あくまでも文字列だけ表示させる事しかできないので以下のようにdtostrf関数を使います。
1 |
dtostrf(数値, 全体の長さ, 小数点以下の表示数,文字列変数); |
数値を文字列に変換して文字列変数に代入する関数です。
sprintfでも数字を文字列に変換することはできるが、Arduinoでは小数(float型、dobble型)をsprintfで変換するとエラーになるので、その解決のために作られたと思われる関数だそうです。
例)
a = 3.1415;
char str[10];
dtostrf(a, 4, 2, str);
str ⇒ 3.14 ※頭に0はつかない
参考にしたサイト
ArduinoでOLEDを動かす(u8g2libライブラリを使用)
てか↑のほうがみやすいかも・・