Nodemcu-32s Manual (ESP32)

4 minute read

Written By HJ Jang, VCANUS

Setting up

Arduino IDE를 실행하여 작업 환경을 설정할 때, 다음 두 과정을 거친다.

  1. 사용할 보드 등록
  2. 연결 포트 설정

1. Board 설정

(1) Arduino IDE 상단 메뉴바의 File > Preferences 클릭, Additional Boards Manager URLs(추가적인 보드 매니저 URLs)에 https://dl.espressif.com/dl/package_esp32_index.json 입력 후 저장

스크린샷 2020-12-14 오전 10 25 50

(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 설정 작업이 필요하다. 설정 없이 실행하는 경우,

Screenshot from 2020-09-28 10-35-05

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.

핀아웃

NodeMCU-32S-pinout

참고자료: 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에서 제대로 인식되는 경우,

Screenshot from 2020-09-28 10-56-34

시리얼 모니터를 실행했을 때 위와 같이 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 실행

Screenshot from 2020-09-28 11-50-37

Leave a comment