사물 인식 카메라
앱인벤터는 기본기능으로 사물을 인식하기 위한 기능이 없다. 외부 기능을 추가하여 사물의 인식이 가능하다. 사물을 인식하게 하는 외부 기능의 이름은 lookextention 이라는 확장 기능을 사용한다.
구글에서 'lookextention.aix'을 검색하고 첫 번째 사이트에 접속한다.
https://mit-cml.github.io/extensions/
다운을 완료하였다면 앱인벤터로 돌아와 [팔레트] > [확장 기능] > [확장 기능 추가하기]를 클릭한다. 이후 [파일 선택] 버튼을 눌러 다운로드 받은 파일을 업로드(Import)한다. 업로드하는데 1분 가량 소요된다.
기본 컴포넌트를 생성하고 밑의 컴포넌트 블록을 생성한다. 기본 컴포넌트 블럭은 아래 링크를 참조한다.
https://udangtangtang-cording-oldcast1e.tistory.com/101
인공지능 분류기 제작하기: 디스플레이 출력
해당 포스팅은 참고용으로 필요없는 부분은 생략되었다.
이미지 분류기에 사진 등록하기: 빅데이터 생성
앱인벤터에서 제공하는 이미지 분류기 사이트에 접속한다. 다음 사이트에서는 이미지를 분류하여 알고리즘을 만들 수 있다.
https://classifier.appinventor.mit.edu/oldpic/
분류한 부품의 사진을 찍어 준비한다. 최소 5장 이상 여러 각도로 찍어서 준비한 사진 자료를 만들어둔다.
- 사이트의 Add Lable에 분석할 대상의 이름을 적는다. 영어로 작성한다.
- [파일 선택]을 눌러 분석할 객체의 사진을 선택한다. 이때 다중 선택이 안되므로 하나 하나 업로드한다.
- [Next]를 눌러 다음으로 이동한다.
- [Train model] 버튼을 클릭한다. 이후 테스트할 수 있는 창으로 만든 모델을 바탕으로 사진을 찍어 테스트 할 수 있다.
- [Next]를 선택한 후 [Download Model] 버튼을 눌러 모델 데이터를 다운로드 한다.
앱인벤터에서 이미지 분류기를 사용하기 위해서는 확장 기능이 필요하다. 해당 포스트의 맨 위 링크에 접속해 PersonalImageClassifier 확장 프로그램을 다운로드 받는다.
아두이노 코드 작성하기
#include<SoftwareSerial.h>
#include <Wire.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
SoftwareSerial btS = SoftwareSerial(9,10);
const int L[3] = {2,3,4};
void setup(){
btS.begin(9600);
lcd.init();
lcd.backlight();
for(int n =0; n<=2; n++){
pinMode(L[n],OUTPUT);
}
digitalWrite(L[0],HIGH);
delay(1000);
digitalWrite(L[0],LOW);
}
void loop(){
if(btS.available()){
String str = btS.readStringUntil('\n');
str.trim();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(str);
if(str.indexOf("driver")>=0){
digitalWrite(L[0],LOW);
digitalWrite(L[1],LOW);
digitalWrite(L[2],HIGH);
}
else if(str.indexOf("switch")>=0){
digitalWrite(L[0],LOW);
digitalWrite(L[1],HIGH);
digitalWrite(L[2],LOW);
}
else if (str.indexOf("led")>=0){
digitalWrite(L[0],HIGH);
digitalWrite(L[1],LOW);
digitalWrite(L[2],LOW);
}
}
}
[코드 설명]
#include<SoftwareSerial.h>
#include <Wire.h>
#include<LiquidCrystal_I2C.h>
#include<SoftwareSerial.h> | 블루투스 모듈을 사용하기 위한 라이브러리이다. 다만 꼭 블루투스 모듈만이 아닌 외부 시리얼을 사용할 때도 사용한다. |
#include <Wire.h> | 아두이노에서는 I2C 통신을 쉽게 사용할 수 있도록 하기 위해 'Wire'라는 객체를 제공하고 있으며, I2C 통신을 위한 핀으로 SDA, SCL 핀을 하나씩 제공한다. 통신 핀은 밑의 표를 참조한다. |
#include<LiquidCrystal_I2C.h> | LCD를 제어하기 위한 라이브러리이다. |
I2C 통신을 위한 Wire 라이브러리
Uno | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo, Micro | 2 (SDA), 3 (SCL) |
Due | 20 (SDA), 21 (SCL), SDA1, SCL1 |
LiquidCrystal_I2C lcd(0x27,16,2);
SoftwareSerial btS = SoftwareSerial(9,10);
- 0x27,16,2 사이즈의 LCD 패널을 선언한다.
- 블루투스 통신을 위한 객체를 생성한다.
setup()
void setup(){
btS.begin(9600); //블루투스 시리얼 속도를 9600으로 초기화
lcd.init(); //LCD 초기화
lcd.backlight(); //LCD의 백라이트를 킨다.
for(int n =0; n<=2; n++){
pinMode(L[n],OUTPUT);//LED를 출력형태로 선언한다.
}
digitalWrite(L[0],HIGH);//첫 번째 LED를 점등하고
delay(1000); //1초 지연
digitalWrite(L[0],LOW); //첫 번째 LED를 소등한다
}
loop()
void loop(){
if(btS.available()){
String str = btS.readStringUntil('\n');//엔터 입력전까지 입력받아 저장
str.trim();
lcd.clear();//LCD를 클리어한다.
lcd.setCursor(0,0);//LCD의 커서를 (0,0)으로 옮긴다.
lcd.print(str);//LCD에 str을 출력한다.
if(str.indexOf("driver")>=0){
digitalWrite(L[0],LOW);
digitalWrite(L[1],LOW);
digitalWrite(L[2],HIGH);
}
else if(str.indexOf("switch")>=0){
digitalWrite(L[0],LOW);
digitalWrite(L[1],HIGH);
digitalWrite(L[2],LOW);
}
else if (str.indexOf("led")>=0){
digitalWrite(L[0],HIGH);
digitalWrite(L[1],LOW);
digitalWrite(L[2],LOW);
}
}
}
+ trim 함수
https://www.arduino.cc/reference/ko/language/variables/data-types/string/functions/trim/