디지털 핀에 HIGH(1) 또는 LOW(0) 값을 기록합니다. 핀이 pinMode()를 사용하여 출력으로 구성된 경우, 해당 전압은 HIGH의 경우 5V(또는 3.3V 보드의 경우 3.3V), LOW의 경우 0V(접지)로 설정됩니다. input 모드로 설정된 핀에 대하여 사용 시 pullup 저항을 활성화 하지만, 가능하면 명시적인 INPUT_PULLUP을 사용하여 설정할 것을 추천드립니다.
문법(syntax):
digitalWrite(pin, value)
매개변수(parameters):
pin: 출력모드로 설정 된 아두이노 핀 번호 value: HIGH(1) 혹은 LOW(0)
리턴값(returns):
없음
예제 코드:
이 코드는 디지털 핀 13을 OUTPUT으로 설정하고, HIGH와 LOW로 토글(toggle, 전환)합니다.
void setup() {
pinMode(13, OUTPUT); // 디지털 핀 13을 OUTPUT으로 설정
}
void loop() {
digitalWrite(13, HIGH); // 디지털 핀 13을 on으로 설정
delay(1000); // 1초 기다리기
digitalWrite(13, LOW); // 디지털 핀 13을 off로 설정
delay(1000); // 1초 기다리기
}
참고:
위의 예제 코드에서 //(슬래시 두개)는 주석(컴파일 시 실제 코드로 인식 하지 않겠다는 의미)이며, 다른 글에서 설명하겠지만, delay() 함수는 말 그대로 '기다리는'함수이며, 그 안에 들어가는 값은 밀리세컨드 단위입니다. 즉 1000ms=1s 입니다. 아날로그 입출력 또한 가능합니다. 아날로그 입력의 경우 A0, A1 등으로 표시된 핀에서 가능하고, 출력은 ~(틸드)표시가 붙은 디지털 핀에서 가능합니다. 또한 반대로 아날로그 출력 핀(A0, A1, etc)을 디지털 핀으로 활용도 가능합니다. 예외적으로 아두이노 나노, 프로미니, 미니의 A6과 A7 핀은 오로지 아날로그 입력 핀으로만 사용할 수 있습니다.
지정한 핀이 입력 또는 출력으로 작동하도록 구성합니다. 핀의 기능에 대한 자세한 내용은 >>아두이노의 핀에 대하여<< 페이지를 참조하세요.
INPUT_PULLUP 모드로 내부 풀업 저항을 활성화할 수 있습니다. 또한 INPUT 모드는 내부 풀업을 명시적으로 비활성화합니다.
문법(syntax):
pinMode(pin, mode)
매개변수(parameter):
pin: 모드를 설정할 아두이노 핀 번호 mode: INPUT, OUTPUT 또는 INPUT_PULLUP의 세가지 중 하나를 선택. 각 모드에 대한 자세한 내용은 >>아두이노의 핀에 대하여<< 페이지를 참조하세요.
리턴값(returns):
없음
예제 코드:
이 코드는 디지털 핀 13을 OUTPUT으로 설정하고, HIGH와 LOW로 토글(toggle, 상호전환)합니다.
void setup() {
pinMode(13, OUTPUT); // 디지털 핀 13을 OUTPUT으로 설정
}
void loop() {
digitalWrite(13, HIGH); // 디지털 핀 13을 on으로 설정
delay(1000); // 1초 기다리기
digitalWrite(13, LOW); // 디지털 핀 13을 off로 설정
delay(1000); // 1초 기다리기
}
참고:
위의 예제 코드에서 //(슬래시 두개)는 주석(컴파일 시 실제 코드로 인식 하지 않겠다는 의미)이며, 다른 글에서 설명하겠지만, >>digitalWrite()<<는 핀에 해당 값을 출력하는 함수, digitalRead는 핀의 현재 상태를 읽는 함수입니다. 또한 >>delay()<< 함수는 말 그대로 '지연(기다리는)'함수이며, 그 안에 들어가는 값은 밀리세컨드 단위입니다. 즉 1000ms=1s 입니다. 아날로그 입출력 또한 가능합니다. 아날로그 입력의 경우 A0, A1 등으로 표시된 핀에서 가능하고, 출력은 ~(틸드)표시가 붙은 디지털 핀에서 가능합니다. 또한 반대로 아날로그 출력 핀(A0, A1, etc)을 디지털 핀으로 활용도 가능합니다. 예외적으로 아두이노 나노, 프로미니, 미니의 A6과 A7 핀은 오로지 아날로그 입력 핀으로만 사용할 수 있습니다.
Arduino 핀은디지털 핀과 아날로그 핀으로 구분되며,입력(INPUT)이나 출력(OUTPUT)으로 구성할 수 있습니다. 이 글은 디지털 핀에 대해서 말하지만, 대부분의 아두이노(Atmega) 아날로그 핀은 디지털 핀과 정확히 같은 방식으로 구성되고 사용될 수 있습니다.
디지털 핀(혹은 아날로그 핀)의 모드는 세가지 입니다. 가장 기본적인 INPUT(입력), OUTPUT(출력)과 특수한 INPUT_PULLUP입니다. INPUT INPUT_PULLUP OUTPUT
INPUT으로 구성된 핀의 속성
Arduino(Atmega) 핀은 기본적(default)으로 input mode(입력 모드)입니다. 따라서 만약 이 핀들을 입력 모드로 사용할 것이라면 pinMode() 함수를 이용하여 명시적으로 선언할 필요가 없습니다. INPUT으로 구성된 핀은 고임피던스 상태라고 하며 이는 회로에 크게 영향을 미치지 않습니다. 그러나 매우 작은 전류만으로 INPUT 상태 (켜짐/꺼짐 or ON/OFF or HIGH/LOW or 0/1)가 변할 수 있기 때문에 pullup(풀업) 혹은 pulldown(풀다운) 회로를 구성하는 것이 좋습니다. 일반적인 INPUT 모드에서는 센서가 꺼졌을 때 0(LOW), 켜졌을 때 1(HIGH)입니다.
INPUT_PULLUP으로 구성된 핀의 속성
INPUT_PULLUP 모드의 경우 INPUT 모드에 자체적으로 PULLUP 저항을 적용하는 모드입니다. INPUT_PULLUP으로 구성된 핀에 센서를 연결할 때는 반드시 다른 쪽 끝은 접지에 연결해야 합니다. Atmega 칩에는 기본적으로 20K(키로옴)의 풀업 저항이 내장되어있습니다. INPUT_PULLUP 모드에서는 센서가 커졌을 때 1(HIGH), 켜졌을 때 0(LOW)입니다.
OUTPUT으로 구성된 핀의 속성
pinMode() 함수를 사용하여 OUTPUT으로 구성된 핀은 저임피던스 상태라고 합니다. 이는 다른 회로에 상당한 양의 전류를 제공할 수 있음을 의미합니다. Atmega 핀은 최대 40mA(밀리암페어)의 전류를 다른 장치/회로에 공급(양전류 제공)하거나 싱크(음전류 제공)할 수 있습니다. 이 전류는 LED를 밝게 켜거나(직렬 저항을 잊지 마십시오) 많은 센서를 작동하기에 충분한 전류이지만 대부분의 릴레이, 솔레노이드 또는 모터를 작동하기에는 충분한 전류가 아닙니다.
아두이노 핀의 단락이나 고전류 장치의 구동을 시도하면 핀의 출력 트랜지스터가 손상되거나 파괴되거나 아트메가 칩 전체가 손상될 수 있습니다. 종종 이로 인해 마이크로컨트롤러에 "데드" 핀이 발생하지만 나머지 칩은 여전히 적절하게 작동합니다.
피타고라스는 기원전 570년 경 태어난 사람으로 알려져 있는데요, 우리에게는 삼각형의 빗변의 제곱은 밑변의 제곱과 높이의 제곱의 합과 같다는 '피타고라스 정리'라는 것으로 제일 유명하죠.
그러나 이런 피타고라스가 한 종교의 교주였다는 사실을 알고 계셨나요?
피타고라스는 피타고라스 학파를 만들며 여러 계명들을 만들었는데요, 그 중에 제일 재밌는 계명이 제 1계명입니다.
바로 "콩을 먹지 말라"는 건데요, 대체 왜 이 계명이 생겼을까요?
썰은 정말 다양합니다.
피타고라스가 채식주의자임에도 콩을 금지한 이유는 소화가 잘 안되어서 라거나, 이상한 종교적 믿음으로 콩과 사람이 비슷해서 등등 얼핏 듣기에는 잘 이해가 가지 않는 썰들이 있습니다. 특히나 채식주의자에게 콩은 단백질 보급의 주요 원천이기에 그 옛날에 채식주의자가 콩을 금지했다는건 경험적으로도 뭔가 안맞는 이야기이기도 하구요.
그러나 여기에는 나름 아주 매력적인 썰이 있습니다.
바로 피타고라스가 콩을 먹으면 아팠었기 때문이라는 썰입니다. 결국 무슨 질환을 가지고 있었다는 것이었겠죠?
도대체 이게 왜 매력적인 썰일까요?
각 파트별로 나눠서 살펴보죠.
콩, 질환, 고찰 그리고 결론 입니다.
1. 콩
그 시절 지중해에서 나는 콩들은 '작두콩' 혹은 '잠두'(혹은 누에콩, 파바빈, fava bean, broad bean)라고 불리는 콩들이었습니다.
이 작두콩에는 Vicin(비신)이라는 성분이 있는데, 이 비신이라는 성분은 자체로는 아무런 해가 없습니다만, 이게 대장에서 정상세균총(micro flora)에 의해 가수분해되면, aglycon(아글리콘: 글루코오스(6탄당) 형태가 빠진)인 divicin(디비신)이라는 성분으로 대사되고, 이 성분은 활성산소(free radical) 생성 물질이 됩니다. 그리고 이 산화 능력은 체내 자체적인 환원 물질인 glutathione(글루타치온)에 작용, 이를 소모하게 합니다.
정상인에게는 비록 이 물질이 생성된다하더라도 빠르게 글루타치온을 재생성 할 수 있기 때문에 문제가 되지 않지만, 몇몇 사람에게는 이게 큰 문제를 일으킬 수 있습니다.
그 중 가장 유명한 것이 G6PD 결핍증입니다.
2. 질환
G6PD 결핍증(glucose-6-phosphate dehydrogenase deficiency, 6-인산포도당탈수소효소 결핍증)은 오탄당 인산경로(pentose phosphate pathway)에 쓰이는 G6PD가 결핍되어 생기는 질환입니다.
특히나 적혈구의 대사에서 중요한 효소지요.
산화적 손상을 일으키는 자유라디칼을 제거하는 '글루타치온(Glutathione)'을 환원시키는데 NADPH가 사용되는데, 적혈구에서는 이 오탄당 인산경로가 유일한 NADPH 공급원입니다.
따라서 여기서 이 환원적 환경을 만들어 낼 수 있는 G6PD가 결핍되게되면 결과적으로 적혈구는 매우 불안정한 상태가 됩니다. 약간의 자극에서 적혈구 세포막이 터질 수 있고, 결국 이는 용혈성 빈혈로 나타나게 되죠. 특히나 적혈구가 산화적 상태로 불안정하다는 것을 주목해야 합니다. 결국 외부에서 산화적 스트레스가 오면 아주 쉽게 적혈구가 용혈 될 수 있다는 것이죠.
다시 생각해보면, 결론적으로 피타고라스는 이 질병을 가지고 있었을 것이며, 그렇기에 대사과정에서 활성산소를 만들어내는 작두콩을 먹으면 용혈성 빈혈로 매우 아팠을 것입니다.(이를 잠두중독증(favism(파비즘))이라 하며, 잠두(누에콩)의 이름인 fava bean에서 유래했습니다.)
그럼 피타고라스는 왜 이 질병을 가지고 있었을까요?
3. 고찰
이 G6PD 결핍증은 X염색체 연관으로 유전됩니다. 즉, 여자는 보인자, 남자는 무조건 증상이 발현된다는 말이지요.
보통 한 지역에서 유전병이 계속 지속되는 이유는, 그 유전병을 가짐으로 인해서 얻는 이득이 있을 때 사라지지 않고 유전병이 유지되는 경향이 있습니다. 겸상 적혈구 빈혈증도 말라리아에 대해서 저항성이 있기 때문에 정상적인 적혈구를 가진 사람보다 생존에 유리해서 계속해서 그 유전병이 남아있죠.
똑같이 G6PD결핍증도 적혈구를 약하게 만들기 때문에 말라리아에 저항성이 생깁니다. 정확히는 말라리아가 원충으로 적혈구에 들어갔을 때 거기서 성숙을 못하게 적혈구를 쉽게 파괴시켜버리기 때문에 말라리아에 대해 저항성이 생기는거죠.
특히나 과거 지중해에서 말라리아가 호발했기 때문에(이는 지중해성 빈혈 등 빈혈 관련 유전병이 지중해에서 유래한 것이 많다는 것이 반증하기도 합니다.) 오히려 정상인보다 G6PD 결핍증을 가진 사람이 생존에 더 유리했을 것입니다.
4. 결론
결국 이 모든 내용을 조합해보자면, 말라리아가 호발하던 지중해에서 태어난 피타고라스는 G6PD 결핍증을 가지고 있었고 작두콩을 먹고 잠두중독증(favism)으로 매우 아팠었을 겁니다. 그래서 교주가 된 이후에 제 1계명을 "콩을 먹지 말라"고 했겠죠.
그리고 또하나 재밌는 사실은 피타고라스의 죽음도 콩과 연관되어 있다는 점입니다.
피타고라스의 죽음도 썰이 정말 많지만, 재밌는 점은 모두다 콩과 관련되어있습니다.
도망가던 중에 콩 밭을 지나다가 그자리에서 쓰러져 죽었다던가, 결국 콩 밭을 지나지 못하고 잡혀서 죽었다던가 하는 이야기지요
안녕하세요~ 오늘은 세번째 시간으로 아두이노 IDE에서 제공하는 기본 프로젝트를 아두이노에 보내서 실행시켜보고, 제대로 실행되는지 확인해보며, 추가적으로 이때 발생할 수 있는 에러에 대해서 알아보도록 하겠습니다!
지금 현재 시작하는 부분은 아래와 같이 아두이노 IDE에 보드와 포트가 잡힌 상태입니다.
1. 기본프로젝트 만들기!
아두이노 IDE에서는 아주 간단한 여러가지 기본 프로젝트들을 제공합니다.
그리고 그중 대부분은 추가적인 부품들을 요구합니다. 가장 간단한건 LED 혹은 버저를 이용한 프로젝트 일 겁니다.
그러나 이 중 아주 간단하게 아두이노 자체 램프를 깜빡거리는 아주아주 간단한 프로젝트가 하나 있습니다.
바로 'Blink'라는 프로젝트인데요. 이 프로젝트를 이용하면 내 보드가 아두이노 IDE와 잘 연결되었는지, 혹은 내 아두이노 IDE에서 보드로 제대로 프로그램이 전달되고 실행되는지를 확인해 볼 수 있습니다.
그럼 바로 Blink 프로젝트를 만들어볼까요?
우선 File>Examples>01.Basics>Blink를 클릭합니다.
자, 이렇게 누르면 바로 새 창이 하나 뜨면서 블링크 프로젝트가 하나 생성될 것입니다.
자 프로젝트 코드는 생성되었습니다. 그럼 이걸 우리는 어떻게 아두이노로 보낼까요?
2. 코드 검증하고 보드로 업로드하기
자, 코드가 먼저 생성되었으면 우리는 '검증(Verify)'이라는 체크 버튼을 통해서 이 코드가 제대로 잘 작성 된 것인지 확인해 볼 것입니다. 전문적인 프로그래밍 용어로는 '컴파일(Compile)'이라고도 하죠!
자, 이 버튼을 누르면 아래쪽에 검은 화면이 생기면서 오른쪽 아래 흰색 공간에서 무언가가 차오르다가 'Done compiling.'이라는 문구가 나올 겁니다. 이게 바로 컴파일이 다 되었다는 것이죠. 이렇게 떴을 경우 현재 우리가 작성한 코드는 에러가 없으며 제대로 실행가능한 코드입니다~ 라는 뜻이 됩니다.
만약에 에러가 발생하면(저는 일부러 delay함수에서 d를 지워보았습니다) 아래쪽에 빨간글씨가 뜨면서 어디가 에러가 발생했는지 알려주죠!
자, 어찌됐든 성공적으로 verify가 끝났으면, 이제 아두이노 보드로 이 실행파일을 옮겨줘서 아두이노가 실행하게 해야겠죠?
이때 쓰이는 버튼이 업로드(Upload)버튼입니다!
이 업로드 버튼을 누르면 이 소스코드가 실행파일 형태로 바뀌어서 아두이노 보드로 보내지고, 잠시 기다리면 아두이노 보드의 주황색 불빛이 깜빡거리는 걸 보실 수 있습니다!
이렇게 불빛이 깜빡거리면 성공입니다!
여담으로 Upload 버튼을 누르면 컴파일을 진행하고 나서 바로 업로드를 하는것이니 굳이 Verify 버튼을 누를 필요 없지 않나 하시는 분들!
지금은 소스코드가 간단하니 에러가 발생할 확률이 적지만, 나중에 큰 프로젝트를 하면 지금 내가 짠 코드가 맞는지 틀린지 중간중간 확인해봐야 한답니다! 그때 쓰는것이 바로 Verify!
자, 여기까지 아두이노 개발 환경을 깔고, 보드와 연결하고, 실제로 개발환경에서 소스코드를 짜서 아두이노 보드로 보내 제대로 실행되는 것까지 살펴보았습니다. 결국 이 말은 이제부터 실제로 컴퓨터에서 짠 소스코드로 아두이노를 제어할 수 있게 되었다는 것이죠!
이제부터는 아두이노 개발 환경으로 여러 코드를 짜고, 아두이노 보드에 또 여러 부품들을 연결하여 소스 코드가 컴퓨터에서만 작동하는 것이 아니라, 실제 오프라인 환경에서도 작동되는 프로젝트를 하실 수 있게 된겁니다!
이제서야 출발선상에 섰네요!
다음에는 여러 부품들과 관련된 코드들로 찾아뵙도록 하겠습니다~
아, 물론 그전에 아두이노 연결 과정에서 가장 흔하게 발생하는 에러들을 한번 살펴보려고 합니다!
3. 아두이노 연결 과정에서 가장 흔하게 발생하는 에러들
1) 보드, 포트 선택 다했는데 아두이노랑 연결이 안된대요~
가장 당황스러운 오류 중 하나죠.. 보통 오류 메시지는 아래와 같습니다
스케치를 업로드 하는 동안 에러가 발생하였습니다. An error occurred while uploading the sketch 시리얼 포트 'COM1' 를 여는데 에러 발생 (Port busy) Error opening serial port 'COM1'. (Port busy)
이는 저번시간에 살짝 언급했던 ch340 호환 보드 즉, 아두이노 정품 보드가 아닌 흔히 말하는 중국산 짭보드(..) 일때 발생하는 에러입니다. 보통 아두이노 나노에서 가장 흔하게 발생하는데요(다른 보드들은 호환을 시켜주는데 아무래도 나노가 AVR이 작아서 그런가 나노에서 가장 흔하게 발생하네요..) 아주 간단하게 ch340드라이버를 깔아주면 해결됩니다.
일부러 판매 사이트로 링크를 걸어놨는데요, 인터넷에서 specification을 찾는 것보다 판매 사이트에서 설명되어있는 부분이 더 자세하기에 링크를 걸었습니다.
기본적인 차이점은 가장 큰것이 크기인데요, 나노가 가장 작고 그다음이 우노 그리고 메가2560이 제일 큽니다!
당연히 포트 수도 메가2560이 가장 많구요, 마이크로 프로세서(마이크로 컨트롤러 혹은 ARM 혹은 AVR: 넷 다 비슷한 용어입니다.)의 강력함도 메가2560이 가장 크죠.
그러면 크다고 마냥 좋은건가 하면 아니죠. RC카라던가 라인 트레이서 같이 움직이는 것 안에 내장하여 쓰려면 나노처럼 작고 가벼운 것이 좋겠죠!
그리고 여기서 가장 큰 부분이 공식 아두이노 보드가 아닌 중국에서 아두이노 호환보드로 제작한 ch340 칩이 약간 문제가 되는데요, 일단은 기본 세팅과 포트설정 후 기본 프로젝트를 구동해 보는 과정에서 에러사항을 한번 살펴보겠습니다!
저는 일단 여기서 가장 사람들이 입문으로 많이 쓰는 아두이노 우노로 설정을 진행하도록 하겠습니다!
먼저 아두이노 보드를 컴퓨터에 연결해주세요!(아두이노 보드와 동봉된 USB 선으로 아두이노에는 USB type A(육각형으로 집처럼 생긴 모양)를 컴퓨터에는 USB type B(우리가 아는 usb 모양)를 연결해주시면 됩니다.이렇게 생긴 선일겁니다)
2. 보드 선택하기
자, 처음으로 아두이노 IDE를 키셨다면 바로 아래와 같은 화면이 나올 것 입니다.
그리고 여기서 오른쪽 아래 표시된 것과 같이 'No board selected'라고 표시됩니다. 즉, 아두이노 보드가 선택되지 않았다는 것인데요.
여기서 저희는 메뉴에 'Tools'>'Board'>'Arduino AVR Boards'를 차례대로 선택하면
이와같이 엄청나게 많은 아두이노 보드들이 보이게 됩니다. 저는 'Uno' 였으니까 위에서 두번째 'Arduino Uno'를 선택해줄 거구요, 나노나 메가도 메뉴에 보이는 Arduino Nano, Arduino Mega를 각각 선택해주시면 되겠습니다. 그외에도 여러 보드를 선택할 수 있으니, 결국 내가 지금 가지고 있는 보드가 무엇인지 확인하는게 가장 중요하겠죠!?
자, 이렇게 선택하면 아까 보았던 상태표시줄 우측이 선택한 보드명으로 바뀌는 것을 볼 수 있습니다!
특히 이 보드를 잘 못 설정하게 되면 각 AVR마다 명령어 체계가 약간은 다른데 그것을 보정할 수 없어 컴파일이 안되거나, 실행이 되지 않습니다! 혹시 컴파일이 안되거나 보드로 실행이 안되는 경우는 한번 이 보드 설정을 제대로 하셨나 확인해보시는 것도 한가지 방법입니다!
자, 여기서 잘 살펴보면 'not connected'라고도 나와있는 걸 볼 수 있습니다.
이는 물리적으로 현재 아두이노 우노 보드와 컴퓨터가 연결되어 있음에도 볼 수 있는데요, 그 이유는 포트 설정이 되지 않아, 아두이노 IDE가 아두이노 보드가 현재 컴퓨터에 연결되었음을 알지 못하는 것입니다.
3. 포트 선택하기!
눈치채신 분들도 있겠지만, 포트는 'Tools'의 'Board' 아래 있습니다. 근데 혹시나 'Port'가 안보이시는 분들은 IDE를 끄고, 아두이노 보드를 먼저 컴퓨터에 연결하신 다음 아두이노 IDE를 다시 실행시켜 주시고 2번 보드 설정부터 다시 해주시면 됩니다!
자, 이렇게 포트를 누르면 자동으로 아두이노 보드가 연결된 포트(COM5)를 보여줍니다. 여기서 포트 명(COM5)는 크게 의미는 없습니다. 보통 대부분의 사람들은 COM3로 뜨지만, 포트가 다른데 연결되어있거나 하면 포트명은 달라질 수 있습니다. 그러나 중요한건 여기서 괄호 안에 본인이 사용하는 아두이노 보드명이 일치하는지만 잘 확인하시고, 일치한다면 그 포트로 사용해주시면 됩니다!
자 이렇게 포트까지 설정해주면, 아두이노 보드와 연결이 되게되고, 오른쪽 아래가 'Arduino Uno on COM5'라고 바뀌게 됩니다.
자, 이제 보드와 IDE가 연결되었습니다. 아주 기본적인 프로젝트를 할 수 있게 되었네요!
좀 더 하고 싶지만, 일단 포스팅 길이가 너무 길어질 것 같아 다음으로 넘겨야겠네요!
다음시간에는 아주 기본적인 프로젝트를 하나 만들고 컴파일해서 아두이노 보드로 보내고, 보드에서 작동하는지 확인하며, 그 과정에서 일어날 수 있는 아주 기본적이지만 당혹스러운(그리고 자주 나타나는) 문제들을 짚어보겠습니다!
과거 인터넷 혼란기?에는 진짜 검색창에 뭐 '다운로드'만 치면 진짜 불법사이트들이 난립을 해서, 잘못 받다가 컴 날려먹기 일수였는데요.. 요새는 사이트 정립도 잘 되어있고, 검색 사이트도 자체적으로 업데이트가 많이 되어 그런일은 별로 없는 것 같습니다.. 그래서 과거에는 무슨 소개글에 꼭 공식 홈페이지를 링크로 달아놨는데.. 요새는 필요가 없어보이지만, 그래도 저는 한번 달아보겠습니다.
여담으로 Arduino IDE 2.0.1이라는 것은 현재 아두이노 IDE의 버전입니다. 혹시라도 과거의 버전이 필요하신 분들은 스크롤을 내리면 Legacy IDE (1.8.X)와 Previous Releases가 있는 것을 확인하실 수 있고, 이쪽 링크를 통해서 다운로드 받으시면 됩니다.
또한 다운로드 옵션에서 OS에 따른 윈도우, 리눅스, 맥OS를 빼고도 윈도우 안에서도 파일이 여러개로 나뉜 것을 볼 수 있는데, 윈도우에서 첫번째 링크와 두번째 MSI 링크는 둘다 설치파일을 다운로드 하며, ZIP file은 설치파일 없이 다운로드합니다. 혹시 윈도우에 아두이노가 설치되는 것이 싫다하시면 ZIP파일로 받으셔서 'Arduino IDE.exe'파일만 실행해주시면 됩니다. 그럼 설치과정 없이 바로 실행이 됩니다. 여기서 가끔 처음 실행시 무한 로딩(2.0.1버전 기준 아두이노 로고 무한 두근거림)이 걸리는 경우가 있는데 꺼주시면 잠시 후 windows defender에서 네트워크 차단 허용 메시지가 뜹니다. 이걸 허용 해주시고 다시 실행하시면 제대로 실행됩니다.
2> 기부창이 뜹니다. 저희가 돈이 많다면 아두이노에 기부를 해줄테지만.. 일단은 JUDT DOWNLOAD를 눌러 그냥 다운로드를 진행해줍니다! 다운로드 파일 선택창이 뜨고(이 곳을 잘 기억해주세요!) 저장 버튼을 누르면 바로 다운로드가 시작됩니다!
2. 설치하기!
다운로드 받은 파일(arduino-ide_2.0.1_Windows_64bit.exe)을 더블클릭하여 실행하면 먼저 '사용권 계약'이 뜰겁니다. 여기서 '동의함' 누르시고 설치옵션 중 '사용자 선택'하는 부분에서 '전용'으로 선택하고 넘기세요!
설치 위치는 그냥 보통 자동으로 설정하는 값을 그대로 두고 설치합니다! 임의로 바꾸시면 나중에 다른 추가 프로그램 설치시 문제가 될 수도 있으니, 정말 부득이하게 꼭 바꿔야 하는 경우를 제외하고는 그냥 바로 '설치'를 눌러줍니다!
설치가 시작됩니다!
한 5분여 좀 넘게 기다리다 보면 설치 완료 창이 뜹니다.
바로 실행까지 해볼까요? 'Arduino IDE 실행하기'에 체크표시 된 상태로 마침을 눌러줍니다!
여기서 가끔 처음 실행시 무한 로딩(2.0.1버전 기준 아두이노 로고 무한 두근거림)이 걸리는 경우가 있는데 꺼주시면 잠시 후 windows defender에서 네트워크 차단 허용 메시지가 뜹니다. 이걸 허용 해주시고 다시 실행하시면 제대로 실행됩니다.
3. 실행 후!
아두이노 창이 열리고 갑자기 윈도우에서 '띠로링'하면서 알림창이 여러개 뜹니다! 이때는 당황하지 말고 전부 '허용' 혹은 '설치'를 눌러주시면 되는데
가장 처음 뜨는 알림창이 dpinst-amd64.exe을 허용할건지 여부입니다.
이것은 아두이노가 설치파일로 설치되었을 때 포트와 드라이버를 설정하고 설치하는 과정에서 Driver Package Installer가 작동하게 허용할거냐는 부분이니 당연히 '허용'을 눌러주시면 됩니다.
그 다음엔 순서대로 'Adafruit Industries LLC 포트(COM & LPT)', 'Arduino USB Driver', 'Genuino USB Driver'를 설치할건지 물어보는 창이 나오는데, 세개 다 설치를 눌러주시면 됩니다.
그러면 마지막으로 dpinst-amd64.exe 허용창이 한번 더 뜨는데, 허용 눌러주시면 아두이노 설치가 전부 끝납니다!
4. 재실행!
설치 후 실행한 화면을 끄거나 해서 아두이노 IDE를 다시 실행하고 싶으신 경우 바탕화면에 자동으로 'Arduino IDE' 바로가기가 생성되었으니 이것을 클릭하여 실행해주시면 됩니다.
네, 여기까지 아두이노 IDE(통합 개발 환경) 설치를 진행해 보았습니다! 이 다음에는 아두이노 기본 세팅과 포트설정, 그리고 Library 추가에 대해서 진행해보도록하겠습니다!
사실상 원리는 간단하고 이를 아두이노에 활용하기에도 쉽지만 의외로 이 인코더의 작동원리를 이해하기 힘들어 아두이노 코드에 접목하기가 쉽지 않은 것이 현실입니다.
이에 오늘은 로터리인코더(로타리엔코더)의 회전방향 검출에 대해 알아보도록 하겠습니다.
1. 로터리 인코더 작동원리
로터리 인코더는 CLK와 DT라는 두개의 포인트로 회전을 검출합니다.
발광부-수광부로 이해해도 좋고, 금속 원판에 포인트가 붙었다 떨어졌다로 이해해도 좋습니다.
어찌되었든 이 두 지점이 거리를 두고 위치하고 있기 때문에 원판이 돌아갈 때 시간차이가 나게 되고, 이 시간차이를 가지고 이 원판이 시계방향으로 회전하는지, 반시계방향으로 회전하는지를 알아낼 수 있습니다.
그림의 이해를 쉽게 하기 위해 원형철판에 두 지점이 닿아있다고 보겠습니다. 이 상황에선 두 포인트 전부 전기가 통하는 상태입니다.(수치로는 1 혹은 HIGH라고 볼 수 있습니다.) 또한 CLK(그림의 Output A)는 DT(Output B)보다 왼쪽에 위치하며, 이미지상으로는 위쪽에 위치합니다.
일단 시계방향으로 돌아갈때를 보죠. 이 상황에서 시계방향으로 돌면 CLK가 먼저 원판에서 떨어집니다. 그리고 그 다음 DT가 떨어지고, 그 다음 다시 CLK가 원판에 붙고, 다시 DT가 붙습니다. 1주기를 살펴보면
CLK
DT
1
1
0
1
0
0
1
0
1
1
이렇게 되는 것을 볼 수 있습니다. 또한 최소 분해능은 1/4주기로 볼 수 있습니다. 1/4주기마다 회전을 검출할 수 있기 때문이죠.
그럼 반시계방향으로 돌아가는 상황을 보도록 합시다. 원판이 반시계방향으로 돌면 DT가 먼저 원판에서 떨어집니다. 다음 CLK가 떨어지고, 다음 DT가 다시 붙고, 다음 CLK가 붙겠죠. 1주기를 살펴보면
CLK
DT
1
1
1
0
0
0
0
1
1
1
이렇게 되는 것을 볼 수 있습니다.
이를 펄스그림으로 보게되면 아래와 같습니다.
2. 소자의 이해(HW-040)
저희가 쓸 소자는 HW040이라는 소자입니다. 이 소자의 특징은 로터리 인코더가 한번 딸깍하고 돌아갈때 위에서 말한 1주기 중 1/2주기씩 움직인다는 것입니다. 이를 이미지로 설명하면 원판에 둘다 붙어있다가 한번 딸깍에 둘다 떨어지고, 다음 딸깍에 둘다 붙는다는 말이 되죠. 참고로 첫 시작값은 보통 CLK, DT 모두 1값으로 시작하는게 보통이나 상황에 따라 달라질 수 있기에 소스코드에서 한번 처음 읽어주도록 합시다.
3. 코드에의 적용
이렇게 1주기에 CLK와 DT값이 4가지로 변화하기 때문에 이 모든 값에 대응해서 코딩을 해야할 것 같지만(물론 이런 경우가 제일 완벽하겠죠), 자세히 들여다보면 어떤 규칙이 있습니다. 바로 CLK값이 변화할때 시계방향이면 DT와 읽는 값이 정 반대이고(CLK가 왼쪽이므로 원판에서 먼저떨어집니다), 반시계방향이면 CLK값이 변화할때 DT값이랑 같다는 것이죠.(CLK가 왼쪽인데, CLK에서 변화가 감지될 때는 이미 DT값이 변한 이후입니다.)
특히 저희가 쓸 소자는 1번 딸깍에 1/2주기씩 진행하기 때문에 모든 상황에 대해서 코딩하는 것이 낭비라고 볼 수도 있기도 하고, 한번 딸깍에 코딩으로 반응이 와야하기 때문에 모든 주기에 대해서 코딩하기 보단 변화를 가지고 코딩하는게 좋습니다.(1주기 코딩을 하게되면 두번 딸깍해야 반응이 오겠죠)
여기서의 포인트는 딱 두가지입니다.
1) CLK값이 변화할때 2) 그 순간 DT와 CLK값의 차이(정방향 변화: 두 값이 차이, 역방향 변화: 두값이 동일)
그럼 코드를 작성해보겠습니다. 이전과 같이 LED는 각 2, 3, 4번 핀에 대응시키고 로터리 인코더의 CLK, DT는 각 8, 9번 핀에 대응시키겠습니다.(SW는 그냥 스위치처럼 사용하기에 편리하므로 이번 포스팅에서는 제외하겠습니다.) 목표는 로터리 인코더가 오른쪽으로 돌면 빨간불, 왼쪽으로 돌면 파란불이 들어오게 하는 것입니다.