I’m working through the ESP32-38 pin wide. I was building a gyroscope controlled robot car.
this is my code -
#include <esp_now.h>
#include <WiFi.h>
#define FORWARD 1
#define BACKWARD 2
#define LEFT 3
#define RIGHT 4
#define FORWARD_LEFT 5
#define FORWARD_RIGHT 6
#define BACKWARD_LEFT 7
#define BACKWARD_RIGHT 8
#define TURN_LEFT 9
#define TURN_RIGHT 10
#define STOP 0
#define BACK_RIGHT_MOTOR 0
#define BACK_LEFT_MOTOR 1
#define FRONT_RIGHT_MOTOR 2
#define FRONT_LEFT_MOTOR 3
struct MOTOR_PINS
{
int pinIN1;
int pinIN2;
int pinEn;
int pwmSpeedChannel;
};
std::vector<MOTOR_PINS> motorPins =
{
{16, 17, 22, 4}, //BACK_RIGHT_MOTOR
{18, 19, 23, 5}, //BACK_LEFT_MOTOR
{26, 27, 14, 6}, //FRONT_RIGHT_MOTOR
{33, 25, 32, 7}, //FRONT_LEFT_MOTOR
};
#define MAX_MOTOR_SPEED 200
const int PWMFreq = 1000; /* 1 KHz */
const int PWMResolution = 8;
#define SIGNAL_TIMEOUT 1000 // This is signal timeout in milli seconds. We will reset the data if no signal
unsigned long lastRecvTime = 0;
struct PacketData
{
byte xAxisValue;
byte yAxisValue;
byte zAxisValue;
};
PacketData receiverData;
// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len)
{
if (len == 0)
{
return;
}
memcpy(&receiverData, incomingData, sizeof(receiverData));
String inputData ;
inputData = inputData + "values " + receiverData.xAxisValue + " " + receiverData.yAxisValue + " " + receiverData.zAxisValue;
Serial.println(inputData);
if ( receiverData.xAxisValue < 75 && receiverData.yAxisValue < 75)
{
processCarMovement(FORWARD_LEFT);
}
else if ( receiverData.xAxisValue > 175 && receiverData.yAxisValue < 75)
{
processCarMovement(FORWARD_RIGHT);
}
else if ( receiverData.xAxisValue < 75 && receiverData.yAxisValue > 175)
{
processCarMovement(BACKWARD_LEFT);
}
else if ( receiverData.xAxisValue > 175 && receiverData.yAxisValue > 175)
{
processCarMovement(BACKWARD_RIGHT);
}
else if (receiverData.zAxisValue > 175)
{
processCarMovement(TURN_RIGHT);
}
else if (receiverData.zAxisValue < 75)
{
processCarMovement(TURN_LEFT);
}
else if (receiverData.yAxisValue < 75)
{
processCarMovement(FORWARD);
}
else if (receiverData.yAxisValue > 175)
{
processCarMovement(BACKWARD);
}
else if (receiverData.xAxisValue > 175)
{
processCarMovement(RIGHT);
}
else if (receiverData.xAxisValue < 75)
{
processCarMovement(LEFT);
}
else
{
processCarMovement(STOP);
}
lastRecvTime = millis();
}
void processCarMovement(int inputValue)
{
switch(inputValue)
{
case FORWARD:
rotateMotor(FRONT_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, MAX_MOTOR_SPEED);
break;
case BACKWARD:
rotateMotor(FRONT_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, -MAX_MOTOR_SPEED);
break;
case LEFT:
rotateMotor(FRONT_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, MAX_MOTOR_SPEED);
break;
case RIGHT:
rotateMotor(FRONT_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, -MAX_MOTOR_SPEED);
break;
case FORWARD_LEFT:
rotateMotor(FRONT_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, STOP);
rotateMotor(FRONT_LEFT_MOTOR, STOP);
rotateMotor(BACK_LEFT_MOTOR, MAX_MOTOR_SPEED);
break;
case FORWARD_RIGHT:
rotateMotor(FRONT_RIGHT_MOTOR, STOP);
rotateMotor(BACK_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, STOP);
break;
case BACKWARD_LEFT:
rotateMotor(FRONT_RIGHT_MOTOR, STOP);
rotateMotor(BACK_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, STOP);
break;
case BACKWARD_RIGHT:
rotateMotor(FRONT_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, STOP);
rotateMotor(FRONT_LEFT_MOTOR, STOP);
rotateMotor(BACK_LEFT_MOTOR, -MAX_MOTOR_SPEED);
break;
case TURN_LEFT:
rotateMotor(FRONT_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, -MAX_MOTOR_SPEED);
break;
case TURN_RIGHT:
rotateMotor(FRONT_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(BACK_RIGHT_MOTOR, -MAX_MOTOR_SPEED);
rotateMotor(FRONT_LEFT_MOTOR, MAX_MOTOR_SPEED);
rotateMotor(BACK_LEFT_MOTOR, MAX_MOTOR_SPEED);
break;
case STOP:
rotateMotor(FRONT_RIGHT_MOTOR, STOP);
rotateMotor(BACK_RIGHT_MOTOR, STOP);
rotateMotor(FRONT_LEFT_MOTOR, STOP);
rotateMotor(BACK_LEFT_MOTOR, STOP);
break;
default:
rotateMotor(FRONT_RIGHT_MOTOR, STOP);
rotateMotor(BACK_RIGHT_MOTOR, STOP);
rotateMotor(FRONT_LEFT_MOTOR, STOP);
rotateMotor(BACK_LEFT_MOTOR, STOP);
break;
}
}
void rotateMotor(int motorNumber, int motorSpeed)
{
if (motorSpeed < 0)
{
digitalWrite(motorPins[motorNumber].pinIN1, LOW);
digitalWrite(motorPins[motorNumber].pinIN2, HIGH);
}
else if (motorSpeed > 0)
{
digitalWrite(motorPins[motorNumber].pinIN1, HIGH);
digitalWrite(motorPins[motorNumber].pinIN2, LOW);
}
else
{
digitalWrite(motorPins[motorNumber].pinIN1, LOW);
digitalWrite(motorPins[motorNumber].pinIN2, LOW);
}
ledcWrite(motorPins[motorNumber].pwmSpeedChannel, abs(motorSpeed));
}
void setUpPinModes()
{
for (int i = 0; i < motorPins.size(); i++)
{
pinMode(motorPins[i].pinIN1, OUTPUT);
pinMode(motorPins[i].pinIN2, OUTPUT);
//Set up PWM for motor speed
ledcSetup(motorPins[i].pwmSpeedChannel, PWMFreq, PWMResolution);
ledcAttachPin(motorPins[i].pinEn, motorPins[i].pwmSpeedChannel);
rotateMotor(i, STOP);
}
}
void setup()
{
setUpPinModes();
Serial.begin(115200);
WiFi.mode(WIFI_STA);
// Init ESP-NOW
if (esp_now_init() != ESP_OK)
{
Serial.println(“Error initializing ESP-NOW”);
return;
}
esp_now_register_recv_cb(OnDataRecv);
}
void loop()
{
//Check Signal lost.
unsigned long now = millis();
if ( now - lastRecvTime > SIGNAL_TIMEOUT )
{
processCarMovement(STOP);
}
}
keep showing error of ‘ledcSetup’ and ‘ledcAttachPin’
please tell me how to solve it…