我已将我的RPI和atmega328连接在一起,以便控制我的arduino上的事件的开始。为此,GPIO 25(RPI)直接连接到pin7(Arduino PD7)。我在RPI上有一个python脚本,将GPIO 25设置为高电平然后再设置为低电平:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.output(25, 1)
#Do some stuff
GPIO.output(25, 0)
arduino正在循环等待按下物理按钮或者通过RPI将pin7设置为HIGH:
const int interrupt = 7;
const int button = 13;
const int led = 9;
void setup() {
Serial.begin(9600);
pinMode(interrupt, INPUT);
pinMode(button,INPUT);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
}
void loop() {
bool on = false;
bool buttonOn = false;
while (!on || !buttonOn) {
on = digitalRead(interrupt);
buttonOn = digitalRead(button);
digitalWrite(led, LOW);
}
digitalWrite(led, HIGH);
delay(1000);
}
现在不幸的是,这不起作用。我已经检查了atmega328(https://learn.sparkfun.com/tutorials/logic-levels)的逻辑电平,看起来3.3V对于HIGH信号来说已经足够了。
我是否因为上拉/下拉电阻而遗漏了什么?我知道atmega上的PD7指定如下:
端口D是一个8位双向I / O端口,带有内部上拉电阻 电阻器(为每个位选择)。端口D输出缓冲区有 具有高吸收和源极的对称驱动特性 能力。作为输入,外部拉低的端口D引脚将 如果上拉电阻被激活,则源电流。端口D引脚 当复位条件变为有效时,即使是时钟,也会处于三态 没有跑。
编辑: 我做了更多的测试,我正确地得到了HIGH或LOW值。似乎问题来自:
while ((!on) || (!buttonOn)) {
在循环中,Arduino和OR运算符是否存在问题?即使一个条件为真且另一个条件为假,它也永远不会离开循环。
答案 0 :(得分:0)
3.3 v输出应该可以将Arduino输入置为高电平。
你可能遇到布线问题,或者树莓派的速度太快,以至于arduino错过了脉冲。
更改覆盆子pi上的程序,使输出保持高电平很长时间(例如10秒),您可以用万用表测量它,看是否正在设置正确的引脚。
Arduino现在看到了输入吗?
答案 1 :(得分:0)
while ((!on) || (!buttonOn)) {
}
只要其中一个变量为false,该循环就会运行。 昨天我出于某种原因认为你在阅读代码时正在读取中断引脚两次。