首页 > 解决方案 > Arduino 没有对树莓派串行通信做出反应

问题描述

我真的很困惑。

我有一个 Raspberry Pi 3B+,需要使用其GPIO引脚与 Arduino Nano 通信,RX & TX除了我无法弄清楚的逻辑问题外,它工作正常。我有一个带有 2 个按钮的简单 Java Web 界面,即打开和关闭,它与需要向 Arduino 发出命令的 python 脚本交互,它需要根据接收到的命令打开或关闭继电器。通过打印statearduino 接收到的内容确实反映了 arduino 应该做什么(打开按钮发送打开命令,关闭按钮发送关闭命令)

但是,当我点击一个按钮时,下面的列表会发生,

  1. 单击“打开”按钮 - 没有任何反应
  2. 单击关闭按钮 - 继电器打开
  3. 单击关闭按钮 - 没有任何反应
  4. 单击“打开”按钮 - 没有任何反应
  5. 单击关闭按钮 - 继电器关闭

我打印了继电器所连接的引脚的状态,它的状态做了一些奇怪的事情,

  1. On - 状态 = 0(无切换)
  2. 关闭 - 状态 = 1(切换)
  3. 关闭 - 状态 = 0(无切换)
  4. On - 状态 = 1(无切换)
  5. 关闭 - 状态 = 0(开关)
没有意义,这是python脚本发生的事情
import serial
from flask import Flask, redirect

app = Flask(__name__)

if __name__ == '__main__':
    app.debug = True
    app.run()
    


 
@app.route('/light/on')
def lights_on():
    line = serialComs(b"on\n")
    return redirect('/' + str(line))


@app.route("/light/off")
def lights_off():
    line = serialComs(b"off\n")
    return redirect('/' + str(line))


@app.route("/<line>")
def lights(line):
    print("The Light Is Now " + line)
    return str(line)

def serialComs(state):
    ser = serial.Serial('/dev/ttyAMA0',9600 , timeout=1)
    ser.flush()
    ser.write(state)
    line = ser.readline().decode('utf-8').rstrip()
    return line

对于 Arduino,我有以下内容

#define relayPin 8
String command;
void setup() {
  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  if(Serial.available()){
    command = Serial.readStringUntil('\n');
    command.trim();
    if(command == "on"){
      turnOn();
    }

    if(command == "off"){
      turnOff();
    } 
  }
}

void turnOn(){
  print();
  if (digitalRead(relayPin) == 0) {
    digitalWrite(relayPin, HIGH);
  }  
}

void turnOff(){
  print();
  if (digitalRead(relayPin) == 1) {
    digitalWrite(relayPin, LOW);
  }
}

void print(){
   Serial.println("Pin State: ");
   Serial.print(digitalRead(relayPin)); 
   Serial.println();
}

最初我有这个,并使用 USB 电缆进行通信,它工作得很好

#define relayPin 8
String command;

void setup() {
  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
}

void loop() {
  if(Serial.available()){
    command = Serial.readStringUntil('\n');
    command.trim();
    if (command.equals("on")) {
      digitalWrite(relayPin, HIGH);
    }
    else if (command.equals("off")) {
      digitalWrite(relayPin, LOW);
    }
  }
}

我使用本教程将树莓派配置为允许通过 GPIO 进行串行通信

https://github.com/Arijit1080/Raspberry-Pi---Arduino-Serial-Communication[教程][1]

在这我做了所有instructions.txt指定的事情,即

1. sudo nano /boot/config.txt

        dtparam=spi=on
        dtoverlay=pi3-disable-bt
        core_freq=250
        enable_uart=1
        force_turbo=1
        
2. sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt
3. sudo nano /boot/cmdline.txt

    dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
    
4. sudo reboot

5. ls -l /dev

    sudo systemctl stop serial-getty@ttyAMA0.service
    sudo systemctl disable serial-getty@ttyAMA0.service

6. sudo apt-get install minicom

7. minicom -b 9600 -o -D /dev/ttyAMA0

这就是一切的连接方式

在此处输入图像描述

问题可能是什么?

标签: pythoncarduinoraspberry-pi

解决方案


事实证明,继电器是主要问题,当我给它一个HIGH信号时,线圈不会LOW像我以前的继电器那样在收到信号之前保持通电,相反,如果你愿意,我需要发送一个脉冲信号,当我执行以下操作似乎可以按预期工作

#define r 8
String command;
void setup() {
  Serial.begin(9600);
  pinMode(r, OUTPUT);
}

void loop() {
  command = Serial.readStringUntil("/n");
  command.trim();
  if (action.equals("switch")) {
    digitalWrite(r, HIGH);
    delay(100);
    digitalWrite(r, LOW);
  }
}

当我发送命令switch时,它会激活线圈并再次释放它,这会导致继电器切换,当我发送相同的命令时,它会切换回来。如前所述,线圈不会保持通电状态,因此我可以看到它处于什么状态。

我只需要想出一种方法来获取某种状态,看看继电器在做什么。


推荐阅读