精华内容
下载资源
问答
  • 8from pyfirmata importArduino, utilimporttimeimportcv2importnumpy as npimportserialser=serial.Serial()ser.baudrate= 9600 #设置波特率ser.port = 'COM6' #端口是COM3print(ser)ser.open()#打开串口print(se....

    #coding=utf-8

    from pyfirmata importArduino, utilimporttimeimportcv2importnumpy as npimportserial

    ser=serial.Serial()

    ser.baudrate= 9600 #设置波特率

    ser.port = 'COM6' #端口是COM3

    print(ser)

    ser.open()#打开串口

    print(ser.is_open) #检验串口是否打开#board = Arduino('COM3')

    """def duoji ():

    board.servo_config(13, 0, 255, 20)

    print("ceshi")

    time.sleep(0.2)

    board.servo_config(13, 0, 255, 255)

    time.sleep(0.2)

    def arduino ():

    board.digital[13].write(0) # 向io口13写入0

    time.sleep(0.1)

    board.digital[13].write(1) # 向io口13写入1

    time.sleep(0.1)

    board.analog [13].write(100)"""

    defdetect_circle_demo ():

    video_capture=cv2.VideoCapture(0)whileTrue:if notvideo_capture.isOpened():print('Unable to load camera.')breakret, img=video_capture.read()#img = cv2.pyrMeanShiftFiltering(img, 10, 25)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度图像

    circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT , 1, 100, param1=100, param2=100, minRadius=50,maxRadius=200)#cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)

    try: #如果上一步没有检测到。执行try内容,就会报错。可以修改尝试看下。

    circles = circles1[0, :, :] #提取为二维

    exceptTypeError:print('未发现圆形物体!!')else:

    circles= np.uint16(np.around(circles)) #四舍五入

    for i incircles[:]:

    cv2.circle(img, (i[0], i[1]), i[2], color=[0, 0, 0], thickness=2) #画圆

    cv2.circle(img, (i[0], i[1]), 2, color=[0, 255, 0], thickness=2) #画圆心

    cv2.putText(img, "center", (i[0] - 20, i[1] - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)print(i[0],i[1])print("检测到圆形物体,开始分离!")

    ser.write(b"a")#print(ser.read(1))

    #输出坐标

    #显示视频

    cv2.imshow('Video', img)

    cv2.waitKey(10)

    detect_circle_demo()"""dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。

    minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。

    param1,有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

    param2,也有默认值100。它是method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。

    minRadius,默认值0,表示圆半径的最小值。

    maxRadius,也有默认值0,表示圆半径的最大值"""

    展开全文
  • 我的课题主要是围绕python来做的,目前涉及到的就是python和matlab,以及python和Arduino之间的问题了。本文主要是为了记录自己在过程中遇到的一些问题,以及解决方法。1.软件安装问题。(1)用于安装实时软件的电脑...

    最近一段时间主要都是在忙于课题收尾阶段,涉及到很多平台验证问题,在这中间必不可少的环节就是解决不同软件硬件之间的通讯问题了。我的课题主要是围绕python来做的,目前涉及到的就是python和matlab,以及python和Arduino之间的问题了。本文主要是为了记录自己在过程中遇到的一些问题,以及解决方法。

    1.软件安装问题。

    (1)用于安装实时软件的电脑装的是XP系统,只支持python2.7及以下的版本。如果安装python3以上的版本,均无法安装使用。

    (2)XP系统只支持Anaconda2,不支持以上的版本,如果安装新的版本,就会报错:fail to create menu一类的ERROR,当时试了很多遍呀,心态血炸,还好最终调过来了呀TT

    (3)关于python在cmd窗口进行安装库

    现在很多库都是在pip18.1的版本下才能安装的,但是系统自带的又是怕pip8.1.1版本的,所以很多库如果不更新pip的话是无法进行安装使用的。又一个问题来了,如果你用的是anaconda,就会知道anaconda的导航里面是有很多的库直接就能安装的,但是有一个坑就是很多库的版本都相对比较老了。你在这个导航里面是找不到pip的最新版本的。这时候的解决方案就是通过命令窗口对pip进行更新(前提是电脑要联网),

    打开cmd串口,输入以下指令,就可以把pip直接升级到最新版本。

    更新:python -m pip install --upgrade pip

    查看当前函数库版本,cmd窗口输入以下指令:

    pip list

    如果更新到制定版本,cmd窗口输入以下指令:

    pip install --upgrade <库的名字>==指定版本

    如果更新到最新版本,cmd窗口输入以下指令:

    pip install --upgrade +<库的名字>

    卸载库,cmd窗口输入以下指令:

    pip uninstall + <库的名字>

    2.安装好了环境才能开始操作呀,接下来就是matlab和python之间的通信。matlab和python之间并没有可以进行直接通讯的接口,所以只有通过别的途径找到一个桥梁来让他们之间建立起通讯。恰好TPC通讯协议就可以满足两者之间通讯的需求。其中也遇到过几个问题:

    (1)怎么才能建立连接?

    必须要有相同的IP地址和端口号,IP地址怎么获得,可以通过命令窗口获得,但是我是直接通过以下来获取的:

    import socket

    IP= socket.gethostbyname(socket.gethostname())

    端口号我是任意取得,可以正常运行。

    (2)建立起TCP通讯,就会有Client端和Sever端,不要把这个搞混淆了。其中Client端是客户端,是发送请求或者说是发送指令的,客户端是接收指令的。

    客户端和服务端之间有一个操作顺序的问题,如果是先打开客户端的话,是无法找到连接的。因为服务端才是你数据要去的地方,也可以说是通讯的启动方是Sever端,信息的发起点是Client。

    (3)端口被占用的问题

    当你运行一次通讯程序后,必须要停掉程序,或者是将Port口关闭,否则在开始新的程序的时候是一定会被占用的。

    (4)python和matlab双方的发送和接收的函数

    python:

    import numpyas np

    import socket

    IP= socket.gethostbyname(socket.gethostname())# 服务器端可以写"localhost",可以为空字符串"",可以为本机IP地址

    print(IP)

    port= 80 # 端口号

    Tpc_sever= socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    Tpc_sever.bind((IP, port))#绑定Ip和端口

    Tpc_sever.listen(1)

    print('listen at port :', port)

    conn, addr= Tpc_sever.accept()

    print('connected by', addr)

    while True:

    data_string= str((conn.recv(100000000)))#接收数据

    data_split= data_string.strip(' ').split(' ')#将一整段的字符串进行分割

    data_filter_None= list(filter(None,data_split))#将空的字符串删去

    data_dig= list(map(lambda x: float(x),data_filter_None))#将字符转换为浮点型

    Info= np.array(data_dig).reshape([1,-1])

    # Info = int(data)

    print('recieved message:', Info)

    # data = data.decode

    # data = (conn.recv(1024)).decode() # 解码

    # np.save('data.npy', data)

    # Info = data

    # if not Info:

    # break

    #下面的语句是用来返回值的,我们这里不需要返回值所以直接注释掉

    # send = input('return:')

    # conn.sendall(send.encode()) # 再编码发送

    conn.close()

    Tpc_sever.close()

    matlab:

    data = [oxyHb,deoxyHb,totalHb,switch_signal];

    % 构造客户端tcpip对象

    tcpipClient = tcpip('192.168.0.153',80,'NetworkRole','Client');%设置对象属性,A端的IP为192.168.123.30

    set(tcpipClient,'OutputBufferSize',1000000000000); %设置缓存长度 经过验证一个double类型的数据数据栈据 8个缓存位,这个是设置发送的数据缓存 %并且这个设置的长度必须大于你要发送的数据的长度

    set(tcpipClient,'InputBufferSize',1024); %设置缓存长度 这个是设置接收的数据缓存

    set(tcpipClient,'Timeout',10); %设置连接时间为1分钟 %打开连接对象

    fopen(tcpipClient);

    ii=1;

    % a = num2str(signal);

    % fwrite(tcpipClient,a);

    while(1)

    % while(1)

    % nBytes = get(tcpipClient,'BytesAvailable'); %这里得到的数据是接收到的所有缓存个数,比如说有N 个字符 的数据,那么这个大小就是 N

    % if nBytes > 0

    % break;

    % end

    % end

    Data_Com = num2str(data(ii,:));

    fwrite(tcpipClient,Data_Com);

    nBytes_1(i)=nBytes;

    disp(i) % 接收命令

    receivedInstruction = fread(tcpipClient,nBytes,'int8');

    disp(strcat('received instruction is: ',char(receivedInstruction'))); % 反馈数据

    fwrite(tcpipClient,signal(i),'double');

    numSent = get(tcpipClient,'valuesSent');

    disp(strcat('Bytes of instruction is :',num2str(numSent)));

    ii=ii+1;

    pause(0.13)

    end % 关闭和删除连接对象

    fclose(tcpipClient);

    delete(tcpipClient);

    3.关于python和Arduino通讯

    这个方法看了晚上帖子介绍的方法其实都比较多,但是呀,没办法呀,python2.7真的已经是被抛弃了呀,好多库函数已经都不能用了。所以只能委曲求全,用最原始的串口通讯的方法。

    首先,要安装pyserial函数库。直接上代码了我就

    import serial

    import time

    def To_arduino(key_command):

    arduino = serial.Serial('COM5', baudrate=9600,timeout=1)

    print(arduino.portstr) # check which port was really used

    if (arduino.isOpen()):

    print("打开成功")

    else:

    print("打开失败")

    try:

    arduino.write(str(key_command)) #写入命令,因为另一端接收数据的格式是字符串,所以要转换成字符串进行数据传输,虽然Arduino端有直接接收数字的函数,但是我几经测试,还是没成功,暂时放弃了

    rev_data = arduino.readline() #接收Arduino返回数据

    if rev_data == b'':

    continue

    else:

    print(rev_data)

    time.sleep(1)

    except KeyboardInterrupt:

    arduino.close() #不关掉串口的话,即使你的程序终止,你的串口还是被占用的

    if __name__ == '__main__':

    To_arduino(1)

    Arduino端:

    int Rev;

    int Pin_Mark;

    int Timekeep;

    void setup() {

    // put your setup code here, to run once:

    Timekeep = 10;

    pinMode(13,OUTPUT);

    pinMode(2,OUTPUT);

    pinMode(3,OUTPUT);

    pinMode(4,OUTPUT);

    pinMode(5,OUTPUT);

    Serial.begin(9600);

    // while(Serial.read()>= 0){};

    Serial.setTimeout(1000); //串口超时 1000 毫秒

    }

    void loop()

    {

    // put your main code here, to run repeatedly:

    if (Serial.available()> 0)

    {

    Rev = Serial.read(); #读取串口中数据

    Pin_Mark = int(Rev)+2; #将字符转化为int型数据

    Serial.write(Pin_Mark);

    digitalWrite(Pin_Mark,HIGH); #将Pin_Mark引脚置为高电平

    delay(Timekeep);

    digitalWrite(Pin_Mark,LOW);#将Pin_Mark引脚置为低电平

    }

    }

    这里必须要吐槽一下了,可能是很久没有跟硬件打交道了,对这种没有print的结果输出的调试起来感觉很麻烦呀,我压根就不知道你穿过来的是什么信号。想过用串口助手,Arduino也确实是有串口监测器,但是问题来了呀,你如果是打开串口检测器,那你这个端口就是在被占用的状态呀,你是不能在从python数据发送端利用端口进行数据传输了呀,所以说,调试起来果然还是有点麻烦,所以我又把发到Arduino的数据发送给了python进行数据打印。0.0

    还有自己的一个误区,以为是必须要Arduino开发板的程序要在发送端的数据发送之前就要打开,而且也要和python的数据发送端同时运行,其实这是极端错误的。因为Arduino开发板只要你把程序烧写进去之后,只要连接端口就会立刻运行,并不需要去再进行额外的操作。只要你数据发送过来,就ok了。

    啊啊啊啊啊,目前只能回忆起来这么多了,先写到这里0.0

    回来补充一个很重要的关于和Arduino通信的一点就是Arduino的编程中,串口输入与输出都是针对ASCII码值的。比如你想得到一个97的数值,你需要输入字符‘a’,具才能在Serial.read()一段得到97这个数值。具体ASCII码需要查看以下链接:http://ascii.911cha.com/

    关于Serial.write函数,理论上Serial.write('a') 与Serial.write(97) 应该相同,然而事实并非如此。实际测试中,发现Serial.write(97) 与Serial.write('97') 相同,可知Serial.write()函数中有代码专门对这种情况进行了处理,将数字隐式地转化成了字符串,使用户不用关心ASCII码,并尽量贴近于其他语言。然而缺点就是与Serial.read()的不统一。为什么不把Serial.read()也封装的通用一点呢?TT研究了好几个小时才研究出来。0.0

    展开全文
  • 树莓派和Arduino使用USB进行通信基于Python——For初学者 https://blog.csdn.net/a_52hz/article/details/92197048python、pip、whl安装使用 https://www.cnblogs.com/klb561/p/9271322.html大佬们,怎么实现...

    树莓派和Arduino使用USB进行通信基于Python——For初学者 https://blog.csdn.net/a_52hz/article/details/92197048

    python、pip、whl安装和使用 https://www.cnblogs.com/klb561/p/9271322.html

    大佬们,怎么实现windows下的python与arduino串口通讯呢? http://tieba.baidu.com/p/5506283431

    PC上 python 通过串口和 arduino 读写交互成功,哈哈,真好玩 https://blog.csdn.net/wangtaonice/article/details/50334005

    Python和Arduino的串行通信 http://www.it1352.com/230021.html

    python中的serial问题 https://bbs.csdn.net/topics/392275020

    python3 异常处理 https://www.cnblogs.com/calvin-zhang/articles/9613679.html

    TypeError: unicode strings are not supported, please encode to bytes: 'hu' https://blog.csdn.net/you23hai45/article/details/71516031

    python中的&&及|| https://blog.csdn.net/wzx1286474341/article/details/80465794

    php7配置串口连接 dio https://blog.csdn.net/u014020153/article/details/77472145

    PHP和串口通信的方法介绍 https://blog.csdn.net/bjash/article/details/8487405

    PHP读取命令行输入 https://blog.csdn.net/supergao222/article/details/78905415

    PHP命令行脚本接收传入参数的三种方式 https://www.jb51.net/article/54015.htm

    php打开串口RS232 https://www.cnblogs.com/yuanlipu/p/5987834.html

    用PHP实现网页直接操作硬件串口 http://ju.outofmemory.cn/entry/350849

    展开全文
  • 起因:学校运河杯报了个项目,...因此我用python写了个上位机程序,用pyserial模块实现arduiho电脑的串口通讯,再用xlwt模块写入excel表格,用time模块获取时间作为excel的文件名。import xlwtimport timeimpor...

    起因:学校运河杯报了个项目,制作一个天气预测的装置。我用arduino跑了BME280模块,用蓝牙模块实现两块arduino主从机透传。但是为了分析,还需要提取出数据。因此我用python写了个上位机程序,用pyserial模块实现arduiho和电脑的串口通讯,再用xlwt模块写入excel表格,用time模块获取时间作为excel的文件名。

    import xlwt

    import time

    import serial

    #设置表格样式

    def set_style(name,height,bold=False):

    style = xlwt.XFStyle()

    font = xlwt.Font()

    font.name = name

    font.bold = bold

    font.color_index = 4

    font.height = height

    style.font = font

    return style

    #写Excel

    def write_excel():

    if serial.isOpen():

    print ('串口已打开\n')

    f = xlwt.Workbook()

    sheet1 = f.add_sheet('arduino_data',cell_overwrite_ok=True)

    row0 = ["temp","pres","hum"]

    time1=time.localtime(time.time())

    #写第一行

    for i in range(len(row0)):

    sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))

    i=1

    time.sleep(5)

    serial.flushInput()

    while True:

    try:

    size = serial.inWaiting()

    if size != 0:

    response = serial.read(size) # 读取内容并显示

    s=response.decode('utf-8').rstrip('\r\n').split('\t')

    if len(s)!=3:

    serial.flushInput()

    continue

    else:

    try:

    for j in range(len(s)):

    sheet1.write(i,j,int(s[j]),set_style('Times New Roman',220,False))

    print(s)

    serial.flushInput() # 清空接收缓存区

    i = i+1

    time.sleep(0.5)

    except ValueError:

    serial.flushInput()

    continue

    except KeyboardInterrupt:

    time2=time.localtime(time.time())

    f.save(r'C:\Users\10020\Desktop\arduino_data\{0}.{1}_{2:0>2d}.{3:0>2d}.{4:0>2d}-{5}.{6}_{7:0>2d}.{8:0>2d}.{9:0>2d}.xls'.format\

    (time1[1],time1[2],time1[3],time1[4],time1[5],

    time2[1],time2[2],time2[3],time2[4],time2[5]))

    serial.close()

    print(time1)

    print(time2)

    quit()

    if __name__ == '__main__':

    serial = serial.Serial('COM3',9600,timeout=2)

    write_excel()

    运行代码后会一直从串口读取arduino的数据,然后写入excel。按Ctrl+c来中止代码进程,此时会在C:\Users\10020\Desktop\arduino_data\这个文件夹下生成以“开始运行时间-结束运行时间”为名称的xls文件。

    代码的运行效果:

    20191014141032100.png

    20191014141032101.png

    需要注意的是:

    串口和波特率根据电脑上显示的COM口和设置的arduino波特率决定

    arduino是通过串口发送字节串到电脑,需要编码成utf-8再对字符串进行处理

    每一次接受完数据要清楚数据缓存

    总结

    以上所述是小编给大家介绍的python Arduino串口传输数据到电脑并保存至excel表格,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

    如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    本文标题: python 中Arduino串口传输数据到电脑并保存至excel表格

    本文地址: http://www.cppcns.com/jiaoben/python/280901.html

    展开全文
  • I am attempting to start a motor from the computer by code in Python 3.4, using pySerial to communicate to an Arduino Uno. I have packed the value I am sending to hexidecimal, so I only have one byte ...
  • I am attempting to start a motor from the computer by code in Python 3.4, using pySerial to communicate to an Arduino Uno. I have packed the value I am sending to hexidecimal, so I only have one byte ...
  • 利用Python实现串口通信--以Arduino UNO为例2020年08月11日| 萬仟网IT编程 | 我要评论 本博客为作者自我学习所整理,若对读者有帮助,不胜荣幸利用Python实现串口通信——以Arduino UNO为例实现原理基础内容Python...
  • 在第一个例子中,从 Arduino 设备开始基本的串行写操作。void setup() {// put your setup code here, to run once:Serial.begin(9600);}void loop() {// put your main code here, to run repeatedly:Serial....
  • 我有一个非常基本的python代码,可以使用在Ubuntu上运行的Python将命令发送到Arduino Uno R3.import serialimport timeser = serial.Serial('/dev/ttyACM0', 115200)time.sleep(2)if ser.isOpen():print "Port Open...
  • 前言因为Arduino具有丰富的外部接口,也拥有比较多可以直接使用的传感器,可以比较方便的获取大量环境数据,例如温度、湿度、声、光等。但这就有个问题,我要如何将arduino获取到的数据发送给树莓派进行进一步的处理...
  • 如何让arduino 和python 通过serial port 通信-*- coding: utf-8 -*-import telnetlib'''Telnet远程登录:Windows客户端连接Linux服务器'''# 配置选项Host = '192.168.1.2' # Telnet服务器IPusername = 'admin' # ...
  • 本帖最后由 ikuing 于 2016-4-2 19:36 编辑测试篇======================Arduino 端代码int red = 10;int yellow = 9;int blue = 8;String com = "";void setup(){pinMode(8, OUTPUT);pinMode(9,OUTPUT);pinMode(10,...
  • 1. def ser_write(num1,num2): try: ... bps = 9600 ... # 打开串口,并得到串口对象 ser = serial.Serial(portx, bps, bytesize=8, parity='N', stopbits=1, timeout=timex) # 写数据 ser.write(num1.en
  • 2018-05-0118:53:50 先上图: 再来视频: http://v.youku.com/v_show/id_XMzU3NzAwNzMyNA==.html?spm=a2hzp.8244740.0.0 ...from pyfirmata import Arduino, util import time import cv2 import num...
  • python读取arduino串口数据

    千次阅读 2020-07-27 21:32:36
    背景:Arduino101板子...# 读取arduino串口数据并保存 import serial import pandas as pd # sets up serial connection (make sure baud rate is correct - matches Arduino) # 设置串口号波特率Arduino匹配 se
  • 因此我用python写了个上位机程序,用pyserial模块实现arduiho电脑的串口通讯,再用xlwt模块写入excel表格,用time模块获取时间作为excel的文件名。 import xlwt import time import serial #设置表格样式 def set...
  • pc端通过pythonarduino实现通信

    千次阅读 2020-03-31 19:55:52
    最近想做个项目,利用python抓取网页信息数据,然后根据数据分析来控制arduino实现相应的动作操作,那么首先需要实现的是电脑端与arduino通信。 一、软件安装 首先我们需要在电脑上安装python以及pycharm,相应的...
  • 起因:学校运河杯报了个项目...因此我用python写了个上位机程序,用pyserial模块实现arduiho电脑的串口通讯,再用xlwt模块写入excel表格,用time模块获取时间作为excel的文件名。 复制代码 1 import xlwt 2 impor...
  • Jumper 于 2012-8-28 15:44 编辑自学了一阵python,但一直不精,一直想让python和...思路就是用arduino感应键盘,通过串口通讯发送到电脑,再用python模拟出来按键。电路非常简单可以参考弘大的那篇帖子http://www.g...
  • Python-Arduino-Command-API, 用于与Arduino微控制器板通信pythonpython Arduino命令 APIpython 命令API是一个轻量级的python 库,用于与 Arduino微控制器板通信通过标准的串行IO或者无线方式,通过标准串行IO...
  • matlab不运行一段代码PythonArduino控件 python和Arduino板之间的快速通信方法。 在真实系统上测试控制器时很有用,但您没有专业的设备 介绍 我创建了这个项目,因为众所周知,在电晕时期,以...串行通信以字节为单位
  • pythonarduino结合控制舵机

    千次阅读 多人点赞 2019-10-01 14:51:47
    pythonarduino结合控制舵机 文章目录pythonarduino结合控制舵机一.任务说明:二.环境说明:三实现说明:四代码说明:1. arduino代码2.python代码 一.任务说明: 我们要实现的是使用一个图像软件来控制舵机的...
  • ros与arduino串口通信python写在最前安装pyserial 写在最前 这篇文章是上一篇中, arduino与ros进行串口通信python实现版本. 可以对照查看, vscode开发ROS(19)-ros与arduino串口通信(c++). 安装pyserial ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,030
精华内容 412
关键字:

python和arduino串口通信

python 订阅