Передача данных от Android к Arduino через Bluetooth HC-05
- Войдите на сайт для отправки комментариев
Пт, 30/08/2013 - 14:37
Добрый день! Вчера приобрел в магазине ардуино нано и синезуб к нему. Сегодня проверил - все работает, но почему-то синезуб не принимает данные. Пользовался этой http://cxem.net/arduino/arduino64.php статьей, в ней неправильно указан пин 3.3 вольта, но это я исправил. В результате: синезуб обнаруживается, андроид сопряжается с ним и передает данные, но до ардуины данные не доходят (вообще не срабатывает Serial.available() ). Можете подсказать, с чем это может быть связано??
синезуб будет сопрягаться с андроидом даже если ему подать просто питание.
откуда вы знаете что данные доходят до синезуба и им принимаються?
каким способом вы посылаете данные из под андроида? терминал или готовая апликация?
как обрабатываете на стороне ардуины,правильно ли настроена скорось передачи данных на синезубе и ардуине.?
код в студию
01
char
incomingByte;
// входящие данные
02
int
LED = 12;
// LED подключен к 12 пину
03
04
void
setup
() {
05
Serial
.begin(9600);
// инициализация порта
06
pinMode(LED, OUTPUT);
07
Serial
.println(
"Press 1 to LED ON or 0 to LED OFF..."
);
08
}
09
10
void
loop
() {
11
if
(
Serial
.available() > 0) {
//если пришли данные
12
incomingByte =
Serial
.read();
// считываем байт
13
if
(incomingByte ==
'0'
) {
14
digitalWrite(LED, LOW);
// если 1, то выключаем LED
15
Serial
.println(
"LED OFF. Press 1 to LED ON!"
);
// и выводим обратно сообщение
16
}
17
if
(incomingByte ==
'1'
) {
18
digitalWrite(LED, HIGH);
// если 0, то включаем LED
19
Serial
.println(
"LED ON. Press 0 to LED OFF!"
);
20
}
21
}
22
}
Код главного активити на Андроиде
001
<code
class
=
"arduino plain"
style=
"margin:0px;padding:0px;border:0px;background-image:none;float:none;height:auto;line-height:1.1em;vertical-align:baseline;width:auto;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;color:#000000;"
>
package
com.example.bluetooth1;
002
003
import
java.io.IOException;
004
import
java.io.OutputStream;
005
import
java.util.UUID;
006
007
import
com.example.bluetooth1.R;
008
009
import
android.app.Activity;
010
import
android.bluetooth.BluetoothAdapter;
011
import
android.bluetooth.BluetoothDevice;
012
import
android.bluetooth.BluetoothSocket;
013
import
android.content.Intent;
014
import
android.os.Bundle;
015
import
android.util.Log;
016
import
android.view.View;
017
import
android.view.View.OnClickListener;
018
import
android.widget.Button;
019
import
android.widget.Toast;
020
021
public
class
MainActivity
extends
Activity {
022
private
static
final
String TAG =
"bluetooth1"
;
023
024
Button btnOn, btnOff;
025
026
private
static
final
int
REQUEST_ENABLE_BT =
1
;
027
private
BluetoothAdapter btAdapter =
null
;
028
private
BluetoothSocket btSocket =
null
;
029
private
OutputStream outStream =
null
;
030
031
// SPP UUID сервиса
032
private
static
final
UUID MY_UUID = UUID.fromString(
"00001101-0000-1000-8000-00805F9B34FB"
);
033
034
// MAC-адрес Bluetooth модуля
035
private
static
String address =
"00:15:FF:F2:19:4C"
;
036
037
/** Called when the activity is first created. */
038
@Override
039
public
void
onCreate(Bundle savedInstanceState) {
040
super
.onCreate(savedInstanceState);
041
042
setContentView(R.layout.activity_main);
043
044
btnOn = (Button) findViewById(R.id.btnOn);
045
btnOff = (Button) findViewById(R.id.btnOff);
046
047
btAdapter = BluetoothAdapter.getDefaultAdapter();
048
checkBTState();
049
050
btnOn.setOnClickListener(
new
OnClickListener() {
051
public
void
onClick(View v) {
052
sendData(
"1"
);
053
Toast.makeText(getBaseContext(),
"Включаем LED"
, Toast.LENGTH_SHORT).show();
054
}
055
});
056
057
btnOff.setOnClickListener(
new
OnClickListener() {
058
public
void
onClick(View v) {
059
sendData(
"0"
);
060
Toast.makeText(getBaseContext(),
"Выключаем LED"
, Toast.LENGTH_SHORT).show();
061
}
062
});
063
}
064
065
@Override
066
public
void
onResume() {
067
super
.onResume();
068
069
Log.d(TAG,
"...onResume - попытка соединения..."
);
070
071
// Set up a pointer to the remote node using it's address.
072
BluetoothDevice device = btAdapter.getRemoteDevice(address);
073
074
// Two things are needed to make a connection:
075
// A MAC address, which we got above.
076
// A Service ID or UUID. In this case we are using the
077
// UUID for SPP.
078
try
{
079
btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
080
}
catch
(IOException e) {
081
errorExit(
"Fatal Error"
,
"In onResume() and socket create failed: "
+ e.getMessage() +
"."
);
082
}
083
084
// Discovery is resource intensive. Make sure it isn't going on
085
// when you attempt to connect and pass your message.
086
btAdapter.cancelDiscovery();
087
088
// Establish the connection. This will block until it connects.
089
Log.d(TAG,
"...Соединяемся..."
);
090
try
{
091
btSocket.connect();
092
Log.d(TAG,
"...Соединение установлено и готово к передачи данных..."
);
093
}
catch
(IOException e) {
094
try
{
095
btSocket.close();
096
}
catch
(IOException e2) {
097
errorExit(
"Fatal Error"
,
"In onResume() and unable to close socket during connection failure"
+ e2.getMessage() +
"."
);
098
}
099
}
100
101
// Create a data stream so we can talk to server.
102
Log.d(TAG,
"...Создание Socket..."
);
103
104
try
{
105
outStream = btSocket.getOutputStream();
106
}
catch
(IOException e) {
107
errorExit(
"Fatal Error"
,
"In onResume() and output stream creation failed:"
+ e.getMessage() +
"."
);
108
}
109
}
110
111
@Override
112
public
void
onPause() {
113
super
.onPause();
114
115
Log.d(TAG,
"...In onPause()..."
);
116
117
if
(outStream !=
null
) {
118
try
{
119
outStream.flush();
120
}
catch
(IOException e) {
121
errorExit(
"Fatal Error"
,
"In onPause() and failed to flush output stream: "
+ e.getMessage() +
"."
);
122
}
123
}
124
125
try
{
126
btSocket.close();
127
}
catch
(IOException e2) {
128
errorExit(
"Fatal Error"
,
"In onPause() and failed to close socket."
+ e2.getMessage() +
"."
);
129
}
130
}
131
132
private
void
checkBTState() {
133
// Check for Bluetooth support and then check to make sure it is turned on
134
// Emulator doesn't support Bluetooth and will return null
135
if
(btAdapter==
null
) {
136
errorExit(
"Fatal Error"
,
"Bluetooth не поддерживается"
);
137
}
else
{
138
if
(btAdapter.isEnabled()) {
139
Log.d(TAG,
"...Bluetooth включен..."
);
140
}
else
{
141
//Prompt user to turn on Bluetooth
142
Intent enableBtIntent =
new
Intent(btAdapter.ACTION_REQUEST_ENABLE);
143
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
144
}
145
}
146
}
147
148
private
void
errorExit(String title, String message){
149
Toast.makeText(getBaseContext(), title +
" - "
+ message, Toast.LENGTH_LONG).show();
150
finish();
151
}
152
153
private
void
sendData(String message) {
154
byte
[] msgBuffer = message.getBytes();
155
156
Log.d(TAG,
"...Посылаем данные: "
+ message +
"..."
);
157
158
try
{
159
outStream.write(msgBuffer);
160
}
catch
(IOException e) {
161
String msg =
"In onResume() and an exception occurred during write: "
+ e.getMessage();
162
if
(address.equals(
"00:00:00:00:00:00"
))
163
msg = msg +
".\n\nВ переменной address у вас прописан 00:00:00:00:00:00, вам необходимо прописать реальный MAC-адрес Bluetooth модуля"
;
164
msg = msg +
".\n\nПроверьте поддержку SPP UUID: "
+ MY_UUID.toString() +
" на Bluetooth модуле, к которому вы подключаетесь.\n\n"
;
165
166
errorExit(
"Fatal Error"
, msg);
167
}
168
}
169
}</code>
А вообще, я же привел ссылку на статью - все оттуда брал. Просто с андроидом пока не дружу, на iOS только писал.
Схема полностью из статьи, за исключением одного: в статье вместо 3.3В на Bluetooth выводится AREF.
Может быть, кто-нибудь подскажет, как для начала без андрюши обойтись? Можно ли, например, с компа отправить что-нибудь по байтам?
Если в компе есть блютуз,то конечно можно через его подключится.управлять через какой нибудь хипертерминал или консоль у ардуины
У меня по такой схеме не определяется устройство, поэтому вряд ли получится через консоль что-то получить. Да и не за чем. С лампой все ок, а при приеме данных я ставил ее "поморгать" - ноль реакции.
Если честно, не понял, что вы имеете в виду под "подключиться". Мне бы просто гарантировано отправить нолик или единицу, чтобы исключить ошибки андроида..
вам нужно удостовериться что скорость в serial.begin(9600) равна скорости передачи данных от синезуба к ардуине,для этого либо читайте описание на синезуб на сайте где покупали,либо ищите в маркете терминал с потдержкой отправки по синезубу(это в случае того если у вас в настольном компьютере нет синезуба) и читайте как изменить скорость последовательного порта синезуба посредстврм АТ команд.
Так же при помощи того же терминала хоть с комрьютера хоть с андроида можно посылать сточки любого содержания и соответственно обрабатывать в скетче адруино,так чтокакой то спец программмы на андроид которая только влключат и выключает светодиод не нужно,
Хм, прочитал в датащите, что пин-код по умолчанию "0000", а я при сопряжении указывал "1234" - это может быть причиной? (нет возможности проверить сейчас..)
Пароль оказался верным: "1234". Скачал Bluetooth terminal для андроида, проверил - все заработало. Значит, дело в коде приложения для андроида, буду разбираться, всем спасибо!!!
Добрый день!
Проблема с тем же кодом, но другого плана, ардуино и андроид обмениваются данными, диод загорается, но вот приём ответного слова от ардуино работает через раз. То есть в телефоне принимается то нормальная строка ответного слова, то её часть, то комбинация кусков из сообщения, то вообще один символ. Никак не могу понять в чем дело. При обмене данными ардуино и компьютера через терминал вроде бы все нормально. У меня подозрения на неправильное определение конца сообщения или же неочистку приемного буфера.
Заранее спасибо за помощь
Попробуй также - через терминал, у меня все строчки полностью приходили. Думаю код кривой, надо разбираться и самому писать.
Все оказывается ещё интересней. Попробовал через приложение bluetooth terminal из маркета, которое якобы модифицированный блютуз чат и сэмплов приложений sdk. Все работает просто идеально, команда, на неё приходит ответ в виде строки, которую я задал в скетче ардуино. Попробовал установить сам блютуз чат, так в ответ на мою команду с телефона приходит 4 нарезанных кусками сообщения, как и в исходном коде темы. Просто там я видел только последнее сообщение, а здесь вижу, что в ответ на мою команду их приходит куча целая
Столкнулся с проблемой -при подключении к Windows 7 -винда сама устанавливает код для подключения модуля, нет графы с вводом своего кода подключения.
у меня тоже самое, что посоветуете, как ришить проблему?
все обнруживет только нет передчи н ардуино
скорость поменяйте на 38400
вот тут -> Serial.begin(9600); // инициализация порта
так же проверьте правильно устапновлена скорость на самом модуле(подключить к ардуино и AT командой)