NodeMCU ESP8266 interface with MCP23017

โครงงานนี้เป็นการทดลองเชื่อมต่อ NodeMCU ESP8266 V.3 และไอซี MCP23017 เพื่อให้เราสามารถรับสัญญาณอินพุตและเอาต์พุต (I/O) ได้เพิ่มขึ้น ทั้งนี้ในการนำบอร์ด ESP8266 ไปใช้งานบางโครงงานอาจจะต้องการจำนวนขาอินพุตหรือเอาต์พุมเพิ่มเติม ซึ่ง ESP8266 อาจจะมีขาไม่เพียงพอ ดังนั้นการขยายพอร์ตอินพุตและเอาต์พุต ด้วยไอซี MCP23017 จึงเป็นรูปแบบหนึ่งของการแก้ไขปัญหา โดยสามารถเพิ่มขึ้นอีก 16 ขา และตัวอย่างในโครงงานนี้จะกำหนดให้พอร์ต B เป็นขาอินพุต 8 ขา และพอร์ต A เป็นเอาต์พุต 8 ขา เพื่อเป็นแนวทางเบื้องต้นครับ.

NodeMCU ESP8266 interface with MCP23017
รูปที่ 1 ลักษณะการต่อบอร์ทดลอง

รูปที่ 1 แสดงลักษณะการต่อบอร์ดทดลองระหว่าง ESP8266 V.3 และไอซี MCP23017 สำหรับทดลองการทำงานด้วยการสื่อสารแบบ I2C

NodeMCU ESP8266 interface with MCP23017
รูปที่ 2 วงจรที่ใช้ในการทดลองของโครงงาน

รูปที่ 2 วงจรที่ใช้ในการทดลองของโครงงานจะใช้เพียง 2 ขาเท่านั้น (I2C Protocol) คือ SDA และ SCL ในการสื่อสารระหว่างกัน โดยจะต่อจากขา D1 (SCK), D2 (SDA) ของบอร์ด ESP8266-V.3 ไปยังขา 12 (SCK) และขา 13 (SDA) ของตัวไอซี MCP23017

Example 1. ESP8266-V.3 interface to MCP23017

// ESP8266-V.3 interface to MCP23017 

 #include    // Wire.h
 byte input=0;

 void setup()
 {
   Serial.begin(115200); 
   Wire.begin();
   Wire.beginTransmission(0x20);  
   Wire.write(0x00);    // IODIRA register
   Wire.write(0x00);    // set entire PORT A as output
   Wire.endTransmission();
 } 

 void loop()
 {
   // Read all inputs Port B
   Wire.beginTransmission(0x20);
   Wire.write(0x13);    // address Port B
   Wire.endTransmission();
   Wire.requestFrom(0x20, 1);
   input=Wire.read(); 
   delay(50);

 // Write data to Port A
   Wire.beginTransmission(0x20);
   Wire.write(0x12);     // address Port A
   Wire.write(input);    // Port A
   Wire.endTransmission();
   delay(50);
 }

ในตัวอย่างโปรแกรมที่ 2 ข้างล่างนี้จะเป็นการใช้งานกับ ESP8266 (ESP-01) ซึ่งจะมีลักษณะการทำงานคล้ายกับ ESP8266-V.3 แต่มีส่วนที่เราจะต้องเพิ่มในคำสั่งคือ

pinMode(0, OUTPUT); // To SDA Pin 13 MCP23017
pinMode(2, OUTPUT); // To SLA Pin 12 MCP23017
Wire.pins(0,2);
Wire.begin(0,2);

โดยเราจะต้องกำหนดเพิ่มเติมที่ขา 0 และขา 2 เพื่อให้สามารถเชื่อมต่อกับขาสื่อสาร SDA และ SCL นั้นเอง

Picture by : https://create.arduino.cc/projecthub/ksmith3036/flash-firmware-on-esp8266-esp-01-using-arduino-mkr-4abfca

Example 2. ESP8266 (ESP-01) interface to MCP23017

// ESP8266 (ESP-01) interface to MCP23017 

#include <Wire.h>   // Wire.h
byte input=0;

void setup()
{
  Serial.begin(115200);
  pinMode(0, OUTPUT);    // To SDA Pin 13 MCP23017
  pinMode(2, OUTPUT);    // To SLA  Pin 12 MCP23017
  Wire.pins(0,2);
  Wire.begin(0,2);
  Wire.beginTransmission(0x20);  
  Wire.write(0x00);    // IODIRA register
  Wire.write(0x00);    // set entire PORT A as output
  Wire.endTransmission();
} 

void loop()
{
  // Read all inputs Port B
  Wire.beginTransmission(0x20);
  Wire.write(0x13);    // address Port B
  Wire.endTransmission();
  Wire.requestFrom(0x20, 1);
  input=Wire.read(); 
  delay(50);

  // Write data to Port A
  Wire.beginTransmission(0x20);
  Wire.write(0x12);     // address Port A
  Wire.write(input);    // Port A
  Wire.endTransmission();
  delay(50);
}

ในส่วนของโปรแกรมข้างบนทั้ง 2 ตัวอย่างนี้ จะเป็นคำสั่งการใช้งานเบื้องต้นสำหรับเชื่อมต่อบอร์ด ESP8266 และไอซี MCP23017 ให้สามารถอ่านค่าสัญญาณอินพุตจากพอร์ต B ที่ตำแหน่ง Read all inputs Port B จากนั้นนำค่าที่ได้ ส่งมายังพอร์ต A ตำแหน่งคำสั่ง Write data to Port A ซึ่งจะทำให้แอลอีดีตามที่เรากดสวิตช์ โดยเราสามารถนำคำาสั่งไปประยุกต์การใช้งานตามต้องการ

NodeMCU ESP8266 interface with MCP23017
รูปที่ 3 แออีดีแสดงผลเมื่อเรายังไม่กดสวิตช์ใดๆ ที่ขา 1, 2 และขา 3

รูปที่ 3 แสดงการทดลองที่เกิดขึ้นเมื่อเรายังไม่กดสวิตช์ใดที่ขา 1, 2 และ 3 ซึ่งเป็นขาอินพุตที่พอร์ต B ของไอซี MCP23017 ผลที่ได้ทำให้เป็นลอจิกเป็น High ทั้ง 3 ขาที่พอร์ต A และผลที่ได้จากการทดลองจะแสดงดังรูปในการทดลองที่ 3

NodeMCU ESP8266 interface with MCP23017
รูปที่ 4 ผลการทดลองเมื่อเราใช้สายจั้มที่ขา 1 ของไอซี MCP23017

รูปที่ 4 แสดงการผลการทดลองเมื่อเรานำสายจั้มสีส้ม (แทนการกดสวิตช์) ต่อที่ขา 1 ของไอซี MCP23017 ลงกราวด์ (ให้เป็นลอจิก Low) ทำให้แอลอีดีขา 1 ดับ ส่วนที่ขา 2 และขา 3 ยังคงเป็น High อยู่ ผลที่ได้จากการทดลองจะแสดงดังรูปที่ 4

NodeMCU ESP8266 interface with MCP23017
รูปที่ 5 ลักษณะการทดลอง (1)
NodeMCU ESP8266 interface with MCP23017
รูปที่ 6 ลักษณะการทดลอง (2)

ในรูปที่ 4 และ 5 เป็นลักษณะของการทดลองโครงงานซึ่งอยู่บนแผ่นเบรดบอร์ด เพื่อให้ง่ายต่อการทดลองและและแก้ไข โดยส่วนหนึ่งของไฟเลี้ยงในการทดลองจะใช้โมดูลดีซี ทู ดีซี เพิ่มเติม (ด้านซ้านของแผ่นเบรดบอร์ด) เพื่อลดภาระการจ่ายกระแสจากพอร์ต USB ของคอมพิวเตอร์เราให้ลดลง

สำหรับโครงงานนี้คงจะเป็นไอเดียแบบหนึ่งให้ผู้อ่านได้นำไปประยุกต์ใช้งาน ซึ่งในบางครั้งบอร์ดควบคุม ESP8266 (ESP-01) หรือ ESP8266 V.3 ที่เรานำมาใช้ อาจจะมีขาอินพุตและเอาต์พุตไม่พอสำหรับการนำไปใช้งานในบางลักษณะครับ.

Reference

  1. https://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html?fbclid=IwAR2SCjTd0Y459U1zoWX-LVJA5c9BiXXRBSkJ6X6Ii2M5vHIiXnBPXNPEj0s
  2. https://ro.onetransistor.eu/2018/11/programare-nodemcu-esp8266-in-arduino.html
  3. https://arduinodiy.wordpress.com/2016/10/11/using-the-4-pins-of-the-esp8266-01/?fbclid=IwAR2SCjTd0Y459U1zoWX-LVJA5c9BiXXRBSkJ6X6Ii2M5vHIiXnBPXNPEj0s
  4. https://www.esp8266.com/wiki/doku.php?id=getting-started-with-the-esp8266&fbclid=IwAR0Fu-cLAP-p_q9jpYAIyC3cpk_AsGagi0upVmvFIg2ZizEfeM5e3oSRDOw
  5. https://solarbotics.com/product/29246/
  6. http://easycoding.tn/
  7. https://www.e-tinkers.com/2020/04/a-better-way-to-use-esp-01-as-wifi-shield/
  8. http://www.esp8266learning.com/esp8266-mcp23017-example.php
  9. https://create.arduino.cc/projecthub/ksmith3036/flash-firmware-on-esp8266-esp-01-using-arduino-mkr-4abfca