Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

aiuto funzione millis per led e sensore mpu6050

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] aiuto funzione millis per led e sensore mpu6050

Messaggioda Foto UtenteilZott » 30 dic 2019, 12:36

Salve a tutti
sto realizzando un piccolo circuitino basato sul sensore mpu6050 e tre led colorati da mettere sul monoppatino di mia nipote,che verranno azionati durante il movimento; purtroppo sono solo agli inizi con l'arduino ed ora mi sono incastrato con la funzione millis.
Vi spiego meglio il mio circuito: con il sensore mpu6050 controllo l'accensione di tre led ( che poi verrano sostituiti con dei led cob più luminosi e transistr per accenderli) uno blu quando il monopattino accelera, uno rosso quando frena ed uno verde quando cammina "liscio", il circuito dopo un po di settaggi per trovare i giusti valori funziona molto bene, ma ora vorrei impostare una sorta di autospegnimento se il monopattino resta ferma per un tot di secondi e che poi si riattivi appena sente che viene spostato. Girando in rete ho visto che la funzione millis sarebbe la più indicata, ma onestamente non riesco ad implementarla nel mio codicillo... mi potreste dare una mano ? :-)
ecco qui il mio codice:

Codice: Seleziona tutto

#include <SPI.h>
#include <Wire.h>
#define MPU 0x68  // I2C address of the MPU-6050

double AcX,AcY,AcZ;
int Pitch, Roll;

void setup(){
  Serial.begin(9600);
  init_MPU(); // Inizializzazione MPU6050
  pinMode(4, OUTPUT);     //led rosso 
  pinMode(10, OUTPUT);    //led blu
  pinMode (7, OUTPUT);    //led verde
 
}

void loop()
{
  FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.
   
  Roll = FunctionsPitchRoll(AcX, AcY, AcZ);   //Calcolo angolo Roll
  Pitch = FunctionsPitchRoll(AcY, AcX, AcZ);  //Calcolo angolo Pitch

  Serial.print("Pitch: "); Serial.print(Pitch);
  Serial.print("\t");
  Serial.print("Roll: "); Serial.print(Roll);
  Serial.print("\n");

}

void init_MPU(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  delay(1000);
}

//Funzione per il calcolo degli angoli Pitch e Roll
double FunctionsPitchRoll(double A, double B, double C){
  double DatoA, DatoB, Value;
  DatoA = A;
  DatoB = (B*B) + (C*C);
  DatoB = sqrt(DatoB);
 
  Value = atan2(DatoA, DatoB);
  Value = Value * 180/3.14;
 
  return (int)Value;
}

//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050
void FunctionsMPU(){
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)



if((Pitch) > 20){      //questa funziona determina quando accendere il led
digitalWrite(10, HIGH);
delay(500);              //tempo accensione led acceleratore blu
}else{
digitalWrite(10, LOW);
}

if((Pitch) < -15){      //questa funziona determina quando accendere il led
digitalWrite(4, HIGH);
delay(200);              //tempo accensione led freno rosso  era 100
}else{
digitalWrite(4, LOW);
}

if (((Pitch) >= -10)&&((Pitch) <= 15))  //era -13 e 18
{
   digitalWrite(7, HIGH);           // accensione led cruise verde
   }else{                     
digitalWrite(7, LOW);
}



}


la parte del sensore mpu6050 l'ho trovata in rete, mentre io ho implementato la sezione dedicata ai led con i riferimenti ai valori del sensore e l'inserimento delle funzioni if.

ciao e grazie a tutti :ok:
Avatar utente
Foto UtenteilZott
0 3
New entry
New entry
 
Messaggi: 60
Iscritto il: 26 lug 2009, 11:37

0
voti

[2] Re: aiuto funzione millis per led e sensore mpu6050

Messaggioda Foto UtenteMarcoD » 30 dic 2019, 13:38

Codice: Seleziona tutto
int tm,tmp;
void loop()
{


  tm = (millis() & 0xFFFF);
  if (( tm - tmp) > 200) //temporizzazione 0,2 secondi ritardo per assestamento rele' e misura gamma
{ tmp = tm;

  visual_val();//visualizza i valori richiesti dalla linea seriale   
  sono_vivo();
//  seq_incr_decr();// genera sequenza incremento, un passo ogni 2 secondi
  acquisisci_Gamma();
  ric_accordo();
  comandi_ai_rele();//da pcC1,pcC2 ai pin comando relè

}
}

boolean LEDoff;//stato LED lampeggio
void sono_vivo() //fa lampeggiare il LED  pin 13 su Arduino
{ if (LEDoff) {LEDoff= false; digitalWrite(led, HIGH);}else{ digitalWrite(led, LOW);LEDoff= true;}
}




TI allego un pezzo di programma che mostra come è adoperata la funzione millis() per temporizzare dei calcoli.
Buone prove con arduino. O_/
Avatar utente
Foto UtenteMarcoD
12,2k 5 9 13
Master EY
Master EY
 
Messaggi: 6696
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[3] Re: aiuto funzione millis per led e sensore mpu6050

Messaggioda Foto UtenteilZott » 30 dic 2019, 20:50

Ciao grazie per la risposta, ma finché uso uso Millis da solo qualcosa riesco a fare, mi sto incastrando invece per incorporarlo col resto del programma e metterlo nel giro degli altri if che ho creato. Ciao :-)
Avatar utente
Foto UtenteilZott
0 3
New entry
New entry
 
Messaggi: 60
Iscritto il: 26 lug 2009, 11:37

0
voti

[4] Re: aiuto funzione millis per led e sensore mpu6050

Messaggioda Foto UtenteMarcoD » 30 dic 2019, 21:44

ma ora vorrei impostare una sorta di autospegnimento se il monopattino resta ferma per un tot di secondi e che poi si riattivi appena sente che viene spostato.

Cosa intendi esattamente?
Messa della CPU in basso consumo ?
Riattivarlo con l'accelerometro ? che rimane alimentato ? Sveglia la CPU con un interrupt ?
Non saprei farlo. E' possibile con arduino?

Io adopero un solo millis() per dare un "clock", tutte le funzioni vengono eseguite ogni un certo tempo e devono terminare entro il clock. NON adoperare la funzione delay() che blocca il funzionamrnto del programma.
O_/
Avatar utente
Foto UtenteMarcoD
12,2k 5 9 13
Master EY
Master EY
 
Messaggi: 6696
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[5] Re: aiuto funzione millis per led e sensore mpu6050

Messaggioda Foto Utentelucaking » 31 dic 2019, 10:08

ilZott ha scritto:Ciao grazie per la risposta, ma finché uso uso Millis da solo qualcosa riesco a fare, mi sto incastrando invece per incorporarlo col resto del programma e metterlo nel giro degli altri if che ho creato. Ciao :-)

Vediamo cosa farei io con le mie (scarse) capacità.
In realtà mi è gia capitato di farlo e funziona, però sicuramente ci sarà un metodo piu corretto ed elegante, e se qualche utente piu esperto del forum intervenisse a riguardo farebbe MOLTO piacere anche a me.
Comunque giusto per espormi al pubblico ludibrio...:
io inizializzerei una variabile nella quale (con la funzione millis()) salvare il tempo in cui c' è stato l' ultimo cambio di stato del programma, quindi se ho capito bene quando cambia il valore di pitch o di roll.
A questo punto nella funzione loop controllerei che il tempo trascorso dall' ultimo cambio di stato non sia superiore al tempo desiderato.
Es:
Codice: Seleziona tutto
if ((millis() - last_change) > timeout) {
        spengo i led o faccio cio che voglio
}


Per mettere il micro in sleep mode (da verificare se sia realmente conveniente), onestamente l' ho fatto solo usando direttamente la libreria avr/sleep.h, anche se penso ci sia anche qualche libreria proprio di arduino, ma di preciso non saprei.
Comunque in entrambi i casi per risvegliarlo a un tuo movimento dovrai fare uso di un qualche segnale su un pin di interrupt esterno come suggeriva Foto UtenteMarcoD.
Avatar utente
Foto Utentelucaking
1.651 4 5 8
Expert
Expert
 
Messaggi: 1445
Iscritto il: 29 mag 2015, 14:28

0
voti

[6] Re: aiuto funzione millis per led e sensore mpu6050

Messaggioda Foto Utentelucaking » 31 dic 2019, 10:31

Ah, dimenticavo, ricorda che la funzione millis() ritorna un unsigned long, quindi devi tenerne conto quando fai delle operazioni con essa.
Inoltre ogni 49 girni circa farà overflow e qualcosa potrebbe non funzionare, ma non credo che questo sarà un problema.... :mrgreen:
Avatar utente
Foto Utentelucaking
1.651 4 5 8
Expert
Expert
 
Messaggi: 1445
Iscritto il: 29 mag 2015, 14:28

0
voti

[7] Re: aiuto funzione millis per led e sensore mpu6050

Messaggioda Foto UtenteilZott » 2 gen 2020, 16:13

MarcoD ha scritto:
ma ora vorrei impostare una sorta di autospegnimento se il monopattino resta ferma per un tot di secondi e che poi si riattivi appena sente che viene spostato.

Cosa intendi esattamente?
Messa della CPU in basso consumo ?
Riattivarlo con l'accelerometro ? che rimane alimentato ? Sveglia la CPU con un interrupt ?
Non saprei farlo. E' possibile con arduino?

Io adopero un solo millis() per dare un "clock", tutte le funzioni vengono eseguite ogni un certo tempo e devono terminare entro il clock. NON adoperare la funzione delay() che blocca il funzionamrnto del programma.
O_/

Ciao
In pratica vorrei solo che si spengesse il led “cruise” verde dopo un tot secondi di inutilizzo ( in pratica se il monopattino resta fermo) tutto il resto resta acceso senza problemi, tanto i consumi di arduino e sensore sono piccoli e non mi danno problemi.
Poi appena il sensore legge nuovi movimenti riparte tutto e funziona di nuovo nel suo modo normale, in pratica mi servirebbe un altro processo che monitorizza il sensore e se non nota variazioni per un tot di secondi spenge il led cruise.
Ciao
Avatar utente
Foto UtenteilZott
0 3
New entry
New entry
 
Messaggi: 60
Iscritto il: 26 lug 2009, 11:37


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti