本文へ移動

はじめに:画面の外の世界へ

こんにちは。ラーニング事業本部 事業推進1部のRYOTAです。

前回の記事『React初心者がSpring Boot + ReactでSPA簡易アプリを作成してみた』では、Reactを使ったシングルページアプリケーション(SPA)の開発を通じて、ユーザーが操作できる「画面(UI)」を作る楽しさを知りました。しかし、画面の中で完結するWebの世界だけでは飽き足らず、私はふと、「画面の外の世界」、つまり物理空間へ干渉したいという強い欲求に駆られました。

Web開発の次は、物理的なフィードバックを得たい。具体的には、プログラムの実行結果を、画面上の文字ではなく、光や音などの物理現象として感じたいのです。 そこで今回は、電子工作の第一歩にして最大の登竜門、「Lチカ(LEDをチカチカ点滅させること)」に挑戦することにしました。

今回のミッション
Raspberry Pi(ラズパイ)とLEDを接続し、
Pythonプログラムから「光」を操作する。

Raspberry Piとは

電子部品を直接つなぎ、プログラミングで制御できる「手のひらサイズの安価なコンピューター」です。略称でラズパイと呼ばれています。なお、LinuxベースのOSが動くため、普段我々が触れているサーバーサイドの知識も活かせるのが大きな特徴です。

なぜ「Lチカ」なのか?

一見すると、「たかがLEDを点滅させるだけ」と思うかもしれません。しかし、これは電子工作における「Hello, World!」にあたる、第一歩としての非常に重要な儀式なのです。

Lチカの意義

1.物理的な「出力」の理解
画面への print("Hello") ではなく、電圧の制御によって現実世界に変化を起こす体験が得られます。これは、Web開発で言えば、ブラウザに初めて文字が表示された時の感動に近いものがあります。

2.回路の基礎
電源、GND、抵抗、配線といったハードウェアの基礎知識がないと、光らせることすらできません。

3.ソフトウェアとハードウェアの融合
つまり、書いたコードが物理デバイスを動かす瞬間を体験できるのです。

今回は余計な機能は一切盛り込まず、あえてシンプルにこの「Lチカ」の成功だけを最終目標としました。

準備する物(スターターキットが便利!)

電子工作を始めるにあたり、何を買えばいいのか悩みましたが、結論として今回はネットで「Raspberry Pi本体」と「工作グッズが入っているスターターキット」を購入しました。 

Raspberry Pi本体

スターターキット

なぜなら、この2つでラズパイ本体とLED、抵抗、ブレッドボード、配線用ケーブルなどが一通り揃うので、初心者には非常におすすめだからです。 例えるなら、スターターキットはWeb開発で言うところの create-react-appSpring Initializr のようなものです。環境構築の手間を省いて「作りたいもの」に集中できる環境を整えることは、新しい学習を挫折しないための重要な戦略と言えるでしょう。

今回使用するハードウェア

部品名役割/注意点
Raspberry Pi今回の頭脳。今回は4 Model Bを使用します。
ブレッドボード電子部品の回路を、ハンダ付けなしで一時的に配線するための板。
ジャンパーワイヤ部品同士を接続する導線。「オス-メス」 タイプが必要です。
LED目的の光を出す部品。今回はテストのため単色の赤色LEDを使います。
抵抗器これがないと電流が流れすぎてLEDが焼き切れてしまいます。220Ω〜330Ω程度のものを用意します。

ソフトウェア/サービス

ソフトウェア/サービス名役割/注意点
Raspberry Pi OSラズパイを動作させるためのOS。
Python (gpiozero)従来よりも直感的に書ける、最新の公式ライブラリを使用します。

最初の壁:ピン配置がわからず大苦戦

意気揚々とキットを開封したのは良かったのですが、ところがすぐに最大の壁にぶち当たりました。それは「物理配線」です。 ラズパイには40本ものピン(GPIO)がズラリと並んでいますが、「どのピンが何に対応しているのか」がなかなか理解できず、非常に苦戦しました。

配線図を見ながら「ここだ!」と思ってコードで指定したピンに刺しても、LEDはうんともすんとも言いません。「配線が間違っているのか? それともプログラムが悪いのか?」と疑心暗鬼になり、その結果、何度も繋ぎ直す羽目になりました。

補足:Webエンジニアのための「GPIO」解説

ここで一旦、この「ピン」について整理しておきましょう。 ラズパイに並んでいる剣山のようなピンは、専門用語で GPIO (General Purpose Input/Output) と呼ばれます。日本語にすると「汎用入出力」です。Webエンジニアに馴染みのある言葉で例えるなら、いわば「現実世界に向けたAPIエンドポイント」のようなものです。

General Purpose(汎用)特定の用途(例えばUSBやHDMI専用)に固定されておらず、「ここを入力として使うか、出力として使うか」をプログラム(ソフトウェア)側で自由に定義できるという意味です。
Input / Output(入出力)WebAPIのリクエストに GET(取得)や POST(送信)といった「種類」があるように、GPIOには信号の流れる「方向」という概念があります。具体的には、ラズパイ(チップ)側から見て、信号を出すか受けるかという方向を指します。
Input(入力)外からの信号を受け取る(例:ボタンが押されたことを検知する=リクエストを受け取る)
Output(出力)ラズパイから外へ信号を送る(例:LEDを光らせる=レスポンスを返す)

つまり、今回のLチカは、「特定のピン(エンドポイント)を『Outputモード』に設定し、そこへ電気を流すAPIを叩いている」 というわけです。こう考えると、少し親近感が湧いてきませんか?

解決策:わかりやすい「端っこのピン」を使う

GPIOの意味は理解できても、物理的な位置の特定は別問題です。「左から数えて6番目…いや7番目?」と数えているから間違えるのだと気づきました。 そこで今回は、数え間違いようのない「一番端っこ(角)のピン」を使う作戦に出ました。これなら絶対に間違えません。

今回使うピン(GPIO 21): ラズパイのUSBポート側にある、一番端っこのピン(物理番号40番) を使用します。

  • プラス側 (GPIO 21): 信号を送る線。外側の列の、一番右端(角)です。
  • マイナス側 (GND): 電気の出口。内側の列の、一番右端(GPIO 21の隣)を使います。

Webエンジニア的気づき

この「物理的な位置指定」の難しさを痛感したことで、ソフトウェアにおける「変数名」や「定数定義」のありがたみを再認識しました。マジックナンバー(物理的な位置)で管理するのではなく、論理的な名前で管理することの重要性は、ハードウェアの世界でも共通でした。

配線例

いざ、点灯! Lチカプログラムと「抽象化」の恩恵

確実な配線ができたら、いよいよコーディングです。 今回は、初心者でも扱いやすい gpiozero というライブラリを使用します。おかげで、驚くほどシンプルなコードで物理制御が可能です。

Lチカプログラム(Python)

from gpiozero import LED
from time import sleep

# GPIO 21番(物理ピン40番)を使う設定
# ※ 一番端っこのピンなので数え間違いがなくて安心です
led = LED(21)
print("Lチカを開始します")
while True:
    led.on()   # 点灯
    sleep(1)   # 1秒待つ
   led.off()  # 消灯
    sleep(1)   # 1秒待つ

このコードを実行し、ついにLEDがチカ...チカ...と1秒間隔で点滅をはじめました。 苦労した分、光った瞬間は嬉しかったです!

点灯の様子

ライブラリ解説:なぜ gpiozero を選んだのか?

ちなみに、ここで少し技術的な「モダン開発」の視点でお話しします。 実はラズパイの制御には、以前は RPi.GPIO という、より低レイヤー(ハードウェア寄り)な操作が必要なライブラリが主流でした。一方、今回採用した gpiozero は、それをラップして直感的に扱えるようにしたAPIです。

  • 旧来: ピンの電圧設定などを細かく記述する必要があった(手続き的)。
  • モダン (gpiozero): led.on() のように、「モノ」と「操作」に着目して書ける(オブジェクト指向的)。

Web開発において、生のSQLを書く代わりにORMを使ったり、DOM操作をReactに任せたりするのと同様に、「複雑な内部処理を隠蔽(抽象化)し、開発者がロジックに集中できるAPIを選ぶ」ことが、組み込み開発においても開発生産性を高める鍵だと実感しました。

まとめ:コードが物理現象になった瞬間

ただLEDが光っただけ。傍から見れば些細なことかもしれません。 それでも、自分が書いた数行のPythonコードが、ディスプレイの中だけでなく、現実世界の「光」として現れた瞬間、そこにはWeb開発とはまた違った感動がありました。

講師として日々「技術」を伝えていますが、新しい領域への挑戦は、私自身にとっても「初心者の気持ち」を思い出す大切なプロセスであると考えています。だからこそ、躓いたポイントや、解決した時の喜びを忘れずに、今後の講義にも活かしていきたいと思います。

クロノスでは色々な技術を一緒に学んでスキルアップしたい方を募集しています!
興味を持っていただいた方は、ぜひエントリーお願いします!

この記事を書いた人

ラーニング事業本部 事業推進1部 RYOTA

2023年に中途でクロノスに入社
普段はITスキルアカデミーの講師。
技術の習得を通して学習の楽しさを感じていただけるような研修づくりを目指して日々成長中。

おすすめ