+1 500 000 のオファーにある商品数
7000 個の小包が毎日発送されます
150 カ国からの +300 000 の顧客
発行日: 17-12-2025 🕒 12 分钟阅读
ラズベリーパイのシングルボードコンピューターが、電子工作の冒険を始めるための非常に便利な方法であるという話をよく耳にします。しかし、理論的なプログラミングの世界とプリント基板の世界は実際にどこで交わるのでしょうか?
準備はできていて、すぐにプログラミングを始めたい方はこちらへ。
ラズベリーパイコンピューターは教育用ツールとして開発されました。80年代の英国の「マイクロコンピューター」(コモドールやアップル製品に触発された)の例に倣い、設計上は低価格で幅広い適応性を提供することを目指していました。そしてその目標は達成されました。Zeroシリーズのラズベリーパイモデルは非常に手頃な価格であり、製造元および巨大なエンジニア・愛好家コミュニティが膨大な教育資料や支援ツール、ライブラリなどを提供しています。実際、ラズベリーパイでスキルを磨くために必要なのは熱意とわずかな時間だけです。
電子工学的観点から最も重要で(そして間違いなく最も独特な)ラズベリーパイの機能は、コンピューターを電子部品や電気機械装置などに直接接続できることです。これはGPIOコネクターを通じて行われます。これはノートパソコンやデスクトップパソコンにはありません。マザーボードのマイクロプロセッサおよび他のコンポーネントのインターフェースの出力であり、他のデバイスではユーザーがアクセスできないものです。このコネクターとその機能について見ていきます。
この記事では以下のトピックを扱います:
GPIOはGeneral Purpose Input/Outputの略で、汎用入出力を意味します。そして実際には、これがラズベリーパイのマザーボード上の特定の接続が提供するものです。第二世代のコンピュータ以来、ほとんど変更されておらず、現在は厳密に標準化されており、機器の異なるバージョン間でも互換性があり、常に同じフォーマット(またはほぼ同様の)機能を提供しています。
コネクターのフォーマットには電子工学や教育で広く用いられている2.54mm(0.1インチ)ピッチの大変一般的なピン出力が選ばれました。互換性のあるピン間隔は例えばコンタクト・プロトタイピングボード、Arduinoモジュール、そして(文字通り)数百万の部品の基礎となっています。
詳細なGPIOのドキュメントはインターネット上に広くありますので、ここでは基本だけを論じます。特にコンピューター起動直後からほぼすぐに利用可能な機能に注目します。以下の表はピンの間隔を示しています(参考:ピン2は基板の角に最も近い位置です):
| 電源 | 3.3V DC | 1 | 2 | 5V DC | 電源 |
| I2C SDA | GPIO 2 | 3 | 4 | 5V DC | 電源 |
| I2C SCL | GPIO 3 | 5 | 6 | GND | 電源 |
| GPIO 4 | 7 | 8 | GPIO 14 | TXD | |
| 電源 | GND | 9 | 10 | GPIO 15 | RXD |
| GPIO 17 | 11 | 12 | GPIO 18 | ||
| GPIO 27 | 13 | 14 | GND | 電源 | |
| GPIO 22 | 15 | 16 | GPIO 23 | ||
| 3.3V DC | 17 | 18 | GPIO 24 | ||
| SPI MOSI | GPIO 10 | 19 | 20 | GND | 電源 |
| SPI MISO | GPIO 9 | 21 | 22 | GPIO 25 | |
| SPI CLK | GPIO 11 | 23 | 24 | GPIO 8 | SPI CE0 |
| 電源 | GND | 25 | 26 | GPIO 7 | SPI CE1 |
| 予約済 | - | 27 | 28 | - | 予約済 |
| GPIO 5 | 29 | 30 | GND | 電源 | |
| GPIO 6 | 31 | 32 | GPIO 12 | ||
| GPIO 13 | 33 | 34 | GND | 電源 | |
| GPIO 19 | 35 | 36 | GPIO 16 | ||
| GPIO 26 | 37 | 38 | GPIO 20 | ||
| 電源 | GND | 39 | 40 | GPIO 21 |
GPIOコネクターは取り付け穴に対して常に同じ位置にあります。
電源ピンは3.3V DC(1、17)、5.0V DC(2、4)、システムグランドに接続されたピン(6、9、14、20、25、30、34、39)に分かれています。GPIOピンからの最大電流は制限されており、様々な要因に依存します。マザーボード上の電源回路は理論的に3.3Vバスに対し1Aを供給できますが、このエネルギーはボード上のすべてのコンポーネントで共有されます。5.0Vピンはコンピューター全体の電源ラインに直結しているため、制限は使用電源装置の性能および現在の消費電力に依存します(機種、実行ソフトウェアなどで変化)。GNDピンはマザーボード全体のグランド極を共有しています。
GPIOとされるすべてのピンはデジタル入出力として動作可能で、ソフトウェアによるPWM信号生成やi2Cインターフェースエミュレーションなどの関連機能も実装できます。ユーザーは論理状態を自由に設定でき、それはLOW状態で0V、高状態で3.3Vに対応します。これらのピンは入力としても設定可能で、3.3Vまたは0Vが接続されているかどうかを検知して、ボタンやスイッチの状態を読み取ることができます。
注意:3.3Vを超える電圧は絶対にかけないでください。これはコンピューターに永久的な損傷を与えます。
同様に、ピンが出力として動作している際に流せる電流は数mAを超えないようにしてください。
現代の電子回路の動作は、UART、I2C、SPIなどの通信インターフェースによって成り立っています。これらはビット単位でデータを送受信するシリアル通信方式です。通信はハードウェアベース(専用回路が処理)かソフトウェアベース(プロセッサがGPIOによる信号送受信を監視)で実装されます。前者では設計者が割り当てた特定機能用ピンを使用する必要がありますが、後者は自由に接続点が選べます。しかしソフトウェアベースはプログラムの動作に影響を及ぼす場合があります。ただし基本レベルでは無視してよいことも多いです。
I2Cバスは(語呂合わせ:Inter-Integrated Circuit)、他の電子機器や趣味のプロジェクトで非常に人気です。理由はソフトウェアエミュレーションの容易さ、多数の周辺機器接続可能性、速度に対する大きな許容度、標準準拠部品やセンサーの広範な入手性です。インターフェースには2本のラインが必要で、クロックライン(SCL、signal clock, ピン5)とデータライン(SDA、signal data, ピン3)です。理論上、128個の独立チップ(ホストチップ含む、ここではラズベリーパイ)をバスに接続でき、それぞれが固有のアドレス(通常はある程度決定済み)を持ちます。
SPIシリアルインターフェース(Serial Peripheral Interface)はI2Cとは少し違い、通信の耐久性が重視されます。ラズベリーパイのGPIOには2つありますが、ここではデフォルトのもの(0番)に焦点を当てます。
SPI通信ではバス上の個々のチップのアドレス指定の代わりに、各チップに個別のCEライン(Chip Enable)が割り当てられ、その領域を有効化して通信します(ピン24と26は2つの独立受信機の制御が可能)。通信はマスター(Master)からスレーブ(Slave)への2本の独立ライン(Master Out, Slave In (MOSI, pin 21))および逆方向のMaster In, Slave Out (MISO), ピン10)で行います。最後のラインはクロック信号で、CLKはピン23です。
SPIはI2Cよりも高速通信が可能で、full-duplexモード(双方向同時通信)で通信できます。プロトコルは単純かつ柔軟で、多くのメモリーやモジュールで使用されています。
かつては「シリアルポート」がパソコンの基本装備でしたが、今では派生規格であるUSBにその役割が取って代わられています。UARTはUniversal Asynchronous Receiver-Transmitter の略で、汎用非同期受信送信機を意味します。これは何十年も使われてきた通信手法で、主に英数字の命令送信に使われます。RPiではハードウェアでサポートされているため、バッファ処理とデータ送信はネイティブに行われ、高速でも非常に安定した通信を実現します(主に9600b/s)。制限は厳しく、UARTは基本的に2台間通信のみです。それでも、多くの電子モジュール(GPSレシーバーやGSMモデムなど)がこのインターフェースを必要とします。
UART通信には2つのGPIOピンが使われます:送信(TXD、transmit, ピン8)と受信(RXD、receive, ピン10)。両機器が同じボーレートに設定されている必要があります。
実践的な応用や例に入る前に、安全上の考慮点を見直しましょう。すでに述べた重要なポイントは次の2点です:
Arduinoとは違い、ラズベリーパイの論理ピンやインターフェース(上記のもの)は3.3V DCで動作します。したがって、その電源で動作する回路を接続するのが最善で、そうでなければレベルコンバーター(電圧レベルを変換する部品)の使用が推奨されます。
各GPIOピンの最大供給電流は16mAまで(合計消費電流は約50mA未満にすべき)です。コンピューターへの負荷がかかりすぎないようパーツ選定が重要です。より大きな負荷にはトランジスタ、リレーなどの中間素子を使うのが最良です。これについては記事の後半で詳述します。
ノイズや電圧スパイクを発生する部品を使う場合は、妨害を抑える部品(例:リレーコイルのショート用ダイオード、DCモーター出力のコンデンサ)を使う習慣をつけるのが良いです。これによりプログラムの問題や故障を防げます。
ラズベリーパイの電源のオン・オフ操作については別記事で詳述しますが、確実に言えるのは電源を「ホット」状態で抜き差しするのは避けるべきということです。プログラムがクラッシュした場合、つい行いたくなりますが、Linuxでは端末からCtrl+Cでプログラムを中断するのが安全です。安全にシャットダウンする場合は、sudo shutdown -h または sudo poweroffのコマンドが推奨されます。グラフィカルインターフェース使用時はメインメニューから同等のコマンドを選んでもよいでしょう。
外部部品の接続はコンピューターの電源を切ったときに行うのが望ましいですが、プログラムや回路の修正時など常に実用的ではありません。その場合は常識をもって、さらに中継素子の利用を忘れないことが肝要です。
最後に、常に慎重に扱うことを忘れないでください。これによりショートやその他の不必要で危険なミスを避けられます。回路はプロトタイプボードで作成し、異なる信号や電源を区別するために標準色(例: 黒=グランド、赤=電源)のケーブルを使うことが望ましく、ミスの修正に効果的です。
ラズベリーパイはLinuxカーネルベースで教育用途を念頭に設計されているため、GPIOポートと手軽にやりとりできる多様な開発環境があります。ここでは英国製コンピューターの基本言語であるPythonに焦点を当てますが、他の選択肢を知っておく価値はあります。
プログラミングを始めたばかりの若いユーザーには、電子部品とやりとりする興味深い導入としてScratchがあります。これはブロック(命令や関数を表す)を画面上で組み合わせて複雑なプログラムを作るビジュアル環境です。通常は簡単なゲームなどの制作に用いられます。Raspberry Pi OSにはGPIOピンの論理状態を読み書きできる機能付きのScratch版が含まれており、初心者でもスイッチやLED、さらにはDCモーターコントローラー操作のプログラムを数分で作成可能です。
CまたはC++に慣れている方ならGPIOポートとの通信は大きな困難ではありません。RPiのフルシステムにはgccとg++コンパイラが含まれており、nanoなどの単純なテキストエディタでプログラムを書けます。GPIO操作用ライブラリのインストールが必要で、現状はpigpioや旧式かつメンテナンスされていないWiringPiが一般的です。
Javaも状況は類似していますが、環境は自分でインストールする必要があります。コマンドは sudo apt update と sudo apt install default-jdkです。これにより最新のJavaが使えます。Pi4Jプロジェクト(「Pi for Java」とも読む)は数年にわたり開発されており、Javaの分かりやすいオブジェクト指向APIを介してGPIOピン、i2Cバス、PWMジェネレーター、シリアル通信をサポートする包括的なツールを提供しています。
オートメーション組込みシステムのプログラミング経験者には、Node-REDのインストールも魅力的な選択肢でしょう。これはデバイス制御、データ処理アプリケーションを実行するためのソフトウェアで、ウェブブラウザ上で動作し、モニター接続不要で別ケースのプロジェクト(例: 電気機械工作)に配置できます。接続はコンピューターのローカルIPアドレス経由です。IoTプロジェクトやホームオートメーションに最適です。インストールはターミナルで以下を実行:
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
Python言語の場合、RPiの目標の一つである普及により学習がより楽になっています。PythonのGPIOサポートには基本的に4つのライブラリがあります。
最初に登場し最も古いのはRPi.GPIOですが、Raspberry Pi 5以降では推奨されません。しかし古いデバイスではよく動作し、2023年まではRaspberry Pi OSに標準インストールされていました。
gpiozeroは高水準ライブラリで、よりユーザーフレンドリー(クラスライブラリなどが用意されている)が、プログラムの実行に遅延をもたらす場合があります。学習や単純なプログラムでは問題ないですが、精密制御が必要な場合は不便です。インストールは以下で:
sudo apt update
sudo apt install python3-gpiozero
RPi全モデル(一から五、Zeroシリーズ1、W、2も含む)対応の代替ライブラリはpigpioです。システム上で動作するデーモンとPythonから制御可能なライブラリから成ります。速度や互換性の面で優れていますが、依存ソフトが増えるのは欠点です。pigpioの最大の利点はPWMとI2Cのサポートです。
lgpioおよびlibgpiodライブラリは、Linuxがsysfsから移行しつつある「libgpiod」character devices (/dev/gpiochipN)に基づいています。古い手法を置き換え、GPIOピンの直接、安全、効率的な操作を可能にします。新規プロジェクトに推奨されますが、(現時点では)人気やドキュメントが不足しており、以下の概要では省略します。
Pythonでプログラムを書くには任意のテキストエディタを開き、コードを入力してname.pyの形式で保存します。例:ホームフォルダーの/homeなどのアクセスしやすい場所がおすすめです。その後ターミナルで保存場所に移動し、
python nazwa.py
で実行します。場合によっては
sudo python nazwa.py
のように管理者権限が必要なこともあります(特にpigpio使用時など)。
最も単純な例として、GPIOに接続したLEDを点滅させるプログラムをRPi.GPIOライブラリで書きます。配線図は以下の通り:
プログラムコードは以下のようになります:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
print("Ctrl+C → STOP")
try:
while True:
GPIO.output(18, GPIO.HIGH)
sleep(1)
GPIO.output(18, GPIO.LOW)
sleep(1)
except KeyboardInterrupt:
print("
Arrivederci!")
GPIO.cleanup()
最初に、このプログラムはRPi.GPIOライブラリ(GPIOと表記)を使うこと、同時にtimeライブラリからsleep(秒数を指定してプログラムを一時停止)だけをインポートしていることを宣言します。
ピンはコネクター上の物理的な順番ではなく、GPIO番号で指定する(冒頭表参照)ことを
GPIO.setmode(GPIO.BCM)
で示し、GPIO18を出力ピンとして設定しています。
次にプログラム終了手順の説明として「Ctrl+Cで停止」とプリントし、try … except構文で、Ctrl+C(KeyboardInterrupt)が押されるまで
while True
の無限ループ内でピン18を点灯(GPIO.HIGH)→1秒待機→消灯(GPIO.LOW)→1秒待機を繰り返し、割り込み時に例外処理ブロックで終了メッセージ表示およびGPIOの片付けをします。
このプログラムを動作させると接続したLEDが点滅し続けます。
プログラムとしては230V電球の制御も基本的に同じですが、接続方法は以下のようにより複雑な回路になります:
AC電源の電球(L1)回路を閉じるのは、GPIOコネクターから給電される5V DCコイルのリレー(K1)で行います。トランジスタ(Q1)を介して流れる電流を制御し、ピン18からの微弱なベース電流で動作します。回路中にはトランジスタの動作確認用LED(D2)と抵抗(R2)も入れています。ダイオードD1はリレーの接点が戻る際に発生するノイズを抑制し、GPIOコネクター、電源、トランジスタを保護します。
GPIOピンの状態読み取りも簡単です。ここではgpiozeroライブラリを使い、提供される2種類の読み取り方法を使った例を紹介します。
回路は非常に単純で:
通常開(NO)のスイッチを使用し、単純なモノスタブルボタンやバイスタブルレバーも利用可能です。
プログラムは以下の通りです:
from gpiozero import Button
from time import sleep
SW = Button(21)
print("Ctrl+C → STOP")
try:
while True:
print(SW.value)
sleep(0.5)
except KeyboardInterrupt:
print("
Hasta la vista!")
これは前述の例に似た構造で、違いはgpiozeroライブラリのButtonクラスだけをインポートし、
SW = Button(21)
でピン21を設定しています。無限ループ内で0.5秒ごとにスイッチの状態を
print(SW.value)
端末に出力し、0(ボタンが押されていない状態)または1(押されている状態)を表示します。
Ctrl+C → STOP
0
0
0
0
0
1
0
1
0
0
1
1
重要な点は、Buttonオブジェクト生成時に21番ピンに内部プルアップ抵抗が接続されており、通常出力は約3.3Vです。ボタンが押されてGNDに短絡すると電圧が0Vに落ちます。しかしgpiozeroライブラリはこの二進値を反転します。すなわち押された状態が1、離された状態が0となり、電子回路技術者にはやや混乱の元かもしれません。
gpiozeroは状態変化による割り込み処理もサポートしています。以下はその例:
from gpiozero import Button
from time import sleep
SW = Button(21)
def on_press():
print("ON")
sleep(0.1)
def on_release():
print("OFF")
sleep(0.1)
SW.when_pressed = on_press
SW.when_released = on_release
print("Ctrl+C → STOP")
try:
while True:
print(".")
sleep(0.5)
except KeyboardInterrupt:
print("
Até logo!")
ボタンが押された時にon_press関数、離した時にon_release関数を呼び出します。双方に100msの遅延を入れてチャタリングを無視しています。無限ループは重要操作中をシミュレートし、半秒おきに.を表示。ボタンの状態変化で表示が
Ctrl+C → STOP
.
.
.
ON
.
.
OFF
.
.
と切り替わります。
PWM信号生成には、前述のpigpioライブラリを使います。重要なのは単体では動作しないことです。インストール後(sudo apt install pigpio)必ずバックグラウンドで稼働するデーモンを有効にしなければなりません。
端末で
sudo pigpiod
を入力し起動後、Pythonプログラムをテストできます:
import pigpio
import time
GPIO = pigpio.pi()
LED = 18
print("Ctrl+C → STOP")
try:
while True:
for duty in range(0, 256, 5):
GPIO.set_PWM_dutycycle(LED, duty)
time.sleep(0.01)
for duty in range(255, 0, -5):
GPIO.set_PWM_dutycycle(LED, duty)
time.sleep(0.01)
except KeyboardInterrupt:
GPIO.set_PWM_dutycycle(LED, 0)
GPIO.feet()
print("
Papa!")
このスクリプトはpigpiodを呼び出しGPIOオブジェクトで代表します。コード構成は点滅LED例に似ていますが、状態変化が人の目に認識されない高速で行われ、方形波信号(PWM)が生成されます。これにより、LEDの明るさが変化する錯覚を与えます。高状態の割合をデューティ比と呼び、pigpioでは最大255(常時HIGH)、最小0(常時LOW)で、中間は部分的な明るさを示します。
2つのループで増加・減少するデューティ比(0から255まで5ずつ、255から0まで5ずつ減少)をピン18に出力し、LEDを徐々に明るくし暗くします。time.sleep(0.01)値変更で速度調整可能です。
PWMの話題に関連して、サーボモーターについて説明します。
サーボモーターはギアボックスと制御回路を内蔵した一体型モーターで、入力信号により軸の角度を正確に設定します。モデル用のサーボは50HzのPWM信号(20ms周期)で制御されます。500µs(または1000µs)幅のパルスが0°を示し、2500µs幅のパルスが最大回転角(180°、270°、360°など機種により異なる)となります。多くの小型サーボは5V電源で動作し、そのままGPIOに接続可能です:
以下関数set_servo_pulsewidthは引数にパルス幅マイクロ秒を取り、角度制御に用います。プログラムは500µsと2500µsのPWM信号を交互に送り、アームを往復動作させます。なお機種差により挙動が乱れる場合は1000~2000µsに調整してください。
import pigpio
import time
GPIO = pigpio.pi()
SERVO = 18
print("Ctrl+C → STOP")
try:
while True:
GPIO.set_servo_pulsewidth(SERVO, 500)
time.sleep(1)
GPIO.set_servo_pulsewidth(SERVO, 2500)
time.sleep(1)
except KeyboardInterrupt:
GPIO.set_PWM_dutycycle(SERVO, 0)
GPIO.feet()
print("
Au revoir!")
I2Cインターフェース経由のコンポーネント制御も難しくありませんが、使用モジュールのドキュメントをよく読む必要があります。ここではコンピューターと受信機の通信確立の初期手順を示します。
接続は上述の2本のケーブルのみです。電圧は3.3Vであることが必須で、5Vは不可です。また、デフォルトではインターフェースは有効化されていません。実行にはターミナルでRaspberry OSの設定ツールを開きます:
sudo raspi-config
3番セクション(Interface Options)でI5(Enable/disable automatic loading of I2C kernel module)を選択し、有効化を確認します。終了後再起動します(sudo reboot)。
次回の起動後、
sudo apt update
sudo apt install i2c-tools
でi2c-toolsを導入します。受信機をGPIOのI2C接続に繋いでいれば、
i2cdetect -y 1
(1はピン3と5を使う1番インターフェースを示す)で検出され、以下のような結果が表示されます:
i2cdetectツールの結果表。
各行はアドレスの先頭(16進数)、列は2文字目を示します。上記例では0x27のアドレスを持つ1台のデバイス(10進数39)がバス上にいます。このアドレスをプログラム上で通信に使います。
I2C操作はpigpioライブラリが最も効率的で、以下のコマンドで通信できます:
| i2c_open(bus, address) | I2Cデバイスに接続(ハンドルを返す) |
| i2c_close(handle) | 接続を閉じる |
| i2c_write_byte(handle, byte) | 1バイト送信(複数チャネル可) |
| i2c_read_byte(handle) | 1バイト取得 |
| i2c_write_byte_data(handle, reg, byte) | レジスタに1バイト書き込み |
| i2c_read_byte_data(handle, reg) | レジスタから1バイト読み込み |
| i2c_write_i2c_block_data(handle, reg, data) | データブロックを書き込み |
| i2c_read_i2c_block_data(handle, reg, count) | レジスタからブロック読み込み |
GPIOポートの機能は電子部品への接続に留まりません。GPIOコネクターは主に拡張ボードの接続に使われ、工場製だけでなく自作も可能です。
Raspberryのオーバーレイ(HAT、Hardware Attached on Top)と呼ばれるこれらのモジュールは多様な機能をもっています。例えばディスプレイ、追加インターフェース、モーターコントローラ(DC、BLDC、サーボ)、他の規格アダプター(LEGO® Powered Up)などです。
GPIOコネクターには電源ピンも含まれるため、HATはコンピューターに電力を供給することもあります。大きく分けると、用途は二つあります。一つはUPSユニット(Uninterrupted Power Supply)で電源故障時でもコンピューターの動作を保証し、バッテリー駆動も可能です。二つ目はPoE(Power over Ethernet)アダプターで、Ethernetケーブル経由で電源供給を行うもの(IEEE 802.3規格に準拠)です。
GPIOコネクタは Raspberry Piコンピュータの最大の強みの一つ であり、シングルボードコンピュータの分野における標準となっています。エンジニアにとって計り知れない可能性を提供するだけでなく、コンピュータで遊ぶことと電子部品について学ぶことをつなぐ架け橋として、理想的な教育ツールでもあります。Raspberry Piコンピュータ の周りには、新しいユーザーに親切で、常に助けてくれる多くの愛好家コミュニティが形成されています。このような機会を無駄にするのは惜しいことです。組み込みシステムや高度な電子回路の構築を学びたいのであれば - 手の届くところにあるツールと知識を活用するだけです。
Transfer Multisort Elektronik(TME)は、電子部品、電気・電子機器、作業工具、ならびに産業用オートメーション機器を取り扱う世界有数のグローバルディストリビューターです。TMEのカタログには、1300社以上の主要メーカーによる150万点を超える製品が掲載されています。ウッチ市およびルズグフ市に所在するTMEの最新物流センターは、総面積40,000㎡以上を有し、毎日約6,000個の電子部品関連パッケージを、150か国以上の顧客へ発送しています。
TME はまた、TME Education プロジェクトを通じて若手エンジニアや電子工学愛好家の知識とスキルの向上に取り組み、TechMasterEvent シリーズを開催して技術コミュニティを支援し、イノベーションと経験の共有を促進しています。