如何从Raspberry Pi Zero向PC发送实时传感器数据



我写了一个Python3脚本,它运行在Raspberry Pi Zero W上,从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], 5), round(dataAcc[2], 5)]
[gx, gy, gz] = [round(dataGyro[0], 5), round(dataGyro[1], 5), round(dataGyro[2], 5)]
[mx, my, mz] = [round(dataMag[0], 5), round(dataMag[1], 5), round(dataMag[2], 5)]
update(gx, gy, gz, ax, ay, az, mx, my, mz)
roll = getRoll()
pitch = getPitch()
yaw = getYaw()
print(f"Roll: {round(roll, 2)}tPitch: {round(pitch, 2)}tYaw: {round(yaw, 2)}")

我想做的事情是将这3个值发送到我的电脑并读取它们。有什么方法可以发送这些数据吗。(如果可能,serial除外(。

有很多方法可以做到这一点,仅举几个例子:

  • 从Raspi向PC发送UDP消息
  • 从Raspi向PC发送TCP流
  • 将读数放入Redis中,并允许网络上的任何人收集它们-示例如下
  • 使用MQTT客户端发布Raspi中的读数,并在作为服务器的PC上订阅该主题
  • 在一台机器上运行Python多处理器管理器并从另一台机器连接-请参阅";使用远程管理器">在这里
  • 通过蓝牙发送读数

以下是上面第一个建议与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, y, 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', 65000
server_address = (host, 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, y, 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, y, z = random.random(), random.random(), 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, userdata, msg):
message = msg.payload.decode()
print(f'Message received: {message}')

broker = '192.168.0.8'
client = mqtt.Client()
client.connect(broker,1883,60)
client.on_connect = on_connect
client.on_message = on_message
client.loop_forever()

这里有一个蓝牙通信的例子。


这里有类似的答案和更多的例子。

您可以在pi上设置一个简单的web服务器,并从同一网络上的任何设备访问该服务器,而无需进行任何花哨的设置。

如果你的pizero有wifi,或者你能得到适配器,你可以很容易地用flask或Django启动你的服务器。

最新更新