ESP32, RC카

샤시 조립#

샤시 부품#

번호부품사진수량용도 및 참고사항
1전륜 회전축
/image/r/ESP32-RC-Car-14.png
2
2베어링(대)
/image/r/ESP32-RC-Car-18.png
2
3스티어링 컵
/image/r/ESP32-RC-Car-08.png
2
4커플러 고정핀
/image/r/ESP32-RC-Car-16.png
2
5베어링(중)
/image/r/ESP32-RC-Car-19.png
2
6(전륜) 육각 커플러
/image/r/ESP32-RC-Car-15.png
2
7
/image/r/ESP32-RC-Car-01.png
4
8나이록 너트(M4)
/image/r/ESP32-RC-Car-22.png
2
9십자형 육각 복스
/image/r/ESP32-RC-Car-17.png
1
10볼 조인트 커넥팅 로드
/image/r/ESP32-RC-Car-09.png
1홀 간격 80.5mm 유지
11볼 조인트 커넥팅 로드
/image/r/ESP32-RC-Car-35.png
1홀 간격 51mm 유지
12서보모터
MG996R
/image/r/ESP32-RC-Car-54.png
1
13ㄴ자 서보모터 브라켓
/image/r/ESP32-RC-Car-11.png
2
14휠 베이스 고정판
/image/r/ESP32-RC-Car-12.png
2
15서보 혼
/image/r/ESP32-RC-Car-25.png
1(볼트 포함)
16나이록 너트
(M2.5)
/image/r/ESP32-RC-Car-23.png
1
17샤시 하판
/image/r/ESP32-RC-Car-03.png
1
18DC엔코더 모터 & 커넥터
/image/r/ESP32-RC-Car-04.png
2
19모터 브라켓
/image/r/ESP32-RC-Car-07.png
2
20샤프트
/image/r/ESP32-RC-Car-10.png
2
21써클립
/image/r/ESP32-RC-Car-24.png
2
22샤프트 베어링
/image/r/ESP32-RC-Car-21.png
4
23기어
(무두볼트(Set Screw) 포함)
/image/r/ESP32-RC-Car-05.png
2
24육각 샤프트 커플링 커넥터
/image/r/ESP32-RC-Car-06.png
2
25범퍼
/image/r/ESP32-RC-Car-02.png
1
26샤시 상판
/image/r/ESP32-RC-Car-34.png
1
27락스위치
/image/r/ESP32-RC-Car-20.png
1
28황동 육각 스터드
(M3×22mm)
/image/r/ESP32-RC-Car-26.png
6휠 베이스 고정용 4개, 상판 고정용 2개
29황동 육각 스터드
(M3×16mm)
/image/r/ESP32-RC-Car-27.png
2범퍼 고정용 2개
30볼트
(Pan head, M4×6mm)
/image/r/ESP32-RC-Car-32.png
6모터 브라켓과 샤시 하판 고정용 6개
31볼트
(Bind-Washer head, M3×6mm)
/image/r/ESP32-RC-Car-28.png
10서보모터와 서보모터 브라켓 고정용 4개, 서보모터 브라켓과 샤시하판 고정용 4개, 범퍼 고정용 2개
32볼트
(Bind head, M3×8mm)
/image/r/ESP32-RC-Car-30.png
14육각 스터드 고정용 12개, 범퍼 고정용 2개
33볼트
(Pan head, M2.5×10mm)
/image/r/ESP32-RC-Car-29.png
7커넥팅 로드 연결용 3개, 휠 베이스 연결용 4개
34볼트
(Flat head, M2.5×5mm)
/image/r/ESP32-RC-Car-31.png
4모터와 모터브라켓 고정
35육각렌치
/image/r/ESP32-RC-Car-33.png
1기어 무두볼트용
36저항
1K or 5.1K
/image/r/ESP32-RC-Car-13.png
2(선택사항) 인코더 풀업저항
37홀센서 칩
SH41F(SOT-23타입)
2(선택사항) 홀 센서를 이중채널로 사용할 필요가 있는 경우에, 각 모터마다 1개씩 추가함
36종

전륜 조향 휠 조립#

사진 오른쪽부터 차례대로 8개의 부품을 끼워 휠을 조립한다. (왼쪽휠/오른쪽휠 각각 1개씩, 총 2개 조립)

ESP32, DC모터, TB6612FNG

DC모터 사용하기#

아두이노의 경우와 마찬가지로 ESP32에서도 TB6612FNG 모터드라이버와 함께, 모터 및 아두이노 단독사용을 위하여 3.7V 18650 2개를 직렬로 연결한 외부전원을 사용한다.


TB6612FNG#

기본 핀 배열#
VM
VCC
GND(*)
AOUT1
AOUT2
BOUT2
BOUT1
GND
/image/t/tb6612fng-01.png
PWMA
AIN2
AIN1
STBY
BIN1
BIN2
PWMB
GND
/image/t/tb6612fng-02.png

핀 배열이 다른 경우#
GND
VCC
AOUT1
AOUT2
BOUT2
BOUT1
VM
GND
/image/t/tb6612fng-03.png
PWMA
AIN2
AIN1
NC (=STBY)
BIN1
BIN2
PWMB
GND
/image/t/tb6612fng-04.png
  • VM (모터 전압) = 15V max
  • VCC (로직 전압) = 2.7 ~ 5.5V
  • GND
    • TB6612FNG 모듈을 여러개 테스트한 결과, 기본 핀 배열을 가진 모듈의 3번핀 GND에 연결할 경우 작동이 안되는 몇몇 제품이 있었음
    • 그러므로 8번핀, 9번핀의 GND 사용을 권장
  • 출력전류: 정전류 1.2A (3.2A peak)까지 (모터 2개 사용시 합산 전류임)
  • 모터 제어모드: CW, CCW, short-brake, STOP, stand-by
  • 두개의 모터 출력을 개별 제어하며, 100kHz의 PWM으로 속도 제어
  • 써멀 셧다운 및 저전압 감지회로 내장

Pin의 사용#

ESP32와 TB6612FNG모듈을 브레드보드를 통해 연결하기 쉽도록 핀을 구성한 Pinmap이므로, 필요에 따라 수정하여 사용할 수 있다. (아래표는 참고만 할 것!)

ESP32, nRF24L01 무선통신

nRF24L01#

library#

스케치> 라이브러리 포함하기> 라이브러리 관리> nRF24L01 검색한 후, RF24 by TMRh20, Avamander 설치

/image/n/ESP32-nRF24L01-02.png

schematic: nRF24L01 receiver with ESP32#

/image/n/ESP32-nRF24L01-01.png

※ nRF24L01 모듈에 따라 10uF 캐페시터가 없으면 통신이 안되는 경우가 있음. 이런 경우에만 사용할 것.


pinmap: (안테나를 위로 향하게 두고, 모듈을 위에서 내려다 볼때의 핀배열)#
ESP323V3IO5IO23None
nRF24L01VCC + 10uFCSNMOSIIRQ
(위에서 보이는 핀배열)GND + 10uFCESCKMISO
ESP32GNDIO4IO18IO19

sketch: 1:1 Chat Room#

  • 양방향 송수신을 위하여 위 회로도를 보고 2개의 모듈을 만든 뒤, 다음 스케치를 업로드한다.
  • 시리얼 모니터를 띄운 뒤, 메세지를 전송해본다.
//Libraries for NRF24L01+ module.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
 
//RF24 object with two pins defined with arguments. CE: 4, CSN: 5
RF24 radio(4, 5);
 
//Address of the pipe. 40 bit long, you can choose this freely.
//Remember to use different address in different projects.
long long address = 0x1234ABCDEFLL;

int count = 0;
char stext[32] = "";
int spos = 0;
char rtext[32] = "";
int rpos = 0;

void sendText(char * text, int tlen)
{
  radio.stopListening();
  radio.openWritingPipe(address);
  radio.write(stext, tlen);

  Serial.print("SEND: ");
  Serial.println(text);    

  memset(stext, 0x00, 32);

  radio.openReadingPipe(0, address);
  radio.startListening();
}

void setup() {
  //Start the radio
  Serial.begin(115200);
  radio.begin();

  //Open reading pipe with given address and start listening for incoming data
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN); 
  radio.startListening();
}
 
void loop() {
  while(0 < Serial.available()) {
    stext[spos] = Serial.read();
    
    if(stext[spos] == 0x0a) {
      sendText(stext, spos);
      spos = 0;
    }
    else {
      spos += 1;
    }
  }

  if (radio.available()) {
    while (radio.available()) {
      radio.read(rtext, 32);
    }
    Serial.print("RECV: ");
    Serial.println(rtext);
  }
}

sketch: 1:1 Chat Room#

다음은 처음 실행 후 시리얼모니터에 입력한 ID를 이용하여 Chat Room을 만드는 코드이다.

ESP32, OLED (한글 출력 하기)

OLED#

종류#

ESP32나 Arduino에서 사용할 수 있는 oled의 종류는 매우 많지만, 주로 128*64 픽셀을 가진 0.96인치, 1.3인치의 SSD1306, SH1106 컨트롤러를 사용한 oled가 판매되고 있으며, 통신 프로토콜은 I2C나 SPI를 사용한다. oled 모듈 구입시 픽셀수, 컨트롤러 및 통신프로토콜을 잘 알아두어야 스케치 작성시 참고할 수 있음에 유의한다. I2C 방식은 GPIO를 2개만 사용하여 구성이 쉽다는 장점이 있고, SPI방식은 4~5개의 GPIO를 사용하지만 속도가 빠르다는 장점이 있다. 겉모습만으로는 컨트롤러를 확인하기는 어렵다.

I2CSPI
/image/u/u8g2-oled-i2c-01.png
/image/u/u8g2-oled-spi-01.png
/image/u/u8g2-oled-i2c-02.png
/image/u/u8g2-oled-spi-02.png

이밖에도 U8g2 라이브러리에서 사용가능한 다양한 oled의 종류를 아래 링크에서 확인할 수 있다.

ESP32, 스텝모터

스텝 모터, 28BYJ-48#

Specification#

/image/s/Step-Motor-02.png
  • 정격전압: 5VDC

  • 기어비: 1/64

\[ \frac {32}{9} \times \frac {22}{11} \times \frac {26}{9} \times \frac {31}{10} = 63.68395 \fallingdotseq 64 \]
/image/s/Step-Motor-01.png
  • 스트라이드 각도
    • 스펙상 5.625º / 64 = 0.087890625
      • 그러므로, 360º / 0.087890625 = 4096 스텝
    • 실제로는 11.25º / 64 = 0.17578125
      • 그러므로, 360º / 0.17578125 = 2048 스텝으로 1회전
  • Frequency: 100Hz
  • 토크: 34.3mN,m

모터드라이브 ULN2003#

/image/s/Step-Motor-03.png


스텝 모터의 구동#

schematic#

/image/s/Step-Motor-04.png

Pin Map#

외부전원모터드라이브ESP32
INT119
INT218
INT35
INT417
(+) 5VGND
(-)VCC

※ 모터드라이브에 연결하는 전원(VCC)는 외부전원 5V를 사용한다. (ESP32의 5V는, 전류가 부족하여 ESP32와 연결한 노트북에 영향을 줄 수 있으므로, 사용하지 않는 것이 좋다.)

ESP32, 온도측정(DS18b20), PLX_DAQ

DS18b20 온도센서#

DS18b20 온도 센서를 이용하여 온도를 측정한다.

  • one-wire 버스 통신
  • 공급전압: 3.0V ~ 5.5V
  • 작동온도: -55ºC ~ +125ºC
  • 오차: +/-0.5 ºC (-10ºC ~ 85ºC 범위에서)

Pinout#

/image/DS18b20.png

schematic#

DS18b20 센서는 두 가지 연결방법을 제공하는데, 하나는 VCC를 5V에 연결하는 Normal Mode이고 다른 하나는 VCC를 GND에 연결하는 Parasite Mode이다. 두가지 방법 모두 지원되지만 (경험상) Normal를 추천하며 (원인은 잘 모르겠지만) Parasite Mode에서는 온도센서가 작동이 되지 않는 경우도 가끔 있었다. 회로 구성을 위해 4.7㏀ 저항 1개가 필요하며 Normal Mode 구성을 위해 다음 그림과 같이 연결한다.

esp32 서보모터 PWM제어

SG90, MG90S, MG966R 서보모터#

datasheet#

/image/SG90_Datasheet.jpg

사용법#

  1. ESP32는 16개의 PWM채널이 있으므로, 최대 16개의 서보모터를 동시에 제어할 수 있다.

  2. 서보모터 데이터 시트의 스펙상으로는…

    • 대부분의 서보모터(SG90, MG90S, MG966R 등 포함)는 위의 그림처럼 20ms가 1주기가 되므로, PWM frequency를 50Hz로 설정한다.

    • 20ms가 1주기이고, HIGH 펄스가 2ms 지속될 때 180º 회전을 한다.

    • 그러므로, 전체 펄스 폭의 1/10만큼 HIGH 펄스가 주어지면 180º 회전을 한다.

    • Resolution이 16비트라면 65535의 1/10에 해당하는 6554 의 값이 duty값으로 주어지면 서보모터는 180º 회전을 한다.

esp32 OpenWeatherMap에서 실시간 날씨 정보 받기

OpenWeatherMap.org#

OpenWeatherMap은 세계 각 지역의 현재 날씨, 예보, 과거 날씨 데이터를 제공하는 사이트입니다. (몇가지 제약이 있긴 하지만) 회원가입을 통해서 API Key를 생성하고 이를 통해 무료로 실시간 날씨 정보를 얻을 수 있습니다.


Free Current weather and forecasts collection#


Current weather collections API Key 생성#

  1. Sign Up을 클릭하여 회원가입을 하고,

esp32 BLE, Blynk Gauge

ESP32에서 Blynk로 센서값 보내기#

Blynk App의 GAUGE 위젯을 사용하여 ESP32에 연결된 Potentiometer의 저항값을 읽어 Blynk App에 전압(V), 저항(㏀) 값을 표시해본다. (ESP32 → Blynk App)

  • ESP32의 Potentiometer 값을 읽기 위해 BLYNK_READ(Vpin)을 사용한다.
  • 새로운 프로젝트를 만드는 경우, 새로운 auth token을 받아서 사용해야 한다.

schematic#

/image/blynk-adc-01.png

sketch#

#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT

#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "WUAeS6P57T3XNaIGyLK1-OUv........";

// Potentiometer Pin
#define PIN_POTENTIOMETER A0                       // Potentiometer GPIO 36

// Resist, Voltage
int value_Potentiometer; 
int value_R;
float value_V;

void setup()
{
  // Debug console
  Serial.begin(115200);
  Serial.println("Waiting for connections...");

  // for Blynk 
  Blynk.setDeviceName("Blynk-t");
  Blynk.begin(auth);
}

void loop()
{
  value_Potentiometer = analogRead(PIN_POTENTIOMETER);  // 12bit ADC (0~4095)
  value_V = map(value_Potentiometer, 0, 4095, 3300, 0); // 0~3300mV
  value_R = map(value_V, 0, 3300, 10000, 0);            // 0~10kΩ
  
  Blynk.run();
  
  Serial.print("Resist : "); Serial.print(value_R); Serial.println("Ω");
  Serial.print("Voltage: "); Serial.print(value_V); Serial.println("mV");
  
  delay(1000);
}

BLYNK_READ(V1)           // ESP32 -> widget virtual pin1
{
  Blynk.virtualWrite(V1, value_R);
}

BLYNK_READ(V2)           // ESP32 -> widget virtual pin1
{
  Blynk.virtualWrite(V2, value_V);
}
  • Blynk에서 2개의 Gauge를 사용하기 위해 BLYNK)READ(Vpin)을 2번 사용한다.
  • Blynk.virtualWrite(Vpin, value)를 통해 Blynk App의 Gauge 위젯에서 지정한 virtual pin에 value값을 표시한다.


Blynk 설정#

  1. 새로운 프로젝트를 생성한다.
    • NAME : ESP32_Potentiometer
    • CHOOSE DEVICE : ESP32 Dev Board
    • CONNECTION TYPE : BLE
/image/blynk-adc-02.png

  1. 이메일로 발송된 토큰을 복사한다.
/image/blynk-adc-03.png

  1. +버튼을 눌러 위젯을 추가할 수 있는 화면으로 진입한다.
/image/blynk-adc-04.png

  1. 먼저 BLE 위젯을 선택하여 ESP32와 Blynk간의 통신 방법을 지정한다.
/image/blynk-adc-05.png

  1. 블루투스 모양의 위젯 버튼을 눌러 Blynk와의 통신을 준비한다.
/image/blynk-adc-06.png

  1. Connect BLE device
/image/blynk-adc-07.png

  1. 연결하고자 하는 BLE 장비를 선택하면,
/image/blynk-adc-08.png

  1. 연결 확인!
/image/blynk-adc-09.png

  1. +버튼을 눌러 출력 위젯 2개를 추가한다. (Gauge, Labeled value)
/image/blynk-adc-10.png

  1. 먼저 Gauge 위젯을 선택한다.
/image/blynk-adc-11.png

  1. Gauge 위젯이 추가되면 육각형 모양의 아이콘을 눌러 GAUGE Setting 화면으로 진입한다.
/image/blynk-adc-12.png

/image/blynk-adc-13.png

  1. 설정화면에서 다음 4가지를 설정한다.
    • NAME : 저항
    • INPUT : V1, 0~1000
    • LABEL : (단위를 표시하기 위해) x10 Ohm 을 적는다.
    • READING RATE : 1sec (PUSH 위젯은 실행되지 않음)
/image/blynk-adc-14.png

  1. Labeled Value 위젯을 추가하고, 다음과 같이 설정한다.
    • NAME : 저항
    • INPUT : V2, 0~3300
    • LABEL : (단위를 표시하기 위해) mV 를 적는다.
    • READING RATE : 1sec (PUSH 위젯은 실행되지 않음)
/image/blynk-adc-15.png

  1. 상단의 뒤로가기 화살표를 눌러 프로젝트 바탕화면으로 돌아간다.
/image/blynk-adc-16.png

  1. 여기서 플레이버튼을 누르면,
/image/blynk-adc-17.png

저항과 전압의 측정이 시작된다. (시리얼 모니터에서도 관찰 가능)

esp32 BLE, Blynk Slider (PWM)

ESP32와 Blynk에서의 PWM 사용#

Blynk app에서 Slider 위젯을 사용하여 App → ESP32로 PWM 신호를 보내 LED의 밝기를 조절해본다.

  • Blynk에서 Slider는 Virtual pin을 사용해야한다. (Digital핀을 선택하는 것이 불가능)
  • Virtual pin을 사용하기 위해 BLYNK_WRITE(Vpin)을 사용한다.
  • ESP32에서 PWM을 사용하기 위한 절차에 따라 코딩을 진행한다.

schematic#

/image/blynk-pwm-01.png

※ LED모듈을 사용하는 경우 저항이 필요없다.


sketch#

#define BLYNK_PRINT Serial

#define BLYNK_USE_DIRECT_CONNECT

#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "rc77E7UrbQHhoLE-LV1Ajxz20k8eLBrk";

// setting PWM properties
#define LEDC_FREQ        5000 // Hz
#define LEDC_CHANNEL_0   0
#define LEDC_RESOLUTION  12   // 10bit (0~1023) 12bit(0~4095) 16bit(0~65535)

// led Pin
const int pin_ledR = 19;
    
BLYNK_WRITE(V5)           // widget virtual pin5 -> ESP32
{
  int value_V5 = param.asInt();
  ledcWrite(LEDC_CHANNEL_0, value_V5);
  Serial.print("V5 value: "); Serial.println(value_V5);
}

void setup()
{
  // Debug console
  Serial.begin(115200);
  Serial.println("Waiting for connections...");

  // configure LED PWM functionalitites
  ledcSetup(LEDC_CHANNEL_0, LEDC_FREQ, LEDC_RESOLUTION);
  
  // attach the same channel to the GPIO to be controlled
  ledcAttachPin(pin_ledR, LEDC_CHANNEL_0);

  // for Blynk 
  Blynk.setDeviceName("Blynk-t");
  Blynk.begin(auth);
}

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

sketch 분석#

Button 위젯 사용을 위해 사용하였던 예제 sketch에 다음의 라인을 추가하여야 한다.