2018-04-16 17:13:35 qq_2918 阅读数 176
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    406 人正在学习 去看看 陈贤能

Arduino 101/Genuino 101板子与arduino 相比多了一些功能,其中一个就是多了一块4.0的蓝牙BLE。

4.0蓝牙接收数据的协议与2.0的有所不同,更加复杂。

如下代码为101板子自带的BLE模块接收int类型数据源码。

#include <CurieBLE.h>

BLEPeripheral blePeripheral; 

BLEService lightService("19B10000-E8F2-537E-4F6C-D104768A1214"); 
BLEIntCharacteristic   switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

void setup() {
  
  Serial.begin(9600);
  blePeripheral.setLocalName("LIU_BLE_01");
  blePeripheral.setAdvertisedServiceUuid(lightService.uuid());

  blePeripheral.addAttribute(lightService);
  blePeripheral.addAttribute(switchCharacteristic);

  switchCharacteristic.setValue(0);
  blePeripheral.begin();
  Serial.println("BLE Light service.");
}

void loop() {

  BLECentral central = blePeripheral.central();

  if (central) {
    Serial.print("Connected to central: ");
    Serial.println(central.address());

    while (central.connected()) {
      if (switchCharacteristic.written()) {
          Serial.println(switchCharacteristic.value());
      }
    }
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
  }
} 


2015-05-04 23:23:16 stayneckwind2 阅读数 12946
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    406 人正在学习 去看看 陈贤能

1、概述

1.1 背景

本文基于《Android创建Service后台常驻服务并使用Broadcast通信》扩展蓝牙通信的功能,使用手机作为Client,HC06芯片作Service进行通信。

1.2 需求

1)手动打开手机的蓝牙开关,打开app,自动连接HC06
2)按键1、2、3、4,通过HC06向下位机发送命令1、2、3、4
3)下位机反馈信息通过Toast回显到屏幕

2、知识点

2.1 HC06

HC06是主从一体化的蓝牙串口模块,主从可指令切换,AT指令少于HC-05,使用简单。
如下图设备管理器所示,连接后相当于串口来使用即可,同时Arduino编程上与普通Serial串口类编程方法一致。


2.2 Android蓝牙开发

Android 平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输,以下是建立蓝牙连接所需要的基本类[1]:
1)BluetoothAdapter 类:代表了一个本地的蓝牙适配器。发现其他蓝牙设备,查询绑定了的设备,
使用已知的 MAC 地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。
2)BluetoothDevice 类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取 远端蓝牙设备的名称、地址、种类和绑定状态。
3)Bluetoothsocket 类:代表了一个蓝牙套接字的接口(类似于 tcp 中的套接字),他是应用程 序通过输入、输出流与其他蓝牙设备通信的连接点。
4)Blueboothserversocket 类:代表打开服务连接来监听可能到来的连接请求(属于 server 端), 为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。
5)Bluetoothclass 类:描述了一个蓝牙设备的一般特点和能力。他的只读属性集定义了设备 的主、次设备类和一些相关服务。

3、实现

3.1 HC06与Arduino连接

主要引脚接法:
1)VCC:接Arduino的5V。
2)GND:接Arduino的GND。
3)TXD:发送端,一般表示为自己的发送端,接Arduino的RX。
4)RXD:接收端,一般表示为自己的接收端,接Arduino的TX。
线接好后,把Arduino上电后,蓝牙的指示灯是闪烁的,表明没有设备连接上(建立 RFCOMM 信道),注意一下匹配和连接的区别:
1)匹配:只是说明对方设备发现了你的存在,并拥 有一个共同的识别码,并且可以连接。
2)连接上:表示当前设备共享一个 RFCOMM 信道并且两者之间可以交换数据。
也就是是说蓝牙设备在建立 RFCOMM 信道之前,必须是已经配对好了的。

以下给出一个简单的串口控制IO口的简单例子,IO口控制可以做LED操作,或者衍生到电机驱动L298N的控制。
在循环体中,间隔每30ms读取一个命令位,做相应的动作。
void setup()
{
  Serial.begin(9600);
  pinMode(L1, OUTPUT);
  pinMode(L2, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  Serial.println(F("L298N Program start..."));
}
void loop()
{
  int value = 0;
  if ( Serial.available() )
  {
    value = Serial.read();
  }
  else 
  {
    value = 'x';
  }
  if ( value == '0' )
  {
    go_stop();
    Serial.println(F("0:stop"));
  }
  else if ( value == '1' )
  {
    go_up();
    Serial.println(F("1:up"));
  }
  else if ( value == '2' )
  {
    go_down();
    Serial.println(F("2:down"));
  }
  else if ( value == '3' )
  {
    go_left();
    Serial.println(F("3:left"));
  }
  else if ( value == '4' )
  {
    go_right();
    Serial.println(F("4:right"));
  }
  delay(30);
}

3.2  Android蓝牙编程

从需求1上进行设计,即进入App之前先打开蓝牙,并匹配过HC06设备。
将蓝牙操作的动作设计在Service类中处理,使用双进程操作。

定义变量,其中UUID为固定的值
private static final UUID HC_UUID   = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private BluetoothAdapter mBtAdapter = null;
private BluetoothSocket mBtSocket   = null;
private OutputStream outStream = null;
private InputStream  inStream  = null; 
private boolean mBtFlag = true;
获取蓝牙适配器方法,由于寻找设备连接设备为耗时动作,放在线程中处理
/**
 * Called by onStartCommand, initialize and start runtime thread 
 */
private void myStartService() {
	mBtAdapter = BluetoothAdapter.getDefaultAdapter();
	if ( mBtAdapter == null ) {
		showToast("Bluetooth unused.");
		mBtFlag  = false;
		return;
	}
	if ( !mBtAdapter.isEnabled() ) { 
		mBtFlag  = false;
		myStopService();
		showToast("Open bluetoooth then restart program!!");
		return;
	}
	
	showToast("Start searching!!");
	threadFlag = true;
	mThread = new MyThread();
	mThread.start();
}
子线程主要做两件事:连接蓝牙设备和读蓝牙信息
/**
 * Thread runtime
 */
public class MyThread extends Thread {        
	@Override
	public void run() {
		super.run();
		myBtConnect();
		while( threadFlag ) {
			readSerial();
			try{
				Thread.sleep(30);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}
看看蓝牙的连接,其中BluetoothDevice 的获取有两种方法,一种是已知HC06的MAC地址直接连接,文中使用的另一种方式:通过查找已匹配的设备来获取BluetoothDevice。
获取Device后建立RFcomm信道,然后打开IOStream就可以进行读写[2]。
/**
 * device control
 */
public void myBtConnect() {
	showToast("Connecting...");
	
	/* Discovery device */
//	BluetoothDevice mBtDevice = mBtAdapter.getRemoteDevice(HC_MAC);
	BluetoothDevice mBtDevice = null;
	Set<BluetoothDevice> mBtDevices = mBtAdapter.getBondedDevices();
	if ( mBtDevices.size() > 0 ) {
		for ( Iterator<BluetoothDevice> iterator = mBtDevices.iterator(); 
				iterator.hasNext(); ) {
			mBtDevice = (BluetoothDevice)iterator.next();
			showToast(mBtDevice.getName() + "|" + mBtDevice.getAddress());
		}
	}
	
	try {
		mBtSocket = mBtDevice.createRfcommSocketToServiceRecord(HC_UUID);
	} catch (IOException e) {
		e.printStackTrace();
		mBtFlag = false;
		showToast("Create bluetooth socket error");
	}
	
	mBtAdapter.cancelDiscovery();
	
	/* Setup connection */
	try {
		mBtSocket.connect();
		showToast("Connect bluetooth success");
		Log.i(TAG, "Connect " + HC_MAC + " Success!");
	} catch (IOException e) {
		e.printStackTrace();
		try {
			showToast("Connect error, close");
			mBtSocket.close();
			mBtFlag = false;  
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
	
	/* I/O initialize */
	if ( mBtFlag ) {
		try {
			inStream  = mBtSocket.getInputStream();
			outStream = mBtSocket.getOutputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	showToast("Bluetooth is ready!");
}
读串口放置于子线程中处理。
/**
 * Read serial data from HC06
 */
public int readSerial() {
	int ret = 0;
	byte[] rsp = null; 
	
	if ( !mBtFlag ) {
		return -1;
	}
	try {
		rsp = new byte[inStream.available()];
		ret = inStream.read(rsp);
		showToast(new String(rsp));
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return ret;
}

写串口在主线程操作,通过上一篇文章可知,Activity获取用户事件,发送广播给Service,Service解析广播的内容,之后就写串口动作。
/**
 * Write serial data to HC06
 * @param value - command
 */
public void writeSerial(int value) {
	String ha = "" + value;
	try {
		outStream.write(ha.getBytes());
		outStream.flush();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

4、结论

本文与《Android创建Service后台常驻服务并使用Broadcast通信》共同整理总结了Android与Arduino的蓝牙通信方法,为后续蓝牙遥控小车做下基础。
后续将制作一个自定义摇杆来进行方向的控制,到时再将工程放出来,谢谢大家支持!


参考文章:
[1] Android蓝牙开发指南
[2] 一篇比较详细的蓝牙编程实例, http://www.2cto.com/kf/201312/265157.html

2019-10-10 19:57:15 woshi_ziyu 阅读数 117
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    406 人正在学习 去看看 陈贤能

蓝牙低功耗(BLE)是蓝牙的一个版本,它是经典蓝牙的更小、优化度更高的版本。它也被称为智能蓝牙。 BLE的设计考虑到了低成本、低带宽、低功耗和低复杂度的最低功耗。 ESP32具有内置的BLE功能,但对于像Arduino这样的其他微控制器,可以使用nRF24L01。该RF模块还可以用作BLE模块,将数据发送到其他蓝牙设备,如智能手机、计算机等。

在本篇文章中,我们将演示如何使用nRF24L01通过BLE发送一些数据。我们将使用Arduino和nRF模块通过BLE将DHT11的温度读数发送到智能手机。

蓝牙低功耗(BLE)如何不同?

BLE因其功耗特性而被采用,因为它只需使用纽扣电池即可长时间运行。与其他无线标准相比,BLE的快速增长因其在智能手机、平板电脑和移动计算领域的显着应用而进一步加快。

NRF24L01模块的BLE功能

BLE使用相同的2.4 GHz ISM频段,波特率从250Kbps到2Mbps,这在许多国家是允许的,可以应用于工业和医疗应用。频段从2400 MHz到2483.5 MHz开始,分为40个信道。这些信道中的三个被称为“Advertising”,并且被设备用于发送具有关于它们的信息的广告分组,以便其他BLE设备可以连接。这些信道最初选择在频带的较低上部和频带的中间,以避免可能干扰多个信道的干扰。

在这里插入图片描述

本文将介绍如何将NRF24L01模块用作BLE收发器。今天,将通过将传感器数据发送到智能手机来介绍该模块的BLE功能。这个nRF24L01模块将连接到Arduino微控制器,DHT11传感器温度数据将被发送到官方的Nordic BLE android应用程序。

更多内容请访问以下链接:https://www.yiboard.com/thread-1181-1-1.html

2015-12-22 11:19:30 sdlgq 阅读数 4729
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    406 人正在学习 去看看 陈贤能

蓝牙模块使用方法也比较简单,直接串口操作,无需额外的库文件。

首先还是先看看模块长什么样子:

这里写图片描述

【注意蓝牙的工作电压】这个模块兼容3.6-6V电压,所以我接在5V电压上使用。

首先是对蓝牙模块进行设置,我是用TTL转接口连接到电脑上,通过AT指令进行设置的。

蓝牙与ttl的连接:GND-GND ; VCC - 5V ; TX - RX ; RX - TX。

这里写图片描述

连接上后,打开串口调试工具,发送指令。

常用指令如下:

1、设置蓝牙名称:AT+NAME后面直接跟着写蓝牙名称
2、设置配对码:AT+PIN后面直接跟着写配对码
3、设置波特率:AT+BAUD后面直接跟着写波特率编号,编号如下:
      1——1200
      2——2400
      3——4800
      4——9600
      5——19200
      6——38400
      7——57600
      8——115200
      9——230400
4、设置串口停止位:AT+STOP后面跟0、1(0:1停止位;1:2停止位;默认为0)
5、设置串口校验位:AT+PARI后面跟0、1、2(0:无校验;1:奇校验;2:偶校验;默认为0)
6、软件重启 (500ms 后重启): AT+RESET
7、软件重置 (500ms 后恢复默认设置):AT+DEFAULT
8、设置上电是否进入低功耗 (可配对):AT+PWRM后面跟0或1(0:进入低功耗;1:正常工作;默认为1)
9、进入低功耗:AT+SLEEP
10、设置/查询—主/从模式:AT+ROLE后面跟0或1(0:从设备;1:主设备;默认为0)
11、搜索蓝牙设备(主模式指令):AT+INQ
12、显示搜索到的蓝牙设备 (主模式指令):AT+SHOW
13、连接远端设备(主模式指令):AT+CONN后面跟搜索的 0~8 设备序号
14、设置模块功率:AT+POWE后面跟0、1、2、3(0:-23dB;1:-6dB;2:0dB;3:+4dB;默认值为2)
15、帮助:AT+HELP

本次测试的为HC-06从机,仅需设置以下几个选项即可:
1、设置蓝牙名称为GodKing:AT+NAMEGodKing
2、设置配对码123123:AT+PIN123123
3、设置波特率19200:AT+BAUD19200

好了,设置完毕,手机蓝牙搜索连接一下试试,OK
下面开始接到arduino板子上测试了。
接线方法跟ttl一样:GND-GND ; VCC - 5V ; TX - RX ; RX - TX。
代码如下,试试效果吧

void setup() {
  Serial.begin(19200); //蓝牙串口开始工作,波特率为19200
  pinMode(4,OUTPUT);//设置数据指示灯,收到数据后闪烁
  delay(1000);
}
void loop() {
  String shuju=Serial.readString();
  if (shuju == "one")//收到指令“one”时闪烁一次
  {
    digitalWrite(4,HIGH);
    delay(200);
    digitalWrite(4,LOW);
    }
  if (shuju == "two")//收到指令“two”时闪烁两次
  {
    digitalWrite(4,HIGH);
    delay(200);
    digitalWrite(4,LOW);
    delay(200);
    digitalWrite(4,HIGH);
    delay(200);
    digitalWrite(4,LOW);
     }
delay(500);  
}

蓝牙发送数据,只需要 Serial.print 或 Serial.println 即可。

2018-08-19 20:59:35 li1886477130 阅读数 3203
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    406 人正在学习 去看看 陈贤能

arduino的智能小车的功能3:蓝牙遥控
arduino智能小车小车的蓝牙遥控
材料清单:
HC-05的蓝牙模块;
arduino的智能小车一台;
杜邦线若干:
首先我们需要在电脑上下载串口调试软件,并进行蓝牙的调试,确保蓝牙模块可以正常使用和可以进行通信,手机端下载SPP蓝牙串口,可以进行信息的传送还有终端的接收显示,还可以进行按键和开关的编辑。
下面是串口调试软件,在上面进行正确的设置,然后确认蓝牙模块可以正常发送和接收信息,即可进行蓝牙模块在小车上的安装。
这里写图片描述

注意RX和TX的反接。
下载程序时RX,TX上面不要接东西。
接下来是代码。
代码段的思路是,当接收到1时,小车直行,当接收到2时,小车后退,当接收到3时,小车左转,当接收到4时,小车右转,其他命令时,小车暂停。

#include <Servo.h>
Servo s;  //舵机
int mL1=6;//左1
int mL2=5;
int mR1=11;//右1
int mR2=3;

void setup()
{ 
  s.attach(9);//舵机信号线
  s.write(68);//舵机初始化角度 
  Serial.begin(9600);
  pinMode(mL1,OUTPUT);
  pinMode(mL2,OUTPUT);
  pinMode(mR1,OUTPUT);
  pinMode(mR2,OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
  char num = Serial.read();
  Serial.println(num);
  if(num == '1'){
    line(); 
  }else if(num == '2'){
    back();
  }else if(num == '3') {
    L();
    }else if(num == '4'){
      R();
      }else{
        lull();
        }
  }
}
void line(){//直线
    analogWrite(mL1,30);
    analogWrite(mL2,LOW);
    analogWrite(mR1,30);
    analogWrite(mR2,LOW);
    delay(300);
}


void lull(){//暂停 
  digitalWrite(mR1,LOW);
  digitalWrite(mL1,LOW);
  digitalWrite(mR2,LOW);
  digitalWrite(mL2,LOW);
  delay(10);
}


void back(){//后退
    analogWrite(mL1,0);
    analogWrite(mL2,40);
    digitalWrite(mR1,LOW);
    analogWrite(mR2,40);
    delay(0);
}


 void R(){//右转
    analogWrite(mL1,70);
    analogWrite(mL2,0);
    analogWrite(mR1,0);
    analogWrite(mR2,53);
    delay(600);
}

void L(){//左转
    analogWrite(mL1,0);
    analogWrite(mL2,20);
    analogWrite(mR1,60);
    analogWrite(mR2,0);
    delay(600);
    }

Arduino的使用

阅读数 379

没有更多推荐了,返回首页