Nodemcu-32s Manual (ESP32)
Written By HJ Jang, VCANUS
Setting up
Arduino IDE를 실행하여 작업 환경을 설정할 때, 다음 두 과정을 거친다.
- 사용할 보드 등록
- 연결 포트 설정
1. Board 설정
(1) Arduino IDE 상단 메뉴바의 File > Preferences 클릭, Additional Boards Manager URLs(추가적인 보드 매니저 URLs)에 https://dl.espressif.com/dl/package_esp32_index.json
입력 후 저장
(2) Arduino IDE 상단 메뉴바의 Tools > Board(위에서 8번째) > Boards Manager… > esp32 검색 후 설치
(3) 설치 완료 후, Tools > Board > ESP32 Arduino > ESP32 Dev Module 선택
2. Serial Port 설정
Windows
Windows 환경에서는 Arduino Serial port가 COM Port로 지정되어 있으며 보통 기본값은 COM4이다.
Arduino IDE 상단 메뉴바의 Tools > Port에서 확인 가능하다.
보드를 연결하기 전 후 시리얼 포트 목록에 변화가 없다면 보드 연결 상태를 다시 확인해봐야 한다.
Ubuntu
Ubuntu 환경에서는 따로 port 설정 작업이 필요하다. 설정 없이 실행하는 경우,
Failed to connect to ESP32: Timed out waiting for packet header 에러가 발생한다.
해결방법:
(1) esptool 설치
$ sudo pip install esptool
$ cd Downloads/
$ git clone https://github.com/espressif/esptool.git
$ cd esptool/
$ sudo pip install --user -e .
(2) ttyUSB0 포트 권한 설정
$ sudo -p /dev/ttyUSB0
$ esptool.py --port / dev / ttyUSB0 write_flash 0x1000 /home/marcos/esp/hello_world/build/hello-world.bin
$ cd Downloads/
$ cd esptool/
$ sudo esptool.py --port / dev / ttyUSB0 write_flash 0x1000 /home/marcos/esp/hello_world/build/hello-world.bin
$ esptool.py --port /dev/ttyUSB0 write_flash --flash_mode qio --flash_size 32m 0x0 bootloader.bin 0x1000 my_app.bin
$ cd Downloads/esptool/
$ sudo chmod a+rw /dev/ttyUSB0
(3) Arduino IDE 재실행 > Tools > Port: > /dev/ttyUSB0 선택 가능
ADS1015 Module
1. 모듈 설명
ADS1015는 아날로그 신호를 디지털 신호로 변환하는 ADC(Analog-to-Digital Converter) 모듈이다.
동작전원 | 핀 설명 |
---|---|
2 - 5.5[V] | (왼쪽) - SDA: Digital I/O. Serial data. Tx Rx (ESP32의 21번 핀 연결) - SCL: Digital input. Serial clock input. Clocks data on SDA (ESP32의 22번 핀 연결) - INT: interrupt (오른쪽) - A0, A1, A2: Analog input. |
핀아웃
참고자료: Texas Instruments ADS101x datasheet,
Adafruit 4-Channel ADC Breakouts
2. 모듈 연결 확인
보드에 모듈이 제대로 연결 되었는지 확인하는 코드:
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknown error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
delay(5000);
}
ADS1015가 ESP32에서 제대로 인식되는 경우,
시리얼 모니터를 실행했을 때 위와 같이 0x48에 있다고 인식되어야 한다. (0x48: ADS1015의 기본 주소값)
cf. MCP4725 DAC 모듈의 경우, 기본 주소값이 0x62이다.
마찬가지로 위의 코드를 실행했을 때 I2C device found at address 0x62
라는 메시지가 출력되어야 한다.
※주의: 아두이노 코드의 setup()에서 Serial.begin() 함수 괄호 안의 값은 baud rate이다.
시리얼 모니터 또는 플로터 실행 시 하단의 baud rate을 Serial.begin()에 쓴 값으로 맞춰야 확인하고자 하는 결과가 제대로 출력된다.
ADS1015가 인식되는 것을 확인했다면, ADS1015 라이브러리 파일을 설치한다.
3. ADS1015 Library 설치
Sketch > Include Library > Manage Libraries… > ads1015 검색하여 Adafruit에서 만든 “Adafruit_ADS1X15” 설치
4. ADS1015 Single-ended Signaling
Single-ended Signaling은 n개의 신호에 대해 n+1개의 전선을 사용하는 가장 기본적인 신호 전송 방식으로, 대표적인 예로는 I2C 통신이 있다.
(1) 예제 실행: File > Examples > Adafruit ADS1X15 > singleended
(2) 기본 설정
#include <Wire.h>
#include <Adafuit_ADS1015.h>
Adafruit_ADS1015 ads1015; // ADS1015를 기본 I2C 주소(0x48)로 사용한다는 의미
//...
(3) setup (초기화 함수)
ads1015.setGain(GAIN_TWOTHIRDS); // 기본 Gain값. +/-6.144V 전압에 대한 데이터 출력. 1bit당 3mV 전압으로 인식
ads1015.begin();
(3) loop (실행 함수)
//...
adc0 = ads1015.readADC_SingleEnded(0); // ADS1015의 A0 핀에서 신호 값을 읽는다.
Serial.println(adc0); // Serial Monitor 또는 Serial Plotter 상에 읽어들인 값 출력
// setup()에서 gain을 GAIN_TWOTHIRDS로 설정했으므로 1bit는 3mV 전압을 나타낸다.
// ADS1015는 비트 단위로 값을 표시하기 때문에, 전압값을 알고 싶을 때는 위에서 설정한 gain 값에 따라 알맞는 값을 곱한다.
// EX. GAIN_ONE -> 2 /1000, GAIN_TWO -> 1 / 1000,...
float voltage = adc0 * (3 / 1000); // 단위: [V]
//...
참고: Arduino IDE 의 Serial Monitor와 Serial Plotter
Serial Monitor는 문자열 형태의 데이터를 출력하고, Serial Plotter는 숫자 데이터를 그래프 형태로 출력한다.
아날로그/디지털 신호 전송 시 Serial Plotter를 활용하면 신호의 파형을 쉽게 확인할 수 있다.
단점은, y축 범위를 따로 지정하는 방법이 없어 너무 작거나 큰 값의 경우 그래프를 보기 힘들어진다는 것이다.
이에 대한 해결방법:
// adc0 값을 출력하기 전에 특정 값 두 개를 먼저 출력한다.
Serial.print(0); // 최소값: 0
Serial.print("\t"); // 출력할 값을 추가한다는 의미
Serial.print(100); // 최대값: 100
Serial.print("\t"); // 출력할 값을 추가한다는 의미
// adc0 값
Serial.println(adc0);
활용: 전류 센서 신호 읽기
#include <Adafruit_ADS1015.h>
// ADC 설정
Adafruit_ADS1015 adc;
void setup() {
Serial.begin(9600);
adc.begin();
adc.setGain(GAIN_TWOTHIRDS);
}
void loop() {
// ADS1015의 A0 핀으로부터 아날로그 전압 값 읽는다.
int sensorVal = adc.readADC_SingleEnded(0);
// 비트 -> 전압 계산
// 원래는 0.003을 곱해야 하지만 10 미만의 값은 Serial Plotter에서 잘 안 보이기 때문에 1000으로 나누지 않았다.
float voltage = sensorVal * 3; // 단위: [mV]
// serial plotter y축 범위 지정 (0.75V - 1.75V)
Serial.print(750); Serial.print("\t");
Serial.print(1750); Serial.print("\t");
// 전압 값 출력
Serial.print(voltage); Serial.print("\t");
Serial.println();
delay(100); // 0.1s
}
Serial Plotter 실행
Leave a comment