将信号从Arduino串行发送到Python程序

时间:2019-02-13 04:09:27

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

我是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])

1 个答案:

答案 0 :(得分: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")