로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Arduino Open Source
아듀이노 함수의 상세설명
작성자 avrtools™        
작성일 2012/03/09
첨부#1 OneButtonLibrary.zip (4KB) (Down:542)
ㆍ추천: 0  ㆍ조회: 1841   
  One Button Switch Library
제목 : Arduino OneButton Library
참조 : http://www.mathertel.de/Arduino/OneButtonLibrary.aspx

입력 스위치 처리가 잘 되면 장치가 고급으로 느껴지는데, 입력 스위치 처리가 미숙하면?
열심히 만든 장치의 조작성이 떨어지므로 싸구려가 되어 버립니다,,,,

 

누름 스위치 한 개의 값을 읽는데 무슨 라이브러리? 라고 말하기에는 무리가 있지 않을까요?
그렇습니다. 펌웨어를 만들다 보면 스위치 읽기를 조작성이 좋게 잘 만들려면 상당히 어려워 집니다.

스위치 검출의 가장 큰 문제는 주함수에서 시간이 필요한 어떤 중요한 함수를 실행중이거나
함수를 처리하다 말고 스위치 입력을 검출하러갈 수 없는 함수를 실행중일 때 스위치 조작이 발생한다면
장치는 스위치 검출 능력이 떨어지므로 조작성이 나쁜 장치로 판정될 수도 있습니다.
 
또한 스위치의 눌림 검출은 의외로 지연 타이머나, 먼저 상태를 기억하기도 해야 하면서
어떤 경우에는 얼마나 눌려 있었는지를 판단해야 하는 때도 있습니다.
결국 스윛 눌림검출은 처리속도 보다는 시간이 걸리는 종류의 작업이므로,
스위치 눌림 검출을 잘 못 처리하면 정작 중요한 다른 함수의 실행시간을 낭비하게 됩니다.
 
이럴때, 마침 좋은 라이브러리가 있다면, 골치아픈 스위치 처리를 쉽게 만들 수 도 있겠군요,,, 
Library : 첨부파일 #1을 내려받기한 다음 압축을 풀면 아래와 같은 폴더가 나옵니다.
OneButton.cpp와 OneButton.h 가 들어있는 OneButton 폴더를 통째로 Libraries 폴더안에 복사해 줍니다.


  
examples 안의 SimpleOneButton 폴더는 내문서의 Arduino로 복사해 줍니다.
 
 
Arduino IDE를 작동시키고,  Sketch > Import Libary >를 보면
아래의 화면처럼 OneButton 이 등록되어 있습니다.
 

자 이제 File > Open 에서 내문서 > ArduinoSimpleOneButton > 폴더 안의  SimpleOneButton.ino를 선택합니다.
버튼을 입력할 수 있는 라이브러리 소스가 아듀이노 스켓치로 들어 왔습니다.
V자 모양의 Verify 단추를 누르면 컴파일을 시작하고 오류가 없으면 IDE 아래쪽에 Done Compile이 표시됩니다.

이 스켓치와 라이브러리는 표준적인 단추 스위치가 한번, 두번 그리고 오랫동안 눌려지는가를 검출할 때,
어떻게 입력핀을 사용하는지 보여준다. 이것은 한개의 단추 스위치를 다기능으로 재사용하는 것이 가능하다.

아듀이노 프로그램을 시작할 때, 간단한 누름단추를 읽는 예제를 이해하려면,
짧은 시간에 on/off가 반복되는 접점 진동을 제거해야 한다.
결론은 스케치에서 쉽게 처리하는 OneButton 이라고 부르는 작은 라이브러리이다. 
이 자료는 라이브러리를 어떻게 사용하는지 보여준다. ~~~ 중략,

프로그램이 막히지 않게 단추 스위치를 읽기
나는 전용 용도를 위한 loop() 함수로 스켓치가 좀 더 복잡해진다고 추측합니다.
공통적으로 요구되는 방법으로 라이브러리의 tick() 함수 대신에 
단추 스위치가 두번 눌렸는지를  읽는 함수를 만들어야 하고, 주기적으로 호출도 해야 합니다.
 
라이브러리 함수 안에서 모두 3 종류의 검출을 위한 코드를 찾을 수 있습니다.
모든 3 종류의 기능을 위해 당신의 코드는 register 함수로 라이브러리에 연결할 수 있습니다. 
당신의 함수는 알맞게 검출된 상태일 때 호출될 것입니다.

OneButton 라이브러리의 사용 예
이곳은 이미 LED가 연결된 아듀이노 기판의 D13 포트의 출력을 바꾸기 위해, 
누름 스위치를 두번 눌러, 출력을 바꾸는 OneButton 라이브러리를 사용하는 간단한 예이다.

#include "OneButton.h"  // 라이브러리의 소스를 불러 온다.
OneButton button(A1); // 단추 스위치는 A1 핀에 연결한 것을 정의.

void setup()   // 전원이 켜진 후 처음 한번 실행되는 초기화 함수 
{            
   pinMode(13, OUTPUT); //
pin 13을 디지털 출력으로 설정. 
   button.attachDoubleClick(doubleclick); // 라이브러리에 내장된 두번눌린 상태를 검출하는 함수를 스케치에 연결한다.
 } // 초기화 끝 

void loop()     
// 주함수는 연속으로 무한하게 반복된다.
{                
  button.tick();  // 단추 스위치가 두번 눌렷는지 검사한다. 라이브러리에 들어있는 함수이다.
  delay(10);     // 여기에 추가로 다른 일을 하는 함수를 넣을 수 있다.
}  // 주함수의 끝

// 이 함수는 단추 스위치가 2번 눌리면 라이브러리에서 자동으로 호출되어 실행된다.
void doubleclick()
{
  static int m = LOW;  // 눌린 것을 인지하여 여기를 샐행하므로 누름 상태는 지운다.
  m = !m;  // LED 상태를 바꾸기 위해 신호를 뒤집는다. 
  digitalWrite(13, m);  // 뒤집은 신호를 D13 에 출력
}  // 두번 누르기 처리 함수 끝 (이 함수는 스위치 눌림 검출 후에 사용자의 용도를 처리하는 함수이다)


누름단추 스위치가 해제 된 다음, 두번눌림 검출함수가 어떻게 되는지 보여준다.
 
기능의 상세
라이브러리가 어떻게 작동하는지 예제를 설명하여 보여준다.
입력 핀의 한번 눌림을 검출하거나, 두번 눌림 혹은 오래 눌림의 상태를 점검하기 위해,
OneButton 라이브러리 안에서 tick() 함수의 기능을 찾을 수 있습니다. 
 
다음의 상태 그림(state diagram)에서 보여주는 처리의 종류는 유한 상태 처리기 finite state machine (FSM) 이라 한다. 
특별한 그림이나 수학의 수식들도 결국 정보를 쉽게 전달하려는 다른 언어라고 생각하면 됩니다.

 

항상 tick() 함수는 현재 상황에서 호출된다. 현재 상태의 읽기와 입력포트의 값은 분석된다.   
그리고 현재 상태가 변화될 때 사용할 외부 함수 예 doubleclick()이 호출된다.
특별한 OneButton 라이브러리 기능은 delay() 함수나 비슷한 지연함수가 아니다.
그리고 거의 모든 경우에 빠르게 주함수로 돌아올 것이다. (지연이 없으므로 처리속도가 빠르다)

이제 부터는, 이 소프트웨어 장치가 어떻게 작동하는지 설명한다.
입력 값 (Input values)은 일반적으로 디지털 입력 포트에 연결된 단추 스위치의 검출방법이지만,
이 핀은 high 상태로 내부 pull up되어 있고, 연결된 스위치가 눌렸을 때 low 상태로 pull down 된다.
단추 스위치 검출 소프트웨어에서, 처음으로 검출될 디지털 입력 값은 디지털 입력 핀의 값이 사용된다.
int buttonLevel = digitalRead(_pin); // 현재 단추의 신호

다른 입력 값으로 현재 시간이 필요하다. millis() 함수는 좋은 시간값을 제공한다.
이 시간 값은 단추가 눌린 시간의 합계를 완전하게 검출하기 위해 사용된다.
입력핀에 눌려있는 시간 값은 누름처리 변수 now로 복사된다
unsigned long now = millis(); // current (relative) time in msecs.

상태(State) 정보는 한번의 호출 그리고 따라오는 다음 호출 상태 사이에서 숫자와 시간값으로 저장된다.
현재의 상황이 특별한 상태로 명칭된 한개의 변수 _stat 에 정보로 각인(hold)된다.  
즉, 단추가 처음 눌려졌을 때, 상태의 숫자를 사용하고 다른 하나는 시간을 저장할 것이다.  
2개의 변수는 상태 처리기(state machine)의 함수로 정의되고 static keyword로 표시된다.
 
또한 2개의 변수는 다음에 tick 함수의 호출을 위해 숫자로 저장될 것이다.
int _state = 0; // state 0로 시작된다: 단추가 눌릴때 까지 기다린다
unsigned long _startTime; // state 1 으로 설정될 것이다. 

시작 상태 (Starting situation = state 0)
상태 천이는 단추가 누름의 대기에서 0 상태 (state 0)로 시작한다.
단추눌림을 검출하는 함수는 짧은 시간 후에 다시 호출될 것이므로,
만일 단추가 눌려지지 않으면 함수로 부터 즉시 주 함수로 복귀(return)된다.

그러나 만일 단추가 눌려졌다면, 변수 now는 stat 0에서 다른 상태인 stat 1으로 저장된다.
지난 시간의 판단은 먼저 현재의 시간을 기억해 두어야 분석할 수 있기 때문이다.
 
if (_state == 0)  // 입력포트에 연결된 단추가 눌릴때 까지 대기한다.  
{    
   if (buttonLevel == ButtonDown)     // 단추가 눌린 경우에만 다음을 실행

  {
     _state = 1;    // 단추가 눌렸으면 상태 1로 옮긴다 
     _startTime = now;    // 현재의 시간을 저장 
    }


처음으로 단추가 눌려 졌을 때 (state 0) 몇 ms 이후에는 다음 함수가 호출될 것이다.
단추가 눌려졌으면 다시 시작상태(state 0)로 되거나, 새로운 상태(state 1)로 됩니다. 
이 경우에는 단추의 눌림이 풀릴 때 까지 기다린 다음 다음 상태(state 2)로 넘어가게 됩니다.
 
인간의 손가락은 그다지 빠르지 않기 때문에, 단추가 계속 눌려진 상태로 있게 되면,
일정시간 단추가 눌린 것 만으로도 단추의 눌림검출 함수을 완성할 수 도 있지만,,,
이 함수에서는 아무런 상태의 변화가 없습니다, 즉 단추눌림의 검출은 발생하지 않습니다.
 
즉, 단추가 계속눌린 상태(state 1)는 새로운 tick 이 발생할 때 까지 기다립니다.
단추눌림이 1초 이상 계속되면, 오래눌림의 검출이 발생하고 다른 상태(state 6)로 됩니다.

이것은 실제 눌려진 시간과 단추눌림이 시작된 시각 부터 정의된 간격으로 비교됩니다.
이 경우에는 외부의 눌림처리 press() 함수를 호출하게 된다. 아래의 라이브러리 코드를 보라.

else if (_state == 1) // 만일 상태가 1 이라면 눌림이 풀리기를 기다린다.
{

   if (buttonLevel == ButtonUp) _state = 2; // 눌림이 풀렸으면 상태 2 (state 2)로 간다 
   else if ((buttonLevel == ButtonDown) && (now > _startTime + _pressTicks))
  {
     if (_pressFunc) _pressFunc();   // 만일 오래눌림이 검출되면 상태 6 (state 6)으로 간다.
     _state = 6; // step to state 6
   }

}  // 상태 2 나 상태 6 이 아니면 이전 상태를 유지하고 주함수로 나간다. 
 
단추는 처음 눌림에서 풀렸다(state 2). 이 상태(stat 2)는 단추가 이미 풀렸으므로 2개의 일이 된다.
 
만일 어느정도 단추가 눌린 다음 얼마 동안 눌려지지 않았다면,
외부 click() 함수가 실행-호출(call)-된다음 state는 0으로 리셋된다.
 
만일 단추가 이전부터 계속 눌려있다면,
2 번째 단추가 눌린것으로 검출되어 다음 상황 (state 3)으로 전달할 것이다. 
 
 else if (_state == 2)  // 시간초과나 다음 눌림이 있을 때 까지 기다린다.
 { 
    if (now > _startTime + _clickTicks)
   { 
        if (_clickFunc) _clickFunc();   // 짧은 한번 눌림이면, 외부 사용자 처리함수를 실행한다.

        _state = 0;       // 상태를 0으로 리셋.
    }

    else if (buttonLevel == ButtonDown) _state = 3; // 계속 눌려 있다면 state 3으로 간다. 
  }

입력 핀이 다음 시간까지 풀리기를 기다린다. 2 번째 눌림이 검출된 이후는 마지막 상황 (state 3)이다.
정의된 시간틀 안에서 단추가 풀리기를 기다린다. 이것은 외부 사용자 두번눌림 함수 doubleClic()을 실행할 것이다.
그리고 상태 처리기(state machine)는 모든 기억을 지우고 리셋된다.  
 
else if (_state == 3)  // 상태가 3 이면 눌림이 풀릴때 까지 기다린다.
{
   if (buttonLevel == ButtonUp) // 만일 단추가 풀렸으면
   {
      if (_doubleClickFunc) _doubleClickFunc(); // 외부의 2번 눌림 처리를 실행한다

      _state = 0;    // 상태를 0으로 리셋한다.
    }

}  // 만일 단추가 안풀리면 그대로 주함수로 나간다.

다음번에 입력핀이 풀리기를 기다린다.
이 상황(state 6)은 2번째 눌림검출과 매우 비슷하다
단추가 풀리기를 기다리며 상태를 유지한다.
이때는 상태 처리기(state machine)가 시작할 때부터의 모든 기억을 지우고 리셋한다. 
 
else if (_state == 6)  // 오랫동안 눌림후에 단추가 풀릴 때 까지 기다린다.
{
   if (buttonLevel == ButtonUp) //만일 단추가 풀리면
  {
     _state = 0; // 상태를 0으로 리셋한다.
   }

} // 계속 눌려있다면 주함수로 아무일도 하지 않고 주함수로 돌아간다.

요약 :
유한상태 처리기 (FSM)는 많은 상황과 복잡한 구조를 낮추는 도움을 주기가 매우 쉽다.
그리고 아듀이노의 스켓치에서 의사(pseudo) 병렬처리(multitasking)로 작성된 방법으로 도움을 준다.
 
OneButton 라이브러의 설치방법은 위에서 설명했으므로 생략한다.
하지만 라이브러리를 설치하고 아듀이노 스켓치를 실행해야 자동으로 추가된 library를 인식한다.

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
AVRTOOLS™
   
  0
9999
윗글 아듀이노의 주파수 출력 함수
아래글 아듀이노 논리연산
    N         제목    글쓴이 작성일 조회 추천
판매상품의 사용설명서는 다른 자료실에,,, avrtools™ 2011/08/30 (화) 1460 0
23 LCD 문자표시 (신형) avrtools™ 2012/04/12 (목) 2101 0
22 아듀이노 멜로디 연주 avrtools™ 2008/08/22 (금) 3454 0
21 아듀이노 4비트 LCD (구형) avrtools™ 2008/09/02 (화) 4301 0
20 아듀이노 가변저항 avrtools™ 2008/08/26 (화) 3073 0
19 직렬 데이터 이동(shift) 출력 avrtools™ 2012/04/10 (화) 1711 0
18 디지털 신호의 펄스폭을 측정하는 함수 avrtools™ 2012/04/10 (화) 1973 0
17 EEPROM 읽기, 쓰기 함수 avrtools™ 2012/04/10 (화) 2280 0
16 변수의 크기 avrtools™ 2012/04/10 (화) 1612 0
15 플레시 메모리에 상수를 저장하고 읽는 함수 avrtools™ 2012/04/10 (화) 1896 0
14 소프트웨어 Serial 함수 avrtools™ 2012/04/10 (화) 1793 0
13 아듀이노 터치스위치 [3] avrtools™ 2008/08/11 (월) 4104 0
12 아듀이노 shiftOut avrtools™ 2008/09/10 (수) 3363 0
11 아듀이노 스위치와 LED점등 avrtools™ 2008/08/13 (수) 4634 0
10 아듀이노의 주파수 출력 함수 avrtools™ 2009/10/20 (화) 2736 0
9 One Button Switch Library avrtools™ 2012/03/09 (금) 1841 0
8 아듀이노 논리연산 avrtools™ 2008/08/26 (화) 3004 0
7 아듀이노 PS2 키보드 읽기 avrtools™ 2008/09/10 (수) 4072 0
6 아듀이노 가로채기 함수 avrtools™ 2008/08/23 (토) 3185 0
5 아듀이노 전용명령 avrtools™ 2008/09/16 (화) 3914 0
4 아듀이노 PWM 출력과 타이머1 전용명령 avrtools™ 2008/08/19 (화) 3561 0
3 8비트 포트의 단일비트 조작방법 avrtools™ 2010/10/30 (토) 2365 0
2 직렬포트에서 문자를 받아 숫자 int로 저장 avrtools™ 2012/04/08 (일) 1682 0
1 직렬통신포트의 초기화 avrtools™ 2012/04/06 (금) 1468 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0