見出し画像

【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で開発しています。

MicroPythonやCircuitPythonでは、サーバ通信または、HTTP(SSLなし)アクセスの事例しか見つかりませんでした。

この環境で使える、ラズベリーパイPico W用のライブラリが見つからなかったことです。

あるにはあるのですが、どうもArduinoUnoでしか実装できないタイプの様で、コンパイルしてみると動きませんでした。

そこで、やむなく、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(ビット指示)、0x0F0xF0(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の配線について、ご紹介します。

いいなと思ったら応援しよう!