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.
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();
}
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 sono incompatibili con la Leonardo :
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 !!!
... 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 ...
/* 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 ...
Comunque, guardando il disegno di quello Shield, sembrerebbe che TX e RX si possono collegare SOLO ai pin che vanno da 0 a 7 ...
... 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
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.
No, no, è una vera porcata ... ... 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 usare la Serial1.
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
Devi modificare il codice e usare la VERA seriale Serial1 di cui è dotata la Leonardo collegando lo Shield hai pin 0 e 1 ...
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
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();
}
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 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)
/* 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();
}