본문 바로가기

메이커 프로젝트

재활용품을 활용한 음성인식 로봇팔 제작 프로젝트

[ AI 연계 메이커 연수 5일차 중등 ]

주강사 : 상암고등학교 교사 성원경

실습강사 : 서울인공지능고등학교 고성훈, 서울전자고등학교 홍성수

 

👉 수업 시작 전 사전과제 

1. VSCODE 설치 후 파이썬 개발 환경 구축

 

Python 개발 환경 설정 (Visual Studio Code 활용)

Python의 편집기로 다양한 platform이 존재하지만, 최근에는 Visual Studio Code가 가벼워 많이 활용되고 있다. Python을 Visual Studio Code에서 사용하기 위해서는 복잡한 설치 및 설정 과정이 필요하다. 1. Pytho

rswm-ju.tistory.com

2. 아나콘다 설치하기

 

[Python] - 아나콘다 설치 (Anaconda)

아나콘다 설치 및 사용 명령어

velog.io

주의) 설치시 PATH enviroment variable에 꼭 클릭을 해주어야 한다. (그냥 다음 계속 누르기 금지)

3. 아두이노 IDE 설치하기

 

[IoT] 아두이노 통합 개발 환경(Arduino IDE) 설치하는 방법

IT is True 블로그에 들어와 주셔서 감사합니다. 이번엔 아두이노 통합 개발 환경(Arduino IDE)을 설치하는 방법에 대해서 알아보겠습니다. 1. 아두이노 IDE 다운로드 먼저, 아두이노 홈페이지에 접속하

ittrue.tistory.com


👋오늘 메이커 프로젝트 진행 방향

[오리엔테이션] AI 메이커 프로젝트의 이해

1. 프로젝트 목표 확인 및 팀 구성

2. 아두이노 - 서보모터 제어 실습

3. 재활용품을 활용한 로봇팔 하드웨어 제작

4. 음성 인식 모델 - 파이썬 - 아두이노 연동하기  

5. 결과 공유 및 피드백


😄 수업 시작 전 체크 리스트 : 아래 링크 Click !

 

Enter the Code to Join & Vote on a Presentation - Mentimeter

Enter the code from the Mentimeter presentation to join in and start voting. Make your voice heard!

www.menti.com


 

오리엔테이션. AI 메이커 프로젝트에 대한 이해

 

 

1단계.  프로젝트 목표 확인 및 팀 구성

 

스마트폰 <-> 사진 기록은 아래 링크 활용

https://pythonkorea.com/61

 

사진, 영상 임시 공유 폴더(PC <-> 스마트폰)

현재 페이지 주소 : pythokorea.com/61 1. MS 원드라이브(로그인 필요없음) https://sen0960-my.sharepoint.com/:f:/g/personal/wonking_ggmt_sen_hs_kr/ElhzttcdAnFHpfh3RVPacckBdyw-G9tmQcj3gSBK4nCTbw?e=hcje2r 2. 구글 드라이브(구글 로그

pythonkorea.com

 

팀 구성 및 과제 제출처

 

230708 - 과학전시관 로봇팔 만들기 문서 공유(중등)

230708 순번,팀원 1 이름,팀원 2 이름,팀원 3 이름,링크,코멘트 1,코멘트 2,코멘트 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

docs.google.com

 

 

2단계.  아두이노 서보모터 제어

실습 1.   서보모터 1개 제어하기

 - 회로

- 코드 원본

#include <Servo.h>

Servo servo;                                                    
int value = 0;    

void setup() {
  servo.attach(7);          
}

void loop() {
    value = 0;
    servo.write(value); 
    delay(500);

    value = 90;
    servo.write(value);
    delay(500);

    value = 179;
    servo.write(value);
    delay(500);
}

 

실습 2.   서보모터 2개 시리얼 통신으로 제어하기

- 회로

- 코드

#include <Servo.h> //헤더파일 포함

Servo servo1; //servo1 변수 선언
Servo servo2; //servo2 변수 선언

int motor1 = 3; //motor1을 입출력 3번 핀에 연결
int motor2 = 5; //motor2을 입출력 5번 핀에 연결
int angle1 = 90; //초기 각도값 설정  
int angle2 = 90; //초기 각도값 설정

void setup() {
  servo1.attach(motor1); //servo1에 입출력 3번 핀을 지정
  servo2.attach(motor2); //servo2에 입출력 5번 핀을 지정
  Serial.begin(9600); //시리얼 모니터 사용
  Serial.println("Enter the w,a,s,d ");
}
void loop() {
  if(Serial.available()) //시리얼 통신이 가능할 경우
  {
    char input = Serial.read(); //시리얼 모니터 입력 값을 읽어옴
    if(input =='w') //입력값이 W일 경우
    {
      Serial.print("+30");
      for(int i = 0; i <30; i++) // 30번 반복
      {
        angle1 = angle1 + 1; // angle1의 값에 1씩 30번을 더함
        if(angle1 >=180) // angle1이 180보다 커지거나 같아질 경우 
        angle1 = 180; // angle1을 180으로 고정
        servo1.write(angle1); // servo1을 angle1 값에 맞추어 동작
        delay(10);
      }
      Serial.print("\t\t");
      Serial.println(angle1);
    }
    else if(input =='a') //입력값이 a일 경우
    {
      Serial.print("+30");
      for(int j = 0; j <30; j++)
      {
        angle2 = angle2 + 1;
        if(angle2 >=180)
         angle2 = 180;
        servo2.write(angle2);
        delay(10);
      }
      Serial.print("\t\t");
      Serial.println(angle2);
    }
     else if(input == 's') //입력값이 s일 경우
     {
      Serial.print("\t-30\t");
      for(int i = 0; i <30; i++) // 30번 반복
      {
        angle1 = angle1 -1; // angle1의 값에 1씩 30번을 빼기
        if(angle1 <= 0) // angle1이 0보다 작아지거나 같을 경우
        angle1 = 0; // angle1을 0으로 고정
        servo1.write(angle1); // servo1을 angle 값에 맞추어 동작
        delay(10);
      }
      Serial.println(angle1);
     }
     else if(input == 'd')  //입력값이 d일 경우
     {
      Serial.print("\t-30\t");
      for(int j = 0; j <30; j++)
      {
        angle2 = angle2 -1;
        if(angle2 <= 0)
        angle2 = 0;
        servo2.write(angle2);
        delay(10);
      }
      Serial.println(angle2);
     }
  }
}

 

- 코드 업로드 후 시리얼 모니터에서 코드 동작 확인 -> 서보모터 2개 동작 확인

 

그 외에 3축, 4축 서보모터에 제어 코드와 위 코드 상세 설명은 아래 링크 확인.

http://pythonkorea.com/48

 

 

3단계.  재활용품을 활용한 로봇 하드웨어 제작

- 앞에 주어진 재료를 활용하여, 로봇팔 하드웨어를 제작하시오.
- 본인이 가지고 온 재활용품을 활용하여 하드웨어 제작 가능합니다.
- 글루건을 사용 할때는 화상의 위험이 있으니 주의합니다.
- 아이스크림 바에 송곳으로 구멍을 뚫을 때는 테이프를 붙여서 뚫어서 금가지 않도록 합니다.
- 구멍에는 이쑤시개나 클립을 롱로즈로 펴서 꼿아서 회전축을 만든 뒤 니퍼로 나머지 부위를 잘라줍니다.

 

4단계. 음성 인식 모델 - 파이썬 - 아두이노 연동하기

 

🤓혹시 파이썬 가상환경에 대한 이해가 없다면 아래 자료 확인(그림 클릭)

 

VSCODE  터미널 가상환경(python3.6버전 및 pyaudio 패키지 설치) 생성 명령어 

# 파이썬 3.7버전 가상환경 생성 및 활성화
conda create -n pyaudio37 python=3.7
y
conda activate pyaudio37

# 필요 패키지 설치
pip install pyaudio
pip install SpeechRecognition

# 동작 테스트 
python test.py # 현재 코드가 있는 파일명, 각자 다를 수 있음.

 

음성테스트 코드 : test.py

import speech_recognition as sr

# 인스턴스 생성
r = sr.Recognizer()

# 마이크 설정
microphone = sr.Microphone(sample_rate=16000)

# 마이크 소음 수치 반영
with microphone as source:
    r.adjust_for_ambient_noise(source)
    print("주변 소음 수치 {}".format(r.energy_threshold))

# 음성 수집해서 텍스트로 변환
with microphone as source:
    print("말씀하세요.")
    result = r.listen(source)
    text = r.recognize_google(result, language='ko')

#변환된 텍스트 출력
print(text)

 

- 가상환경 활성화 및 패키지 설치 화면 예시

 

- 테스트 화면 : 내장 혹은 외장 마이크 있어야 함

 

- 아두이노와 파이썬 음성인식 시리얼 통신 연결 코드 : 아두이노 포트  COM7 부분과 보내는 신호 갯수 및 종류 변경해서 써야 함.

예시 : ser.write(b'z') -> ser.write(b'a')

import speech_recognition as sr
import time
import serial
ser = serial.Serial('COM7',9600)
r = sr.Recognizer()
microphone = sr.Microphone(sample_rate=16000)
try:
    while True:
        with microphone as source:
            r.adjust_for_ambient_noise(source)
            print("소음수치 {}".format(r.energy_threshold))
        with microphone as source:
            text=None
            print("말씀하세요.")
            result = r.listen(source)
            try:                    #음성 인식이 잘 안될 경우 UnknownValueError 예외가 발생, 예외 처리 추가(시작)
                text = r.recognize_google(result, language='ko') #UnknownValueError 발생 코드
                print(text)
                if '왼' in text: 
                    ser.write(b'z')
                    print('왼쪽으로.')
                elif '오' in text: 
                    ser.write(b'c')
                    print('오른쪽으로.')
                elif '위' in text: 
                    ser.write(b'w')
                    print('위로')
                elif '아래' in text: 
                    ser.write(b's')
                    print('아래로')
                elif '올려'in text:  
                    ser.write(b'd')
                    print('더 위로')
                elif '내려'in text:  
                    ser.write(b'a')
                    print('더 아래로')
                elif '잡아' in text or '자' in text or '바' in text: 
                    ser.write(b'e')
                    print('물건 잡아')
                elif '풀어'in text or '놔' in text: 
                    ser.write(b'q')
                    print('물건 풀어')
            except sr.UnknownValueError: #UnknownValueError 예외 발생할 경우 메시지 출력
                print("다시 말씀하세요")

except KeyboardInterrupt:
    print('ctrl + c 중지 메세지 출력')
    print('프로그램을 종료합니다')

 

동작 예시

 

5단계. 결과 공유 및 피드백

 

과제 제출처 : 과제 제출 후 다른 팀 과제 코멘트 달기

 

230708 - 과학전시관 로봇팔 만들기 문서 공유(중등)

230708 순번,팀원 1 이름,팀원 2 이름,팀원 3 이름,링크,코멘트 1,코멘트 2,코멘트 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

docs.google.com

 

@ Wonking AI Maker Class 2023

 

컨텐츠 제작

주 집필자 : 상암고등학교 교사 성원경

도움을 주신 분들

소스코드 작성 : 송례중학교 교사 곽정근(서울시교육청)

강의 컨텐츠 구성 및 실시 : 서울인공지능고등학교 교사 고성훈, 서울전자고등학교 교사 홍성수

하드웨어 제작 : 서울문화고 교사 이상훈, 신림고등학고 교사 정태우, 상문고등학교 교사 신규하, 영일고등학교 교사 박철희