반응형

아두이노 IDE 등을 사용하여 컴파일할 때 코드에서 사용되는 라이브러리를 분명히 제대로 설치하였음에도 불구하고, 아래처럼 " xxx.h: No such file or directory "  등의 에러를 내는 경우가 종종 있습니다. 

(이미지1) 라이브러리 충돌 모습

또한 이전에 문제 없었던, WiFi.h  및 DHT.h 등 특정 라이브러리가 복수개로 충돌된다는 메시지도 보이는데요,  갑자기 이런 충돌 메시지를 받게 되면, 당황하여 괜히 잘 사용하던 기존 라이브러리를 삭제하거나 하여 다른 아두이노 코드 실행에도 악영향을 주게 됩니다. 

실제 필요한 라이브러리는 제대로 설치가 된 상황이고 기존 라이브러리도 충돌 되지 않는 상황인데요,  문제의 원인은 우습게도,  아두이노 IDE를 사용할 때 예를 들어, 직전까지 우노 보드를 사용하다가 갑자기 D1보드나 esp32 보드 등 보드를 변경하였을 때, 아두이노 라이브러리의 보드 선택을 바꾸어 주지 않았을 경우 종종 이런 문제가 발생하게 됩니다.  실제 라이브러리 문제가 아님에도 말이죠. 
따라서,  아두이노 IDE를 사용할 때 항상 컴파일 하기전에 사용할 보드선택을 먼저 하는 습관(체크)을 들이시면 좋을 것 같네요.  만약 그렇지 않고 자칫 해서  충돌 문제로 생각하고 이것 저것 라이브러리를 삭제하거나 건드려 놓아 엉키게 되면 또 이를 되돌려 놓는 것에도 진을 빼야 할 수도 있으니 주의하면 좋을 것 같네요. 

아래 이미지는 보드 우노 보드 선택 시 에러가 났다는 것과 USB에 연결된 보드를 제대로 선택한 후 곧바로 에러 메시지가 사라지고 컴파일이 된 이미지입니다. 

연결된 보드선택을 잘못하게 되면 라이브러리 에러를 보게 될 수 있습니다.

(이미지2) 연결된 보드선택을 잘못하게 되면 라이브러리 에러를 보게 될 수 있습니다.

연결된 보드 종류 선택을 제대로 하였을 때 에러가 사라진 모습입니다.

(이미지3) 연결된 보드 종류 선택을 제대로 하였을 때 에러가 사라진 모습입니다.

그럼, 스트레스 해소되는 코딩 생활 되세요~  ^^;

반응형
반응형

WiFi 기능을 기본 탑재하여 사용하기 쉽고 간편한 WiFi 전용 보드를 이용하여 블링크 클라우드(Blynk Cloud) 에 접속하여, 제어하려는 과정 중에서,  아두이노 IDE를 통해 코드를 전송하기 위해 코드를 컴파일했을 때 코드상 에러 없고, 라이브러리 문제도 없었으나,  "http:Blynk.Cloud" 클라우드 화면에서 자신의 WiFi 보드가 연결(Online) 되지 못하는 에러를 겪는 것에 대한 에러 해결 자료입니다.
(물론, 보드가 WiFi 네트워크에 잘 접속되어 있는 상태 임)

(WiFi 전용보드 : 주로 esp8266 칩셋을 이용한 D1, D1 mini, ESP8266, nodeMCU, 혹은 ESP32 , Nano33 ioT 보드 등)

 

 아래 온습도 프로젝트를 ESP32를 이용하여 만든, 블링크 클라우드(Blynk Cloud)의 화면을 보면 Off Line으로 나와 있는 것을 볼 수 있습니다.  물론 ESP32 보드는 스마트폰 핫 스팟이나 기타 WiFi 라우터 등에 잘 연결되어 있는 상태입니다. 

[ 에러 증상 ]

 또한, 아두이노 IDE의 시리얼 모니터 창을 열었을 때 Blynk Cloud와 잘 연결 되었다면 정상적인 연결 화면은 아래와 같습니다.  ( ESP32, ESP8266, Arduino Nano 33 IoT 등등 모두 동일 )

나의 WiFi보드가 Blynk Cloud 2.0에 정상적으로 접속되어 있는 모습


하지만 어떤 이유로 Blynk Cloud에 접속 되지 못하고 아래와 같은 "Invalid auth token" error 에러 메시지를 계속 표시하게 됩니다. 

나의 WiFi보드가 Blynk Cloud 2.0에 연결 되지 못하고 에러를 출력하는 모습

 

[ 에러 원인  #1 ]

이러한 에러가 나타나는 원인을 살펴보자면,  현재 Blynk 서비스의 경우 과거 Blynk 초기 시절에 제공하던 Blynk 서버의 포화로 인해 더 이상 신규 회원을 받아들일 수 없었고,  이와 함께 Web으로 접속하여 제어할 수 있는 클라우드 서버 서비스라는 새로운 기능까지 추가한다는 계획으로 인해, Blynk 2.0 이라는 새로운 서버 시스템을 구축하게 된 것입니다. 

그런데, 기존 Blynk 1.0 서비스 이용자들이 존재하고 있기 때문에, 기존 서비스도 유지하면서 새로운 Blynk 2.0 서비스를 함께 운영하는 상황에서 WiFi 보드 들이 Blynk 서버에 접속하려 할 때 ,   Blynk 1.0 과 Blynk 2.0 서버를 구분해서 연결시켜야 하는 이슈가 있었던 거죠.   

Blynk에서는 이를 해결하는 방법으로 BLYNK_TEMPLATE_ID (블링크 템플릿 ID) 라는 것을 착안하게 됩니다. 
즉, WiFi 보드에 입력되는 블링크 코드에서 Blynk 2.0 클라우드에 접속되는 대상들은 이 템플릿 ID를 부여하고, 이 ID가 확인이 되면 블링크 2.0 서버로 연결시키게 되며,  만약 이 템플릿 ID가 확인되지 않으면, 기존 Blynk 서버(legacy server)로 연결시키게 됩니다. 

그런데 만약 이 과정에서 ,  Blynk 코드에 이 템플릿 ID(BLYNK_TEMPLATE_ID) 가 코드상에서 Blynk Library (블링크 라이브러리) 보다 아래에 위치하게 되면, 템플릿 ID를 체크하지 못하게 되어 기존 blynk 서버로 연결시켜 버리게 되어, Blynk 2.0 클라우드로 접속되지 못하니 Off Line이 되어 버리는 것입니다. 

아래, 문제 없는 정상적인 코드 예시와,  문제가 발생한 코드 예시를 참조해 보세요. 

정상적인 템플릿 ID 위치

---------------------------------------------------------------------------------------------------------------------------------------------------------------

문제가 발생한 템플릿 ID 위치

[ 에러 해결 ]

따라서, 문제 해결을 위해서는,

반드시 Blynk 2.0 클라우드 서버 서비스에 제대로 접속(Online) 시키기 위해서는 템플릿 ID(BLYNK_TEMPLATE_ID)를 다른 코드(특히, Blynk 라이브러리) 보다 상위에 배치시키는 것을 잊지 말아야 합니다.

물론 기존 Blynk (legacy) 서비스에 이미 가입되어 있고 이를 사용 중인 상황이라면 이 템플릿 ID는 없는 상태로 코드 작성이 이루어 집니다.  

[ 에러 원인  #2 및 해결]

에러 원인 1에 대해 조치를 하여도, "Invalid auth token" error 에러를 표시하며, 해결이 안 되는 경우가 발생 할 수 있는데요, 
이럴 때는, 강제적으로 blynk.cloud 서버에 접속하도록 하면 해결 됩니다. 

아래가 지난 번 올린 Nano33 ioT에서의 동작을 위한 코드인데요, 
아래 코드 중에   
Blynk.begin(auth, ssid, pass);  이 부분을  
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);  로 변경해 보세요.

/* Nano33 IoT + Blynk 2.0 LED On/Off 실습 */

#define BLYNK_PRINT Serial
/* Blynk.Cloud 사이트에서 Nano33 IoT + LED에 대한 템플릿을 만든 후 대시보드에서 아래 3줄의 내용을 복붙복 하세요 */
#define BLYNK_TEMPLATE_ID "TMPL8FZBJtS4"
#define BLYNK_DEVICE_NAME "Nano33 ioT LED"
#define BLYNK_AUTH_TOKEN "3_no_kJo46jNhiMRzlpfPRlMELvHU-g4"

#include <WiFiNINA.h>     // 라이브러리 매니저창에서 WiFiNINA로 검색 후 설치할 것
#include <BlynkSimpleWiFiNINA.h>  // 라이브러리 매니저창에서 blynk로 검색 후 설치할 것
#include <DHT.h>       // 라이브러리 매니저창에서 DHT로 검색 후 설치할 것(by Adafruit 버전)

char auth[] = BLYNK_AUTH_TOKEN;
// 접속 가능한 WiFi ID와 패스워드를 입력하세요
char ssid[] = "myGalaxy";
char pass[] = "12345678";

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}

 

아래 코드는 수정 된 코드입니다.

/* Nano33 IoT + Blynk 2.0 LED On/Off 실습 */

#define BLYNK_PRINT Serial
/* Blynk.Cloud 사이트에서 Nano33 IoT + LED에 대한 템플릿을 만든 후 대시보드에서 아래 3줄의 내용을 복붙복 하세요 */
#define BLYNK_TEMPLATE_ID "TMPL2f0fgFk5"
#define BLYNK_DEVICE_NAME "Nano 33 ioT"
#define BLYNK_AUTH_TOKEN "7nL0OYYxNqzAqnGno10d2RRuRgAz3oYi"

#include <WiFiNINA.h>     // 라이브러리 매니저창에서 WiFiNINA로 검색 후 설치할 것
#include <BlynkSimpleWiFiNINA.h>  // 라이브러리 매니저창에서 blynk로 검색 후 설치할 것

char auth[] = BLYNK_AUTH_TOKEN;
// 접속 가능한 WiFi ID와 패스워드를 입력하세요
char ssid[] = "myGalaxy";
char pass[] = "12345678";

void setup()
{
  Serial.begin(9600);
//  Blynk.begin(auth, ssid, pass);    // Invalid auth token" error 에러가 날 경우 아래처럼 변경
  Blynk.begin(auth, ssid, pass, "blynk.cloud",80);
}

void loop()
{
  Blynk.run();
}

수정된 코드 다운로드 받기

Nano33_Blynk_LED.zip
0.00MB

[ 에러 원인  #3 ]

 세 번째의 경우는 그 두 번째 원인은 바로 회사나 특정 기관의 방화벽으로 인한 것으로 판단됩니다.  하지만 정확히 방화벽이 원인이라고 판단되는 명확한 근거는 없기 때문에, 방화벽을 포함한 연결 되는 곳의 WiFi네트웍 환경의 특정 원인으로 생각이 되는데요,  
이 또한, Blynk2.0 시스템인  Blynk.Cloud에 접속되지 못해 발생 되는 에러로 보입니다. 
 다시말해,  스마트폰 핫스폿으로 연결까지는 되지만, Blynk Cloud와는 연결이 되지 않아 "Invalid auth token" error 에러 메시지를 계속 표시하게 됩니다. 

↓아래는 코드의 변화 없는 동일한 코드를 방화벽 셋팅이 강화된 회사에서 업로드 하였을 때, "Invalid auth token" error 에러 메시지를 표시하며 연결이 안되는 모습입니다.

방화벽으로 인해 "Invalid auth token" error 에러 메시지를 계속 표시하는 모습

 

그리고  ↓아래는 일반 가정집에서 인터넷 환경에서 동일한 코드를 업로드 하였을 때, 바로 연결이 되는 모습입니다. 


현상을 정리하자면, 특정 영역의 방화벽 설정이 된 상태하에 있는 회사 PC에서 코드를 업로드한 보드 회로를 가지고,  특별한 방화벽 설정이 안 된 집에서 연결을 시도해 보아도 "Invalid auth token" error 에러 메시지를 표시하게 되는데요, 
만약, 집에서 코드가 업로드 되어 연결이 잘 되는 보드 회로를 회사에 가지고 가서 코드 재업로드 없이 그대로 WiFi 연결시키고 하였을 때는 Blynk Cloud 사이트와 연결이 잘 되는 것을 볼 수 있었습니다.  물론 잘 동작 되는 그 회로에 동일한 코드를 회사에서 재업로드 하면 역시나 "Invalid auth token" error 에러 메시지를 표시합니다.
  그리고 "Invalid auth token" error가 나는 상태에서는, Blynk cloud 사이트 자체는 웹브라우저에서 접속 잘 되지만 보드회로와 Blynk Cloud 서버와 사이에는 Off Line으로 표시 되고 연결 및 제어가 되지 않게 되죠 .)

 따라서, 코드 업로드 되는 네트웍 환경에 따라 Blynk.cloud에 접속되지 못해 발생 될 수도 있는 원인으로도 보입니다. 
하지만, 대부분의 경우,  1번과 2번의 해결 방법을 사용하면 해결 될 것으로 판단됩니다.

반응형
반응형

 이번 시간에는 아두이노 라이브러리에 관해 살펴볼까 합니다.
특히, 아두이노 라이브러리 설치 경로 ,  아두이노 라이브러리 에러, 아두이노 라이브러리 추가 방법 등 아두이노 라이브러리 관련된 개념을 종합적으로 정리해 보겠습니다.

아두이노는 전자 관련 분야뿐 아니라, 이공계 및 비전문 분야인 인문계 등 전분야에서 두루 활용되고 있습니다.
특히 대학 같은 곳에서 졸업논문 대신 창의적 종합설계 능력을 반영한 캡스톤 디자인 작품을 만드는 것에도 아두이노가 많이 활용되고 있습니다.
 그만큼 비전공자도 접근하기 쉽고 빠른 시간 내에 수준 있는 작품을 만들어 낼 수 있기 때문에 인기가 높은데요, 
이를 가능하게 해주는 것이,
1. 하드웨어적으로는 주요 회로 부품의 모듈화를 들 수 있겠습니다. 
  : 예를 들어 예전에는 초음파 센서를 이용한 장애물 회피 RC카를 만든다고 할 때,  수십 개의 전자부품을 이용해서, 초음파 센싱 회로, 모터 구동회로, 마이크로 프로세서 보드 등을 직접 만들어야 했고, 각각의 회로 동작을 검증한 다음, 회로들을 연결하여 동작이 잘 되는지 등 관련 전공자도 제법 많은 시간과 쉽지 않은 과정을 거쳐야 만들 수 있었다면, 
이젠 이런 각각의 회로들을 모듈로 제품화 하였기에 쉽게 각 모듈을 구매 후 연결만 하면 동작이 잘되기 때문에 전자부품 및 회로에 대한 이해의 깊이가 없더라도 충분히 다룰 수 있게 된 것이 하나의 이유가 되겠습니다.  

두 번째로,
2. 소프트웨어적으로 간단하게 코딩 할 수 있도록 다양한 라이브러리가 제공되며,  심플하면서 강력한 IDE툴 무료 제공.
 : 소프트웨어적으로 예전에는 각각의 모듈 회로들을 제어하고 통제하는 코드를 일일이 작성하고 전체 코드를 연결 작성해야 하는 코딩의 어려움이 있었다면,  이제는 제품화된 모듈들의 어려운 제어 코드들을 제조사 또는 유저 그룹 등에서 모듈화 하여 라이브러리로 제공되고 있기 때문에, C 또는 C++ 언어의 기초만 알고 있어도 쉽게 코딩이 가능하다는 것이 아두이노 활용의 큰 매력이며, 장점이라고 말할 수 있습니다. 

 하지만, 아두이노를 시작하고 가장 크게 부딪히는 문제가 바로, 라이브러리 관련 에러라고 할 수 있습니다.

그리고 사실 아두이노에서는 하드웨어 못지 않게 하드웨어를 컨트롤하기 위한 소프트웨어 특히 라이브러리를 관리하고 다루는 것이 매우 중요합니다. 
 따라서 다음의 주요 주제에 대해 알아두면, 아두이노를 활용할 때 부딪히는 문제에 대해 쉽게 해결할 수 있을 것입니다.

 
 [ 1. 아두이노 IDE 표준 라이브러리의 설치 위치 / 경로 파악하기 ]

 아두이노를 사용하기 위해 처음 설치하는 프로그램이 아두이노 IDE입니다.
 아두이노 IDE는 통합개발 환경툴(Integrated Development Enviroment)로서  코드 편집 기능, 컴파일러, 코드 업로더 등이 합쳐진 툴로서 인터페이스가 매우 심플해서 접근하기 쉽고 사용하기에도 아주 편리한 툴입니다.

 아두이노 IDE를 처음 설치하게 되면, 윈도기준으로  C:\Program Files (x86)\Arduino 경로로 설치가 되며,


표준 라이브러리라 하여 기본적으로 설치되는 라이브러리가 있습니다.  C:\Program Files (x86)\Arduino\libraries

표준라이브러리 및 임의 추가된 라이브러리 위치

IDE 설치 버전에 따라 표준라이브러리가 다를 수 있으며, 위·아래 이미지의 경우 일부 사용자 임의로 추가된 것도 포함되어 있습니다. 

표준 라이브러리 위치

 

[ 2. 아두이노 라이브러리 추가하기 / 라이브러리 위치 파악하기 ]

 아두이노에는 엄청나게 많은 모듈들이 있고 이 모듈들을 사용하기 쉽게 라이브러리를 제공하고 있습니다. 
따라서 IDE 설치 이후에 이런 라이브러리를 추가하게 되는데요, 추가할 라이브러리의 설치 위치는 기본적으로 문서 폴더에 설치됩니다.
C:\문서\Arduino    또는  C:\Document\Arduino

 

 

따라서, 아두이노의 경우 설치될 때 표준 라이브러리가 설치되는 곳과 추가 사용자 라이브러리가 설치되는 곳 등 2곳이 존재합니다.     만약 두 곳 모두에 동일한 이름의 라이브러리가 설치될 경우,  해당 라이브러리가 포함된 아두이노 코드를 컴파일할 때 모두 인식되어 충돌 에러를 발생시키게 됩니다. (충돌 해결법은 아래에 소개)


 [ 3. 아두이노 라이브러리 추가하는 3가지 방법 ]


   ① 라이브러리 매니저를 통하여 라이브러리 검색 후 설치하는 방법 :
      아래 이미지의 메뉴 중에서 라이브러리 관리... 를 선택합니다


 아래 이미지의 라이브러리 매니저 검색창에서 원하는 라이브러리를 검색하고 버전 선택을 할 수 있으며 설치 버튼을 누르면 라이브러리가 자동으로 선택됩니다.  (라이브러리 검색 시 이름을 일부만 입력하면 해당 철자가 들어간 모든 라이브러리를 검색해 줍니다)

      이때, 설치되는 파일 위치는 사용자 문서 폴더인 C:\Document\Arduino  위치에 설치됩니다.  (추후 자동 업데이트 포함)

②  또한 라이브러리를 깃허브(Git Hub) 또는 인터넷 검색으로 검색할 때  xxx.zip 형태의 압축파일로 다운로드하게 되는데,  압축 파일을 풀어서 C:\Document\Arduino\ 위치에 폴더 형태로 붙여 넣기 하면 해당 라이브러리를 사용할 수 있습니다. (단, 아두이노 IDE를 재실행해야 적용됩니다),  물론 표준 라이브러리가 설치되는 폴더인 C:\Program Files (x86)\Arduino\libraries\  에 붙여 넣기 하여도 됩니다. 

중요~!  두 가지 폴더 위치 모두에 동일한 이름의 라이브러리를 설치할 경우 에러가 발생합니다!  둘 중 한 곳은 삭제(제거) 해야 합니다.   그냥 라이브러리 폴더 째로 삭제하세요.
그리고 두 폴더의 차이는 두 가지 라이브러리 중 사용자가 설치한 문서 폴더에 있는 라이브러리가 먼저 적용됩니다.  그리고 만약 표준 라이브러리 폴더에 있는 라이브러리보다 버전이 낮더라도 먼저 인식 처리되며, 만약 중복될 경우 표준 라이브러리에 있는 라이브러리를 중복 에러로 표시하게 됩니다.
 또한, 압축을 풀지 않고 압축파일 속이 아래와 같은 특정한 형식으로 된 압축 파일이라면 .zip 파일 추가하기 메뉴로 바로 추가할 수 있습니다.

.zip 파일 추가하기 파일 속 구조( src 폴더 아래에 각종 라이브러리 헤더 파일이 포함 되어 있다)

 

③ 사용자가 직접 만들어 라이브러리를 추가할 수 있습니다.(사용자 정의 라이브러리 만들어 추가하기)
  
조금 전에 설명한  .zip 파일 라이브러리 구조와 같은 구조를 만들어 추가할 수 있습니다. 

src 폴더 아래에 라이브러리 헤더파일(.h)과 소스코드파일(.c)을 작성해서 위치시킨다

 

아두이노 예제 파일(.ino)을 만들어 example 폴더 아래 예제명과 같은 폴더를 만들어 위치시킨다

  -  xxx.h (헤더 파일)과  필요에 따라 xxx.cpp 또는 xxx.c 로된 소스코드 파일  그리고 examples 예제 폴더를 만들고 그 안에 xxx.ino 와 같은 예제 파일을 만들어 놓으면 됩니다. 
  -  그리고 Readme.txt, keywords.txt와 같은 라이브러리 작성자 및 사용법에 관한 안내를 적절한 내용으로 만들면, 이 라이브러리를 다운 받아 사용하는 사람에게 도움이 될 수 있습니다. 
    ( xxx.h 헤더 파일과 examples 폴더 내 .ino 예제 파일 구성은 라이브러리를 추가할 때 인식시키기 위한 필수 항목입니다)
 이런 구조로  .zip 파일 형태로 추가했을 때, 아두이노 IDE 메뉴의 예제 메뉴에서 아두이노 예제 코드를 불러올 수도 있게 됩니다. 


 


 - 반드시 .zip 파일 형태로만 추가할 수 있는 것은 아니며,  단순히 폴더 하나 만들고 그 속에 xxx.h 헤더 파일과 또는 헤더 파일과 xxx.c 소스 파일만 넣고,  C:\Document\Arduino\ 위치에 폴더 형태로 붙여 넣기만 하면 됩니다. ( 아두이노 IDE 재시작 필요)

 

 [ 3. 아두이노 라이브러리 에러 대처하기 ]

 - 라이브러리 설치 시 배포자와 버전이 중요할 수 있는 이유 : 
 같은 이름의 라이브러리라 하더라도, 라이브러리 제작자가 다를 수 있으며 당연히 라이브러리 내의 코드 구성 내용이 다를 수 있어 라이브러리 관련 함수 사용 시 에러가 발생할 수 있습니다.  (이를 구분할 수 있는 방법은 메모장 같은 것으로 파일을 직접 열어보면 알 수 있고, 파일의 용량이 기본적으로 차이가 납니다). 
  또한 같은 라이브러리 제작자라 하더라도 제작 버전에 따라 함수 및 기능 추가, 삭제, 사용법 변경 등이 이루어 지기에 에러가 발생할 수 있습니다.   따라서 보통 인터넷 아두이노 관련 학습 게시글 중에서 게시자가 게시한 글에서 사용한 라이브러리의 버전과 차이가 나는 최신 버전 등을 설치하여 동작시키려 할 때에 에러가 발생할 수 있으므로,  이때는 최신 버전을 삭제하고 라이브러리 버전을 더 낮은 버전으로 선택해서 시도해 보면 에러가 해결될 수 있습니다.

- 같은 이름의 라이브러리가 중복으로 설치된 경우
  : 중복된 라이브러리 중, 하나의 라이브러리를 삭제하여야 합니다.  만약, 두 개의 라이브러리 버전이 다를 경우, 문서 폴더 아래에 설치되는 라이브러리가 먼저 적용이 되니 코드 실행에 필요한 라이브러리 하나를 가급적 문서 폴더에 남겨주세요. ( C:\Document\Arduino )

- 특정 모듈 제조회사에서 배포하는 라이브러리의 경우,  .zip파일 추가하기로 등록하지 말고  라이브러리 매니저를 통해 해당 라이브러리와 함께 연계된 라이브러리를 모두 설치해야 에러가 발생하지 않는 경우가 있습니다. 
 주로 Adafruit 사에서 출시하는 DHT센서 및 자사의 Neopixel LED Matrix 모듈 제품과 같은 경우에 이런 경우가 많은 데요,  아래 이미지처럼, 관련된 추가적인 라이브러리를 Install all로 해서, 모두 설치해 주어야 합니다. 



-  기타 : 원드라이브(OneDrive) 사용자의 경우  온라인 여부 체크하세요.
   간혹 원드라이브를 사용하고 있는 경우,  원드라이브 설정에 따라, 아두이노가 원드라이브에 속한 문서 폴더 아래에 설치되는 경우가 있고,  원드라이브 네트워크가 오프라인 일 때 ,  이를 인지 하지 못하고 라이브러리 에러를 쉽게 찾아내지 못하는 경우가 있습니다. 

- (중요!) 라이브러리 관련된 문제의 원인을 제거 또는 해결하였다면 항상 아두이노 IDE를 재시작해야 적용됩니다.

 

 [ 4. 아두이노 라이브러리 관리하기 ]

 - 자신의 코딩에 사용된 라이브러리는 항상 압축파일 형태로 백업해 두는 것이 좋습니다.
   또한 압축파일 이름이나 혹은 xxx.txt 파일을 만들어 어떤 아두이노 작품에 어떻게 사용한 라이브러리 인지를 기록해 두면 수개월 후 해당 라이브러리를 다시 사용하게 되었을 때,  즉각적으로 사용하기 수월해집니다. 
( 같은 이름의 라이브러리가 여러 개 존재하고 있고,  그 라이브러리마다 적용할 수 있는 함수도 다를 수 있는데, 어떤 코드에는 동작되지만 또 다른 코드에서는 동작이 안 되는 경우가 발생하기 때문입니다. ) 

 - 문서 폴더 아래에 있는 아두이노 라이브러리 폴더 전체를 하나의 파일로 압축 백업해 두면,  컴퓨터에 문제가 있어 윈도를 다시 설치해야 하는 경우에 아두이노 관련 라이브러리를 쉽게 복원할 수 있습니다.

반응형
반응형

에러 디버깅  아두이노 스케치 IDE 사용중 'WProgram.h ' 라이브러리 에러 발생!

 

『 아두이노 실행시 라이브러리를 설치해도 아래와 같은 라이브러리 에러가 발생했을 때 대처방법입니다 』

에러 발생 이미지

 

- 아래는 에러가 발생된 맨처음 상황의 화면입니다.
1. 적외선 리모트 센서를 구동시키기 위한 코드를 컴파일 해보았는데요,
아래와 같은 IRremote.h 센서 에러가 발생하였네요.


 2. 그래서 해당 IRremote.h 헤더파일이 포함된 라이브러리를 찾아 다운받고 다시 실행시켰는데, 아래와 같은 에러가 다시 발생했습니다.  그런데, 이상한 점은 화면 위쪽 아두이노 코드에 보이는 "IRremote.h" 헤더파일을 설치했음에도 프로그램 코드에서 사용되지 않은 헤더파일을 요구하며 에러를 띄우는 모습입니다.

 그 이유는 'IRremote.h"파일(라이브러리)속에 'WProgram.h' 파일을 요구하는 코드가 있기 때문인데요 결론적으로 'WProgram.h'파일이 없기 때문에 에러를 띄우는 것입니다.
'WProgram.h'헤더 파일은 Arduino IDE 툴의 초기버전에서 기본적으로 사용되던 디폴트 파일인데요.
Arduino IDE 버전이 업그레드 되면서 현재는 'WProgram.h' 대신 'Arduino.h'헤더파일을 사용해요.
따라서 그런 오래된 버전에서 제작된 라이브러리의 경우 'WProgram.h'를 사용했기 때문에 , 
지금의 Arduino IDE 버전에서 그런 라이브러리를 사용하게 되면 에러가 뜨게 됩니다.
『 해결방법은 코드에서 사용하려는 라이브러리를('IRremoteInt.h') 열어서 ,
  'WProgram.h'사용 된 코드부분을 찾아 'Arduino.h'로 변경해 주면 해결됩니다. 』 

3. 그럼 직접 해결하는 방법을 보여드릴게요.
먼저, 탐색창을 열고 경로를 참고하여 에러가 난 헤더파일 위치를 찾아가서 헤더파일을 열어보겠습니다.

이미지를 클릭하면 확대 됩니다~!

 

4.  아래처럼 'WProgram.h'헤더파일이 있을 만한 xxxx.h 파일을 모두 열어서 찾아보세요. 

이미지를 클릭하면 확대 됩니다~!


5.  아래 처럼, 'WProgram.h'를 'Arduino.h'로 바꾸어 주고 저장후 창을 닫으면 됩니다.

이미지를 클릭하면 확대 됩니다~!



6. 자 그럼, 에러를 띄웠던 아두이노 코드를 실행시켜 보면, 아래처럼 에러가 해결 되고 코드실행이 잘 되게 됩니다. 

이미지를 클릭하면 확대 됩니다~!



[ 아래 직접 해결하는 영상을 함께 참고해 보세요. ]

에러 해결 영상 : RasIno YouTube 

 

 

 

반응형
반응형

 

 

◈ 어느날 갑자기 어제까지만 해도 잘 실행되던 아두이노 스케치 IDE가 아래처럼 '패키지 초기화' 화면에서 갑자기 닫혀버리며 프로그램이 실행되지 않는 증상을 보입니다. 

◈ 바로 문제 해결 들어 갑니다.


▶ 해결법 01

  :  아두이노 공식 사이트 ( www.Arduino.cc  )에서 아두이노 무설치(일명 USB버전)버전을 다운받아 설치하고 실행시켜 보세요.

 

1. 홈페이지 상단 메뉴 중 "Software 》 Downloads"를 클릭하세요.

 

 

2.  아래와 같은 다운로드 화면에서,  "Windows zip file for non admin install"  항목을 클릭합니다.

 

  3. 그냥 다운로드를 클릭 합니다. (JUST DOWNLOAD)

 

    4. 적당한 곳에 다운받아 압축을 풀어 줍니다.

 

     5. "arduino.exe" 실행파일을 바로 실행시켜 보거나, 바탕화면에 바로가기 아이콘을 하나 만들어 주세요.

         : 만약 이 방법으로 무설치 버전을 실행시켰음에도,  같은 증상으로 아두이노 스케치 IDE가 더 이상 실행 되지 않을 때는, 아래로 계속 진행 해보세요.

 

 

▶ 해결법 02  (윈도우 10도 동일하며, Mac과 Linux 버전도 아래 경로 참고하세요)

  :  아두이노 IDE는 사용자 환경설정 들을 JSON파일 포맷으로 관리하고 있는데요, 

    이 JSON파일이나?  임의 저장소인 cash파일에 문제가 생길 경우 이런 증상이 나타나게 됩니다.

    따라서 아래 경로로 접근하여, package_index.json 파일과, cashe 폴더 전체를 압축-백업 해두거나?

    과감히 삭제해 주세요. 

 

[ 운영체제 별 파일 위치 ]

1. 우선 탐색창의 보기 메뉴에서, '알려진 파일 및 확장자 숨기기(끄기) 기능을 아래 처럼 끄거나 해제하도록 하겠습니다. 

  이 기능을 변경해야,  숨겨진 'AppData 폴더로 이동 할 수 있습니다. 

 

 

 그럼, 윈도가 보통의 경우 C드라이브에 설치되어 있다고 가정하고, C\사용자(User)\'자신의 계정이름'\ 폴더로 이동하고, 조금 전 숨김폴더 표시하기를 체크하였다면, 아래와 같은 AppData 폴더가 보일 거예요.
AppData 》 Local 》 Arduino15 순으로 폴더를 이동합니다. 

 

 그리고, 아래 이미지에서와 같은 package_index.json 과 package_index.json.sig  파일을 압축 백업하거나, 삭제해주세요.

 

그리고, cache 폴더도  폴더 그대로 백업이나? 과감히 삭제해주세요. 

 

 

그리고 나서, 아두이노 IDE 실행 아이콘을 클릭하면,  아래 처럼 잘 실행됩니다. 

 

 

※ 윈도우10 에서도 동일한 방식으로 진행하면 해결 됩니다.

 
※ 참고로 조금 전에 삭제한 cashe 폴더가 자동으로 재생성 되기 전까지는 아두이노 IDE 프로그램이 로딩 되는데 몇 초 정도 느리게 실행될 수 있으니 참고하세요~

 

 

【  문제해결 영상 보기  】  화면 가운데를 클릭 해보세요~

 

 

반응형
반응형

【 아두이노에러해결#4】 서보모터 떨림, 흔들림, 불안정 현상 해결! shaking problem (SG-90

 아두이노에서 SG-90과 같은 서보 모터를 제어할 경우, 작동은 되지만, 한가지 골치 아픈 문제에 직면하게 된다. 바로 모터를 원하는 위치로 회전 시킨 후 정지(홀드)해야 하는 상황에서 가만 있지 않고 달달? 덜덜? 떨게 되는 것이다.  회전만 하면 되는 경우면 상관 없지만, 제어 된 위치를 고정적으로 유지시켜야 하는 상황에서는 굉장히 못 마땅한 동작이 아닐 수 없다.  이 문제의 해결방법은 국내(사이트)에는 자료가 거의 없는 상황이다. 그리고  해외에서도 관련된 고민? 사항이 특정 사이트의 Q&A에 종종 올라오고 있지만, 속 시원히 해결 되었다는 메세지는 잘 보지 못했다.

 이와 관련하여, 본인도 블루투스 원격 제어 예제 회로를 구성하면서 같은 문제가 발생하였는데, 이 문제를 고민하는 과정에서 알게된 해결방법을 여기에 기술 하고자 한다.   
 

[ 문제 증상 ]

1.  가변저항(Var)을 조절하여 그 입력 값에 따라 서보모터를 회전 시키는 예제.

 (서보모터의 사시나무 떨듯 환장?하는 영상)

위 영상은 블루투스를 이용한 제어에서 떨림현상을 촬영한 영상임

(물론 단순 가변저항 예제의 경우 거의 떨지 않는 경우도 있으나,  컨트롤을 위해 센서를 사용하거나, 회로 및 코드 구성이나 단계가 조금만 복잡해져도 떨림현상을 쉽게 목격할 수 있을 것이다)

[ 먼저 확인해 봐야할 문제 원인 ]

※ 먼저,  지금 설명드리는 예상 원인을 확인해보고, 해결이 안 된다면,  아래 내용으로 진행해 보세요. 
 서보 모터의 경우, 20ms를 한 주기로,   그 주기 속에, 1ms~2ms의 High 신호의 펄스로 정해진 각도로 움직이도록 설계되어 있습니다. 
예를 들어, 1ms의 High 펄스가 입력되면, 서보모터가 0도의 위치로 회전하게 되며,  2ms의 High 펄스가 입력되면, 180도의 위치로 회전하게 되고,  1ms~2ms 사이의 High 펄스 값에 따라, 0도~180도 사이의 각도로 매칭되어 움직이게 됩니다.
 혹은,  아래 이미지에 있는 설명대로,  -90도 ↔ 0도 ↔ 90도  형태를 기준으로 (1ms ↔ 1.5ms ↔ 2ms) 생각할 수 있습니다.  어째튼 중요한 것은, 0~180도의 각을 움직이는 펄스 파형의 기준이 1ms~2ms 범위라는 것인데요,  

문제는 서보모터의 경우 1ms~2ms의 범위에  제품마다 일치하지 않는 오차가 있다는 것이고,   많은 곳에서 제작되는 매우 저렴한 서보모터의 경우 이 오차가 제법 클 수 있습니다.   
  오류가 나는 경우의 예를 들면,  0도로 회전 시키기 위해 1ms의 신호를 주었으나,  실험에 사용된 서보모터의 실제적인 제어신호 범위가 1.2ms ~ 2.2ms 였다면,  1ms의 신호를 준 것이 서보모터가 회전하는 범위를 벗어나게 되는데, 강제로 이동시키는 신호가 오다보니 기어가 내장된 부분에서 떨림의 현상이 올 수 있다는 이야기입니다. 

 이런 경우의 해결책은, 제어범위를 실험을 통해서 확인해 내거나, 혹은, 제어범위를 초과하지 않게 미만의 범위로 신호를 주면 해결할 수 있습니다. 위 예의 경우, 1ms를 주지 말고 1.3ms나  1.2ms 이하로 신호를 주면 떨림이 해결될 수 있다는 말입니다.   그리고,  이상적인 180도 회전 서보모터의 경우 0도~179도 로 회전 하는 것이지만,  실제적으로는 2도~177도 정도의 범위를 갖는 것이 일반적이기 때문에,  만약 떨림이 있다면, 2~177도 사이의 제어 신호를 주는게 맞습니다.

[ 문제 원인 ]

1.  우선 본질적인 원인은 서보모터의 구조와 작동 방식에 있다. 

(서보모터의 작동 원리) 위 이미지를 보면, 서보모터 신호라인으로 그림과 같은 펄스파(PWM)를 입력 시키는데, 기본적으로 입력되는 펄스 간격을 체크하여 지정된 각도 만큼 움직이도록 작동 된다. 

 

 펄스 자체의 반복주기는 20ms로 고정하고, 펄스의 폭을 1ms~2ms 사이로 조절하게 되면, 첫 펄스 파형과 그 다음 펄스 파형 사이의 간격(시간)이 달라지게 된다. 즉 1ms 일때 보다, 2ms로 갈수록 high 신호의 반복주기가 짧아지는 것이다.  따라서, 펄스 폭이 1ms인 펄스를 발생시켜 입력시켜 주면, 서모 모터를 0도에 위치시키도록 하고, 설정된 최대 폭인 2ms로 입력시키면, 180도로 회전 시키도록 설계 되어 있다.  그럼, 1ms와 2ms의 중간 값인 1.5ms를 넣어 주면 0도~180도의 중간 값인 90도의 위치로 회전축이 이동 된다.  역시, 1ms~2ms 펄스폭 사이에 있는 값에 따라 0도~180도로 회전 하게 되는 원리이다.   

 그런데, 0도가 되었든, 90도가 되었든, 해당 각도를 유지하려면 그 것에 맞는 펄스가 정확히 유지되어(일정하게) 입력되어야 하는데, 그렇지 못하기 때문에 결국 변동되는 펄스 폭 만큼 모터가 작동되면서 떨게 되는 것이다. 

 그럼, 펄스폭이 왜? 유지가 되기 힘든가?  여러가지 원인이 있지만, 주요한 원인을 고민해 보자면,

1. 서보모터가 작동하는 순간, 아두이노에 모터구동에 따른 노이즈가 입력되거나, 전력의 변동(요동)이 발생된다. 또는 출력저하 등의 이유로 전력의 불안정은 제어하는 센서의 값(또는 제어 코드 기준값) 영향을 주게 된다. (센서를 이용한 제어보다, 가변저항등의 직접제어가 좀더 안정적인 이유임) .  결국, 서보모터 등과 관련하여 전원분리 및 안정적인 공급을 통해 해결하거나 다소 완화시킬 수 있다. 

2.  사용하는 서보모터 마다 특성이 조금씩 차이 나는 것으로 보이며, 일반적으로 서보모터의 이론적인 제어 기준은 20ms 주기에 1~2ms의 신호로 제어 한다고 나와 있으나, 사용되는 모터마다 주기 범위등의 오차가 있어 해당 범위가 넘어가는 제어신호가 입력 될 경우, 흔들림이 발생할 수 있는 것으로 추측됨.   

[ 문제 해결 ] 

1. 기본 조치 : 조금전에 설명한 대로 기본적으로 서보모터를 구동하는 전원을 안정화 시키거나 보강해줄 필요가 있다.     - 서보모터에도 별도의 전원을 공급하거나, 전원 보강을 위해 아두이노혹은 서보모터 쪽 전원(+,-)에 10uf~330uf 정도의 전해콘덴서를 연결 (극성 주의:  콘덴서의 +단자는 +전원에,  -단자는 GND에 연결)

 - 노이즈 제거를 위해 서보 모터 신호라인(주황색선)과 GND 사이에 극성이 없는 세라믹콘덴서을 달아 준다. (노이즈 바이패스)

2. 하드웨어적인 해결 :
  - 슈미트 트리거 회로 혹은 IC를 이용하여 노이즈 등에 의한 원하는 펄스 파형이 나오지 않아 찌그러진 형태의 구형파가 입력되어 흔들림이 발생한다는 가정을 하여, 실험을 실시해 볼 가능성이 있어 보임. ( 이 부분은 가설을 이야기해 본 것이며, 실험이나 검증이 필요함, 당연히 원인이 구형파의 노이즈에 의함이 아닌 3번의 코드상에서의 해결책과 같은 VAR 입력값에 의한 것일 경우 이 방법은 적용해볼 필요 없음.)

 

3. 코드상에서 해결( 분기값, 임계값 등)

  - 부가적인 하드웨어 없이, 소프트웨어(코드 보강)적으로도 개선 시킬 수 있다. 
  - 오류가 발생되지 않도록 컨트롤 데이터를 맞추어 준다. 

    : 예를 들어 가변저항의 입력값을 아날로그 단자(A0)로 받으면 0~1023의 값이 입력 되고, 이를 각도값인 0~180도로 맵핑 처리하게 되는데,  이 값을 좀더 정확하게 잡아 주면 좋다.   → VAR = map(analogRead(A0), 0, 1023, 0,180)   라면,  좀더 정확하게 0, 179  로 하거나, 실제적인 서보모터의 특성상 180도 전체가 움직이지 않는 다고 보고, 5~175도 정도로 값을 조정해볼 수 있다.  또한 이 값의 범위를 오류 등에 의해 벗어 나지 않토록 constain 함수 처리를 해주면 좋다.    →  VAR = map(analogRead(A0), 0, 1023, 5, 175));  ,  VAR_OK = constrain(VAR, 5, 175);   
  이 경우는 모터의 양 쪽 끝에서 떠는 현상을 완화 시켜줄 것이다.   하지만, 
 VAR 등으로 값을 변화 시킴에 따라 모터가 회전해야 하는 경우에 발생하는 떨림의 해결도 필요하다.  이 경우에는 VAR값에 의한 각도 값 "1,2,3,4,...179" 을  1단위로 모터회전 처리하지 말고, 유동 범위 값을 주어 처리하면 된다.  각도 값을 시리얼 모니터로 관찰 해보면  숫자 값 끝자리가 1~2 정도 왔다 갔다 하는 것을 볼 수있을 것이다. 이 런 값들이 모터 회전에 지속적으로 영향을 주니 모터가 떨게 된다. 따라서 이런 경우에는 값의 변화가 3~5이하는 모터가 회전 하지 않도록 하는 코드를 넣어 해결 할 수 있다.  아래에 이와 관련한 보강된 코드를 기술하였으니, 참고하길 바란다. 

※ 즉, 본 게시글에서 해결한 방법은 VAR 값(ADC변환값)의 변화가 시리얼 모니터로 확인해 보면 1~2 값 정도씩 잦은 변화를 일으키고 있어 이것이 그대로 모터에 반영되다 보니 떨림이 나타나는 것으로 보이기 때문에, -4 ~ +4 사잇 값의 VAR값 변화는 그냥 무시하는 형태로 코드를 추가해 넣어 해결해 본 것으로 실습 하였으니 참고하세요.

 - 서보모터 연결을 해제 하는 명령어를 이용한다.( detach() )

 블루투스 통신회로에 이 것을 실험해 본 결과 가장 개선 효과가 큰 방법이었다. (적용 회로에 따라 다를 수 있음)

 즉,  서보모터를 아두이노 코드 라이브러리로 제어할 때 서보모터와 연결 시키는 코드인 "attach(xx) " 함수를 사용하여 해당 핀 번호에 연결시켜 제어하게 되는데,  특정 순간에는 연결 해제하는 명령인 detach()를 사용하여 작은 입력 값의 변동에 대해서는 서보모터를 작동 시키지 않도록 하는 일종의 트릭을 사용해서 해결 할 수 있다. 

 

[ 해결 코드 (예시)]

 

A. 기본 코드 예시)   

#include  <Servo.h>
#define servoPin 10
#define VAR A0
Servo myservo;
void setup()  {
  Serial.begin(9600);
  myservo.attach(servoPin); //10번 핀과 모터 연결
  pinMode(servoPin, OUTPUT);

void loop()  {
  int varValue = map(analogRead(VAR), 0, 1023, 0, 179);      
  Serial.println(varValue);
  myservo.write(varValue); 
  delay(10);    // 서버모터가 움직일 시간을 트  

 

B. 보강 코드 예시)   

#include  <SoftwareSerial.h>
#include  <Servo.h>
#define servoPin 10
Servo myservo;
#define VAR A0
int conVAR=0; 
int currentVar=0;
int previousVar=0;
void setup()  {
  Serial.begin(9600);
  myservo.attach(servoPin); //10번 핀과 모터 연결
  pinMode(servoPin, OUTPUT);
}
void loop()  {
  conVAR = map(analogRead(VAR), 0, 1023, 0, 179);            
  currentVar = constrain(conVAR,2,178);            
  Serial.println(currentVar);

// 0~4 사이 값의 변화는 모터에 출력을 보내지 아니함 (값 조절 가능)
  if ((currentVar > previousVar+4) or (currentVar < previousVar-4)) {
     myservo.attach(servoPin);
     myservo.write(currentVar); 
     delay(90);   
// 서버모터가 움직일 시간을 줌
     previousVar = currentVar;        
  }   

// 서보모터 연결을 해제하는 트릭으로 모터가 움직이지 않토록 함

  myservo.detach();   // 서보모터 연결 해제

 

<보강된 코드로 해결 된 영상>

다음번 글 영상에서는 블루투스 통신으로 제어되는 흔들림 보정된 영상을 올릴 예정

※ 매우 만족스럽게 해결 된 것을 볼 수 있다. 

물론, 단순히 위의 기본 코드만 가지고, 별다른 센서 사용없이 직접제어를 한다면, 보강 코드 없이도 서보모터의 떨리는 증상 없이 잘 작동 할 수는 있다.  하지만, 서두에서 언급한 것 처럼, 특정 센서나 블루투스 모듈등을 사용하여 응용하거나 할 때 이런 문제가 심각하게 발생할 수 있다.  또한 반드시 해결하기를 원한다면, 이상과 같은 처리나 보강 코드로 해결을 시도해 보기 바란다.  물론, 적용하려는 회로에 따라 해결이 바로 안 될 수도 있겠지만, 앞서 설명한 내용을 차분히 되짚어 본다면, 충분한 해결점에 도달 할 수 있을 것으로 생각된다. 

반응형
반응형

【 아두이노에러잡기#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에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!

반응형
반응형

【 아두이노 에러 잡기   #2 exit status 1 컴파일 에러


▶ 에러 증상  

 

.

.

.

exit status 1 

보드 Arduino/Genuino Uno 컴파일 에러 






▶ 에러 원인   

 주로 스케치에서 #include 로 헤더파일 등의 함수를 쓰겠다고 선언 하였으나, 함수(라이브러리)가 스케치상에서 추가가 되지 않은 경우 발생한다.  




▶ 에러 증상 예시 :


포함시켜 놓은 라이브러리가 스케치에 추가가 되지 않아 에러 발생!



▶ 에러 해결 방법   


해결하기 쉬운 순서대로 :


 ① 라이브러리 직접 검색으로 추가하기 :

스케치 프로그램 메뉴에서  스케치메뉴  라이브러리 포함하기메뉴  라이브러리 관리...을 클릭!


 아래 처럼 메니저 창이 나타나면 검색창에 pitches 정도만 입력 하면 설치파일이 등록되어 있는 경우 아래처럼 설치버전이 나타남.   설치 버튼을 클릭 하여 설치한 후 다시 컴파일 하면 에러 해결 됨. (그래도 에러가 날 경우 스케치 파일을 종료하고 다시 열어서 실행해 볼 것) 

 



 ② pitches.zip 라이브러리를 인터넷에서 검색 후 다운 받아 추가하기 :

 스케치 프로그램 메뉴에서  스케치메뉴  라이브러리 포함하기메뉴  .ZIP 라이브러리 추가...를 클릭!  


 ③ '파일 추가'로 라이브러리 추가 하기 :


 pitches.h 헤더 파일만 가지고 있는 경우 아래 경로로 pitches 라는 새폴더를 만들고 그 속에 pitches.h 파일을 복사해 넣는다.


그런다음, 

  스케치 프로그램 메뉴에서  스케치메뉴  파일 추가...메뉴를 클릭!

하여 라이브러리를 추가한다.




반응형
반응형

아두이노 에러 잡기   #1 아무리 코드를 뒤져 봐도 잘못된 곳이 없는데, 다음과 같은 에러가 난다면? 

 

▶ 에러 증상  

 

 

▶ 에러 원인   

 주로 인터넷이나 다른 코드 창에서 소스 코드를 블럭 복사 한 다음 붙여넣기 할 때 발생하는 에러이다. 

(즉, Ctrl + C  ,  Ctrl + V )

복사 붙여넣기 자체가 문제있는 것은 아니나, 대개 한글 주석이 있는 상태에서 복사 붙여넣기를 하게되면 종종 일어나는 에러이다.  한글 주석이 없는 경우에도 발생

 

▶ 에러 증상 예시 :

 

 

▶ 에러 해결 방법   

 ① 스케치 프로그램 메뉴에서   메뉴  인코딩 수정 & 새로고침을 클릭!

 ② 소스 코드 창을 보면 깨져있는 문자가 보이며 이를 다시 바르게 수정!

 ③ 저장 후 재실행  → 문제 해결 완료~!

 

 

 

반응형