TIM Labs

fujiによるエントリー一覧

前回、400円オシロスコープの話をしたが、これはProcessingで作られているのだ。

信号(電圧)の読み取りはArduinoで行っているが、そのデータは全部パソコン側に送られ、Processingでつくられたプログラムで処理されているのだ。

oscilloscope-bridge-2.png

電圧の測定はArduinoで行い、データをパソコン上のProcessingのプログラムに送って処理している。
もちろん、右側のボタンによるさまざまな制御もProcessingで処理されている。
これだけできるにだから、これは十分に習得する価値があるプログラミング言語と思われる。

最近は、STEM教育といって、小学生のうちからプログラミング、IoTなどの教育を始めようと言う動きが世界中に拡がっている。
そこで良く紹介されていて、書籍なども非常にたくさん出ているのが、ScratchというMITのMedia Lab で子供向けに開発されたプログラミング言語であり開発環境がある。

しかし、子供向けにしているために、せっかくのコンピュータの性能が十分に生かせないなど問題も色々ある。
入門には良いが、そのまま実用に結びついている訳ではない。

今回紹介しようとしているProcessingは、非常に入門のハードルは低いけれど、コンピュータの持つさまざまな機能、性能を十分に使えるようにしたものである。
とくに、デザイナー向けに作られており、最近のデジタルデザインが手軽に、そして優れたデザインができるようにと作られたものだ。
ということで、グラフィックス機能はやたらに高く、かつ便利にできている。
たとえば、東京芸術大学のメディアアート・プログラミングでは、Processingが用いられているのだ。

なお、このProcessingもMITのMedia Lab発祥のプログラミング言語である。

oscilloscope-bridge-2.pngIoTを色々いじっていると、電気が思った通りに変化しているか、電圧の波形を見たいことがある。つまり、可視化。

ということで、Arduinoで何とか測定装置、要するにオシロスコープはできないだろうか、できそうではないか、一定時間間隔で電圧を測定して記録さえできれば、あとは表示するだけだ。

といっても、オシロスコープを自分で考えるのはとても面倒である。

折角のインターネット時代なので、ちょっとインターネットで検索してみたら、こんなサイトが見つかった。

Arduino簡易オシロスコープ|国立大学法人 九州工業大学情報工学部【飯塚キャンパス】で作り方が公開されているのだった。

ソフトウエアもダウロードできるようになっていて、これはもう作るしかない。

Arduino1台と、簡単な回路を作ることと、パソコン側にProcessingという最近流行りのプログラミング言語をインストールしてオシロスコープの画面・制御パネルを動かす構成になっている。

Arduinoは、その機能の一部が使われるだけなので、Arduino Uno の必要もなく、もっと小さいArduino Nanoで十分である。Arduinoはオープンハードウェアなので、安い互換品が多数存在する。
ネットで調べていたら、中国からのネットショッピングで、USBケーブル+Geekcreit® ATmega328P Nano V3 Module Improved Version が1セット275円であったので入手した。

とても怪しいビニール袋(小さなゴミ袋の感じ)に、最低限の包装で物が入っているだけだったが、組み立てたらちゃんと動作した。

ということで、ケーブル付きで275円のArduino nanoを、ブレッドボード互換のユニバーサル基板に若干の部品と共に取り付けたら、Arduino側ができた。
その他の部品を入れて、400円程度で完成した。つまり、普通に安いオシロスコープの値段の1%である。

128×64ドットで、多数jの文字を表示するのは、1画面ならOKだが、2画面だとダメだった。

ということで、次のような実験をした。

  1. 画面を128×64ではなく、128x32を指定してみた。
  2. 表示する文字数をぐっと半分以下に減らしてみた。

これだと、ディスプレイの上半分だけが使われるのだろうか。

プログラム全体を以下に示す。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     4

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);
  display1.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display2.begin(SSD1306_SWITCHCAPVCC, 0x3D);

  displayText(display1, "Arduino is an open-source hardware and software company,"
                        "project and user community ");
                       
  displayText(display2, "that designs and manufactures "
                        "single-board microcontrollers and microcontroller kits " );
} 

void loop() {
  
}

void displayText(Adafruit_SSD1306 disp, char* text) {
  disp.setTextColor(WHITE);
  disp.clearDisplay();
  disp.setTextSize(1);
  disp.setCursor(0,0);
  disp.print(text);
  disp.display();
}

すると、結果はこうなった。

OLED-128x32displa2.JPG

文字が縦に倍に伸ばされているようだ。1行の文字数には変化がない。

さて、どうして、128×64では動かず、128×32にしたら動いたのであろうか。

たぶん、以下のような理由ではないかと思う。

OLEDは非常に鮮明な表示と言われているので、文字を非常に小さくしてみた。

DSCN4780-small.JPG    DSCN4782-small.JPG

漢字を表示したりするには、フォントを入れたりしないといけないのだが、面倒なので止めた。

とりあえず、これを表示しているスケッチ(プログラム)を示す。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     4

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  displayText(display,"Arduino is an open-source hardware and software company,"
                       "project and user community that designs and manufactures "
                       "single-board microcontrollers and microcontroller kits " );
} 

void loop() {
  
}

void displayText(Adafruit_SSD1306 disp, char* text) {
  disp.setTextColor(WHITE);
  disp.clearDisplay();
  disp.setTextSize(2);
  disp.setCursor(0,0);
  disp.print(text);
  disp.display();
}

さて、次は、2つのディスプレイに異なる内容を表示してみよう。

adafruitのデモプログラムに手を入れて、2つのディスプレイに異なるグラフィックス表示をさせるのは面倒だったので、とりあえずこのプログラムを修正して、2つのディスプレイで、最後まで表示してみよう。

I2CバスでOLED(有機EL)のドットディスプレイを Arduinoに接続したが、まったく何も表示されず、画面は真っ暗なままだった。

OLED-128x64display.JPG

こういうとき、一番考えられるのは、I2Cのアドレスが一致していないことである。

スケッチのコードを見ると...

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

となっていて、プログラムではアドレスが0x3Dが指定されている。

デバイス側のI2Cのアドレスが3Dであるかどうかを確認しなくてはならない。

確認方法は色々考えられる。

  1. 他のI2Cのアドレスを調べられるマシンで確認する。
  2. デバイスの説明書を読んで確認する。
  3. Arduinoに、I2Cバスに接続したデバイスのアドレスを調べるソフト(スキャナ)を入れて確認する。

2.が正統派と思うが、ここでは、知っておくと非常に便利なI2Cのアドレス・スキャナについて説明しよう。

前回、Arduinoの小型版のArduino nano に、128×64のモノクロのOLED(有機EL)を繋いでみたことを書いた。今回は、もっと掘り下げてみよう。

Arduino-nano-OLED-1.JPG

まず、もっとも標準的なArduino UNOから、より小さい、ブレッドボード上に挿せるArduino nanoについて説明しよう。

機能的にはArduino UNOとほぼ同じであるが、ピンに違いがあるので、結線するときには必ず印刷されているピンの記号を見ながら行おう。

今回は、I2CでOLEDディスプレイを繋ぐので、必要な結線は4本だけである。

OLED-128x64display.JPG

ディスプレイの上に、ピンが4つあるが、左から GND, VCC, SCL, SDA になっている。

16文字2行の液晶ディスプレイをArduinoにつけたが、基板も含めると、幅8cm、高さ3.6cmとかなり大きい。Arduino本体より大きく、拡張ボードと同じ幅になってしまった。遠くから眺めるのならともかく、これではあまりにも大きく、基板を専有し過ぎて邪魔である。

ということで、小型化に取り組んでみよう。

さらに、このディスプレイはピンの数が多く、ハンダ付けするのが面倒である。
ということで、少ない線数で接続できる小型のディスプレイを探すことにした。

それで、ネットで何か手頃なものはないかと調べてみた。

すると、YouTubeに、Tutorial on I2C OLED Display with Arduino/NodeMCUがあり、参考になった。
英語だけど、非常に丁寧な説明で、英語が聞き取れなくても、良く分かる説明であったので、これをベースに考えることにした。

  • 単に小さいディスプレイではなく、ドットマトリックスにしてみよう。
  • 液晶はバックライトがないと見難いし、視野角に限度がある。でも、OLED(organic light-emitting diode、有機EL)なら、ドット自身が発光しているから、見やすい。
  • Arduinoとの接続に、I2Cバスを使えば、たった4本の結線で済むので、楽そうだ。(エンジニアはlazyであるべし)温湿度気圧センサーはI2Cだったし。
  • ついでに、Arduino Uno(実際にはMarduino)を使っていたが、このビデオではArduino nano というはるかに小さいのが使われていた。

ということで、ちょっと部品を集め直して、ディスプレイのテストをしてみた。

どのくらい小さくなったか、センサーの値を表示する3階建てと比較してみた。

DSCN4729-600.JPG

ディスプレイははるかに小さくなって、約1/3の大きさである。これだけ小さいけれど、実はこちらの方が、より多くの文字を表示することができる。楽勝で、10文字4行の英数字が表示できる。頑張れば、20文字8行さえ可能である。

ディスプレイの右にあるのが、Arduino nanoである。正しくは、その互換品の安いやつである。
USBなのだが、USB Mini-B という、それほど一般的でないコネクタになっていたので、これのケーブルはわざわざ入手した。

ディスプレイにはイメージが描かれているが、これはこのデバイスのためのライブラリのサンプルを走らせただけである。

さて、次回から、もう少し詳しく説明しようと思う。

ここ3回で以下の記事を書いてきた。

今回は、これをまとめて、二酸化炭素、温度、湿度、気圧をまとめて表示できるようにしてみた。

今までは、次図の左のブレッドボードを使い、ジャンパー線で結んでいた。
プロトタイプではよくやる方法だが、どうしてもジャンパー線は外れやすい。

20190616165424198_0001-600.jpg

それで、今回は、中央のArduino用の拡張ボードを用いた。Arduinoのピン位置に合わせて穴が空いているので、これを用いると二階建て構造にして、ブレッドボードの代わりにこの拡張ボードに部品を取り付けることができるようになる。

ということで、ハンダ付けが必要になるのだが、ハンダ付けの個所もできるだけ減らしたい。とくに、配線は最小限にしたい。

それで用いたのが、右端の超薄型ユニバーサル基板である。よく見ると、ブレッドボードとプリントパターンがよく似ていることが分かるであろう。
とても薄く、カッターで簡単に切り分けることができ、穴を合わせてユニバーサル基板の上に置いて配線すると、とても便利であった。

3つの部品の配線であるが、電源系は当然共通になる。
それ以外の部品とArduinoを結ぶ信号線などは、異なるピンになるように最初から話を進めてきたので、そのまま3つの回路を拡張基板上に実現すれば動く。

DSCN4684−600.JPG  DSCN4679−600.JPG

そして組み立てて動かすと、こんな感じになった。

1行目に気温と湿度、2行目に二酸化炭素濃度と気圧を表示している。

DSCN4693-600.JPG   DSCN4687−600.JPG

Arduino, 拡張基板、センサーとディスプレイの3階建てになってしまった。

ディスプレイはとても見やすいのだが、ディスプレイの幅が拡張基板と同じだけあり、このディスプレイは大き過ぎた気がする。でも、安かったから我慢しよう。

さて、プログラムである。

Arduino単独では、センサーで得られた情報を表示できない。DSCN4665-600.JPG
センサーを付けて、その値を小さなLCDで良いから表示ししたいものである。
Raspberry Pi の時に使ったものでも表示できるのだが、今回はもっと見やすいバックライト付きのにした。

とりあえず、結果をお見せしよう。

1行目は、"Hi,Arduino."と表示し、次に起動時からの経過時間を秒単位で表示している。

2行目は、この文字ディスプレイデバイスが持っているCharacter Generaterのパターンを表示している。単なる表示では面白くないし、全256文字を表示してみたいので、どんどんスクロールするようにしてみた。写真では、カタカナの終わりの方と、それに続くギリシャ文字の小文字の初めの方が見えている。

ディスプレイの左上の方に、丸の中に一が見えているのが10kΩの半固定抵抗であり、バックライトの調整に用いる。

このLCDの型番は、ACM1602K-NLW-BBWといい、秋月電子で400円で売っていたものだ。

バックライト付きで、サイズも大きいのに、なぜか非常に安い。よほど売れているからだろうか?

実は、このLCDは、Arduinoの公式ページ内で紹介されているライブラリの Liquid Crystal Library に対応したLCDである。

配線、プログラムは、display() and noDisplay() methodsで完全に分かると思うので、下手な解説は付けない。
実際、この解説通りに結線して、プログラムも流用しただけである。

さらに詳しいYouTubeの解説(Using LCD Displays with Arduino) があり、非常に参考になる(であろう。といのは、英語だし、かなり長いので最後までちゃんとは見ていない。

ここでは、改造して、キャラクタジェネレータの全文字をスクロールしながら表示するように手を入れたプログラムを紹介するに留める。

使用LCD:秋月電子:白色抜き文字表示 LCDモジュール 16x2行 白色バックライト付 (電流制限抵抗実装済み) データシートもあり、キャラクタジェネレータの全文字パターンも載っている。

部屋の環境、快適さを調べるには、温度、湿度、気圧、二酸化炭素の4つのデータが重要であろう。

前回、二酸化炭素濃度センサーについて書いたので、今回は残りの3つをまとめて計測してみよう。

世の中、この3つを同時に計測してくれる、とても小さなセンサーがあるので、入手してみた。

AE-BME280-AKIZUKI.JPG

画像は、秋月電子のサイト「BME280使用 温湿度・気圧センサモジュールキット」より拝借

秋月のサイトには、マニュアルとデータシートが用意されている。
Bosch Sensortecには、BME280 Integrated Environmental Unit のページが用意されている

そして、ちょっとネットで検索したら、とても懇切丁寧に使い方を書いているページ How to Hookup BME280 Sensor to Arduino using I2C があったので、参考にした。
英語のページだが、英語を読まなくても全てが分かるような素晴らしいページだった。

そして出来上がったのが次図である。
左右の電源を除くと、たった2本でArduinoに繋いでいるだけだ。

DSCN4648−600.JPG1pinと3pinをジャンパ線で結んで、I2Cの接続方法にしてある。

このアーカイブについて

このページには、fujiが最近書いたブログ記事が含まれています。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ