我从这里偷了一些代码http://www.instructables.com/id/Overview/?ALLSTEPS并对其进行了大量修改以尝试使用我的键盘控制我的伺服机芯!目标是我将能够使用WASD键控制两个伺服器。
Anywho,我正在尝试使用D和A键来控制一个伺服的旋转。我使用以下Arduino代码:
#include <Servo.h>
Servo servoMain; // Define our Servo
void setup()
{
servoMain.attach(10); // servo on digital pin 10
Serial.begin(9600);
}
int v = 90;
void loop()
{
char ch = Serial.read(); // Reads serial input
if (Serial.available()) {
switch(ch) {
case 'a':
v = v + 1;
case 'd':
v = v - 1;
}
}
servoMain.write(v); // Turn servo to position designated by V variable.
delay(100); // Wait .1 second
}
所以基本上我设置了串行连接,设置伺服控制,变量等。然后我尝试读取由以下处理代码发送的按键,并尝试根据按下的键值以这种或那种方式移动伺服。这是处理代码。
//Processing code:
import processing.serial.*;
Serial port; // The serial port we will be using
int r,g,b;
void setup()
{
println(Serial.list()); // List COM-ports (AUTHORS NOTE, I am not sure what this line is all about, I've never seen this pop up when I run the Processing code? Do I need it?)
//select second com-port from the list (COM3 for my device)
// You will want to change the [1] to select the correct device
// Remember the list starts at [0] for the first option.
port = new Serial(this, Serial.list()[0], 9600);
// I need something to focus my cursor on so Processing can capture my keystrokes!
size (600,600);
r = 0;
g = 0;
b = 0;
}
void draw()
{
background(r,g,b);
}
void keyPressed()
{
switch (key) {
//Send pressed key to serial conn.
case 'a':
port.write(key);
break;
case 'd':
port.write(key);
break;
default:
break;
}
}
按下按键时,Arduino上的RX LED指示灯亮起!所以必须要把它放在某个地方,但是Servo根本没有做任何事情。任何人都知道如何使我的脚本工作,所以我的Arduino会按A或D键按下这种或那种方式旋转伺服?
非常感谢!
答案 0 :(得分:1)
我认为问题在于:
char ch = Serial.read(); // Reads serial input
if (Serial.available()) {
switch(ch) {
case 'a':
v = v + 1;
case 'd':
v = v - 1;
}
事实是,首先你从缓冲区读取一个char,你调用函数Serial.available()。此时您已经从缓冲区中读取,因此它返回0.您需要在读取内容之前调用Serial.available()。当然你看到rx引脚闪烁,但是id语句是FALSE,因为缓冲区是空的。
你忘了在开关案例陈述中加入中断
试试这个:
if (Serial.available()) {
char ch = Serial.read(); // Reads serial input
switch(ch) {
case 'a':
v = v + 1;
break;
case 'd':
v = v - 1;
break;
}
}
这段代码对我有用(我没有伺服,对不起):
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
}
int v = 0;
void loop()
{
if (Serial.available()) {
char ch = Serial.read();
switch(ch) {
case 'a':
v = 1;
break;
case 'd':
v = 0;
break;
}
}
digitalWrite(13, v);
}