パソコンのマイクに話しかければ、無線で接続されているArduinoのLEDの点灯制御ができるというのをやってみます!
はじめに
前回の記事(Arduino UNO R4 WiFiでLEDを制御するーTCP通信による方法ー)では、パソコンから数値を送って、数値によってLEDの点灯制御を行うことを無線で行うというものでした。1を送ればLEDがON、0を送ればLEDがOFF。
また、次の記事(Arduinoで音声認識)では、パソコンのマイクにむかって「おはよう」と声をかければArduinoにつながっているLEDがON、それ以外の言葉を話しかければLEDがOFFになる仕組みを説明しました。
今回は、これらを組み合わせます。
Arduino側のプログラム
Arduino側のプログラムは、記事(Arduino UNO R4 WiFiでLEDを制御するーTCP通信による方法ー)に記載したプログラムそのままです。
#include <WiFiS3.h>
const char ssid[] = "****"; // ←あなたのWiFi SSID
const char pass[] = "****"; // ←あなたのWiFiパスワード
int status = WL_IDLE_STATUS;
WiFiServer server(5000); // TCPポート番号(任意で変更可)
WiFiClient client;
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
// WiFi接続
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Failed to WiFi communication.");
while(true);
}
while (status != WL_CONNECTED) {
Serial.print("Try Connect to ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000);
}
Serial.println("\nWiFi connected.");
Serial.print("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
server.begin(); // TCPサーバー起動
Serial.println("TCP server started");
}
void loop() {
if (!client || !client.connected()) {
client = server.available(); // 新しいクライアントを取得
if (client) {
Serial.println("Client connected");
}
}
if (client && client.connected() && client.available()) {
char command = client.read();
Serial.print("Received: ");
Serial.println(command);
if (command == '1') {
digitalWrite(LED_BUILTIN, HIGH);
} else if (command == '0') {
digitalWrite(LED_BUILTIN, LOW);
}
// 応答送信(オプション)
client.print("ACK: ");
client.println(command);
}
}
このプログラムをArduinoへ転送してください。転送が終了したら、パソコン側の作業をします。
パソコン側のプログラム
記事(Arduinoで音声認識)に記載しているプログラムにTCP通信の部分を追加します。それが、以下のプログラムです。1行目がフォントの関係で見にくいですが、「import speech_recognition as sr」です。
import speech_recognition as sr
import serial
import time
import socket #2025.5.13 add
HOST = "172.20.10.2" # ← ArduinoのIPアドレスに置き換えてください 2025.5.13 add
PORT = 5000 # ← Arduinoスケッチと一致させてください 2025.5.13 add
# 音声認識の準備
r = sr.Recognizer()
mic = sr.Microphone(device_index=1)
while True:
try:
with mic as source:
print("Say something...")
audio = r.listen(source)
# Google音声認識
text = r.recognize_google(audio, language='ja')
print(f"認識結果: {text}")
if 'おはよう' in text:
#2025.5.13 add
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'1') # LEDをONにするには '1' を送る
print("LED turned ON")
else:
#2025.5.13 add
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'0') # LEDをONにするには '1' を送る
print("LED turned OFF")
time.sleep(1)
except sr.UnknownValueError:
print("音声を認識できませんでした")
except sr.RequestError as e:
print(f"音声認識サービスに接続できませんでした: {e}")
except KeyboardInterrupt:
print("終了します")
break
このファイルに適当な名前を付けて保存します。私の場合は、mic_to_led_tcp.pyとしました。ターミナル上で「python mic_to_led_tcp.py」と入力すれば、以下のような画面になり、発話を求められます。

ここで、パソコンのマイクに向かって「おはよう」と声をかけてください。するとターミナルの画面は以下のようになり、ArduinoのLEDが点灯します。

また、発話が求められますので、「おはよう」以外の言葉を話しかけてください。すると、以下のような画面になり、LEDが消灯します。

プログラムの終了は「Ctrl+C」です。

おわりに
前回の記事(Arduino UNO R4 WiFiでLEDを制御するーTCP通信による方法ー)
パソコンからのデータをArduinoへTCP通信で送ることができた
前々回の記事(Arduinoで音声認識)
パソコンのマイクに向かって話しかけると、有線でつながっているArduinoのLEDを制御できた
今回の記事
パソコンのマイクに向かって話しかけると、無線でつながっているArduinoのLEDを制御できた
次回は、モーターの制御をしていきたいと思います。


コメント