Raspberry Piでバスの降車ボタンを鳴らして光らせる

Raspberry Piでバスの降車ボタンを鳴らして光らせる

先日、「たまぷらーざ発バスグッズフェア」で中古部品を購入しました。

こちらは今回の「戦利品」。

やはり「降車ボタン」に目が行きます。

今回、Raspberry Piを使用して降車ボタンを鳴らして光らせてみることにしました。

降車ボタンの仕組み

ここら辺はググると出て来ました。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10132402300

配線は、

白:LED

緑:ボタン(SW)

黒:GND

電圧:DC24V(12Vでも大丈夫そう)

次にLEDとボタンの動作テストを実施。

DC12V電源は既にあるのでこれを使用。

まずは、LEDの確認電源の+(プラス)とLED白線を接続し、電源の-(マイナス)とGND黒線を接続。LEDが点灯することを確認。

同様にボタンの動作確認。DC12Vのブザーがあるので接続。電源+とブザー+、ブザーGNDとボタン緑線、ボタン黒線と電源-をそれぞれ接続。

ボタンを押すとブザーが鳴り、離すと止まりました。

RaspberryPiでの制御ポイント

ラズパイで制御するには、

1)光らせるには「12V」の電源供給が必要。
2)ボタンを押したら、点灯させたまま→リセットすると消灯する「自己保持回路」。

1)は、電源は12Vで制御信号は5Vで行うためのリレー回路モジュールを使う。

2)は、ソフトで組み込み可能。

リレー回路モジュールは、VCC(制御信号)の電圧が5Vのものを選ぶ必要がある。ラズパイのピンから供給できる電圧か5Vか3.5Vのため。

購入した主なパーツ

1)Raspberry Pi 4 ModelB(コンピュータ本体)


2)GPIO拡張ボート(GPIOの取回しを簡単にする)


3)リレー回路モジュール(VCC DC5V)


4)リセットボタン(リセットボタン。点灯したLEDを消灯する)

配線図とソースコード

動作は、降車ボタンを押すとLEDが点灯、リセットボタンを押すと消灯します。

また、降車ボタンを押すとチャイムと「次止まります」の音声を流します。

配線ですが、以下になります。リレー回路で12VのLEDを5V VCCで制御します。ラズパイしかし、5Vだと電圧が高すぎてON/OFFが切り替わらなかったのて、3.5Vにしたところ、上手く回路が動作しました。

GPIO/電源接続パーツ
GPIO17BTN(降車ボタン 緑線)
GPIO22TRG(リレー制御)
GPIO27TESETボタン
3.5Vリレー回路5V
(今回のリレー回路は5Vで動作せず)

拡張パーツがあるとGPIOのHIGH/LOWやピン番号も見やすくて便利です。

コードはAI(Gemini)を使用C++で生成し、一部手書きで修正しました。Pythonにしたい場合は、AIで変換も可能。キーワードは「バスの降車ボタンをラズベリーパイで動作させるための必要な部品とプログラムは?」から初めて質問を追加していきました。

/********************************************/
/*      降車ボタンシミュレーション                       */
/*      降車ボタンPUSH:LED点灯,音声再生        */
/*      リセットボタンPUSH:LED消灯                 */
/********************************************/
/*       2025/08/05 Crated by Tomoharu        */
/********************************************/
#include <iostream>
#include <pigpio.h>
#include <unistd.h>
#include <string>
// GPIOピン番号の定義
const int REQUEST_BUTTON_PIN = 17; // 降車ボタンを接続するGPIOピン
const int RESET_BUTTON_PIN = 27;   // リセットボタンを接続するGPIOピン
const int RELAY_PIN = 22;   // リレー回路を接続するGPIOピン
// WAVファイルのパス
const std::string ANNOUNCE_SOUND_FILE = "./next_stop.wav";
const std::string CHIME_SOUND_FILE = "./chime.wav";
// 状態管理用の変数
bool isPlaying = false;
bool isLedOn = false; // LEDの状態を保持するフラグ
// 降車ボタンが押されたときの処理
void handleRequestButtonPress() {
    if (!isLedOn) {
        isLedOn = true;
        gpioWrite(RELAY_PIN, PI_HIGH);
        std::cout << "Request button pressed! LED is ON." << std::endl;
        if (!isPlaying) {
            isPlaying = true;
            std::cout << "Playing chime and announcement..." << std::endl;
            std::string command1 = "aplay -q " + CHIME_SOUND_FILE;
            system(command1.c_str());
            std::string command2 = "aplay -q " + ANNOUNCE_SOUND_FILE;
            system(command2.c_str());
            isPlaying = false;
            std::cout << "Audio playback finished." << std::endl;
        }
    }
}
// リセットボタンが押されたときの処理
void handleResetButtonPress() {
    if (isLedOn) {
        isLedOn = false;
        gpioWrite(RELAY_PIN, PI_LOW);
        std::cout << "Reset button pressed! LED is OFF." << std::endl;
    }
}
int main() {
    // pigpioライブラリの初期化
    if (gpioInitialise() < 0) {
        std::cerr << "pigpio initialisation failed." << std::endl;
        return 1;
    }
    // GPIOピンの設定
    gpioSetMode(REQUEST_BUTTON_PIN, PI_INPUT);
    gpioSetPullUpDown(REQUEST_BUTTON_PIN, PI_PUD_UP);
    gpioSetMode(RESET_BUTTON_PIN, PI_INPUT);
    gpioSetPullUpDown(RESET_BUTTON_PIN, PI_PUD_UP);
    
    gpioSetMode(RELAY_PIN, PI_OUTPUT);
    gpioWrite(RELAY_PIN, PI_LOW);
    std::cout << "Bus stop request simulation with self-holding circuit started." << std::endl;
    std::cout << "Press the request button (GPIO" << REQUEST_BUTTON_PIN << ") to turn on the LED." << std::endl;
    std::cout << "Press the reset button (GPIO" << RESET_BUTTON_PIN << ") to turn off the LED." << std::endl;
    std::cout << "Press Ctrl+C to exit." << std::endl;
    while (true) {
        // 降車ボタンの状態を読み取る
        int requestButtonState = gpioRead(REQUEST_BUTTON_PIN);
        if (requestButtonState == PI_LOW ) {
            handleRequestButtonPress();
        }
        // リセットボタンの状態を読み取る
        int resetbuttonState = gpioRead(RESET_BUTTON_PIN);
        if (resetbuttonState == PI_LOW) {
            handleResetButtonPress();
        }
        usleep(10000); // 10ms待機して、CPU負荷を軽減
    }
    // pigpioライブラリを終了
    gpioTerminate();
    return 0;
}

音声はこちらのサイトのもとを利用させていただきました。

チャイム

http://otologic.jp

次止まります

http://pocket-se.info

完成したものはこちら。スピーカーは音が小さいため別途アンプを接続予定。

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です