基于树莓派3b的嵌入式实验——蓝牙通信实验(python)

1.实验内容

本实验以树莓派开发板作为控制板,通过树莓派的 USB 母座连接 USB 转串口模块,再使用
板载蓝牙连接蓝牙模块,通过蓝牙模块发送控制信息,板载蓝牙模块接收并点亮 LED 模块
上不同位的灯

2.实验器材

2.1. 树莓派3B开发板

2.2. LED流水灯模块

本实验装置采用 1 个 8 位 RGB 三色 LED 流水灯模块来显示蓝牙模块接收到的值,
这个显示模块有 8 个 3 色 LED 发光二极管,采用共阳极的接法,低电平选中需要点亮的
LED 的位和颜色,需要开发板 8 路 IO 口。
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第1张图片

2.3. USB转串口

USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备

串口发送:
串口应用发送数据->USB串口驱动获取数据->驱动将数据经过USB通道发送给USB串口设备->USB串口设备接收到数据通过串口发送
串口接收:
USB串口设备接收串口数据->将串口数据经过USB打包后上传给USB主机->USB串口驱动获取到通过USB上传的串口数据->驱动将数据保存在串口缓冲区提供给串口应用读取

基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第2张图片
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第3张图片
串口通信基础:
当两个设备使用UART进行通信时,它们至少通过三根导线连接:TXD串口发送、RXD串口接收、GND。串口设备通过改变TXD信号线上的电压来发送数据,接收端通过检测RXD线上的电压来读取数据。
串口波特率::
波特率是指串口每秒钟传输的bit总数,如:9600波特率。表示1s传输9600个比特。1个比特所需时间为:1/9600 ≈ 0.104ms
串口异步通信:
解析串口数据需要确定一个字符的结束与下一个字符的开始。

串口数据线空闲时保持在逻辑1状态直到有字符发送。每个字节起始位在前,字节的每一位紧随其后,一位可选校验位以及一位或者两位停止位。起始位始终是逻辑0,通知对方有新串口数据可用。数据可以同时发送和接收,因此称为“异步”。
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第4张图片

  1. 偶校验:数据位加上校验位中的“1”的个数保持为偶数。
  2. 奇校验:数据位加上校验位中的“1”的个数保持为奇数。
  3. 空白校验:也称Space校验,校验位永远是0。
  4. 标志校验:也称Mark校验,校验位永远是1。
  5. 无校验:没有校验位存在或被传输。
    剩下的位称作停止位。在字符之间可能会有 1,1.5 或者 2 位停止位并且这些位总为 1。异步数据格式通常表达成“8N1”,“7E1”等。

2.4 HC-05 蓝牙模块

HC-05 蓝牙串口通信模块,是基于Bluetooth Specification V2.0带EDR蓝牙协议的数传模块。无线工作频段为2.4GHz ISM,调制方式是GFSK。模块最大发射功率为4dBm,接收灵敏度-85dBm,板载PCB天线,可以实现10米距离通信。

HC-05蓝牙串口通信模块是使用最广泛的一种蓝牙模块之一,因为HC05模块是一款高性能主从一体蓝牙串口模块,可以不用知道太多蓝牙相关知识就可以很好的上手。说白了,只是个蓝牙转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。
HC-05官方资料包
hc-05资料

基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第5张图片
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第6张图片
蓝牙模块工作模式:
蓝牙模块有两种工作模式:命令相应模式、自动连接模式
指示灯快闪:未连接
指示灯慢闪:AT命令模式
指示灯短亮长灭:已连接

  1. 命令响应模式:在蓝牙模块中有一个小按键,将HC-05与CH340连接后长按着按钮给模块上电,led灯快闪。

  2. 自动连接模式:什么也不用管,将HC-05与CH340连接后,插上电脑上电即可,led慢闪。

默认配置:
波特率:9600
配对密码:1234
默认名称:HC-05

3.实验记录

1. 在树莓派上安装蓝牙模块软件包

#安装蓝牙模块软件包
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
sudo apt-get install pi-bluetooth bluez bluez-firmware blueman
#将pi用户添加到蓝牙组
sudo usermod -G bluetooth -a pi
#然后重启生效
sudo reboot

2. 连接好各元器件接线
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第7张图片

3. 设置好蓝牙模块
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第8张图片
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第9张图片
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第10张图片
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第11张图片
若表示需要pin码,可输入1234
基于树莓派3b的嵌入式实验——蓝牙通信实验(python)_第12张图片
连接成功后,/dev 目录下会出现 rfcomm0 设备,在蓝牙设备列表里也能看见

到这里,树莓派的板载蓝牙与HC-05建立了蓝牙连接,HC-05通过USB转串口接入,所以在dev下可以看见ttyUSB0是HC-05,要从蓝牙模块发送消息,就是要使用ttyUSB0发送消息,然后通过板载蓝牙设备,rfcomm0接收,使用接收到的消息控制LED灯。

stty -F /dev/ttyUSB0  #查看设备波特率
dmesg | grep ttyUSB0  #查看串口的连接信息
python -m serial.tools.list_ports #命令python查看安装到系统上的串口

在这里插入图片描述
在这里插入图片描述

4.编写程序;
serial串口库的python库使用

import RPi.GPIO as GPIO
import time
import serial
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

LED0=22                         
LED1=23
LED2=24
LED3=10
LED4=9
LED5=25
LED6=11
LED7=8

LED=[LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7] 

GPIO.setup(LED0, GPIO.OUT)       
GPIO.setup(LED1, GPIO.OUT)
GPIO.setup(LED2, GPIO.OUT)
GPIO.setup(LED3, GPIO.OUT)
GPIO.setup(LED4, GPIO.OUT)
GPIO.setup(LED5, GPIO.OUT)
GPIO.setup(LED6, GPIO.OUT)
GPIO.setup(LED7, GPIO.OUT)

GPIO.setup(LED0, GPIO.HIGH)
GPIO.setup(LED1, GPIO.HIGH)
GPIO.setup(LED2, GPIO.HIGH)
GPIO.setup(LED3, GPIO.HIGH)
GPIO.setup(LED4, GPIO.HIGH)
GPIO.setup(LED5, GPIO.HIGH)
GPIO.setup(LED6, GPIO.HIGH)
GPIO.setup(LED7, GPIO.HIGH)

#serial configuration
ser_HC05 = serial.Serial('/dev/ttyUSB0',9600,timeout = 0.5)   #使用USB连接串行口
ser_pibluetooth = serial.Serial('/dev/rfcomm2',9600,timeout = 0.5)   #使用蓝牙连接串行口
ser_HC05.isOpen() #打开端口
ser_pibluetooth.isOpen()

while True:
    message=input("输入你想点亮的灯(0~7):")
    ser_HC05.write(message.encode()) #向端口写数据
    print("已从HC-05发送:" + message)
    ser_pibluetooth.inWaiting()
    receive_msg=ser_pibluetooth.read(6).decode()
    print("板载蓝牙接收到点亮的灯为:" + receive_msg)
    i=int(receive_msg)
    if GPIO.input(LED[i])==1 :
        GPIO.setup(LED[i], GPIO.LOW)
    else:
        GPIO.setup(LED[i], GPIO.HIGH)
import RPi.GPIO as GPIO
import time
import serial
import threading
import tkinter as tk
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#LED configuration
LED0=22                         
LED1=23
LED2=24
LED3=10
LED4=9
LED5=25
LED6=11
LED7=8

LED=[LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7] 

GPIO.setup(LED0, GPIO.OUT)       
GPIO.setup(LED1, GPIO.OUT)
GPIO.setup(LED2, GPIO.OUT)
GPIO.setup(LED3, GPIO.OUT)
GPIO.setup(LED4, GPIO.OUT)
GPIO.setup(LED5, GPIO.OUT)
GPIO.setup(LED6, GPIO.OUT)
GPIO.setup(LED7, GPIO.OUT)

GPIO.setup(LED0, GPIO.HIGH)
GPIO.setup(LED1, GPIO.HIGH)
GPIO.setup(LED2, GPIO.HIGH)
GPIO.setup(LED3, GPIO.HIGH)
GPIO.setup(LED4, GPIO.HIGH)
GPIO.setup(LED5, GPIO.HIGH)
GPIO.setup(LED6, GPIO.HIGH)
GPIO.setup(LED7, GPIO.HIGH)

#serial configuration
ser_HC05 = serial.Serial('/dev/ttyUSB0',9600,timeout = 0.5)   #使用USB连接串行口
ser_pibluetooth = serial.Serial('/dev/rfcomm2',9600,timeout = 0.5)   #使用蓝牙连接串行口
ser_HC05.isOpen() #打开端口
ser_pibluetooth.isOpen()


light_num=0   #要点亮的LED灯
#thread configuration
def LED_thread():
    print("LED_thread is running")
    time.sleep(3)
    while True:
        count=ser_pibluetooth.inWaiting()
        if count != 0:
            
            receive_msg=ser_pibluetooth.read(1).decode()
            print("板载蓝牙接收到点亮的灯为:" + receive_msg)
            i=int(receive_msg)
            if GPIO.input(LED[i])==1 :
                GPIO.setup(LED[i], GPIO.LOW)
            else:
                GPIO.setup(LED[i], GPIO.HIGH)
            time.sleep(0.5)
    

def btn0():
    ser_HC05.write('0'.encode()) #向端口写数据
    print("0 is writed")
def btn1():
    ser_HC05.write('1'.encode()) #向端口写数据
    print("1 is writed")
def btn2():
    ser_HC05.write('2'.encode()) #向端口写数据
    print("2 is writed")
    
def btn3():
    ser_HC05.write('3'.encode()) #向端口写数据
    print("3 is writed")
def btn4():
    ser_HC05.write('4'.encode()) #向端口写数据
    print("4 is writed")
def btn5():
    ser_HC05.write('5'.encode()) #向端口写数据
    print("5 is writed")
def btn6():
    ser_HC05.write('6'.encode()) #向端口写数据
    print("6 is writed")
def btn7():
    ser_HC05.write('7'.encode()) #向端口写数据
    print("7 is writed")
def tk_thread():
    windows = tk.Tk()
    windows.geometry('100x300')  # 规定窗口大小500*500像素
    windows.title('印朝的小窗口')
    windows.resizable(False, False)  # 规定窗口不可缩放
    
    B0 = tk.Button(windows, text ="0", command = btn0)
    B1 = tk.Button(windows, text ="1", command = btn1)
    B2 = tk.Button(windows, text ="2", command = btn2)
    B3 = tk.Button(windows, text ="3", command = btn3)
    B4 = tk.Button(windows, text ="4", command = btn4)
    B5 = tk.Button(windows, text ="5", command = btn5)
    B6 = tk.Button(windows, text ="6", command = btn6)
    B7 = tk.Button(windows, text ="7", command = btn7)
    
    B0.pack()
    B1.pack()
    B2.pack()
    B3.pack()
    B4.pack()
    B5.pack()
    B6.pack()
    B7.pack()
    windows.mainloop() #窗口循环显示


thread1_tk = threading.Thread(target = tk_thread,args = ()) #
thread2_led = threading.Thread(target = LED_thread,args = ()) #
print("开始采集和显示....")
thread1_tk.start()
thread2_led.start()

你可能感兴趣的:(python,单片机,stm32)