当前位置首页 > 新闻资讯  > 支持中心 返回

通过RasPi 实现 PWM 控制

来源:马普科技(福州)有限公司  |  发布时间:2023年08月30日

来自 RasPi 的 PWM 控制

使用 Raspberry Pi 计算机控制 Survey3 的 Python 脚本

使用我们的HDMI PWM 触发电缆,您可以将 PWM 命令发送到 Survey3 相机以执行一些操作。

树莓派设置

将 HDMI 电缆连接到相机,将单伺服连接器连接到 RasPi GPIO 接头上相应的 GPIO 引脚,如下所示:

RASPI 上 GPIO 接头的引脚图

对于下面的代码示例,我们将白色信号连接器连接到引脚 12 (GPIO18),将黑色接地连接器连接到引脚 14。

我们还将随附的 Survey3 USB 电缆连接到 RasPi USB 端口之一。如果您不需要安装/卸载 SD 卡或使用 USB 为相机供电,则可以将其保持断开状态。


如果 RasPi 无法启动且 USB 电缆已连接,则可能需要太多电流来为内部相机电池充电。我们建议将相机电池取出,然后当 USB 线通电启动时,它会自动打开相机。

所需的 PWM 信号需要始终发送“什么都不做”脉冲宽度。然后,仅当我们想要执行特定命令时才更改脉冲宽度。它只需要一个宽度较长的脉冲来执行每个命令。

脉宽调制指令:

  • 1000us:什么都不做

  • 1500us:安装/卸载 uSD 存储卡(在 Survey3 相机内)

  • 2000us:触发拍照

发送一次 1500us 命令以卸载(在软件中)相机内的 uSD 存储卡,然后安装到连接的 USB 计算机 (RasPi),然后再次发送 1500us 以将 uSD 安装回相机。这通常用于将捕获的照片传输到 RasPi 或对图像进行后期处理。


当 uSD 从相机上卸下时,它无法保存新拍摄的图像。要在安装时查看图像,您需要使用WIFI 连接和相应的 url 命令

脉宽调制代码:

要发送 PWM 信号,您需要始终发送 1000us 的“无操作”脉冲宽度,然后当您想要执行命令时,您需要发送一个瞬时 1500us 或 2000us 宽度的脉冲。

pin = 18  #set (BCM) GPIO pin to send GPIO.HIGH pulse


GPIO.setmode(GPIO.BCM)

GPIO.setup(pin, GPIO.OUT)

time.sleep(0.001) #1000us pulse width (do nothing)

GPIO.cleanup()


time.sleep(0.1)


GPIO.setmode(GPIO.BCM)

GPIO.setup(pin, GPIO.OUT)

GPIO.output(pin, GPIO.HIGH)

time.sleep(0.002) #2000us pulse width

GPIO.cleanup()

    

time.sleep(0.1)

    

GPIO.setmode(GPIO.BCM)

GPIO.setup(pin, GPIO.OUT)

time.sleep(0.001) #1000us pulse width (do nothing)

GPIO.cleanup()


上面的代码将 PWM 设置为无操作 1000us,然后发送 2000us 触发命令拍摄照片,然后返回发送无操作 1000us。最快的 2000us 命令应该是大约每 1.5 秒发送一次,因为相机无法以超过 1.5 秒的速度捕获 JPG 图像。对于 RAW+JPG 模式,我们建议等待时间为 2.5-3.0 秒。

代码可以设置为循环直到用户退出(CTRL+Z),每 1.5 秒触发一次捕获命令:


import RPi.GPIO as GPIO

import time


GPIO.setwarnings(False)


pin = 18  #set (BCM) GPIO pin to send GPIO.HIGH pulse


try:

    while True:

    

        print("Command Sent\n")        

    

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(pin, GPIO.OUT)

        GPIO.output(pin, GPIO.HIGH)

        time.sleep(0.002) #2000us pulse width

        GPIO.cleanup()

    

        time.sleep(0.1)

    

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(pin, GPIO.OUT)

        time.sleep(0.001) #1000us pulse width (do nothing)

        GPIO.cleanup()

    

        time.sleep(1.5) #time delay between GPIO.HIGH pulses, >1.5s recommended


#to exit type CTRL+Z

except KeyboardInterrupt:

    pass




二进制

您还可以将其设置为接受用户键盘输入:

import RPi.GPIO as GPIO

import time


GPIO.setwarnings(False)


pin = 18  #set (BCM) GPIO pin to send GPIO.HIGH pulse


GPIO.setmode(GPIO.BCM)

GPIO.setup(pin, GPIO.OUT)

time.sleep(0.001)

GPIO.cleanup()


print("\nCommands:")

print("t + Enter: Trigger (2000us)")

print("s + Enter: SD Card Mount/Unmount (1500us)")

print("e + Enter: Exit\n")


while True:

    key = input(">")

    if key == "t":

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(pin, GPIO.OUT)

        GPIO.output(pin, GPIO.HIGH)

        time.sleep(0.002)

        GPIO.cleanup()

        

        time.sleep(0.1)

        print("Trigger")        

        

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(pin, GPIO.OUT)

        time.sleep(0.001)

        GPIO.cleanup()


    if key == "s":

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(pin, GPIO.OUT)

        GPIO.output(pin, GPIO.HIGH)

        time.sleep(0.0015)

        GPIO.cleanup()

        

        time.sleep(0.1)

        print("SD Mount/UnMount")

        

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(pin, GPIO.OUT)

        time.sleep(0.001)

        GPIO.cleanup()


    if key == "e":

        print("Exiting\n")

        break

                

    else:        

        GPIO.setmode(GPIO.BCM)

        GPIO.setup(pin, GPIO.OUT)

        time.sleep(0.001)

        GPIO.cleanup()


二进制

上面的代码允许您输入字母“t”,然后按“Enter”键,它会拍照。您可以键入“s + Enter”,它将从相机上卸载 uSD 卡,然后 RasPi 会将其显示为可移动驱动器。再次键入“s + Enter”将从 RasPi 卸载并将 uSD 安装回相机。