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

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

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

今回、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/電源 | 接続パーツ |
| GPIO17 | BTN(降車ボタン 緑線) |
| GPIO22 | TRG(リレー制御) |
| GPIO27 | TESETボタン |
| 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;
}
音声はこちらのサイトのもとを利用させていただきました。
チャイム
次止まります
完成したものはこちら。スピーカーは音が小さいため別途アンプを接続予定。







コメントを残す