Ultraschall entfernungsmesser BAUEN

Gast #2168220
Lesenswert?

hallo !!
Ich habe mir so ein paar ultraschallsensoren gekauft und wollte euch 
fragen ob ihr ein paar seiten kennt , wo und wie erklärt wird , wie man 
sich nur aus den sensoren und paar mikrochips ein entfernungsmesser für 
meinen Roboter Bauen lässt  ?!?

Danke für eure  Tipps XD !!
Gast #2168316
Lesenswert?

Ich habe vor einiger Zeit sowas gebaut um den Füllstand in einem 
Regenwassertank zu messen.

Verwendet habe ich dieses Ultraschallmodul:

http://projet.de/produkte-bauteile.html

Soweit ich weiss gibt noch einige ähnliche Module, bei denen war es aber 
nicht möglich das eigentliche Ultraschallmodul wasserdicht 
abzuschliessen, Das war der Grund für das Projet-Modul.

Die Software ist relativ einfach. Das ganze hatte ich mit einem atmega8 
zusammengebaut. Die CPU-Frequenz lag bei 8Mhz. Das Ultraschallmodul ist 
mit dem Datenpin (mittlerer Anschluss) am PB2 angeschlossen.

Wenn die Messung fertig ist wird der Abstand in Millimetern 
zurückgeliefert (mehr oder weniger genau).

Hier ist der Code für die Routine die die Messung macht:
1
volatile uint16_t measure(void){
2
  uint16_t restime = 0;
3
  uint8_t tmp_sreg;
4
  tmp_sreg = SREG;    // Status Register sichern
5
  cli();        // Interrupts global deaktivieren
6

7
  DDRC   |=  (1<<DDC2);  // Port auf Ausgang setzen
8
  PORTC  &=  ~(1<<PC2);  // Port auf Low ziehen
9
  _delay_us(180);      // Pegel kurz auf Low halten
10
  DDRC   &=  ~(1<<DDC2);  // Port auf Eingang schalten
11
  _delay_us(850);      // Noch etwas warten
12

13
  restime = 0;
14
  while(1){      // diese Schleife läuft solange bis der Sensor das Signal wieder auf HIGH-Level zieht
15

16
    _delay_us(4);
17
    asm volatile("NOP");
18
    asm volatile("NOP");
19
    asm volatile("NOP");
20
    asm volatile("NOP");
21
    asm volatile("NOP");
22
    asm volatile("NOP");
23
    asm volatile("NOP");
24
    asm volatile("NOP");
25
    asm volatile("NOP");
26
    asm volatile("NOP");
27
    asm volatile("NOP");
28
    asm volatile("NOP");
29
    
30
    if(!(PINC & (1<<PINC2))){
31
      break;
32
    }
33
    if (restime < 65534){
34
      restime++;
35
    }
36
    else {
37
      break;
38
    }
39
  }
40
  SREG = tmp_sreg;
41
  return restime;
42
}

Das ganze blockiert natürlich während der Messung die CPU.
Das lässt sich sicher alles noch optimieren.

Der Code entstand während ich mich erstmalig mit dem Modul beschäftigt 
habe. Ich hoffe es hilft bei einem ersten Einstieg weiter.
Viel Spass damit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren