Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Gestione sensori ultrasuoni molto lenta

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Gestione sensori ultrasuoni molto lenta

Messaggioda Foto Utenteteletommy » 11 mar 2023, 1:42

Buonasera, premetto che non sono un grande esperto di programmazione arduino ma sto studiando e cerco di documentarmi più possibile in giro. Stiamo costruendo assieme a mio figlio una macchinina con due motori pilotati da un driver e due capsule ultrasuoni gestite da un arduino mega. Stiamo cercando di scrivere un programma per cercare di farle evitare gli ostacoli attraverso sensori di tipo HC-SR04. Se utilizziamo un solo sensore ultrasuoni il sistema risponde molto velocemente e riusciamo a far arrestare i motori immediatamente attraverso un ciclo if - else una volta percepito l'ostacolo dal sensore collegato ad un ingresso analogico. Se andiamo ad inserire due sensori il sistema diviene molto lento probabilmente perché si "accavallano" i tempi di rilevamento appunto dei due sensori ma non riusciamo a capire come poter fare in modo che, una volta percepito l'ostacolo da uno dei due sensori sensore i motori si arrestino immediatamente come accadeva con uno solo, e non dopo oltre un secondo, cosa che non va assolutamente bene per la reattività necessaria a non far sbattere il mezzo contro l'ostacolo che dovrebbe evitare.
Una volta vidi un programma composto da più "schede" dove ogni scheda gestiva un sensore e il micro "portava avanti" le gestioni parallelamente e non consecutivamente, perlomeno lo interpretai così, cosa che vorrei chiarire.
Spero di essermi spiegato in modo "capibile" e ringrazio fin d'ora chi mi aiuterà a capire una cosa nuova in questo mondo bellissimo. Allego il programma:
Codice: Seleziona tutto
int triggerPortDX = 8;
int echoPortDX    = 42;
int triggerportSX = 9;
int echoportSX    = 44;
int VEL_MOT_SX = 10;
int VEL_MOT_DX = 6;
int IN2_MOTSX = 46;
int IN1_MOTSX = 48;
int IN2_MOTDX = 50;
int IN1_MOTDX = 52;

void setup()
{
  pinMode(triggerPortDX, OUTPUT);
  pinMode(triggerportSX, OUTPUT);
  pinMode(echoPortDX, INPUT);
  pinMode(echoportSX, INPUT);
  pinMode(VEL_MOT_SX, OUTPUT);
  pinMode(VEL_MOT_DX, OUTPUT);
  pinMode(IN1_MOTSX, OUTPUT);
  pinMode(IN2_MOTSX, OUTPUT);
  pinMode(IN1_MOTDX, OUTPUT);
  pinMode(IN2_MOTDX, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  // Generazione impulso sensore DX
  digitalWrite(triggerPortDX, LOW);
  digitalWrite(triggerPortDX, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPortDX, LOW);

  // Calcolo del tempo attraverso il pin di echo DX
  long durataDX = pulseIn(echoPortDX, HIGH);
  long distanzaDX = durataDX/58.31;

  // Generazione impulso sensore SX
  digitalWrite(triggerportSX, LOW);
  digitalWrite(triggerportSX, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerportSX, LOW);

  // Calcolo del tempo attraverso il pin di echo SX
  long durataSX = pulseIn(echoportSX, HIGH);
  long distanzaSX = durataSX/58.31;


  // Analisi della distanza DX e riproduzione su monitor Seriale
  Serial.print("distanzaDX: ");
  if( durataDX > 38000 ){
    Serial.println("Fuori portata");// dopo 38ms è fuori dalla portata del sensore
  }
  else{
    Serial.print(distanzaDX);
    Serial.println(" cm");
  }
  // Analisi della distanza SX e riproduzione su monitor Seriale
  Serial.print("distanzaSX: ");
  if( durataSX > 38000 ){
    Serial.println("Fuori portata");// dopo 38ms è fuori dalla portata del sensore
  }
  else{
    Serial.print(distanzaSX);
    Serial.println(" cm");
    delay (500);
  }
  // Gestione dei motori su segnali provenienti capsule
  if((distanzaDX>40)&&(distanzaSX>40))
    {digitalWrite(IN2_MOTDX,LOW);
    digitalWrite(IN1_MOTDX,HIGH);
    digitalWrite(VEL_MOT_DX,255);
    digitalWrite(IN2_MOTSX,LOW);
    digitalWrite(IN1_MOTSX,HIGH);
    digitalWrite(VEL_MOT_SX,255);
    }
  else
    {digitalWrite(IN1_MOTDX,LOW);
    digitalWrite(IN2_MOTDX,LOW);
    digitalWrite(VEL_MOT_DX,10);
    digitalWrite(IN1_MOTSX,LOW);
    digitalWrite(IN2_MOTSX,LOW);
    digitalWrite(VEL_MOT_SX,10); 
}}

Grazie infinite a tutti voi.
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[2] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto UtenteEcoTan » 11 mar 2023, 10:59

La funzione pulseIn mette il programma in attesa dell'impulso, quindi se uno dei due sensori non trova l'eco, i tempi si allungano. Non ho mai usato Arduino. Si può mettere un limite o timeout al ritardo? Basterebbe dichiarare le durate come int o byte anzichè long?
Altrimenti non è che mi vengano grandi idee, se non ricorrere direttamente agli interrupt.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[3] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto Utenteteletommy » 11 mar 2023, 14:05

Grazie mille, proverò. Grazie ancora
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[4] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto UtenteEcoTan » 11 mar 2023, 14:31

Adesso faccio qualche domanda: ogni sensore è costituito da una semplice capsula trasduttore? Da una coppia di capsule? Contiene della elettronica che va alimentata? La percezione degli ostacoli risulta abbastanza affidabile con quel programma, e fino a quale distanza?
Personalmente ho realizzato un diverso sistema, che sfrutta la risonanza delle capsule a 40 kHz .
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[5] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto UtenteEcoTan » 11 mar 2023, 17:56

Vabbè, ho googlato e rispondo da solo. L'impulso fa da trigger per l'elettronica del sensore, e le capsule lavorano sicuramente in risonanza. Nel mio caso la cosa era gestita dalla stessa MCU.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5421
Iscritto il: 29 gen 2014, 8:54

0
voti

[6] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto Utenteteletommy » 11 mar 2023, 19:19

Ciao vedo adesso le tue domande. I sensori sono a doppia capsula con pin di trigger e di echo che calcola il tempo di ritorno. Sono abbastanza precise nonostante siano sensori da 3 euro o poco più e lavorano abbastanza stabilmente anche fino a 90 cm/1 metro. Grazie per l'interessamento
Avatar utente
Foto Utenteteletommy
955 1 1 7
New entry
New entry
 
Messaggi: 65
Iscritto il: 1 mag 2012, 16:29

0
voti

[7] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto UtenteEtemenanki » 11 mar 2023, 20:35

C'erano alcuni forum che dicevano qualcosa a proposito di non usare gli 04 perche' non erano affidabili, ed usare invece gli 05, ma non so se riferito al tuo problema o solo al fatto che non erano precisi.

EDIT - volendo ci sarebbero pure questi https://www.aliexpress.com/item/1005004436350278.html (il prezzo e' per 3 pezzi)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
9.507 3 6 10
Master
Master
 
Messaggi: 5938
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

0
voti

[8] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto Utentevenanzio » 31 ago 2023, 16:14

prova a disattivare tutti quei Serial print...
Avatar utente
Foto Utentevenanzio
360 2 5
New entry
New entry
 
Messaggi: 70
Iscritto il: 25 ago 2023, 16:11

0
voti

[9] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto UtenteMarcoD » 31 ago 2023, 16:45

Non sono certo perché non conosco il funzionamento e potrebbe non essere possibile per la presenza nel SW arduino di un solo contatore di ritardo dell'eco, ma suggerisco:
invece che lanciare l'impulso di DX e leggere l'eco, e poi fare lo stesso per il SN,
Potresti lanciare contemporaneamente gli impulsi DX e SN e poi leggere gli echi DX e SN, dovresti dimezzare il tempo di ciclo nel caso di assenza di eco.

Abbrevia:
"distanzaDX: " e "Fuori portata" in "DX:" e "fp"
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

[10] Re: Gestione sensori ultrasuoni molto lenta

Messaggioda Foto Utentestandardoil » 31 ago 2023, 17:39

Distanzadx è un nome di variabile, nulla cambia a cambiarlo

E comunque la seriale è asincrona, a meno di non trasmettere Via col vento o La divina commedia non cambia nulla
Avatar utente
Foto Utentestandardoil
547 2 4
Stabilizzato
Stabilizzato
 
Messaggi: 420
Iscritto il: 15 lug 2022, 19:14


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti