Go Down

Topic: Board Auswahl (UNO/Mega2560) 64 x HCSR04 (Read 443 times) previous topic - next topic

Julio26127

Hallo,

ich habe ein kleines Problem bei dem ich Unterstützung bräuchte. Ich würde gerne 64

Ultraschallsensoren (HCSR04) gleichzeitig über ein bzw. mehrere Arduino Boards ansteuern

und auslesen (Messung soll bei allen Sensoren gleichzeitig erfolgen). Die Übertragung der

gemessenen Daten soll über USB an meinen Computer erfolgen.



Daten HCSR04


Der Ultraschallsensor verfügt über insgesamt vier Pins (VCC, GND, TRIGGER, ECHO). Er wird mit einer

Spannung von 5V und einer Stromstärke von 15mA betrieben.



Aufgrund der hohen Anzahl von Sensoren fiel mir zunächst der Arduino Mega2560 ein.

Aus dem Datenblatt geht hervor, dass dieser über insgesamt 54 Digitale I/O Ports und

16 analogen Inputs besteht. Das bedeutet, dass ich theoretisch 35 Ultraschallsensoren gleichzeitig betreiben

könnte, richtig?


Der Arduino Mega 2560 kann an jedem Port maximal eine Stromstärke von 40mA empfangen/generieren. Bei optimaler

Ausnutzung aber insgesamt nicht mehr als 800mA. Das bedeutet ich kann gar nicht alle Ports mit Ultraschallsensoren belegen, richtig?



Ich habe bereits einen herrvoragenden Sketch von David Pilling gefunden   

https://www.davidpilling.com/wiki/index.php/HCSR04

welchen ich gerne verwenden und entsprechend an meine Bedürfnisse anpassen würde.

Im Sketch wird mit Interrupts und Timern gearbeitet. Muss ich aufgrund dessen auf weitere Pins verzichten?


Ihr merkt schon, ich habe zwar eine gewissen Grundkenntnis aber hier und da hapert es doch am tieferen Verständnis.

Mir fehlt der rote Faden an dem ich mich entlang hangeln kann. Ich bin also für jeden Tipp/Hinweis (auch in Form von Links) dankbar.

Viele Grüße und besten Dank.

Code: [Select]


#include <stdarg.h>

void pr(char *fmt, ... ){
        char buf[128]; // resulting string limited to 128 chars
        va_list args;
        va_start (args, fmt );
        vsnprintf(buf, 128, fmt, args);
        va_end (args);
        Serial.println(buf);

}


 
#define TRIGGER_PIN 4
#define ECHO_PIN 8


volatile unsigned t1captured = 0;
volatile unsigned t1capval = 0;
volatile unsigned t1ovfcnt = 0;
volatile unsigned long t1time;
volatile unsigned long t1last = 0;
volatile unsigned long t1lastp = 0;

#define BUFFER_SIZE 96

volatile unsigned long int buffer[BUFFER_SIZE];
volatile byte head = 0;
volatile byte tail = 0;
 
void setup()
{
 Serial.begin(250000);
 while (!Serial) { ; /* wait for serial port to connect. Needed for native USB */}


 TCCR1A = 0x0;    // put timer1 in normal mode
 TCCR1B = 0x2;    // change prescaler to divide clock by 8

 // clear any pending capture or overflow interrupts
 TIFR1 = (1<<ICF1) | (1<<TOV1);
 // Enable input capture and overflow interrupts
 TIMSK1 |= (1<<ICIE1) | (1<<TOIE1);
 
 pinMode(8, INPUT);   //  Feed the signal in here
 pinMode(TRIGGER_PIN, OUTPUT);
}


 
void loop()
{
 byte newhead;
 unsigned long time1;

 time1=millis();

 digitalWrite(TRIGGER_PIN, 0);
 delayMicroseconds(4);
 digitalWrite(TRIGGER_PIN, 1);   
 delayMicroseconds(10);
 digitalWrite(TRIGGER_PIN, 0);   

 TCCR1B |= (1<< ICES1);   //switch edge detector to detect the rise
 head=tail;

 while(1)
 {
  if(head!=tail)
  {
   newhead = (head + 1) % BUFFER_SIZE;
   head=newhead;
   break;
  }
  if((millis()-time1)>50) break;
 }

 
 delayMicroseconds(5);
 
 TCCR1B &= ~(1 << ICES1);   //switch edge detector to detect the fall next time

 head=tail;
 
 while(1)
 {
  if(head!= tail)
  {
   newhead = (head + 1) % BUFFER_SIZE;
   pr("%lu",buffer[newhead]);
   head=newhead;
   break;
  }
  if((millis()-time1)>50) break;
 }
 
 delay(10);
}






ISR(TIMER1_OVF_vect)
{
 t1ovfcnt++;              // keep track of overflows
}


ISR(TIMER1_CAPT_vect)
{
 unsigned long t1temp;

 // combine overflow count with capture value to create 32 bit count
 //  calculate how long it has been since the last capture
 //   stick the result in the global variable t1time in 1uS precision
 t1capval = ICR1;
 t1temp = ((unsigned long)t1ovfcnt << 16) | t1capval;
 t1time = (t1temp - t1last) >> 1;

 t1lastp=t1last;
 t1last = t1temp;
 tail = (tail + 1) % BUFFER_SIZE;
 buffer[tail] = t1time;

}






HotSystems

Warum machst du dafür einen neuen Thread auf ?
Du hättest alles im "alten" schreiben können.


Quote
Ich würde gerne 64 Ultraschallsensoren (HCSR04) gleichzeitig über ein bzw. mehrere Arduino Boards ansteuern und auslesen (Messung soll bei allen Sensoren gleichzeitig erfolgen).
Gleichzeitig geht def. nicht. Nur rel. schnell hintereinander.

Theoretisch kannst du die Sensoren an den Mega anschließen, das wird dir aber nichts bringen, da es aus dem oben genannten Grund nicht gleichzeitig funktioniert.
Du musst auch zwischen den einzelnen Aussendungen genügend Pausen lassen, damit diese sich nicht gegenseitig stören.

Mit dem Strom aus dem Mega hat das erst mal nichts zu tun, da du die Sensoren direkt an 5 Volt anschließen musst und der Datenstrom für die Sensoren deutlich geringer ist und somit vernachlässigbar ist.

Da du dir erst einmal Grundlegende Gedanken machen must, wie das funktionieren soll, habe ich mir den Sketch nicht angesehen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

agmue

Ich würde gerne 64 Ultraschallsensoren (HCSR04) gleichzeitig ...
Wenn sich die alle in einem Raum befinden, bezweifle ich die Machbarkeit. Das dürfte ein Echo-Chaos geben.

Er wird mit einer Spannung von 5V und einer Stromstärke von 15mA betrieben.
Die sollte nicht der Mega liefern, sondern ein 5V-Netzteil. TRIGGER ist TTL, kann also von einem Ausgang "versorgt" werden. Wenn Du alle TRIGGER parallel schaltest, hilft Dir ein Transistor oder ein Treiber-IC.

Alle 64 Ultraschallsensoren gleichzeitig auszuwerten, dürfte ein sportliches Unterfangen werden. Bei Interrupt Zeit merken und Ports auslesen und speichern, später die Auswertung. Das könnte dann eine Frage der Häufigkeit und zu erzielenden Genauigkeit werden.

temucin

Hallo,

ich denke das geht aus bereits angesagten Gründen nicht. Du braucht dafür Schallsensoren die auf unterschiedlichen Frequenzen arbeiten. Und selbst dann werden sich Interferenzen bilden die eine ordentliche Auswertung verhindern. Schall ist nun mal nicht schnell. nur 333 Meter pro Sekunden. Du kannst nur jeweils einen testen. Dann must du etwas warte und dann den nächsten benutzen. Fielleicht kannst du da etwas zeit sparen wenn du die gegenüberliegenden Gleichzeitig auswertest. Aber du solltest über eine andere Lösung nachdenken. Was willst du damit bezwecken?

Gruss Temucin

Julio26127

Die Sensoren sollen in einem Feld (8x8) mit einem Abstand von 15 cm zur Wand (Messobjekt) angeordnet werden. Wenn ich einen Abstand zwischen den Sensoren wähle mit Berücksichtigung des Abstrahlwinkels der Sensoren sollte doch ein Echo Chaos zumindest theoretisch vermeidbar sein. Wenn ich etwas diesbezüglich übersehe lasse ich mich gerne eines besseren belehren!

HotSystems

Die Sensoren sollen in einem Feld (8x8) mit einem Abstand von 15 cm zur Wand (Messobjekt) angeordnet werden. Wenn ich einen Abstand zwischen den Sensoren wähle mit Berücksichtigung des Abstrahlwinkels der Sensoren sollte doch ein Echo Chaos zumindest theoretisch vermeidbar sein. Wenn ich etwas diesbezüglich übersehe lasse ich mich gerne eines besseren belehren!
Auch wenn du die so anordnest, wir das nicht funktionieren.
Die Sensoren strahlen eine Keule aus und somit empfangen andere Sensoren das falsche Signal.

Und gleichzeitig geht so erst recht nicht.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

Quote
Gleichzeitig geht def. nicht. Nur rel. schnell hintereinander.
rel schnell hintereinander geht auch nicht. Zwischen einem und anderen US Sensor muß gewartet werden daß das Echo erlischt. Würde keine schnellere US Folge als eine Messung alle 1 bis 2 Sekunden sagen.

Grüße Uwe

HotSystems

rel schnell hintereinander geht auch nicht. Zwischen einem und anderen US Sensor muß gewartet werden daß das Echo erlischt. Würde keine schnellere US Folge als eine Messung alle 1 bis 2 Sekunden sagen.
Naja, 1 bis 2 Sek. ist für das angesprochene Projekt schon rel. schnell. ;)

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi

Wie wäre es mit der Information, WAS Du eigentlich vor hast?
Wie viele Objekte musst Du gleichzeitig erkennen können?
1 -> ALLE US-Sensoren gleichzeitig triggern, die Echos über PCINT auswerten lassen - sobald das erste Echo verstummt, muß nachgeschaut werden, Welcher Eingang bereits LOW ist - die restlichen Interrupts verwerfen bzw. den Interrupt nach der ersten Erkennung abschalten.
In einer Sekunde, bei der nächsten Messung, beginnt das Spiel von Vorne.

MfG

PS: Wobei ich die Sekunde Wartezeit als schon sehr lang ansehe - da der Sensor eine maximale Entfernung von 4 Meter (schlagt mich - müsste nachschauen) aufweist, sollte bei doppelter Entfernung der Schall genügend abgebaut sein, daß Dieser nicht mehr stört - und so langsam ist Schall nun dann doch wieder nicht, daß wir dafür eine ganze Sekunde brauchen.

Aber: Versuch macht Kluch (Versuch macht klug)

Julio26127


Die Idee ist Folgende:

Ich habe eine Wand die durch Vibrationen in Schwingung versetzt wird. Über die von den Ultraschallsensoren gemessenen Abstandsveränderungen möchte ich dann Aussagen treffen können über die auftretenden Schwingungen. Zum Beispiel: Wo schwingt die Wand am meisten?

Tommy56

Hast Du Dir mal Vorstellungen davon gemacht, wie klein die Amplitude der Schwingung der Wand sein wird? Wenn es eine richtige Wand aus Stein ist, dann vermute ich unter 1 mm.
Das kannst Du wahrscheinlich damit nicht erfassen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Julio26127

Ich stimme dir zu, die Amplitude wird vermutlich sehr klein sein und unter Umständen wird das Projekt daran auch scheitern. Ich bin mit dem Sensor aktuell bei einer Genauigkeit vom 0,6mm (Herrstellerangabe: 3mm). Über die Aufschlüsselung der analogen Signale hoffe ich die Genauigkeit noch weiter verbessern zu können. Inwieweit das gelingt bleibt abzuwarten.

agmue

Über die Aufschlüsselung der analogen Signale ...
Da sind wir aber nicht mehr bei dem digitalen Signal ECHO, womit sich die Fragestellung grundlegend verändert.

Wenn Du die Problematik mit dem gestreuten Echo mit einem Trichter in den Griff bekommen solltest, kannst Du 64 Teensys zur Auswertung verwenden, die sind analog anders aufgestellt und etwas schneller.

postmaster-ino

Hi
... bin mit dem Sensor aktuell bei einer Genauigkeit vom 0,6mm (Herrstellerangabe: 3mm).
Was nun gar nicht so uninteressant klingt - darf man erfahren, wie?
Selber bekomme ich im 1-stelligem mm-Bereich Hausnummern - für meine angedachte Anwendung egal, aber wenn's 'ruhiger' geht, wäre Das durchaus eine interessante Anpassung!


Zurück zum Thema:
Wie versetzt Du die Wand in Schwingungen?
Selbst, wenn von der Rückseite Jemand mit dem Vorschlaghammer rumklopt, wird sich, ausgenommen Rigips, nicht Viel auf der Gegenseite zeigen.
Vll. könnten aufgeklebte Piezo-Plättchen dabei mehr Auskunft geben?

MfG

Tommy56

Fällt mir gerade ein - auch Dehnungsmeßstreifen könnte man aufkleben und darüber die Verformung bestimmen. Wobei evtl. sich durch das Verkleben achon wieder die Eigenschaften der Wand ändern.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up