初心者のためのGPIOガイド
このブログ記事では、Raspberry PiのGPIOピンに関するすべてを学びます。この記事は特に電子工作の初心者のためのものです。
まずは警告だ:
ピンの使い方を間違えると、Raspberry Piが取り返しのつかないことになる可能性があります。そのため、常に回路が正しいか、十分な抵抗が使用されているかを確認するようにしてください。
GPIO端子とは
GPIOピンは、Raspberry Piの上部にある40本の小さな金属製のピンのことです。GPIOという略語は、general purpose input outputの略です。つまり、GPIOピンはほとんど全ての電子機器のインターフェースとして使用することができるのです。
ピンの(誤った)使用方法が多数あるため、使い始めは少し混乱するかもしれません。そこでこのブログでは、Bash、C、Pythonを使ってピンを制御する方法をいくつか紹介する。そのため、プログラミングの経験が少しでもあると有利です。
40本のピンは同じように見えますが、それぞれ異なる機能を持っています。26ピンはGPIOに使用でき、一部は付加的な機能を備えています。別の4ピンは電源(POWER、3V3×2、5V×2)として、8ピンは負極(グランドまたはGROUNDとも)として使用されます。残りの2ピンはID EEPROM用のI2Cインタフェースです。
ピンアウト
下の図は、最も重要な情報、とりわけピン配置を示したものです。ピン配列は、ほとんどのRaspberry Piのモデルで同じですが、違いがあります。デバイスを接続する前に、必ず自分のモデルの正確なピンアウトを確認してください。Raspberry Piでターミナルを開き(Ctrl+Alt+t)、以下のコマンドを実行します。
pinout
すべての接続とRaspberry Piの正確なピン配置のグラフィックが表示されます。
GPIOの番号がランダムに表示され、ピン番号と一致しないことにお気づきでしょうか。混乱を避けるため、1〜40のナンバリングをBOARD番号、1〜26の番号をBCMまたはGPIO番号と呼ぶことにします。
つまり、BOARDの1番ピンが3V3のPOWERコネクタで、GPIOの2番ピンがその隣のBOARDの3番ピンということになります。
デバイスとピンの接続方法
GPIOピンにデバイスを接続する方法には、いくつかの選択肢があります。デバイスによってはGPIOヘッダーがあり、デバイスを直接GPIOピンに差し込めるものもあります。しかし、一般的にはそうではないので、ジャンパワイヤやGPIO延長ケーブルが使用されます。
時計 動画 GPIOピンについて
次の例では、LEDとRaspberry Piをジャンパーケーブルで接続しています。
回路
メス-オス型ジャンパー線は、GPIOピンをヘッダーまたはブレッドボードに接続します。このピンは、デバイスを動作させるためにプログラムする必要があります。デバイスは、ボタン、LED、センサー、モーター、ディスプレイのいずれでもかまいません。デバイスは5ボルト以下で動作し、I2C、SPI、UARTのいずれかのインタフェースと互換性があることが重要です。
工事には、次のような機材が必要です。
- Raspberry PiとRaspberry Pi OSの組み合わせ
- ジャンパー線(オス-メス)2本
- オス-オス間ジャンパー線1本
- 10キロオーム抵抗
- LED
- ハンダレスブレッドボード
GPIOピン13(BOARD番号33)に接続します。 + ストリップ と、その隣のGROUND端子(BOARD番号34)から - ひん剥く をブレッドボードの次に、10キロ・オームの抵抗(どんな抵抗でも可)の一端を + ストリップ を挿入し、もう一方の端をクロスストリップの1つに挿入します。LEDの場合、向きが重要です。アノードは2本のアームのうち長い方で、よく曲がっています、カソードは短い方のアームです。アノードは常に + のカソードは、電源に向かう方向となります。 – の方向,つまりGROUNDの方向に向かっています。そこで、長い方の腕を抵抗と同じクロスストリップに入れ、短い方の腕が隣のクロスストリップに入るようにします。最後に、オス-オスのジャンパーケーブルで、カソード(LEDの短い方の腕)のクロスストリップを、抵抗のクロスストリップに接続します。 - ひん剥く.
次の図は、組み立ての様子を示しています。すべてが正しく、部品が基板に入るところまで挿入されていることを確認してください。そうしないと、接点が緩くなります。
以下のBash、Python、Cによる3つのコード例は、この構造に基づいています。他のピンを使用する場合は、それに応じてコードを修正する必要があります。
バッシュ
BashでGPIOピンを制御するのはとても簡単です。Linuxでは、GPIOピンを制御するファイルは /sys/class/gpio フォルダーに格納します。GPIOピンを使用するためには、まず、そのピンをエクスポートする必要があります。例として、GPIOピン13を使用します。以下では、ファイル名を太字と斜体で表記しています。
ターミナルを開き、gpioフォルダの中身をリストアップします。
cd /sys/class/gpio
ls
このフォルダには、エクスポートとアンエクスポートのファイル、およびエクスポートされた各 GPIO ピン用のサブフォルダが含まれています。
に GPIO 番号を書き込んで、ピンをエクスポートします。 /sys/class/gpio/export ファイルを作成します。ターミナルでこのコマンドを実行します。
echo 13 > /sys/class/gpio/export
ls
これで、対応するピン番号gpio13のフォルダが作成されました。このフォルダには、他のフォルダやファイルが入っています。当面は、方向と値のファイルだけが重要です。
のです。 方向 ファイルには、ピンのモードが保存されます。
で -> 読み出しまたは入力モード
アウト -> 端子が書き込みまたは出力モード
のです。 価値 ファイルは、ピンの電圧状態を保存します。
0 -> 端子がLOWモード → 端子に電圧がかかっていない状態
1 -> 端子がHIGHの状態 → 端子に電圧が印加される
以下のコマンドでモードを設定します。 アウト という値で 1.
echo out > /sys/class/gpio/gpio13/direction
echo 1 > /sys/class/gpio/gpio13/value
LEDが点灯している状態です。使用後は、端子値をリセットすることが重要です。使用後は必ず以下のコマンドを実行してください。
echo 0 > /sys/class/gpio/gpio13/value
echo in > /sys/class/gpio/gpio13/direction
echo 13 > /sys/class/gpio/unexport
Pythonプログラム
ここで、これらのBashコマンドをPythonで抽象化し、自動化する。
次のPythonスクリプトでは、簡単な GPIO_Pin クラスとなります。そのため、非常に使い勝手が良い。その オーエス モジュールを使うと、Pythonから上記と同じbashコマンドを実行することができます。 __del__ メソッドを使用すると、ピンのリセットとエクスポートの解除を手動で行う必要がなくなります。
import os
from time import sleep
class GPIO_Pin:
def __init__(self, num, mode):
if 0 <= num or num <= 40:
self.num = num
else:
print('Invalid Pin Number -> Enter a number from 0 - 40')
if mode == 'out' or mode == 'write':
self.mode = 'out'
elif mode == 'in' or mode == 'read':
self.mode = 'in'
else:
print('Invalid Pin Mode -> Enter "out" or "write" for output, "in" or "read" for input')
if self.num and self.mode:
os.system(f'echo {str(self.num)} > /sys/class/gpio/export')
sleep(0.05)
os.system(f'echo {self.mode} > /sys/class/gpio/gpio{str(self.num)}/direction')
def reset(self):
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
os.system(f'echo in > /sys/class/gpio/gpio{str(self.num)}/direction')
def write(self, value):
if value == 0 or value == 'LOW':
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
elif value == 1 or value == 'HIGH':
os.system(f'echo 1 > /sys/class/gpio/gpio{str(self.num)}/value')
else:
print('Invalid value -> Enter 1 or "HIGH" for HIGH, 0 or "LOW" for LOW')
def __del__(self):
self.reset()
os.system(f'echo {str(self.num)} > /sys/class/gpio/unexport')
def set_mode(self, mode):
self.mode = mode
os.system(f'echo {str(self.mode)} > /sys/class/gpio/gpio{str(self.num)}/direction')
def main():
pin = GPIO_Pin(13, 'out')
number_of_blinks = 10
for i in range(number_of_blinks):
pin.write('HIGH')
sleep(0.5)
pin.write('LOW')
sleep(0.5)
if __name__ == '__main__':
main()
timeモジュールを使えば、LEDを点滅させることも問題なくできます。このスクリプト全体は、GPIO制御用のPythonモジュールに拡張することができます。
Cプログラム
また、C言語では、gpioフォルダの内容を簡単に編集することができます。標準ライブラリの使用 標準ライブラリ ファイルを開いたり、内容を変更したりすることができます。
次のCプログラムは、実行する前にコンパイルする必要があります。ファイルを作成する gpio.c をクリックし、その中にプログラムをコピーしてください。
そして、ターミナルを開いて、そのフォルダーに移動します。 gpio.c ファイルが置かれています。以下のコマンドを使用して、プログラムをコンパイルし、実行します。
gcc -o gpio gpio.c
./gpio
以下はそのプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define GPIO_ROOT "/sys/class/gpio"
#define EXPORT "/sys/class/gpio/export"
#define UNEXPORT "/sys/class/gpio/export"
#define LOW 0
#define HIGH 1
int export_pin(int num) {
FILE* export = fopen(EXPORT, "w");
if (export == NULL) {
printf("Failed to open the export file\n");
exit(-1);
}
fprintf(export, "%d", num);
fclose(export);
return 0;
}
int unexport_pin(int num) {
FILE* unexport = fopen(UNEXPORT, "w");
if (unexport == NULL) {
printf("Failed to open the unexport file\n");
exit(-1);
}
fprintf(unexport, "%d", num);
fclose(unexport);
return 0;
}
int set_direction(char *mode, int num) {
char direction_file_path[1024];
snprintf(direction_file_path, sizeof(direction_file_path), "/sys/class/gpio/gpio%d/direction", num);
FILE* direction = fopen(direction_file_path, "w");
if (direction == NULL) {
printf("Failed to open the direction file\n");
exit(-1);
}
fputs(mode, direction);
fclose(direction);
return 0;
}
int set_value(int val, int num) {
char value_file_path[1024];
snprintf(value_file_path, sizeof(value_file_path), "/sys/class/gpio/gpio%d/value", num);
FILE* value = fopen(value_file_path, "w");
if (value == NULL) {
printf("Failed to open the value file\n");
exit(-1);
}
fprintf(value, "%d", val);
fclose(value);
return 0;
}
int main() {
int rslt;
int num;
int num_blinks;
num = 13;
num_blinks = 10;
rslt = export_pin(num);
rslt = set_direction("out", num);
for (int i = 0; i < num_blinks; i++) {
rslt = set_value(HIGH, num);
sleep(1);
rslt = set_value(LOW, num);
sleep(1);
}
rslt = set_value(LOW, num);
rslt = set_direction("in", num);
rslt = unexport_pin(num);
return EXIT_SUCCESS;
}
PiCockpit - GPIOアプリ
GPIOピンを制御する最も簡単な方法は、GPIOアプリの助けを借りることです。その PiCockpit ウェブインタフェース は、Raspberry Pi 5台までなら無料で利用できます。大きな利点が2つあります。プログラミングの知識がなくてもGPIOピンを制御できること、そしてどこからでも制御できることです。
Raspberry PiにPiCockpitクライアントをインストールし、PiCockpitのアカウントに接続するだけです。その後は、Webインターフェースから簡単にGPIOピンを制御することができます。
次のステップ
これで、ジャンパー・ワイヤーを使ってGPIOピンを使う方法がわかっただろう。もちろん、GPIOピンを制御するための外部PythonモジュールやCライブラリもあります。次のステップとして、コード例の1つを拡張するのが良いでしょう。例えば、追加のLEDやボタンを使うなどです。
楽しく実験してください。