Example: 08-RPC-Library/34-Remote-Control/image_transfer_raw_as_the_remote_device.py

# 本作品采用MIT许可证授权。
# 版权所有 (c) 2013-2023 OpenMV LLC。保留所有权利。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# 图像传输 - 作为远程设备
#
# 此脚本设计用于与另一台运行"image_transfer_raw_as_the_controller_device.py"的OpenMV Cam配对
#
# 此脚本展示了如何将帧缓冲区从一个OpenMV Cam传输到另一个。

import rpc
import sensor
import struct

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

# 上述RPC库已安装在您的OpenMV Cam上,并提供了多个类,
# 使您的OpenMV Cam可以通过CAN、I2C、SPI、UART或LAN/WLAN进行控制。

################################################################
# 选择您希望通过哪种接口控制您的OpenMV Cam。
################################################################

# 取消注释以下行以设置您的OpenMV Cam通过CAN进行控制。
#
# * message_id - 用于在CAN总线上传输数据的CAN消息(11位)。
# * bit_rate - CAN比特率。
# * sample_point - Tseg1/Tseg2比率。通常为75%。(50.0, 62.5, 75.0, 87.5等)
#
# 注意:主设备和从设备的消息ID和CAN比特率必须匹配。将主设备的CAN高连接到从设备。
#       can high and master can low to slave can lo. The can bus must be terminated with 120 ohms.
#
# interface = rpc.rpc_can_slave(message_id=0x7FF, bit_rate=1000000, sample_point=75.0)

# 取消注释以下行以设置您的OpenMV Cam通过I2C进行控制。
#
# * slave_addr - I2C地址。
#
# 注意:主设备和从设备地址必须匹配。将主设备的scl连接到从设备的scl,主设备的sda
#       to slave sda. You must use external pull ups. Finally, both devices must share a ground.
#
# interface = rpc.rpc_i2c_slave(slave_addr=0x12)

# 取消注释以下行以设置您的OpenMV Cam通过SPI进行控制。
#
# * cs_pin - 从设备选择引脚。
# * clk_polarity - 空闲时钟电平(0或1)。
# * clk_phase - 在时钟的第一个边沿(0)或第二个边沿(1)采样数据。
#
# 注意:主设备和从设备的设置必须匹配。将CS、SCLK、MOSI、MISO分别连接到CS、SCLK、MOSI、MISO。
#       Finally, both devices must share a common ground.
#
interface = rpc.rpc_spi_slave(cs_pin="P3", clk_polarity=1, clk_phase=0)

# 取消注释以下行以设置您的OpenMV Cam通过UART进行控制。
#
# * baudrate - 串行波特率。
#
# 注意:主从设备的波特率必须一致。将主设备的tx连接到从设备的rx,主设备的rx连接到
#       slave tx. Finally, both devices must share a common ground.
#
# interface = rpc.rpc_uart_slave(baudrate=7500000)

################################################################
# 回调
################################################################


# 调用时设置像素格式和帧大小,拍摄快照
# 然后返回帧缓冲区形状以存储图像。
#
# 数据是一个4字节的像素格式和4字节的帧大小。
def raw_image_snapshot(data):
    pixformat, framesize = struct.unpack("<II", data)
    sensor.set_pixformat(pixformat)
    sensor.set_framesize(framesize)
    img = sensor.snapshot()
    return struct.pack(
        "<IIII", sensor.width(), sensor.height(), sensor.get_pixformat(), img.size()
    )


def raw_image_read_cb():
    interface.put_bytes(sensor.get_fb().bytearray(), 5000)  # 超时


# 从帧缓冲区读取给定偏移和大小的数据。
# 如果数据为空,则在RPC调用完成后安排传输。
#
# 数据为4字节大小和4字节偏移。
def raw_image_read(data):
    if not len(data):
        interface.schedule_callback(raw_image_read_cb)
        return bytes()
    else:
        offset, size = struct.unpack("<II", data)
        return memoryview(sensor.get_fb().bytearray())[offset : offset + size]


# 注册回调。

interface.register_callback(raw_image_snapshot)
interface.register_callback(raw_image_read)

# 一旦所有回调都已注册,我们就可以开始
# 处理远程事件。interface.loop()不会返回。

interface.loop()

results matching ""

    No results matching ""