ShadowCart — ESP32 simulation

An Autonomous Vision-Based Following Cart

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by 24155714.

Components

Sketch code

#include <Wire.h>

// =====================================================
// MOTOR DRIVER PINS
// =====================================================

#define EN1 25
#define IN1 26
#define IN2 27

#define EN2 14
#define IN3 12
#define IN4 13

// =====================================================
// LEFT TOF
// SDA -> GPIO 21
// SCL -> GPIO 22
// =====================================================

#define LEFT_SDA 21
#define LEFT_SCL 22

// =====================================================
// RIGHT TOF
// SDA -> GPIO 18
// SCL -> GPIO 19
// =====================================================

#define RIGHT_SDA 18
#define RIGHT_SCL 19

// =====================================================
// VL53L0X I2C ADDRESS
// =====================================================

#define TOF_ADDR 0x29

// Second I2C bus
TwoWire I2C_Right = TwoWire(1);

// =====================================================
// READ 8-BIT REGISTER
// =====================================================

uint8_t reg8(TwoWire &bus, uint8_t reg) {

  bus.beginTransmission(TOF_ADDR);
  bus.write(reg);
  bus.endTransmission();

  bus.requestFrom(TOF_ADDR, (uint8_t)1);

  if (bus.available()) {
    return bus.read();
  }

  return 0;
}

// =====================================================
// READ 16-BIT REGISTER
// =====================================================

uint16_t reg16(TwoWire &bus, uint8_t reg) {

  bus.beginTransmission(TOF_ADDR);
  bus.write(reg);
  bus.endTransmission();

  bus.requestFrom(TOF_ADDR, (uint8_t)2);

  if (bus.available() >= 2) {

    uint16_t highByte = bus.read();
    uint16_t lowByte = bus.read();

    return (highByte << 8) | lowByte;
  }

  return 0;
}

// =====================================================
// START VL53L0X CONTINUOUS RANGING
// =====================================================

void startToF(TwoWire &bus) {

  bus.beginTransmission(TOF_ADDR);

  bus.write(0x00);
  bus.write(0x02);

  bus.endTransmission();
}

// =====================================================
// CHECK SENSOR
// =====================================================

bool checkToF(TwoWire &bus) {

  uint8_t modelID = reg8(bus, 0xC0);

  Serial.print("Model ID: 0x");
  Serial.println(modelID, HEX);

  return (modelID == 0xEE);
}

// =====================================================
// READ DISTANCE
// =====================================================

int readDistance(TwoWire &bus) {

  uint16_t distance = reg16(bus, 0x1E);

  if (distance == 0) {
    return -1;
  }

  return distance;
}

// =====================================================
// STOP
// =====================================================

void stopMotors() {

  digitalWrite(EN1, LOW);
  digitalWrite(EN2, LOW);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);

  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

// =====================================================
// FORWARD
// =====================================================

void forwa