icefire2012

  • 2018-12-27
  • 加入了学习《是德两分钟导师系列课程第一季》,观看 神奇的采集模式

  • 加入了学习《选择正确的示波器探头》,观看 选择正确的示波器探头

  • 2018-10-17
  • 加入了学习《信号完整性及高速数字电路设计》,观看 2

  • 加入了学习《信号完整性及高速数字电路设计》,观看 1

  • 加入了学习《电磁场与电磁波视频教程》,观看 电磁场与电磁波视频教程01

  • 加入了学习《TI Device Selection Guide》,观看 如何选择AMPS产品

  • 回复了主题帖: 求做一下卷子

    呵呵,题目都看不清楚

  • 回复了主题帖: 嵌入式加密想了解目前有什么新的方案了吗?怎样才能更好的保护主控程序的安全呢?

    http://bbs.eeworld.com.cn/huodong/burnon_20180920/

  • 回复了主题帖: 树莓派3B+测评评奖结果公布

    感谢!再接再厉!

  • 2018-10-09
  • 加入了学习《11. TI 高精度实验室放大器系列 - 静电释放 (ESD)》,观看 11.1 TI 高精度实验室 - 静电释放 (ESD)

  • 2018-10-07
  • 回复了主题帖: 【树莓派3B+测评】与8266通信

    本帖最后由 icefire2012 于 2018-10-7 19:20 编辑         如果一直要使用蓝牙功能,或者不想麻烦修改uart的映射关系,也可以通过加一个usb转串口工具来实现串口通信。树莓派3B+上有四个USB口。我现在用putty远程访问操作树莓派,这四个USB口都空着呢。我用了一个USB转串口模块,主芯片是CH340C,而且带+5V和+3.3V电源输出,可以通过该3.3V电源给8266供电。CH340方案的USB转串口模块插到树莓派上系统可自动识别,不需要安装驱动。         将USB转串口模块插到树莓派上后,用命令查看一下当前的设备情况。 ls -l /dev复制代码         可以看到识别出来的设备名称为ttyUSB0。另外需要更改一下测试代码,将第41行中的"/dev/ttyAMA0"更改为"/dev/ttyUSB0"即可。

  • 发表了主题帖: 【树莓派3B+测评】与8266通信

    本帖最后由 icefire2012 于 2018-10-7 19:01 编辑         这一篇是树莓派与ESP8266的通信。         简单的示意图如下:         手机作为AP,树莓派和ESP8266分别连接到该热点上。这里ESP8266用的是官方的模组,需要外部MCU通过串口发送AT指令控制。那这个MCU就由树莓派代劳了。树莓派和ESP8266之间建立TCP连接,树莓派作为服务器,ESP8266作为客户端。本质就是树莓派自己在这绕着圈子自言自语,呵呵。 一、准备工作         手机建立AP热点,名称为:AP01,密码为12345678         树莓派和ESP8266之间需要四根连线。分别是3.3V电源,GND,以及串口的tx和rx。ESP8266所需的电源从树莓派上获取。之前提到过,树莓派的IO扩展口中有路UART,如下图所示。根据树莓派官方的资料,树莓派3B+上的串口控制器默认是分配给了蓝牙,这里要用串口,需要更改配置,将串口分配到IO扩展口上。具体的方法网上有不少,我是参照这个网页上的教程来设置的(http://shumeipai.nxez.com/2016/0 ... art-use-issues.html)。注意:该网页内容中“编辑/boot目录下的cmdline.txt文件”一步我跳过了。因网页下面有留言更改后无法启动,所以我跳过了(我自己的猜测而已,没有证实)。跳过不影响本实验。                        测试的时候,还是用的python编程,这里需要先安装一下python下的串口模块。我之前做蓝牙时,串口模块已经被安装上了,这里还是贴一下安装命令: sudo pip install pyserial复制代码 或者 sudo pip3 install pyserial复制代码 二、测试代码         先将测试代码贴在这里 import os import time from multiprocessing import Process import serial import socketserver #TCP Server class Myserver(socketserver.BaseRequestHandler):     def handle(self):         conn = self.request         while True:             uclient_dat=conn.recv(1024)             print('rcv from 8266:%s' %(str(uclient_dat,'utf8')))             if(uclient_dat==bytes('liang ge huang li ming cui liu','utf8')):                 conn.sendall(bytes('yi hang bai lu shang qing tian','utf8'))             else:                 conn.sendall(bytes("I don't know",'utf8')) def tcpServer(name):     print('%s start...' %name)     userver=socketserver.ThreadingTCPServer(('192.168.43.125',8200),Myserver)     userver.serve_forever() #TCP Client def getRSP(ser):     size=ser.inWaiting()     sbuf=ser.read(size)     print(sbuf) #1 set to station mode #2 set ssid #3 chek ip addr #4 creat socket param=('AT+CWMODE_CUR=1\r\n',        'AT+CWJAP_CUR="AP01","12345678"\r\n',        'AT+CIPSTA?\r\n',        'AT+CIPSTART="TCP","192.168.43.125",8200\r\n') def tcpClient8266(name):     print('%s start...' %name)     ser=serial.Serial("/dev/ttyAMA0",115200)     for prm in param:         ser.write(prm.encode())                                         time.sleep(8)         getRSP(ser)     dat_tx='liang ge huang li ming cui liu'     print(len(dat_tx))     while True:         ser.write('AT+CIPSENDEX=30\r\n'.encode())               time.sleep(1)         getRSP(ser)         ser.write(dat_tx.encode())               time.sleep(1)         getRSP(ser) if __name__=='__main__':     p1=Process(target=tcpServer,args=('tcpServer',))     p2=Process(target=tcpClient8266,args=('tcpClient8266',))     p1.start()     p2.start()     while True:         pass复制代码 三、简要说明         测试程序启动后,建立了两个进程,tcpServer和tcpClient8266,并分别启动,见代码57-60行。         进程tcpServer的代码在8-22行,建立的server的ip为192.168.43.125(也就是树莓派的IP),socket端口为8200。此server只做一件事,接收客户端的数据,如果收到的为汉语拼音“两个黄鹂鸣翠柳”,则回复汉语拼音“一行白鹭上青天”,否则回复“I don't know”。         进程tcpClient8266的代码在25-54行。首先打开串口(line41),串口设备为/dev/ttyAMA0,使用的波特率为115200,其它都用默认配置。然后通过串口发送AT指令配置8266模块。配置的参数param一共有四个,第一个是设置8266为station模式;第二个是设置要连接的热点名称和密码;第三个是获取8266分配到的网络配置信息,包括IP地址,子网掩码,网关等;第四个是建立tcp连接,服务器地址和socket端口就是tcpServer进程中设置的信息。每发送一个配置信息,都会等待8266完成配置,并接收8266返回的配置信息,并打印出来(通过getRSP()函数)。每条配置信息完成的时间不尽相同,这里没有去解析回复信息,简单起见,都做了一个比较长的延时(line44)。建立连接后,就可以通信了。48-54行是在循环发送汉语拼音“两个黄鹂鸣翠柳”,并接收服务器传回来的信息。 最终的演示效果如下:         手机上的连接示意图如下:第一个是树莓派,第二个是8266,第三个是开发PC机。 四、结语         在这个例子里,树莓派一方面构建一个web服务器,另外一方面,可以直接挂载其它的物联网模块,这里是用串口和连接了wifi模块,也可以连接433或zigbee模块。如果进一步拓展功能,就能成为一个功能丰富的物联网网关,管理众多的物联网节点。也可以通过IO扩张上的I2C以及SPI接口也可以直接挂载传感器模块获取相应的传感器数据。后续将继续在这方面拓展做一些有意思的小应用。

  • 发表了日志: 【树莓派3B+测评】与8266通信

  • 2018-09-30
  • 加入了学习《用树莓派和无线模块搭建物联网》,观看 用树莓派和无线模块搭建物联网(1)系统展示

  • 加入了学习《用树莓派和无线模块搭建物联网》,观看 用树莓派和无线模块搭建物联网(2)接线

  • 2018-09-29
  • 发表了日志: 【树莓派3B+测评】与CC2640R2F通信的简单示例

  • 发表了主题帖: 【树莓派3B+测评】与CC2640R2F通信的简单示例

    本帖最后由 icefire2012 于 2018-9-29 23:56 编辑 上一篇,树莓派和手机通过蓝牙通信,用的是经典蓝牙。这一篇中将尝试用蓝牙的另外一种模式,低功耗蓝牙BLE。主角当然是树莓派3B+,与之搭配做通信测试的,是当前一款比较流行的BLE SoC,TI的CC2640R2F(以下简称R2F)。 一、R2F上程序的简单介绍         R2F是CC2640的升级版, 增加了FLASH空间,支持蓝牙5并向下兼容蓝牙4.x。测试时,R2F上跑的是官方提供的SDK中的simple_peripheral demo程序。在SDK中的路径为:         simple_peripheral文件夹下的README.html是这个demo程序的介绍及演示过程。简单来讲,simple_peripheral例程提供了一个服务custom service,custom service下有五个characteristics,每个characteristics或者可读,或者可写,或者可通知,或者需要先authentication才能读取。README文档展示了手机上的BLE scanner App访问这五个characteristics的过程。这个演示基本涵盖了BLE通信中的常见操作。         那接下来的操作,将是在树莓派上通过python编程,与R2F通信,逐一访问这五个characteristics,重复一遍README文档中的演示操作。下面是具体的介绍。 二、PYGATT         上一篇测评中,树莓派和手机之间的经典蓝牙通信,用的是蓝牙中的RFCOMM协议。现在树莓派与R2F之间的通信,用到的是BLE中的GATT协议。Python有一个名为pygatt的模块,提供了python编程时访问GATT descriptors的API接口。         下面是pygatt的安装方法: sudo pip install pygatt复制代码sudo pip install "pygatt[GATTTOOL]"复制代码sudo pip install pexpect复制代码         注意:pexpect也是需要手动安装的。否则下面运行代码时会报与pexpect有关的错误。 三、python编程访问R2F的代码         先将通信代码贴在这里。 import pygatt import sys from time import sleep def notify_callback(handle,value):     print("notify:handle=%d,value=%d" %(handle,ord(value))) adapter = pygatt.GATTToolBackend() try:     adapter.start()     device = adapter.connect('54:6C:0E:6D:D7:96')     dev_name = device.char_read("00002a00-0000-1000-8000-00805f9b34fb")     print("DevName:%s" %dev_name)     print("Char 1 wr=66")     device.char_write_handle(30,bytearray([66]))     #char1=device.char_read_handle(30)     char1=device.char_read('0000fff1-0000-1000-8000-00805f9b34fb')     print("Char 1 rd=%x" %ord(char1))     #char2=device.char_read_handle(33)     char2=device.char_read('0000fff2-0000-1000-8000-00805f9b34fb')     print("Char 2 rd=%x" %ord(char2))     print("Char 3 wr=88")     device.char_write_handle(36,bytearray([88]))     device.subscribe('0000fff4-0000-1000-8000-00805f9b34fb',notify_callback,False)     sleep(10)     print("Char 5 rd=")     char5=device.char_read('0000fff5-0000-1000-8000-00805f9b34fb')     for i in char5:         print(i) finally:     adapter.stop()复制代码 四、代码说明         在与R2F通信之前,我们需要先获取一些通信对象R2F的参数,这些可以通过python调用pygatt的API获得。这里是在终端里输入几个指令来获取。         首先是获取R2F的地址,需要先扫描一下:         sudo hcitool lescan                 第五行的SimpleBLEPeripheral便是R2F了,它的地址是54:6C:0E:6D:D7:96         接下来是获取R2F的service和characteristics信息。                  这里需要关注的是蓝框中的handle值和绿框中的uuid。最上面框住的一行,是用来获取设备名称的,最下面框住的五行,就是第一部分中提到的5个characteristics。下面编程访问,都需要对应的char value handle或者uuid(第一部分截图中的uuid是16位的,这里应该是补全成标准格式的uuid了,fff1-fff5还是很好识别的)。         除了char value handle和uuid,前面的handle似乎就是个顺序标号,在下面的编程中没有用到这个。char properties是指明读写和通知属性的。读=0x02  写=0x08  通知=0x10。 characteristics1(uuid=0xfff1)是可读可写的,那么它的char properties=0x02|0x08=0x0a         下面简单介绍一下程序内容。         第12行是通过指定地址,建立与R2F的连接         第13行是获取R2F的设备名称,char_read的参数是uuid,返回值是characteristics对应的值。         第17行是通过handle写characteristics1,char_write_handle的第一个参数是上面图片中的char value handle,十六进制的0x1e是十进制的30,第二个参数是要写入的值。         第19行是通过uuid读characteristics1,我尝试用char_read_handle通过char value handle去读,但总是报错,这个目前还没弄明白是怎么回事。         第29行是使能characteristics的notification并注册回调函数,subscribe函数的第一个参数是characteristics的uuid,第二个参数是通知的回调函数句柄,第三个参数为True时为indicate,为False时为notification。回调函数的两个参数是系统收到notification传回来的,分别是对应的char value handle以及返回的数值。         第33行是也是一个读操作,如simple_peripheral例程的介绍文档README中所描述的,要读取characteristics5 先要有认证过程。用BLE scanner读取时,会弹出配对的对话框,并提示输入配对密码(这个密码是R2F那端给出的,会实时通过串口把密码打印出来)。这里python编程读取时,也会尝试与R2F配对,但一般都是失败,这个我猜测可能是没有输入配对密码的缘故(也不会有任何提示要输入配对密码的)。         为了绕过这个过程,我尝试先让树莓派和R2F配对上,我在图形界面里点击最上方的蓝牙图标,搜索到SimpleBLEPeripheral,点击pair,提示输入配对密码,然后正确配对上了。但是运行程序到读取characteristics5时,依然会提示配对失败。后来我尝试通过在终端中调用bluetoothctl相关的指令建立配对,中间也有曲折,但是按如下操作,也是可以实现配对的,并且此后再一次运行程序读取characteristics5时,是可以成功读取的。         终端中运行bluetoothctl建立配对的截图如下(左侧是R2F的打印信息,右侧是树莓派终端中的操作,红框是需要输入的指令)。如果上来直接pair device,则会报错。需要先remove device,再trust device,最后pair,这样成功率较高。pair成功后会打印出R2F上的service等信息,因内容较多,这里只截了两行(图片中的最后两行)。         最后附上python程序运行时,R2F以及python程序的打印信息截图。那两行notify,是在sleep(10)的十秒钟时间内收到的两个通知信息。其余的,与第一部分中介绍的例程中的操作基本一致。 五、总结         这一篇里,主要是通过python的pygatt模块编程完成了与CC2640R2F的一些通信操作。另外中途还用到了gatttool和bluetoothctl这两个工具。整个流程走下来,还是学到了很多linux上与BLE相关的东西,对BLE的通信过程,以及service,characteristics,notification等概念有了初步的了解。当然对gatt的内容还只是略知皮毛。         就python下的ble相关的模块而言,我找到的,除了pygatt,还有pygattlib和bluepy。运用另外两个模块我也实现了与R2F的读写操作,但是在处理notification遇到了问题,首先就是不知道如何使能notification,R2F的程序上默认characteristics4 的notification是关闭的,但我在这两个模块上都没有找到打开操作的API,另外回调函数的实现形式上也没有pygatt的API这么容易理解。如果大家谁在这方面有心得,也可以交流一下。         受时间限制,蓝牙这一块就告一段落了,后续开始实现8266与树莓派的通信。

  • 加入了学习《工程师应该掌握的20个电路》,观看 手工焊接训练

  • 加入了学习《工程师应该掌握的20个电路》,观看 整流与滤波电路测量

  • 加入了学习《工程师应该掌握的20个电路》,观看 滤波电路仿真

TA暂时无记录哦~

最近访客

< 1/3 >

统计信息

已有27人来访过

  • 芯币:113
  • 好友:--
  • 主题:6
  • 回复:10
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言