Author Topic: Bluetooth problem bei Arduino BT v06  (Read 18741 times)

stefu

  • Guest
Bluetooth problem bei Arduino BT v06
« on: April 05, 2012, 03:18:18 PM »
Hallo zusammen

Ich verwende seit einiger Zeit ein Arduino BT v06 Board. Die ersten tests waren sehr vielversprechend.
Zuerst versuchte ich einfache Anwendungen zu programmieren wie das Ein- und Ausschalten von Led's via Serialmonitor. z.B. mit dem senden von 0-->Aus, 1-->Ein.

Nun versuche ich ein Projekt zu realisieren um vom Arduino-Controller via Android-Handy Daten auszulesen. Dazu verwende ich die Amarino Library um die Kommunikation von Android und Arduino zu vereinfachen.

Amarino --> http://www.amarino-toolkit.net/index.php/home.html

Amarino bietet eine Handy Applikation und ein Sketch für den Arduino an, um die funktionalität zu testen.
Als ich die Software geladen habe um alles zu testen stellte ich fest das ich mit dem Android nur Connecten kann, aber die gesendeten Befehle lösen auf dem Controller nichts aus...
Die Baudrate im sketch habe ich mit Serial.begin(115200); eingestellt und der Bluegiga WT11 (onBoard-Shield) sollte default auch diese Baudrate besitzen.

Hat jemand Erfahrung mit diesem Problem oder einen Tipp an was es scheitern könnte?


Alternativ zu dem Arduino BT v06 Controller kaufte ich bei boxtec.ch einen Arduino Uno R3 mit einem passenden Bluetooth Shield v2.2 von ITead Studio.
Meine Hoffnung bestand darin, dass ich die Baudrate manuell am Shield einstellen kann via AT-Commands, was leider beim Arduino BT v06 nicht möglich ist.

Nun zum Probem der alternativen Variante:
Ich habe die Jumper auf dem BT Shield v2.2 gemäss Datasheet auf FT232 eingestellt (D0->RX, D1->TX) und den Mode Schalter auf CMD. Mit diesen Einstellungen sollte der USB Anschluss am Arduino Uno direkt auf das BT Shield laufen und die Einstellungen mit den AT Befehlen sollten via Serialmonitor vom Arduino IDE, Putty(Terminalsoftware)  oder Hyperterminal(Terminalsoftware) möglich sein.

Wenn ich die Einstellungen in dieser Konstellation durchführe will bekomme ich folgende resultate:
- Serialmonitor vom Arduino IDE, Baud 38400 : Bei Befehl AT und auch andere Befehle -->keine reaktion
- Putty auf Serial eingestellt, Baud 38400: wie bei Serialmonitor keine reaktion
- Hyperterminal auf Serial eingestell, Baud 38400: bBei Befehl AT --> ERROR:(0) ERROR:(0) ERROR:(0) ERROR:(0) ERROR:(0) usw.

Hat mir jemand eine Idee was ich bei den einstellungen falsch mache? Ich habe auch andere Baudraten versucht, jedoch ohne Erfolg.

Ich bin über sämtliche Inputs die ihr mir geben könnt froh.

Beste Grüsse und schöne Oster
Stefu

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Bluetooth problem bei Arduino BT v06
« Reply #1 on: April 05, 2012, 03:48:09 PM »
Salut,

ich habe auch mit dem Amarino und dem Iteadstudio board gearbeitet und folgende Fußfallen festgestellt:
- man sollte das BT modul nur über bluetooth ansprechen. Dabei muss die USB Verbindung getrennt sein (ich verwende BT meines Laptops)
- ich war nur in der Lage, mit 9600 Baud zu arbeiten
- Kommunikation mit dem Arduino Uno ist nur möglich, wenn das BT shield ausgesteckt ist

Als ersten Test habe ich die App ArduinoCommander geladen und auf dem Arduino das Firmata Beispiel mit 9600 Baud (siehe Homepage von Arduino Commander). Das hat auf Anhieb funktioniert und wenn das nicht klappt, ist etwas grundlegendes falsch/defekt.
Als weiteren Test habe ich in Amarino den Event "Orientation Sensor" geladen und auf dem Arduino das Servo Sketch. Nach Einbinden der Amarino lib habe ich dann die Werte des z-Events (data[2]) via map(data[2],-90,90,0,180) auf den Servo abgebildet. Das hat mit 9600 baud funktioniert.
Wichtig ist, dass die Events in der Amarino App in der Reihenfolge von oben herab mit A,B, C etc durchbenannt werden. Entsprechend dieser Reihenfolge muss man dann auch die Funktionen im Arduino Sketch registrieren. Wenn also als erstes Event der Test-Event geladen ist und als zweiter der Orientierungssensor, dann kommt meine Rotationsinfo auf B und nicht auf A.

Ich habe nun versucht, das shield direkt anzusprechen. Laut Beschreibuing muss man dazu das Shield so konfigurieren:
D0-RX, D1-TX, Mode Switch auf CMD, Serial Port auf 9600,1,8,n,n
Mit TeraTerm ist es nicht möglich, das Shield zur Zusammenarbeit zu überreden. Nach etwa 2 Stunden hatte ich so alle mögliche Permutationen durch und habe nun ein entspreches Post im ITeadStudio Forum gemacht.

Nach weiteren Veruchen habe ich dann das Rätsel gelöst:
Zuerst muss man ein Sketch laden, welches nicht die Serielle Schnittstelle benutzt, z.B. blink
Dann muss man das Shield mit den Jumpern wie oben konfigurieren (D0-RX, D1-TX, Mode Switch auf CMD, Serial Port auf 38400,1,8,n,n)
COM port am PC auf 38400 Baud
TeraTerm (oder anderes Terminal) auf 38400
Wenn OK oder ERROR:(0) erscheint ist man am Ziel. Das Board wiederholt den letzten Output so lange bis man ein CR (Enter Taste) schickt. Die eigenen Kommandos sieht man, wenn man local echo einschaltet.
Bei ERROR, so lange AT eingeben, bis OK erscheint, danach kann man alle anderen AT Kommandos ausführen.
Wichtig: Die Baudrate, welche man einstellt, betrifft NUR die Kommunikation zum Arduino. Die Baudrate für die AT Commands hier ist IMMER 38400.

Wenn die Konfiguration abgeschlossen ist, muss man das Board umstecken: D0-TX, D1-RX, Mode Switch auf DAT.
Ich habe es noch auf meiner Arduino Seite zu dem Shield gespeichert (http://www.mathias-wilhelm.de/arduino/shields/bluetooth-shield/)

Ich hoffe, das hat etwas geholfen
Grüsse, Mathias
« Last Edit: April 06, 2012, 07:28:09 PM by MathiasW »

stefu

  • Guest
Re: Bluetooth problem bei Arduino BT v06
« Reply #2 on: April 09, 2012, 11:05:25 PM »
Sälü MathiasW,

Erstmal danke ich dir für deine Bemühungen.

Ich habe nun den dreh raus beim Arduino BT v06 und bin fleissig am programmieren. Ich habe eine App zum testen geschrieben die nun erfolgreich in beide Richtungen kommuniziert.

Das mit dem IThead Shield werde ich sehrwarscheinlich nächste Woche in angriff nehmen.

Kennst du eine Variante um auf dem Arduino Board Werte zu speichern damit man sie beim nächsten einschalten wieder hat?

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Bluetooth problem bei Arduino BT v06
« Reply #3 on: April 10, 2012, 12:31:20 AM »
Salut Stefu,

die einzige Methode, mit der ich Daten speichere ist die, auf SD Karten zu schreiben. Ich verwende dazu zum einen die in einigen LCD Displays vorhandenen SD Slots oder den stackable SD Shield (http://shop.boxtec.ch/product_info.php/cPath/59_57_114/products_id/40333). Da ich noch einige alte SD Karten mit weniger als 1 GB habe, finden diese hier Verwendung.

Für einfache Info, die über einen Powercycle gerettet werden sollen, stehen je nach Modell 512(ATmega168), 1024(ATmega328) oder 4096(ATmega1280/2560) Byte im EEPROM zur Verfügung: http://www.arduino.cc/en/Reference/EEPROM. Nicht viel, aber für einfache Zustanswerte ganz ok.

Mit APP-Programmierung habe ich noch keine Erfahrung. Ich wäre da sehr an Deinem App interessiert, alleine um zu lernen, wie ich meine eigene App für Android schreiben kann.
Aber jetzt geht es erst mal diese Woche in Osterurlaub ...
Ciao, Mathias
« Last Edit: April 10, 2012, 12:57:47 AM by MathiasW »

stefu

  • Guest
Re: Bluetooth problem bei Arduino BT v06
« Reply #4 on: April 10, 2012, 03:51:38 PM »
Sälü,

Ah, dieses kb reicht erstmal völlig aus. Will nur einen Wert zwischenspeichern und ev. beim nächsten start wieder verwenden.

Den Quellcode kann ich dir hier rein stellen, aber es werden mehrere Files und eine Ordnerstrucktur benötigt die dir in Eclipse erstellt werden sobald du ein neues Projekt anlegst. Wenn du willst kann ich dir das BT-Test Projekt Mailen damit du es mit allen Teilen importieren kannst.

Code: [Select]
package ch.android.test;

import ch.android.test.R;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;

/*-----------------------------------------------------------------------------------------
 * Die Klasse BefehlSendenActivity Instanziert die sub_Klasse Empfaenger um die nötigen Daten
 * von Arduino entgegenzunehmen. Die App besitzt ein Button zum Einschalten der LED auf dem
 * ArduinoController und ein Button zum Ausschalten. Zur kontrolle ob die LED Ein oder Aus
 * ist, wird ein Rückgabewert empfangen in Form eines Strings. Dieser String wird auf dem
 * Display in dem mValueTV TextView angezeigt.
 *
 * Zur vereinfachung der Kommunikation mit dem ArduinoController wurde die OpenSource
 * Library von Amarino eingebunden.
 *-----------------------------------------------------------------------------------------
 */


public class BefehleSendenActivity extends Activity {

public static String s = null;

// Variablen und GUI Elemente werden deklariert
Button bEin;
Button bAus;
String DEVICE_ADDRESS = "00:07:80:49:8C:8F";
TextView mValueTV;

// Instanz von Klasse Empfaenger wird erzeugt
public Empfaenger empfaenger1 = new Empfaenger();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);

// Initialisiere GUI Elemente
bEin = (Button) findViewById(R.id.bEin);
bAus = (Button) findViewById(R.id.bAus);
mValueTV = (TextView) findViewById(R.id.textView1);

// MAC-ADDRESS wird an AMARINO übergeben zum Verbindungsaufbau
Intent intent = new Intent(AmarinoIntent.ACTION_CONNECT);
intent.putExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS, DEVICE_ADDRESS);
sendBroadcast(intent);
}

public void onStart() {
super.onStart();

// Registriere Instanz empfaenger beim System
registerReceiver(empfaenger1, new IntentFilter(
AmarinoIntent.ACTION_RECEIVED));

// OnClickListener wird auf Button gesetzt und Methode LED-EIN
// aufgerufen
bEin.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View paramView) {
led_ein();
}
});

// OnClickListener wird auf Button gesetzt und Methode LED-AUS
// aufgerufen
bAus.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View paramView) {
led_aus();
}
});
}

@Override
public void onStop() {
super.onStop();

// Registrierte empfaenger Instanz wird beim System abgemeldet
unregisterReceiver(empfaenger1);

// Verbindung zu Arduino wird getrennt
Amarino.disconnect(this, DEVICE_ADDRESS);

}

public void led_ein() {
Amarino.sendDataToArduino(this, DEVICE_ADDRESS, 'A', 'a');
// Char Flag 'A' wird an controller gesendet, controller reagiert auf
// Flag mit Led-ein Methode
}

public void led_aus() {
Amarino.sendDataToArduino(this, DEVICE_ADDRESS, 'B', 'b');
// Char Flag 'B' wird an Controller gesendet, controller reagiert auf
// Flag mit Led-aus Methode
}

// Sub-Klasse Empfaenger ist für den Datenempfang von Arduino zuständig
public class Empfaenger extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

// Deklariere und Initialisiere Variable data
String data = null;

// String wird in Variable data gelesen
data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

// Datentyp wird von Amarino ausgelesen
final int dataType = intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE,
-1);

// dataType wird mit Strin-Extra verglichen, wenn gleich
// wird data mit Extra-Data gefüllt
// --> muss bei anderem Datentyp angepasst werden
if (dataType == AmarinoIntent.STRING_EXTRA) {

data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

}

// Wenn data ungleich null dann... mach was immer du willst
if (data != null) {

// Anzeigefeld wird mit data gefüllt
mValueTV.setText(data);
}
}
}
}

Na dann einen schönen Osterurlaub...

Gruss

 

anything