이 프로젝트 정보
소개:
우리 모두는 영화 '아이언맨'과 마블 시리즈의 '자비스' AI 비서 로봇에 대해 잘 알고 있습니다. 스스로 무언가를 만드는 것은 프로그래머의 꿈이었습니다. 오늘은 Python 프로그래밍을 사용하여 이러한 도우미를 만드는 간단한 방법을 보여 드리겠습니다. 또한 로봇의 실제 아바타를 만들어 로봇과 대화할 때마다 약간의 움직임을 할 수도 있습니다. 그것은 단순한 소프트웨어 로봇보다 더 놀랍습니다. 몸체가 있으면 멋지기 때문입니다. 그래서 오늘은 Arduino와 Python 프로그래밍을 모두 사용하여 컴퓨터를 제어하고 대화를 나눌 수 있는 AIrobot을 만드는 방법을 배울 것입니다. 같이 갑시다!
로봇 이름을 '황달'이라고 지은 이유는? 내가 노란색으로 칠했기 때문에 아주 아주 노란색으로!
부품:
전자제품 -
<울> Arduino 나노 – 1x
<울> 마이크로 서보 Sg90 – 3개
<울> 초음파 센서 HCsr04– 1개
본문 –
<울> PVC 시트(흰색이 바람직하고 착색이 잘되며 파란색을 사용)
<울> 서보 휠(스탠드용)
도구:
<울> 커터 나이프
<울> 가위
<울> 뜨거운 접착제
<울> 스프레이 페인트
소프트웨어 -
<울> 파이썬3
<울> Arduino.ide
원칙:
실제 건물에 들어가기 전에 우리가 무엇을 할 것인지에 대한 아이디어를 갖는 것이 좋습니다.
그렇다면 메인 코드나 코드의 AIpart는 컴퓨터에서 실행될 것입니다. 왜 그런가요? 그것은 파이썬을 지원하고 작은 Arduino보다 더 많은 처리 능력을 가지고 있기 때문에 AI 봇은 내 PC에서 실행해야 하는 내 PC의 일부 작업을 제어/자동화합니다. 그래서 아두이노보드는 USB 케이블로 내 컴퓨터에 연결했습니다.
아이디어는 Speech totext 부분을 수행하고 텍스트를 처리하며 Text to Speech를 수행하는 Python 프로그램을 실행하는 것입니다. 로봇이 듣고, 이해하고, 다시 말할 것임을 의미합니다. 몸의 움직임을 위해 Arduino 보드에 일부 움직임(함수로 캡슐화됨)을 저장했습니다. 각 동작에 대한 함수는 파이썬 코드로 실행됩니다.
예를 들어, 로봇이 'Hi/hello'라고 말해야 하는 경우 파이썬 코드는 바이트 'h'를 전송하고 Arduino는 hi() 함수를 실행합니다. 그렇게 간단합니다.
이제 아이디어가 생겼으니 다음 프로세스로 넘어갑시다.
회로 및 전자 장치 그림>
회로는 대부분의 제작자를 괴롭히는 것입니다. 문제가 발생하면 값비싼 부품을 태울 수 있습니다. 이를 위해 수많은 프로젝트를 만드는 데 사용할 수 있는 PCB 보드를 설계했습니다. 마이크로 SD 카드 슬롯, 블루투스 모듈 슬롯, 5v 외부 전원이 있으며 전체 전원은 아두이노 나노로 구동됩니다.
EasyEDA를 사용하여 PCB를 설계하고 PCBWay 온라인 서비스를 사용하여 인쇄했습니다. 그들의 서비스는 놀랍습니다. 나는 PCB 즉석 견적을 사용하여 주문했고 그들의 시스템은 자동으로 나를 위해 모든 것을 해주었습니다. 3일 만에 중국에서 방글라데시까지 보드를 받았습니다. 품질이 환상적이며 솔더마스킹이 완벽하고 선/자국, 마감이 최대한 좋습니다.
어쨌든 1Amp 전류를 견딜 수 있는 300mmtrace를 사용했습니다.
여기에서 PCB 파일을 다운로드할 수 있습니다.
납땜 및 테스트 회로:
이 단계에서 나는 모든 것을 납땜했습니다. 흄을 흡입하지 않도록 각별히 주의하십시오. 암을 유발할 수 있습니다.
나는 Bluetoothmodule이나 TF 모듈을 사용하지 않으므로 납땜하지 않은 채로 두었습니다. 좋은 점은 3servo 모터와 하나의 소나 센서를 사용했으며 Arduino를 프로그래밍하기 위해 연결한 USB 케이블에서 모든 것이 쉽게 전원을 공급받을 수 있다는 것입니다. 우리가 다른 전원을 생각하지 않기 때문에 이것은 훌륭합니다.
그러나 여전히 외부 배터리를 사용하려면 lipo 2s(7.4V) 배터리로 이동하십시오. 그 이상을 사용하면 서보가 연소됩니다.
몸 만들기: 그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림>
나는 몸을 만들기 위해 PVC 시트를 사용했습니다. 판지도 사용할 수 있습니다. 먼저 메인 부품 상자를 만들었습니다. 메인 보드와 서보 모터가 있습니다. 그것은 상자를 만드는 것과 같습니다. 같은 방법으로 헤드를 만들고 센서용 구멍(눈으로)을 2개 만들었습니다. 필요한 모든 사진을 추가했습니다. 나는 한 손을 렌치처럼 만들고 다른 손을 플러그처럼 만들었습니다. 실제로 플러그를 사용하고 핫 글루를 사용하여 한쪽 팔에 추가했습니다.
치수? 실제로는 없습니다. 여러분의 로봇이기 때문에 간단한 도구를 사용하여 만들 수 있으므로 원하는 모양과 크기로 만들어 보세요.
본체를 닫기 전에 전자 장치를 모두 추가하도록 각별히 주의하십시오. 센서와 전자제품을 모두 넣은 후 본체를 도색했습니다. 그렇게하지 마십시오. 이미 Arduino를 노란색으로 색칠했습니다.
그래서 바디 마무리 후 도색을 하고 전자제품을 모두 넣어주세요.
코딩1(파이썬):
이 사이트에서 Python을 다운로드하고 설치하는 동안 경로에 pythonin을 추가해야 합니다.
Python을 설치한 후 명령 프롬프트/터미널에서 음성 인식, 오디오 지원, 텍스트 음성 변환, BrowserAutomation, 직렬 통신을 위한 설치 라이브러리에 대한 일부 명령을 실행해야 합니다. 다음 명령을 실행하십시오 -
pip installspeechrecognitionpip install pyaudiopip install pyttsx3pip install pywhatkitpip install pyserial
그런 다음 여기에서 pythoncode를 다운로드하거나 아래에서 복사하십시오. 코딩2단계로 이동합니다.
""" JAUNDICE:Arduino 및 Python이 포함된 AI 보조 로봇저자:ashraf minhajmail:[email protected]최종 편집:2020년 11월 라이선스:Copyright (C) Ashraf Minhaj.General Public License(GPL3+)"""import speech_recognition as sr # 음성 인식 라이브러리import random # 목록에서 임의의 단어 선택import pyttsx3 # 오프라인 Text to Speech 가져오기 datetime # 날짜 및 시간 가져오기 웹 브라우저 가져오기 # 웹 작업을 열고 수행하기 위한 import serial # 직렬 통신용import pywhatkit # 더 많은 웹 자동화# 로봇 이름 선언 (Wake-Up word)robot_name ='황달'# random words listhi_words =['hi', 'hello', 'yo baby', 'salam']bye_words =['bye', 'tata', 'hasta la vista' ]r_u_there =['거기', '거기']# initilize thingsengine =pyttsx3.init() # 텍스트 음성 변환 엔진 초기화#voices =engine.getProperty('음성') #음성 확인#engine.setProperty( 'voice', voices[1].id) # 여성 voicelistener =sr.Recognizer() # 음성 인식 API 초기화 # NiNi mot와 연결 또는 직렬 통신을 통한 드라이버 보드 시도:port =serial.Serial("COM15", 9600) print("물리적 바디, 연결됨.")제외:print("내 물리적 바디에 연결할 수 없습니다.")def listen():"" " 사용자의 말을 들어보세요""" 시도:sr.Microphone()을 소스로 사용:# 마이크에서 입력을 얻습니다. print("Talk>>") voice =listener.listen(source) # 마이크에서 듣기 명령 =listener.recognize_google (음성).lower() # Google API 사용 # 모든 단어 소문자- 우리가 쉽게 처리할 수 있도록 #command =command.lower() print(command) # 처음에 깨우기 단어 찾기 if (command.split(' ')[0] ==robot_name):# 깨우기 단어가 발견되면.... print("[wake-up word found]") process(command) # 다음을 제외하고 조치를 취하기 위해 프로세스 함수를 호출합니다. passdef process(words) :""" 사용자가 말한 것을 처리하고 조치를 취합니다. """ print(words) # 명령을 받았는지 확인 # break words in word_list =words.split(' ')[1:] # 공백으로 분할하고 깨우기 무시 -up word if (len(word_list)==1):if (word_list[0] ==robot_name):talk("어떻게 도와드릴까요?") #.write(b'l') return if word_list[0] =='play':"""if command for play things, play from youtube""" talk("Ok boss, play" ) extension =' '.join(word_list[1:]) # 명령어 없이 검색 port.write(b'u') pywhatkit.playonyt(extension) port.write(b'l') return elif word_list[0] =='search':"""if command for google search""" port.write(b'u') talk("알았어 보스, 검색") port.write(b'l') extension =' '.join (word_list[1:]) pywhatkit.search(extension) return if (word_list[0] =='get') and (word_list[1] =='info'):"""정보를 가져오기 위한 명령""" port.write(b'u') talk("알았어, 내가 옳았어") port.write(b'u') extension =' '.join(word_list[2:]) # 명령어 없이 검색 inf =pywhatkit.info(extension) talk(inf) # 결과에서 읽기 return elif word_list[0] =='open':"""if command for opening URLs""" port.write(b'l') talk(" Opening, sir") url =f"http://{''.join(word_list[1:])}" # URL을 webbrowser.open(url)이 elif word_list[0] =='uppercut'으로 반환하도록 합니다. port.write(b'U') elif word_list[0] =='smash':port.write(b's') elif word_list[0] =='punch':port.write(b'p') # 이제 확인 word_list에 있는 단어와 일치하는 경우:if word in hi_words:""" 사용자가 hi/hello라고 말하면 그에 따라 인사합니다.""" port.write(b'h') # 손을 흔드는 명령을 보냅니다. talk(random.choice(hi_words) ) bye_words의 elif 단어:""" if user say bye etc""" talk(random.choice(bye_words))def talk(sentence):""" talk / 사용자에게 응답 """ engine.say(sentence) engine.runAndWait()# 앱을 실행하는 동안 True:listen() # 한 번 청취를 실행합니다.
코딩2(아두이노):
이 부분은 간단하고 설치할 것이 없습니다. Arduino.ide를 사용하여 보드를 프로그래밍합니다. Arduino를 사용한 적이 없다면 여기에서 다운로드하십시오.
앞서 언급했듯이 Arduino 프로그램은 직렬 데이터를 기다리고 데이터를 받으면 바이트 데이터를 확인합니다. 데이터가 미리 정의된 명령과 일치하면 명령문을 실행합니다. 'u'를 보내면 이렇게 양손이 위로 올라가게 됩니다.
여기에서 코드를 다운로드하십시오. 아래에서 복사하십시오.
/** JAUNDICE:Arduino 및 Python이 포함된 AI 도우미 로봇 *** * 작성자:ashraf minhaj* 메일:[email protected]* 최종 편집:2020년 11월* * 라이선스:Copyright (C) Ashraf Minhaj .* 일반 공중 라이선스(GPL3+)*/#includeServo head;Servo l_hand;Servo r_hand;// 소나 센서의 핀셋 정의 int trig =4;int echo =5;// 수신된 데이터 바이트 val =""; void setup() { // 여기에 설정 코드를 넣어 한 번 실행:head.attach(2); l_hand.attach(3); r_hand.attach(4); Serial.begin(9600); // 직렬 포트를 통해 Python과 통신하기 위해}void standby(){ // 이 위치에 있는 모든 모터 head.write(90); 정수 r_pos =30; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos);}void hi(){ // 이 위치에 있는 모든 모터 head.write(90); 정수 i =0; for(i=30; i<=170; i++){ r_hand.write(i); 지연(5); } for(i=170; i>=100; i--){ r_hand.write(i); 지연(5); } for(i=100; i<=170; i++){ r_hand.write(i); 지연(5); } for(i=170; i>=30; i--){ r_hand.write(i); 지연(5); } standby();}void hands_up(){ // 모든 명령에서 이 작업을 수행합니다. //지연(300); //head.write(90); 정수 i =0; for(i=30; i<=170; i++){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); } 지연(600); for(i=170; i>=30; i--){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); }}void weight_lift(){ // 양손으로 무게를 들어올립니다. int i =0; for(i=30; i<=170; i++){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); } for(int count=0; count<=4; count++){ for(i=170; i>=60; i--){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); } for(i=60; i<=170; i++){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); } } for(i=170; i>=30; i--){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); }}void 흥분된(){ return;}void look_left(){ // 헤드를 왼쪽으로 회전합니다. head.write(180);}void 혼란스러운(){ for(int count=0; count<=1; count++){ head .쓰기(30); r_hand.write(170); 지연(700); r_hand.write(30); head.write(120); l_hand.write(30); 지연(700); l_hand.write(160); } standby();}void double_punch(){ // 펀치 수행 int i =0; for(i=30; i>=0; i--){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); } 지연(2000); 정수 r_pos =80; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(500); Standby();}void r_upper_cut(){ // 오른쪽 상단 컷을 만듭니다. int i =0; for(i=30; i<=170; i++){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); } for(int count=0; count<=4; count++){ int i =0; for(i=170, i>=60, i--){ r_hand.write(i); 지연(1); } for(i=60; i<=170; i++){ r_hand.write(i); 지연(1); } } 대기(); delay(100);}void smash(){ // 부수기 int i =0; for(i=30; i<=170; i++){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(5); } 지연(2000); for(i=170; i>=0; i--){ int r_pos =i; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(1); } 지연(300); 정수 r_pos =180; 정수 l_pos =지도(r_pos, 0, 180, 180, 0); l_hand.write(l_pos); r_hand.write(r_pos); 지연(1000); standby();}void eye_detect(){ // 눈 센서가 움직임을 감지하면 조치를 취합니다. return;}void loop() { // 여기에 기본 코드를 넣어 반복적으로 실행합니다. standby(); while(Serial.available()> 0) //사용 가능한 직렬 데이터를 찾습니다. { val =Serial.read(); //시리얼 값 읽기 if(val =='h'){ // do hi hi(); } if(val =='p'){ // 안녕 double_punch(); } if(val =='u'){ hands_up(); 지연(3000); } if(발 =='l'){ 대기(); 왼쪽을보다(); 지연(2000); } if(val =='U'){ // 어퍼컷 r_upper_cut(); 지연(2000); } if(발 =='){ 스매시(); 지연(2000); } }}
코드를 업로드하세요.
모든 것을 통합하고 완료:
모든 단계를 완료한 후 USB 케이블을 사용하여 Arduino를 PC에 연결한 다음 Python 프로그램을 실행했습니다. 사용하는 동안 Python 코드에 올바른 Arduino 포트를 추가해야 합니다. 내가 언급한 대로 모든 작업을 수행했다면 봇이 매력처럼 작동할 것입니다.
감사합니다!
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드"> 코드
소스 코드
https://github.com/ashraf-minhaj/JAUNDICE-AI-Assistant-Robot