Arduino Blutetooth Infraror Sensor

Liebe Freaks 
Ich steure ein Servo an auf dem Servo ist eine Ultraschallsensor installiert. Zusätzlich kommuniziere ich über Bluetooth mit einem Android Handy. Auf dem Handy ist ein Bluetooth Terminal Installiert.
Solange ich über den SerialMonitor Ausgabe funktioniert das Programm super. Wenn ich aber den Wert des Sensors während sich der Servo dreht über bluetooth ausgeben möchte ruckelt der Servo. Die Bluetooth Kommunikation braucht etwas länger. Der Servo wird in einer for schleife angesteuert leider noch mit delays.
Als Lösung wollte ich die werte in der For-Schleife in ein String Array speichern und später ausgeben.
Leider ist das nicht möglich, ich dachte das können nur SuperSchlauen lösen. Ich komme nicht weiter.

Hier die For-Schleife

for(int i=15;i<=195;i=i+3) //links
          { 
            myServo.write(i); 
            delay(20); 
            imsdistanz = berechnung(); 
            Serial.print(i); 
            Serial.print(","); 
            Serial.print(imsdistanz); 
            Serial.print(".");

                //langsame Version über Bluetooth
                if((imsdistanz>0) && (imsdistanz<=150))
                  {
                   btSerial.print("Objekt in Sicht:");
                   btSerial.print(imsdistanz);
                   btSerial.println("cm");
                  } 

                //schnelle Version
               if((imsdistanz>0) && (imsdistanz<=150))
               {
                char* gesichteteobjekte[i]={imsdistanz}; 
               }    
          }

          for(int i=195;i>=15;i=i-3) //rechts
          {  
              myServo.write(i);
              delay(20);
              imsdistanz = berechnung();
              Serial.print(i);
              Serial.print(",");
              Serial.print(imsdistanz);
              Serial.print(".");  
           }

Oder hier der ganze Code

#include <Servo.h>
#include <SoftwareSerial.h>

//pins für bluetooth
#define rxPin 10
#define txPin 11

//pin für LED
#define ledPin 13

// ultrasound giris
const int trigPin = 6;
const int echoPin = 7;

//fuer die berechnung der distanz 
long dauer;
int imsdistanz;

// servo giris (ims Pin)
int servopin = 5;

//Für Prozessing
int distance;

//Nachrichten
int massagestatus=0;
int msg=0;


//String zum testempfangen
String btData;

//Umwandler für Case Schleife
int wert;

//Variable zum Servo ansprechen 
Servo myServo;

//Variable zum mit blzetooth ansprechen
SoftwareSerial btSerial(rxPin, txPin);

void setup() {

Serial.begin(9600);
btSerial.begin(9600);

//Pin Mode definieren für ultrascgall sensor
pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 

//Pin Mode Led
pinMode(ledPin,OUTPUT);

//Seervo Steuerpin  
myServo.attach(servopin); 
}

void loop() {

nachrichten();
  


  btData = btSerial.readString();

  if(btData=="ein"){wert=1;}
  if(btData=="blink"){wert=2;}
  if(btData=="aus"){wert=3;}


        switch (wert){
        case 1:
          digitalWrite(ledPin,HIGH); 
          for(int i=15;i<=195;i=i+3) //links
          { 
            myServo.write(i); 
            delay(20); 
            imsdistanz = berechnung(); 
            Serial.print(i); 
            Serial.print(","); 
            Serial.print(imsdistanz); 
            Serial.print(".");

                //langsame Version
                if((imsdistanz>0) && (imsdistanz<=150))
                  {
                   btSerial.print("Objekt in Sicht:");
                   btSerial.print(imsdistanz);
                   btSerial.println("cm");
                  } 

                //schnelle version
               if((imsdistanz>0) && (imsdistanz<=150))
               {
                char* gesichteteobjekte[i]={imsdistanz}; 
               }    
          }

          for(int i=165;i>=15;i=i-3) //rechts
          {  
              myServo.write(i);
              delay(20);
              imsdistanz = berechnung();
              Serial.print(i);
              Serial.print(",");
              Serial.print(imsdistanz);
              Serial.print(".");  
           }
    
        break;
        case 2:
          digitalWrite(ledPin,HIGH);
          delay(50);
          digitalWrite(ledPin,LOW);
          delay(50);
        break;
        case 3:
          digitalWrite(ledPin,LOW);
        break;
        default:
        break;
        }              
    if(btData=="aus")
    {
      aus();
    }

}




int berechnung(){ 
 
digitalWrite(trigPin, LOW); 
delayMicroseconds(2);

digitalWrite(trigPin, HIGH); 
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
dauer = pulseIn(echoPin, HIGH); 
imsdistanz= dauer*0.034/2; //(s=v*t hin und zurück mit 0.5 multiplizieren)

//return wert fuer prozessing

distance = imsdistanz;

return distance;
}


void nachrichten()
{
   // if(btSerial.available()){ }
  if(massagestatus!=1) 
  {
    btSerial.println(">");
    btSerial.println("------------------------------------");
    btSerial.println("Mit Arduiono Controller verbunden");
    btSerial.println("------------------------------------");
    btSerial.println("warte auf eingabe...");
    massagestatus=1;
  }


}


void objektebestimmen()
{

}

void aus()
{
      digitalWrite(trigPin, LOW);
      digitalWrite(echoPin, LOW); 
      digitalWrite(ledPin,LOW);
      myServo.write(95);
      btSerial.println("Radar Anlage Aus");

}

Willkommen im Forum!

hoju:
... ich dachte das können nur SuperSchlauen lösen.

Da fühle ich mich dann mal nicht angesprochen :frowning:

Daher würde ich mir bei der Bibliothek VarSpeedServo das Beispiel SweepTwoServos als Vorlage nehmen:

void loop() {
  myservo1.write(180,127,false);        // move the servo to 180, fast speed, run background
                                        // write(degrees 0-180, speed 1-255, wait to complete true-false)
  myservo2.write(180,127,true);         // move the servo to 180, fast speed, wait until done
  
  myservo1.write(0,30,false);           // move the servo to 180, slow speed, run in background
  myservo2.write(0,30,true);            // move the servo to 180, slow speed, wait until done
}

Sorry, ich meinte es im positiven Sinne. Das habe ich mir auch schon angesehen. Das Problem ist dabei ich muss immer die Aktuelle Position vom Servo wissen. Damit ich es weitergeben kann für eine Grafische darstelleng des Ultraschallsensors 

Was hältst Du von read() - Gets the last written servo pulse width as an angle between 0 and 180.?

Ich verstehe es nicht ganz. Sorry bin Müde. Das ist genau wie ich es gedacht habe  oder ich mache einen Fehler. Wenn ich read() verwende bekomme ich die End Position. Ich möchte aber hingegen wenn der Servo auf 10 ist den wert 10 haben und nicht den Schluss wert. Zum testen habe ich es in einem mini script getestet ich bekomme erst das Schlussresultat. Beispiel wenn der Servo auf 180 steht bekomme ich 180. Wenn ich eine Bewegung mache um 1 erhöhe dann möchte ich eine Signal vom Ultraschallsensor schicken empfangen auswerten und ausgeben und bei der nächsten Bewegung das gleiche.

#include <VarSpeedServo.h>

VarSpeedServo myservo; // create servo object to control a servo
int wert;

void setup() {
Serial.begin(9600);
myservo.attach(5); // attaches the servo on pin 9 to the servo object
}

void loop() {
myservo.write(180, 30, true); // move to 180 degrees, use a speed of 30, wait until move is complete links
wert=myservo.read();
Serial.println(wert);
myservo.write(15, 30, true); // move to 0 degrees, use a speed of 30, wait until move is complete rechts
wert=myservo.read();
Serial.println(wert);
}

Kann mir da niemand weiterhelfen 
Wo sind die Superschlauen?

hoju:
Wo sind die Superschlauen?

Die gibt es hier nicht!

Ich frage mich, wenn du dem Servo mitteilst, er soll auf 180 laufen, warum musst du nochmal nachfragen?

Der Servo läuft doch so lange bis er die Position erreicht hat.
Oder glaubst du dem nicht?

Dann solltest du deinen Sketch komplett überarbeiten.

Ich möchte nicht nachfragen ob der Servo 180 erreicht hat. Es geht darum das wenn ich das ganze in einer for Schleife mache und der Ultraschall-Sensor das auf dem Servo installiert etwas misst kann ich ganz genau sagen in welcher Richtung das Objekt ist. Beispiel bei der Servobewegung 5 wird das Ultraschall zurück reflektiert, dann weis ich das bei 5 etwas ist. Hingegen bei der Vorgeschlagenen Lösung kann ich das nicht, dort kann ich nur den Endwert auslesen. Wie du gesagt hast kenne ich den Endwert schon.

Ich bin mir sicher das es lösbar ist und Danke den Kollegen im Voraus

Ich befürchte, da überschätzt du die Technik des US-Sensors.

Ich hoffe nicht, du meinst der Servo kann ständig drehen und dann kann der US-Sensor dir was melden.

Du hast doch einen Wert den du dem Servo mitgibst. Diesen Wert speicherst du und wenn der Sensor etwas meldet, kannst du den Wert aus dem Speicher holen.

Ich denke ich konnte mein Problem nicht gut schildern.

„Ich befürchte, da überschätzt du die Technik des US-Sensors.“

Lieber Kollege, ich überschätze den Ultraschallsensor nicht. Das was ich geschrieben habe funktioniert auch wenn ich die Daten über Serial schicke und empfange. Siehe Video

(ohne das die Ultraschall Daten an Handy
weitergegeben werden)

Sobald ich aber die Daten die ich gemässe habe über Bluetooth an ein Handy übertrage funktioniert es nicht mehr so gut wegen der Übertragung über Bluetooth. Hier ein Beispiel beim senden der Daten auf das Handy in einer for Schleife (links Bewegung), bei der Rechtsbewegung habe ich es weggelassen.
Siehe Video

(US-Sensor wird an Handy weitergegeben)

hoju:
Ich denke ich konnte mein Problem nicht gut schildern.

Das befürchte ich auch.
Du solltes einfach nochmal versuchen zu erklären, wie der Ablauf sein soll.
Und bitte keine Videos, da habe ich keine Lust drauf.

So wie ich es verstanden habe, möchtest du, während der Servo dreht, per US-Sensor die Umgebung checken.

for(int i=15;i<=195;i=i+3)//Lieber Kollege das ist die Links Bewegung des Servos. Weiter unten gebe ich den Wert aus über Bluetooth weiter an das Handy.

{
myServo.write(i);
delay(20);
imsdistanz = berechnung();
Serial.print(i);
Serial.print(",");
Serial.print(imsdistanz);
Serial.print(".");

//hier wird es wegen bluetooth langsamer
if((imsdistanz>0) && (imsdistanz<=150))
{
btSerial.print(“Objekt in Sicht:”); // Genau diese Ausgabe bremst den Servo so das es Rattert. Hier wird die Distanz zum Objekt an am Handy ausgegeben. So weiss ich genau bei i=15 in der Forschleife das sich dort was befindet.
Deswegen haben ich die Forschleife gewält. Mit der VarSpeedServo Bibliothek funktioniert das leider nicht so weil read(); mit den Schlusswert des Servos gibt und nicht die Aktuelle Posotion. Durch die Aktuelle Position weiss ich falls der Ultraschallsensor etwas erfasst wo es ist. Das Video würde ich mir mal ansehen, wäre dir Dankbar. Man sieht dort was ich meine.

btSerial.print(imsdistanz);
btSerial.println(“cm”);
}
}

for(int i=165;i>=15;i=i-3) //rechts
{
myServo.write(i);
delay(20);
imsdistanz = berechnung();
Serial.print(i);
Serial.print(",");
Serial.print(imsdistanz);
Serial.print(".");
}

Deswegen wollte ich zuerst genau dort wo die Bluetooth Ausgabe stattfindet die wert in ein Array (PHP), C ist es ein String speichern. Dan wurde mir die VarSpeedServo Bibliothek vorgeschlagen was mir nicht weiterhilft. Ich möchte die Werte in einem String Speichern also in der oberen For-Schleife wären das 195 Einzelwert und diese später ausgeben damit der Servo nicht Blockiert wird.

Hast du es denn mal mit einer anderen "Servo-Library" versucht?

Die Anweisung "read()" sollte schon richtig sein und funktionieren.
Auch die Library "VarSpeedServo" hat die Anweisung, evtl. solltest du es damit mal testen.

Eine andere Idee habe ich nicht.

um read zu verwenden, solltest du den Servo mit false parameter im background drehen lassen.

Sonst warten der Sketch bis er in Sollstellung ist und gibt dir diese mit read aus.

for Schleifen sind für sowas ungeeignet

Ich habe es getestet, bin am Verzweifeln.
Habe es Test Programm geschrieben. Ich bekomme wieder nur den Wert der EndPosition

Code:

#include <VarSpeedServo.h>

VarSpeedServo myservo;
#define servoPin 8

int aktuellerstand;

void setup() {
Serial.begin(9600);
myservo.attach(servoPin);
}

void loop() {
myservo.write(180, 200, false); //geschw 30-255
aktuellerstand=myservo.read();
Serial.print(“Akteuller Stand 1:”);
Serial.println(aktuellerstand);
delay(1000);
myservo.write(0, 200, false);
aktuellerstand=myservo.read();
Serial.print(“Akteuller Stand 2:”);
Serial.println(aktuellerstand);
delay(1000);
}
Serial:
Akteuller Stand 2:180
Akteuller Stand 1:0
Akteuller Stand 2:180
Akteuller Stand 1:0
Akteuller Stand 2:180
Akteuller Stand 1:0
Akteuller Stand 2:180
Akteuller Stand 1:0
Akteuller Stand 2:180
Akteuller Stand 1:0
Akteuller Stand 2:180
Akteuller Stand 1:0

Ich möchte hingegen bei der Drehbewegung folgende Ausgabe haben:
Akteuller Stand 1:0
Akteuller Stand 1:1
Akteuller Stand 1:2
Akteuller Stand 1:x

Kann mit dann niemand helfen… :confused:


Als zweites Projekt kommt dann noch das Empfangen und auswerten von RC Empfänger. Habe gesehen das viele Mühe haben…

hoju:
Kann mit dann niemand helfen.... :confused:


Als zweites Projekt kommt dann noch das Empfangen und auswerten von RC Empfänger. Habe gesehen das viele Mühe haben…

Da musst du schon genauer werden.

Was sind das für RC Empfänger?

Und von Empfängern kannst du nichts auswerten, nur von Sendern.

Ich möchte folgendes machen:

Das ist jedoch das zweite Projekt. Zuerst möchte ich das mit dem Ultraschall Sensor und Bluetooth Übertragung abschliessen. Habe noch keine Lösung. Das Vorgeschlagene funktioniert nicht.