본문 바로가기

메이커 프로젝트/라즈베리파이 피코

라즈베리파이 피코 + 음성인식 + 릴레이모듈 + 멀티탭 프로젝트

[프로젝트 목표 및 실습 안내] 

 

위 영상과 같이 라즈베리파이 피코 기반 음성인식 릴레이 멀티탭을 만들어보자.

 

위 실습을 하기 위해서는 아래 기초 과정 실습에 대한 이해가 필요하다. 

 

라즈베리파이 피코 w의 LED 웹서버 제어(feat.구글 파이어베이스)

포스팅을 시작하기 이전에 라즈베리파이 피코, 파이어베이스 운영에 대한 자료 출처는 모두 김주현 장학사(서울시교육청)님께 받았음을 밝힙니다. 자료 출처 깃헙 레포짓 : https://github.com/mtinet/s

pythonkorea.com

 

 

[실습 1] 멀티탭에 릴레이 모듈 연결하기

 

먼저 릴레이 모듈과 멀티탭을 연결해야 한다. 작업을 하기 전 아래 포스팅을 참고하며 작업했다.

 

전원 제어를 위한 '스마트 멀티탭(플러그)' 제작(릴레이, 라즈베리파이)

사물인터넷에서 가장 빈번하게 사용하는 기능이 전원 제어 ON, OFF 기능이며, 일반 사용자 입장에서 손쉽게 제작해서 사용할수 있는 전원제어 모듈은 라즈베리파이, 아두이노 등을 활용한 릴레이

soosun.tistory.com

 

멀티탭은 220볼트의 전압을 사용하는 전기기구 이니 혹시 몰라서 소화기를 책상에 두고 작업했다.

 

 

멀티탭 선은 아래와 같이 제거했다.

 

 

릴레이 모듈과 멀티탭은 아래와 같이 연결했다.

 

 

 

연결된 모습.

 

 

자 이제 피코에 연결해 릴레이 모듈이 잘 동작하는지 테스트를 해보자.

 

피코-릴레이모듈 동작 테스트 영상

 

피코에 3초마다 릴레이 점멸 코드를 넣어보자.

오늘도 열일 하는 GPT...

 

 

릴레이 점멸 코드 테스트 완료.

 

 

 

 

 

[실습 2] 파이어베이스 - 웹사이트 - 피코 연동하기

파이어 베이스와 웹사이트는 일단 기존에 LED 제어 사용했던 웹사이트를 그대로 사용하자.


일단 기존 LED ON/OFF 사이트 데이터베이스 들어오는 신호가 0, 1 둘중에 하나이니 그대로 릴레이에 주면 된다. 수정할 코드가 없다.

 

피코쪽 코드도 거의 바꿀 것이 없다.

relay 연결 핀 번호만 바꿔주고, 기존 led 변수명만 양심상 relay로 변수 명만 바꿔주었다. 사실 변수 명도 안바꾸고 그대로 써도 된다. 

from machine import Pin, I2C
import network
import time
import urequests
import random

# 마이크로컨트롤러의 핀을 제어하기 위해 Pin 클래스를 불러옵니다
from machine import Pin
relay = Pin(1, Pin.OUT) # GPIO 1번 핀을 출력 모드로 설정합니다.

# WLAN 객체를 생성하고, 무선 LAN을 활성화합니다
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# 와이파이에 연결합니다
if not wlan.isconnected():
    wlan.connect("His_Kigdom_1F_2.4Ghz", "wkgehome9093")
    print("Waiting for Wi-Fi connection", end="...")
    while not wlan.isconnected():
        print(".", end="")
        time.sleep(1)
else:
    print(wlan.ifconfig())
    print("WiFi is Connected")

# Firebase의 Realtime Database와 연결하기 위한 URL을 설정합니다
url = "https://test230729-default-rtdb.firebaseio.com"

# 초기 상태를 설정하여 Firebase에 업데이트합니다
초기값 = {'led': 1,}
urequests.patch(url+"/led.json", json = 초기값).json()

# Firebase에서 데이터를 가져오고, 이를 JSON 형태로 변환합니다
response = urequests.get(url+"/led.json").json()
print(response)
print(response['led'])

# 무한 루프를 실행하면서 Firebase에서 데이터를 계속 가져와서 LED와 팬의 상태를 제어합니다
while True:
    response = urequests.get(url+"/led.json").json()
    time.sleep(0.1)
    print("led:", response['led'])

    # 가져온 데이터에 따라서 LED 핀의 출력 값을 변경합니다
    if (response['led'] == 1) :
        relay.value(1) 
    else :
        relay.value(0)

 

동작확인

 

역시 잘된다.

 

[실습 3] 웹 사이트에 음성인식 기능 추가하기 

 

일단, 저번거 너무 그대로 쓰면 그러니까 배경색, 스타일 css만 조금 바꿔주었다.

 

새로운 css 적용 및 제목만 조금 바꿔줌

 

gpt에게 음성인식 코드를 작성해달라고 부탁했다.

 

코드에서 script 태그 부분만 뗴어서 그대로 기존 script 뒷부분에 복붙 하였다. 그리고 인식 되었을 경우에 수에 기존 led 0n/off 함수를 넣어서 제어 신호를 피코에게 보내도록 하였다. 

 

수정된 코드는 아래와 같다. 

index.html

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>피코 릴레이 제어 서버</title>
  <link href="style.css" rel="stylesheet" type="text/css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto|Dancing+Script&display=swap">
  <script src="https://www.gstatic.com/firebasejs/4.6.2/firebase.js"></script>

</head>

<body>
  <center>
    <h1>라즈베리파이 피코 릴레이모듈 ON/OFF 웹서버 테스트</h1>
    <p>제작 : 성원경(상암고 교사) <br> 일자 : 23년 8월 1일 </p>

    <img id="img" src="ledoff.jpg" width=40%>
    <p id="ledstatus"></p>

    <button type="button" onclick="ledON()">LED ON</button>
    <button type="button" onclick="ledOFF()">LED OFF</button>
  </center>

  <script src="script.js"></script>
</body>

</html>

 

script.js

// LED 제어 함수 선언
function ledON() {
  var ref = database.ref('led');
  ref.update({ led: 1 })
}

function ledOFF() {
  var ref = database.ref('led');
  ref.update({ led: 0 })
}

// Firebase 접근 정보
var config = {
  apiKey: "본인것 넣을 것, 아래도 마찬가지",
  authDomain: "test230729.firebaseapp.com",
  databaseURL: "https://test230729-default-rtdb.firebaseio.com",
  projectId: "test230729",
  storageBucket: "test230729.appspot.com",
  messagingSenderId: "853700741140",
  appId: "1:853700741140:web:929162eb54a746eb63bf01",
  measurementId: "G-3BTLVEK3N3"
};

//Firebase 데이터베이스 만들기
firebase.initializeApp(config);
database = firebase.database();

// Firebase 데이터베이스 정보 가져오기
var ref = database.ref("led");
ref.on("value", gotData);

function gotData(data) {
  var val = data.val();

  if (val.led == 0) {
    document.getElementById("ledstatus").innerHTML = "led가 현재 꺼짐";
    document.getElementById("img").src = "ledoff.jpg";
  }
  else {
    document.getElementById("ledstatus").innerHTML = "led가 현재 켜짐";
    document.getElementById("img").src = "ledon.jpg";
  }

  console.log(val)
}

var recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition)();

recognition.lang = 'ko-KR';
recognition.interimResults = false;
recognition.maxAlternatives = 1;

recognition.start();

recognition.onresult = function(event) {
  var speechResult = event.results[0][0].transcript;
  console.log('인식된 텍스트: ' + speechResult);

  if (speechResult.indexOf('켜') !== -1) {
    ledON()
  }

  if (speechResult.indexOf('꺼') !== -1) {
    ledOFF()
  }
};

recognition.onerror = function(event) {
  console.log('오류 발생: ' + event.error);
};

// 음성 인식이 종료될 때마다 다시 시작합니다.
recognition.onend = function() {
  recognition.start();
};

 

잘돌아가는 지 테스트 할때는 콘솔창에서 인식 값을 확인하였다. 노트북에 마이크가 잘 켜져 있는지 확인해야 한다. 

 

웹에서 음성인식을 허용해야 한다. 

 

최종 음성인식 동작 테스트

 

 

앞으로도 피코와 테스트할 부품들이 더 많다. 어떤 인식 모델과 연동해서 테스트할지 아이디어가 더 필요하다 ㅎ

끝.

 

@WonkingAImakerClass2023