Python Raspbeyyi Pi プログラム 回路 電子工作 高専3年生

【Raspberry Pi】電子工作入門⓪~Lチカ・PWM~【Python】

Raspberry Piは、手軽に電子工作やプログラミングを学ぶのに適したコンピュータです。

Raspberry Piのメリット、GPIOの基本的な説明、そして有名なLチカ(LEDを点滅させる)プロジェクトの例題を紹介します。

Raspberry Piのメリット

  1. パソコンと比較したメリット
    • コストが低い:Raspberry Piは非常に安価(モデルによって数千円)で入手でき、予算の少ないプロジェクトでも導入が可能です。
    • 小型で省電力:Raspberry Piは小さく、モバイルバッテリーなどでも動作可能で、手軽に持ち運んで使用できます。
    • GPIOピンが使える:一般的なパソコンにはないGPIO(汎用入出力ピン)が搭載されており、電子回路やセンサーと直接接続できるため、ハードウェア制御が可能です。
  2. マイコン(例えばArduino)と比較したメリット
    • 完全なOSを動作させられる:Raspberry PiにはLinuxベースのOS(Raspberry Pi OS)が動作し、PythonやCなどのプログラミング環境を提供します。マイコン(Arduinoなど)は単一のプログラムしか実行できませんが、Raspberry Piは複数のタスクを同時に実行できます。
    • 豊富なライブラリとソフトウェアサポート:Raspberry Piは、PCと同様に豊富なソフトウェアリソースやライブラリが利用でき、例えばインターネットに接続してデータをやり取りしたり、カメラやディスプレイを扱ったりすることが簡単にできます。

GPIOとは?

GPIO(General Purpose Input/Output)は、Raspberry Piのハードウェアと外部デバイス(LED、スイッチ、センサーなど)をつなぐためのピンです。これらのピンはプログラムで制御でき、信号を出力してLEDを点灯させたり、センサーから入力を受け取ったりできます。

GPIOピンには、次のような用途に応じた種類があります

GPIOピンの主な機能

  1. デジタル入出力: 基本的に、GPIOピンはHIGH(1)またはLOW(0)を出力したり、外部からの信号を受け取ることができます。これがデジタル入出力(I/O)の基本機能です。
  2. I2C: I2C(Inter-Integrated Circuit)は、複数のデバイスを2本のワイヤで接続するためのプロトコルです。センサーやLCDディスプレイなどがこのプロトコルを使用します。
  3. SPI: SPI(Serial Peripheral Interface)は、高速でデータをやり取りする通信プロトコルです。SDカードやアナログ-デジタル変換器などのデバイスに使用されます。
  4. UART: UART(Universal Asynchronous Receiver/Transmitter)は、シリアル通信に使用されます。通常、シリアルデバイスとの通信に使用されます。
  5. 電源ピン: 5Vや3.3Vを供給するピンがあり、外部デバイスに電力を供給します。
  6. GND: 回路のグラウンドとして機能します。

Raspberry Pi 5には、40ピンのGPIOヘッダーがあり、これらのピンは様々な機能を持っています。

GPIOピン番号と機能の表

ピン番号BCMピン番号ピン名機能
1-3.3V電源(3.3V)
2-5V電源(5V)
3GPIO 2SDA1I2Cデータ通信ピン(SDA)
4-5V電源(5V)
5GPIO 3SCL1I2Cクロックピン(SCL)
6-GNDグラウンド
7GPIO 4GPIO 4汎用入出力(デジタルI/O)
8GPIO 14TXDUART送信ピン
9-GNDグラウンド
10GPIO 15RXDUART受信ピン
11GPIO 17GPIO 17汎用入出力(デジタルI/O)
12GPIO 18GPIO 18PWM出力対応ピン
13GPIO 27GPIO 27汎用入出力(デジタルI/O)
14-GNDグラウンド
15GPIO 22GPIO 22汎用入出力(デジタルI/O)
16GPIO 23GPIO 23汎用入出力(デジタルI/O)
17-3.3V電源(3.3V)
18GPIO 24GPIO 24汎用入出力(デジタルI/O)
19GPIO 10SPI0_MOSISPI送信ピン(MOSI)
20-GNDグラウンド
21GPIO 9SPI0_MISOSPI受信ピン(MISO)
22GPIO 25GPIO 25汎用入出力(デジタルI/O)
23GPIO 11SPI0_SCLKSPIクロックピン(SCLK)
24GPIO 8SPI0_CE0_NSPIチップセレクト0
25-GNDグラウンド
26GPIO 7SPI0_CE1_NSPIチップセレクト1
27GPIO 0ID_SDID EEPROM(I2Cデータ)
28GPIO 1ID_SCID EEPROM(I2Cクロック)
29GPIO 5GPIO 5汎用入出力(デジタルI/O)
30-GNDグラウンド
31GPIO 6GPIO 6汎用入出力(デジタルI/O)
32GPIO 12GPIO 12PWM出力対応ピン
33GPIO 13GPIO 13PWM出力対応ピン
34-GNDグラウンド
35GPIO 19GPIO 19PWM出力対応ピン、SPI1_MOSI対応
36GPIO 16GPIO 16汎用入出力(デジタルI/O)
37GPIO 26GPIO 26汎用入出力(デジタルI/O)
38GPIO 20GPIO 20PWM出力対応ピン、SPI1_MISO対応
39-GNDグラウンド
40GPIO 21GPIO 21PWM出力対応ピン、SPI1_SCLK対応

各ピンの詳細な説明

  1. 電源ピン(3.3V、5V):これらのピンは、外部デバイスに電力を供給するためのピンです。注意点として、5VピンはRaspberry Piの電源に直接接続されており、出力制御はできません。
  2. GNDピン:グラウンド(GND)は、回路の基準電位です。外部デバイスとRaspberry Piを接続する際には、GNDピンを共有する必要があります。
  3. I2Cピン:I2Cバス(SDA: データ、SCL: クロック)は、センサーや他のデバイスとデータをやり取りするために使用します。複数のデバイスを同じバスに接続できるのが特徴です。
  4. SPIピン:SPIは、より高速なデータ通信を行うためのプロトコルです。MOSI(送信)、MISO(受信)、SCLK(クロック)、CE(チップセレクト)を使用して、複数のSPIデバイスと通信が可能です。
  5. UARTピン:シリアル通信のためのピンです。TX(送信)とRX(受信)で、例えばシリアルデバイスやコンピュータとのデータ通信が行えます。
  6. PWMピン:PWM(パルス幅変調)は、デジタル信号を使ってアナログ信号を模倣する方法です。例えば、モーターの速度を制御したり、LEDの明るさを変えたりするのに使います。
  7. 汎用入出力(GPIO)ピン:これらのピンは、外部デバイスとの基本的な入出力に使用します。デジタル信号のON/OFFをプログラムで制御することが可能です。

Lチカ

Raspberry Pi 5では、RPi.GPIOライブラリが利用できなくなったため、代わりにgpiozeroライブラリを使用することが推奨されています。

gpiozeroはシンプルなインターフェースを提供し、Raspberry PiのGPIOピンを使った電子工作を簡単に行えるライブラリです。

以下に、gpiozeroを使ったLチカ(LED点滅)のプログラムを書き換えた例を紹介します。

必要なもの

  • Raspberry Pi本体
  • LED(1つ)
  • 抵抗(330Ω)
  • ブレッドボードとジャンパーワイヤー

配線

  1. LEDの長い脚(プラス側)をGPIO 17ピンに接続します。
  2. LEDの短い脚(マイナス側)を抵抗を通してGNDに接続します。

gpiozeroを使ったLチカのPythonコード

from gpiozero import LED
from time import sleep

# GPIO 17番ピンに接続したLEDを定義
led = LED(17)

# LEDを点滅させる
while True:
    led.on()     # LEDをON
    sleep(1)     # 1秒間待機
    led.off()    # LEDをOFF
    sleep(1)     # 1秒間待機

解説

  • from gpiozero import LED: gpiozeroライブラリからLEDクラスをインポートします。
  • led = LED(17): GPIO 17ピンに接続されたLEDを制御するためのオブジェクトを作成します。
  • led.on(): LEDを点灯させます。
  • led.off(): LEDを消灯させます。
  • sleep(1): LEDが点灯または消灯している間、1秒間待機します。

コンソール上でCtrl+Cキーを入力すると、プログラムが停止します。

PWM

PWM(Pulse Width Modulation、パルス幅変調)は、デジタル信号を使ってアナログ的な出力を制御する手法です。

例えば、LEDの輝度やモーターの速度などを調整できます。

PWMでは、信号の「オン」と「オフ」の比率(デューティサイクル)を変化させることで、出力の強弱を制御します。

PWMを使ったLEDの明るさ制御

Raspberry Piでは、GPIOピンを使ってPWM信号を生成し、LEDの明るさを滑らかに変えることができます。gpiozeroライブラリには、PWMをサポートするPWMLEDクラスが用意されています。

PWMの仕組み

PWM信号は、一定の周期の中で「オン」と「オフ」を繰り返す信号です。デューティサイクル(オンの時間の割合)を変更することで、LEDの輝度を変えることができます。たとえば、

  • 100%デューティサイクル: 常にオン → 最大輝度
  • 50%デューティサイクル: 半分の時間オン → 半分の輝度
  • 0%デューティサイクル: 常にオフ → 消灯

PWMを使ったLED制御のPythonコード

from gpiozero import PWMLED
from time import sleep

# GPIO 17番ピンに接続したPWM対応のLEDを定義
led = PWMLED(17)

# LEDの輝度を変化させる
while True:
    for brightness in range(0, 101, 1):  # 0%から100%まで輝度を上げる
        led.value = brightness / 100     # デューティサイクルを0から1に変換
        sleep(0.01)                      # 10ms待機(輝度の変化をなめらかに)
    
    for brightness in range(100, -1, -1): # 100%から0%まで輝度を下げる
        led.value = brightness / 100      # デューティサイクルを0から1に変換
        sleep(0.01)                       # 10ms待機

解説

  • from gpiozero import PWMLED: gpiozeroライブラリからPWM制御に対応したPWMLEDクラスをインポートします。
  • led = PWMLED(17): GPIO 17ピンに接続されたPWM対応のLEDオブジェクトを作成します。
  • led.value: デューティサイクルを0.0(消灯)から1.0(最大輝度)の間で設定します。例えば、led.value = 0.5はLEDの輝度を50%に設定します。
  • range(0, 101, 1)range(100, -1, -1): これらのループは、LEDの輝度を徐々に上げたり下げたりするためのものです。デューティサイクルを段階的に変化させて、LEDの明るさを調整します。

問題1

GPIO 17ピンに接続されたLEDを、1秒間点灯させた後、1秒間消灯させる動作を5回繰り返してください。

解答例はこちらをクリック
from gpiozero import LED
from time import sleep

# GPIO 17番ピンに接続したLEDを定義
led = LED(17)

# 5回LEDを点滅させる
for _ in range(5):
    led.on()     # LEDを点灯
    sleep(1)     # 1秒待機
    led.off()    # LEDを消灯
    sleep(1)     # 1秒待機

問題2

PWMを使用して、LEDの明るさを徐々に変化させるプログラムを作成してください。

GPIO 17ピンに接続されたLEDを使用し、2秒かけてLEDの輝度を0%から100%に上げ、その後2秒かけて100%から0%に下げることを繰り返してください。

解答例はこちらをクリック

from gpiozero import PWMLED
from time import sleep

# GPIO 17番ピンに接続したPWM対応のLEDを定義
led = PWMLED(17)

while True:
    # 2秒かけて明るくする(0%から100%)
    for brightness in range(0, 101):  # 0から100まで
        led.value = brightness / 100   # 輝度を0.0から1.0に変換
        sleep(0.02)                    # 20ms待機(100回×0.02秒 = 2秒)
    
    # 2秒かけて暗くする(100%から0%)
    for brightness in range(100, -1, -1):  # 100から0まで
        led.value = brightness / 100       # 輝度を0.0から1.0に変換
        sleep(0.02)                        # 20ms待機(100回×0.02秒 = 2秒)

次回はこちら

Follow me!

-Python, Raspbeyyi Pi, プログラム, 回路, 電子工作, 高専3年生
-, , , , ,

PAGE TOP