見出し画像

【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の中央の配線とを直結します。抵抗もなにもない、ただ配線するだけ!

今回の用途では誤作動があってもどうという事はないので、こちらで配線する事にしました。

この方法は、信号の電圧が低いため、LEDが意図しない光り方をする場合があります。(ノイズと区別がつかない場合がある為)

シンプルな配線方法

上記のシンプルな方のやり方では、配線は以下の様になります。

NeoPixelの3本のケーブルの接続先:
・中央(信号線)・・・ラズベリーパイのGPIOピン
・➡の印刷が「ない」側(5V電源線)・・・5V電源の+
・➡の印刷がある側(アース線)・・・ラズパイのGNDと、5V電源のー

電源の+をつなぐ側に確信が持てない方は、製品の端をみてください。元から取りついている配線のカバーを向くと、電源のプラス側には小さく「+5V」と印刷があります。

写真の右上に「+5V」という文字があります。これが電源+の接続先。



5V電源は、LEDが数個の場合を除き、ラズベリーパイの5Vピンからではなく、外部電源を使う様にします。これは、70灯ものLEDが光ると許容値を超えるほどの大きな電流が流れるからです。

具体的には、携帯電話の5V充電器に、以下の様に、片側が導線になったケーブルをつないで利用する等します。



補足として配線についての注意事項をメーカーのWEBページから抜粋します。

Do not power more than a few NeoPixels from the Raspberry Pi's 5V output! The Pi cannot source enough current to light many pixels and will be damaged. Use a good quality external 5V power supply that can handle the current demands of all the pixels.

ラズベリーパイの5V出力から数個以上のNeoPixelに給電しないでください! ラズベリーパイからは多数のピクセルを灯せるだけの電流を流すことはできず、破損してしまいます。 すべてのピクセルに必要な電流が供給可能な高品質の外部5V電源を使用してください。

 なお、信号線につなぐラズベリーパイのピンは、いくつか選べる※のですが、今回はPWM0ピン(18番ピン)から配線する事にします。
(※I2C接続というデータの通信が可能なピンに限定しています)

実際の配線

では実際に配線しましょう。

冒頭に断りました様に、ここではラズベリーパイ Zero WHを利用し、以下の様に配線します

NeoPixelとラズベリーパイZero WHの配線
配線図におけるラズベリーパイZero WHの向き


抵抗などの余計な電子部品が無く、非常にシンプルです!

なお、外部の5V電源から意図しない電流が流れない様(うっかり+とーをショートするなど)、配線中は充電器をオフ(コンセントに挿さない)にしておきます。

以上で配線は終わりました!

ラズベリーパイ側のプログラムの準備(1)~メーカーが提供するライブラリを導入する~

配線が済んだら、ラズベリーパイ側のプログラムの準備をしましょう。

プログラムはここではPythonを利用します。

注意)プログラムを動かすまでは、外部の5V電源はオフにしておいてください。

プログラムについてもこのメーカーのサイトに実装方法が紹介されていますので、これを参照します。

Python Usage(Pythonでの利用方法)

上記の記事に従って、まずメーカーが提供するライブライを導入します。

You'll need to install the Adafruit_Blinka library that provides the CircuitPython support in Python.This may also require verifying you are running Python 3.

・・・・
Once that's done, from your command line run the following command:

Python用に提供しているサポート「CircuitPython」のための、「Adafruit_Blinkaライブラリ」をインストールする必要があります。場合によては、Python3が実行されていることの確認も必要です。
・・・
確認したら、コマンドラインから次のコマンドを実行します。

sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
sudo python3 -m pip install --force-reinstall adafruit-blinka

進行状況を知らせる文字がターミナル画面に流れ、しばらくすると終了します。終了したら導入は完了です。

ラズベリーパイ側のプログラムの準備(2)~デモプログラムでテスト点灯させる~

メーカーの記事を引き続き引用します。

Run the following code to import the necessary modules and initialise a NeoPixel strip with 30 LEDs. Don't forget to change the pin if your NeoPixels are connected to a different pin, and change the number of pixels if you have a different number.

次のコードを実行して必要なモジュールをインポートし、30個のLEDでNeoPixelストリップを初期化します。 NeoPixelsが別のピンに接続されている場合はピンを変更し、別のピンを使用している場合はピクセル数を変更することを忘れないでください。

ラズベリーパイで標準でインストールされている、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給電した状態で、ターミナルから以下のコマンドを打ち込みます。

sudo python3  /home/pi/test.py

以下の様に光れば成功です!

テスト点灯(メーカーのサイトより)

補足)上記手順では、ルート権限者としてPythonを実行(sudo)しています。(メーカーの記事によるとルート権限者でないとライブラリは動かない様です。Geany Ppython などの開を発ソフトからは、ルート権限者として実行できないため、エラーとなります)

For NeoPixels to work on Raspberry Pi, you must run the code as root!

NeoPixelsをラズベリーパイで動作させるには、コードをルート権限者として実行する必要があります!

なおレベル・シフタを使用しない回路なので、信号がうまく伝わらなくてLEDの色が正しく点灯しない等の症状がでる場合もあります。(だいたい最後のLEDで発生します)


テストが終わったら外部電源をオフにしておきましょう。

ラズベリーパイ側のプログラムの準備(3)~棒グラフ掲示板用のプログラムの準備する~


テストが終わって働く事が確認できたら、引き続き棒グラフ掲示板用のプログラムを実装します。

こちらに、メーカーがサンプルコードを挙げていますので、それを参考にしたのが以下のコードです。適当な名前(ターミナルから実行するので英数字だけのファイル名にしてください)でpyファイルとして保存します。

このプログラムにはGASにアクセスするコードがあり、以下の部分を、GASのプログラムが準備できたところで書き換える必要があります。

★GASのデプロイID★

コードの中身は、前半部分は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の部分でエラーになり停止します)

全点灯3色 → 赤の逐次点灯
続きです。最後の黄色いグラフ表示はまだできません。



以上で、ラズベリーパイ側の準備が終わりました。
次回の記事では、棒グラフ表示用のレスポンスを出すためのGASのプログラムをご紹介します。




この記事が気に入ったらサポートをしてみませんか?