[프로젝트 목표 및 실습 안내]
위 영상과 같이 라즈베리파이 피코 기반 음성인식 릴레이 멀티탭을 만들어보자.
위 실습을 하기 위해서는 아래 기초 과정 실습에 대한 이해가 필요하다.
[실습 1] 멀티탭에 릴레이 모듈 연결하기
먼저 릴레이 모듈과 멀티탭을 연결해야 한다. 작업을 하기 전 아래 포스팅을 참고하며 작업했다.
멀티탭은 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
'메이커 프로젝트 > 라즈베리파이 피코' 카테고리의 다른 글
라즈베리파이 피코 블루투스 RC카 만들기(내장 통신모듈 이용 BLE) (2) | 2023.08.19 |
---|---|
2023 서울시교육청 전문가연수 AI수업설계 교육과정 안내. (0) | 2023.08.01 |
티처블머신 AI 모델 & 라즈베리파이 피코와 연동하기(feat. RGB LED) (0) | 2023.07.31 |
라즈베리파이 피코 w의 LED 웹서버 제어(feat.구글 파이어베이스) (1) | 2023.07.29 |