راهنمای شروع کار با ESP32

در این مقاله قصد داریم نحوه استفاده از ماژول ESP32 را با استفاده از نرم‌افزار آردوینو را توسط چند مثال عملی آموزش دهیم.

میکروکنترلر ESP32 نسخه به روز شده ESP8266 می باشد. این SOC دارای دو هسته پردازشی ‫‪Xtensa‬‬ ‫‪LX6‬‬ با فرکانس کاری ۲۴۰ مگاهرتز و توان پردازشی ‫‪DMIPS‬‬ ‫‪600‬‬ بوده و همچنین به ۵۲۰ کیلوبایت حافظه داخلی و ۴ مگابایت حافظه برنامه از نوع SPI Flash مجهز شده است.این ماژول دارای وای فای و بلوتوث داخلی بوده که برای پروژه های IoT مناسب می باشد.

Key Features:

  • 240 MHz dual core Tensilica LX6 microcontroller with 600 DMIPS
  • Integrated 520 KB SRAM
  • Integrated 802.11 b/g/n HT40 Wi-Fi transceiver, baseband, stack and LwIP
  • Integrated dual mode Bluetooth (classic and BLE)
  • 16 MB flash, memory-mapped to the CPU code space
  • 2.3V to 3.6V operating voltage
  • -40°C to +125°C operating temperature
  • Onboard PCB antenna / IPEX connector for external antenna

Sensors:

  • Ultra-low noise analog amplifier
  • Hall sensor
  • 10x capacitive touch interfaces
  • 32 kHz crystal oscillator

34 x GPIO:

  • 3 x UARTs, including hardware flow control
  • 3 x SPI
  • 2 x I2S
  • 18 x ADC input channels
  • 2 x DAC
  • 2 x I2C
  • PWM/timer input/output available on every GPIO pin
  • OpenOCD debug interface with 32 kB TRAX buffer
  • SDIO master/slave 50 MHz
  • Supports external SPI flash up to 16 MB
  • SD-card interface support

Security Related:

  • WEP, WPA/WPA2 PSK/Enterprise
  • Hardware accelerated encryption: AES/SHA2/Elliptical Curve Cryptography/RSA-4096

Performance:

  • Supports sniffer, Station, SoftAP and Wi-Fi direct mode
  • Max data rate of 150 Mbps@11n HT40, 72 Mbps@11n HT20, 54 Mbps@11g, and 11 Mbps@11b
  • Maximum transmit power of 19.5 dBm@11b, 16.5 dBm@11g, 15.5 dBm@11n
  • Minimum receiver sensitivity of -97 dBm
  • 135 Mbps UDP sustained throughput
  • 5 μA power consumption in Deep-sleep

در جدول زیر این ماژول به ESP8266 مقایسه شده است:

نصب پلاگین ESP32 برای آردوینو

نرم‌افزارآردوینو به صورت پیشفرض از ESP32 پشتیبانی نمی‌کند از این رو باید افزونه آن را به صورت مجرا به آن اضافه نمود. برای این منظور ابتدا از مسیر File> Preferences پنجره preferences را باز نمایید.

آدرس زیر را در قسمت مشخص شده کپی کرده و سپس بر روی کلید OK کلیک نمایید.

https://dl.espressif.com/dl/package_esp32_index.json

در مرحله بعد از مسیر Tools > Board > Boards Manager پبجره Boards Manager را باز کنید و در قسمت مشخص شده عبارت ESP32 را وارد کرده و بر روی گزینه Install کلیک کنید. زمان نصب با توجهبه سرعت اینترنت ممکن است طولانی شود.

پس از به پایان رسیدن مراحل نصب ماژول ESP32 به همراه مثال‌های آن به نرم‌افزار آردوینو اضافه شده و قابل استفاده می باشد.

مثال ۱: Hello World! Blinking a LED

ماژول ESP32 دارای ۳۴ عدد پورت با کاربرد های مختلف می‌باشد که در تصویر زیر نحوه چینش پایه‌ها نشان داده شده است.

int LED = 2;
void setup() 
{
  pinMode(LED, OUTPUT);
}
void loop() 
{
  digitalWrite(LED, HIGH);   // turn the LED on 
  delay(1000);                       // wait for a second
  digitalWrite(LED, LOW);    // turn the LED off 
  delay(1000);                       // wait for a second
}

در این مثال پورت ۲ توسط تابع pinMode به عنوان خروجی تعریف شده و وضعیت آن در هر ثانیه توسط تابع DigitalWrite تغییر می کند.خواند مقدار ورودی از پورت از طریق تابع DigitalRead انجام می شود.

مثال ۲: The Touch Sensor

میکروکنترلر ESP32 دارای ۱۰ کانال ورودی تاچ خازنی می‌باشد که می‌توان از آن‌ها به عنوان کلید لمسی استفاده نمود.ورودی های لمسی به پورت های زیر متصل هستند.

  • T0: GPIO 4
  • T1: GPIO 0
  • T2: GPIO 2
  • T3: GPIO 15
  • T4: GPIO 13
  • T5: GPIO 12
  • T6: GPIO 14
  • T7: GPIO 27
  • T8: GPIO 33
  • T9: GPIO 32

برای خواند مقدار سنسور لمسی از تابع touchRead به صورت زیر استفاده می شود.

int value = touchRead(4);

در مثال بعدی وضعیت وضعیت LED متصل به پین ۲ توسط ورودی لمسی T0 کنترلر می شود.

#define TOUTCH_PIN T0 // ESP32 Pin D4
#define LED_PIN 2
int touch_value = 100;
void setup()
{
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  Serial.println(&quotESP32 Touch Test&quot);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite (LED_PIN, LOW);
}
void loop()
{
  touch_value = touchRead(TOUTCH_PIN);
  Serial.println(touch_value);  // get value using T0 
  if (touch_value < 50)
  {
    digitalWrite (LED_PIN, HIGH);
  }
  else
  {
    digitalWrite (LED_PIN, LOW);
  }
  delay(1000);
}

مثال ۳: Analog Input

میکروکنترلر ESP32 دارای دو واحد مبدل آنالوگ به دیجیتال ۱۲ بیتی و ۱۸ کانال مالتی پلکسر می باشد. با این مبدل می‌توان ولتاژ بین ۰ تا ۳.۳ ولت را به دیجیتال تبدیل نمود.با توجه به دقت ۱۲ بیتی ابن مبدل می‌توان حداکثر مثدار ۴۰۹۵ را اندازه‌گیری نمود. ورودی های این مبدل به پین های زیر متصل شده است.

  • GPIO 0 ==> ADC2_CH1
  • GPIO 2 ==> ADC2_CH2
  • GPIO 4 ==> ADC2_CH0
  • GPIO 12 => ADC2_CH5
  • GPIO 13 => ADC2_CH4
  • GPIO 14 => ADC2_CH6
  • GPIO 15 => ADC2_CH3
  • GPIO 25 => ADC2_CH8
  • GPIO 26 => ADC2_CH9
  • GPIO 27 => ADC2_CH7
  • GPIO 32 => ADC1_CH4
  • GPIO 33 => ADC1_CH5
  • GPIO 34 => ADC1_CH6
  • GPIO 35 => ADC1_CH7
  • GPIO 36 => ADC1_CH0
  • GPIO 37 => ADC1_CH1
  • GPIO 38 => ADC1_CH2
  • GPIO 39 => ADC1_CH3

نحوه خواند مقدار آنالوگ با تابع analogRead به صورت زیر می باشد.

int analog_value = analogRead(36);

در مثال زیر مقدار ورودی آنالوگ متصل به پین ۳۶ توسط مبدل خوانده شده و با نرخ ۱۱۵۲۰۰ بیت بر ثانیه به پورت سریال ارسال می شود.

//Analog Input
#define ANALOG_PIN_0 36
int analog_value = 0;
void setup()
{
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  Serial.println(&quotESP32 Analog IN Test&quot);
}
void loop()
{
  analog_value = analogRead(ANALOG_PIN_0);
  Serial.println(analog_value);
  delay(500);
}

مثال ۴: Dimming a LED: Analog Output Using PWM

در این مثال می‌خواهیم با مقدار خوانده شده توسط ADC و تولید موج PWM نور LED متصل به پین ۲ را کنترلر کنیم.

//Analog Input
#define ANALOG_PIN_0 36
int analog_value = 0;
// PMW LED
#define LED_PIN 2
int freq = 5000;
int ledChannel = 0;
int resolution = 8;
int dutyCycle = 0;
void setup()
{
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  Serial.println(&quotESP32 Analog IN/OUT Test&quot);
  ledcSetup(ledChannel, freq, resolution);
  ledcAttachPin(LED_PIN, ledChannel);
  ledcWrite(ledChannel, dutyCycle);
}
void loop()
{
  analog_value = analogRead(ANALOG_PIN_0);
  Serial.println(analog_value);
  dutyCycle = map(analog_value, 0, 4095, 0, 255);
  ledcWrite(ledChannel, dutyCycle);
  delay(500);
}