问题描述
我已经编写了一个运行在 Raspberry Pi Zero W 上的Python3脚本,该脚本从IMU传感器(MPU9250)收集数据并创建3个不同的角度值。滚动,俯仰,偏航。看起来像这样:
def main():
while True:
dataAcc = mpu.readAccelerometerMaster()
dataGyro = mpu.readGyroscopeMaster()
dataMag = mpu.readMagnetometerMaster()
[ax,ay,az] = [round(dataAcc[0],5),round(dataAcc[1],round(dataAcc[2],5)]
[gx,gy,gz] = [round(dataGyro[0],round(dataGyro[1],round(dataGyro[2],5)]
[mx,my,mz] = [round(dataMag[0],round(dataMag[1],round(dataMag[2],5)]
update(gx,gz,ax,az,mx,mz)
roll = getRoll()
pitch = getPitch()
yaw = getYaw()
print(f"Roll: {round(roll,2)}\tPitch: {round(pitch,2)}\tYaw: {round(yaw,2)}")
我要做的是将这3个值发送到我的PC并读取它们。有什么方法可以发送此数据。
(如果可能,serial
除外)。
解决方法
您可以在pi上设置一个简单的Web服务器,并从同一网络上的任何设备访问该服务器,而无需进行任何高级设置。
如果您的pi零具有wifi或可以获得适配器,则可以使用flask或Django轻松启动服务器。
,执行此操作的方法有很多,仅举几例:
- 从Raspi发送UDP消息到PC
- 从Raspi发送TCP流到PC
- 将读数放入 Redis ,并允许您网络中的任何人收集它们-例如here
- 使用MQTT客户端发布Raspi的读数,并作为服务器在PC上订阅该主题
- 通过蓝牙发送读数
这是UDP中上面第一个建议的可能实现。首先,Raspi端生成3个读数X,Y和Z,然后每秒通过UDP将它们发送到PC:
#!/usr/bin/env python3
import socket
import sys
from time import sleep
import random
from struct import pack
# Create a UDP socket
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host,port = '192.168.0.8',65000
server_address = (host,port)
# Generate some random start values
x,y,z = random.random(),random.random(),random.random()
# Send a few messages
for i in range(10):
# Pack three 32-bit floats into message and send
message = pack('3f',x,z)
sock.sendto(message,server_address)
sleep(1)
x += 1
y += 1
z += 1
这是PC端的匹配代码:
#!/usr/bin/env python3
import socket
import sys
from struct import unpack
# Create a UDP socket
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# Bind the socket to the port
host,port = '0.0.0.0',port)
print(f'Starting UDP server on {host} port {port}')
sock.bind(server_address)
while True:
# Wait for message
message,address = sock.recvfrom(4096)
print(f'Received {len(message)} bytes:')
x,z = unpack('3f',message)
print(f'X: {x},Y: {y},Z: {z}')
这是MQTT建议的可能实现。首先,发布者正在发布三个值。请注意,我的台式机上运行着mosquitto
代理:
#!/usr/bin/env python3
from time import sleep
import random
import paho.mqtt.client as mqtt
broker = '192.168.0.8'
client = mqtt.Client()
client.connect(broker,1883,60)
# Generate some random start values
x,random.random()
# Send a few messages
for i in range(10):
# Publish out three values
client.publish("topic/XYZ",f'{x},{y},{z}');
sleep(1)
x += 1
y += 1
z += 1
这是订户,它监听消息并打印消息:
#!/usr/bin/env python3
import socket
import sys
import paho.mqtt.client as mqtt
def on_connect(client,userdata,flags,rc):
print("Connected with result code "+str(rc))
client.subscribe("topic/XYZ")
def on_message(client,msg):
message = msg.payload.decode()
print(f'Message received: {message}')
broker = '192.168.0.8'
client = mqtt.Client()
client.connect(broker,60)
client.on_connect = on_connect
client.on_message = on_message
client.loop_forever()