
Raspberry Pi Picoで電子工作を始めてみた。LEDの点灯からモールス信号の送信まで
自分で書いたプログラムで現実のものを動かす
最近、電池やモーター、半導体などについて学んでいる。
きっかけの一つは、イーロン・マスクの伝記を読み、電気自動車やロボットなどのものづくりに興味を持ったことだった。
これまでは本を読んだり、動画を見たりして、技術の仕組みを理解することが中心だった。しかし、次第に自分でも何かを作ってみたいと思うようになった。
そこで購入したのが、Raspberry Pi Pico 2 Wという小さなマイコンボードだ。
今回は、このPicoを使って初めて電子工作に挑戦した記録を残しておこうと思う。
最初はLEDを光らせるだけだった。それが、点滅するようになり、スイッチで制御できるようになり、最後にはモールス信号でSOSを送信するところまで進んだ。
Raspberry Pi Picoのセットアップ
まず取り組んだのは、Raspberry Pi公式サイトに公開されている初心者向けレッスン「LED Firefly」だ。
Fireflyは日本語でホタル。LEDをホタルのように点滅させる電子工作である。
最初に、MacBookへ接続したPicoにMicroPythonをインストールした。
MicroPythonは、マイクロコントローラー上で動作するPythonの実装だ。通常のPythonと似た書き方で、LEDやセンサーなどの電子部品を制御できる。
プログラムを書くためには、Thonnyという開発環境を使用する。
セットアップが完了したところで、最初のプログラムを実行してみた。
print("Hello, Pico!")画面に「Hello, Pico!」と表示された。
この時点では、まだ電子工作らしいことは何もしていない。しかし、重要なのは、このプログラムを実行しているのがMacではなく、Pico自身だということだ。
Macでプログラムを書き、USBケーブルを通じてPicoに実行させる。
つまり、Picoは単なるパソコンの周辺機器ではなく、それ自体がプログラムを実行する小さなコンピューターなのである。
最初にラズパイPico本体のLEDを光らせる
次に挑戦したのは、Pico本体に搭載されているLEDの点灯だ。
Picoには小さなLEDが内蔵されている。これは、マイコンが正常に動作しているかを確認したり、プログラムの状態を表示したりするために利用できる。
電子工作の世界では、LEDを点滅させることを「Lチカ」と呼ぶらしい。
LEDがチカチカするから、Lチカ。
プログラミングでいう「Hello, World!」のような存在だ。
今回使用したのは、電子部品の制御を簡単にしてくれる「picozero」というライブラリである。
from picozero import pico_led
from time import sleep
pico_led.on()
sleep(1)
pico_led.off()このコードを実行すると、Pico本体のLEDが1秒間だけ点灯して消える。
pico_led.on() でLEDを点灯させ、sleep(1) で1秒間待機し、pico_led.off() で消灯する。
仕組み自体は非常に単純だ。

しかし、緑色のLEDが実際に光ったときは、思わず嬉しくなった。
これまで画面の中で文字や数字を処理していたPythonが、物理的な電子部品を動かしている。
ソフトウェアとハードウェアがつながった瞬間だった。
初めて電子回路を組み立てる
次はいよいよ、Picoの外側にLEDを接続する。
ここからが本格的な電子工作だ。
必要なのは、LED、抵抗、ジャンパーワイヤー、そしてブレッドボードである。
ブレッドボードとは何か
ブレッドボードは、はんだ付けをせずに電子回路を組み立てられる道具だ。
白い板にたくさんの穴が並んでいて、電子部品やワイヤーを差し込むことで回路を作れる。
面白いことに、Breadboardという名前は、もともとパンを切るための木製の板を電子回路の実験に利用していたことに由来するらしい。
現在のブレッドボードでは、穴の内部に金属の接点があり、同じ列の穴が電気的につながっている。
そのため、部品の金属脚を同じ列に差し込むだけで接続できる。
最初はどの穴がつながっているのか理解するのに少し苦労したが、構造が分かると非常に合理的な道具だと思った。

なぜLEDには抵抗が必要なのか
今回使用したのは赤色LEDと220Ωの抵抗だ。
LEDはLight Emitting Diode、つまり発光ダイオードである。
以前、半導体について学んだ際に、LEDは電子と正孔が再結合するときに光を放出することを知った。
今回は、そのLEDを実際に使ってみる。
ただし、LEDを直接Picoの出力端子に接続するのは危険だ。
LEDに過大な電流が流れると、LEDやPicoが故障する可能性がある。
そこで、電流を制限するために抵抗を直列に接続する。
PicoのGPIO出力はHIGHのとき約3.3Vになる。赤色LEDの順方向電圧を約2.0Vと仮定すると、220Ωの抵抗に流れる電流はオームの法則から次のように計算できる。
I = (3.3 − 2.0) / 220 ≒ 0.0059A
つまり、約5.9mAである。
こうして、以前学んだ電圧、電流、抵抗の関係が、実際の回路設計に結びついた。
GP13からLEDを光らせる
今回はPicoのGP13という端子を使った。
GPIOはGeneral Purpose Input/Outputの略で、プログラムによって入力や出力に利用できる端子である。
LEDの回路は次のように接続した。
GP13 → 220Ω抵抗 → LEDのプラス側 → LEDのマイナス側 → GND
LEDには極性があるため、一般的な2本脚のLEDでは長い脚をプラス側、短い脚をマイナス側に接続する。
GNDは電圧の基準となる0Vの端子だ。
GP13をHIGHにすると、GNDとの間に電位差が生まれ、抵抗とLEDを通って電流が流れる。
実際に書いたコードは、わずか数行だった。
from picozero import LED
firefly = LED(13)
firefly.on()プログラムを実行すると、赤色LEDが光った。

これは本当に感動した。
自分で抵抗の金属脚を曲げ、ブレッドボードに差し込み、ジャンパーワイヤーで回路をつないだ。
最初は配線が正しいのか不安だったが、LEDが光った瞬間、自分の作った回路が機能していることを実感できた。
知識として理解していた電気回路が、目の前で実際に動いたのである。
スイッチを追加してLEDを制御する
次は、LEDを外部から操作できるようにする。
それまでは、PicoからLEDに電気信号を出力するだけだった。
今度はPicoに入力を与える。
使用したのは、2本のジャンパーワイヤーだ。
2本のワイヤーを接触させれば回路が閉じ、離せば回路が開く。これだけで簡単なスイッチになる。
今回はGP18を入力端子として使用した。
GP18とGNDをワイヤーで接続し、その状態をプログラムで読み取る。
from picozero import LED, Switch
from time import sleep
firefly = LED(13)
switch = Switch(18)
while True:
if switch.is_closed:
firefly.on()
sleep(0.5)
firefly.off()
sleep(2.5)
else:
firefly.off()
sleep(0.1)ワイヤーを接触させるとLEDが点滅し、離すと点滅が止まる。
ここで面白かったのは、スイッチを閉じるとGPIOの入力がLOW、つまり0になることだ。
これは内部のプルアップ抵抗を利用しているためである。
スイッチが開いているときは入力がHIGHとなり、GNDにつなぐとLOWになる。
最初は少し直感に反するが、電位差の仕組みを考えると納得できる。
そして今回、電子機器の基本的な構造を実際に作ることができた。
入力 → 処理 → 出力
スイッチから入力を受け取り、Picoのマイコンがプログラムに従って判断し、LEDを制御する。
考えてみれば、温度センサーでファンを動かす装置も、ボタンでモーターを動かすロボットも、基本的にはこの構造を発展させたものだ。
Lチカから通信へ。LEDでSOSを送信する
ここまでで、LEDの点灯、点滅、スイッチ制御ができるようになった。
そこで、少し発展させてモールス信号を作ってみることにした。
モールス信号は、短点(・)と長点(-)を組み合わせて文字を表現する通信方式だ。
例えば、SOSは次のように表現される。
S:・・・
O:---
S:・・・
これをLEDの点滅によって再現してみる。
短点を0.2秒の点灯、長点を0.6秒の点灯とした。
from picozero import LED
from time import sleep
led = LED(13)
def dot():
led.on()
sleep(0.2)
led.off()
sleep(0.2)
def dash():
led.on()
sleep(0.6)
led.off()
sleep(0.2)
while True:
# S
for i in range(3):
dot()
sleep(0.4)
# O
for i in range(3):
dash()
sleep(0.4)
# S
for i in range(3):
dot()
sleep(1.4)今回は、新しく関数を定義するdefも使用した。
短点を表すdot()と長点を表すdash()を作っておけば、それぞれの点灯処理を何度でも呼び出せる。
また、for文を使うことで、同じ信号を3回ずつ繰り返せる。
そして実行すると、赤色LEDが、
短く3回、長く3回、短く3回。
SOSのパターンで点滅し始めた。
光が情報に変わる瞬間
今回、最も面白いと思ったのはここだ。
最初にLEDを光らせたとき、LEDには点灯と消灯という2つの状態しかなかった。
しかし、点灯時間と順番にルールを与えることで、同じLEDが文字を表現できるようになった。
電子回路は何も変えていない。
変更したのはプログラムだけである。
それなのに、単に光るだけだった部品が、情報を伝える装置になった。
もちろん、今回作ったものは非常に単純な光通信だ。
しかし、物理的な信号に規則を与えることで情報を表現するという考え方は、デジタル通信にも通じる。
今まで何気なく使ってきた情報通信技術も、根本的にはこうした仕組みの積み重ねによって成立しているのだろう。
おわりに。小さなLEDから、ものづくりを始める
今回、Raspberry Pi Pico 2 Wを使って、初めて本格的な電子工作に挑戦した。
最初はPico本体のLEDを光らせるだけだった。
そこから、外付けLEDの回路を組み立て、スイッチを追加し、最後にはモールス信号でSOSを送信するところまで進んだ。
使った部品は、LED、抵抗、ジャンパーワイヤー、ブレッドボード程度だ。
それでも、自分で組み立てた回路がプログラムによって動くという経験には、想像以上の面白さがあった。
特に印象的だったのは、ハードウェアを変更しなくても、ソフトウェアによって動作を自由に変えられることだ。
同じLEDでも、点灯時間を変えればホタルになり、パターンを変えればモールス信号になる。
これが、プログラムで電子機器を制御することの面白さなのだと思う。
今後は、モーターやセンサー、OLEDディスプレイなどにも挑戦してみたい。
いつかは、自分で考えた電子機器を設計し、実際に使えるものとして形にしたい。
もちろん、そこまでの道のりはまだ長い。
しかし、今回の経験によって、これまで本や動画で学んできた知識が、実際のものづくりにつながり始めた。
最初は小さなLEDの光だった。その光が、今度はSOSという情報を伝え始めた。
この小さな一歩から、少しずつ作れるものを増やしていきたい。