Bitte um Hilfe bei Servo und ultrasonic

Hallo Zusammen,
ich benötige eure hilfe was das coden für ein kleines Projekt angeht.

Folgender Aufbau:
Ich habe ein Arduino Uno Board, einen Servo und ein Ultrasonic und ein Piezo.
Ich möchte den Ultrasonic auf dem Servo anbringen und folgendes Programmieren.
Der Servo soll bei z.B. 0Grad - 20Grad - 40Grad, 60Grad, 80Grad, 100Grad, 120Grad und 140Grad stehenbleiben.

Genau an diesen Werten soll der Ultrasonic seine Messung erst anfangen.
Außerdem will ich dem System sagen können dass es Werte von der Tastatur einlesen kann. Z.B. A=0Grad und B=20Grad, c=40Grad.........

Und das Resultat soll soll folgendermaßen aussehen. Ich gebe im Serial Motor ein: A B C und dann wieder A. Der Servo bewegt sich.
Ultrasonic misst an diesen Werten und gibt einen Ton raus.
Aber.........wenn er von A nach B geht soll er in den Gradwerten 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 eben nichts messen und
keinen Ton rausgeben.

Ich habe ein Arduino Audio Code beispiel bei dem er entsprechend der Entfernungsmessung vom Ultrasonic einen Ton rausgibt.
Z.B. 0Grad - ein Holzbalken in 10 cm Entferung und er gibt einen C Ton raus.......
10 Grad - ................................................D Ton raus....

die Töne habe ich vorher deklariert.....also:

#define Not_C 262
#define NiteD 294

...ich habe auch ein Code Beispiel im Internet gefunden aber nun muss nur noch der Servo und meine Wünsche von oben mitreingnommen werden.

#define NOTA_DO  262
#define NOTA_RE  294
#define NOTA_MI  330
#define NOTA_FA  349
#define NOTA_SOL 392
#define NOTA_LA  440
#define NOTA_SI  494

int pinoGatilho = 2;
int pinoEco = 3;
int pinoBuzzer = 9;
int valor = 0;
int nota = 0;
int intervalo_distancia = 7;

void setup() {
  pinMode(pinoGatilho, OUTPUT);
  pinMode(pinoEco, INPUT);
  pinMode(pinoBuzzer, OUTPUT);
}

void loop() {
  long duration, inches, cm;
  digitalWrite(pinoGatilho, LOW);
  delayMicroseconds(2);
  digitalWrite(pinoGatilho, HIGH);
  delayMicroseconds(5);
  digitalWrite(pinoGatilho, LOW);
  duration = pulseIn(pinoEco, HIGH);
  cm = microsecondsToCentimeters(duration);
  if (cm > (intervalo_distancia * 0) && cm < (intervalo_distancia * 1)) {
    nota = NOTA_DO;
  } else if (cm >= (intervalo_distancia * 1) && cm < (intervalo_distancia * 2)) {
    nota = NOTA_RE;
  } else if (cm >= (intervalo_distancia * 2) && cm < (intervalo_distancia * 3)) {
    nota = NOTA_MI;
  } else if (cm >= (intervalo_distancia * 3) && cm < (intervalo_distancia * 4)) {
    nota = NOTA_FA;
  } else if (cm >= (intervalo_distancia * 4) && cm < (intervalo_distancia * 5)) {
    nota = NOTA_SOL;
  } else if (cm >= (intervalo_distancia * 5) && cm < (intervalo_distancia * 6)) {
    nota = NOTA_LA;
  } else if (cm >= (intervalo_distancia * 6) && cm < (intervalo_distancia * 7)) {
    nota = NOTA_SI;
  } else {
    nota = 0;
  } 

  if (nota) {
    tone(pinoBuzzer, nota);
  } else {
    noTone(pinoBuzzer);
  } 
  delay(100);
} 

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

Ist jemand bereit dazu mir zu helfen?
Viele Dank im voraus
Al

thewhitesmoke:
Ist jemand bereit dazu mir zu helfen?
Viele Dank im voraus

Dafür sind wir ja hier angemeldet, um Hilfe zu geben und Hilfe zu bekommen. :wink:
Erst einmal solltest du strukturiert an die ganze Sache herangehen - selbst dein niedergeschriebenes Posting sieht noch mächtig chaotisch aus. Das solltest du hinsichtlich der Lesbarkeit noch ändern, überflüssige Leerzeilen rausnehmen, Codebeispiele in entsprechende Tags setzen usw..

Wenn du also einem "Ultrasonic" schreibst, meinst du sicher einen Ultraschall-Entfernungsmesser. Dazu bräuchte man zumindest die konkrete Produktbezeichnung, weil man dir sonst hinsichtlich der Ansteuerung und Auswertung keine Hilfe leisten kann.
Grundsätzlich würde ich das ganze in einzelne Funktionen gliedern, die dann in der loop() aufgerufen werden. Diese Funktionen wären dann zum Stellen des Servos, zum Messen der Distanz und dann in Abhängigkeit von der Distanz das Abspielen des Tones. Die Herangehensweise ist unkritisch, ob du nun zuerst das Abspielen programmierst oder die Auswertung der Eingaben über die serielle Schnittstelle. Aber immer Schritt für Schritt weiterarbeiten, nicht alles zeitgleich übers Knie brechen. Das führt üblicherweise (zumindest bei Anfängern) nicht zum Erfolg.

Ich würde damit beginnen, die Eingaberoutine zu entwerfen, dazu findet man in den mitgelieferten Beispielen schon gute Anhaltspunkte.

Hallo thewhitesmoke
Hab mir als Moderator die Freihet erlaubt, den Beitrag etwas besser zu formattieren, Leerzeilen rauszunehmen und CODE-Tags einzufügen. :wink:

Es gibt verschiedene Ultraschall-Entfernungsmesser. Solche die autonom kontinuirlich messen und solche bei denen Du eine Messung starten mußt. Ich weiß nicht, was Du hast da Du das Modell nicht genannt hast.
Versuch Das Problem in kleinen Schritten anzugehen:

  • Ansteuerung un Messung des Abstandes mit dem Sensor
  • bewegung des Servo
  • Einlesen von Buchstaben über serielle Schnittstelle und Vergleich
  • Töne ausgeben

Und dann fügst du alles Stückweise zusammen.

Viele Grüße Uwe

Hallo,

erstmal danke für die Formatierung.

Es handelt sich um einen Servo mit der Bezeichnung : RS-2 und

Einen Ultraschallmesser mit der Bezeichnung HC-SR04

Ich werde mal versuchen den gegebenen Weg zu gehen.

Ich suche nun nach tutorials für diese 4 Punkte die ich dann noch zusammenfügen muss.

Mit dem Servo habe ich bereits bewegungen hinbekommen. Hierzu habe ich diesen Code benutzt. Dieser Code funktioniert auch, aber sobald ich diesen in den schon oben angefügten Code an die jeweiliegen Stellen anfüge dann bewegt sich nur der Servo....komischerweise funktioniert dann nicht mehr die Ultraschallmessung und die damit verbundene Tonausgabe.
Außerdem möchte ich ja wie erwähnt das der Schallmesser eben nur an mit vorgegebenen Punkten anfängt zu messen. Bisher misst er einfach überall aber nich bei 0Grad...dann erst bei 20Grad...

#include <Servo.h> 
Servo myservo; 
int servoPin = 10; 

void setup(){
myservo.attach(10);  
}

void loop() { 
myservo.attach(servoPin, 771, 1798);
myservo.write(10); // Min
delay(2000);
myservo.write(20); // Min
delay(2000);
myservo.write(30); // Min
delay(2000);
myservo.write(40); // Min
delay(2000);
myservo.write(50); // Min
delay(2000);
myservo.write(60); // Min
delay(2000);
}

Gruß
Al

Die delay() Funktion zu verwenden ist bei sowas immer ungünstig, denn damit wartet Dein programm immer 2 komplette Sekunden, ohne irgendetwas zu machen.
Ich würde das Messen und Ton ausgeben in eine Funktion auslagern. Dann kannst Du in Deiner Loop, nachdem Du den nächsten Punkt mit dem Servo angefahren hast, die Funktion aufrufen, welche die Entfernung misst und für eine Zeit X den passenden Ton ausgibt. Wenn die Funktion zurückkehrt in die loop() macht das Programm weiter mit dem nächsten Punkt.
Wenn alles durchgelaufen ist, fängt loop() wieder von vorn an und Dein Servo läuft wieder zum ersten Punkt.

Ich gehe mal davon aus, dass dies ein Codeschnipsel aus den Weiten des Internets ist. Und da liegt auch schon das eigentliche Problem:

thewhitesmoke:
Ich suche nun nach tutorials für diese 4 Punkte die ich dann noch zusammenfügen muss.

Sowas wird es nicht geben. Solange man nicht die Grundlagen beherrscht, ist das Copy&Paste-Prinzip unbrauchbar, da immer Anpassungen an die eigenen Ideen notwendig sind.
Die Auswertung des Sensors scheint ja recht einfach zu sein, dazu habe ich hier etwas gefunden: http://www.robodino.de/2011/12/arduino-ardublock-ansteuerung-ultraschall-sensor.html Hier könnte man auf die Funktion schon mal zurückgreifen.

sth77:
Ich gehe mal davon aus, dass dies ein Codeschnipsel aus den Weiten des Internets ist. Und da liegt auch schon das eigentliche Problem:

thewhitesmoke:
Ich suche nun nach tutorials für diese 4 Punkte die ich dann noch zusammenfügen muss.

Sowas wird es nicht geben. Solange man nicht die Grundlagen beherrscht, ist das Copy&Paste-Prinzip unbrauchbar, da immer Anpassungen an die eigenen Ideen notwendig sind.
Die Auswertung des Sensors scheint ja recht einfach zu sein, dazu habe ich hier etwas gefunden: http://www.robodino.de/2011/12/arduino-ardublock-ansteuerung-ultraschall-sensor.html Hier könnte man auf die Funktion schon mal zurückgreifen.

Hallo,
das sollte sich aber erstmal nicht anhören als würde ich nicht lernen wollen. Muss muss sich dochmal in die Lage eines Anfängers setzten.

Ich lerne am meisten wenn ich Projekte mit anderen bespreche und langsam das ganze aufbaue....eben mit hilfe.

Ich denke dass es einige gibt die so am besten lernen und nicht nur in der Art die Theorie sich reinzuziehen.

Desweiteren habe ich mir den Code von dem Link angeschaut. Mir als Anfänger fällt auf, dass gar kein Pin angegeben ist an dem der Ultrasonic angeschlossen ist.

Woran erkennt das System denn die Konstellation. Beim Aufrufen des Codes zeigt der Serial Monitor nur Entfernung=0 an.

Komisch, oder??

Gruß
Al

Das hast du missverstanden. Das ist ja Code, der durch diese Blockdarstellung automatisch generiert wurde. Es ist nicht sinnvoll, die Pins bei jedem Aufruf neu zu deklarieren, das kann man ebenso gut in der setup()-Routine machen. Hier werden der Funktion aber zwei Werte trigPin und echoPin übergeben, das sind die Pinnummern, die du vermisst hast.

[edit] Zur Verdeutlichung, wie ich diesen Code umschreiben würde:

int Entfernung;
int trigPin = 5;
int echoPin = 6;

int getDistance(){
  int duration;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  return duration;
}
 
void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW );
}
 
void loop(){
  Entfernung = getDistance();
  Serial.print("Entfernung = ");
  Serial.print(Entfernung);
  Serial.println("");
  delay(1000);
}