{"id":144504,"date":"2024-07-25T16:36:21","date_gmt":"2024-07-25T11:06:21","guid":{"rendered":"https:\/\/www.electronicsforu.com\/?p=144504"},"modified":"2025-03-18T11:05:25","modified_gmt":"2025-03-18T05:35:25","slug":"motor-controller-using-webserial","status":"publish","type":"post","link":"https:\/\/www.electronicsforu.com\/electronics-projects\/motor-controller-using-webserial","title":{"rendered":"Motor Controller Using Webserial"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"152\" src=\"https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2016\/12\/Screen-Shot-2016-12-24-at-15.19.33-e1644389186872.png\" alt=\"\" class=\"wp-image-28226\" style=\"width:318px;height:auto\"\/><figcaption class=\"wp-element-caption\">Comment errors or corrections found for this circuit, and get the chance to win big!<\/figcaption><\/figure><\/div>\n\n\n<p>Controlling two <a href=\"https:\/\/www.electronicsforu.com\/technology-trends\/learn-electronics\/electric-motors#dc-motor\">DC motors<\/a> using Web Serial involves setting up an ESP8266 or <a href=\"https:\/\/www.electronicsforu.com\/technology-trends\/esp32\">ESP32<\/a> microcontroller with motor drivers and a web server. The microcontroller serves web pages and handles commands sent via Web Serial from a browser. Motor control is achieved through functions that interpret commands like &#8220;forward&#8221;, &#8220;backward&#8221;, and &#8220;stop&#8221;. <\/p>\n\n\n\n<p>Each motor requires dedicated GPIO pins for direction control (using H-Bridge motor drivers) and PWM pins for speed control. The system ensures robust power management to handle motor currents and maintains communication integrity between the microcontroller and web browser for real-time control and monitoring.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motorcontrol-1024x1024.jpg\" alt=\"Motor Controller Using Webserial\" class=\"wp-image-144507\" style=\"width:461px;height:auto\" srcset=\"https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motorcontrol-1024x1024.jpg 1024w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motorcontrol-500x500.jpg 500w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motorcontrol-150x150.jpg 150w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motorcontrol-420x420.jpg 420w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motorcontrol-696x696.jpg 696w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motorcontrol.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Author&#8217;s Prototype<\/figcaption><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Application<\/strong><\/h2>\n\n\n\n<p>This setup enables remote operation and automation of DC motors, making it suitable for robotics, home automation, and industrial applications where precise motor control via a web interface is beneficial.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bill of Materials (BoM)<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Components<\/strong><\/td><td><strong>Description<\/strong><\/td><td><strong>Quantity<\/strong><\/td><\/tr><tr><td>Esp32<\/td><td>Dev kit V1<\/td><td>1<\/td><\/tr><tr><td>Motor Driver<\/td><td>L293D<\/td><td>1<\/td><\/tr><tr><td>Motor<\/td><td>9V Dc Motor<\/td><td>2<\/td><\/tr><tr><td>Battery<\/td><td>9V<\/td><td>1<\/td><\/tr><tr><td>Zumper Wire<\/td><td><\/td><td>As required<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Code for Enabling Remote Operation and Automation of DC Motors<\/strong><\/h2>\n\n\n\n<p>#include &lt;Arduino.h&gt;<\/p>\n\n\n\n<p>#if defined(ESP8266)<\/p>\n\n\n\n<p>&nbsp; #include &lt;ESP8266WiFi.h&gt;<\/p>\n\n\n\n<p>&nbsp; #include &lt;ESPAsyncTCP.h&gt;<\/p>\n\n\n\n<p>#elif defined(ESP32)<\/p>\n\n\n\n<p>&nbsp; #include &lt;WiFi.h&gt;<\/p>\n\n\n\n<p>&nbsp; #include &lt;AsyncTCP.h&gt;<\/p>\n\n\n\n<p>#endif<\/p>\n\n\n\n<p>#include &lt;ESPAsyncWebServer.h&gt;<\/p>\n\n\n\n<p>#include &lt;WebSerial.h&gt;<\/p>\n\n\n\n<p>AsyncWebServer server(80);<\/p>\n\n\n\n<p>const char* ssid = &#8220;Webserial&#8221;; \/\/ Your WiFi AP SSID<\/p>\n\n\n\n<p>const char* password = &#8220;lkjhgfdsa2&#8221;; \/\/ Your WiFi Password<\/p>\n\n\n\n<p>\/\/ Define motor control pins<\/p>\n\n\n\n<p>const int motorPin1 = 4; \/\/ IN1<\/p>\n\n\n\n<p>const int motorPin2 = 5; \/\/ IN2<\/p>\n\n\n\n<p>const int enablePin = 27; \/\/ Enable pin (PWM)<\/p>\n\n\n\n<p>const int motorPin3 = 14; \/\/ IN3<\/p>\n\n\n\n<p>const int motorPin4 = 12; \/\/ IN4<\/p>\n\n\n\n<p>const int enablePin2 = 13; \/\/ Enable pin for second motor (PWM)<\/p>\n\n\n\n<p>\/\/ Message callback of WebSerial<\/p>\n\n\n\n<p>void recvMsg(uint8_t *data, size_t len) {<\/p>\n\n\n\n<p>&nbsp; WebSerial.println(&#8220;Received Data&#8230;&#8221;);<\/p>\n\n\n\n<p>&nbsp; String command = &#8220;&#8221;;<\/p>\n\n\n\n<p>&nbsp; for (int i = 0; i &lt; len; i++) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; command += char(data[i]);<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; WebSerial.println(command);<\/p>\n\n\n\n<p>&nbsp; processCommand(command);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>void processCommand(String command) {<\/p>\n\n\n\n<p>&nbsp; if (command == &#8220;F&#8221;) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; moveForward();<\/p>\n\n\n\n<p>&nbsp; } else if (command == &#8220;B&#8221;) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; moveBackward();<\/p>\n\n\n\n<p>&nbsp; } else if (command == &#8220;S&#8221;) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; stopMotor();<\/p>\n\n\n\n<p>&nbsp; } else {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; WebSerial.println(&#8220;Unknown command&#8221;);<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>void moveForward() {<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin1, HIGH);<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin2, LOW);<\/p>\n\n\n\n<p>&nbsp; analogWrite(enablePin, 255); \/\/ Set speed to maximum<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin3, HIGH);<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin4, LOW);<\/p>\n\n\n\n<p>&nbsp; analogWrite(enablePin2, 255); \/\/ Set speed to maximum<\/p>\n\n\n\n<p>&nbsp; WebSerial.println(&#8220;Motors moving forward&#8221;);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>void moveBackward() {<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin1, LOW);<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin2, HIGH);<\/p>\n\n\n\n<p>&nbsp; analogWrite(enablePin, 255); \/\/ Set speed to maximum<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin3, LOW);<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin4, HIGH);<\/p>\n\n\n\n<p>&nbsp; analogWrite(enablePin2, 255); \/\/ Set speed to maximum<\/p>\n\n\n\n<p>&nbsp; WebSerial.println(&#8220;Motors moving backward&#8221;);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>void stopMotor() {<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin1, LOW);<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin2, LOW);<\/p>\n\n\n\n<p>&nbsp; analogWrite(enablePin, 0); \/\/ Stop the first motor<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin3, LOW);<\/p>\n\n\n\n<p>&nbsp; digitalWrite(motorPin4, LOW);<\/p>\n\n\n\n<p>&nbsp; analogWrite(enablePin2, 0); \/\/ Stop the second motor<\/p>\n\n\n\n<p>&nbsp; WebSerial.println(&#8220;Motors stopped&#8221;);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>&nbsp;void setup() {<\/p>\n\n\n\n<p>&nbsp; Serial.begin(115200);<\/p>\n\n\n\n<p>&nbsp; \/\/ Initialize motor control pins<\/p>\n\n\n\n<p>&nbsp; pinMode(motorPin1, OUTPUT);<\/p>\n\n\n\n<p>&nbsp; pinMode(motorPin2, OUTPUT);<\/p>\n\n\n\n<p>&nbsp; pinMode(enablePin, OUTPUT);<\/p>\n\n\n\n<p>&nbsp; pinMode(motorPin3, OUTPUT);<\/p>\n\n\n\n<p>&nbsp; pinMode(motorPin4, OUTPUT);<\/p>\n\n\n\n<p>&nbsp; pinMode(enablePin2, OUTPUT);<\/p>\n\n\n\n<p>&nbsp; \/\/ Initialize WiFi AP<\/p>\n\n\n\n<p>&nbsp; WiFi.softAP(ssid, password);<\/p>\n\n\n\n<p>&nbsp; IPAddress IP = WiFi.softAPIP();<\/p>\n\n\n\n<p>&nbsp; Serial.print(&#8220;AP IP address: &#8220;);<\/p>\n\n\n\n<p>&nbsp; Serial.println(IP);<\/p>\n\n\n\n<p>&nbsp; \/\/ Initialize WebSerial<\/p>\n\n\n\n<p>&nbsp; WebSerial.begin(&amp;server);<\/p>\n\n\n\n<p>&nbsp; WebSerial.msgCallback(recvMsg);<\/p>\n\n\n\n<p>&nbsp; server.begin();<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>void loop() {<\/p>\n\n\n\n<p>&nbsp; delay(2000);<\/p>\n\n\n\n<p>&nbsp; WebSerial.print(F(&#8220;IP address: &#8220;));<\/p>\n\n\n\n<p>&nbsp; WebSerial.println(WiFi.localIP());<\/p>\n\n\n\n<p>&nbsp; WebSerial.printf(&#8220;Millis=%lu\\n&#8221;, millis());<\/p>\n\n\n\n<p>&nbsp; WebSerial.printf(&#8220;Free heap=[%u]\\n&#8221;, ESP.getFreeHeap());<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Connection for Motor Controller Using Webserial<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"980\" height=\"487\" src=\"https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motor-control.png\" alt=\"Circuit Diagram for Motor Controller Using Webserial\" class=\"wp-image-144506\" srcset=\"https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motor-control.png 980w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motor-control-500x248.png 500w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motor-control-845x420.png 845w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/motor-control-696x346.png 696w\" sizes=\"auto, (max-width: 980px) 100vw, 980px\" \/><figcaption class=\"wp-element-caption\">Circuit Diagram<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Testing<\/strong><\/h2>\n\n\n\n<p>Connect all the components as per the given connections and then connect the ESP32 to your computer using a USB cable. Upload the code and connect your phone wifi with webserial then open a web browser on your mobile or laptop. Type (192.168.4.1\/webserial) and enter the commands in the webserial interface.<\/p>\n\n\n\n<p>Use the following commands:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201cF\u201d to move forward<\/li>\n\n\n\n<li>\u201cB\u201d to move backward<\/li>\n\n\n\n<li>\u201cS\u201d to stop the motors<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"409\" height=\"548\" src=\"https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/webserial.png\" alt=\"Motor Controller Using Webserial\" class=\"wp-image-144508\" srcset=\"https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/webserial.png 409w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/webserial-373x500.png 373w, https:\/\/www.electronicsforu.com\/wp-contents\/uploads\/2024\/07\/webserial-313x420.png 313w\" sizes=\"auto, (max-width: 409px) 100vw, 409px\" \/><figcaption class=\"wp-element-caption\">Testing Motor Controller Using Webserial<\/figcaption><\/figure><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><em><em>Author(s): Manjeet Vishwakarma, &nbsp;Abhay Verma and Satywanti Kundu are B.Tech ECE students at GJUS&amp;T HISAR<\/em><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Controlling two DC motors using Web Serial involves setting up an ESP8266 or ESP32 microcontroller with motor drivers and a web server. The microcontroller serves web pages and handles commands sent via Web Serial from a browser. Motor control is achieved through functions that interpret commands like &#8220;forward&#8221;, &#8220;backward&#8221;, and &#8220;stop&#8221;. Each motor requires dedicated [&hellip;]<\/p>\n","protected":false},"author":13,"featured_media":144509,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22,23,776,6189],"tags":[1985,1911,110,1921,5759,298],"class_list":{"0":"post-144504","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-electronics-projects","8":"category-hardware-diy","9":"category-prototypes","10":"category-esp32-projects","11":"tag-diy-projects","12":"tag-do-it-yourself","13":"tag-electronics-projects","14":"tag-esp32","15":"tag-esp32-mcu","16":"tag-esp8266"},"_links":{"self":[{"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/posts\/144504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/comments?post=144504"}],"version-history":[{"count":2,"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/posts\/144504\/revisions"}],"predecessor-version":[{"id":159604,"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/posts\/144504\/revisions\/159604"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/media\/144509"}],"wp:attachment":[{"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/media?parent=144504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/categories?post=144504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.electronicsforu.com\/wp-json\/wp\/v2\/tags?post=144504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}