variabile in funziine dell accellerazione

Salve
Ho cercato un po in rete ma non ho trovato bessun spunto su cui lavorare.
Mentre aspetto dei documenti da tanti giorni ho cominciato a buttate giu due disegni per un progetto di sinulatore auto. Mi trovo ad un punto fermo ho gia fatto delle prove con potenziometri e un motorino di un tergicristalli quello che pero mi serve e questo oltre alla velocita della rotazione del motorino mi serve anche l aumento o meno dell angolo di rotazione . Cioe se giro il bolante lentamemte il motorino feve stare fermo se lo giro di scatto deve compiere 30/45 grafi e di scatto.
Non ho il pc ne un srduino o una protoboard per fare delle prove . Ho solo carta e penna. Avete qualche consiglio?
Io avevo pensato ad una lettura del valore del potenziometro ad intervalli regolari es 0.001 secondi fare un deltaR ed in base a questo impostare la variavile che regola la velocita e l angolo .....
Grazie

Così ad intuito pare si voglia simulare l'effetto dinamico del trasferimento di carico che avviene sterzando rapidamente. Nella guida reale il trasferimento di carico viene usato e abusato per impostare la curva e ridurre l'angolo di sterzata necessario per affrontarlo. Per farla breve un colpetto di sterzo quando c'è abbastanza carico dinamico sull'anteriore, alleggerisce il posteriore che pattina e la traiettoria si chiude.

Se ci ho preso bene se no, mi interessa saperne di più.

L'idea di base è quella che hai esposto e mi sembra praticabile con arduino. Servono ovviamente due campioni per ricavare il deltaR per unità di tempo di 1 ms. Il problema è; come rilevi l'angolo di rotazione del motore per poi fermarlo una volta raggiunta la posizione desiderata?

Ciao.

E per un simulatore di guida( che ho gia costruito ma e statico) con una parte di un video gioco da salgiochi della segs ho sostituito i pitenziometri con potenziometri di valire identico a quelli del pad delka xbox360 sia per il volante che per freno ed accelleratore. Adeddo volevo fare la parte dinamica . Primaho avuto l idea di usare attuatori o motorini tetgi cristalli. Ci sono tanti progetto per pcgame dice ti sxarichi il codice per il gioco che stai usando con la losdibilita di contagiri ecc. Ma l xbox non e in grafo di fare cio.quindi pensavo di usare o 4 tetgi cristalli o due motori di avviamento con relativa corona. Per lasse X ed Y collegsndo altri potenziometri al volante .freno ed accelleratire e due potenziometri ino per motore come ho hia fatto in una prova. Pero la velocita e l angolo di rotazione sarebbero identici .

Quindi diciamo per esempi: che per una variazione di 100 hom in 19ms l angolo di rotazione deve essere 20 gradi e in motore deve avere 3 n. Ho visto dei circuiti che pernettono ad arduio di controllare in pwm motori di potenza. La meccanica non e un problema . Il mio problema e discriminare angolo e forza. Appena tornoo a casa mi riguardo il manuale di atduino percje con la memoria che mi ritrovo non mi ricordo neanche come usare un If . Pero se avete sugferimenti( tanto per passare un po di tempo che qui non passa mai) provo a butrare giu qualcosa graxie ancora

// by Salvatore Fancello
// 
 
#include <Servo.h>
 
Servo myservo;
 
int potpin = 0;
int val;
int val1;
int vald;
///mills
unsigned long previousMillis = 0;        // resetto la variabile mills

// constants won't change:
const long intervallo = 100;           // interval at which to blink (milliseconds)
void setup()
{
  myservo.attach(9);
}
 
void loop()
{
  unsigned long currentMillis = millis();

  val = analogRead(potpin);//legge il valore del potenziometro
  val = map(val, 0, 1023, 0, 179);
  if (currentMillis - previousMillis >= intervallo) {//passato l intervallo impostato rilegge il valore del potenziometro
    // save the last time you blinked the LED
    previousMillis = currentMillis;
    val1 = analogRead(potpin);
  val1 = map(val, 0, 1023, 0, 179);
  vald=val-val1;//fa la differenza per trovare la variazione /tempo del potenziometro
    
  myservo.write(vald);//la invia al servo
  }

non posso provarlo pero lo compila ho preso un esempio di controllo servo con potenziometro ed ho aggiunto l esempio che e nell ide del blink senza dalay ,
se ho scritto bene legge il valore del potenziometro fa passare un po di tempo poi lo rilegge e fa la differenza e la manda al servo , secondo voi funzionerebbe? se si questo imposterebbe l angolo di rotazione in funzione della velocita di rotazione del potenziometro. con questo dato potrei anche variare la forza con cui il servo( nel mio caso motorini tergi cristalli) si sposta? grazie mille

Ora non ho la piu pallida idea di come poter fare a vatiare la velocita con cui avviene lo spostamento. Dovro usare un circuito per pilotsre i motori ( che cosa mi consigliate?. Riesce arduino a variare la velocita con questo circuito? Grazie mille

Sconsiglio l'uso di motori di potenza, per sperimentare basta un motore da 1A massimo.
Quasi certamente il motore nell'applicazione finale dovrà essere accoppiato ad un riduttore di giri, per cui anche il motorino con cui sperimentare sarà dotato di riduttore.

Il controllo del motore tramite in modo locked antiphase sembra fare al caso tuo principalmente per rapidità di risposta, sia in accellerazzione che in frenata.

Ho trovato un link a locked antiphase ma le immagini non si vedono almeno nel mio browser.

Un motore controllato in questo modo accoppiato ad un encoder ti dovrebbe almeno in teoria permettere il massimo della reattività. Questo modo di controllare il motore DC è impiegato nelle stampanti a getto di inchiostro.

Ciao.

Non riesco ad aprire bene la pagina ho cercato e ho visto un progetto ( pero pe pc gane) di motori tergi cristalli dove era sato aggiunto un potenziometro.y

Una cosa simile pero aggiungengo un motore di avviamenyo( quindi grande copoia) per far spostare a destra e a sinistra tutta la stazione...
Poi per lo spistamento del solosedile usero dei tergi da camion .
L idea dell encoder e perfetta a saperlo usare.
Grazie per la risposta
P.s. ma il codice cosi scritto puo andare?

https://moodle.calvino.ge.it/pluginfile.php/8346/mod_resource/content/1/35.%20PWM.pdf

ho trovato questo tutorial , appena possibile faro delle prove , credete che oltre alla rotazione ed velocita possa
conntrollare anche l angolo di rotazione con questo circuito?
esiste una scheda gia pronta per arduino?
grazie mille

Servo myservo;
 int lettura;
int potpin = 0;
int val;
int vall;
int valb;
 
void setup()
{
 Serial.begin(9600);
  myservo.attach(9);
}
 
void loop()
{Serial.println(valb);
  lettura = analogRead(potpin);
  val = map(lettura, 0, 1023, 0, 179);
  delay(300);
 lettura = analogRead(potpin);
  vall = map(lettura, 0, 1023, 0, 179);
  valb = 90 - (val - vall) ;
  
  myservo.write(valb);
 
}

salve ho provato questo codice con il simulatore di arduino e funziona con un piccolo movimento il servo sta fermo con un movimento brusco il servo va a fine corsa e se il potenziometro sta fermo il servo torna a 90 gradi , unico inconveniente e l inerzia , è dovuto al delay (che ovviamente piu piccolo è a parita di velocita di spostamento si produrra uno spostamento del servo minore ) o al simulatore o al servo?
grazie mille

salve

la parte del l angolo di rotazione credo di acerl a risolta , ora devo affrontare la parte della velocita di rotazione.
devo trasformare lo 0-179 in 0 - 255 verso destra ie 0 -255 verso sinistra considerando che con la variabile a 90 devo avere il motore al minimo e quando la posizione e a 0 gradi il motore si spegne ( cmq questo e un altro problema che affrontero poi)

valb va da +179 a -179 , mi conviene usare if discriminando la valb == 0 , valb>0 e valb <0  per la rotazione 
e per la velocita usare un altra variabile x= valb*(255/179) ?
p.s. sono arrivato a questo codice che valuta solo la parte positiva 
ma non riesco ad impostare la parte negativa della rotazione , qualche consiglio?
grazie

[code

]
#include <Servo.h>
Servo myservo;
 int lettura;
int potpin = 0;
int val;
int vall;
int valb;
 int valc;
int velocita=0;
int da=4;
int db=3;
int attivo=5;
int x = 10;
void setup()
{
 Serial.begin(9600);
  myservo.attach(9);
#define ENABLE 5 // enable motore e velocita

#define DIRA 3 // senso rotazione

#define DIRB 4 // senso rotazione

}
 
void loop()
{Serial.println(x);
  Serial.println("x=");
 Serial.println(valb);
 x=0;
  lettura = analogRead(potpin);
   val = map(lettura, 0, 1023, 0, 255);
  delay(600);
 lettura = analogRead(potpin);
  vall = map(lettura, 0, 1023, 0, 255);
  valb = 90 + (val - vall) ;
 
 

  myservo.write(valb);
digitalWrite(DIRA, LOW); 
digitalWrite(DIRB, HIGH);
 if(valb == 90 ){analogWrite(attivo,0);}
 if(valb>= 91){

 x= valb*(255/179);
   analogWrite(attivo,x);           }
}

o cè un modo migliore?
grazie

#include <Servo.h>
Servo myservo;
 int lettura;
int potpin = 0;
int val;
int vall;
int valb;
 int valc;
int velocita=0;
int da=4;
int db=3;
int attivo=5;
int x = 10;
void setup()
{
 Serial.begin(9600);
  myservo.attach(9);
#define ENABLE 5 // enable motore e velocita

#define DIRA 3 // senso rotazione

#define DIRB 4 // senso rotazione

}
 
void loop()
{//Serial.println(lettura);//scrivo il valore di x
  //Serial.println("x=");
 Serial.println(valb);// scrivo il valore di valb
 x=0;
  lettura = analogRead(potpin);//leggo il vlore del potenziometro
   val = map(lettura, 0, 1023, 0, 180);//lo matppo 
  delay(800);
 lettura = analogRead(potpin);
  vall = map(lettura, 0, 1023, 0, 180);
  valb = 90 + (val - vall) ;
  myservo.write(valb);

 if(valb >=70 && valb <= 110){analogWrite(attivo,0);}//fermo il motore
 if(valb>= 111){//se la variazione del potenziometro e superiore a 111 
   //attivo il motore perso destra

digitalWrite(DIRA, LOW); 
digitalWrite(DIRB, HIGH);
 x= valb*(255/179); //calocolo la variabile per la velocita
   analogWrite(attivo,x);           }
  
  if(valb<=70){//se inferiore a 70 attivo il motore verso sinistra
    digitalWrite(DIRA, HIGH); 
    digitalWrite(DIRB, LOW);
     x= valb*(255/179);//calcolo la variabile per la velocita
    analogWrite(attivo,x); }
}

sono arrivato a questo codice suggerimenti?7grazie

https://www.tinkercad.com/things/67iZoEx7koZ

ho provato ad eularlo e mi da questo risultato , il servo gira all angolo giusto e il motore ruota da entrambi i lati.
pero credo che la parte del codice che regola la velocita del motore non vada bene
avete qualche consiglio? grazie mille

include <Servo.h>
Servo myservo;
 int lettura;
int potpin = 0;
int val;//prima variabile di lettura
int vall;//seconda variabile di lettura
int valb;//risultato da inviare al servo
 int valc;//variabile non utilizzata
int velocita=0;//variabile da inviare al ponte ad H
int da=4;//pin direzione
int db=3;//pin direzioneb
int attivo=5;//pin controllo ponte
int x = 10;
void setup()
{
 Serial.begin(9600);
  myservo.attach(9);


#define DIRA 3 // senso rotazione

#define DIRB 4 // senso rotazione

}
 
void loop()
{//Serial.println(lettura);//scrivo il valore di x
  //Serial.println("x=");
 Serial.println(x);// scrivo il valore di valb
  Serial.println(valc);
 x=0;
  lettura = analogRead(potpin);//leggo il vlore del potenziometro
   val = map(lettura, 0, 1023, 0, 90);//lo matppo 
  delay(800);//fermo la lettora per 0,8 secondi
 lettura = analogRead(potpin);// imposto la variabile per la lettura del potenziometro
  vall = map(lettura, 0, 1023, 0, 90);//rimappo la variabile 
  //preso dall esempio dell ide
  valb =90 + val - vall ;//calcolo la variabile da inviare al servo
  valc=val -vall;//calcolo la variabile da inviare al ponte ad H
  myservo.write(valb);//invio la valb al servo

 if(valb >=70 && valb <= 110){analogWrite(attivo,0);}//potenziometro fermo il motore
 if(valb>= 111){//se la variazione del potenziometro e superiore a 111 
   //attivo il motore perso destra

digitalWrite(DIRA, LOW); 
digitalWrite(DIRB, HIGH);
 x= valc*(255/90); //calocolo la variabile per la velocita
   analogWrite(attivo,x);           }
  
  if(valb<=70){//se inferiore a 70 attivo il motore verso sinistra
    digitalWrite(DIRA, HIGH); 
    digitalWrite(DIRB, LOW);
     x= -valc*(255/90);//calcolo la variabile per la velocita
    analogWrite(attivo,x); }//invio la variabile al ponte ad H
}

credo che con questo sia arrivato al punto giusto , l unica cosa che non riesco a capire e il risultato per il calcolo di x perche dovrebbe variare da 0 a 255 mentre mi varia da 0 a 180 ,
avete qualche consiglio?

il codice funziona , l unica modifica che devo fare e la gestione del senso di rotazione( che deve essere gestita dal servo)

ed integrare meccanicamente il servo al motorino ,

ora pero per la gestione delle inclinazioni , sarei orientato a farla gestire da altri arduino perche con quel delay risulta un po

lento ho paura , correggetemi se sbaglio, che poi le inclinazioni non risultassero perfettamente in fare con la riotazione,

ho cercato un po in rete ma non sono riuscito a trovare un esempio simile a questo per capire il funzionamento.

non vorrei usare per ogni asse un arduino e un potenziometro per la rotazione uno per l inclinazione destra,sinistra, e uno

per avanti, indietro . vorrei usare un solo potenziometro quindi inviare il valore del potenziometro agli altri arduino .

grazie mille

#include <Wire.h>
#include <Servo.h>
Servo myservo;
int lettura;
int potpin = 0;
int val;//prima variabile di lettura
int vall;//seconda variabile di lettura
int valb;//risultato da inviare al servo
 int valc;//variabile non utilizzata

int da=4;//pin direzione
int db=3;//pin direzioneb
int attivo=5;//pin controllo ponte
int x = 10;
#define S_1  9 /*definisco l indirizzo dell arduinio
per il comando trasversale*/
#define S_2  8/*definisco l indirizzo dell arduinio
per il comando lungitudinale*/
void setup()
{
 Serial.begin(9600);
  myservo.attach(9);

Wire.begin();//attivo il bus
#define DIRA 3 // senso rotazione

#define DIRB 4 // senso rotazione

}
 
void loop()
{//Serial.println(lettura);//scrivo il valore di x
  //Serial.println("x=");
 Serial.println(x);// scrivo il valore di valb
  Serial.println(valc);
 x=0;
  lettura = analogRead(potpin);//leggo il vlore del potenziometro
   val = map(lettura, 0, 1023, 0, 90);//lo matppo
  delay(800);//fermo la lettora per 0,8 secondi
 lettura = analogRead(potpin);// imposto la variabile per la lettura del potenziometro
  vall = map(lettura, 0, 1023, 0, 90);//rimappo la variabile
  //preso dall esempio dell ide
  valb =90 + val - vall ;//calcolo la variabile da inviare al servo
  valc=val -vall;//calcolo la variabile da inviare al ponte ad H
  myservo.write(valb);//invio la valb al servo
  Wire.beginTransmission(S_1);
  Wire.beginTransmission(S_2);
  Wire.write(valc);
  Wire.endTransmission();
 if(valb >=70 && valb <= 110){analogWrite(attivo,0);}//potenziometro fermo il motore
 if(valb>= 111){//se la variazione del potenziometro e superiore a 111
   //attivo il motore perso destra

digitalWrite(DIRA, LOW);
digitalWrite(DIRB, HIGH);
 x= valc*(255/90); //calocolo la variabile per la velocita
   analogWrite(attivo,x);
   // Write a charatre to the Slave

   }
 
  if(valb<=70){//se inferiore a 70 attivo il motore verso sinistra
    digitalWrite(DIRA, HIGH);
    digitalWrite(DIRB, LOW);
     x= -valc*(255/90);//calcolo la variabile per la velocita
    analogWrite(attivo,x); }//invio la variabile al ponte ad H
}

questo e il codice dell arduino master
e questo e dello slave

#include <Servo.h>
#include <Wire.h>

#define S_1  8 //defininsco l indirizzo 

int  attivo=5  //imposto il pin del ponte ad h




void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
  myservo.attach(9);

Wire.begin();//attivo il bus
#define DIRA 3 // senso rotazione

#define DIRB 4 // senso rotazione
}
void receiveEvent(){
  vlb = Wire.read();
  }
void loop() {
  // put your main code here, to run repeatedly:
delay (40);
valc= vlb -90 ;
myservo.write(valb);//invio la valb al servo
if(valb >=70 && valb <= 110){analogWrite(attivo,0);}//potenziometro fermo il motore
 if(valb>= 111){//se la variazione del potenziometro e superiore a 111
   //attivo il motore perso destra

digitalWrite(DIRA, LOW);
digitalWrite(DIRB, HIGH);
 x= valc*(255/90); //calocolo la variabile per la velocita
   analogWrite(attivo,x);
   // Write a charatre to the Slave

   }
 
  if(valb<=70){//se inferiore a 70 attivo il motore verso sinistra
    digitalWrite(DIRA, HIGH);
    digitalWrite(DIRB, LOW);
     x= -valc*(255/90);//calcolo la variabile per la velocita
    analogWrite(attivo,x); }//invio la variabile al ponte ad H
    
}

secondo voi e migliorabile?
grazie
p.s. adesso non riesco a integrare la funsione mills() secondo voi sarebbe meglio del delay o inutile?
grazie

Non sono esperto di Arduino, ma in applicazioni di automazione industriale si usano gli encoder per il calcolo dell' angolo, della direzione e della velocita di rotazione (essenzialmente producono impulsi su due canali A e B. Eventualmente disponibili con impulso di zero e anche i due canali negati). Non so se e' applicabile per questo progetto.

in emulazione funziona sembrerebbe funzionare, , non riesco ad emulatre il i2c .
come hio scritto all inizio del posto vorrei utilizzare dei motorini da tergi cristallo e un motorino di avviamento per la rotazione a cui collego meccanicamente un servo , con un encoder non ho idea come regolare la velocita e l angolo in base alla velocita con cui si ruota il volante .
p.s. per l uso dei milss hai qualche consiglio?

Come dicevo purtroppo come programmazione Arduino sono praticamente a zero (non ti so aiutare su milss) ma lavoro vicino al settore automazione industriale per cui so che per controllare la velocita' e angolo si usa un encoder.
L'encoder manda una serie di impulsi alto e basso (ad esempio 512 impulsi per giro quindi un impulso ogni 1.42 gradi. Si possono avere risoluzioni piu' alte o piu' basse).
La velocita' angolare e' data dal numero di impulsi nell'unita' di tempo.
Una volta preso un punto di riferimento come reset si puo' calcolare lo scostamento angolare con numero di impulsi (numero di giri * 1.42 mi da l'angolo).
Non so se questo sistema puo' funzionare per te ma cosi si fa in automazione industriale.

io ho usato questo sistema perche una variazione x dell angolo dello sterzo in y secondi provoca una rotazione di x gradi a y velocita , non conoscendo assolutamente il fonzionamento dell encoder su arduino e applicando la mia regola : parti nel modo piu semplice e poi lo migliori , sono partito da un servo montato sull asse di un motorino il potenziometro del servo mi regola l angolo , alimentazione del motorino del servo discrimina il senso di rotazione e l impulso in pwm regola la forza .
il programma legge il valore del potenziometro passano x secondi e rilegge facendo la differenza se questa e sotto i 20 gradi non fa niente , se la differenza e piu di 20 gradi es 30 , il servo si spostera di x gradi a y velocita a destra ( per esempio). con un encoder non ho la piu pallida idea.