James Martel
Published © LGPL

What Do I Build Next? ESP8266MOD WiFi car

Finally got this project going. Little documentation, none from vendors. Incomplete schematics, but now I figured it out

IntermediateProtip2 hours816
What Do I Build Next? ESP8266MOD WiFi car

Things used in this project

Hardware components

esp-12E shield
×1
8266ESPMOD
×1
robot chassis
×1
18560 battery holder
×1
18650 battery and charger
×1

Software apps and online services

Andoid APP
Arduino IDE
Arduino IDE
ESP8266MOD doc
How to Make WiFi Robot Car ESP8266 Nodemcu Wemos : 13 Steps (with Pictures) - Instructables

Story

Read more

Schematics

Corrected Schematics from Instructables

I found this project but couldn't get it to work until I added additional Vin and VM jumpers

Code

Arduino Code for 8266MOD with ESP-12E Shield WiFi Car links

Arduino
Found this on Instructables for Hw-588A shield without documentation
ESP8266MOD
https://www.amazon.com/gp/product/B07HF44GBT/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

ESP-12E SHIELD
https://www.amazon.com/gp/product/B07DK52ZCW/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

INSTRUCTABLES
How to Make WiFi Robot Car ESP8266 Nodemcu Wemos : 13 Steps (with Pictures) - Instructables

https://www.instructables.com/How-to-Make-WiFi-Robot-Car-ESP8266-Nodemcu-Wemos/ 

4-WHEELED CHASSIS
https://www.amazon.com/gp/product/B00NAT3VF4/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

2X 18650 BATTERY HOLDER
https://www.amazon.com/gp/product/B07L3FC9JT/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1

18650 BATTERY AND CHARGER
https://www.amazon.com/gp/product/B00AVWECOC/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

WiFiCar code

Arduino
Found these instructions while looking for info for the HW-588A Shield and ESP8266MOD
/**How to Make WiFi Robot Car ESP8266 Nodemcu Wemos..Instructables**/
/** https://www.instructables.com/How-to-Make-WiFi-Robot-Car-ESP8266-Nodemcu-Wemos  **/

/**add jumpers between Vin and Vm. add jumper between two gnd's**/
/**NODEMCU 1.0 (ESP 12-E MODULE)**/
/******************* WiFi Robot Remote Control Mode ********************/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoOTA.h>

// connections for drive Motors
int PWM_A = D1; //D1
int PWM_B = D2; //D2
int DIR_A = D3; //D3
int DIR_B = D4; //D4

const int buzPin = D5;      //D5 // set digital pin D5 as buzzer pin (use active buzzer)
const int ledPin = D8;      //D8 // set digital pin D8 as LED pin (use super bright LED)
const int wifiLedPin = D0;  //D0 // set digital pin D0 as indication, the LED turn on if NodeMCU connected to WiFi as STA mode

String command;          // String to store app command state.
int SPEED = 1023;        // 330 - 1023.
int speed_Coeff = 3;

ESP8266WebServer server(80);      // Create a webserver object that listens for HTTP request on port 80

unsigned long previousMillis = 0;

String sta_ssid = "yourWiFi";      // set Wifi networks you want to connect to
String sta_password = "yourPassword";  // set password for Wifi networks


void setup(){
  Serial.begin(115200);    // set up Serial library at 115200 bps
  Serial.println();
  Serial.println("*WiFi Robot Remote Control Mode*");
  Serial.println("--------------------------------------");

  pinMode(buzPin, OUTPUT);      // sets the buzzer pin as an Output
  pinMode(ledPin, OUTPUT);      // sets the LED pin as an Output
  pinMode(wifiLedPin, OUTPUT);  // sets the Wifi LED pin as an Output
  digitalWrite(buzPin, LOW);
  digitalWrite(ledPin, LOW);
  digitalWrite(wifiLedPin, HIGH);
   
  // Set all the motor control pins to outputs
  pinMode(PWM_A, OUTPUT);
  pinMode(PWM_B, OUTPUT);
  pinMode(DIR_A, OUTPUT);
  pinMode(DIR_B, OUTPUT);
 
  // Turn off motors - Initial state
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, LOW);
  analogWrite(PWM_A, 0);
  analogWrite(PWM_B, 0);

  // set NodeMCU Wifi hostname based on chip mac address
  String chip_id = String(ESP.getChipId(), HEX);
  int i = chip_id.length()-4;
  chip_id = chip_id.substring(i);
  chip_id = "wificar-" + chip_id;
  String hostname(chip_id);
 
  Serial.println();
  Serial.println("Hostname: "+hostname);

  // first, set NodeMCU as STA mode to connect with a Wifi network
  WiFi.mode(WIFI_STA);
  WiFi.begin(sta_ssid.c_str(), sta_password.c_str());
  Serial.println("");
  Serial.print("Connecting to: ");
  Serial.println(sta_ssid);
  Serial.print("Password: ");
  Serial.println(sta_password);

  // try to connect with Wifi network about 10 seconds
  unsigned long currentMillis = millis();
  previousMillis = currentMillis;
  while (WiFi.status() != WL_CONNECTED && currentMillis - previousMillis <= 10000) {
    delay(500);
    Serial.print(".");
    currentMillis = millis();
  }

  // if failed to connect with Wifi network set NodeMCU as AP mode
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("");
    Serial.println("*WiFi-STA-Mode*");
    Serial.print("IP: ");
    Serial.println(WiFi.localIP());
    digitalWrite(wifiLedPin, LOW);    // Wifi LED on when connected to Wifi as STA mode
    delay(3000);
  } else {
    WiFi.mode(WIFI_AP);
    WiFi.softAP(hostname.c_str());
    IPAddress myIP = WiFi.softAPIP();
    Serial.println("");
    Serial.println("WiFi failed connected to " + sta_ssid);
    Serial.println("");
    Serial.println("*WiFi-AP-Mode*");
    Serial.print("AP IP address: ");
    Serial.println(myIP);
    digitalWrite(wifiLedPin, HIGH);   // Wifi LED off when status as AP mode
    delay(3000);
  }


  server.on ( "/", HTTP_handleRoot );       // call the 'handleRoot' function when a client requests URI "/"
  server.onNotFound ( HTTP_handleRoot );    // when a client requests an unknown URI (i.e. something other than "/"), call function "handleNotFound"
  server.begin();                           // actually start the server
 
  ArduinoOTA.begin();                       // enable to receive update/uploade firmware via Wifi OTA
}


void loop() {
    ArduinoOTA.handle();          // listen for update OTA request from clients
    server.handleClient();        // listen for HTTP requests from clients
   
      command = server.arg("State");          // check HTPP request, if has arguments "State" then saved the value
      if (command == "F") Forward();          // check string then call a function or set a value
      else if (command == "B") Backward();
      else if (command == "R") TurnRight();
      else if (command == "L") TurnLeft();
      else if (command == "G") ForwardLeft();
      else if (command == "H") BackwardLeft();
      else if (command == "I") ForwardRight();
      else if (command == "J") BackwardRight();
      else if (command == "S") Stop();
      else if (command == "V") BeepHorn();
      else if (command == "W") TurnLightOn();
      else if (command == "w") TurnLightOff();
      else if (command == "0") SPEED = 330;
      else if (command == "1") SPEED = 400;
      else if (command == "2") SPEED = 470;
      else if (command == "3") SPEED = 540;
      else if (command == "4") SPEED = 610;
      else if (command == "5") SPEED = 680;
      else if (command == "6") SPEED = 750;
      else if (command == "7") SPEED = 820;
      else if (command == "8") SPEED = 890;
      else if (command == "9") SPEED = 960;
      else if (command == "q") SPEED = 1023;
}

// function prototypes for HTTP handlers
void HTTP_handleRoot(void){
  server.send ( 200, "text/html", "" );       // Send HTTP status 200 (Ok) and send some text to the browser/client
 
  if( server.hasArg("State") ){
     Serial.println(server.arg("State"));
  }
}

void handleNotFound(){
  server.send(404, "text/plain", "404: Not found"); // Send HTTP status 404 (Not Found) when there's no handler for the URI in the request
}

// function to move forward
void Forward(){
  digitalWrite(DIR_A, HIGH);
  digitalWrite(DIR_B, HIGH);
  analogWrite(PWM_A, SPEED);
  analogWrite(PWM_B, SPEED);
}

// function to move backward
void Backward(){
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, LOW);
  analogWrite(PWM_A, SPEED);
  analogWrite(PWM_B, SPEED);
}

// function to turn right
void TurnRight(){
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, HIGH);
  analogWrite(PWM_A, SPEED);
  analogWrite(PWM_B, SPEED);
}

// function to turn left
void TurnLeft(){
  digitalWrite(DIR_A, HIGH);
  digitalWrite(DIR_B, LOW);
  analogWrite(PWM_A, SPEED);
  analogWrite(PWM_B, SPEED);
}

// function to move forward left
void ForwardLeft(){
  digitalWrite(DIR_A, HIGH);
  digitalWrite(DIR_B, HIGH);
  analogWrite(PWM_A, SPEED);
  analogWrite(PWM_B, SPEED/speed_Coeff);
}

// function to move backward left
void BackwardLeft(){
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, LOW);
  analogWrite(PWM_A, SPEED);
  analogWrite(PWM_B, SPEED/speed_Coeff);
}

// function to move forward right
void ForwardRight(){
  digitalWrite(DIR_A, HIGH);
  digitalWrite(DIR_B, HIGH);
  analogWrite(PWM_A, SPEED/speed_Coeff);
  analogWrite(PWM_B, SPEED);
}

// function to move backward left
void BackwardRight(){
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, LOW);
  analogWrite(PWM_A, SPEED/speed_Coeff);
  analogWrite(PWM_B, SPEED);
}

// function to stop motors
void Stop(){ 
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, LOW);
  analogWrite(PWM_A, 0);
  analogWrite(PWM_B, 0);
}

// function to beep a buzzer
void BeepHorn(){
  digitalWrite(buzPin, HIGH);
  delay(150);
  digitalWrite(buzPin, LOW);
  delay(80);
}

// function to turn on LED
void TurnLightOn(){
  digitalWrite(ledPin, HIGH);
}

// function to turn off LED
void TurnLightOff(){
  digitalWrite(ledPin, LOW);
}

Android APP

Arduino
This is the Android APp link
https://play.google.com/store/apps/details?id=com.bluino.esp8266wifirobotcar

Credits

James Martel

James Martel

48 projects • 62 followers
Self taught Robotics platform developer with electronics background

Comments