前回、ラズパイピコについて取り上げた。550円という衝撃の安さでありながら、さまざまなセンサーをつなげてPCから利用できることを紹介した。とは言え、前回は動作確認で終わってしまったので、今回は、実際に電子部品をつなげて電子工作に挑戦してみよう。実際の利用例として、光センサーをピコにつなげて照明のオンオフを判定するプログラムを作ってみよう。

  • ラズパイピコに光センサーに接続したところ

    ラズパイピコに光センサーに接続したところ

電子工作はプラモデルより簡単

さて、まずは今回作成した電子工作の全貌を紹介しよう。ブレッドボードに、ラズパイゼロ、光センサー、抵抗、LEDを差し込んで、ジャンパーワイヤで接続した。次の写真で見ると分かる通り、非常に簡単なものだ。

  • ラズパイゼロに光センサーをつなげて作った

    ラズパイゼロに光センサーをつなげて作った

以下が光センサーをラズパイピコにつなげるために今回用意した部品だ。値段は原稿執筆時点の価格なので実際には多少前後する。

名前 値段 役割
Raspberry Pi Pico 550円 PCとセンサーを接続
CdSセル (5mm) 30円 光センサー
ブレッドボード 200円 ピコやセンサーを差し込む
ピンヘッダ 35円 ピコにピンをつける
ジャンパーワイヤー(60本) 220円 ブレッドボードとセンサーを接続
抵抗(10kΩ)(100本) 100円 抵抗
赤色LED 15円 LED

これらを全部新規で揃えたとしても1150円だ。しかもブレッドボードやジャンパーワイヤー、LED、抵抗などは汎用的なもので他の工作にも使える。

電子部品をピコと接続しよう

部品を揃えたら接続していこう。以下の図が、今回作成する工作の接続図だ。線を三本つないで、あとは光センサーと抵抗、LEDを差し込むだけの簡単なものだ。

  • 光センサーをつなげる接続図

    光センサーをつなげる接続図

とは言え、上記の図だけでは分かりにくいと思う。ゆっくり慌てず、以下の手順で接続していこう。

  • (1) ピコのUSBポートがある側を上とする。右側上から3番目(38番ピン:GND)とブレッドボードの空いている場所をジャンパイヤーでつなげて、同じ列に抵抗を差し込む。
  • (2) 抵抗のもう一方の足とLEDの足の短い方(マイナス)を同じ列に差し込む。
  • (3) LEDの足の長い方(プラス)と光センサーを接続。
  • (4)光センサーのもう一方の足とピコの右側上から5番目(36番ピン:3V3)をジャンパワイヤで接続。
  • (5)抵抗とLEDをつなげた列(上記の2)にジャンパワイヤを挿し、それをピコの右側上から7番目(34番ピン:ADC2)に接続する。

ちょっと冗長に書いたので、もう少し単純にすると次のようになる。

  1. ピコの38番ピン(GND) → 抵抗
  2. 抵抗 → LED足の短い方(マイナス/カソード)
  3. LED足の長い方(プラス/アノード) → 光りセンサーCdSセル
  4. CdSセル → ピコの36番ピン(3V3)
  5. ピコの34番ピン(ADC2) → (上記2)

わずか5ステップだ。しかも、今回見栄えが良くなるようにLEDを入れたが、LEDは省略しても差し支えない。このように電子工作はプラモデルよりも簡単だ。

なお、ピコのピン番号は、左上から左下へと1番、2番、3番と数えていき、右下から右上へ21番、22番、23番と数える。時計回りにピンの番号が増えていくと覚えよう。ラズパイのピンに割り振られている機能については、こちらのPDFを参照すると良いだろう。

  • ラズパイピコのピン番号と機能について

    ラズパイピコのピン番号と機能について

部品をつなげたら試してみよう

なお、ラズパイピコとPCが接続されている状態だとLEDが光っていることだろう。そして、光センサー(CdS)に手をかざして光りを遮ってみよう。すると、LEDの光が暗くなる。

つまり、この光センサーの働きは、光を当てるとCdSセルの抵抗値が下がり(電流がよく流れ)、光を遮ると抵抗値が上がり暗くなる(電流を通さなくなる)というものだ。つまり、ラズパイピコ側では電流がどれだけ流れているかを調べることで、部屋の明るさが分かるということになる。

Pythonのプログラムを書いてみよう

組み立てた部品がうまく動いているのが分かったら、次にMicroPythonのプログラムを作ってみよう。なお、前回の手順通りに、ラズパイピコにMicroPythonをセットアップし、またVisual Studio CodeにPico-Goの拡張機能もインストール済みであることを前提にする。

それでは、ラズパイピコで動かすプログラムを作ってみよう。Visual Studio Codeで新規ファイルを作成し、以下のプログラムを記述してみよう。

import machine, time

# ADC2 の値を調べる
sensor_adc2 = machine.ADC(2)
# 繰り返し調査
while True:
    time.sleep(1)
    v = sensor_adc2.read_u16()
    print(v)

上記のプログラムを「sensor.py」などの名前で保存したら、Pico Consoleを表示して、ピコの接続し、プログラムを実行しよう。

  • 光センサーの値がコンソールに表示されたところ

    光センサーの値がコンソールに表示されたところ

そして、部屋の照明を点けたり消したりして、センサーの値がどのように変化するか観察してみよう。筆者の環境で試したところ、照明が点いているときは、380から400の値、消えているときは、280から310の値が表示された。もちろん、試した環境や条件によって異なる値が表示されるはずだ。

ラズパイピコの値をPCで読んでみよう

以上でラズパイピコのプログラムは完成だ。次に、PCからラズパイピコの値を読んでみよう。これによって、PCでセンサーの値を記録したり、値に応じてメールやLINEでアラート通知を送ることができる。

ピコで出力したデータをPCで受け取るには、pyserialというライブラリを使う。PC側のコマンドライン環境(WindowsならPowerShell、macOSならターミナル.app)で、以下のコマンドを実行してライブラリをインストールしよう。

$ python3 -m pip install pyserial

PCによって、シリアル通信のポート名が異なる。次の方法でポートを調べよう。

Windowsの場合、設定のデバイスマネージャーを開き、USBシリアルデバイスのポート名(例えば、COM3やCOM4など)を調べよう。筆者の環境ではCOM4が表示された。

  • USBシリアルデバイスのポート名を調べよう

    USBシリアルデバイスのポート名を調べよう

macOSの場合、ターミナルで「ls /dev/tty.*」と実行してみよう。すると「/dev/tty.usbmodem141101」のような値が表示される。このように「usbmodem」を含む名前がラズパイピコのポート名だ。

このようにして、ポート名が分かったら、プログラムを実行してラズパイピコから値を取得しよう。以下のプログラムを「pc_receive.py」という名前で保存して実行してみよう。なお、二カ所書き換えが必要となる。まず、照明の点灯と消灯を判別するしきい値(*1)と、ポート名を指定している(*2)だ。

import serial

# 照明のオン・オフによるしきい値 --- (*1)
light_on = 330
light_off = 290
msg = ""

# ポートを指定してピコに接続する --- (*2)
ser = serial.Serial('COM4', 115200, timeout=1)

try:
    while True:
        # pico からデータを読む
        data = ser.readline()
        # データを文字列に変換
        s = data.decode().strip()
        if s == '': continue # うまく読めなかったとき
        v = int(s)
        # 結果を表示
        print("read:", v)
        if v > light_on:
            if msg != '点灯':
                msg = '点灯'
                print("照明が点灯しました") # --- (*3)
        elif v < light_off:
            if msg != '消灯':
                msg = '消灯'
                print("照明が消灯しました") # --- (*4)
except:
    # picoとの接続を閉じる
    ser.close()

コマンドラインで「python3 pc_receive.py」とタイプしてプログラムを実行してみよう。その際、Visual Studio CodeのPicoコンソールが繋がったままだとPicoと繋がらないので、Visual Studio Codeを閉じてから実行しよう。そして、照明をオンオフして点灯と消灯が正しく判別できているか確認してみよう。

  • ラズパイピコからの値を受信して照明の点灯と消灯を判定しているところ

    ラズパイピコからの値を受信して照明の点灯と消灯を判定しているところ

なお、用途に応じてプログラムの(*3)と(*4)の部分をメールやLINEの通知処理に書き換えることで、より実用的なプログラムになるだろう。

会議室や何かしらの施設の利用状況を把握するためにログを取ったり、リアルタイムで施設が使われているかどうかを確認するのに利用できるだろう。会議室が比較的遠い場所にあり、利用状況が分からず困っているという場合に、このシステムを導入すれば便利だろう。

まとめ

以上、ラズパイピコに光センサーをつなげて、照明の状態をモニタリングするプログラムを作ってみた。電子部品は一つ一つが安価なので、必要に応じて買い足すことができるのが良いところだ。好きな部品を少しずつ集めていくのも楽しいだろう。ラズパイピコとPythonで、これまで以上に電子工作が手軽になった。ちょっとしたアイデアで生活を便利にするガジェットを自作できるので、これを機会にはじめてみよう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。