NodeMCU ESP8266 interface with MCP23017

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

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

รูปที่ 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 นั้นเอง

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 ซึ่งจะทำให้แอลอีดีตามที่เรากดสวิตช์ โดยเราสามารถนำคำาสั่งไปประยุกต์การใช้งานตามต้องการ

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

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


ในรูปที่ 4 และ 5 เป็นลักษณะของการทดลองโครงงานซึ่งอยู่บนแผ่นเบรดบอร์ด เพื่อให้ง่ายต่อการทดลองและและแก้ไข โดยส่วนหนึ่งของไฟเลี้ยงในการทดลองจะใช้โมดูลดีซี ทู ดีซี เพิ่มเติม (ด้านซ้านของแผ่นเบรดบอร์ด) เพื่อลดภาระการจ่ายกระแสจากพอร์ต USB ของคอมพิวเตอร์เราให้ลดลง
สำหรับโครงงานนี้คงจะเป็นไอเดียแบบหนึ่งให้ผู้อ่านได้นำไปประยุกต์ใช้งาน ซึ่งในบางครั้งบอร์ดควบคุม ESP8266 (ESP-01) หรือ ESP8266 V.3 ที่เรานำมาใช้ อาจจะมีขาอินพุตและเอาต์พุตไม่พอสำหรับการนำไปใช้งานในบางลักษณะครับ.
Reference
- https://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html?fbclid=IwAR2SCjTd0Y459U1zoWX-LVJA5c9BiXXRBSkJ6X6Ii2M5vHIiXnBPXNPEj0s
- https://ro.onetransistor.eu/2018/11/programare-nodemcu-esp8266-in-arduino.html
- https://arduinodiy.wordpress.com/2016/10/11/using-the-4-pins-of-the-esp8266-01/?fbclid=IwAR2SCjTd0Y459U1zoWX-LVJA5c9BiXXRBSkJ6X6Ii2M5vHIiXnBPXNPEj0s
- https://www.esp8266.com/wiki/doku.php?id=getting-started-with-the-esp8266&fbclid=IwAR0Fu-cLAP-p_q9jpYAIyC3cpk_AsGagi0upVmvFIg2ZizEfeM5e3oSRDOw
- https://solarbotics.com/product/29246/
- http://easycoding.tn/
- https://www.e-tinkers.com/2020/04/a-better-way-to-use-esp-01-as-wifi-shield/
- http://www.esp8266learning.com/esp8266-mcp23017-example.php
- https://create.arduino.cc/projecthub/ksmith3036/flash-firmware-on-esp8266-esp-01-using-arduino-mkr-4abfca