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

问题描述

我已经编写了一个运行在 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()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...