【问题标题】:Sending signal from Arduino serial to a Python program从 Arduino 串口向 Python 程序发送信号
【发布时间】:2019-02-13 04:09:27
【问题描述】:

我是 Python 和 Raspberry Pi 的新手,希望将它们用于带有 Arduino 的项目。基本上,我想按下连接到 Arduino 的按钮,然后让该输入在树莓派上播放视频文件。

我在通过串行数据这样做时遇到了一些困难。我可以在 Arduino 和 Pi 之间连接串行消息,即:“Hello World”,但不太清楚如何打开视频文件。现在,当我运行 Python 代码时,什么都没有出现,并且按钮按下没有响应。我有正确的 USB 端口,因为它可以与仅打印串行数据的其他程序一起使用。我该如何解决这个问题?

简而言之,最终目标是“按下按钮-->播放视频”。

Arduino 代码:

int pushButton=2;
int buttonState=0;

void setup()
{
    serial.Begin(9600);
    pinMode(pushButton, INPUT);
}

void loop()
{
    int buttonState=digitalRead(pushButton);
    if (buttonState==HIGH)
    {
        Serial.println("a");
        delay(100);
    }
    if (buttonState==LOW)
    {
        //do nothing
    }
}

Python 代码:

import sys
import os
from subprocess import Popen
import serial

movie1=("/home/pi/Videos/test.mp4")

ser = serial.Serial('/dev/ttyUSB0',9600)

while True:
    data = ser.read()

    if data=="a":
        os.system('killall omxplayer.bin')
        print("a")
        omxc = Popen(['omxplayer','-b', movie1])

【问题讨论】:

  • 尝试记录来自ser.read() 的内容。可能是 b"a" 二进制“a”(对 python 2.x 无关)删除 subprocess.Popen() 直到您确信串行 I/O 正常。
  • 你有下拉电阻吗?你知道如果你按住按钮,播放器每秒会被触发 10 次吗?

标签: python arduino raspberry-pi serial-port popen


【解决方案1】:

首先我认为串行通信不需要发送字符串,你可以只发送字节。 问题是,当您使用Serial.println("Something") 时,您正在发送Something\r\n,因此您应该使用Something\r\n 检查它,并且正如cmets 所说,您可以进行调试打印以确保您的数据处于活动状态并且连接正常。 您还可以在您的 python 代码上添加确认以响应命令,以确保数据已发送并且不发送另一个。 Arduino代码:

int pushButton=2;
int buttonState=0;

void setup()
{
    serial.Begin(9600);
    pinMode(pushButton, INPUT);
}

void loop()
{
    int buttonState=digitalRead(pushButton);
    if (buttonState==HIGH)
    {
        Serial.print('1');
        delay(100);
    }
    if (buttonState==LOW)
    {
        //do nothing
    }
}

Python 代码:

from subprocess import Popen
import serial

movie1 = "/home/pi/Videos/test.mp4"

ser = serial.Serial('/dev/ttyUSB0',9600)

while True:
    command = ser.read()
    if command:
        # flush serial for unprocessed data
        ser.flushInput()
        print("new command:", command)
        if str(command) == '1':
            print("Playing movie")
            Popen('killall omxplayer.bin')
            Popen(['omxplayer','-b', movie1])
        else:
            print("Not a valid command")

【讨论】:

  • @gre_gor 感谢您的提示。我将编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多