반응형

【 아두이노에러잡기#3】 버튼 디바운싱 해결하기 (with LCD)


 아두이노 기초 단계에서, 버튼을 사용할 때 기계적 접점의 바운싱 문제 해결을 위해 하드웨어가 아닌 소프트웨어적으로 해결을 해보았습니다.  

여기에 LCD를 연결하면 디바운싱 루틴이 잘 작동하지 않는 사항이 있어, 
해결하는 과정을 영상을 통해 학습해보도록 하겠습니다.   

 간단히 해결 답만 제시해드릴 수도 있지만, 답보다 차근 차근 문제해결하는 능력을 기르는 것이 더 중요하기 때문에, 영상제작에 시간이 걸리지만 제작해서 올려 봅니다. 


▶ 참고 학습 :

   1. [아두이노 기초 #6] 채터링과 디바운스  ☜ (클릭)

  2. [아두이노 기초 #14] 문자LCD 제어 실습 ☜ (클릭)
  3. [아두이노 센서 #14] ...I2C LCD 사용하기 참조 ☜ (클릭)



▶ 트러블 현상 :

  디바운싱 루틴이 시리얼 모니터 창을 통해서는 잘 동작 되었지만, LCD를 연결하면, 잘 작동하지 않는 문제가 발생 하였다.
이에 LCD를 부착한 상태에서도 디바운싱 현상을 해결하고, LCD에 Push, Pull 버튼 표시도 원활히 하고자 한다.

 


▶ 트러블 슈팅 영상 

( 영상에서는 I2C 모듈이 있는 LCD를 사용하였구요, 

I2C 모듈이 없는 LCD 사용할 때는 헤더파일 선언과 객체를 그것에 맞게 적어주시면 되구요, 나머지 부분은 영상과 똑같이 작성하면 됩니다. ) 


(전체화면 보기로 보세요)



아두이노 프로그램 설명


#include <Wire.h>                    //  LCD 관련 추가

#include <LiquidCrystal_I2C.h>     //  LCD 관련 추가

LiquidCrystal_I2C lcd (0x27, 16,2); //  LCD 관련 추가

#define BUTTON 2            // 버튼 입력 핀

#define bounceTimer 50     // 바운싱 카운트를 작게 줄일 것!

u8 keyState = HIGH;          // 버튼의 상태 저장용 변수

u8 bounceCount = 0;         // 바운스 변수 선언


void setup() {

  pinMode(BUTTON, INPUT);  // 버튼(핀)을 입력으로 설정

  digitalWrite(BUTTON, HIGH); 

  Serial.begin(9600);           // 시리얼 통신 시작

  lcd.begin();                   //  LCD 관련 추가

  lcd.clear();                    // LCD 관련 추가  

  lcd.setCursor(0,0);           // LCD 관련 추가

  lcd.print("RasINO Button!"); // LCD 관련 추가

}


void loop() {

  lcd.setCursor(0,1);

  u8 key = digitalRead(BUTTON); // 버튼값 읽어 key변수에 저장

  if(key == LOW)  {                //버튼이 눌러졌다면

    if(keyState == HIGH) {      // 이전의 버튼 상태가 떨어졌다면

          if(bounceCount == 0) { 

            bounceCount = bounceTimer;

            Serial.println("Push"); 

            lcd.print("Push");      // LCD 관련 추가

            keyState = key;

          }  else {

              bounceCount --;  //  바운스 카운트 값 감소

          }      }    }    

   else{                          // 버튼이 안 눌러졌었다면

    if(keyState == LOW)  {    // 이전의 상태가 눌린 상태였다면

      Serial.println("Pull");     // 버튼을 놓은(Pull) 것임     

      lcd.print("Pull");         // LCD 관련 추가

      keyState = key;   }     // 놓은(Pull)버튼 상태 저장.

  }  

}



▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

debounceLCD.zip




【 LCD관련 에러나 동작이 안 될 때 】

 LCD관련한 라이브러리 에러나 코드 에러에 대한 안내를 드립니다.  

 크게 아래와 같은 두 가지 형태를 보이는데요, 


▶ 1. 코드를 실행하기전 LiquidCrystal_I2C.h: No such file or directory 에러라고 뜨는 경우!


 이때는 LCD 헤더파일이 설치가 되어 있지 않았을 경우입니다.  아예 관련 라이브러리(해더 파일)가 설치 되지 않은 경우입니다. 

해결법은 바로 아래에 첨부한 라이브러리를 다운받아 압축을 풀지 말고 라이브러리 관리 메뉴에서  .zip 라이브러리 추가 메뉴를 이용해서 추가해주세요.

경로 :  아두이노IDE >  스케치 》 라이브러리 포함하기  .zip 라이브러리 추가...  "다운받은 라이브러리파일 선택"


▶ 2. 또 한가지 LCD관련 에러는 ,  no matching function for call to ‘LiquidCrystal_I2C::begin();   라고 뜨는 경우!

 라이브러리 파일도 똑같은 이름이지만, 제공자에 따라 내부코드가 다른 라이브러리인 경우가 종종 있어요.  그래서 만약 제가 실험에서 사용한 라이브러리가 아닌,  같은 이름이지만 다른 라이브러리를 사용할 경우 위와 같은 에러 표시를 낼 수 있습니다.    라이브러리는 분명 설치되어 있지만 그래서 프로그램이 인지는 하는데, 코드에서 사용한 함수 적용이 되지 않을 때 이런 에러를 띄우게 됩니다.    그럼, 해결책은 실험에 사용한(적용한) 그 라이브러리를 다시 설치해 주어야 하는데요,   이 때 중요한 것은 아두이노에서는 똑 같은 이름의 라이브러리가 두 개 설치될 경우 또다른 중복에러를 띄우게 됩니다.   그러니 잘 못 설치된 라이브러리는 찾아서 반드시 삭제하거나,  다른이름으로 임시 변경해 놓거나,  나중에 다른 프로그램에서 사용해야 할 경우를 대비해서 압축해 놓고 원본은 지워 놓으면 됩니다. 


 그럼 기존 라이브러리를 찾아서 삭제를 하거나 하려면 설치된 라이브러리를 찾아야 겠죠? 

찾는 위치는 보통 아래 두 곳입니다.  (윈도우10 기준이며, 윈도우7도 비슷한 위치) 


두 곳으로 나뉘어 설치되는 이유는 아두이노 IDE의 "라이브러리 관리 메니저" 창을 통해 검색으로 설치되는 기본위치가 있고(아두이노 설치된 경로),   '.zip 라이브러리' 추가로 설치되는 위치가(도큐멘트 문서 저장영역-Doucuments) 따로 있어서 그렇습니다. 


< .zip 라이브러리 추가 메뉴에서 추가한 라이브러리 설치 위치 >

 1. C:\Users\유저-이름\Documents\Arduino\libraries    


 <라이브러리 관리 메뉴창에서 라이브러리 직접 검색으로 설치된 라이브러리 위치 >

 2. C:\Program Files (x86)\Arduino\libraries


위 두 곳에서 찾아서 삭제를 하세요.   (그냥, 폴더 째로 삭제하면 됩니다.)

 그리고 아래 첨부하는 라이브러리를 다운받아  압축파일 그대로 .zip 라이브러리 추가 메뉴로 추가해 주세요. 

만약, 압축파일 그대로 추가할 때 에러가 난다면,  앞축을 풀고  xxxxx.h 가 있는 폴더만 "C:\Users\유저-이름\Documents\Arduino\libraries" 경로에 붙여넣기 하면 됩니다.    이때 아두이노 스케치 IDE는 모두 닫고 재실행 해야 적용 됩니다.


 본 예제에서 사용한 라이브러리 다운로드 받기 :

Arduino-LiquidCrystal-I2C-library-master.zip



  ※ 중요! : 여기에서 제시된 코드로 작성할 경우 반드이 이 라이브러리로 설치하셔야 합니다.   만약, 여러분의 PC에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!

반응형