Go Down

Topic: Probleme HC 05 Modul und MIT App Inventor 2 (Read 59 times) previous topic - next topic

nicfa98

Sep 23, 2020, 09:31 pm Last Edit: Sep 23, 2020, 09:45 pm by nicfa98
Servus zusammen,
ich bin ein 22-jähriger Maschinenbau-Student der in seiner Freizeit mittels Arduino seinen 3D-Druck Projekten ein Leben einhaucht. Vielen Dank für die Aufnahme ins Forum!
Zu meinem Problem:
Ich möchte über eine mit dem MIT App Inventor 2 programmierte App Werte auf meinen Arduino senden. Die Werte werden mittels eines Sliders von 1000 bis 1180 verändert. Mithilfe dieser Werte soll später ein Servo gesteuert werden. So weit, so einfach (wie bereits in zahlreichen YouTube Videos gesehen).
Leider empfange ich auf meinem Arduino Nano jedoch andere Werte (im seriellen Monitor), als die, die gesendet werden. Baud-Rate wurde sowohl im Quell-Text als auch auf dem verwendeten HC 05 Modul auf 9600 eingestellt. Bewege ich den Slider zwischen den Werten 1000 und 1180, spuckt der serielle Monitor so etwas aus:
21:23:10.855 -> 4
26
21:23:10.901 -> 4
21:23:10.901 -> 30
21:23:10.901 -> 4
21:23:10.901 -> 35
21:23:10.901 -> 4
43
21:23:10.927 -> 4
48
21:23:10.960 -> 4
21:23:10.960 -> 52
21:23:10.960 -> 4
55
21:23:10.994 -> 4
59
21:23:11.028 -> 4
21:23:11.028 -> 62

Eingelesen werden die Werte mit folgendem Befehl:

Code: [Select]
// Libraries hinzufügen
#include <Adafruit_PWMServoDriver.h> //Adafruit Library
#include <SoftwareSerial.h> //Bluetooth Library


Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

// Bluetooth Zuweisung
SoftwareSerial bluetooth(10,11); // Zuweisung der Bluetooth-Pins

// Festlegung von Parametern
#define ServoMin 0 //geringste Servo-Pulsrate
#define ServoMax 500 // höchste Servo-Pulsrate
#define Servo_Freq 50 // Frequenz des PWM Signals

  void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
 
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= Servo_Freq;   // Analog servos run at ~60 Hz updates
  Serial.print(pulselength); Serial.println(" us per period");
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit");
  pulse *= 1000000;  // convert input seconds to us
  pulse /= pulselength;
  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
  }
 
void setup() {
  Serial.begin(9600); // Baud-Rate USB-Port
  bluetooth.begin(9600); // Baud-Rate Bluetooth-Modul
  Serial.println("BTserial mit Baud-Rate 9600 gestartet");
 
  pwm.begin();
  pwm.setOscillatorFrequency(27000000);
  pwm.setPWMFreq(Servo_Freq); // Frequenz des PWM Signals wird festgelegt
  Serial.println("Setup abgeschlossen");

  //Grundstellung einstellen
  pwm.setPWM(0,0,250);
  pwm.setPWM(1,0,250);
  pwm.setPWM(2,0,250);
  pwm.setPWM(3,0,250);
  Serial.println("Servogrundstellung eingestellt");
  }


void loop() {
  if(bluetooth.available()>2)
  {
    int c = bluetooth.read();
    Serial.println(c);
      if (c >= 1000 && c <1180)
    {
      int cneu= (c- 1000)*(ServoMax/180);
      Serial.println("Servo 1 im Einsatz");
      pwm.setPWM(0,0,cneu);
      delay(10);
    }
   }
}



Verwendete Hardware:
AZ-Delivery Arduino Nano V3.0
AZ-Delivery HC 05 HC 06 Modul
Samsung Galaxy Tab S6
Servo-Board Adafruit PCA6569

Vielen Dank für eure Unterstützung!!!

Tommy56

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

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

nicfa98

Danke Tommy, für deine Korrektur. Wurde übernommen.

Doc_Arduino

#3
Sep 23, 2020, 10:27 pm Last Edit: Sep 23, 2020, 10:36 pm by Doc_Arduino
Hallo,

ein Problem steckt in der Einlesefunktion. Ob danach noch mehr Fallen lauern wird sich rausstellen.

Code: [Select]

  if(bluetooth.available()>2)
  {
    int c = bluetooth.read();
    Serial.println(c);
      if (c >= 1000 && c <1180)
    {
      int cneu= (c- 1000)*(ServoMax/180);
      Serial.println("Servo 1 im Einsatz");
      pwm.setPWM(0,0,cneu);
      delay(10);
    }
   }


Warum liest du den Buffer erst ab dem 3. Zeichen aus?
Ein eingelesenes Zeichen kann nicht 1000 oder 1180 sein.
Ein eingelesenes Zeichen kann nur ein Zeichen sein, genau genommen ein Zeichen aus der ASCII Tabelle.
Das mit dem 3. Zeichen hängt bestimmt damit zusammen das du denkst du kannst so Werte von 1000 oder 1180 einlesen. Das klappt aber so nicht. Man liest Zeichen für Zeichen ein, muss sie praktisch erstmal der Reihe nach einsammeln, wenn das Ende erkannt wird, dann muss das Gesammelte auswerten und ggf. umwandeln.

Als gute Standardgrundlage hat sich im Forum folgender Code bewährt.
Code: [Select]

const byte RX_BUFFER_SIZE = 32;
char rxBuffer[RX_BUFFER_SIZE];   // an array to store the received data

void setup()
{
  Serial.begin(9600);
  Serial.println("\nSTART");
}

void loop()
{
  if (readSerial() )
  {
    showData();
  }
}


bool readSerial()
{
  static byte index = 0;
  bool state = false;
  
  if (Serial.available() )     
  {
    char c = Serial.read();

    if (c >= 32 && (index < RX_BUFFER_SIZE - 1) )
    {
      rxBuffer[index++] = c;
    }
    else if (c == '\n' || '\r')
    {
      rxBuffer[index] = '\0';   // terminate the string
      index = 0;
      state = true;
    }
  }

  return state;
}


void showData()
{
   Serial.println(rxBuffer);
}


Probiere das einmal aus mit dem IDE Terminal, gib paar Werte und Zeichen ein und drücke Enter. Adaptiere es für dich. Tipp, lass deine App am Ende ein eindeutiges Endezeichen senden, am einfachsten Newline o.a.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up