본문 바로가기

Arduino/[4] Arduino Inventor

[Arduino Inventor] #1. 인공지능

728x90
반응형

사물 인식 카메라

앱인벤터는 기본기능으로 사물을 인식하기 위한 기능이 없다. 외부 기능을 추가하여 사물의 인식이 가능하다. 사물을 인식하게 하는 외부 기능의 이름은 lookextention 이라는 확장 기능을 사용한다.

 

구글에서 'lookextention.aix'을 검색하고 첫 번째 사이트에 접속한다.

https://mit-cml.github.io/extensions/

 

MIT App Inventor Extensions

Supported: Name Description Author Version Download .aix File Source Code BluetoothLE Adds as Bluetooth Low Energy functionality to your applications. See BluetoothLE Documentation and Resources for more information. MIT App Inventor 20200828 BluetoothLE.a

mit-cml.github.io

 

다운을 완료하였다면 앱인벤터로 돌아와 [팔레트] > [확장 기능] > [확장 기능 추가하기]를 클릭한다. 이후 [파일 선택] 버튼을 눌러 다운로드 받은 파일을 업로드(Import)한다. 업로드하는데 1분 가량 소요된다.

 

기본 컴포넌트를 생성하고 밑의 컴포넌트 블록을 생성한다. 기본 컴포넌트 블럭은 아래 링크를 참조한다.

https://udangtangtang-cording-oldcast1e.tistory.com/101

 

[Arduino] #8. 앱인벤터 활용하기: 앱 제작하기

스마트폰에 앱인벤터 앱 설치 안드로이드 스마트폰에서 플레이스토어에 접속하여 앱인벤터를 검색한다. 이후 검색 결과에 나오는 MIT A12 Compation를 다운한다. IOS의 경우 앱 스토어에서 동일한 앱

udangtangtang-cording-oldcast1e.tistory.com

 

블록을 다음과 같이 설정한다.

 

인공지능 분류기 제작하기: 디스플레이 출력

해당 포스팅은 참고용으로 필요없는 부분은 생략되었다.

회로도

이미지 분류기에 사진 등록하기: 빅데이터 생성

앱인벤터에서 제공하는 이미지 분류기 사이트에 접속한다. 다음 사이트에서는 이미지를 분류하여 알고리즘을 만들 수 있다.

https://classifier.appinventor.mit.edu/oldpic/

 

Personal Image Classifier

 

classifier.appinventor.mit.edu

분류한 부품의 사진을 찍어 준비한다. 최소 5장 이상 여러 각도로 찍어서 준비한 사진 자료를 만들어둔다.

  1. 사이트의 Add Lable에 분석할 대상의 이름을 적는다. 영어로 작성한다.
  2. [파일 선택]을 눌러 분석할 객체의 사진을 선택한다. 이때 다중 선택이 안되므로 하나 하나 업로드한다.
  3. [Next]를 눌러 다음으로 이동한다.
  4. [Train model] 버튼을 클릭한다. 이후 테스트할 수 있는 창으로 만든 모델을 바탕으로 사진을 찍어 테스트 할 수 있다.
  5. [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/

 

trim() - 아두이노 참조

설명 앞뒤 공백을 없앤 스트링 버전을 얻는다. 1.0부터 trim ()은 새로운 스트링을 반환하지 않고 스트링을 바꾼다. 문법 매개변수 myString: 스트링 형 변수 반환

www.arduino.cc

 

728x90
반응형
댓글