Arduino与pySerial的问题
我遇到了一些问题。我最近买了一块 Arduino Uno 板。我想做一些有趣的事情,比如通过我的电脑控制输入。我使用了 Python 和 pySerial,程序如下:
arduino = serial.Serial(portaCOM, 9600, timeout = 1)
... in loop ->
arduino.write(value)
def sliderUpdate(self, event):
pos = self.slider.GetValue()
arduino.write(pos)
time.sleep(.1)
print arduino.readline()
try:
arduino = serial.Serial(portaCOM, 9600, timeout = 1)
except:
print "Errore di connessione alla porta seriale"
这个写入的值应该通过 USB 发送到我的板子上。加载到板子上的程序是:
const int ledPin = 11;
byte brightness;
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop(){
while(Serial.available()){
brightness = Serial.read();
Serial.print(brightness);
analogWrite(ledPin, brightness); //LED doesn't refresh the brightness
delay(10);
}
}
我的 LED 工作得很好。我尝试了 Arduino 提供的 Fade 示例,它也能正常工作。
我检查了程序是否正确发送数据。是的,它确实发送了,我收到的和我之前发送的是一样的。
它应该接收发送的值并设置 analaogWriter(pin, VALUE)
,但似乎有什么地方出错了或者没有正常工作。
我该如何解决这个问题呢?
解决方案
Arduino 代码:
const int ledPin = 11;
byte valoreLed;
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop(){
while(Serial.available()){
valoreLed = Serial.read();
analogWrite(ledPin, valoreLed);
delay(20);
}
}
Python 脚本代码:
pos = self.slider.GetValue()
arduino.write(chr(pos))
谢谢大家!! :)
5 个回答
我看到你在评论里提到,LED在第一个字符时能正常工作,但在不同字符时没有变化。一定要确保你发送的ASCII字符和之前的字符有明显的区别,比如可以先发送ASCII 0,然后再发送ASCII 255。
编辑: 既然你说FadeLED的例子能正常工作,那你可以在这个例子上加上串口功能吗?比如,只有在接收到串口字符后才进行渐变。这至少能让你确认串口和LED可以在你写的代码中一起工作。另外,我假设你使用的是这里的FadeLED例子。如果是这样,确保你设置了正确的引脚编号,因为参考代码使用的是引脚9,而你的示例代码使用的是引脚11。
另一个编辑:
你说从Arduino那里正确接收到了字符,但你使用的是pySerial的ReadLine
函数,这个函数会一直等待直到看到换行符,而我在Arduino的代码中没有看到会生成换行符的内容。为了减少问题中的变量,试着使用HyperTerminal或类似的串口程序来发送字节到Arduino,而不是用你的Python程序。例如,你可以发送空格字符(ASCII 32)和'}'字符(ASCII 125),这两个字符的差异应该足够明显,能在LED上产生可见的变化。
我怀疑 arduino.readline()
这个命令是在等着接收到一个换行符,而你的Arduino代码从来没有发送过换行符。所以,当Python代码发送第一个值后,就会一直卡在那里,不会继续往下执行。
- 首先,确保你的LED灯连接正确。长脚(阳极)要接到PWM 11端口,短脚(阴极)要接到地线。如果你的LED需要的话,可能还需要在阴极和地线之间加一个电阻。
- 确保你在Python中写入的是正确的端口(这个端口是和你的操作系统中的FTDI线缆关联的)。
- 如果你没有使用带USB接口的FTDI线缆,确保所有的引脚都连接到正确的输入上。
- 在你的例子中,
value
的值是什么?试试用arduino.write(chr(0xFF))
,看看LED灯是否保持亮着?