【GASでIoT】スプレッドシートの情報をラズベリーパイPico Wを使って7セグLEDに表示させる(2)定番の7セグLED用ドライバIC:MAX7219を使う
WEBベースのアプリであるGoogleスプレッドシートや、マクロ言語Google Apps Script(GAS)のメリットの一つに、ネットにつながるデバイスと連携しやすいことが挙げられます。
ネットに繋がるデバイスの内、アマチュアが扱い易いものの1つが「RaspberryPi(ラズベリーパイ)」シリーズです。これをスプレッドシートやGASと組み合わせると、ごく簡易なIoTシステムが作れます。
ラズベリーパイには様々なタイプが発売されていますが、比較的安価な「ラズベリーパイZeroW」を用いてフルカラーLEDを点灯させたり、7セグメントLED(7セグLED)という表示デバイスで文字を表示させた事例を、以前に以下の記事で紹介しました。
ーーーーー
NeoPixcelや、7セグLEDはデバイスの安価で、あまり費用を気にせず数を増やせることがメリットですが、肝心なラズベリーパイZeroWの価格が高騰し、コスト的に気楽に使えるデバイスではなくなったため、より廉価なマイコン版の「ラズベリーパイPico W」を使うことを考えました。
このデバイスは、デバイス内にOSやWEBブラウザが無いため、SSL認証に対応したURL(HTTPSではじまるURL)へのアクセス処理の実装は少々難しかったのですが、メジャーなMicroPythonではなく、C言語を使うことでなんとか実装することができました。
ラズベリーパイ側からのスプレッドシートへの書き込み、スプレッドシート側からの情報のフルカラーLED表示を試みたのが以下の記事です。
ーーーーー
さらに、ラズベリーパイPicoWを使って、7セグメントLEDでの文字表示にチャレンジしたのが以下の記事になります。
スプレッドシートなどの情報を7セグメントLEDに表示できると、掲示板などさまざまな用途に利用できそうです。
本記事は、上記の解説になります。
7セグLEDは安価ながら配線数が多い
7セグメント表示器は、文字を表示させることができる文字表示デバイスです。数字や簡単なアルファベットを表示できるため、お手軽な文字ディスプレイとして広く普及しています。
液晶タイプなどもありますが、発光して見やすいこと、コストが安い点から数を増やし易い点をかんがみ、今回のディスプレイ用のデバイスとしては、LEDタイプを使うことにしました。
このデバイスは、単純に棒状のLEDをセットしたものなので非常に安価で、1桁~8桁程度のものが、数百円で手に入ります。
基本は7本のLEDの点灯ですが、デジタル的に8がひとつの区切りだと便利なため、8つめにピリオドを追加した、以下の様なデバイスが良く使われます。
正攻法では配線が大変
さてこの7セグメントLED(7セグLED)ですが、制御の原理は簡単で、各LEDへの通電により制御します。
原理は簡単ですが、このために、8本プラス共通電源/アース線が必要で、1桁でも9本の配線が必要になってしまいます。各配線に抵抗器も必要ですので、表示桁数を増やすと、正攻法で配線すると、ケーブルだらけになるという欠点があります。
これをラズベリーパイなどのマイコンにつないで制御したい場合は、配線先のピンが足りなくなってしまいます。また、LEDに一度に通電すると扱う電力量が大きくなりすぎ、マイコンが焼けてしなう恐れがあります。
ドライブ用IC
こうした欠点を補い、工作を簡易にするためには、ドライバICがよく使われます。
ドライバICは、7セグLEDとマイコンの間に入って信号の仲立ちをし、マイコンから受けた簡単な信号に応じて、7セグLEDの各LEDをオン・オフするICです。
「MAX7219」はこうしたICの一つで、マキシム社から発売されている、7セグメントLED表示用のICです。7セグメントLEDをアース側で共通配線(カソードコモン)することで、8桁までの7セグLEDを制御できます。
このICを使うと、以下の様に、マイコンとの間で3本の配線を介した信号を送るだけで(SPI配線といいます)、8桁までの7セグメントLEDを灯させることができるので、マイコンの使用ピンが大幅に節約できます。
また、点灯時はダイナミック点灯するので、大きな電流によりマイコンが焼ける心配もありません。ダイナミック点灯とは、総電力量を抑えるため、個々のLEDを非常に速い速度で1ケずつ点灯させることです。
目にもとまらない速さで個々のLEDを点灯させるため、人の目には、各LEDが一斉点灯している様に見えますが、ある瞬間ではあくまで1ケしか点灯していないため、何桁ものLEDを点灯させても総電力量が増えないメリットがあります。
MAX7219と8桁の7セグメントLEDを一体で実装したデバイスを使うと、ICと7セグLEDの配線も不要になり、工作が非常に簡易になります。
裏側中央にICがあります。
さらに素晴らしいのは、このIC同士を数珠つなぎにつなぐ(カスケード接続といいます)と、3本の配線を使って8桁単位で信号を送るだけで、容易に表示何桁を増やせることです。
ちょっとした悩み~ラズベリーパイPicoW用のC言語用ライブラリがない
MAX7219はよく知られたICですので、マイコン用のライブラリもネット上に多数みつかります。
ライブラリPicoW用のライブラリも当然多数あり、こうしたライブラリを使うこたおで、関数に文字を代入するだけで、簡単にディスプレイ用のプログラムを書くことができます。
ArduinoIDEで、ラズパイPicoW用のライブラリが無い
ところが、ここで困ったことがあります。
ラズベリーパイPico W用のライブラリの殆どは、MicroPythonなどPython言語用のもので、今回の開発環境である、ArduinoIDE上で扱えるC言語用のものが見つからなかったことです。
今回、HTTPSへアクセスしてクライアントとして通信をするために、ArduinoIDEで開発しています。
この環境で使える、ラズベリーパイPico W用のライブラリが見つからなかったことです。
そこで、やむなく、SPI接続したMAX7219に、ライブラリなしに直接ビットデータを送ることで表示させることにしました。
ライブラリなしにSPI配線を介してビットデータを送る
今回、ラズパイPico WとMAX7219とは、SPI配線という3本の配線で通信しています。(ラズパイ⇒MAX7219の方向のみ)
それぞれの配線には、以下の役割があります。(MAX7219側からの視点です)
・チップ・セレクト(CS)・・・LOWになると通信開始の合図とみなす
・クロック(CLK)・・・1ビット分の通信速さを知る
・データ・イン(DIN)・・・0か1のビットデータを受ける
使用する標準関数
今回、ライブラリを使わないで、ラズパイからMAX7219に信号を送るには、ArduinoIDEで標準関数である、digitalWrite()関数、およびshiftOut()関数を利用します。
これらの関数は、以下の様に使います。
①digitalWrite(CSピン番号, LOWまたはHIGH)
⇒CSピンの電位をLOWまたはHIGHにする。
②shiftOut( DINピン番号, CLKピン番号, MSBFIRST※, ビットデータ );
⇒DINピンにビットデータをセットする。
※MSBFIRST:データのモードで他にLSBFIRSTが選べます。
この①②の関数を使って、以下の手順で通信します。
標準関数を使った通信の手順
8桁の7セグ表示について以下の4ステップで信号を送ります。
①通信開始:digitalWrite(CSピン, LOW)
CSピンをLOWにすることで、MAX7219に通信の始まりを知らせます。
②モード指定:
shiftOut( DINピン, CLKピン, MSBFIRST, 0x09 );
shiftOut( DINピン, CLKピン, MSBFIRST, モード );
データモードを知らせます。
モードには、0xFF(コード指示)、0xFF(ビット指示)、0x0Fや0xF0(4桁ずつ混合)を選べます。ピリオドを含んだ文字はビット指示でないと表示できません。
・コード指示:0~9と若干の文字を0~15で指示する方法
・ビット指示:8つのLEDのオン/オフを16進数で指示する方法
③表示桁と文字の指定:
shiftOut( DINピン, CLKピン, MSBFIRST, 桁位置 );
shiftOut( DINピン, CLKピン, MSBFIRST, コード/ビット );
・桁位置:1~8で右からの桁位置を指定します。
・コード/ビット:表示文字のコードまたはビットです。
④通信終了:digitalWrite(CSピン, HIGH)
CSピンをHIGHにすることで、MAX7219に通信の終わりを知らせます。
複数のMAX7219をカスケード接続した場合の通信
複数のMAX7219をカスケード接続した場合は、下流側(ラズパイから遠い側)⇒上流側(近い側)の順で、上記の②③ステップを繰り返します。これらは、必ずセットである必要があります。
例えば、2ケのカスケードであれば、必ず2つずつ送信します。
②下流側モード指定⇒②上流側モード指定
③下流側の桁と文字⇒③上流側の桁と文字
ArduinoIDEでの実際のコード
実際のコードは以下の様になります。(抜粋)
まず、文字のモードを指定します。
//チップセレクトをオン(LOW)
digitalWrite( LOADpin, LOW );
//下流側の表示モードを指定開始
shiftOut( DINpin, CLKpin, MSBFIRST, 0x09 );
//下流側の表示モード
shiftOut( DINpin, CLKpin, MSBFIRST, モード );
//上流側の表示モードを指定開始
shiftOut( DINpin, CLKpin, MSBFIRST, 0x09 );
//上流側の表示モード
shiftOut( DINpin, CLKpin, MSBFIRST, モード );
//チップセレクトをオフ(HIGH)
digitalWrite( LOADpin, HIGH );
続いて、表示桁と表示文字を指定します。
//チップセレクトをオン(LOW)
digitalWrite( LOADpin, LOW );
//下流側の桁位置を指定
shiftOut( DINpin, CLKpin, MSBFIRST, 桁位置 );
//下流側の文字信号を送る
shiftOut( DINpin, CLKpin, MSBFIRST, 文字 );
//上流側の桁位置を指定
shiftOut( DINpin, CLKpin, MSBFIRST, 桁位置 );
//上流側の文字信号を送る
shiftOut( DINpin, CLKpin, MSBFIRST, 文字 );
//チップセレクトをオフ(HIGH)
digitalWrite( LOADpin, HIGH );
以上のコードを繰り返すことで、ライブラリなしで文字を表示させることができます。
実際には何行かのコードを関数化して使い回します。
ここで一旦切って、次の記事では、7セグメントLEDの配線について、ご紹介します。