初心者向け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)、以下のコマンドを実行します。

ピンアウト

すべての接続とRaspberry Piの正確なピン配置のグラフィックが表示されます。

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__ メソッドを使用すると、ピンのリセットとエクスポートの解除を手動で行う必要がなくなります。

インポートOS
from time import sleep

クラス GPIO_Pin:
    def __init__(self, num, mode):
        0 <= num または num  0から40までの数字を入力してください')
        if mode == 'out' or mode == 'write':
            self.mode = 'out'
        elif mode == 'in' or mode == 'read':
            self.mode = 'in'
        さもなければ
            print('無効なピンモード -> 出力には "out" または "write" を、入力には "in" または "read" を入力してください')
        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')
        さもなければ
            print('無効な値です -> HIGHなら1または「HIGH」、LOWなら0または「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')
    数_of_blinks = 10
    for i in range(number_of_blinks):
        pin.write('HIGH')
        スリープ(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

以下はそのプログラムです。

1TP4ティンクルードについて
#include  (英語版のみ
1TP4ティンクルードについて

#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 (エクスポート == NULL) {
        printf("エクスポートファイルを開くのに失敗しました");
        exit(-1);
    
    fprintf(export, "%d", num);
    fclose(export)を実行します。
    0を返します。
}

int unexport_pin(int num) {
    FILE* unexport = fopen(UNEXPORT, "w")。
    if (unexport==NULL){。
        printf("Failed to open the unexport filen");
        exit(-1);
    }
    fprintf(unexport, "%d", num);
    fclose(unexport);
    0を返す。
}

int set_direction(char *mode, int num) { { { { { 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 (ディレクション == NULL) {
        printf("Failed to open direction fileửn");
        exit(-1);
    
    fputs(mode, direction);
    fclose(direction);
    0を返す。
}

int set_value(int val, int num) { { { { { 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 (値 == NULL) {
        printf("Failed to open value fileèn");
        exit(-1);
    
    fprintf(value, "%d", val);
    fclose(value)を実行します。
    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++) { { { { { 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ライブラリも存在します。次のステップは、コード例を拡張することです。例えば、LEDやボタンを追加することです。
楽しく実験してください。

コメントを残す