Cornering light

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. :wink:

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. :slight_smile:

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. :wink:

tu mi dici quello che devo fare e io lo faccio :smiley:

omomoto:
tu mi dici quello che devo fare e io lo faccio :smiley:

Grazie :grin: :grin: :grin:

Guglielmo