RC aiuto col programma

Salve,
sto cercando di costruire da solo una piccola rc telecomandata. Ho pensato all’inizio di fare in modo che si muovesse da sola e girasse incontrando ostacoli e solo dopo aver superato questo primo scoglio passare al bluetooth.
Come componenti utilizzo quelli dello starter kit, più un sensore HC-SR04.
Ho scritto un programma, utilizzando (o provandoci) il ciclo while, che credo sia il punto critico. La parte di sketch in questione è:

if(motorOnOff == 1){ //ho inserito prima un pulsante di on e off
while(spazio>=4){ //la distanza è in cm
digitalWrite(HDirez2, HIGH);
digitalWrite(HDirez7, LOW);
analogWrite(HOnOff, motorSpeed); //motorSpeed dato da un potenziometro
if(spazio<4){
break;
}
}

Ho trovato diversi problemi, ad esempio il fatto che si muova leggermente solo dopo essere stato spinto (ma credo dipenda dall’eccessivo peso per un motore che è a 6V), ma tipo non risponde ai rilevamenti del sensore. Mi piacerebbe sapere cosa ho sbagliato in quella parte di codice.
Grazie in anticipo.

Hai sbagliato che, nel while() NON leggi mai la distanza e ... la variabile "spazio" da sola non si aggiorna !

Guglielmo

gpb01:
Hai sbagliato che, nel while() NON leggi mai la distanza e … la variabile “spazio” da sola non si aggiorna !

Guglielmo

Zio che tonto! Hai ragione, perdona la mia scarsissima esperienza… Grazie!
E il peso eccessivo può comunque rappresentare un problema? Come posso capire quanto peso il motore può spostare, almeno abbastanza agevolmente?

David_Inginiar:
E il peso eccessivo può comunque rappresentare un problema? Come posso capire quanto peso il motore può spostare, almeno abbastanza agevolmente?

Si certo, ma per risponderti esattamente ci vuole qualcuno che ha esperienza con i motori ... ::slight_smile:

Guglielmo

David_Inginiar:
Come posso capire quanto peso il motore può spostare, almeno abbastanza agevolmente?

Ovviamente la massa totale del veicolo può essere un problema, prova a pensare a quello che può fare un camion con sopra il motore della 500. :slight_smile:
Per conoscere le prestazioni del mezzo occorre conoscere le caratteristiche tecniche del motore, senza queste è impossibile fare dei calcoli, puoi solo fare dei test empirici per estrapolare le prestazioni in funzione della massa.

astrobeed:
Ovviamente la massa totale del veicolo può essere un problema, prova a pensare a quello che può fare un camion con sopra il motore della 500. :slight_smile:
Per conoscere le prestazioni del mezzo occorre conoscere le caratteristiche tecniche del motore, senza queste è impossibile fare dei calcoli, puoi solo fare dei test empirici per estrapolare le prestazioni in funzione della massa.

Beh io ho il datasheet, da cui conosco, oltre alle varie dimensioni, la tensione cui opera e la corrente, insieme al numero di giri al minuto per quando è completamente scarico (7500) e quando ha 30g.cm (6100) (non so perché ci sianil punto, vale forse come “/”?) sul groppone. Inoltre, conosco lo “stall torque”, che dovrebbe essere il momento torcente, che è “150g.cm min”. Queste informazioni potrebbero bastare credo.

DCmotor.pdf (44.7 KB)

Quel motore non puoi usarlo direttamente con delle ruote, in mezzo ci vuole una riduzione, senza hai molti rpm e pochissima coppia.
La coppia si esprime come una forza moltiplicata per una distanza, p.e. kg*cm, quasi sicuramente il punto tra gr e cm è un errore tipografico visto che in matematica (sopratutto in algebra) il punto, a mezza altezza (come questo ⋅ ) si usa per indicare la moltiplicazione (gr⋅cm), però è un carattere speciale disponibile solo su alcuni font.

Ok, ho capito e in teoria dovrei aver risolto. Comunque, è possibile che quando le batterie iniziano a scaricarsi, il motore rallenti? Immagino di sì, ma vorrei una conferma.
C’è ancora qualcosa (forse molto) che nel programma non va come dovrebbe: l’RC non risponde bene, mi sembra che non risponda come dovrebbe al sensore a ultrasuoni. Potreste aiutarmi a capire dove ho sbagliato? Posto il programma e per sicurezza pure il circuito che ho fatto per il tutto.

#include <Servo.h>;
Servo servo;
const int HOnOffPin = 5;
const int HDirezPin2 = 4;
const int HDirezPin7 = 3; //pin del ponte H
int motorOnOff = 1;
int motorSpeed = 0;//variabili per il motore
const int potPin = A0; //potenziometro per la velocità
const int bottoneOnOff = 6;
boolean statoBottone = 0;
boolean precStatoBottone = 0;//bottone per accendere e spegnere il motore
const int trigger = 7;
const int echo = 8;
long tempoSegnale = 0;
long spazio = 0;

void setup() {
  pinMode(HOnOffPin, OUTPUT);
  pinMode(HDirezPin2, OUTPUT);
  pinMode(HDirezPin7, OUTPUT);
  digitalWrite(HOnOffPin, LOW);
  pinMode(bottoneOnOff, INPUT);
  pinMode(trigger, OUTPUT);
  digitalWrite(trigger, LOW);
  pinMode(echo, INPUT);
  servo.attach(9);
  servo.write(54);
  delay(90);
  Serial.begin(9600);
  }

void loop() {
  statoBottone = digitalRead(bottoneOnOff); //leggo lo stato del bottone per accendere o spegnere il motore
  delay(15);//piccola attesa per evitare rimbalzi
  motorSpeed = analogRead(potPin)/4;//leggo il potenziometro per la velocità del motore
  
  if(statoBottone != precStatoBottone){
    if(statoBottone == HIGH){
      motorOnOff = !motorOnOff;
      }
   } //collego lo stato del bottone all'accensione del motore
  
   if(motorOnOff == 1){
     //calcolo la distanza
     digitalWrite(trigger, HIGH);
     delayMicroseconds(10);
     digitalWrite(trigger, LOW);
     long tempoSegnale = pulseIn(echo, HIGH);
     long spazio = 0.034 * tempoSegnale / 2; //la distanza è già in centimetri
            
      if(spazio>=4){
        while(spazio>=4){      
        digitalWrite(trigger, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigger, LOW);
        long tempoSegnale = pulseIn(echo, HIGH);
        long spazio = 0.034 * tempoSegnale / 2;
        servo.write(54);
        delay(90);
        digitalWrite(HDirezPin2, HIGH);
        digitalWrite(HDirezPin7, LOW);
        analogWrite(HOnOffPin, motorSpeed);
        }
      }
      else{
        while(spazio<4){
        digitalWrite(trigger, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigger, LOW);
        long tempoSegnale = pulseIn(echo, HIGH);
        long spazio = 0.034 * tempoSegnale / 2;  
        servo.write(75);
        delay(90);
        digitalWrite(HDirezPin2, LOW);
        digitalWrite(HDirezPin7, HIGH);
        analogWrite(HOnOffPin, motorSpeed);
        }
      }
   }
   else{
     digitalWrite(HDirezPin2, LOW);
     digitalWrite(HDirezPin7, LOW);
     analogWrite(HOnOffPin, 0);
     }
 
 precStatoBottone = statoBottone;//memorizzo lo stato del bottone
 Serial.print("Il bottone è: ");
 Serial.println(statoBottone);
 Serial.print("velocità del motore: ");
 Serial.println(motorSpeed);
 Serial.print("La distanza è: ");
 Serial.println(spazio);
 delay(120); //delay da eliminare quando l'RC sarà autonoma dal pc grazie ad una alimentazione esterna
}