どうも、なかやんです。
今日はRaspberry Pi 4を2台使用して、呼び出し機を作ってみました。
呼び出し機といってもシンプルなもので、1台目ラズパイのタクトスイッチを押すと、ネットワーク経由で2台目ラズパイからブザー音が出るというシンプルなものです。
(ドアフォンのブザーのみ みたいな感じです)
ラズパイ Pico WやラズパイZeroで作った方が電気代的にもいい気がしますが、なかやんはラズパイ4と無印Picoしか持っていないため、そちらを使っていきます。(今回は実験的に使ってみます)
なかやんはプログラミングの知識がないため、ChatGPTさんにコードを書いてもらい作ってみました。
1.必要なパーツ
呼び出し機を作るのに必要なパーツです。こちらもChatGPTさんに聞いてかき集めてきました( ´∀` )
- raspberrypi 4 ×2
- タクトスイッチ
- 圧電スピーカー
- ジャンパーワイヤー
- (ブレッドボード)
2.パーツの接続
次はパーツの接続です。
ブレッドボードを経由させずに直接ジャンパーワイヤーでつけても大丈夫だと思いますが、なかやんはブレッドボードを使いました。
1台目(送信側)につけるタクトスイッチは、GPIO17へ接続、2台目(受信側)につける圧電スピーカーはGPIO27へ接続しました。
どちらももう片方はGNDへ接続します。
3.OSセットアップ
今回はRaspberry Pi os bullseye を2台ともにインストールしました。(元々インストールしてありました...)
4.ラズパイIPアドレスの固定
ネットワーク経由で検知させるため、2台のラズパイのIPアドレスを固定させておきます。
5.コードを書く
それでは早速コードを書いていきます。なかやんはPythonのコードを書くことができないため、ChatGPTさんに書いてもらいました。
1台目(送信側)のコードです。
- import RPi.GPIO as GPIO
- import socket
- import time
- # GPIOピンの設定
- switch_pin = 27
- # ソケットの設定
- host = 'RASPI2_IP_ADDRESS' # Raspberry Pi 2台目のIPアドレスを指定
- port = 12345
- # GPIOの初期化
- GPIO.setmode(GPIO.BCM)
- GPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
- # ソケットの初期化
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- try:
- while True:
- # タクトスイッチが押されたらメッセージを送信
- if GPIO.input(switch_pin) == GPIO.LOW:
- sock.sendto(b'1', (host, port))
- else:
- sock.sendto(b'0', (host, port))
- time.sleep(0.1)
- except KeyboardInterrupt:
- pass
- finally:
- GPIO.cleanup()
- sock.close()
2台目(受信側)のコードです。
- import RPi.GPIO as GPIO
- import socket
- import time
- # GPIOピンの設定
- speaker_pin = 17
- # ソケットの設定
- host = ''
- port = 12345
- # GPIOの初期化
- GPIO.setmode(GPIO.BCM)
- GPIO.setup(speaker_pin, GPIO.OUT)
- # PWMの初期化
- pwm = GPIO.PWM(speaker_pin, 1000) # 第2引数はPWMの初期周波数(ここでは1000Hz)
- # ソケットの初期化
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.bind*1
- try:
- pwm.start(0) # PWMの開始(デューティサイクル0%)
- while True:
- # メッセージを受信し、スピーカーを制御
- data, addr = sock.recvfrom(1024)
- if data == b'1':
- pwm.ChangeDutyCycle(80) # デューティサイクルを80%に設定(適宜調整)
- else:
- pwm.ChangeDutyCycle(0) # PWMを停止
- except KeyboardInterrupt:
- pass
- finally:
- pwm.stop()
- GPIO.cleanup()
- sock.close()
2台目21行目のコードがはてなブログの仕様?で、*になってしまっています。
ご使用の際は以下で修正してください
2台目、1台目の順番で実行すると動作します。このコードの場合、タクトスイッチを押している間音が鳴り続けます。
試しに動かしてみた動画はこちらです。
では、おやすみなさいzzz
*1:host, port