
ในบทความนี้จะมาสาธิตการใช้งาน ESP8266 ในการควบคุมความเร็วมอเตอร์ออนไลน์ ซึ่งจะสามารถนำไปประยุกต์ในการควบคุมความเร็วพัดลมได้ด้วยมือถือ การควบคุมความเร็วมอเตอร์จะทำได้ด้วยการสร้างคลื่นสี่เหลี่ยมขึ้นมา จากนั้นทำการปรับค่าดิวตี้ไซต์เคิล ซึ่งการสร้างความถี่ขึ้นมาเพื่อควบคุมความเร็วมอเตอร์นี้ เรียกว่าการสร้างความถี่แบบ PWM (Pulse Width Modulation) ใน Arduino IDE ใช้เพียงคำสั่ง analogWrite() ก็สามารถสร้างความถี่พร้อมปรับค่าดิวตีไซเคิลได้แล้ว
ดิวตี้ไซเคิลเป็นคาบเวลาช่วงขาขึ้นของคลื่นพัลส์ หรือเวลาที่เป็นลอจิก 1 เทียบกับคาบเวลาขาลง หรือลอจิก 0 ค่าของดิวตี้ไซเคิลจะเรียกเป็นเปอร์เซ็น เช่น คลื่นลูกหนึ่งมีคาบเวลาขาขี้น 1mS และขาลง 1mS นั่นหมายความว่าคาบเวลาขาขึ้นและขาลงมีค่าเท่ากัน ค่าของดิวตี้ไซเคิลจึงมีค่า 50% แต่หากคาบเวลาขาขึ้นมีค่าเป็น 3mS และคาบเวลาขาลงมีค่า 1mS จะได้ค่าดิวตี้ไซเคิลเป็น 75%

หากค่าดิวตี้ไซเคิลมีมาก ช่วงเวลาที่มอเตอร์ได้รับไฟฟ้าก็มีมาก ทำให้มอเตอร์หมุนได้เร็วขึ้น แต่หากค่าดิวเตอร์ไซเคิลมีน้อย ช่วงเวลาที่มอเตอร์จะได้รับไฟฟ้าก็มีน้อยลง ทำให้มอเตอร์หมุนได้ช้าลงนั่นเอง
กรณีที่ใช้ Arduino IDE ในการเขียนโปรแกรม เมื่อใช้บน ESP8266 คำสั่งที่ใช้ยังคงเป็น analogWrite() ที่เขียนค่าไปที่ขา Digital I/O เพื่อสร้างความถี่และปรับค่าดิวตี้ไซเคิล เพียงแต่ใน Arduino จะปรับค่าดิวตี้ไซต์เคิลได้แบบ 8 บิต คือสูงสุด 255 แต่ใน ESP8266 สามารถปรับได้แบบ 10 บิต คือสูงสุด 1023
ใน ESP8266 สามารถใช้ PWM ได้ทุกขา ยกเว้นขา GPIO16 หรือใน NodeMCU จะเป็นขา D0


ใช้คำสั่งพื้นฐานใน Examples มาทำการปรับแก้ ร่วมกับใส่โค้ด HTML5 + CSS + Javascript เข้าไป จึงได้ออกมาเป็นโค้ดด้านล่างนี้
/* IOXhop.com */
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
int MoterSpeed[] = { 0, 511, 767, 1023 };
int pin = 4;
const char* ssid = "YOU WIFI NAME";
const char* password = "YOU WIFI PASSWORD";
String IndexPage =
"<!DOCTYPE HTML>\r\n"
"<html>\r\n"
"<head>\r\n"
"<meta charset=\"utf-8\">\r\n"
"<title>Speed Controls</title>\r\n"
"<style>\r\n"
"* {\r\n"
" font-family: Arial, Helvetica, sans-serif;\r\n"
"}\r\n"
"</style>\r\n"
"<script>\r\n"
"function SetVal(newVal){\r\n"
" var xmlhttp;\r\n"
" if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari\r\n"
" xmlhttp=new XMLHttpRequest();\r\n"
" } else {// code for IE6, IE5\r\n"
" xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n"
" }\r\n"
" xmlhttp.onreadystatechange=function() {\r\n"
" if (xmlhttp.readyState==4 && xmlhttp.status==200) {\r\n"
" // document.getElementById(\"myDiv\").innerHTML=xmlhttp.responseText;\r\n"
" }\r\n"
" }\r\n"
" xmlhttp.open(\"GET\", \"/setspeed?val=\"+newVal, true);\r\n"
" xmlhttp.send();\r\n"
"}\r\n"
"</script>\r\n"
"</head>\r\n"
"\r\n"
"<body>\r\n"
"<h1 style=\"text-align:center; font-size:80px; margin:0; margin-top:30px;\">Speed Controls</h1>\r\n"
"<h3 style=\"text-align:center; font-size:28px; margin:0; margin-top:20px; color:#333;\">on ESP8266 By <a href=\"http://www.ioxhop.com/\" target=\"_blank\" style=\"color: #666; text-decoration:none;\">IOXhop</a></h3>\r\n"
"<div style=\"text-align:center; font-size: 240px; margin: 30px 0;\" id=\"speedshow\">{NowSpeed}</div>\r\n"
"<div style=\"text-align:center;\">\r\n"
" <label style=\"vertical-align:middle;\">Speed   <input type=\"range\" min=\"0\" max=\"3\" value=\"{NowSpeed}\" id=\"speed\" list=\"volsettings\" style=\"width:320px; vertical-align:middle;\" oninput=\"document.getElementById('speedshow').innerHTML=this.value\" onchange=\"SetVal(this.value)\"></label>\r\n"
" <datalist id=\"volsettings\">\r\n"
" <option>0</option>\r\n"
" <option>1</option>\r\n"
" <option>2</option>\r\n"
" <option>3</option>\r\n"
" </datalist>\r\n"
"</div>\r\n"
"</body>\r\n"
"</html>\r\n"
;
ESP8266WebServer server(80);
void setup() {
pinMode(pin, OUTPUT);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", [](){
String NewPage = IndexPage;
NewPage.replace("{NowSpeed}", "0");
server.send(200, "text/html", NewPage);
});
server.on("/setspeed", HTTP_GET, [](){
int Val = server.arg("val").toInt();
analogWrite(pin, MoterSpeed[Val]);
server.send(200, "text/html", "OK");
});
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
เนื่องจากไมโครคอนโทรลเลอร์นั้นไม่มีกระแสไฟมากพอที่จะไปขับมอเตอร์ได้โดยตรง ต้องอาศัยการนำทรานซิสเตอร์มาต่อเพื่อเป็นตัวขับมอเตอร์อีกที ซึ่งรูปแบบวงจรจะเป็นประมาณนี้

ทรานซิสเตอร์ควรเลือกใช้เบอร์ที่มีกระแสเพียงพอต่อความต้องการของมอเตอร์ เช่น เลือกใช้ทรานซิสเตอร์เบอร์ BD139 สำหรับขับมอเตอร์ขนาดเล็กๆ กินกระแสไฟไม่เกิน 2A (แต่ตามสเปคทรานซิสเตอร์ตัวนี้สามารถทนกระแสได้ถึงประมาณ 4A)
จากโค้ดด้านบน ได้กำหนดให้ใช้ GPIO4 หรือ D2 ใน NodeMCU เป็นขาสำหรับสร้างสัญญาณ PWM เข้าทรานซิสเตอร์
เมื่ออัพโหลดโค้ดลงไปเรียบร้อยแล้ว กดที่ Serial Monitor เพื่อดูหมายเลข IP และเข้าไปที่หมายเลข IP นั้นผ่านเว็บเบราว์เซอร์ จะปรากฏหน้าเว็บสำหรับปรับความเร็วขึ้นมา

เมื่อปรับให้ตัวเลขเพิ่มขึ้น ความเร็วมอเตอร์ก็จะเพิ่มขึ้นด้วย หากปรับถึงเลข 3 ความเร็วมอเตอร์จะเร็วสูงสุด
รายการอุปกรณ์บางตัวสามารถแทนกันได้ เช่น ตัวต้านทาน 1K สามารถใช้ 2K ได้เช่นกัน แต่ไม่ควรเกิน 10K
-----------------------------------------------------------------------------
สามารถติดตามการใช้งาน ESP8266 ได้ในบทความหน้าครับ สำหรับบทความนี้ก็จบเพียงเท่านี้ ขอบคุณที่ติดตามอ่านมาจนจบครับ
 ArtronShop บอร์ดอิเล็กทรอนิกส์ Arduino ESP32 ESP8266
			ArtronShop บอร์ดอิเล็กทรอนิกส์ Arduino ESP32 ESP8266
		 
					