Buongiorno chatgpt mi aiuti a realizzare uno scketch utilizzando una scheda ESP32 Heltec V2, un driver Cytron MDDS10 e due potenziometri per controllare due motori a CC , un potenziometro controlla marcia avanti ed indietro, l’altro per sterzare a destra o a sinistra.
Ecco uno sketch per la tua ESP32 Heltec V2 che controlla due motori DC utilizzando il driver Cytron MDDS10 e due potenziometri.
Potenziometro 1 (marcia avanti/indietro): Controlla la velocità e la direzione dei motori.
Potenziometro 2 (sterzo): Regola la velocità relativa tra i due motori per sterzare.
Lo sketch legge i valori dei potenziometri e li converte in segnali PWM per il driver Cytron MDDS10.
ESP32 Heltec V2 → Cytron MDDS10
GPIO 18 → PWM1
GPIO 19 → PWM2
GPIO 21 → DIR1
GPIO 22 → DIR2
Potenziometri:
Potenziometro 1 (avanti/indietro) → GPIO 34
Potenziometro 2 (sterzo) → GPIO 35
Carica il seguente sketch sulla tua ESP32 Heltec V2:
#define POT_SPEED 34 // Potenziometro per marcia avanti/indietro
#define POT_STEER 35 // Potenziometro per sterzo
#define PWM1 18 // Segnale PWM per motore sinistro
#define PWM2 19 // Segnale PWM per motore destro
#define DIR1 21 // Direzione motore sinistro
#define DIR2 22 // Direzione motore destro
void setup() {
pinMode(POT_SPEED, INPUT);
pinMode(POT_STEER, INPUT);
pinMode(PWM1, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(DIR1, OUTPUT);
pinMode(DIR2, OUTPUT);
ledcSetup(0, 5000, 8); // Configurazione PWM
ledcSetup(1, 5000, 8);
ledcAttachPin(PWM1, 0);
ledcAttachPin(PWM2, 1);
}
void loop() {
int speedValue = analogRead(POT_SPEED); // Lettura potenziometro velocità
int steerValue = analogRead(POT_STEER); // Lettura potenziometro sterzo
// Convertire i valori in un intervallo da -255 a 255
int speed = map(speedValue, 0, 4095, -255, 255);
int steer = map(steerValue, 0, 4095, -255, 255);
int leftMotorSpeed = speed + steer; // Controllo per motore sinistro
int rightMotorSpeed = speed - steer; // Controllo per motore destro
// Limitare i valori tra -255 e 255
leftMotorSpeed = constrain(leftMotorSpeed, -255, 255);
rightMotorSpeed = constrain(rightMotorSpeed, -255, 255);
// Controllo direzione motore sinistro
if (leftMotorSpeed >= 0) {
digitalWrite(DIR1, HIGH);
} else {
digitalWrite(DIR1, LOW);
leftMotorSpeed = -leftMotorSpeed;
}
// Controllo direzione motore destro
if (rightMotorSpeed >= 0) {
digitalWrite(DIR2, HIGH);
} else {
digitalWrite(DIR2, LOW);
rightMotorSpeed = -rightMotorSpeed;
}
// Impostare il PWM per i motori
ledcWrite(0, leftMotorSpeed);
ledcWrite(1, rightMotorSpeed);
delay(10); // Piccola pausa per stabilità
}
Il valore del primo potenziometro determina la velocità e la direzione generale del veicolo.
Il secondo potenziometro aggiusta la velocità relativa tra i due motori per curvare.
Il driver Cytron MDDS10 riceve segnali PWM per regolare la velocità e segnali DIR per impostare la direzione.
Implementare un filtro sui valori dei potenziometri per evitare oscillazioni.
Usare un freno elettronico impostando PWM = 0 se la velocità è sotto una soglia.
Aggiungere una modalità di calibrazione per tarare i potenziometri.
Fammi sapere se hai bisogno di modifiche o chiarimenti! 🚀
Grazie ed effettuerò un test
Di nulla! Buon test e fammi sapere se serve aiuto
Buongiorno chatgpt mi aiuti a realizzare uno scketch utilizzando una scheda ESP32 Heltec V2, un driver Cytron MDDS10 utilizzando i due Ingressi RC1 e RC2 per due potenziometri, un potenziometro attiva la marcia avanti ed indietro, l’altro per sterzare a destra o a sinistra, per controllare due motori a CC.
Ecco uno sketch per la tua scheda ESP32 Heltec V2 che controlla il driver Cytron MDDS10 utilizzando due potenziometri:
Potenziometro 1 (Throttle): Controlla la velocità e la direzione del movimento (avanti/indietro).
Potenziometro 2 (Steering): Controlla la sterzata (destra/sinistra).
Il driver MDDS10 è configurato in modalità RC Mode, quindi accetta segnali PWM standard da 1ms a 2ms.
ESP32 → MDDS10
GPIO 18 (RC1) → RC1 (controllo velocità)
GPIO 19 (RC2) → RC2 (controllo sterzo)
ESP32 → Potenziometri
GPIO 34 → Potenziometro 1 (Throttle)
GPIO 35 → Potenziometro 2 (Steering)
Ecco lo sketch in Arduino IDE:
Lettura dei potenziometri con analogRead(), che restituisce un valore tra 0-4095 (ESP32 ha un ADC a 12 bit).
Mappatura del valore letto in un segnale PWM tra 1000µs - 2000µs.
Invio del segnale RC PWM ai pin RC1 e RC2 usando ledcWrite().
Se il driver non risponde correttamente, prova a regolare i valori min/max del PWM o invertire la logica di mappatura.
Fammi sapere se ti serve qualche modifica! 🚀
#include <Arduino.h>
// Definizione dei pin
#define RC1_PIN 18 // Controllo velocità
#define RC2_PIN 19 // Controllo sterzo
#define POT_THROTTLE 34 // Potenziometro per la velocità
#define POT_STEERING 35 // Potenziometro per la sterzata
// Valori per PWM RC (1ms - 2ms, centrato a 1.5ms)
#define PWM_MIN 1000 // 1ms
#define PWM_MAX 2000 // 2ms
#define PWM_CENTER 1500 // 1.5ms (stop o neutro)
void setup() {
pinMode(RC1_PIN, OUTPUT);
pinMode(RC2_PIN, OUTPUT);
pinMode(POT_THROTTLE, INPUT);
pinMode(POT_STEERING, INPUT);
}
void loop() {
// Legge i valori dai potenziometri
int throttle = analogRead(POT_THROTTLE); // 0-4095
int steering = analogRead(POT_STEERING); // 0-4095
// Mappa i valori in un range di 1000-2000us
int pwmThrottle = map(throttle, 0, 4095, PWM_MIN, PWM_MAX);
int pwmSteering = map(steering, 0, 4095, PWM_MIN, PWM_MAX);
// Scrive il segnale PWM per RC1 (velocità)
ledcWrite(0, pwmThrottle);
// Scrive il segnale PWM per RC2 (sterzo)
ledcWrite(1, pwmSteering);
delay(20); // Ritardo per stabilità
}
ULTERIORI RICHIESTE DA PARTE MIA .......
ESP32 CHATGPT CONTROLLO DUE MOTORI ingressi RC1 e RC2 quater
Buongiorno chatgpt mi aiuti a realizzare uno scketch utilizzando una scheda ESP32 Heltec V2, un driver Cytron MDDS10 utilizzando i due Ingressi RC1 e RC2 per due potenziometri, un potenziometro attiva la marcia avanti ed indietro, l’altro per sterzare a destra o a sinistra, per controllare due motori a CC.
Simulazione tramite i canali 1 e 2 della trasmittente FLYSKY, rispettando le seguenti condizioni:.
Il potenziometro del Canale 1
Nella posizione centrale la larghezza dell'impulso è pari a 1.5 ms
Quando è tutto a Sx la larghezza dell'impulso è pari a 1 ms
Quando è tutto a Dx la larghezza dell'impulso è pari a 2 ms
Il potenziometro del Canale 2 :
Nella posizione superiore la larghezza dell'impulso è pari a 2 ms
Nella posizione centrale la larghezza dell'impulso è pari a 1.5 ms
Nella posizione inferiore la larghezza dell'impulso è pari a 1 ms
********* Programma proposto non in linea secondo la mia comprensione ******
Ma non tieni conto dei millisecondi che ti ho prospettato
ChatGPT ha detto:
Hai ragione a chiedermelo! Il codice deve gestire correttamente i valori di larghezza d'impulso che hai specificato:
· Canale 1 (Sterzo):
1.5 ms (1500 µs) → Centro
1.0 ms (1000 µs) → Sinistra
2.0 ms (2000 µs) → Destra
· Canale 2 (Velocità):
2.0 ms (2000 µs) → Avanti
1.5 ms (1500 µs) → Centro
1.0 ms (1000 µs) → Indietro
Nel codice attuale, la funzione mapPWM() converte linearmente questi impulsi in un intervallo da -255 a 255, il che è corretto per il tuo caso.
Tuttavia, il metodo Servo.readMicroseconds() della libreria ESP32Servo potrebbe non essere il più affidabile per leggere i segnali PWM.
Per una lettura più accurata del segnale, possiamo utilizzare pulseIn(), che misura direttamente la durata dell'impulso in microsecondi.
Ti aggiorno il codice in modo che tenga conto in modo preciso dei tempi di impulso.
Modifica apportata
Uso di pulseIn(): Ora il codice legge direttamente la durata dell'impulso in microsecondi, migliorando la precisione.
Filtro per valori errati: Se il segnale è fuori dal range 1000-2000 µs, viene impostato su 1500 µs (posizione neutra).
Conversione accurata della mappatura: La funzione mapPWM() assicura che i valori rispettino il range richiesto (-255 a 255).
Ora il codice rispetta esattamente i valori che mi hai dato
#include <ESP32Servo.h>
#define RC1_PIN 18 // Pin ESP32 collegato a RC1 del driver Cytron MDDS10
#define RC2_PIN 19 // Pin ESP32 collegato a RC2 del driver Cytron MDDS10
#define CH1_PIN 4 // Pin ESP32 per il segnale PWM del Canale 1 (sterzo)
#define CH2_PIN 5 // Pin ESP32 per il segnale PWM del Canale 2 (velocità)
void setup() {
Serial.begin(115200);
pinMode(CH1_PIN, INPUT);
pinMode(CH2_PIN, INPUT);
pinMode(RC1_PIN, OUTPUT);
pinMode(RC2_PIN, OUTPUT);
}
int mapPWM(int pulseWidth) {
return map(pulseWidth, 1000, 2000, -255, 255);
}
void loop() {
int pwmCh1 = pulseIn(CH1_PIN, HIGH, 25000); // Legge il PWM del Canale 1
int pwmCh2 = pulseIn(CH2_PIN, HIGH, 25000); // Legge il PWM del Canale 2
if (pwmCh1 < 1000 || pwmCh1 > 2000) pwmCh1 = 1500; // Evita valori errati
if (pwmCh2 < 1000 || pwmCh2 > 2000) pwmCh2 = 1500;
int speed = mapPWM(pwmCh2); // Converte il PWM in velocità (-255 a 255)
int turn = mapPWM(pwmCh1); // Converte il PWM in sterzata (-255 a 255)
int motor1 = speed + turn; // Calcola il valore per il primo motore
int motor2 = speed - turn; // Calcola il valore per il secondo motore
motor1 = constrain(motor1, -255, 255);
motor2 = constrain(motor2, -255, 255);
analogWrite(RC1_PIN, map(motor1, -255, 255, 0, 255));
analogWrite(RC2_PIN, map(motor2, -255, 255, 0, 255));
Serial.print("CH1: "); Serial.print(pwmCh1);
Serial.print(" CH2: "); Serial.print(pwmCh2);
Serial.print(" Motor1: "); Serial.print(motor1);
Serial.print(" Motor2: "); Serial.println(motor2);
delay(20);
}