HM-10 Modul Verbindungsprobleme, Terminal funktioniert jedoch, brauche Hilfe

Hallo Liebe Community,

ich bin neu hier und probiere mich für den Start an einem SMARS Roboter.
Der Roboter ist fertig, die Motoren laufen über einen 1508a driverboard problemlos, wenn ich sie mit dem eingebauten Nano über die PINs (IN1-4) anspreche.

Nun habe ich ein HM-10 original (kein Klon) Modul. Dessen TX Pin habe ich am Nano mit Pin 2 verbunden. Der RX Pin des Moduls geht über einen Spannungsteiler(mit 1k/2k) an den PIN 3 des Nano, und der weiterführende Spannungsteiler natürlich an Ground.

Mit dem einbinden der Dabble Bibliothek wollte ich das ganze Fernsteuern. Ich kann mich mit dem HM-10 Modul in der APP verbinden, es kommen jedoch keine Steuerbefehle durch. IPhone wird genutzt. (Iphone 12pro)

Wenn ich das HM-10 Modul mit TX an TX und RX an RX des Arduinos verbinde (RX immer mit Spannungsteiler natürlich) kann ich im Seriell-Monitor mit den AT Befehlen das Modul Programmieren. Hier habe ich ROLE auf 0, den PIN auf 000000 und die Baudrate auf 0 (was 9600 entpsricht). Diesen Wert habe ich auch in meinem Code eingebunden unter Serial.begin(9600) sowie in die Dabble.begin(9600). Ich habe auch schon andere Baudraten wie 38400 probiert. Ändert aber an meinem Problem nichts. Es kommen einfach keine Befehle von der App am Nano an.

Wenn ich das Modul mit TX an RX des Nano und RX an TX des Nano anschließe, und bei Dabble.begin(9600,0,1) nutze, funktioniert es auch nicht. Ich sehe zwar im Serialmonitor vierecke runterrieseln, die zu Fragezeichen werden wenn ich bei Dabble eine Eingabe mache, mehr aber nicht.

Was aber funktioniert:
Wenn das Modul am HardwareSerial angeschlossen ist und ich es mit einer Bluetoothterminal APP am Iphone verbinde, und per diesem Terminal vom Handy ASCII Befehle an das Modul sende, drehen sich auch die Motoren und im Serial Monitor werden die Empfangenen Befehle angezeigt.
Sende ich selbige ASCII Befehle von einem anderen Nano über ein weiteres HM10 Modul (was als Master ROLE1 direkt mit dem anderen Nano(Slave) verbunden ist), tut sich auch nichts. Die Befehle werden irgendwie vom HM-10 Modul nicht weiterleitet an den Nano.

Ich habe auch nach dem aktivieren der Seriellen Schnittstellen ein Serial.println Befehl mit über 80 charaktern gesetzt, dass das HM-10 Moduls aus dem eventuellen Sleep geholt wird.

An der Leitungsverbindung kann es nicht liegen, da ja mit Umgekehrten RX/TX Pins die AT-Commando-Programmierung problemlos funktioniert.

Ich bin ratlos, vielleicht hat jemand eine Lösung...

Hier der einfache Code, für die Dabble Verbindung:

#include <Dabble.h>
#define INCLUDE_GAMEPAD_MODULE
#define CUSTOM_SETTINGS

// Motorshield und Speedvars
int IN1 = 10;           //MotorA IN1
int IN2 = 9;            //MotorA IN2
int IN3 = 6;            //MotorB IN3
int IN4 = 5;            //MotorB IN4
int motorA_speed = 80;  //Motor A Geschwindigkeit 0-255 (Rechte Motor)
int motorB_speed = 80;  //Motor A Geschwindigkeit 0-255 (Linke Motor)
int movementtime = 300; //Fahrzeit für ein Knopfdruck

//ledBAR
int ledBARpin = 2;  // ledBAR PIN
bool ledBAR = 0;    //ledBAR switch

char val;

void backward() {
  // rückwärtsfahrt, achtung, der linke motor muss andersherum drehen als der rechte, weil die motoren spiegelverkehrt eingebaut sind
  analogWrite(IN1, motorA_speed);
  analogWrite(IN2, LOW);
  analogWrite(IN3, LOW);
  analogWrite(IN4, motorB_speed);
  delay(movementtime);
  stop();
}

void forward() {
  // vorwärtsfahrt
  analogWrite(IN1, LOW);
  analogWrite(IN2, motorA_speed);
  analogWrite(IN3, motorB_speed);
  analogWrite(IN4, LOW);
  delay(movementtime);
  stop();
}

void stop() {
  // Motoren aus
  analogWrite(IN1, LOW);
  analogWrite(IN2, LOW);
  analogWrite(IN3, LOW);
  analogWrite(IN4, LOW);
}

void rotateleft() {
  // linksdrehung
  analogWrite(IN1, LOW);
  analogWrite(IN2, motorA_speed);
  analogWrite(IN3, LOW);
  analogWrite(IN4, motorB_speed);
  delay(movementtime);
  stop();
}

void rotateright() {
  // linksdrehung
  analogWrite(IN1, motorA_speed);
  analogWrite(IN2, LOW);
  analogWrite(IN3, motorB_speed);
  analogWrite(IN4, LOW);
  delay(movementtime);
  stop();
}

void setup() {
  Serial.begin(9600);
  Dabble.begin(9600,3,2); //(baudrate,RXpin,TXpin)
  delay(2000);
  Serial.println("SMARS Dabble Bluetooth ready, waking up HM10-Bluetoothmodule");
  delay(1000);
  Serial.println("Bluetoothmodule wake up OK, please Start your Connection with Dabble-APP and connect via Bluetooth to SMARS-HM10 Network");
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ledBARpin, OUTPUT);  // Output für ledBAR auf pin 2
  stop();                      // stoppe motoren bei beginn
}

void loop() {
  Dabble.processInput();
  if (GamePad.isUpPressed()) forward();
  if (GamePad.isDownPressed()) backward();
  if (GamePad.isLeftPressed()) rotateleft();
  if (GamePad.isRightPressed()) rotateright();
  if (GamePad.isTrianglePressed()) {
    motorA_speed = motorA_speed + 40;
    motorB_speed = motorB_speed + 40;
    if (motorA_speed > 255) motorA_speed = 255;
    if (motorB_speed > 255) motorB_speed = 255;
  }
  if (GamePad.isCrossPressed()) {
    motorA_speed = motorA_speed - 40;
    motorB_speed = motorB_speed - 40;
    if (motorA_speed < 0) motorA_speed = 0;
    if (motorB_speed < 0) motorB_speed = 0;
  }
  if (GamePad.isCirclePressed()) ledBAR != ledBAR;
  if (ledBAR = 1) digitalWrite(ledBARpin, HIGH);
  else digitalWrite(ledBARpin, LOW);
}

Ich tipp' eher auf ein Problem mit der App. Mach' mal das, was die App machen soll,mit der Terminal App.

Ich gehe davon aus, dass Du das GettingStartet einmal durch bist.

Ich hab mal geschaut, was es noch innerhalb der lib gibt.
Die wird zwar seit 5 Jahren nicht mehr gepflegt, aber ich habe etwas gefunden:

Da gibt es in der Lib einen Eintrag, mit dem sich wohl die Arbeit der lib debuggen läst.
Den solltest Du aktivieren.
Da gibt es bestimmt einige interessante Ausgaben.

Ich finde leider den Terminal Befehl für die Gamepad.isUpPressed() Funktion nicht, sonst hätte ich das schonmal ins Terminal gesteckt :).

Habe auch mal die serielle Hardware Schnittstelle laut dem Basic Input Tutorial programmiert. Da ergibt sich das selbe Problem.

Sende ich das Paket <700,500> als Joystickwerte <yachse,xachse> per Terminal von meinem iPhone an das Modul, funktioniert der Code(mit anderem Motorsteuercode dann natürlich). Sende ich selbiges Datenpaket von einem anderem Arduino mit hm10 Modul per String, tut sich auch nichts.
Lese ich mit der Bluetooth Terminal App am iphone die gesendeten daten aus, werden die genau in dem <yachse,xachse> Format vom Modul rausgesendet. Absoluter unsinn... Die beiden Module sind sauber gepaired und signalisieren dies auch an der status-led.

Irgendwie scheint das hm10 Modul die Werte nicht richtig zu verarbeiten.

Um defekte Module auszuschließen, habe ich mal zwei hc05 Platinen bestellt. Mal sehen ob die die Befehle richtig weitergeben, dann kann ich mir die App sparen. Ich will die Steuerung letztenendes sowieso über einen zweiten Nano mit Joystick realisieren, dass garkein händy mehr benötigt wird.

Nichts destotrotz muss ich den Fehler finden, das verlangt mein Ehrgeiz.

Danke für die Infos und Gedanken, da mach ich mich die Tage mal drüber um voran zu kommen.

Edit:
Hab den Fehler gefunden, Kommunikation steht zwischen den Modulen. Allerdings nur zwischen den HC-05 Modulen.

Das Protokoll benötigt einen newline Befehl, der hatte gefehlt. Jetzt sendet das eine fleißig ans andere, welches die Steuerbefehle zerlegt und sauber zuordnet, wie in den Basic Tutorial.

Leider funktionieren die HM-10 Module nicht.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.