Board Auswahl (UNO/Mega2560) 64 x HCSR04

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.

#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;

}

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

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.

Julio26127:
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.

Julio26127:
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.

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

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!

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!

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.

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

uwefed:
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. :wink:

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)

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?

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

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.

Julio26127:
Ü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.

Hi

Julio26127:
... 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

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

Zunächst schon mal vielen Dank für euer Interesse! Eine Frage habe ich noch:

Wenn alle Sensoren an dem gleichen Trigger Pin liegen und ich eine Vermischung der Echo Signale ausschließen kann (Annahme!) sollten die Messungen doch fast gleichzeitig ablaufen können. Ich verstehe noch nicht so ganz weshalb das unter Berücksichtigung meiner Annahme nicht funktionieren kann.


postmaster-ino:
HiWas nun gar nicht so uninteressant klingt - darf man erfahren, wie?

Die Genauigkeit erreiche ich ausschließlich über die Verwendung eines ausgefeilteren Sketches. Ich habe den Sektch bereits hochgeladen. Weitere Informationen findest du sonst auch auf der erwähnten Internetseite (siehe Anfang).

Tommy56:
Fällt mir gerade ein - auch Dehnungsmeßstreifen könnte man aufkleben und darüber die Verformung bestimmen.

Du hast das Problem bzw. meinen Wunsch schon richtig erkannt. Ich würde die Messungen gerne mithilfe von Ultraschallsensoren lösen. Nach meiner Vermutung werden diese unterschätzt. Eine Durchführung mithilfe von Wirbelstromsensoren würde vermutlich einfacher sein, aber diese sind halt bei weitem nicht so kostengünstig.

agmue:
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.

Könnte ich nicht mehrere Sensoren an einen Teensy hängen?

Hallo,

ja die Aufgabestellung ist wirklich interessant. Wenn ich das richtig verstanden habe, dann willst du Vibration einer Wand mithilfe der Abstandsmessung der US bestimmen. Und zwar flächendeckend. Daher das Sensor Array. Entscheidend wird sein bis zu welcher Frequenz und Amplitude du das benötigst. Dann ist viel entscheidender die Beschaffenheit der Wand. Ein US der entfernungsunterschiede < 0.6 mm erkenne kann. Ist schon Sportlich.

Rechner-wellen

Wenn du mal einen Lautsprecher betrachtest, dann wird dir auffallen das du nur Frequenzen in vorm von bewegung mit dem Auge war nehmen kannst, die sich unter 100 Hertz bewegen. Das nur weil die Amplitude gross genug ist. Das bedeutet das wenn das Auge 24 mal direkt und weiter 24 Mal intuitiv hinschaut. Das du höhere Frequenzen nicht mitbekommst. Du must also Schnelle Abtasten als die Frequenz die du Detektieren willst. Und dann auch noch ein Messverfaren anwenden das durch die Luft die Amplituden Weite messen kann. Also ich denke das Schwingungen unter 10 Herz funktionieren könnten. Aber das bedarf eine genaue Berechnung.

Gruss Temucin alias TFT

Julio26127:
Wenn alle Sensoren an dem gleichen Trigger Pin liegen und ich eine Vermischung der Echo Signale ausschließen kann (Annahme!) sollten die Messungen doch fast gleichzeitig ablaufen können. Ich verstehe noch nicht so ganz weshalb das unter Berücksichtigung meiner Annahme nicht funktionieren kann.

In #2 hatte ich ja einen vergleichbaren Gedanken geäußert.

Problematisch ist die Rechenzeit, die der µC benötigt, um auf Signale reagieren zu können. Da Deine Signale auch fast gleichzeitig eintreffen, brauchst Du ein sehr effizientes Programmkonzept. Mal ein Beispiel: Du liest 64 Bit ein, vergleichst diese mit den vorhergehenden Bits, stellst eine Veränderung fest und speicherst diese 8 Bytes zusammen mit einem Zeitstempel in ein Feld. Erst jetzt kannst Du die nächsten Bits verarbeiten. Reicht dieser Meßtakt aus? Wenn ja, dann Bingo!

Die Komfortfunktion digitalRead brauchst Du nicht zu versuchen, die ist eh zu langsam. Du benötigst auf jeden Fall eine hardwarenahe Programmierung, also die Ports direkt ansprechen. Das läuft unter fast IO.

Hallo,

nochmals vielen Dank für eure Ideen und Gedanken. Ich werde das Projekt in die Tat umsetzen und von meinen Erfahrungen später berichten.

Liebe Grüße

Jojo

Da ich bisher fest der Meinung bin, das lässt sich mit den US-Sensoren so nicht umsetzen, bin ich auf dein Ergebnis sehr gespannt.
Ich lasse mich gern eines Besseren belehren.