Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino Mega 2560 Controlled Mecanum Wheel Robot with Bluetooth and Stepper Motor

View and Edit Project In Cirkit DesignerImage of Arduino Mega 2560 Controlled Mecanum Wheel Robot with Bluetooth and Stepper Motor

Circuit Documentation

Summary

The circuit is designed to control a 4WD Mecanum Wheel Car with Bluetooth control capabilities. It includes an Arduino Mega 2560 microcontroller for processing inputs and controlling outputs, two L298N DC motor drivers for driving four DC motors, an HC-05 Bluetooth module for wireless communication, a Servomotor MG995 for additional actuation, an A4988 stepper motor driver for controlling a Nema 17 stepper motor, and multiple 18650 Li-Ion batteries for power supply.

Component List

Microcontroller

Motor Drivers

Motors

Communication Module

Power Supply

Wiring Details

Arduino Mega 2560

L298N DC Motor Driver (Two Instances)

A4988 Stepper Motor Driver (Red)

HC-05 Bluetooth Module

Servomotor MG995

Nema 17 42-STH48

18650 Li-Ion Battery (Multiple Instances)

Documented Code

/*
 * Arduino Sketch for 4WD Mecanum Wheel Car with Bluetooth Control
 * Controls:
 * F - Move Forward
 * B - Move Backward
 * L - Turn Left
 * R - Turn Right
 * S - Stop
 * U - Stepper Motor Clockwise 200 steps
 * D - Stepper Motor Counter-Clockwise 200 steps
 * Q - Glide Left
 * W - Glide Right
 */

#include <Stepper.h>

// Motor driver pins
const int Enable_Rear_Right = 3;
const int Enable_Rear_Left = 2;
const int Rear_Right_Pin1 = 22;
const int Rear_Right_Pin2 = 23;
const int Rear_Left_Pin1 = 24;
const int Rear_Left_Pin2 = 25;
const int Enable_Front_Right = 4;
const int Enable_Front_Left = 5;
const int Front_Right_Pin1 = 26;
const int Front_Right_Pin2 = 27;
const int Front_Left_Pin1 = 28;
const int Front_Left_Pin2 = 29;

// Stepper motor pins
const int STEP_PIN = 8;
const int DIR_PIN = 9;
const int STEPS_PER_REV = 200;
Stepper stepper(STEPS_PER_REV, STEP_PIN, DIR_PIN);

void setup() {
  Serial.begin(9600);
  pinMode(Enable_Rear_Right, OUTPUT);
  pinMode(Enable_Rear_Left, OUTPUT);
  pinMode(Rear_Right_Pin1, OUTPUT);
  pinMode(Rear_Right_Pin2, OUTPUT);
  pinMode(Rear_Left_Pin1, OUTPUT);
  pinMode(Rear_Left_Pin2, OUTPUT);
  pinMode(Enable_Front_Right, OUTPUT);
  pinMode(Enable_Front_Left, OUTPUT);
  pinMode(Front_Right_Pin1, OUTPUT);
  pinMode(Front_Right_Pin2, OUTPUT);
  pinMode(Front_Left_Pin1, OUTPUT);
  pinMode(Front_Left_Pin2, OUTPUT);
  stepper.setSpeed(60);
}

void loop() {
  if (Serial.available() > 0) {
    char command = Serial.read();
    switch (command) {
      case 'F': moveForward(); break;
      case 'B': moveBackward(); break;
      case 'L': turnLeft(); break;
      case 'R': turnRight(); break;
      case 'S': stopCar(); break;
      case 'U': stepper.step(STEPS_PER_REV); break;
      case 'D': stepper.step(-STEPS_PER_REV); break;
      case 'Q': glideLeft(); break;
      case 'W': glideRight(); break;
    }
  }
}

void moveForward() {
  digitalWrite(Rear_Right_Pin1, HIGH);
  digitalWrite(Rear_Right_Pin2, LOW);
  digitalWrite(Rear_Left_Pin1, HIGH);
  digitalWrite(Rear_Left_Pin2, LOW);
  digitalWrite(Front_Right_Pin1, HIGH);
  digitalWrite(Front_Right_Pin2, LOW);
  digitalWrite(Front_Left_Pin1, HIGH);
  digitalWrite(Front_Left_Pin2, LOW);
  analogWrite(Enable_Rear_Right, 255);
  analogWrite(Enable_Rear_Left, 255);
  analogWrite(Enable_Front_Right, 255);
  analogWrite(Enable_Front_Left, 255);
}

void moveBackward() {
  digitalWrite(Rear_Right_Pin1, LOW);
  digitalWrite(Rear_Right_Pin2, HIGH);
  digitalWrite(Rear_Left_Pin1, LOW);
  digitalWrite(Rear_Left_Pin2, HIGH);
  digitalWrite(Front_Right_Pin1, LOW);
  digitalWrite(Front_Right_Pin2, HIGH);
  digitalWrite(Front_Left_Pin1, LOW);
  digitalWrite(Front_Left_Pin2, HIGH);
  analogWrite(Enable_Rear_Right, 255);
  analogWrite(Enable_Rear_Left, 255);
  analogWrite(Enable_Front_Right, 255);
  analogWrite(Enable_Front_Left, 255);
}

void turnLeft() {
  digitalWrite(Rear_Right_Pin1, LOW);
  digitalWrite(Rear_Right_Pin2, HIGH);
  digitalWrite(Rear_Left_Pin1, HIGH);
  digitalWrite(Rear_Left_Pin2, LOW);
  digitalWrite(Front_Right_Pin1, HIGH);
  digitalWrite(Front_Right_Pin2, LOW);
  digitalWrite(Front_Left_Pin1, LOW);
  digitalWrite(Front_Left_Pin2, HIGH);
  analogWrite(Enable_Rear_Right, 255);
  analogWrite(Enable_Rear_Left, 255);
  analogWrite(Enable_Front_Right, 255);
  analogWrite(Enable_Front_Left, 255);
}

void turnRight() {
  digitalWrite(Rear_Right_Pin1, HIGH);
  digitalWrite(Rear_Right_Pin2, LOW);
  digitalWrite(Rear_Left_Pin1, LOW);
  digitalWrite(Rear_Left_Pin2, HIGH);
  digitalWrite(Front_Right_Pin1, LOW);
  digitalWrite(Front_Right_Pin2, HIGH);
  digitalWrite(Front_Left_Pin1, HIGH);
  digitalWrite(Front_Left_Pin2, LOW);
  analogWrite(Enable_Rear_Right, 255);
  analogWrite(Enable_Rear_Left, 255);
  analogWrite(Enable_Front_Right, 255);
  analogWrite(Enable_Front_Left, 255);
}

void stopCar() {
  analogWrite(Enable_Rear_Right, 0);
  analogWrite(Enable_Rear_Left, 0);
  analogWrite(Enable_F