HC SR04 wie Ping stoppen?

Hallo erstmal im Forum!

Ich bin ziemlicher Neuling im Bereich Arduino und habe folgendes Problem:
Ich möchte einen Ultraschall MIDI Controller bauen und eigentlich funktioniert auch alles recht ordentlich.
Nur bekomm ich es einfach nicht hin, dass der Sensor ausschließlich dann Signale ausließt wenn auch "etwas" da ist.

Also beispielsweise:nur wenn (if) Sensorwert <= 200 , soll das Signal ausgelesen werden. Alle Bereiche darüber werden ignoriert und es wird auch keine Value0 gesendet.

Ich hoffe ich hab mich einigermaßen verstädnlich ausgedrückt und danke schonmal :slight_smile:

#include <NewPing.h>

#define TRIGGER_PIN  12  
#define ECHO_PIN     11  
#define MAX_DISTANCE 50 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  Serial.begin(9600);
}
void loop() {
  //    CC(0, 1, 2);
  delay(29);                      
  unsigned int uS = sonar.ping(); 
  int ccVal = uS / US_ROUNDTRIP_CM;
  int scaled = map(ccVal, 0, 50, 0, 127);
  CC(0, 1, scaled);

  }
void CC(int ChannelByte, int ControlNumber, int ControlValue) {
  Serial.write(ChannelByte + 0xb0);
  Serial.write(ControlNumber);
  Serial.write(ControlValue);
}

So wie du das möchtest, bzw. wie ich deine Frage verstehe, geht es nicht.
Den Ping stoppen geht nicht, dann kann er nicht mehr messen.

Der Sensor muss immer seinen Ping absetzen und wieder empfangen, ohne dies weiß er ja nicht, wie die Entfernung ist.

Du kannst nur die gemessene Entfernung auswerten.

Z.B. so:

  if (ccVal>= 0 || ccVal<= 200)
  {
    Serial.print(ccVal);
    Serial.println(" cm");
  }

Hey Thanks erstmal!

Also das akute Problem ist folgendes:

Wenn ich mit mehreren Sensoren beispielsweise Ableton ansteuern möchte, (über Hairless Bridge) "senden" alle Sensoren gleichzeitig und andauernd mindestens den Wert 0 (von 0-127). Somit lässt sich die Midi Automapping Funktion in Ableton nicht nutzen, da es nicht möglich ist einzelne Controller (Sensoren) zuzuweisen :slight_smile:
Hab Online noch einen Code gefunden, bei dem das so funktioniert, wie ich mir das vorstell.
Wenn ich da mit der Hand einen Abstand festlege bleibt der Wert wenn ich die Hand wegzieh dort stehen und sendet kein Signal bis zur nächsten Bewegung. Allerdings wurde der ohne NewPing geschrieben und ich bekomm nicht mehr als einen Sensor stabil zum laufen...

int controlChange = 176;
int controllerNummer = 21;
int triggerPin = 2;
int echoPin = 3;

void setup() {
 Serial.begin(9600);
 
 pinMode(triggerPin, OUTPUT);
 pinMode(echoPin, INPUT);

}

void loop() {
 digitalWrite(triggerPin, LOW);
 delayMicroseconds(2);
 digitalWrite(triggerPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(triggerPin, LOW);

 
 long sensorWert = pulseIn(echoPin, HIGH);
 if (sensorWert <= 2500) {
 int sensorMIDI = map(sensorWert,2500,200,0,127);
 sendeMIDI(controlChange, controllerNummer, sensorMIDI);

 }
 }
void sendeMIDI(int statusByte, int dataByte1, int dataByte2) {
 Serial.write(statusByte);
 Serial.write(dataByte1);
 Serial.write(dataByte2);
}

Sorry für die etwas unprofessionelle Ausdrucksweise, als Anfänger fällt es schwer die korrekten Worte zu finden. Irgendwie hab ich gerade auch ein riesen Brett vor der Rübe :frowning:

Jamnberlin:
Hey Thanks erstmal!

Also das akute Problem ist folgendes:

Wenn ich mit mehreren Sensoren beispielsweise Ableton ansteuern möchte, (über Hairless Bridge) "senden" alle Sensoren gleichzeitig und andauernd mindestens den Wert 0 (von 0-127). Somit lässt sich die Midi Automapping Funktion in Ableton nicht nutzen, da es nicht möglich ist einzelne Controller (Sensoren) zuzuweisen :slight_smile:
Hab Online noch einen Code gefunden, bei dem das so funktioniert, wie ich mir das vorstell.
Wenn ich da mit der Hand einen Abstand festlege bleibt der Wert wenn ich die Hand wegzieh dort stehen und sendet kein Signal bis zur nächsten Bewegung. Allerdings wurde der ohne NewPing geschrieben und ich bekomm nicht mehr als einen Sensor stabil zum laufen...

Sorry für die etwas unprofessionelle Ausdrucksweise, als Anfänger fällt es schwer die korrekten Worte zu finden. Irgendwie hab ich gerade auch ein riesen Brett vor der Rübe :frowning:

Ja und mir fällt es schwer zu verstehen, was du machen möchtest.

Ich weiß auch nicht, was "Ableton" ist.

Bitte erkläre doch mal mit wenigen aber genauen Worten, was du machen möchtest.
Ich bin sicher, das lässt sich lösen.

Und was möchtest du mit dem "Map"-Befehl in deinem Sketch erreichen?

Danke erstmal für deine Geduld :slight_smile:

Der Map Befehl rechnet die ausgelesenen Werte auf 0-127 runter um sie Midi kompatibel zu machen (7bit).

Ableton ist eine Sequenzersoftware für die Musikproduktionen. um die Software zu steuern nutzt man gerne Midicontroller. Beispielsweise als Hardware Fader, Button oder Potentiometer um diverse Softwareparameter wie Lautstärke, Filter etc. zu steuern.
Um die Controller nutzen zu können, gibt es eine hilfreiche Funktion, das sogennante Automapping.
Damit kann man in der Software beispielsweise einen (virtuellen) Knopf markieren und diesen einem angeschlossenen Midicontroller zuweisen.

Und genau da liegt das erste Problem. Da bei dem ersten Code den ich gepostet habe, ja andauern gesendet wird (Werteänderung) ist es nicht möglich die Sensoren, sobald mehr als einer ins Spiel kommt unabhängig voneinander zuzuweisen.

Beispiel: Code mit 3 HC SR04 Sensoren:
Wenn ich die Lautstärke in Ableton mittels meinem Sensor 1 steuern möchte und dafür Sensor 1 über die Automapping Funktion zuweisen möchte, werden sofort auch die beiden anderen Sensoren 2 und 3
mit zugewiesen, da sie ja ständig ein (Midi)signal senden (0-127).

in dem Code aus meinem zweiten Beitrag wird dies ja folgendermaßen unterbunden:

long sensorWert = pulseIn(echoPin, HIGH);
 if (sensorWert <= 2500) {
 int sensorMIDI = map(sensorWert,2500,200,0,127);
 sendeMIDI(controlChange, controllerNummer, sensorMIDI);

 }

ausserdem ist es bei diesem zweiten Code so, dass der zuletzt erfasste Wert des Sensors bestehen bleibt bis der Sensorer einen neuen Wert innerhalb des definierten Bereiches erfasst. (
Wenn ich mit meiner Hand zB.den Wert 113 auslöse und die Hand zur Seite wegziehe, bleibt der Wert 113 bestehen, bis ich mit der Hand einen anderen Wert auslöse).
Auch das bekomme ich nicht hin. da fehlt auch einfach noch viel an Verständnis.

Puh ich versteh mich ja selber fast nicht. Vielleicht versuch ichs lieber morgen nochmal zu erklären :frowning:

Ok, ich glaube es zu verstehen.

Dann ist bei deinem Sketch nur das Problem noch zu lösen, du musst die Sensoren einfach einzeln ansprechen und auswerten.

Beispiel, nicht getestet:

 digitalWrite(triggerPin1, LOW);
 delayMicroseconds(2);
 digitalWrite(triggerPin1, HIGH);
 delayMicroseconds(10);
 digitalWrite(triggerPin1, LOW);

 long sensorWert1 = pulseIn(echoPin1, HIGH);

 digitalWrite(triggerPin2, LOW);
 delayMicroseconds(2);
 digitalWrite(triggerPin2, HIGH);
 delayMicroseconds(10);
 digitalWrite(triggerPin2, LOW);

 long sensorWert2 = pulseIn(echoPin2, HIGH);

 digitalWrite(triggerPin3, LOW);
 delayMicroseconds(2);
 digitalWrite(triggerPin3, HIGH);
 delayMicroseconds(10);
 digitalWrite(triggerPin3, LOW);

 long sensorWert3 = pulseIn(echoPin3, HIGH);

 digitalWrite(triggerPin4, LOW);
 delayMicroseconds(2);
 digitalWrite(triggerPin4, HIGH);
 delayMicroseconds(10);
 digitalWrite(triggerPin4, LOW);

 long sensorWert4 = pulseIn(echoPin4, HIGH);

Und mit den Ergebnissen deine Berechnung anstellen.
Du musst natürlich auch die richtigen Pins zuweisen.

Und wenn's nur um's Automapping geht: mach doch die Zuweisung einfach mal manuell - das geht in Ableton auch!