그냥 아두이노 uno로 하면 될 것을, 괜히 내장 와이파이 달린거 써보겠다고 wemos d1 r2를 쓰다가 고생을 꽤나 했다.
이 글은 d1 r2와 같이 핀맵핑이 다른 아두이노를 사용하는 이들을 위한 글이다.
아두이노의 종류가 다양해서 각 보드에 맞는 보드 패키지도 설치해 주어야 한다.
아두이노 IDE에서 파일(file)-기본설정(Preferences)로 들어간다.
그리고 추가 보드 관리자에 아래의 주소를 추가해주자.
https://arduino.esp8266.com/stable/package_esp8266com_index.json
그리고 왼쪽의 보드 패키지에서 d1 r2를 검색한 뒤 설치해준다.
마지막으로 usb포트와 보드 종류를 알맞게 매칭 하면 끝이다.
WeMos D1 R2를 연결하고 가장 헷갈렸던 것은 핀 번호였다.
아두이노 우노와 같은 보드들은 구조가 비교적 간단하기에 보드의 핀번호와 아두이노 IDE 상에서의 핀번호가 일치한다.
예를들어 아두노의 4번 핀을 out으로, 5번 핀을 in으로 설정하고 싶으면 아래와 같이 하면 된다.
int outputPin = 4;
int inputPin = 5;
void setup(){
pinMode(outputPin, OUTPUT);
pinMode(outputPin, INPUT);
}
하지만 이런식으로 Wemos D1 R2에 그대로 적용시키면 작동하지 않는다.
이는 핀 번호 체계가 다르기 때문이다.
Wemos 보드에서는 D1, D2와 같은 이름이 IDE 상 숫자와 다르게 매핑되어 있기 때문이다.
#define outputPin D4
#define inputPin D5
void setup(){
pinMode(outputPin, OUTPUT);
pinMode(outputPin, INPUT);
}
그럼 이 아두이노는 왜 이런 구조를 가지고 있는 걸까?
아두이노 우노를 보면 커다란 칩셋이 하나 박혀 있다.
이게 컴퓨터로 치면 cpu와 같은 연산장치라고 생각하면 된다.
아두이노의 가장 측면에 달려있는 핀들은 아두이노 칩셋에 있는 각각의 다리에 할당된다고 생각하면 된다.
아래 사진을 보면 각각의 핀이 칩셋의 어떤 다리에 할당되는지 볼 수 있다.
이렇게 연결하는 핀들 중 디지털 신호의 입출력이 가능한 핀들을 GPIO 핀이라고 한다.
GPIO는 General Purpose Input/Output의 약자이다.
아두이노 우노의 경우에는 GPIO 핀이 보드의 핀 번호와 거의 일치하는 것을 볼 수 있다.
그래서 IDE에서도 핀 번호를 적힌대로 하면 별일없이 코드를 실행할 수 있다.
D1 R2 보드는 기본 칩셋 외에 와이파이 모듈이 함께 장착되어 있다.
이때 칩셋의 일부 핀들은 와이파이 모듈과 통신하는 데 사용되기 때문에, 입출력에 사용할 수 있는 핀의 수가 제한적이다.
남은 핀들을 아두이노 보드 상에 배치하면서, GPIO 번호가 순서 없이 배정되는 문제가 생기게 된다.
이로 인해 보드 제조사에서는 사용자가 혼동하지 않도록 각 핀에 D0, D1, D2와 같은 논리적인 번호를 다시 부여했고, 이 번호를 아두이노 IDE에서도 그대로 사용할 수 있게 만든 것이다.
위의 핀맵 이미지처럼, D1, D2와 같은 번호는 실제 내부 GPIO 번호와는 다르니, 핀을 사용할 때는 꼭 이 맵을 참고해야 한다.
아두이노 IDE에서 설치한 보드 패키지에는 D5, D6 같은 논리 핀 이름을 실제 GPIO 번호로 매핑하는 정의가 포함되어 있.
그래서 맨 위쪽에서 #define myPin D5
와 같이 정의하면 보드 패키지 내부에는 #define D5 14
이 들어있어, 결국에 myPin은 GPIO14번 핀을 가리키게 된다.
#define myPin D5
void setup(){
pinMode(myPin, OUTPUT);
}
그 다음에는 그냥 일반 핀과 같이 사용하면 된다.
다만, 몇가지 핀들은 부팅이나 플래시와 관련되어 있어서 주의가 필요하다.
보드 핀(Dn) | 실제 GPIO 번호 | 비고 |
---|---|---|
D0 | GPIO16 | |
D1 | GPIO5 | I2C SCL |
D2 | GPIO4 | I2C SDA |
D3 | GPIO0 | 부트 관련 핀, 주의 |
D4 | GPIO2 | 내장 LED |
D5 | GPIO14 | SPI SCK |
D6 | GPIO12 | SPI MISO |
D7 | GPIO13 | SPI MOSI |
D8 | GPIO15 | 부트 관련 핀, 주의 |
RX | GPIO3 | 시리얼 수신 |
TX | GPIO1 | 시리얼 송신 |
지난번에 D1 R2를 사용할 때는 단순하게 온습도 센서만 달았기 때문에 그리 어려운점이 없었다.
이번에는 핀을 좀 더 많이 연결하다보니 새로운 것들을 조금 더 배우게 되었다.
내년에는 메이커 동아리나 한번 운영해볼까 싶다.