【GASでIoT】PC画面のグラフ表示を「リアルタイム棒グラフ掲示板」で表してみよう(その4)~NeoPixelの配線とラズベリーパイ側のプログラム~
この記事は、IC付きのLEDが数珠つなぎになったNeoPixelを加工して、棒グラフ掲示板としたものを、ラズベリーパイに配線して使える様にするまでを記しています。
棒グラフ掲示板の作成は以下の記事をご覧ください。
今回の記事では、以下のサイトが参考になりました。この場をお借りして御礼申し上げます。
なお以下の記事では、特に断りがない限り、利用するラズベリーパイは「ラズベリーパイZero WH」とします。
NeoPixelを配線する~製造元(エイダ・フルーツ社:Adafruit)のサイトを参照する~
NeoPixelの製造元である、エイダ・フルーツ(Adafruit)社は、個人のホビー用途の製品や情報を沢山出しているメーカーです。この製品についても個人利用を念頭にした情報が会社のサイトにアップされています。
サイトの記事の中には、ラズベリーパイに配線して利用する方法も紹介されていますので、ほぼそのまま流用します。
上記のサイトに、配線についての説明記事があります。
Raspberry Pi Wiring(ラズベリーパイの配線)
推奨の配線:ノイズが入らず正確に制御できます
Raspberry Pi Wiring with Level Shifting Chip(レベル・シフタを用いた配線)
レベル・シフタというのは、制御信号の電圧を変える電子部品で、ここではラズベリーパイからの3Vの信号を5Vに変換する目的で使用しています。
NeoPixelの入力信号は本来5Vですのでこの様な措置が必要という訳です。
ただし、アマチュア向けに色々なノウハウも併せて掲載しているのがこのメーカーらしい点ですが、「レベル・シフタ無しに3V信号を直結しても、何とか動かす事はできます」という記事も掲載されています。
最低限何とか動く配線:誤作動の恐れはありますがシンプルです
Using External Power Source Without Level Shifting(レベル・シフタなしで外部電源を利用する)
この場合は、ラズベリーパイのGPIOピンとNeoPixelの中央の配線とを直結します。抵抗もなにもない、ただ配線するだけ!
今回の用途では誤作動があってもどうという事はないので、こちらで配線する事にしました。
シンプルな配線方法
上記のシンプルな方のやり方では、配線は以下の様になります。
NeoPixelの3本のケーブルの接続先:
・中央(信号線)・・・ラズベリーパイのGPIOピン
・➡の印刷が「ない」側(5V電源線)・・・5V電源の+
・➡の印刷がある側(アース線)・・・ラズパイのGNDと、5V電源のー
電源の+をつなぐ側に確信が持てない方は、製品の端をみてください。元から取りついている配線のカバーを向くと、電源のプラス側には小さく「+5V」と印刷があります。
5V電源は、LEDが数個の場合を除き、ラズベリーパイの5Vピンからではなく、外部電源を使う様にします。これは、70灯ものLEDが光ると許容値を超えるほどの大きな電流が流れるからです。
具体的には、携帯電話の5V充電器に、以下の様に、片側が導線になったケーブルをつないで利用する等します。
補足として配線についての注意事項をメーカーのWEBページから抜粋します。
なお、信号線につなぐラズベリーパイのピンは、いくつか選べる※のですが、今回はPWM0ピン(18番ピン)から配線する事にします。
(※I2C接続というデータの通信が可能なピンに限定しています)
実際の配線
では実際に配線しましょう。
冒頭に断りました様に、ここではラズベリーパイ Zero WHを利用し、以下の様に配線します。
抵抗などの余計な電子部品が無く、非常にシンプルです!
なお、外部の5V電源から意図しない電流が流れない様(うっかり+とーをショートするなど)、配線中は充電器をオフ(コンセントに挿さない)にしておきます。
以上で配線は終わりました!
ラズベリーパイ側のプログラムの準備(1)~メーカーが提供するライブラリを導入する~
配線が済んだら、ラズベリーパイ側のプログラムの準備をしましょう。
プログラムはここではPythonを利用します。
プログラムについてもこのメーカーのサイトに実装方法が紹介されていますので、これを参照します。
Python Usage(Pythonでの利用方法)
上記の記事に従って、まずメーカーが提供するライブライを導入します。
sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
sudo python3 -m pip install --force-reinstall adafruit-blinka
進行状況を知らせる文字がターミナル画面に流れ、しばらくすると終了します。終了したら導入は完了です。
ラズベリーパイ側のプログラムの準備(2)~デモプログラムでテスト点灯させる~
メーカーの記事を引き続き引用します。
ラズベリーパイで標準でインストールされている、Pythonのプログラム開発ソフト、Geany Ppythonなどを開いて以下のコードを打ちこみ、適当なファイル名(test.py など)で保存します。
import board
import neopixel
pixels = neopixel.NeoPixel(board.D18, 10)
pixels[0] = (255, 0, 0)
なお、上記で3行目、以下のコードでD18とあるのは、ラズベリーパイのピン番号 70とあるはLEDの個数です。
pixels = neopixel.NeoPixel(board.D18, 70)
また、上記で4行目、以下のコードで pixels[0]とあるのは,
最初のLEDを、255, 0, 0 とあるのは、赤、緑、青 の輝度を表します。
pixels[0] = (255, 0, 0)
電源線をつなぎ、5V給電した状態で、ターミナルから以下のコマンドを打ち込みます。
以下の様に光れば成功です!
補足)上記手順では、ルート権限者としてPythonを実行(sudo)しています。(メーカーの記事によるとルート権限者でないとライブラリは動かない様です。Geany Ppython などの開を発ソフトからは、ルート権限者として実行できないため、エラーとなります)
なおレベル・シフタを使用しない回路なので、信号がうまく伝わらなくてLEDの色が正しく点灯しない等の症状がでる場合もあります。(だいたい最後のLEDで発生します)
テストが終わったら外部電源をオフにしておきましょう。
ラズベリーパイ側のプログラムの準備(3)~棒グラフ掲示板用のプログラムの準備する~
テストが終わって働く事が確認できたら、引き続き棒グラフ掲示板用のプログラムを実装します。
こちらに、メーカーがサンプルコードを挙げていますので、それを参考にしたのが以下のコードです。適当な名前(ターミナルから実行するので英数字だけのファイル名にしてください)でpyファイルとして保存します。
コードの中身は、前半部分はLEDの点灯テスト、鋼鈑はGASから必要なレスポンスを受け、それに基づいてLEDを点灯するというものです。
細かい説明は、コメント欄を参照願います。
(英語のコメントは元のサンプルのものです)
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
#ーーーーーーーー利用モジュールの引用----------
#---WEBにリクエストを投じるためのモジュール
import requests
import sys
import time
import board
import neopixel
# On CircuitPlayground Express, and boards with built in status NeoPixel -> board.NEOPIXEL
# Otherwise choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D1
#---ラズベリーパイのピン番号を指定
pixel_pin = board.D18 #board.NEOPIXEL
# On a Raspberry pi, use this instead, not all pins are supported
# pixel_pin = board.D18
# The number of NeoPixels
#---LEDの数を指定
num_pixels = 70
# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed!
# For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW.
ORDER = neopixel.GRB
pixels = neopixel.NeoPixel(
pixel_pin, num_pixels, brightness=0.02, auto_write=False, pixel_order=ORDER
)
#ーーーーーーーーwhile文で無限ループーーーーーーーー
#---ループに入る
while True:
# Comment this line out if you have RGBW/GRBW NeoPixels
#---赤で全点灯(輝度を20段階で次第に上げる)
for i in range(20):
pixels.fill((i*5, 0, 0))
pixels.show()
time.sleep(0.05)
#---緑で全点灯(輝度を20段階で次第に上げる)
for i in range(20):
pixels.fill((0, i*5, 0))
pixels.show()
time.sleep(0.05)
#---青で全点灯(輝度を20段階で次第に上げる)
for i in range(20):
pixels.fill((0, 0, i*5))
pixels.show()
time.sleep(0.05)
#---赤で1灯ずつLEDの位置を変えて点灯(毎回全消灯)
for i in range(70):
pixels.fill((0, 0, 0))
pixels[i]=(50, 0, 0)
pixels.show()
time.sleep(0.2)
pixels.fill((0, 0, 0))
#---緑で1灯ずつLEDの位置を変えて点灯(消灯しないで追加点灯)
for i in range(70):
pixels[i]=(0, 50, 0)
pixels.show()
time.sleep(0.2)
#---全消灯
pixels.fill((0, 0, 0))
#---URLにアクセス|★GASのデプロイID★ は各自打ち換え
r = requests.get('https://script.google.com/macros/s/★GASのデプロイID★/exec?x=1')
print(r.text)
#---全消灯
pixels.fill((0, 0, 0))
#---黄色で1灯ずつ点灯の有無を判断し追加点灯(1なら点灯)
for i in range(70):
if r.text[i+1] == '1':
pixels[i]=(50, 50, 0)
pixels.show()
#---15分たったら全消灯し繰り返す
time.sleep(60*15)
pixels.fill((0, 0, 0))
外部電源をオンにしターミナルから実行させると、以下の様に、前半のデモ部分が実行されます。(後半のGASの部分でエラーになり停止します)
以上で、ラズベリーパイ側の準備が終わりました。
次回の記事では、棒グラフ表示用のレスポンスを出すためのGASのプログラムをご紹介します。
この記事が気に入ったらサポートをしてみませんか?