Go Down

Topic: SR04 ultraljudssensor som fryser!!! (Read 3089 times) previous topic - next topic

McB

Hej.
Sitter och testar runt SR04 och har problem med att den fryser/låser sig.
Bästa sättet att få den att mäta igen är att bryta VCC och sen funkar den ingen???
Eftersom tanken är att den ska användas på en robot så vill jag hitta en lösning.

Har testat med alla möjliga kodexempel jag kan hitta, med ping, newping och utan och alla har samma problem?
Kan inte hitta något i koderna som ser fel ut och mina tester med olika utgångar hjälper inte heller.

Har testat att lägga VCC på en utgång och bryta den, men det funkar inte heller.

Någon som har en ide eller lösning??

En av testerna nedan:

Code: [Select]
[code]
/*
  The circuit:
 * LCD RS pin to digital pin 8
 * LCD Enable pin to digital pin 9
 * LCD D4 pin to digital pin 4
 * LCD D5 pin to digital pin 5
 * LCD D6 pin to digital pin 6
 * LCD D7 pin to digital pin 7
 * LCD BL pin to digital pin 10
 * KEY pin to analogl pin 0
 *Vcc pin to  +5
 *Trig pin to digital pin 12
 *Echo pin to digital pin 13
fuction :  when the serial port sen an "a" to the Board .the Board will show" holl sainsmart "in the lcdkeypad"   
 */

#include <LiquidCrystal.h>
#define CM 1      //Centimeter
#define INC 0     //Inch
#define TP 12      //Trig_pin
#define EP 2      //Echo_pin
#define PW 11      //Vcc_pin Ping

LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
const char nomber_[]="0123456789";
char nomber_s[]="000";
char  rword;
char msgs[5][16] = {"Right Key OK ",
                    "Up Key OK    ",               
                    "Down Key OK  ",
                    "Left Key OK  ",
                    "Select Key OK" };

int adc_key_val[5] ={50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

void setup()
{
  lcd.clear();
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  Serial.begin(9600); // 打开串口,设置波特率为9600 bps
  pinMode(TP,OUTPUT);       // set TP output for trigger 
  pinMode(EP,INPUT);        // set EP input for echo
  pinMode(PW,OUTPUT);
}

void loop()
{

//digitalWrite(PW,HIGH);
   delay(100);
   long microseconds = TP_init();
   long distacne_cm = Distance(microseconds, CM);
 //  LCD_cover_data(distacne_cm,nomber_s);
   lcd.setCursor(0,0);
   lcd.print(" Dis_CM :  ");
   lcd.print(distacne_cm);
   lcd.print(" CM");
    Serial.println(distacne_cm); //从串口发送字符串
  // Serial.println(" Holl SainSmart"); //从串口发送字符串并换行
}

long Distance(long time, int flag)
{
  /*
 
  */
  long distacne;
  if(flag)
    distacne = time /29 / 2  ;     // Distance_CM  = ((Duration of high level)*(Sonic :340m/s))/2
                                   //              = ((Duration of high level)*(Sonic :0.034 cm/us))/2
                                   //              = ((Duration of high level)/(Sonic :29.4 cm/us))/2
  else
    distacne = time / 74 / 2;      // INC
  return distacne;
}

long TP_init()
{                     
  digitalWrite(TP, LOW);                   
  delayMicroseconds(2);
  digitalWrite(TP, HIGH);                 // pull the Trig pin to high level for more than 10us impulse
  delayMicroseconds(10);
  digitalWrite(TP, LOW);
   
  long microseconds = pulseIn(EP,HIGH);   // waits for the pin to go HIGH, and returns the length of the pulse in microseconds
  return microseconds;      // return microseconds
//digitalWrite(PW,LOW);
delay(100);
}

//cover number to string
void LCD_cover_data(unsigned int data_tem,char *nomber_s){
  char k=0;
  if(data_tem!=0){
     for(int i=5;i!=0&&data_tem!=0;i--){
         k=data_tem%10;
         nomber_s[i]=nomber_[k];
         data_tem/=10;
     
  }
  }
}





[/code]

McB

Har läst runt på allt jag hittar och kommit fram till att kina kopiorna troligtvis saknar timeout.
Har hittat några förslag på lösningar som jag inte hunnit prova fullt ut, får se var det leder.

Någon form av programlösning finns nog ???

3dprinter

Se nå du skriver "testar runt SR04" - så vet jag inte vad det är (OK, der står "ultraljudsensor" i rubrikken). Så kan jag googla och gissa och först använda 5-10 minutter på det innan jag kan tänka på problemet. Var vänlig itil fremtidiga frågor at bifoga links til hardvaru.

" att den fryser/låser sig" ... när? vad gjorde du innan? Vad gör resten af maskinen? - en god tum regel är att skrive vad man gjorde, vad man hoppades på skulle hända, och vad faktiskt hände

Lite mera beskrivning så kan vi kanske hitta reda på det. Det kann jo också vare elektrisk fel?

McB

Nja riktigt så dåligt med info var det ju inte. Begär inte heller att du ska sätta dig in i problemet om du inte har ett intresse i det
, eller är som jag som gör det för att lära mig mer som jag kan ha nytta av och då är lite googlande det som tar minst tid.
Men som du vill så kanske du har en lösning en riktning mot en lösning.

SR04 ultraljudsensor 4 pin Vcc, Echo, Trigger och GND.
Länk till hårdvara känns överflödig då detta är en kopia och inte har exakt mjukvara in bränd = en del av problemet.

Sensorn mäter bra med tillräcklig noggranhet för de flesta användningsområden.
Problemet uppstår när maxavståndet överskrids, då hänger sig sensorn och enda mätvärdet man får är 0.

Ibland återhämtar den sig själv men oftast måste man skapa ett skarpt snabbt ljud vid sensorn (handklapp, fingerknäppning)
eller bryta strömmen till den.
Sen mäter den bra tills max uppnås och så börjar vi om.

Är ganska övertygad om att det går att lösa på något sätt, programässigt eller genom en ändring av sensorn spelar ingen roll.
Eftersom jag har några stycken och alla har samma problem så är det fritt fram med förslag och ideer.

En sak som ska testas är att löda på ett motstånd på 10kOhm mellan trigger pin och reciver likt denna
Ska bara hitta lite tid till det bara  :smiley-confuse:

Att lösa det med mjukvara kan också funka, en sub rutin som kollar mätvärdet under 50-100ms och är det noll så släcker man ner sensorn 1 sekund och startar om den.
Har testat att kasta om ingångar och utgångar enligt ett förslag jag hittat, man ändrar pinmode på echo till en utgång och sätter den låg pausar och sätter den till ingång igen.
Men det funkar inte för mig, sensorn ger noll tills man knäpper den eller bryter strömmen.

Har testat att köra den på ett servo och problemen blir mindre tackvare rörelserna och ljuden från servot, mycket störkällor = bättre funktion konstigt nog.



Erni

i din sketch bruger du pulseIn() til at bestemme afstanden (ved at måle hvor længe en puls er om at returnere)

Du kan bestemme hvor lang tid der skal ventes før der skal returneres nul, pr. default er tiden 1 sek.
Det er sikkert alt for længe så du kunne prøve med mindre f.eks. 0,1 sekund:

Code: [Select]
pulseIn(pin, HIGH,100000);

Tiden er i microsekunder


McB

Detta ska jag testa, hoppas det funkar.
Men blir det inte så att man lyssnar bara 0,1 sek och struntar i resten?
Om då sensorn håller echo hög konstant för att den saknar timeout borde ju echo fortfarande vara hög när man kommer tillbaka?

Får se när jag hinner bara med familj och jobb.

McB

Att begränsa pulsen in funkar inte tyvärr, eftersom sensorn saknar timeout håller den echo hög oavsett hur länge jag lyssnar.

Får fortsätta att exprimentera men har inte riktigt klart för mig hur, måste på något sätt släcka ner sensorn tillräckligt länge?

Annars blir det att byta ut den just till detta och använda US-100 sensorn istället.

McB

Kan meddela att US-100 sensorn funkar felfritt med samma kod    :)

RuneJ

Jeg havde også problemer med HC-SR04. Til sidst skrev jeg mit eget lille library. Jeg brugte det til en kollisionsalarm i en lille selvkørend bil, men metoderne er helt generelle.

Du initialiserer sensoren med for eksempel:   

Code: [Select]
#include <PingSensor.h>     // Custom library for HC-SR04 ultrasonic range finder

const int PIN_SONAR_LEFT_PING         = 49;    // Ultrasound Range Finder trigger signal
const int PIN_SONAR_LEFT_ECHO        = 51;   // Ultrasound Range Finder return signal

PingSensor distanceSensorLeft=PingSensor(PIN_SONAR_LEFT_PING, PIN_SONAR_LEFT_ECHO, 100);


Du måler afstanden i centimeter med for eksempel:

Code: [Select]
/* One measurement */
int distance = distanceSensorLeft.getDistance(); 

/* Average distance from 5 measurements */
int distance = distanceSensorLeft.getAvgDistance(5); 

/* Middle distance from 3 measurements (recommended) */
int distance = distanceSensorLeft.getMiddleDistance();


Jeg har vedhæftet library-filen PingSensor.h, som du gemmer i en folder med navnet PingSensor i din arduino libraries-folder.


McB

Tack den ska ja testa :)

Har varit iväg på annat och bytt jobb m.m så arduinobiten har legat nere pga tidsbrist, nu hinner man börja pilla så smått igen  :)

Go Up