Differenziale automobilistico elettronico

Ciao, sono nuovo del forum e vorrei premettere che sono un ragazzo all'ultimo anno di meccatronica (non ingegneria) e che quindi di programmazione a scuola abbiamo fatto davvero poco, ma io posso dire di essere un pelino più avanti (altrimenti non sarei qui) siccome mi interessa questo topic.
Il mio intento é quello di costruire un'auto monoposto utilizzando due motori brushless sensored di un hoverboard, comandati ciascuno da un controller apposta per i motori BLDC.
Tra le tante sfide, la più complicata fin'ora è la programmazione del differenziale (automobilistico, elettronico) realizzabile, secondo me, tramite il posizionamento di due potenziometri paralleli all'albero dello sterzo, il quale farebbe girare: il potenziometro sinistro se sterzo a sinistra; il potenziometro destro se sterzo a destra. Quindi il segnale letto durante una sterzata generica andrebbe combinato con il valore dell'acceleratore in una posizione generica, per poi, tramite il programma, inviare il giusto segnale al controller, che invierà a sua volta la giusta corrente al motore.
Per capire ancora meglio, il collegamento dovrebbe essere diretto tra l'acceleratore (potenziometro a pedale) e il controller, il quale manderebbe corrente al motore soltanto in base al valore del acceleratore.

Ovviamente ho già pensato un po' a tutto ma mi sono bloccato quando sono arrivato a pensare che forse mi servirebbe una funzione, che creerei io, a due variabili del tipo z=f(x, y), siccome il valore che deve arrivare al controller, deve dipendere dal valore dell'acceleratore e da quello del potenziometro verso il quale sto sterzando, e quindi dovrei usare l'interpolazione per trovarla, una cosa impossibile per ora.
Le condizioni principali sono che:
-se l'acceleratore=0, a prescindere dal potenziometro, il segnale è ovviamente uguale a 0;
-se il potenziometro=1023 -> il segnale è uguale a 0;
-il segnale in uscita è direttamente proporzionale al valore dell'acceleratore, e inversamente proporzionale a quello del potenziometro.

Il codice si riferisce solo a un potenziometro, quello sinistro, per ora.

Posso dire, grazie all'esperienza, che a causa della mia ignoranza mi sto complicando la vita ahah, quindi chiedo a voi:
-Un aiuto nel trovare una soluzione a questo problema, magari introducendomi a una funzione di arduino o a un metodo che semplifichi le cose, o se sapete dirmi una funzione matematica che soddisfi ciò che chiedo, insomma sapete voi;
-Secondariamente, non è essenziale, qualche consiglio generale sul programma, se ce n'è bisogno;
-se è meglio usare la funzione "delay" o "millis".

Caricando il programma che ho provato a fare, tenendo conto, per ora, solo di un potenziometro, spero di non confondervi ancora di più le idee XD.

int pot1 = A1; //potenziometro sinistro
int ped = A0; //pedale
int esc = A2;                        //sarebbe il pin dell'esc, cioè il controller
int valF;                            //valore finale da inviare al controller
int POTs;                            //valore del potenziometro sinistro
int POTd;                            //valore del potenziometro destro
int acceleratore;

void setup() {
  Serial.begin(9600);
  pinMode(pot1, INPUT);
  pinMode(ped, INPUT);
  pinMode(esc, OUTPUT);


}

void loop() {
  POTs = analogRead(pot1);          //legge il potenziometro sinistro
  acceleratore = analogRead(ped);

  if (ped == 0)                     //se non accelero...
  {
    valF == 0;                      //non manda segnale in uscita...
    analogWrite(esc, valF);         //mando il segnale "val" in uscita all'esc
  };
  if (POTs == 1023) {                //se giro il potenziometro sinistro al massimo, quindi sterzo al massimo, ...
    valF == 0;
    analogWrite(esc, valF);          //mando il segnale "val" in uscita all'esc
  }
  if (ped != 0) {                   //se accelero, e sterzo, ma non al massimo...
    if (POTs != 1023) {
                                    //parte che non so fare

      analogWrite(esc, valF);      //mando il segnale "val" in uscita all'esc
    }
  }
}

Spero di essere stato il più chiaro possibile e ringrazio anticipatamente per l'aiuto :slight_smile:

Benvenuto,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

nid69ita

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)

Oh dio, mi scuso per l'inconveniente, non uso molto i forum.
Ora che ho postato la presentazione che faccio? Creo un altro post nell'attesa che questo venga eiminato?
Aspetto risposte,
Riccardo:)

No, no, tutto okay. Risponderemo in questo thread.

ti rispondo io

il lavoro che vuoi fare lo hanno già fatto tanti anni fa
è piuttosto semplice, lo hanno fatto i tedeschi durante la guerra sui loro carri più pesanti, non richiede elettronica

certo che usando arduino diventa più semplice

però tu ti devi "sgrassare", non puoi pensare di fare programmazione tenendoti il fardello di un pensiero "pesante"

ti faccio degli esempi

int pot1 = A1; //potenziometro sinistro 
int ped = A0; //pedale
int esc = A2;                        //sarebbe il pin dell'esc, cioè il controller
// perché usare int per una variabile, in realtà una costante, che occupa un byte
// perché usare una variabile per scriverci dentro una macro?, ti rendi conto che è una "pippa cognitiva"?

inoltre: devi proprio usare un pin analogico per una uscita?

   pinMode(pot1, INPUT);
   pinMode(ped, INPUT);

gli analogici non hanno bisogno di pinmode

int valF;                            //valore finale da inviare al controller
int POTs;                            //valore del potenziometro sinistro
int POTd;                            //valore del potenziometro destro
int acceleratore;

ci sono varie scuole per i nomi di variabile:
tutto minuscolo
miuscolo con le iniziali successive maiuscole dentro la parola
e altri

MA

non c'é nessuna scuola di pensiaro che dica di scrivere maiuscole le variabili
maiuscole si mettono le macro, al massimo le variabili const; per chi le usa

   if (ped == 0)                     //se non accelero...
   // sicuro che non acceleri il valore sia 0?
   // magari il potenziometo non è pienamente allineato...
   // meglio un <dipoco
   {
      valF == 0;                      //non manda segnale in uscita...
    // == per un assegnazione?, forse è meglio riprendere in mano un po' il libro...
      analogWrite(esc, valF);         //mando il segnale "val" in uscita all'esc
   };
// e questo punto e virgola?

ah, adesso ho capito
tu credi che gli analogici siano "anche" uscite analogiche
non lo sono, mi spiace,
e, aggiungo: la documentazione va letta, prima

devi usare pin PWM, non analogici, per le uscite, che non saranno analogiche analogiche, saranno in PWM: la sai la differenza?

   if (POTs == 1023)                  //se giro il potenziometro sinistro al massimo, quindi sterzo al massimo, ...
   {
      valF == 0;
      analogWrite(esc, valF);          //mando il segnale "val" in uscita all'esc
   }

anche qui, se il potenziometro non arrivasse proprio in fondo in fondo?
di nuovo un assegnazione con == ? allora non era un errore di sbaglio....
e valF a zero anche se acceleri in pieno?

   if (ped != 0)                     //se accelero, e sterzo, ma non al massimo...
// ma devi risordarti che il potenziometro magari non è allineato...
   {
      if (POTs != 1023)
      {
         //parte che non so fare
         analogWrite(esc, valF);      //mando il segnale "val" in uscita all'esc
      }
   }

a parte tutt le considerazioni sui test == e <>

ma è qui che devi metterci "lo scopo" del tuo lavoro

tu stai facendo un differenziale o un "moltipli"catore?

lo sai come deve muoversi il cinematismo che vuoi simulare oppure no?

comunque un complimento te lo faccio:
bene indentato, bravo, è raro

PS se non fosse stato "almeno" indentato non ti avrei mai risposto....

A me viene un idea lavorare con le percentuali.
Premessa, sappiamo che moltiplicare un numero per 1 significa avere il 100%, moltiplicare un numero per un decimale significa avere una percentuale minore, esempio moltiplico per 0,5 ottengo il 50%.
Adesso la funzione map() lavora con numeri interi long, ma esiste un implementazione trovabile in rete o sul forum che lavora con float, numeri con la virgola.

1)Ho due potenziometri, di cui andare dritto vuol dire essere a meta potenziometro. uno legge la rotazione a sinistra, l'altro legge la rotazione a destra.
2)Con due funzioni map che lavorano con float, da valori di ingresso ottengo un numero decimale che va da 0 a 1
3)moltiplico il valore del potenziometro dell'acceleratore per i numeri restituiti dalle funzioni map(), e ottengo la percentuale letta dall'acceleratore da inviare ai due motori.

Esempio volante al centro i potenziometri mi danno 0,5 e 0,5
Rotazione verso sinistra dai potenziometri potrei ottenere 0,3 e 0,7. percentuale del potenziometro acceleratore.

hai visto il film "non ci resta che piangere" dove spiegano a Leonardo il treno :slight_smile: Be il mio suggerimento è cosi, ti do l'idea e tu Leonardo la realizzi. :slight_smile:

Occhio

Che maggiore è la 'differenza' tra le velocità della ruota esterna e quella interna maggiore è la differenza percentuale tra raggio esterno e raggio interno della curva

E quindi minore è il raggio di sterzata

Probabilmente se si entra in curva al 50% della velocità e il 20 percento di moltiplicatore il veicolo si ribalta in meno tempo che pronunciare la parola "ops"

Apposta io tentavo di evidenziare la differenza tra moltiplicatore e differenziale

Ma lo OP vuole fare un differenziale o uno sterzo?

Dal post iniziale mi da l'impressione che voglia mescolare entrambe le cose, cioe' alla fine sterzare variando la velocita' dei due motori anziche' l'allineamento delle ruote ... ma e' un carro armato ? :wink:

riccardoantonio:
Il mio intento é quello di costruire un'auto monoposto utilizzando due motori brushless
Spero di essere stato il più chiaro possibile e ringrazio anticipatamente per l'aiuto :slight_smile:

ma vacca-logia se hai già le ruote "disaccoppiate" perché vuoi metterci un differenziale :o
le ruote dietro delle auto (a trazione anteriore) non hanno differenziale di nessun tipo
se proprio metti 2 motori mostruosi stacca la corrente il minimo indispensabile sulla ruota più interna
che so un decimo di secondo, in base all'angolo dello sterzo/velocità, sempre ad auto costruita si prova, ma secondo me un auto vera con persona a bordo ha il suo peso e non dovrebbe servire nulla