为什么我的伺服不能使用Arduino,Arduino IDE和Processing来打开按键?

时间:2014-06-12 04:34:08

标签: arduino processing

我从这里偷了一些代码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键按下这种或那种方式旋转伺服?

非常感谢!

1 个答案:

答案 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);
}