【发布时间】:2016-01-31 11:22:53
【问题描述】:
我已将我的 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 设置为高:
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)) {
在 while 循环中,Arduino 和 OR 运算符是否存在问题?即使一个条件为真而另一个条件为假,它也永远不会退出循环。
【问题讨论】:
-
1.我永远不会直接使用 3.3v 系统和 5v 系统。始终使用电平转换器或某种缓冲器。 2. buttonOn = digitalRead(中断); -> buttonOn = digitalRead(按钮); 3、你有没有用万用表检查过输入管脚的电压?
-
我认为从 3.3V 到 5V 是安全的,我总是使用 5V 到 3.3V 的电平转换器。是的,我用万用表检查过,ATmega 的输入引脚上的电压约为 3.3V。
标签: raspberry-pi atmega