Bluetooth mit itead shild

Hi,
ich experimentiere mit Bluetooth. Ich habe ein Arduino UNO und das iteadstudio Shild.
(http://store.iteadstudio.com/images/produce/Shield/BTshieldv2.2/BTShieldV2.2_DS.pdf)
Zum Testen der Verbindung möchte ich nun über Bluetooth die LED13 auf dem Arduino an und aus machen.

Es hat einen UART Multiplexer um den RX und TX Pin zu stecken.

TX 0 0 1 0 0 0
D0 0 0 1 0 1 0
RX 0 0 0 0 1 0

auf der Platine ist auch aufgeschrieben: [D0],D1,D4,D5,D6,D7

Ich gehe davon aus das es dann die Digitalen Pins sind. Bei meiner jumper konfiguration müsste es also TX = 4 und RX = 6 sein.

Mein Code ist

#include <SoftwareSerial.h>

//SoftwareSerial mySerial(10, 11); // RX, TX
#define rxPin 6
#define txPin 4

SoftwareSerial Bluetooth(rxPin, txPin);

int ledPin = 13;
int BT_val;

void setup()  
{ 
  //Bluetooth
  Bluetooth.begin(115200);
  
  pinMode(ledPin, OUTPUT);
}

void loop() // run over and over
{
 
// BLUETOOTH //
  while (Bluetooth.available() == 0)
    Bluetooth.println("Bluetooth connected");
    BT_val = Bluetooth.read() - '0';
    
  if(BT_val == 1) {
    Bluetooth.print("LED is on");
    digitalWrite(ledPin, HIGH);  
  }
  else if(BT_val == 0) {
   Bluetooth.print("LED is off"); 
   digitalWrite(ledPin, LOW);
  }
  else {
   Bluetooth.print("Invalid!"); 
  }
}

Ich arbeite auf einem Mac und hab nun die Arduino Software offen, das Shield gepaird und die Serielle Konsole offen mit 115200 Baud. Wenn ich nun eine 1 oder irgend was sende - passiert gar nichts!
Ok, natürlich ist das Arduino Board noch per USB angeschlossen um halt mit der Konsole ein Feedback zu bekommen, aber es müsste doch trotzdem etwas passieren.

Zum weiteren Testen habe ich mit Processing auch ein kleines Tool das auf 115200 Baud per klick eine 1 oder 0 sendet. Allerdings passiert damit auch nichts. Weder auf der Konsole noch leuchtet die LED!

import processing.serial.*;
 
Serial myPort;
String input;
 
boolean farbe = false;
void setup()
{
  //Alle Ports ausgeben und den richitgen auswählen
  println(Serial.list());
  //Index entsprechend setzten
  String portName = Serial.list()[8]; // [8] "/dev/tty.itead-DevB"
  myPort = new Serial(this, portName, 115200);
  //Erstes Einlesen wegwerfen
  input = myPort.readStringUntil('\n');
  input =null;
 
  size(200,200);
  background(0);
  smooth();
}
void draw()
{
  if(farbe)
  {
    background(255,0,0);
    myPort.write("1");
  }
  else
  {
    background(0);
    myPort.write("0");
  }
}
void mousePressed()
{
  farbe = !farbe;
}

Bin langsam am verzweifeln, kann mir jemand bitte helfen?

mmhh keiner eine Idee... Ich bin mit Bluetooth noch ein Anfänger, habe aber gefunden das man natürlich noch beim Adruino Programm den Serial Port auf tty-itead-dev8 umschalten müsste.

Trotzdem bekomme ich gar nichts. Ich habe nun auch erstmal versucht überhaupt dort etwas empfangen zu können.

#include <SoftwareSerial.h>

//SoftwareSerial mySerial(10, 11); // RX, TX
#define rxPin 2
#define txPin 4

SoftwareSerial Bluetooth(rxPin, txPin);
void setup()  
{ 
  Bluetooth.begin(115200);
}

void loop()
{
  Bluetooth.println("test text");
  delay(1000);
}

Also Shield ist auch gekoppelt und Serial Monitor ist nun auch auf dem richtigen Port. Aber trotzdem bekomme ich meine println nicht. Was funktioniert nicht?? Bitte ich steh total auf dem schlauch. Glaube aber immer noch das es mit den Pins zu tun hat - auch wenn ich schon fast alle kombinationen versucht habe.

Habe ein Video gefunden aber leider wird dort ein anderes Bluetooth Shield genutzt.

Darin wird folgendes erklärt:

BT Arduino
RX <--------> TX
TX <--------> RX

miteinander verbunden werden. Laut Arduino Uno beschreibung ist RX auf DigitalPin 0 und TX auf DigitalPin 1. Wenn die Jumper folgend gesteckt werden

TX 100000
D0 110000
RX 010000

(denke entspricht: TX = 0; RX = 1)

dauert es zwar ewig das der Serial Monitor sich aktiviert aber auch dieses ist ohne Erfolg.

Hoffe jemand wird sich finden der mir helfen kann.

kann wirklich keiner helfen??

Stimmt denn überhaupt die Baud-Rate?
Mein Bluetooth modul (ohne den shield) werkelt nur bei 9600. Ich glaube mal was gelesen zu haben, das man das teilweise vorher testen muss/einstellen muss.

Dein Ansatz mit Softserial ist schon gut. Wenn du USB dran hast geht mein Bluetooth modul z.b. gar nicht auf pin0 und 1. Ich nehm immer 2&3 bzw welche ohne pwm :wink:

Ich hab auch immer wieder Probleme Rx/tx auseinanderzuhalten. Ich steck das einfach immer um wenns net klappt. Kann sein das du den BLuetooth Shield dann einmal vom Strom nehmen musst weil sich das Modul aufhängt dabei.

Auch musste drauf achten ob es 3.3V oder 5V will :slight_smile: und ob ggf. auch dein Pairing device funktioniert.

Es gibt im learning auf arduino.cc unter commuication nen Beispiel wo glaub das was auf Serial reinkommt auf Bluetooth serial ausgegeben wird und andersrum.
Das kannste auch mal testen um ggf. Fehler in eine Richtung auszuschließen :slight_smile:

Praktisch auch immer wenn du Softserial nutzt dir alles parallel auf Serial auszugeben am Serialmonitor um einfach sicher zu sein das auch dein Restcode stimmt.

Also ich würde:
1.Baudraten durchtesten
2.Verkabelung checken und auch rx/tx tauschen wenn ich mir eig. ziemlich sicher bin.
3.mein Programm mal checken und immer alles auf Serial parallel ausgeben lassen.

Vielen Dank für die Antwort.
Habe immer 115200 Baud rate - der HC05 unterstützt diese auch alle. Habe aber durch deine Frage noch mal nachgelesen die standart Einstellung ist tatsächlich eine andere 38400Baud.

Das Pairing geht und es sind 5V die ich auch dem Shield geben. Trotzdem ein guter Ansatz.

Das mit dem Softserial ist gut zu wissen, das es wirklich geht. Wie funktioniert dann die Kommunikation wenn du nicht pin 0 und 1 nimmst sondern 2&3? Ich dachte wenn man mit dem ATMega sprechen will muss man die TX und RX benutzen die sonst für die Serial USB kommunikation ist. Also quasi überschreiben, das der MC nun auf von wo anders die Befehle bekommt. Wie hast du das umgesetzt, interessant halt für Debuging bei mir.

OK ich komme der Sache langsam näher!

#include <SoftwareSerial.h>
#define txPin 0
#define rxPin 1

int val;

SoftwareSerial Bluetooth(rxPin, txPin);
void setup()
{
  Bluetooth.begin(38400);
  Serial.begin(38400);
}

void loop()
{
  val += 1;
  Bluetooth.println(val);
  Bluetooth.write(val); // val als integer
  Bluetooth.read();
  //Bluetooth.flush();
  Serial.println(val);
  delay(1000);
}

Bei diesem Code, bekomme ich bei dem Serial (tty.usbmodemfa131) jede Sekunde eine Zahl ausgegeben. Bei der Bluetooth Schnittstelle (tty.itead-DevB) kommen cryptische Zeichen zb.
ù?úúù?ú3ÿ7ÿ;ÿ£Èúú§ùúú£ù?Äúú?úúú?ú?Ôúù?úúù?ú?Äú
und jede Sekunde eins dazu. Sieht also schon gut aus. Frage ist nun warum gibt es kein Integer?!?

Laut Datasheet vom BT ist nun alles richtig gesteckt:
When using the connection as Figure, the BT shield connects to the ATMega328 chip on board.
TX 100000
D0 110000
RX 010000

Oder doch eher das? Hatte bei mir aber nur dazu geführt das der Transiver dauerhaft leuchtet.
When using the connection as Figure 4, the HC-05 connects with the FT232RL chip, and the FT232RL connect to PC by USB. Whit this configuration you can use the serial software on PC to control or configure the HC-05 module.
TX 010000
D0 110000
RX 100000

Denke bei mir ist "nur" noch die Variable das Problem. Muss man mit BYTE arbeiten?

Diese Zeichen kommen bei mir immer wenn ich die baudrate noch net richtig hab, aber schon grob im richtigen Bereich.
Ich denke du bist nah dran. Vll auch einfach nochmal rx/tx tauschen. aber den fehler kenn ich.

Also du brauchst nur tx und rx pin. Also die erste Konfig.
Das andere ist glaube wenn du über diese AT(?) Kommandos den Bluetooth Transceiver einstellen willst. Z.b. Name, passwort usw.
Das hab ich selber noch nicht gemacht.

Ich benutze am PC nen Bluetooth dongle und teraterm als terminal. Was benutzt du?

Hier mal ein Softwarebeispiel:

#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX
Adafruit_BMP085 bmp;

int time = 0;

void setup() {
mySerial.begin(9600);
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
}

void loop() {
Serial.print(time);
Serial.print(" ");
Serial.print(bmp.readTemperature());
Serial.print(" ");
Serial.println(bmp.readPressure());
mySerial.print(time);
mySerial.print(" ");
mySerial.print(bmp.readTemperature());
mySerial.print(" ");
mySerial.println(bmp.readPressure());
time = time + 1;
delay(1000);
}

Das ließt mir den Sensor aus und gibt mir die werte erst über Serial (pin0/1 einfach freilassen und über usb verbunden) und dann noch über myserial(pin2/3 als rx/tx mit dem bluetooth adapter verbunden) aus.

Hoffe du bekommst es hin, denke du bist sehr nah dran.

JUCHU.. Geschaft. Leider dann auch erst gesehen das du geschrieben hast!

Hier die Lösung (nach drei Tagen den Kopf gegen die Wand hauen!)
OK für alle die auch mit Bluetooth es probieren wollen. Erkläre ich lieber alles was ich nun herausgefunden habe.

Wichtig beim Multiplexer kann man die Receiver RX und Transceiver TX einstellen, wenn man ihn auf
TX 100000
D0 110000
RX 010000

Heisst das TX(BT Shield) geht auf DigitalPin(Arduino) 0 == RX also TX-->RX. Und RX(BT Shield) geht auf DigitalPin(Arduino) 1 == TX also RX-->TX. Logisch der Empfänger braucht immer ein Sender und umgekehrt.

Achtung das bedeutet aber das der "normale" Serial Port per USB über schrieben wird! Auf gut Deutsch wenn man dann das Shield auf den Arduino tut, kann man per USB den ATMega nicht mehr bespielen, da er nun nur noch auf das BT Shield horcht.
Bei dieser Einstellung muss also zum Hochladen des Codes das Shield runter! Dann ATMega bespielen und Shield wieder rauf.

Jetzt kann man den Arduino+Shield an eine andere Stromquelle hängen und seinen Laptop mit dem BT Shield koppeln. Dann kann man im Arduino Programm oben bei "TOOLS"-->"Serial Port" auf den tty.iTead-DevB stellen. Nun normal den Serial Monitor öffnen ACHTUNG Baudrate muss natürlich stimmen.

Der Witz bei der ganzen Geschichte ist das man diesen ganzen Mist mit dem

#include <SoftwareSerial.h>
#define txPin 0
#define rxPin 1
SoftwareSerial Bluetooth(rxPin, txPin);
Bluetooth.begin(38400);

NICHT BRAUCHT!!! Man arbeite wie per USB mit Serial.begin(9600); und dann weiter mit Serial.println("Hello World"); --> Warum? Weil das einzige was man gemacht hat ist das USB Kabel zu ziehen und es durch BT zu ersetzen.

Meine Idee vom Anfang die LED 13 zum Leuchten zu bringen ist also super easy! (jetzt! :frowning: )

int ledPin = 13;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  while(Serial.available() > 0)
  {
      int valSer = Serial.read() - '0';
      Serial.println(valSer);
      
      if(valSer == 1) {
         Serial.println("LED is On");
         digitalWrite(ledPin, HIGH);
      }
      else if(valSer == 0) {
          Serial.println("LED is Off");
          digitalWrite(ledPin, LOW);          
      }
      else {
          Serial.println("Invalid");
      }
  }
}

Der Code funktioniert natürlich auch ohne BT Shield! Könnte immer noch den Kopf an die Wand hämmern - dafür!

Theoretisch kann man dann natürlich auch nun das machen was dertester sagt, also zwei Wege zum Arduino legen. Einen per BT zb mit Multiplexer (TX --> DPin6, RX --> DPin7) nun mit SoftwareSerial Bluetooth(7, 6); eine eigene Seriale-Schnittstelle erstellen und von dort dann Dinge schicken. Achtung: Man muss genau darauf dann achten welchen Port man grade beim Serial Monitor sieht/benutzt.

Bei mir geht der letzte Theoretische Teil noch nicht! Wollte aber mein Wissen bzw Erfolg allen anderen BT Anfängern mitteilen :smiley:

Super, toll das es geklappt hat.

Was hast du vor mit dem Projekt? Mich würde auch interessieren, ob du neben dem normalen Arduino IDE noch nen anderes Tool benutzt um Bluetooth Commands zu lesen/senden.

Softwareserial ist wie gesagt nur nützlich damit du nicht zum programmieren den shield abnehmen musst UND damit du gleichzeitig Kabelgebunden und über Bluetooth Ausgeben/empfangen kannst :slight_smile:

Funktioniert der Code? Wo hast du die LED angeschlossen und wie steuerst du sie an?

int ledPin = 13;

void setup()
{
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  while(Serial.available() > 0)
  {
      int valSer = Serial.read() - '0';
      Serial.println(valSer);
      
      if(valSer == 1) {
         Serial.println("LED is On");
         digitalWrite(ledPin, HIGH);
      }
      else if(valSer == 0) {
          Serial.println("LED is Off");
          digitalWrite(ledPin, LOW);          
      }
      else {
          Serial.println("Invalid");
      }
  }
}