Meine 2 Bluetooth Module lassen sich beide im AT-Modus programmieren
(Master,Slave,Adresse etc. ) bekomme auch Rückmeldung bloß bei der
Kommunikation sieht es anderst aus.
Habe alle möglichen Programme ausprobiert und auch alle Fehlerquellen
meiner Meinung nach beseitigt,das Einzige was das problem sein könnte
dass ich für die TX leitung von meinem Mikrocontroller einen
Spannungsteiler dranhänge damit das Signal auf 3,3 V geteilt wird und
die RX Leitung vom µC geht direkt auf TXD von den Bluetooth Modulen.
Es lassen sich weder LED's anschalten noch Werte aus dem µC auslesen.
Programme wurden davor noch am seriellen Monitor(Ardunio IDE) getestet
und haben funktionert bezüglich LED's ansteuern und Sensorwerte
auslesen.
Würde mich über eine Antwort euerseits freuen
MfG Deniz
Zusatzinfos: Die BT-Module verbinden übrigens(Status-LED) und
BT-Terminal bzw Smartphone geben Rückmeldung(HC-05 connected).
Kann es möglich sein,dass die Datenpins nicht richtig funktionieren?
Wieso lässt es sich dann aber im AT-Modus programmieren?
//SKetch funktioniert super am seriellen Monitor nur über das Bluetooth
Modul keine Funktion obwohl es sich verbindet und alles korrekt
verdrahtet ist habe die Baudrate mit AT+UART=9600,0,0 gesetzt(mit
Rückmeldung OK,ich verzweifle hier und denke echt darüber nach es
zurückzuschicken ich möchte aber nicht aufgeben :) )
//http://www.youtube.com/user/greatscottlab
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(9, 10); // CONNECT BT RX PIN TO ARDUINO 10 PIN |
CONNECT BT TX PIN TO ARDUINO 9 PIN
int ledred=7;
int ledgreen=8;
int ledblue=9;
int tx=1;
int rx=0;
char inSerial[15];
void setup(){
//Serial.begin(9600);
BTSerial.begin(9600);
pinMode(ledred, OUTPUT);
pinMode(ledgreen, OUTPUT);
pinMode(ledblue, OUTPUT);
pinMode(tx, OUTPUT);
pinMode(rx, INPUT);
allpinslow();
}
void loop(){
int i=0;
int m=0;
delay(500);
if (BTSerial.available() > 0) {
while (BTSerial.available() > 0) {
inSerial[i]=BTSerial.read();
i++;
}
inSerial[i]='\0';
Check_Protocol(inSerial);
}}
void allpinslow()
{
digitalWrite(ledred, LOW);
digitalWrite(ledgreen, HIGH);
digitalWrite(ledblue, HIGH);
}
void Check_Protocol(char inStr[]){
int i=0;
int m=0;
Serial.println(inStr);
if(!strcmp(inStr,"red")){ //Ledred ON
allpinslow();
digitalWrite(ledred, HIGH);
Serial.println("Red ON");
for(m=0;m<11;m++){
inStr[m]=0;}
i=0;}
if(!strcmp(inStr,"redoff")){ //Ledgreen ON
allpinslow();
digitalWrite(ledred, LOW);
Serial.println("Red OFF");
for(m=0;m<11;m++){
inStr[m]=0;}
i=0;}
if(!strcmp(inStr,"blue")){ //Ledblue ON
allpinslow();
digitalWrite(ledblue, HIGH);
Serial.println("Blue ON");
for(m=0;m<11;m++){
inStr[m]=0;}
i=0;}
else{
for(m=0;m<11;m++){
inStr[m]=0;
}
i=0;
}}
Deniz Braun schrieb:> Zusatzinfos: Die BT-Module verbinden übrigens(Status-LED) und> BT-Terminal bzw Smartphone geben Rückmeldung(HC-05 connected).> Kann es möglich sein,dass die Datenpins nicht richtig funktionieren?> Wieso lässt es sich dann aber im AT-Modus programmieren?
Die Pinbelegung scheint richtig zu sein, da die AT Commands
funktionieren. Für die Kommunikation via BT müssen die Module jedoch mit
der Gegenstelle das Pairing durchlaufen. Dafür ist die Eingabe des
Passwords erforderlich - abfragbar mit AT+PSWD (default meist "1234").
Wie das mit dem Pairing funktioniert, kannst du im Netz erfahren. Dazu
gibt es z.B. bei instructables.com gute Anleitungen.
Das mit dem PW bei 2 Modulen habe ich ja echt nicht bedacht .. :D
Ich hab aber erstmal ein Modul mit dem Smartphone verbunden und dass
dann dort über ein BT terminal versucht abzufragen(weiss jemand mit
wieviel baud ein BT-Terminal standardmässig läuft wenn man keine
Baudraten einstellen kanns? (38400)?
Deniz B. schrieb:> Ich hab aber erstmal ein Modul mit dem Smartphone verbunden und dass> dann dort über ein BT terminal versucht abzufragen(weiss jemand mit> wieviel baud ein BT-Terminal standardmässig läuft wenn man keine> Baudraten einstellen kanns? (38400)?
Die Baudrate spielt da IIRC keine Rolle, denn die stellt man mit den
o.g. AT Kommandos fest ein.
An seriellen ÜPort haben die Module einstel bestimmte einstellbare
Baudrate. Für die drahtlose kommunikation unterinander ist die Baudrate
egal. Du kannst zwe Module miteinander per Funk verbinden, auch wenn sie
zu ihren Computern hin am seriellen Port nicht die gleiche Baudrate
haben.
Stefan U. schrieb:> An seriellen ÜPort haben die Module einstel bestimmte einstellbare> Baudrate. Für die drahtlose kommunikation unterinander ist die Baudrate> egal. Du kannst zwe Module miteinander per Funk verbinden, auch wenn sie> zu ihren Computern hin am seriellen Port nicht die gleiche Baudrate> haben.
Danke Stefan,
wie sieht es mit einer Modul-Smartphone Verbindung aus? Welche Baudrate
muss am Modul eingestellt werden damit ich am BT-Terminal meines
Smartphones die Daten empfange?
Auch da spielt die Baudrate keine Rolle.
Wichtig ist nur, dass das Terminal auf die gleiche Baudrate konfiguriert
ist, wie das damit verbundene Bluetooth Modul.
Wie schnell das Smartphone (intern) mit seinem Bluetooth Chip
kommuniziert, spielt keine Rolle. Möglicherweise ist das nicht einmal
seriell - könnte auch irgendein andere Protokoll sein, zum Beispiel USB
oder SPI.
Stefan U. schrieb:> Auch da spielt die Baudrate keine Rolle.>> Wichtig ist nur, dass das Terminal auf die gleiche Baudrate konfiguriert> ist, wie das damit verbundene Bluetooth Modul.>> Wie schnell das Smartphone (intern) mit seinem Bluetooth Chip> kommuniziert, spielt keine Rolle. Möglicherweise ist das nicht einmal> seriell - könnte auch irgendein andere Protokoll sein, zum Beispiel USB> oder SPI.
Kennst du ein BT-Terminal für Android bei dem man die Baudrate
einstellen kann?
Habe mehrere getestet und bei denen war die Baudrate nicht einstellbar
:(
Was aber aber auch einen Grund haben müsste( Smartphone-Terminal default
Baudrate 9600 oder 38400? Ich habe echt so langsam den Anschein dass
meine BT Module kaputt sind aber gleich 2 Stück?
Reden wir aneinander vorbei?
Das Android Programm braucht keine Baudrate weil die Kommunikation zum
internen BT Modul durch den Treiber geregelt wird. Eventuell
kommuniziert die CPU sogar gar nicht über Uart sonder über ISP oder USB
oder irgendeine andere Schnittstelle wo es gar keine Baudrate gibt.
Eine Baudrate hast du nur an den Rxd und Txd Leitungen deines Bluetooth
Moduls. Womit sind die denn verbunden? Sicher nicht mit dem Smartphone.
Stefan U. schrieb:> Reden wir aneinander vorbei?> Das Android Programm braucht keine Baudrate weil die Kommunikation zum> internen BT Modul durch den Treiber geregelt wird. Eventuell> kommuniziert die CPU sogar gar nicht über Uart sonder über ISP oder USB> oder irgendeine andere Schnittstelle wo es gar keine Baudrate gibt.>> Eine Baudrate hast du nur an den Rxd und Txd Leitungen deines Bluetooth> Moduls. Womit sind die denn verbunden? Sicher nicht mit dem Smartphone.
Ich verstehe auf jeden Fall was du meinst,was ich mich nur frage
(vielleicht weil ich mich bei BT nicht so gut auskenne) ob es denn kein
Unterschied macht ob ich jetzt die Daten von meinem Mikrocontroller mit
9600 oder mit 38400 Baud an mein Smartphone schicke weil wenn man z.b
bei einem seriellen Terminal(z.B Putty) die falsche Baudrate einstellt
kann es ja die empfangenen Daten auch nicht gescheit anzeigen oder?
Das spielt keine Rolle
Dein yC kann "hallo" mit 115200 Baud senden und das Smartphone kann den
Text so schnell oder langsam auslesen wie es will. Gilt auch umgekehrt.
Die Bluetooth Module puffen die Daten und sie übetragen per Funk so
schnell es die Signalqualität gerade zulässt.
Die Baudrate beeinflusst nicht die Geschwindigkeit det Funkstrecke.
Vielen Dank, somit wird mir einiges klar.
Ist ja aber auch logisch dass die über die serielle Verbindung
gesendeten Daten im BT-Modul gepuffert werden und dann auf 2.4 GHz
hochmoduliert werden.
Jetzt nochmal zu der zentralen Frage:
"Kann man davon ausgehen dass,das BT-Modul einwandfrei funktioniert wenn
es sich im AT-Modus programmieren lässt und auch Rückmeldung gibt?"
> Kann man davon ausgehen dass...
Nein, kann man nicht. Das sagt nur aus, dass das serielle Interface und
der Befehlsinterpreter funktionieren.
Wenn z.B, die Antenne abgebrochen ist, tut sich auf der Funkstrecke
nichts.
Über mein Handy finde ich aber meine BT-Module einwandfrei und kann sie
auch pairen.
Die status LED zeigt auch eine Veränderung(dass das Modul verbunden ist)
somit kann es ja theoretisch nicht an der Antenne an sich liegen oder?
Vorallem gehen gleich 2 Module nicht und die lassen sich beide verbinden
und im AT-Modus beschreiben und auslesen.
Irgendwie denke ich der Fehler liegt bei mir ... Auch wenn ich die
Schaltung ,das Programm und das BT-Terminal gewechselt bzw geändert
habe,habe auch die Programme im Seriellen Monitor auf meinem PC getestet
also Schaltung und Programm müssten stimmen.. fällt dir nochwas anderen
ein außer dass ich vielleicht so ein Glück habe dass gerade 2 Module
sich verbinden lassen Strom ziehen aber keine Kommunikation aufbauen -.-
Habe mir gerade überlegt da ich keinen Logik Konverter besitze habe ich
ja die TXD von meinem µC an einen Spannungsteiler angeschlossen und dann
2/3 der Spannung an RXD vom Modul abgegriffen.
Nur der 3.3V Pegel vom BT-Modul geht direkt auf den µC ,kann das unter
Umstände Probleme verursachen?
Gerade im AT-Modus wo wahrscheinlich die Antenne(Stromfresser) direkt
ausgeschaltet ist die Kommunikation noch stabil,vielleicht bricht der
3.3V Pegel im Pairing mode runter und ich muss das Signal doch über
einen Logik Konverter jagen
Verbinde auf einem Modul RX und TX direkt, paare es mit Deinem
Smartphone und sende per Bluetooth ein Zeichen hin. Wenn Du es
zurückbekommst, ist Dein Modul in Ordnung.
> kann das unter Umstände Probleme verursachen?
Ich verwende gerne 2,2k Ohm und 1,5k Ohm Widerstände bei bis zu 115200
Baud.
Mit zehmal höheren Werten hatte ich jedoch Probleme.
1
AVR 1,5k Bluetooth Modul
2
5V Tx o----[===]-----+--------o Rx 3,3V
3
|
4
|~|
5
|_| 2,2k
6
|
7
GND
Ich habe auch schon öfters nur einen Widerstand benutzt, klappte bisher
auch zuverlässig:
> wenn ich z.B den Befehl read eingebe kommt erst ein r zurück und> danach ead .
Also hast du letztendlich "read" empfangen. Ist doch gut, was hast du
denn erwartet?
Stefan U. schrieb:>> wenn ich z.B den Befehl read eingebe kommt erst ein r zurück und>> danach ead .>> Also hast du letztendlich "read" empfangen. Ist doch gut, was hast du> denn erwartet?
Also erwartet habe ich, dass (siehe Bild : bei dem ersten Befehl q kommt
erstmal garnichts zurück nur CR,dann CR+LF zurück und erst beim zweiten
Befehl kommt das zurück was ich gesendet habe) und bei read erwarte ich
doch normalerweise dass es in einem "Stück" zurückkommt oder ?
Stefan U. schrieb:>> kann das unter Umstände Probleme verursachen?>> Ich verwende gerne 2,2k Ohm und 1,5k Ohm Widerstände bei bis zu 115200> Baud.>> Mit zehmal höheren Werten hatte ich jedoch Probleme.>>
1
>
2
> AVR 1,5k Bluetooth Modul
3
> 5V Tx o----[===]-----+--------o Rx 3,3V
4
> |
5
> |~|
6
> |_| 2,2k
7
> |
8
> GND
9
>
10
>
>> Ich habe auch schon öfters nur einen Widerstand benutzt, klappte bisher> auch zuverlässig:>>
1
>
2
> AVR 2,2k Bluetooth Modul
3
> 5V Tx o----[===]--------------o Rx 3,3V
4
>
Benutze bei 9600 und 38400 Baud 3 mal 1k in Reihe und greife dann am
ersten Widerstand ab somit würde das ja ungefähr dem entsprechen was du
oben aufgzeichnet hast.
Danke dir und auch allen anderen für ihre Mühe.
Deniz B. schrieb:> wenn ich z.B den Befehl read eingebe kommt erst ein r zurück und danach> ead .> Eher nicht gut oder?
Das hängt davon ab, wie Deine App das liest und anzeigt, was
zurückkommt.
Wenn Du "Gurkensalat" eintippst sollte der auch wieder rauskommen. wenn
Deine App sich denkt, alle 4 Zeichen ein line feed sieht schön aus, dann
kommt eben
Gurk
ensa
lat
raus :-)
.. und wenn das EIngetippte wieder raus kommt, dann hat die
kommunikation schon mal bis zu den TTL-Beinchen funktioniert in beide
Richtungen und das Modul selbst ist in Ordnung.
Deine Bluetooth Übertragung wird nichts garantiert am Stück übermitteln.
An den seriellen Anschlüssen werden einzelne Zeichen eins nach dem
anderen Übertragen. Dazwischen können zeitlich beliebig große Lücken
sein.
Auf der Funk-Schnittstelle sieht es noch komplexer aus. Dort werden
möglicherweise kleine Pakete geschnürt und übertragen. Aber wo genau ein
Paket beginnt und wo eins endet, hast du nicht unter Kontrolle.
Bei Modemen ist das auch nicht anders.
Das Programm auf dem Smartphone hat (warum auch immer) einige Zeichen zu
einem String aneinander gekettet. Die Darstellung durch die App steht
aber mit Sicherheit nicht in einem 1:1 Zusammenhang zur tatsächlichen
Übertragung.
Anscheinend bist du mit dem Verhalten deiner App nicht vertraut. Du
weisst nicht, welche Eigenarten von der App und welche von dem BT Modul
verursacht wurden.
Ich habe mal eine ähnliche App programmiert. Sie sammelt solange alle
empfangenen Zeichen ein, bis für ca 200ms nichts mehr kommt. Was bis
dahin gesammelt wurde, wird als zusammenhängende Logmeldung angezeigt.
Ich würde Dir dazu raten, das Android SDK von Google herunter zu laden
und dann das Beispielprogramm "Bluetooth Chat" (siehe
https://developer.android.com/samples/index.html) zu verwenden. Das ist
nämlich ganz primitiv und hat keine überraschenden Eigenarten. Es
verhält sich mehr wie ein gewöhnliches Terminalprogramm.
Du musst allerings im Quelltext die UUID auf
"00001101-0000-1000-8000-00805F9B34FB" ändern, damit das Programm
Verbindung zu den üblichen Bluetooth-zu-seriell Modulen aufbauen kann.
Ich habe das mit einem BTM-22 und mit dem HC-05 erfolgreich ausprobiert.