Update projects/espnow/rc car/receiver/receiver.ino

This commit is contained in:
Ghassan Yusuf 2025-10-07 13:04:52 +03:00
parent 6582129043
commit a5b1684ec9

View File

@ -2,8 +2,9 @@
#include <esp_now.h> #include <esp_now.h>
#include <ESP32Servo.h> #include <ESP32Servo.h>
Servo leftServo1, leftServo2, rightServo1, rightServo2; Servo leftServoA, leftServoB, rightServoA, rightServoB;
int leftServoPin1 = 12, leftServoPin2 = 13, rightServoPin1 = 14, rightServoPin2 = 15; int leftPins[2] = {12, 13};
int rightPins[2] = {14, 15};
typedef struct { typedef struct {
int speed; int speed;
@ -11,45 +12,44 @@ typedef struct {
} CommandPacket; } CommandPacket;
typedef struct { typedef struct {
int leftServoSpeed; int leftSpeed;
int rightServoSpeed; int rightSpeed;
int batteryLevel; int battery;
} TelemetryPacket; } TelemetryPacket;
CommandPacket command; CommandPacket command;
uint8_t controllerAddr[] = {0x24, 0x6F, 0x28, 0x33, 0xDE, 0xB4}; // Remote MAC TelemetryPacket telemetry;
uint8_t remoteAddr[] = {0x24, 0x6F, 0x28, 0x33, 0xDE, 0xB4}; // MAC of remote
void onCommandRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { void onCommandRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&command, incomingData, sizeof(command)); memcpy(&command, incomingData, sizeof(command));
int leftSpeed = constrain(command.speed + command.turn, -255, 255);
int rightSpeed = constrain(command.speed - command.turn, -255, 255);
// Map speed value to servo position (0-180 for continuous rotation speed control) int left = constrain(command.speed + command.turn, -255, 255);
int leftPWM = map(leftSpeed, -255, 255, 0, 180); int right = constrain(command.speed - command.turn, -255, 255);
int rightPWM = map(rightSpeed, -255, 255, 0, 180);
leftServo1.write(leftPWM); int pwmLeft = map(left, -255, 255, 0, 180);
leftServo2.write(leftPWM); int pwmRight = map(right, -255, 255, 0, 180);
rightServo1.write(rightPWM);
rightServo2.write(rightPWM);
// Store for telemetry leftServoA.write(pwmLeft);
telemetry.leftServoSpeed = leftSpeed; leftServoB.write(pwmLeft);
telemetry.rightServoSpeed = rightSpeed; rightServoA.write(pwmRight);
rightServoB.write(pwmRight);
telemetry.leftSpeed = left;
telemetry.rightSpeed = right;
} }
TelemetryPacket telemetry;
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
leftServo1.attach(leftServoPin1); leftServoA.attach(leftPins[0]);
leftServo2.attach(leftServoPin2); leftServoB.attach(leftPins[1]);
rightServo1.attach(rightServoPin1); rightServoA.attach(rightPins[0]);
rightServo2.attach(rightServoPin2); rightServoB.attach(rightPins[1]);
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
esp_now_init(); esp_now_init();
esp_now_peer_info_t peerInfo; esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, controllerAddr, 6); memcpy(peerInfo.peer_addr, remoteAddr, 6);
peerInfo.channel = 0; peerInfo.channel = 0;
peerInfo.encrypt = false; peerInfo.encrypt = false;
esp_now_add_peer(&peerInfo); esp_now_add_peer(&peerInfo);
@ -58,10 +58,9 @@ void setup() {
unsigned long lastTelemetrySent = 0; unsigned long lastTelemetrySent = 0;
void loop() { void loop() {
// Telemetry every 500 ms
if (millis() - lastTelemetrySent > 500) { if (millis() - lastTelemetrySent > 500) {
telemetry.batteryLevel = analogRead(36); // Replace with battery calculation if needed telemetry.battery = analogRead(36); // Replace with proper battery voltage calculation
esp_now_send(controllerAddr, (uint8_t*)&telemetry, sizeof(telemetry)); esp_now_send(remoteAddr, (uint8_t*)&telemetry, sizeof(telemetry));
lastTelemetrySent = millis(); lastTelemetrySent = millis();
} }
} }