从Arduino串口发送信号到Python程序

3
我是Python和Raspberry Pi的新手,希望能在一个与Arduino有关的项目中使用它们。基本上,我想按下连接到Arduino的按钮然后让该输入在Raspberry Pi上播放视频文件。
通过串行数据进行此操作有些困难。我可以在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])

1
尝试记录来自ser.read()的内容。也许它是b"a"二进制的“a”(对Python 2.x无关紧要)。在您确信串行I/O正常之前,请删除subprocess.Popen() - Kingsley
你有下拉电阻吗?你知道如果按住按钮,播放器会被触发10次每秒吗? - gre_gor
1个回答

0

首先,我认为在串行通信中不必发送字符串,只需发送字节。 问题在于当你使用Serial.println("Something")时,你发送的是Something\r\n,因此在另一台设备上,你应该检查它是否为Something\r\n。正如评论中所说,您可以添加一个调试打印,以确保您的数据正常,并且连接正常。 您还可以在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 感谢您的提示。我会编辑答案。 - Masoud Rahimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接