Bluetooth Shield

Salve a tutti, vorrei inviare comandi a una scheda Arduino attraverso una bluetooth shield usando uno
smartphone Android.
Sono nuovo del mondo Arduino, e da un paio di settimane sono bloccato su questo, ho letto vari post
sul web senza trovare risposte.

Per testarla ho provato a usare uno sketch molto semplice, fornito come esempio alla shield,
dovrebbe ricevere dal bluetooth e stampare sulla seriale e viceversa.
Ho provato molte app per Android, tra cui le più gettonate, senza risultati.

La cosa che non riesco a capire è che riesco a inviare dal monitor seriale del pc (usb), allo
smartphone, ma non viceversa, in pratica è come se la shield bluetooth inviasse dati solamente,
senza riceverli.
Inoltre non riesco a inviare alcune lettere come la “o” minuscola.

Scheda Arduino: Leonardo
Shield Bluetooth :Seeed Studio SLD63030P http://www.seeedstudio.com/wiki/Bluetooth_Shield

Smartphone: HTC Nexus One
App (terminale bluetooth): Connection Terminal

IDE Arduino : 1.5.8
S.O. pc : Windows 7

Sketch:

/*
BluetoothShield Demo Code Slave.pde. This sketch could be used with
Master.pde to establish connection between two Arduino. It can also
be used for one slave bluetooth connected by the device(PC/Smart Phone)
with bluetooth function.
2011 Copyright (c) Seeed Technology Inc.  All right reserved.
 
Author: Steve Chang
 
This demo code is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
 
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.
 
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
For more details about the product please check http://www.seeedstudio.com/depot/
 
*/
 
 
/* Upload this sketch into Seeeduino and press reset*/
 
#include <SoftwareSerial.h>   //Software Serial Port
#define RxD 6
#define TxD 7
 
#define DEBUG_ENABLED  1
 
SoftwareSerial blueToothSerial(RxD,TxD);
 
void setup() 
{ 
  Serial.begin(9600);
  pinMode(RxD, INPUT);
  pinMode(TxD, OUTPUT);
  setupBlueToothConnection();
 
} 
 
void loop() 
{ 
  char recvChar;
  while(1){
    if(blueToothSerial.available()){//check if there's any data sent from the remote bluetooth shield
      recvChar = blueToothSerial.read();
      Serial.print(recvChar);
    }
    if(Serial.available()){//check if there's any data sent from the local serial terminal, you can add the other applications here
      recvChar  = Serial.read();
      blueToothSerial.print(recvChar);
    }
  }
} 
 
void setupBlueToothConnection()
{
  blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable 
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  blueToothSerial.flush();
}

Grazie in anticipo :slight_smile:

Quel programma, così come è NON può funzionare sulla tua Leonardo ...

... basta infatti che vai a leggere le spiegazioni della libreria SoftwareSerial per accorgerti che i piedini scelti [u]sono incompatibili con la Leonardo[/u] :

Not all pins on the Leonardo and Micro support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)

Devi modificare le connessioni ... ti consiglio di spostarle su RX=pin10 e TX=pin11 ... se fai un po' di ricerche qui sul forum ci sono un'infinità di thread che ne parlano, non in ultimo un intero thread in Megatopic !!!

Guglielmo

A parte che sulla Leonardo puoi usare la Serial1 sui pin 0 e 1 senza distrurbare il Serial monitor che si trova su Serial.

... lascia stare Paolo, lo incasini ancora di più ... visto che tutto il codice che ha è scritto per usare la SoftwareSerial ;)

Nel software basta che modifica le due #DEFINE ... il problema è vedere se quello shield che usa permette lo spostamento a piacere dei pin TX e RX del modulo ... :roll_eyes:

Guglielmo

Prova questo

/* Upload this sketch into Seeeduino and press reset*/

// #include <SoftwareSerial.h>   //Software Serial Port
// #define RxD 6
// #define TxD 7
#define blueToothSerial Serial1

#define DEBUG_ENABLED  1

// SoftwareSerial blueToothSerial(RxD,TxD);

void setup()
{
  Serial.begin(9600);
  // pinMode(RxD, INPUT);
  // pinMode(TxD, OUTPUT);
  setupBlueToothConnection();
}

void loop()
{
  char recvChar;
  while (1) {
    if (blueToothSerial.available()) { //check if there's any data sent from the remote bluetooth shield
      recvChar = blueToothSerial.read();
      Serial.print(recvChar);
    }
    if (Serial.available()) { //check if there's any data sent from the local serial terminal, you can add the other applications here
      recvChar  = Serial.read();
      blueToothSerial.print(recvChar);
    }
  }
}

void setupBlueToothConnection()
{
  blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  blueToothSerial.flush();
}

Sposta i jumper della shield su 1 e 0.

EDIT: Il connettore I2C/Analog della shield non funziona sulla Leonardo in modalità I2C ma solo analogico.

… Ahahahahah … che porcata … solo tu te la potevi inventare … :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Comunque, guardando il disegno di quello Shield, sembrerebbe che TX e RX si possono collegare SOLO ai pin che vanno da 0 a 7 … :frowning:

… e quindi non ci sono alternative … magari a questo punto potrebbe fare lo sforzo e riscrivere bene il codice, senza quella porcata di #define e senza includere la SoftwareSerial :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo

gpb01: ... Ahahahahah ... che porcata ... solo tu te la potevi inventare ... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Io la considero una soluzione elegante. Punti di vista. ;)

La Serial1 è sui pin 0 e 1 quindi nel range di configurazione della shield. :sunglasses:

Devi modificare le connessioni ... ti consiglio di spostarle su RX=pin10 e TX=pin11 ... se fai un po' di ricerche qui sul forum ci sono un'infinità di thread che ne parlano, non in ultimo un intero thread in Megatopic !!!

Grazie mille per la risposta :)

Ho fatto una prova al volo collegando con jumpers la Leonardo alla shield

Leonardo pin 10 --- 6 bluetooth shield Leonardo pin 11 --- 7 bluetooth shield

modificando lo sketch cambiando questi 2 pin, il tutto perché sulla shield bluetooth ci sono dei ponticelli per decidere quali pin Rx e Tx usare, ma vanno solo dal pin 0 al 7.

Adesso riesco a inviare anche dallo smartphone al seriale, ma i caratteri sono tutti sballati e incomprensibili, mentre dal seriale dell' ide allo smartphone arrivano quasi tutti corretti.

PaoloP: Io la considero una soluzione elegante.

No, no, è una vera porcata ... :smiling_imp: ... che, oltretutto, nel suo caso, non serve, visto che comunque, quello Shield assieme alla Leonardo, con la SoftwareSerial NON potrà MAI usarlo, quindi, tanto vale fare le cose per bene ;)

PaoloP: La Serial1 è sui pin 0 e 1 quindi nel range di configurazione della shield

Infatti, è quanto ho affermato ... ;D ... con quello Shield e con la Leonardo ... NON ha alcuna alternativa se non quella di [u]usare la Serial1[/u].

Guglielmo

Iommi: ... modificando lo sketch cambiando questi 2 pin, il tutto perché sulla shield bluetooth ci sono dei ponticelli per decidere quali pin Rx e Tx usare, ma vanno solo dal pin 0 al 7 ...

@lommi : ... stai leggendo quello che ti stiamo dicendo assieme a PaoloP ? ? ? :o

[u]Devi[/u] modificare il codice e usare la VERA seriale Serial1 di cui è dotata la Leonardo collegando lo Shield hai pin 0 e 1 ... :roll_eyes:

Guglielmo

P.S. : Puoi inizialmente farlo con la #define suggerita da Paolo e, verificato che va, eliminare del tutto sia quella #define che la SoftwareSerial, riscrivendo il codice in modo pulito per la Serial1 ;)

Grazie PaoloP ! :slight_smile:

Ho caricato questo codice da te inviato e spostato i jumpers, e funziona tutto perfettamente, anche i caratteri arrivano tutti leggibili.

/* Upload this sketch into Seeeduino and press reset*/

// #include <SoftwareSerial.h>   //Software Serial Port
// #define RxD 6
// #define TxD 7
#define blueToothSerial Serial1

#define DEBUG_ENABLED  1

// SoftwareSerial blueToothSerial(RxD,TxD);

void setup()
{
  Serial.begin(9600);
  // pinMode(RxD, INPUT);
  // pinMode(TxD, OUTPUT);
  setupBlueToothConnection();
}

void loop()
{
  char recvChar;
  while (1) {
    if (blueToothSerial.available()) { //check if there's any data sent from the remote bluetooth shield
      recvChar = blueToothSerial.read();
      Serial.print(recvChar);
    }
    if (Serial.available()) { //check if there's any data sent from the local serial terminal, you can add the other applications here
      recvChar  = Serial.read();
      blueToothSerial.print(recvChar);
    }
  }
}

void setupBlueToothConnection()
{
  blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  blueToothSerial.flush();
}

Grazie a tutti :smiley:

@lommi : ... stai leggendo quello che ti stiamo dicendo assieme a PaoloP ? ? ? :o

Scusate stavo facendo le prove e rispondendo e i post si sono accavallati...

Grazie ancora

Iommi: Ho caricato questo codice da te inviato e spostato i jumpers, e funziona tutto perfettamente, anche i caratteri arrivano tutti leggibili.

Bene, ora che ti è chiaro che funziona con la Serial1 ...

... come esercizio :D prendi il codice, elimini la #define aggiunta da Paolo, elimini la SoftwareSerial e lo riscrivi usando SOLO la Serial (che già c'è) e la Serial1 al posto della SoftwareSerial (... che poi è quello che fa quella #define) :)

Così vediamo se ti è tutto chiaro ... ;)

Guglielmo

Ora ci provo… :slight_smile:

/* Upload this sketch into Seeeduino and press reset*/



#define DEBUG_ENABLED  1



void setup()
{
  Serial.begin(9600);
  setupBlueToothConnection();
}

void loop()
{
  char recvChar;
  while (1) {
    if (Serial1.available()) { //check if there's any data sent from the remote bluetooth shield
      recvChar = Serial1.read();
      Serial.print(recvChar);
    }
    if (Serial.available()) { //check if there's any data sent from the local serial terminal, you can add the other applications here
      recvChar  = Serial.read();
      Serial1.print(recvChar);
    }
  }
}

void setupBlueToothConnection()
{
  Serial1.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  Serial1.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  Serial1.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  Serial1.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  Serial1.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  Serial1.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  Serial1.flush();
}

... funziona correttamente ?

Guglielmo

Si, l'ho provato e si comporta come dovrebbe. :) Grazie per l'aiuto.