Buongiorno a tutti
Premetto che sono 3 anni che non uso Arduino
Dato il brutto periodo, quindi a casa,
Vorrei montare sulla Moto i faretti laterali ( fendinebbia)
Mi piacerebbe usarli con funzione cornering, ovvero si accendono ( dx o sx) in base all'angolo di piega
Ho un Arduino uno e un mega
Cosa potrei usare senza fare i calcoli della nasa
Potenziamento, giroscopio,....?
Grazie a tutti in anticipato
Saluti
Marco
Se parlassimo in linea teorica ti basterebbe il giroscopio, praticamente non puoi montarle sulla moto perché è vietato dal codice della strada qualsiasi modifica all'impianto elettrico/luminoso dei veicoli
fabpolli:
Se parlassimo in linea teorica ti basterebbe il giroscopio, praticamente non puoi montarle sulla moto perché è vietato dal codice della strada qualsiasi modifica all'impianto elettrico/luminoso dei veicoli
Ok grazie
Si sono a conoscenza che sia vietato,
I giroscopi però sono in grado di fornire l'angolo di inclinazione oppure forniscono solo la velocità angolare?
Edit
Ad esempio questo potrebbe essere quello che mi necessita? Si riesce comunicare con Arduino?
WITMOTION HWT901B RS485
Un dispositivo con RS485 puó essere collegato a Arduino ma altre soluzioni come SPI o I2C sono molto piú semplici.
Un giroscopio misura la velocitá angolare di una rotazione normalmente in 3 assi.
Un accelerometro misura l'acelerazione terrestre normalmente in 3 assi.
Un magnetometro misura il campo magnetismo terrestre normalmente in 3 assi e puó indicare il polo N.
Ciao Uwe
uwefed:
Un dispositivo con RS485 puó essere collegato a Arduino ma altre soluzioni come SPI o I2C sono molto piú semplici.Un giroscopio misura la velocitá angolare di una rotazione normalmente in 3 assi.
Un accelerometro misura l'acelerazione terrestre normalmente in 3 assi.
Un magnetometro misura il campo magnetismo terrestre normalmente in 3 assi e puó indicare il polo N.Ciao Uwe
grazie mille Uwe
ho preso il sensore di cui sopra, e il convertitore rs485 ttl.
ho fatto un po' di prove
se collego il convertitore in usb con programma del sensore lo leggo correttamente e funziona
il problema invece è quello della lettura della seriale...
imposto il convertitore sulla modalità ttl
compilo lo sckecht che mi ha fornito il produttore selezionando porte e baud ma non esce nulla sulla seriale
purtroppo sto cercando varie guide e libri di scuola ma di questo sckecht capisco davvero poco...
unsigned char Re_buf[11],counter=0;
unsigned char sign=0;
float a[3],w[3],angle[3],T;
void setup() {
// initialize serial:
Serial.begin(115200);
}
void loop() {
if(sign)
{
sign=0;
if(Re_buf[0]==0x55)
{
switch(Re_buf [1])
{
case 0x51:
a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x52:
w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x53:
angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
Serial.print("a:");
Serial.print(a[0]);Serial.print(" ");
Serial.print(a[1]);Serial.print(" ");
Serial.print(a[2]);Serial.print(" ");
Serial.print("w:");
Serial.print(w[0]);Serial.print(" ");
Serial.print(w[1]);Serial.print(" ");
Serial.print(a[2]);Serial.print(" ");
Serial.print("angle:");
Serial.print(angle[0]);Serial.print(" ");
Serial.print(angle[1]);Serial.print(" ");
Serial.print(angle[2]);Serial.print(" ");
Serial.print("T:");
Serial.println(T);
break;
}
}
}
}
void serialEvent() {
while (Serial.available()) {
//char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code
Re_buf[counter]=(unsigned char)Serial.read();
if(counter==0&&Re_buf[0]!=0x55) return;
counter++;
if(counter==11)
{
counter=0;
sign=1;
}
}
}
>mac98: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).
In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code]
così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto.
fatto mi scuso davvero
grazie mille
Un saluto a tutti
primo post, siate clementi se sbaglio qualcosa.
La pandemia ha fatto venire la sindrome di Gundam anche a me e sto cercando di fare la stessa cosa.
Mai ustato arduino, ho studiato e acquistato nano 33 ble con IMU a 9 assi + regolatore di tensione + 2 finali di potenza per i fari.
Con l'ausilio di chi più o meno sa programmare in un mese ho tirato fuori uno sketch funzionante su banco prova.
Una volta montato però le accellerazioni in gioco buttano tutto all'aria.
questo è il Roll più stabile (filtro kalman) che ho trovato, preso da https://robologs.net/2014/10/15/tutorial-de-arduino-y-mpu-6050/
float getRoll(){
//A partir de los valores del acelerometro, se calculan los angulos Y, X
//respectivamente, con la formula de la tangente.
AccX = atan((Ay/A_R)/sqrt(pow((Ax/A_R),2) + pow((Az/A_R),2)))*RAD_TO_DEG;
//Calculo del angulo del Giroscopio
GyroX = Gx/G_R;
dt= (currenTime - lsTime); //calcolo tempo di ciclo in secondi
//Aplicar el Filtro Complementario (variare moltiplicatori per aumentare sensibilità - somma sempre 1)
AngleX = 0.98 *(AngleX+(GyroX*dt)*0.001) - 0.02*AccX; //angolo di Roll- sostituito 0.010 con dt
return AngleX;
}
siccome funzionava bene ma sul banco e non in moto
ho recuperato gli angoli X e Y (c'è anche il getPitch) e li ho usati per calcolare Roll tenedo presente la forza centrifuga
Rollmov = (((acos((sin(beta)*Ay + cos(beta)*Ax)/Az))*RAD_A_DEG)-90)/2;
(...-90)/2; perchè restituiva 90 con arduino in piano e 0 e 180 a 45°)
ha il limite di funzionamento di +/- 45° ma più che sufficiente allo scopo.
Anche questo ottimo alla prova al banco, ma fallimentare su moto.
ho provato anche varie soluzione per l'accellerazione di gravità (1 fisso, Az, o calcolata sempre con filtro kalman)
ho provato anche altre proposte ma non ottengo risultati migliori
i filtri mahony/madgwick non riesco a farli funzionare neanche al banco.
void loop() {
// put your main code here, to run repeatedly:
if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable() && IMU.magneticFieldAvailable() ){
IMU.readAcceleration(Ax, Ay, Az);
IMU.readGyroscope(Gx, Gy, Gz);
IMU.readMagneticField (Mx,My,Mz);
//Gx=Gx*DEG_TO_RAD;
//Gy=Gy*DEG_TO_RAD;
//Gz=Gz*DEG_TO_RAD;
filter.update (Ax, Ay, Az, Gx, Gy, Gz, -Mx, My,-Mz);
float roll = filter.getRoll();
float pitch = filter.getPitch();
float heading = filter.getYaw();
Serial.print(heading);
Serial.print(",");
Serial.print(pitch);
Serial.print(",");
Serial.println(roll);
}
}
ho provato a converite in rad il gyro perchè ho trovato che il filtro lavora così.
ho provato a invertire gli assi perchè ho trovato versioni constrastanti sul verso con cui lavora il filtro
mi restituisce sempre dei valori non realistici e soprattutto non variano muovendo arduino, ma a casaccio.
non sono riuscito a combianre nulla con Adafruit, neanche con Adafruit_LSM9DS1.h che è la stessa IMU di nano 33. non sono stato capace di adattarla, ammesso che sia possibile.
consigli?
>omomoto: Buongiorno, 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.
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto.
tu mi dici quello che devo fare e io lo faccio
omomoto:
tu mi dici quello che devo fare e io lo faccio
Grazie
Guglielmo