ในบทความนี้จะมาสาธิตการใช้งาน 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 ได้ในบทความหน้าครับ สำหรับบทความนี้ก็จบเพียงเท่านี้ ขอบคุณที่ติดตามอ่านมาจนจบครับ