なかやんブログ

PC好きのなかやんです

raspberrypiを2台使って呼び出し機を作ってみた(Python)

 本ページはプロモーションが含まれています

どうも、なかやんです。

今日は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台目(送信側)のコードです。

  1. import RPi.GPIO as GPIO
  2. import socket
  3. import time
  4.  
  5. # GPIOピンの設定
  6. switch_pin = 27
  7.  
  8. # ソケットの設定
  9. host = 'RASPI2_IP_ADDRESS' # Raspberry Pi 2台目のIPアドレスを指定
  10. port = 12345
  11.  
  12. # GPIOの初期化
  13. GPIO.setmode(GPIO.BCM)
  14. GPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  15.  
  16. # ソケットの初期化
  17. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  18.  
  19. try:
  20.     while True:
  21.         # タクトスイッチが押されたらメッセージを送信
  22.         if GPIO.input(switch_pin) == GPIO.LOW:
  23.             sock.sendto(b'1', (host, port))
  24.         else:
  25.             sock.sendto(b'0', (host, port))
  26.  
  27.         time.sleep(0.1)
  28.  
  29. except KeyboardInterrupt:
  30.     pass
  31.  
  32. finally:
  33.     GPIO.cleanup()
  34.     sock.close()

 

2台目(受信側)のコードです。

  1. import RPi.GPIO as GPIO
  2. import socket
  3. import time
  4.  
  5. # GPIOピンの設定
  6. speaker_pin = 17
  7.  
  8. # ソケットの設定
  9. host = ''
  10. port = 12345
  11.  
  12. # GPIOの初期化
  13. GPIO.setmode(GPIO.BCM)
  14. GPIO.setup(speaker_pin, GPIO.OUT)
  15.  
  16. # PWMの初期化
  17. pwm = GPIO.PWM(speaker_pin, 1000) # 第2引数はPWMの初期周波数(ここでは1000Hz)
  18.  
  19. # ソケットの初期化
  20. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  21. sock.bind*1
  22.  
  23. try:
  24.     pwm.start(0) # PWMの開始(デューティサイクル0%)
  25.  
  26.     while True:
  27.         # メッセージを受信し、スピーカーを制御
  28.         data, addr = sock.recvfrom(1024)
  29.         if data == b'1':
  30.             pwm.ChangeDutyCycle(80) # デューティサイクルを80%に設定(適宜調整)
  31.         else:
  32.             pwm.ChangeDutyCycle(0) # PWMを停止
  33.  
  34. except KeyboardInterrupt:
  35.     pass
  36.  
  37. finally:
  38.     pwm.stop()
  39.     GPIO.cleanup()
  40.     sock.close()

2台目21行目のコードがはてなブログの仕様?で、*になってしまっています。

ご使用の際は以下で修正してください

 

2台目、1台目の順番で実行すると動作します。このコードの場合、タクトスイッチを押している間音が鳴り続けます。

 

試しに動かしてみた動画はこちらです。

 

では、おやすみなさいzzz

*1:host, port

広告