제품 설계 구상
⓵ 초음파 센서가 10 cm 이내의 컵을 인식하면 LCD디스플레이와 네오픽셀이 작동
⓶ 컵에 부착되어 있는 스티커를 허스키렌즈가 인식하면 스티커 색에 따라 모터의 작동을 다르게하여 각 색마다 다른 칵테일 제조
내일 계획 (팀원 별 업무 분배 및 제작 계획 등)
AI- Bartender 하드웨어 , 칵테일 케이스 제작 완료
모터 구동시의 유류량을 확인하여 각 메뉴마다의 모터 작동시간 조절
네오 픽셀 코딩과 허스키 렌즈를 이용한 모터 구동 코딩을 합쳐서 실행이 되는지 확인
완성된 AI- Bartender 실행과 부족한점 보완
ppt 만들기 & 발표 연습 >> 예상 질문과 피드백 과정
추가 사항
초음파 센서를 이용한 LED화면 구동과 허스키 렌즈를 이용한 모터 구동의 코딩을 합쳤을 때 제대 로 작동하지 않아 멘토님에게 질문을 드려 해결함. 내일 멘토링 시간에 허스키렌즈의 UART 연결과 I2C연결의 차이를 질문드릴 예정.
#define TRIG 3 //아두이노 7번 핀을 TRIG으로 정의
#define ECHO 2 //아두이노 6번 핀을 ECHO으로 정의
#define MOTER1_A A0 //아두이노 A1번 핀을 MOTER1_A으로 정의(analog)
#define MOTER2_A A1 //아두이노 A2번 핀을 MOTER2_A으로 정의(analog)
#define MOTER3_A A2 //아두이노 A3번 핀을 MOTER3_A으로 정의(analog)
#define MOTER4_A A3 //아두이노 A4번 핀을 MOTER4_A으로 정의(analog)
#define NEO_PIN 8 //아두이노 8번 핀을 LED로 정의
#define NEO_COUNT 16 //LED 개수
#include <LiquidCrystal_I2C.h> //LCD 코딩을 위한 라이브러리 불러오기
#include <Adafruit_NeoPixel.h> //LED 코딩을 위한 라이브러리 불러오기
LiquidCrystal_I2C lcd(0x27, 16, 2); //16x2칸의 LCD를 설정
Adafruit_NeoPixel light = Adafruit_NeoPixel(NEO_COUNT, NEO_PIN, NEO_GRB + NEO_KHZ800);
#include "HUSKYLENS.h"
#include "SoftwareSerial.h"
HUSKYLENS huskylens;
SoftwareSerial mySerial(10, 11);
//void printResult(HUSKYLENSResult result);
long distance;
/----------------------------------------------------------------------------/
void setup() {
Serial.begin(115200);
mySerial.begin(9600);
pinMode(ECHO, INPUT); //ECHO를 입력 모드로 설정
pinMode(TRIG, OUTPUT); //TRIG를 출력 모드로 설정
lcd.init(); //LCD초기화
lcd.backlight(); //LCD 백라이트 켜기
light.begin(); //light 라이브러리 시작
while (!huskylens.begin(mySerial))
{Serial.println(F("Begin failed!")); Serial.println(F("1.Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>Serial 9600)")); Serial.println(F("2.Please recheck the connection.")); delay(100);
}
}
void loop() {
digitalWrite(TRIG, LOW); delayMicroseconds(2); //초음파센서의 Trig에서 초음파를 발사
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
distance = pulseIn(ECHO, HIGH)/58.2; //Echo에서 받은 초음파의 시간을 거리로 계산
delay(50); //0.05초 기다리기
if (!huskylens.request()) Serial.println(F("Fail to request data from HUSKYLENS, recheck the connection!"));
else if(!huskylens.isLearned()) Serial.println(F("Nothing learned, press learn button on HUSKYLENS to learn one!"));
else if(!huskylens.available()) Serial.println(F("No block or arrow appears on the screen!"));
else
{
HUSKYLENSResult result;
Serial.println(F("###########"));
while (huskylens.available()){result = huskylens.read();break;}//허스키렌즈가 동작 가능하면 result객체가 허스키렌즈의 반응을 받는다
if (result.command == COMMAND_RETURN_BLOCK){//색상 인지하는 상자가 허스키렌즈에 잡힐 때if(result.ID==1&&distance<10){//초음파의 거리와 상자 번호 판단 lcd.setCursor(0,0); //0,0 지점으로 커서 이동 lcd.clear(); lcd.print("Waiting..."); //"Waiting..." 출력 light.rainbow(20); light.show(); // 네오픽셀 무지개 delay(2000); menu1(); }else if(result.ID==2&&distance<10){ lcd.setCursor(0,0); //0,0 지점으로 커서 이동 lcd.clear(); lcd.print("Waiting..."); //"Waiting..." 출력 light.rainbow(20); light.show(); // 네오픽셀 무지개 delay(2000); menu2(); }else if(result.ID==3&&distance<10){ lcd.setCursor(0,0); //0,0 지점으로 커서 이동 lcd.clear(); lcd.print("Waiting..."); //Waiting... 출력 light.rainbow(20); light.show(); // 네오픽셀 무지개 delay(2000); menu3(); }else if(distance>=10){ lcd.setCursor(0,0); //0,0 지점으로 커서 이동 lcd.clear(); lcd.print("Give me a cup!"); //out of 10cm! 출력 for(int num = 0 ; num<16 ; num++){ light.setPixelColor(num, light.Color(127,127,127)); light.show(); } // 네오픽셀 흰색 } }
}
}
//loop함수() : 지속적으로 동작 시켜야 하는 부품에 대한 코드 digitalWrite : 초음파를 발사시키는 함수. huskylens.avaiable : 허스키렌즈가 동작 가능한 상태면 result객체가 허스키렌즈 동작 값을 받는다. 동작 값이 밑 사진처럼 색상을 인지하고 있다면(COMMAND_RETURN_BLOCK) 색상의 ID에 따라 조건에 맞는 코드가 실행된다. 이 때, 초음파가 컵이 있음을 인지하여야 동작한다. (distance<10) 색상 ID 조건에 따라 그에 상응하는 LCD 문구, light 및 모터가 작동하여 액체가 나오는 구조. (모터는 menu함수)
void menu1(){ //메뉴 1번: 1번음료= 1초, 2번음료=1.5초, 3번음료=2초
lcd.clear(); //시작 전 모든 모터 정지
lcd.print("Menu1!"); //Menu1! 출력
for(int num = 0 ; num<16 ; num++){light.setPixelColor(num, light.Color(255,0,0)); light.show();
} // 네오픽셀 빨간색
analogWrite(MOTER1_A,0); //1번 모터 -analog
analogWrite(MOTER2_A,0); //2번 모터 -analog
analogWrite(MOTER3_A,0); //3번 모터 -analog
analogWrite(MOTER4_A,0); //4번 모터analogWrite(MOTER1_A,255); //MOTER1 회전(4초)
delay(4000);
analogWrite(MOTER1_A,0); //MOTER1 정지analogWrite(MOTER2_A,255); //MOTER2 회전(1.5초)
delay(1500);
analogWrite(MOTER2_A,0);analogWrite(MOTER3_A,255); //MOTER3 회전 (2초)
delay(2000);
analogWrite(MOTER3_A,0); //MOTER3 정지
//컵을 10cm 이상 가져가면 코드 벗어남
while(true){lcd.clear(); digitalWrite(TRIG, LOW); delayMicroseconds(2); //초음파센서의 Trig에서 초음파를 발사 digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); distance = pulseIn(ECHO, HIGH)/58.2; //Echo에서 받은 초음파의 시간을 거리로 계산 if(distance > 10){ lcd.print("See you NEXT!"); //See you NEXT! 출력 for(int num = 0 ; num<16 ; num++){ light.setPixelColor(num, light.Color(0,0,0)); light.show(); } // 네오픽셀 색 제거 delay(1000); break; } else{ lcd.print("Finish!"); //Finish! 출력 for(int num = 0 ; num<16 ; num++){ light.setPixelColor(num, light.Color(127,127,127)); light.show(); } // 네오픽셀 흰색 delay(1000); }
}
}
//허스키렌즈 ID와 초음파의 거리가 조건에 충족한다면 모터가 작동하고 액체가 나와야하는데, menu함수에서 모터 작동을 다룬다.대표적으로 menu1을 보자면, LCD와 LED가 입력받은 색상에 따라 작동하며, 각각의 모터들이 시간차로 작동하여 액체가 나온다.컵에 가득 차 있는데 컵을 가져가지 않았다면 (distance<10) LCD에서 “Finish”라는 문구와 LED가 초기에 지정한 색상으로 바뀌며 컵을 가져간다면 LED의 색이 꺼지면서 “See you next”라는 문구가 LCD에 출력이 된다.
void menu2() { //메뉴 2번: 1번음료= 1초, 2번음료=1.5초, 4번음료=2초
lcd.clear(); //시작 전 모든 모터 정지
lcd.print("Menu2!"); //Menu1! 출력
for(int num = 0 ; num<16 ; num++){light.setPixelColor(num, light.Color(0,255,0)); light.show();
} // 네오픽셀 초록색
analogWrite(MOTER1_A,0); //1번 모터 -analog
analogWrite(MOTER2_A,0); //2번 모터 -analog
analogWrite(MOTER3_A,0); //3번 모터 -analoganalogWrite(MOTER4_A,0); //4번 모터 -analog
analogWrite(MOTER1_A,255); //MOTER1 회전(2초)
delay(2000);
analogWrite(MOTER1_A,0); //MOTER1 정지analogWrite(MOTER2_A,255); //MOTER2 회전(3.5초)
delay(3500);
analogWrite(MOTER2_A,0);analogWrite(MOTER4_A,255); //MOTER4 회전 (2초)
delay(2000);
digitalWrite(MOTER4_A,0); //MOTER4 정지
//컵을 10cm 이상 가져가면 코드 벗어남
while(true){
lcd.clear();
digitalWrite(TRIG, LOW); delayMicroseconds(2); //초음파센서의 Trig에서 초음파를 발사
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
distance = pulseIn(ECHO, HIGH)/58.2; //Echo에서 받은 초음파의 시간을 거리로 계산
if(distance > 10){
lcd.print("See you NEXT!"); //See you NEXT! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(0,0,0));
light.show();
} // 네오픽셀 색 제거
delay(1000);
break;
}
else{
lcd.print("Finish!"); //Finish! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(127,127,127));
light.show();
} // 네오픽셀 흰색
delay(1000);
}
}
}
void menu3() { //메뉴 1번: 1번음료= 2초, 2번음료=1초, 3번음료=1초, 4번음료=1초
lcd.clear(); //시작 전 모든 모터 정지
lcd.print("Menu3!"); //Menu1! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(0,0,255));
light.show();
} // 네오픽셀 파란색
analogWrite(MOTER1_A,0); //1번 모터 -analog
analogWrite(MOTER2_A,0); //2번 모터 -analog
analogWrite(MOTER3_A,0); //3번 모터 -analog
analogWrite(MOTER4_A,0); //4번 모터 -analog
analogWrite(MOTER1_A,255); //MOTER1 회전(2초)
delay(2000);
analogWrite(MOTER1_A,0); //MOTER1 정지
analogWrite(MOTER2_A,255); //MOTER2 회전(2초)
delay(2000);
analogWrite(MOTER2_A,0);
analogWrite(MOTER3_A,255); //MOTER3 회전 (2초)
delay(2000);
analogWrite(MOTER3_A,0); //MOTER3 정지
analogWrite(MOTER4_A,255); //MOTER4 회전 (1.5초)
delay(1500);
analogWrite(MOTER4_A,0); //MOTER4 정지
//컵을 10cm 이상 가져가면 코드 벗어남
while(true){
lcd.clear();
digitalWrite(TRIG, LOW); delayMicroseconds(2); //초음파센서의 Trig에서 초음파를 발사
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
distance = pulseIn(ECHO, HIGH)/58.2; //Echo에서 받은 초음파의 시간을 거리로 계산
if(distance > 10){
lcd.print("See you NEXT!"); //See you NEXT! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(0,0,0));
light.show();
} // 네오픽셀 색 제거
delay(1000);
break;
}
else{
lcd.print("Finish!"); //Finish! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(127,127,127));
light.show();
} // 네오픽셀 흰색
delay(1000);
}
}
void menu3() { //메뉴 1번: 1번음료= 2초, 2번음료=1초, 3번음료=1초, 4번음료=1초
lcd.clear(); //시작 전 모든 모터 정지
lcd.print("Menu3!"); //Menu1! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(0,0,255));
light.show();
} // 네오픽셀 파란색
analogWrite(MOTER1_A,0); //1번 모터 -analog
analogWrite(MOTER2_A,0); //2번 모터 -analog
analogWrite(MOTER3_A,0); //3번 모터 -analog
analogWrite(MOTER4_A,0); //4번 모터 -analog
analogWrite(MOTER1_A,255); //MOTER1 회전(2초)
delay(2000);
analogWrite(MOTER1_A,0); //MOTER1 정지
analogWrite(MOTER2_A,255); //MOTER2 회전(2초)
delay(2000);
analogWrite(MOTER2_A,0);
analogWrite(MOTER3_A,255); //MOTER3 회전 (2초)
delay(2000);
analogWrite(MOTER3_A,0); //MOTER3 정지
analogWrite(MOTER4_A,255); //MOTER4 회전 (1.5초)
delay(1500);
analogWrite(MOTER4_A,0); //MOTER4 정지
//컵을 10cm 이상 가져가면 코드 벗어남
while(true){
lcd.clear();
digitalWrite(TRIG, LOW); delayMicroseconds(2); //초음파센서의 Trig에서 초음파를 발사
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
distance = pulseIn(ECHO, HIGH)/58.2; //Echo에서 받은 초음파의 시간을 거리로 계산
if(distance > 10){
lcd.print("See you NEXT!"); //See you NEXT! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(0,0,0));
light.show();
} // 네오픽셀 색 제거
delay(1000);
break;
}
else{
lcd.print("Finish!"); //Finish! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(127,127,127));
light.show();
} // 네오픽셀 흰색
delay(1000);
}
}
void menu3() { //메뉴 1번: 1번음료= 2초, 2번음료=1초, 3번음료=1초, 4번음료=1초
lcd.clear(); //시작 전 모든 모터 정지
lcd.print("Menu3!"); //Menu1! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(0,0,255));
light.show();
} // 네오픽셀 파란색
analogWrite(MOTER1_A,0); //1번 모터 -analog
analogWrite(MOTER2_A,0); //2번 모터 -analog
analogWrite(MOTER3_A,0); //3번 모터 -analog
analogWrite(MOTER4_A,0); //4번 모터 -analog
analogWrite(MOTER1_A,255); //MOTER1 회전(2초)
delay(2000);
analogWrite(MOTER1_A,0); //MOTER1 정지
analogWrite(MOTER2_A,255); //MOTER2 회전(2초)
delay(2000);
analogWrite(MOTER2_A,0);
analogWrite(MOTER3_A,255); //MOTER3 회전 (2초)
delay(2000);
analogWrite(MOTER3_A,0); //MOTER3 정지
analogWrite(MOTER4_A,255); //MOTER4 회전 (1.5초)
delay(1500);
analogWrite(MOTER4_A,0); //MOTER4 정지
//컵을 10cm 이상 가져가면 코드 벗어남
while(true){
lcd.clear();
digitalWrite(TRIG, LOW); delayMicroseconds(2); //초음파센서의 Trig에서 초음파를 발사
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
distance = pulseIn(ECHO, HIGH)/58.2; //Echo에서 받은 초음파의 시간을 거리로 계산
if(distance > 10){
lcd.print("See you NEXT!"); //See you NEXT! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(0,0,0));
light.show();
} // 네오픽셀 색 제거
delay(1000);
break;
}
else{
lcd.print("Finish!"); //Finish! 출력
for(int num = 0 ; num<16 ; num++){
light.setPixelColor(num, light.Color(127,127,127));
light.show();
} // 네오픽셀 흰색
delay(1000);
}
}
}