Arduino UNO R4 WiFiでLEDを制御するーTCP通信による方法ー音声認識を加える

Arduino

パソコンのマイクに話しかければ、無線で接続されている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を制御できた

次回は、モーターの制御をしていきたいと思います。

コメント

タイトルとURLをコピーしました