Python 2.7 XBee xsc s3b+;Pyserial+;阿杜伊诺
我需要把arduino作为地面站连接到计算机上。在地面站,我需要实时高度,我需要能够移动伺服,或者像这里的例子一样,点亮LED。我不能用2.4ghz的xbee。因此,我将XBee XSC S3B设置为AT模式 现在,我收到了我的高度,但我不能向arduino发送任何命令(或者我不明白它到底是如何工作的)。这是我的Python GUI代码和arduino代码,它为我提供了高度。我在uart模式下使用Sparkfun Xbee屏蔽。我对比特、字节和所有类型的数据不太了解。我想知道从python向arduino发送什么,以及如何使用arduino阅读它来执行我想要的 不要介意if条件,我正在做一些测试,解释为什么它们不匹配 Python:Python 2.7 XBee xsc s3b+;Pyserial+;阿杜伊诺,python-2.7,arduino,pyserial,xbee,Python 2.7,Arduino,Pyserial,Xbee,我需要把arduino作为地面站连接到计算机上。在地面站,我需要实时高度,我需要能够移动伺服,或者像这里的例子一样,点亮LED。我不能用2.4ghz的xbee。因此,我将XBee XSC S3B设置为AT模式 现在,我收到了我的高度,但我不能向arduino发送任何命令(或者我不明白它到底是如何工作的)。这是我的Python GUI代码和arduino代码,它为我提供了高度。我在uart模式下使用Sparkfun Xbee屏蔽。我对比特、字节和所有类型的数据不太了解。我想知道从python向ar
#import libraries
import serial
from Tkinter import *
from PIL import ImageTk,Image
import time
import threading
main = Tk()
main.title('AVION CARGO 2021')
main.geometry('1300x700')
serialData = serial.Serial('COM6', 9600, bytesize=serial.SEVENBITS, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_ONE)
# creates a grid 50x50
rows = 0
while rows < 50:
main.rowconfigure(rows, weight=1)
main.columnconfigure(rows,weight=1)
rows += 1
# altitude print function
# put in serial data from arduino
altitude = [0]
zeroing_value = float(0)
def serialRead():
while True:
global zeroing_value
if (serialData.inWaiting() > 0):
altm_ = float(serialData.readline())
adjusted_alt = round((altm_ + zeroing_value), 2)
alt['text']='{} ft'.format(adjusted_alt)
altitude[0]=adjusted_alt
print altitude
time.sleep(0.2)
gliderflag = 0
nerfflag = 0
waterflag = 0
# drop function for dropping and writing the altitude at the moment of drop
def altGlider():
global gliderflag
CommandGlider = "g"
if gliderflag == 0:
serialData.write(CommandGlider.encode())
print(CommandGlider)
print type(CommandGlider)
txt = "{} ft".format(altitude[0])
glider['text']=txt
gliderflag += 1
else:
pass
def altNerf():
global nerfflag
CommandNerf = "n"
if nerfflag == 0:
serialData.write('2')
txt = "{} ft".format(altitude[0])
nerf['text'] = txt
nerfflag += 1
else:
pass
def altWater():
global waterflag
CommandWater = "w"
if waterflag == 0:
serialData.write(CommandWater.encode())
txt = "{} ft".format(altitude[0])
water['text'] = txt
waterflag += 1
else:
pass
# function to zero the altitude value in real time
zeroFlag = 0
def zero():
global zeroing_value
global altitude
global zeroFlag
if zeroFlag == 0:
zeroing_value = 0.0 - altitude[0]
zeroFlag += 1
zero['text'] = ' DONE '
else:
pass
# defines das label
lbl = Label(main, text='Data Acquisition System', font=('Arial Bold', 30))
lbl.grid(row=0, rowspan=10, column=0, columnspan=50)
# defines drop button
glider = Button(main, text='Glider', font=('Arial Bold', 70), command=altGlider)
glider.grid(row=10, rowspan=5, column=24, columnspan=25, sticky=E)
glider.config(width=10)
nerf = Button(main, text='Nerf', font=('Arial Bold', 70), command=altNerf)
nerf.grid(row=20, rowspan=5, column=24, columnspan=25, sticky=E)
nerf.config(width=10)
water = Button(main, text='Water', font=('Arial Bold', 70), command=altWater)
water.grid(row=30, rowspan=5, column=24, columnspan=25, sticky=E)
water.config(width=10)
# defines DAS BEGIN button
dasbegin = Button(main, text='DAS BEGIN', fg='red', font=('Arial Bold', 50), command=threading.Thread(target=serialRead).start)
dasbegin.grid(row=25, rowspan=8, column=0, columnspan=24, sticky=E)
dasbegin.config(width=10)
# defines zeroing button
zero = Button(main, text='ZERO ALTITUDE', font=('Arial Bold', 15), command=threading.Thread(target=zero).start)
zero.place(x=270, y=615)
# altitude Label
alt = Label(main, font=('Arial Bold', 100))
alt.place(x=150, y=250)
# altitude Text box for real time readings
#alt = Text(main, width=5, height=1, takefocus=0, font=('Arial Bold', 100))
#alt.place(x=70, y= 250)
# execute mainloop
main.mainloop()
#导入库
导入序列号
从Tkinter进口*
从PIL导入ImageTk,图像
导入时间
导入线程
main=Tk()
主标题(“航空货运2021”)
主要几何图形('1300x700')
serialData=serial.serial('COM6',9600,字节大小=serial.SEVENBITS,奇偶校验=serial.parity\u奇数,停止位=serial.stopbits\u ONE)
#创建一个网格50x50
行数=0
当行数小于50时:
main.rowconfigure(行,权重=1)
main.columnconfigure(行,权重=1)
行数+=1
#高度打印功能
#从arduino输入串行数据
海拔高度=[0]
归零_值=浮点(0)
def serialRead():
尽管如此:
全局归零_值
如果(serialData.inWaiting()>0):
altm_u2;=浮点(serialData.readline())
调整后的高度=四舍五入((高度+调零值),2)
alt['text']='{}ft'。格式(调整后的alt)
高度[0]=调整后的高度
打印高度
睡眠时间(0.2)
gliderflag=0
nerflag=0
水滞=0
#下降功能,用于在下降时下降并写入高度
def altGlider():
全局滑动滞后
CommandGlider=“g”
如果gliderflag==0:
serialData.write(CommandGlider.encode())
打印(命令滑翔机)
打印类型(CommandGlider)
txt=“{}ft.”格式(高度[0])
滑翔机['text']=txt
gliderflag+=1
其他:
通过
def altNerf():
全球能源公司
CommandNerf=“n”
如果nerflag==0:
serialData.write('2')
txt=“{}ft.”格式(高度[0])
nerf['text']=txt
nerflag+=1
其他:
通过
def altWater():
全球水滞
CommandWater=“w”
如果waterlag==0:
serialData.write(CommandWater.encode())
txt=“{}ft.”格式(高度[0])
水['text']=txt
水滞+=1
其他:
通过
#用于实时将高度值归零的功能
零标志=0
def zero():
全局归零_值
全球高度
全局零标志
如果zeroFlag==0:
归零_值=0.0-高度[0]
零标志+=1
零['text']='DONE'
其他:
通过
#定义das标签
lbl=标签(主标签,文本=“数据采集系统”,字体=('Arial Bold',30))
lbl.grid(行=0,行span=10,列=0,列span=50)
#定义下拉按钮
glider=按钮(main,text='glider',font=('Arial Bold',70),command=altGlider)
glider.grid(行=10,行跨度=5,列=24,列跨度=25,粘性=E)
glider.config(宽度=10)
nerf=按钮(main,text='nerf',font=('Arial Bold',70),command=altNerf)
能量网格(行=20,行span=5,列=24,列span=25,粘性=E)
nerf.config(宽度=10)
水=按钮(main,text='water',font=('Arial Bold',70),command=altWater)
水网格(行=30,行span=5,列=24,列span=25,粘性=E)
water.config(宽度=10)
#定义DAS开始按钮
dasbegin=按钮(main,text='DAS BEGIN',fg='red',font=('Arial Bold',50),command=threading.Thread(target=serialRead.start)
dasbegin.grid(行=25,行span=8,列=0,列span=24,粘滞=E)
dasbegin.config(宽度=10)
#定义调零按钮
zero=按钮(main,text='zero ALTITUDE',font=('Arial Bold',15),command=threading.Thread(target=zero).start)
零位(x=270,y=615)
#高度标签
alt=标签(主字体,字体=('Arial Bold',100))
alt.place(x=150,y=250)
#用于实时读数的高度文本框
#alt=文本(主,宽度=5,高度=1,takefocus=0,字体=('Arial Bold',100))
#高度位置(x=70,y=250)
#执行主循环
main.mainloop()
阿杜伊诺
#include <Wire.h>
#include "SparkFunMPL3115A2.h"
//Create an instance of the object
MPL3115A2 myPressure;
int LED = 8;
int LED2 = 6;
int LED3 = 10;
int n;
char Command;
void setup()
{
Wire.begin(); // Join i2c bus
Serial.begin(9600); // Start serial for output
myPressure.begin(); // Get sensor online
//Configure the sensor
myPressure.setModeAltimeter(); // Measure altitude above sea level in meters
//myPressure.setModeBarometer(); // Measure pressure in Pascals from 20 to 110 kPa
myPressure.setOversampleRate(7); // Set Oversample to the recommended 128
myPressure.enableEventFlags(); // Enable all three pressure and temp event flags
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
digitalWrite(LED, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
}
void loop()
{
float altitude = myPressure.readAltitudeFt();
if (Serial.available() >0){
Command = Serial.read();
}
// glider
if (Command == '2'){
digitalWrite(LED, HIGH);
delay(2000);
digitalWrite(LED, LOW);
delay(500);
}
// nerf
if (Command == 'n'){
digitalWrite(LED2, HIGH);
delay(2000);
digitalWrite(LED2, LOW);
delay(500);
}
// water
if (Command == 'w'){
digitalWrite(LED3, HIGH);
delay(2000);
digitalWrite(LED3, LOW);
delay(500);
}
Serial.println(altitude);
delay(400);
}
#包括
#包括“SparkFunMPL3115A2.h”
//创建对象的实例
MPL3115A2-myPressure;
int-LED=8;
int-LED2=6;
int-LED3=10;
int n;
char命令;
无效设置()
{
Wire.begin();//连接i2c总线
Serial.begin(9600);//开始串行输出
myPressure.begin();//使传感器联机
//配置传感器
myPressure.setModeAltimeter();//测量海平面以上的高度,单位为米
//myPressure.setModeBarometer();//测量20到110 kPa之间的压力,单位为帕斯卡
myPressure.setOversampleRate(7);//将过采样设置为建议的128
myPressure.enableEventFlags();//启用所有三个压力和温度事件标志
引脚模式(LED,输出);
引脚模式(LED2,输出);
引脚模式(LED3,输出);
数字写入(LED,低电平);
数字写入(LED2,低电平);
数字写入(LED3,低电平);
}
void循环()
{
浮动高度=我的压力。readAltitudeFt();
如果(Serial.available()>0){
Command=Serial.read();
}
//滑翔机
如果(命令=='2'){
数字写入(LED,高电平);
延迟(2000年);
数字写入(LED,低电平);
延迟(500);
}
//削弱
如果(命令=='n'){
数字写入(LED2,高);
延迟(2000年);
数字写入(LED2,低电平);
延迟(500);
}
//水
如果(命令=='w'){
数字写入(LED3,高);
延迟(2000年);
数字写入(LED3,低电平);
延迟(500);
}
串行打印LN(高度);
延迟(400);
}