python - Arduino 没有对树莓派串行通信做出反应
问题描述
我真的很困惑。
我有一个 Raspberry Pi 3B+,需要使用其GPIO
引脚与 Arduino Nano 通信,RX & TX
除了我无法弄清楚的逻辑问题外,它工作正常。我有一个带有 2 个按钮的简单 Java Web 界面,即打开和关闭,它与需要向 Arduino 发出命令的 python 脚本交互,它需要根据接收到的命令打开或关闭继电器。通过打印state
arduino 接收到的内容确实反映了 arduino 应该做什么(打开按钮发送打开命令,关闭按钮发送关闭命令)
但是,当我点击一个按钮时,下面的列表会发生,
- 单击“打开”按钮 - 没有任何反应
- 单击关闭按钮 - 继电器打开
- 单击关闭按钮 - 没有任何反应
- 单击“打开”按钮 - 没有任何反应
- 单击关闭按钮 - 继电器关闭
我打印了继电器所连接的引脚的状态,它的状态做了一些奇怪的事情,
- On - 状态 = 0(无切换)
- 关闭 - 状态 = 1(切换)
- 关闭 - 状态 = 0(无切换)
- On - 状态 = 1(无切换)
- 关闭 - 状态 = 0(开关)
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
这就是一切的连接方式
问题可能是什么?
解决方案
事实证明,继电器是主要问题,当我给它一个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
时,它会激活线圈并再次释放它,这会导致继电器切换,当我发送相同的命令时,它会切换回来。如前所述,线圈不会保持通电状态,因此我可以看到它处于什么状态。
我只需要想出一种方法来获取某种状态,看看继电器在做什么。
推荐阅读
- vba - 当我使用 vba 将几个从 Word 复制到 Excel 中的段落存储在字符串变量中时,类型不匹配错误
- jenkins - 通过电子邮件发送工作更改
- javascript - 在 Chrome 扩展中加载 iframe
- wordpress - 滑块配置不正确
- python - linux中的Selenium webdriver权限问题仍然存在
- postgresql - 如何初始化行数据类型变量?
- android - 如何调用android服务回调?
- spring - 为什么对 JSON 的 Spring Integration Java DSL 请求不起作用
- c++ - 列表视图项目的替代颜色
- java - java.lang.OutOfMemoryError:物理内存使用率太高:physicalBytes (1100M) > maxPhysicalBytes (1024M)