I've been working on a project for quite a while now, but on the last phase of it I'm stuck on making my code loop. It runs once and from there on it doesn't make the motors move. I've tried the while
and if
statements but it still doesn't move every time I ask it to.
What the code is supposed to do is to receive information from a websockets canvas and use that information to see if the dc motor goes forwards or backwards.
Hope to find a solution! :)
#include <AFMotor.h>
int x = -10;
int y = -10;
int b = 0;
AF_DCMotor motor_shoulderx(1);
AF_DCMotor motor_shouldery(2);
AF_DCMotor motor_elbow(3);
AF_DCMotor motor_wrist(4);
void setup() {
motor_shoulderx.run(RELEASE);
motor_shouldery.run(RELEASE);
motor_elbow.run(RELEASE);
motor_wrist.run(RELEASE);
Serial.begin(9600);
}
void loop() {
uint8_t i;
while(Serial.available()) {
if (b == 0) {
x = Serial.read();
b =1;
}
else {
y = Serial.read();
b = 0;
}
if (x != -10) {
Serial.println("x is:");
Serial.println(x);
if(x > 200) {
motor_shoulderx.run(FORWARD);
for (i=0; i<255; i++) {
motor_shoulderx.setSpeed(i);
}
}
else {
motor_shoulderx.run(BACKWARD);
for (i=255; i!=0; i--) {
motor_shoulderx.setSpeed(i);
}
}
}
if (y != -10) {
Serial.println ("y is:");
Serial.println (y);
if (y > 200) {
motor_shouldery.run(FORWARD);
for (i=0; i<255; i++) {
motor_shouldery.setSpeed(i);
}
motor_elbow.run(FORWARD);
for (i=0; i<255; i++) {
motor_elbow.setSpeed(i);
}
motor_wrist.run(FORWARD);
for (i=0; i<255; i++) {
motor_wrist.setSpeed(i);
}
}
else {
motor_shouldery.run(BACKWARD);
for (i=255; i!=0; i--) {
motor_shouldery.setSpeed(i);
}
motor_elbow.run(BACKWARD);
for (i=255; i!=0; i--) {
motor_elbow.setSpeed(i);
}
motor_wrist.run(BACKWARD);
for (i=255; i!=0; i--) {
motor_wrist.setSpeed(i);
}
}
}
}
}
答案 0 :(得分:0)
您必须使用其他结构。目前,你的主循环由许多单个for循环组成,这些循环后续执行。为了实现并行执行(我认为这就是你想要的)你需要这样的想法:
int i;
void setup() {
i=255;
//...
}
void loop() {
i--;
motor_shoulderx.setSpeed(i);
motor_elbow.setSpeed(i);
if(i==0)i=255;
}
如果您需要更复杂的逻辑,您可以轻松地了解条件。如果您需要延迟,您必须使用时间比较代码模式,如下所示:
unsigned long interval=1000; // the time we need to wait
unsigned long previousMillis=0; // millis() returns an unsigned long.
void setup() {
//...
}
void loop() {
if ((unsigned long)(millis() - previousMillis) >= interval) {
previousMillis = millis();
// ...
}
}
//...
总而言之,我认为重要的是主循环不应该被单个for-statements延迟。希望这会对你有所帮助。