Regolare velocità Motore Dc 3v

Ciao, per un progetto ho realizzato un circuito dove un motore Dc 3v viene azionato mediante un sensore di distanza, e funziona. Solo che va troppo veloce. Ho già provato ad inserire un potenziometro collegato ad una porta analogica ma non va… probabilmente ho problemi col codice che vi allego:

const int trigPin = 9;
const int echoPin = 10;
const int MotorPin = 13;
const int LedPin = 8;
long duration;
int distance;
int safetyDistance;


void setup() {
pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 
pinMode(MotorPin, OUTPUT);
pinMode(LedPin, OUTPUT);
Serial.begin(9600); 
}


void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

distance= duration*0.034/2;

safetyDistance = distance;
if (safetyDistance <= 10){ 
  digitalWrite(MotorPin, HIGH);
  delay (analogRead(A0));
  digitalWrite(8, HIGH);
  delay(80);
 
}
else{
  digitalWrite(MotorPin, LOW); 

}
Serial.print("Distance: ");
Serial.println(distance);
}

Hai anche letto il valore del potenziometro ma di fatto non lo usi, attivi il pin del motore, attendi un po’ di tempo e null’altra sul motore finché la distanza letta non è superiore a 10.
Se vuoi rallentarlo devi usare un pin PWM (il 13 sulla Uno non lo è) e fare un’analogWrite proporzinale al valore letto dal potenziometro.
Altra cosa un motore DC senza carico continua a girare per inerzia anche per quei brevi momenti dove non è alimentato, quindi per provare un reale rallentamento devi dare un qualche carico meccanico al motore.

Grazie!:slight_smile:
Quindi collego il motore ad un PWM e...? :confused:

Visto che hai poca dimestichezza ti condiglio di fare la seguente cosa:
Fai un programma nuovo dove non consideri il sensore limitati solo a comandare il motore in modo continuativo regolandone la velocità con il potenziometro, come fai? Usi un pin PWM e tramite la funzione analogWrite sul pin gestisci il PWM.
Il PWM accetta valori da zero a 255 (zero = OFF, 255 = sempre ON, 127 = metà tempo OFF, metà tempo ON).
la funzione analogRead restituisce valori da zero a 1024, quindi devi adattare questi valori a quelli del PWM, come? Quarda la funzione map
Altro consiglio se vuoi capire se il programma sta facendo ciò che deve puoi sostituire in fase iniziale il motore con un led (e la sua resistenza in serie), girando il potenziometro devi vedere la sua luminosità passare da spento a tutto acceso

Grazie mille!!! Ho creato un nuovo sketch applicando un analogRead sul PWM. Riesco a regolare la velocità del motore anche se non va in maniera costante. Ultima cosa... come faccio ad inserire il nuovo codice a quello vecchio in modo da farlo funzionare? Come hai capito, ho cominciato da pochissimo ad utilizzare arduino o a programmare in generale! ::slight_smile:

int MotorPin_3;

void setup() {


}

void loop() {
 int MotorPin = analogRead (0);
 MotorPin = map(MotorPin, 0, 1023, 0, 255);
 analogWrite(3, MotorPin); 
}

la velocità non è costante nel senso che se non tocchi il potenziometro la velocità varia o intendi dire che non è lineare in funzione della posizione del potenziometro? Se è le seconda è abbstanza normale, all'inizio devi superare l'inerzia e poi via via che aumentano i giri l'inerzia stessa (con motore senza carico) fa si che ti sembri che stia continuando a girare con una velocità non costante.
Adesso veniamo all'unione, come hai visto non ti servono delay e quant'altro quindi se la distanza misurata è sotto una certa soglia il motore deve girare in base alla lettura del potenziometro, altrimenti deve fermarsi.
Prova a codificarlo non è difficile se ci pensi, di fatto hai già tutto il necessario :wink:

Ecco come ho inglombato il nuovo sketch nel vecchio!! e funziona tutto!
Grazie mille per la disponibilità e per l’esaustività!

const int trigPin = 9;
const int echoPin = 10;
const int MotorPin = 3;
const int LedPin = 8;
long duration;
int distance;
int safetyDistance;


void setup() {
pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 
pinMode(MotorPin, OUTPUT);
pinMode(LedPin, OUTPUT);
Serial.begin(9600); 
}


void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

distance= duration*0.034/2;

safetyDistance = distance;
if (safetyDistance <= 25){ 
  digitalWrite(MotorPin, HIGH);
  int MotorPin = analogRead (0);
  MotorPin = map(MotorPin, 0, 1023, 0, 255);
  analogWrite(3, MotorPin);
  digitalWrite(8, HIGH);
  delay(80);
  digitalWrite(LedPin, LOW);
  delay(30);
}
else{
  digitalWrite(MotorPin, LOW); 

}
Serial.print("Distance: ");
Serial.println(distance);
}

Permettimi un consiglio, visto che sei all'inizio, evita di usare e riusare solite variabili con medesimo noem in differenti modi, alla lunga non ci si capisce un tubo, Es. usi MotorPin sia come costante per identificare il pin a cui è collegato il motore che come variabile int (in uno scope differente) per indicare il valore del PWM (dopo aver letto da pin analogico) cambia usando nome differenti per chiarezza e in tutte le funzioni che riguardano i pin ti consiglio di non fare

analogWrite(3, MotorPin);

ma

analogWrite(MotorPin, valoreDaAssegnare);

perché se poi cambi il pin devi ricercare in tutto il codice dove viene usato, puoi scegleire se fare come hai fatto tu con una costante (ma non di tipo int ma byte che occupa un byte soltanto e i pin sono sicuramente meno di 255) o con una #define se cambi il pin modifichi quella e il programma continuerà ad andare senza problemi