프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

간단히 사용하는 아두이노

2014-09-24 10:33:35

개요

아두이노를 사용할려면 프로그래밍은 매우 중요한 요소입니다. 부품끼리 다 연결하여도 프로그래밍을 하지 않으면 그 작품은 동작을 하지 않게 됩니다.

이 프로그래밍 때문에 많은 사람들이 아두이노를 접하기 힘들어 하고, 또 아두이노를 공부하시는 분 중에서도 프로그래밍 때문에 고민 해보신 분이 많을 겁니다.


이러한 문제를 해결하기 위해 프로그래밍을 간단하게 만들어 주거나, 코딩없이 바로 아두이노를 사용하게 하는 여러가지 제품들이 나오고 있습니다.

참고 : KocoaFab Blog


이 컨텐츠에서는 프로그래밍을 몰라도 아두이노에 이미 제작된 파일을 업로드만 하면 원하는 곳에 자신이 원하는 부품을 연결하여 안드로이드 어플을 통해서 그 부품을 작동 할 수 있게 해보겠습니다.
(블루투스 모듈 연결만 하면 나머지 핀에 LED, Piezo, Servo, Sensor, 초음파 거리 센서 를 마음대로 연결하고 따로 프로그래밍을 통하지 않고 안드로이드에서 해당 부품을 사용해 볼 수 있습니다. 스케치 업로드에 대한 내용은 링크를 참고하시면 됩니다.)

아두이노를 처음 사용해 보시는 분들이라도 스케치를 받아서 업로드만 할 수 있으면 간단한 센서나 LED 등을 사용할 수 있습니다.


기본 세팅


실제 사용한 사진

 

동영상 미리 보기

 

시작전 개념 이해하기

 - 아두이노 Get Started(LED, Servo, Flex센서, 가변저항, 초음파, 피에조 등)
 - 안드로이드와 아두이노 간의 블루투스 통신 기초
 - 안드로이드와 아두이노 간의 블루투스 통신 응용

부품목록

NO 부품명 수량 상세설명
1 오렌지 보드 1 아두이노 호환보드
2 블루투스 모듈(HC-05) 1 블루투스
3 브레드보드 1 브레드보드
4 점퍼케이블 00 점퍼케이블

수량은 연결할 부품에 따라
늘어나거나 줄어듭니다.

 

 

부품명 오렌지보드 블루투스 모듈 브레드보드 점퍼케이블
파트        

 

 

하드웨어 Making & 소프트웨어 Coding

회로도

 

브레드보드 레이아웃



* 기본 세팅은 블루투스만 연결 해 주면 됩니다. 이후 자신이 원하는 부품을 연결하여 사용하시면 됩니다.

 

 

 

아두이노 코드

 

 

#include 
#include 

SoftwareSerial BTSerial(2,3);

byte buffer[1024];
byte data;
int bufferPosition;

int pin, pin1, val;
boolean state, inputMode;
Servo servo;

void setup(){
  BTSerial.begin(9600);
  Serial.begin(9600);
  bufferPosition = 0;
}

void loop(){
  if(BTSerial.available()){
    data = BTSerial.read();
    buffer[bufferPosition++] = data;
      
    if(data == '\n'){      
      if(buffer[1] == 'A'){
        pin = 14 + (buffer[2]-48);
      }
      else{
        pin = ((buffer[1]-48)*10) + buffer[2]-48;
      }
      
      switch(buffer[0]){  // 입력받은 부품의 종류에 따른 동작을 정해준다.
        case 's':
          servoAct(pin);
          break;
    
        case 'l':
          ledAct(pin);
          break;
          
        case 'i':
          sensorAct(pin);
          break;
        
        case 'u':
          pin1 = ((buffer[3]-48)*10) + buffer[4]-48;
          ultraAct(pin, pin1);
          break;
          
        case 'p':
          piezoAct(pin);
          break;
        }    
        
        bufferPosition = 0;
    }
  }
}

void ledAct(int pin){  // LED동작
  pinMode(pin, OUTPUT);
  boolean ana = checkAnalog(pin);
  if(ana){
    val = valAnalog(3);
    analogWrite(pin, val);
  }
  
  else{
    val = valDigital(3);
    digitalWrite(pin, val);
   }  
}

void servoAct(int pin){  // Servo 동작
  servo.attach(pin);
  val = valAnalog(3);
  servo.write(val);
  
}

void sensorAct(int pin){ // 센서 동작
  pinMode(pin, INPUT);
  val = analogRead(pin);
  Serial.print("Sensor Value : ");
  Serial.println(val);
  BTSerial.println(val);
}

void ultraAct(int trig, int echo){ // 초음파 동작
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  
  float duration, distance;
  
  digitalWrite(trig, HIGH);
  delay(10);
  digitalWrite(trig, LOW);
  
  duration = pulseIn(echo, HIGH);
  distance = ((float)(340 * duration) / 10000) / 2;
  
  Serial.print(distance);
  Serial.println("cm");
  BTSerial.println(distance);
}

void piezoAct(int pin){ // Piezo 동작
  int hz = valAnalog(6) * 10;
  int time = valAnalog(3) * 100;
  tone(pin, hz, time);
}

int valAnalog(int start){ // 아날로그 입력값으로 변경하는 함수
  return (buffer[start]-48)*100 + (buffer[start+1]-48)*10 + buffer[start+2]-48;
}

int valDigital(int temp){ // 디지털 입력값으로 변경하는 함수
  if(buffer[temp] - 48 > 0)
    return 1;
  else
    return 0;
}

boolean checkAnalog(int pin){  // 연결된 핀이 아날로그입력이 되는지 확인하는 함수
 if(pin == 3 || pin == 5 || pin ==6
     || pin == 9 || pin == 10 || pin == 11 || pin >= 14)
   return 1;
   
 else
   return 0; 
}


이 코드는 아두이노에 미리 각 부품의 내용을 넣어 둔 후, 안드로이드에서 전송한 데이터를 가지고 그에 맞는 부품을 실행 하는 코드입니다.
(해당 안드로이드 파일은 easyArduino.apk 를 받으셔서 사용하시면 됩니다.)

LED / Servo모터 / Sensor(입력핀 1개) / 초음파 거리 센서 / Piezo부저 이렇게 5개를 넣었습니다.(더 추가 하실 부품이 있으시면 case를 추가 시킨 후 그에 맞는 센서 동작을 넣어 주시면 됩니다.

 

 

switch(buffer[0]){
        case 's':
          servoAct(pin);
          break;
    
        case 'l':
          ledAct(pin);
          break;
          
        case 'i':
          sensorAct(pin);
          break;
        
        case 'u':
          pin1 = ((buffer[3]-48)*10) + buffer[4]-48;
          ultraAct(pin, pin1);
          break;
          
        case 'p':
          piezoAct(pin);
          break;
        }   

안드로이드에서 보내준 데이터에 제일 첫번째 값(data[0])은 해당 부품의 종류 입니다. 블루투스로 받은 데이터에 첫번째 값을 비교하여 부품의 종류를 구분하고 그 부품에 맞는 동작을 실행합니다.

추가 하실 부품이 있으시면 여기에 넣으시면 됩니다. 안드로이드 소스를 원하시는 분은 링크에서 받으시면 됩니다. 안드로이드 소스는 따로 내용에 넣지 않습니다.

 

 

 

 

      if(buffer[1] == 'A'){
        pin = 14 + (buffer[2]-48);
      }
      else{
        pin = ((buffer[1]-48)*10) + buffer[2]-48;
      }


그다음 보내주는 데이터 2, 3번째 값(data[1], data[2])은 Pin 번호 입니다. 아날로그 핀은 14~19번으로도 인식 되므로 아날라고 핀이 들어오면 뒤에 값에 14를 더해 주면 됩니다.
(위에 소스 밑부분에 PWM, 아날로그 / 디지털 핀 구별 하는 함수가 있습니다.)

4번째 값(배열에 data[3] 값) 부터는 해당 부품에 따라 값의 종류가 다릅니다. 밑의 흐름도를 보시고 들어오는 값을 확인하세요.




이 컨텐츠에서 제작한 프로젝트의 흐름도 입니다. 우선 제일 처음화면에서 아무 버튼이나 누르면 Pin 번호를 누르는 화면이 나옵니다.

그다음 선택을 누르면 LED / Servo인 경운 전송할 값을 입력하는 창이 나오고, Sensor일 경우는 바로 기본화면으로 돌아가고, 초음파 일경우에는 Pin번호 확인창이 하나 더 뜹니다.(초음파는 Trig와 Echo 2개가 필요함으로) 마지막 Piezo는 Hz값과 부저 시간을 입력 받습니다.

작동할 부품의 명령들을 다 입력 하셧으면 전송 버튼을 누르게 되면 아두이노로 전송되면서 센서인 경우는 센서의 값을 받아 밑에 표시해 줍니다.(Value : XXX)

 

 

판다마니아

아두이노, 블루투스, 안드로이드, 센서