This code is suppose to control four motors via joystick, but I can't get any of them to work. I very new to this motor coding. I'm not sure if I did something wrong with the code or if the joystick shield does not work. I have an arduino Leonardo with an Adafruit motor shield on top and on top of that a joystick shield. The power supply for the motors is separate too. Also did I do the subroutines right?
#include <Adafruit_MotorShield.h> //includes MotorShield library
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); //defines AFMS
Adafruit_DCMotor *motor1 = AFMS.getMotor(1); // Initiate all the motors
Adafruit_DCMotor *motor2 = AFMS.getMotor(2);
Adafruit_DCMotor *motor3 = AFMS.getMotor(3);
Adafruit_DCMotor *motor4 = AFMS.getMotor(4);
int val0 = 0; // variable to store the Arm 1 sensor
int val1 = 0; // variable to store the Arm 2 sensor
int val2 = 0; // variable to store the Arm 3 sensor
int val3 = 0; // variable to store the Arm 4 sensor
//JoyStick
const byte PIN_BUTTON_SELECT = 2; // Select button is triggered when joystick is pressed
const byte PIN_BUTTON_RIGHT = 3; //Assigns Joystick buttons to pins
const byte PIN_BUTTON_UP = 4;
const byte PIN_BUTTON_DOWN = 5;
const byte PIN_BUTTON_LEFT = 6;
const byte PIN_ANALOG_X = 0; //Assignes Joystick to pins
const byte PIN_ANALOG_Y = 1;
const int X_THRESHOLD_LOW = 505; //Creates X threshold values
const int X_THRESHOLD_HIGH = 515;
const int Y_THRESHOLD_LOW = 500; //Creates Y threshold values
const int Y_THRESHOLD_HIGH = 510;
int x_position; //Creates variable x/y_position
int y_position;
int x_direction; //Creates variable x/y_direction
int y_direction;
void input() // this is the subroutine that waits for the user to hit 4
{
int incomingByte = 0; // for incoming serial data
motor1->setSpeed(0); // stop the motor
Serial.println("Hit 4 for next motion");
while (incomingByte != 52) // 52 is the ASCII code for "4"
{
if (Serial.available() > 0)
{
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
}
void light() // this is the subroutine that waits for the user to hit 1
{
int incomingByte = 0; // for incoming serial data
motor1->setSpeed(0); // stop the motor
Serial.println("Light On/Off");
while (incomingByte != 49) // 49 is the ASCII code for "1"
{
if (incomingByte != 49)
{
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("Light On ");
Serial.println(incomingByte, DEC);
digitalWrite(7, HIGH);
delay(1000);
}
}
while (incomingByte != 50) // 50 is the ASCII code for "2"
{
if (incomingByte != 50)
{
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("Light OFF ");
Serial.println(incomingByte, DEC);
digitalWrite(7, LOW);
}
}
}
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Robot arm test!");
motor1->setSpeed(100); // set the speed to 100/255
motor2->setSpeed(100); // do the same for the others...
motor3->setSpeed(100);
motor4->setSpeed(100);
pinMode(7, OUTPUT);
//JoyStick
pinMode(PIN_BUTTON_RIGHT, INPUT); //set Joystick inputs to INPUT and set buttons to HIGH
digitalWrite(PIN_BUTTON_RIGHT, HIGH);
pinMode(PIN_BUTTON_LEFT, INPUT);
digitalWrite(PIN_BUTTON_LEFT, HIGH);
pinMode(PIN_BUTTON_UP, INPUT);
digitalWrite(PIN_BUTTON_UP, HIGH);
pinMode(PIN_BUTTON_DOWN, INPUT);
digitalWrite(PIN_BUTTON_DOWN, HIGH);
pinMode(PIN_BUTTON_SELECT, INPUT);
digitalWrite(PIN_BUTTON_SELECT, HIGH);
}
void loop()
{
void Light();
//JoyStick
x_direction = 0; //set x/y_direction values to 0
y_direction = 0;
x_position = analogRead(PIN_ANALOG_X); //set values for Joystick x/y_position
y_position = analogRead(PIN_ANALOG_Y);
if (x_position > X_THRESHOLD_HIGH) { //set threshold values for Joystick (make the Joystick less sensitive)
x_direction = 1;
} else if (x_position < X_THRESHOLD_LOW) {
x_direction = -1;
}
if (y_position > Y_THRESHOLD_HIGH) {
y_direction = 1;
} else if (y_position < Y_THRESHOLD_LOW) {
y_direction = -1;
}
if (x_direction == -1) {
if (y_direction == -1) {
Serial.println("left-down");
} else if (y_direction == 0) {
Serial.println("left");
motor1->setSpeed(100); //run motor1 at 100 BACKWARD
motor1->run(BACKWARD);
} else {
// y_direction == 1
Serial.println("left-up");
}
} else if (x_direction == 0) {
if (y_direction == -1) {
Serial.println("down");
motor2->setSpeed(100); //run motor2 at 100 FORWARD
motor2->run(FORWARD);
} else if (y_direction == 0) {
Serial.println("centered");
} else {
// y_direction == 1
Serial.println("up");
motor2->setSpeed(100); //run motor2 at 100 BACKWARD
motor2->run(BACKWARD);
}
} else {
// x_direction == 1
if (y_direction == -1) {
Serial.println("right-down");
} else if (y_direction == 0) {
Serial.println("right");
motor1->setSpeed(100); //run motor1 at 100 FORWARD
motor1->run(FORWARD);
} else {
// y_direction == 1
Serial.println("right-up");
}
}
//print button direction to Serial and move motors
Serial.print("l:");
Serial.print(digitalRead(PIN_BUTTON_LEFT));
motor4->setSpeed(100); //run motor4 at 100 FORWARD
motor4->run(FORWARD);
Serial.print(" ");
Serial.print("r:");
Serial.print(digitalRead(PIN_BUTTON_RIGHT));
motor4->setSpeed(100); //run motor4 at 100 BACKWARD
motor4->run(BACKWARD);
Serial.print(" ");
Serial.print("u:");
Serial.print(digitalRead(PIN_BUTTON_UP));
motor3->setSpeed(100); //run motor3 at 100 FORWARD
motor3->run(FORWARD);
Serial.print(" ");
Serial.print("d:");
Serial.print(digitalRead(PIN_BUTTON_DOWN));
motor3->setSpeed(100); //run motor3 at 100 BACKWARD
motor3->run(BACKWARD);
Serial.print(" ");
input(); // wait for return to be 4
}
You need to read the serial data in ONE place. Not all over the place. What you are doing now is like having 4 of your friends read this response, a couple of letters at a time. No one gets a complete picture of the answer.
Using Tools + Auto Format would be a good idea, too. That crappy indenting does not make it easy to read your code.
void Light();
Why is there a function prototype in the loop() function?
//print button direction to Serial and move motors
You've already done that. Why are you doing it again?
How would I read the Serial data in one place? the Function void Light(); is there because there is also an LED that I want to turn on and off with the press of a button on my keyboard. The print button direction to serial was to do two things, one to make sure that the motors were going the correct direction and two to see if the buttons were working at all on the joystick shield. I did the auto formatting, would you like me to re-upload the code?
Here is the code reformatted, but other than that I have not made any changes.
outsider:
On line 120:
void Light();
Should be:
Light();
I don't thats right because then it is not declared as it is a sub function.
When @PaulS said to read all of the serial data in one place how would I do that; would it be something like combining all the sub functions into one function?
I also have yet to take a look at the Serial input basics page, but I will soon. Also did I do the sub functions that are activated by a key on the keyboard correctly?
#include <Adafruit_MotorShield.h> //includes MotorShield library
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); //defines AFMS
Adafruit_DCMotor *motor1 = AFMS.getMotor(1); // Initiate all the motors
Adafruit_DCMotor *motor2 = AFMS.getMotor(2);
Adafruit_DCMotor *motor3 = AFMS.getMotor(3);
Adafruit_DCMotor *motor4 = AFMS.getMotor(4);
int val0 = 0; // variable to store the Arm 1 sensor
int val1 = 0; // variable to store the Arm 2 sensor
int val2 = 0; // variable to store the Arm 3 sensor
int val3 = 0; // variable to store the Arm 4 sensor
//JoyStick
const byte PIN_BUTTON_SELECT = 2; // Select button is triggered when joystick is pressed
const byte PIN_BUTTON_RIGHT = 3; //Assigns Joystick buttons to pins
const byte PIN_BUTTON_UP = 4;
const byte PIN_BUTTON_DOWN = 5;
const byte PIN_BUTTON_LEFT = 6;
const byte PIN_ANALOG_X = 0; //Assignes Joystick to pins
const byte PIN_ANALOG_Y = 1;
const int X_THRESHOLD_LOW = 505; //Creates X threshold values
const int X_THRESHOLD_HIGH = 515;
const int Y_THRESHOLD_LOW = 500; //Creates Y threshold values
const int Y_THRESHOLD_HIGH = 510;
int x_position; //Creates variable x/y_position
int y_position;
int x_direction; //Creates variable x/y_direction
int y_direction;
void input() // this is the subroutine that waits for the user to hit 4
{
int incomingByte = 0; // for incoming serial data
motor1->setSpeed(0); // stop the motor
Serial.println("Hit 4 for next motion");
while (incomingByte != 52) // 52 is the ASCII code for "4"
{
if (Serial.available() > 0)
{
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
}
void light() // this is the subroutine that waits for the user to hit 1
{
int incomingByte = 0; // for incoming serial data
motor1->setSpeed(0); // stop the motor
Serial.println("Light On/Off");
while (incomingByte != 49) // 49 is the ASCII code for "1"
{
if (incomingByte != 49)
{
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("Light On ");
Serial.println(incomingByte, DEC);
digitalWrite(7, HIGH);
delay(1000);
}
}
while (incomingByte != 50) // 50 is the ASCII code for "2"
{
if (incomingByte != 50)
{
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("Light OFF ");
Serial.println(incomingByte, DEC);
digitalWrite(7, LOW);
}
}
}
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Robot arm test!");
motor1->setSpeed(100); // set the speed to 100/255
motor2->setSpeed(100); // do the same for the others...
motor3->setSpeed(100);
motor4->setSpeed(100);
pinMode(7, OUTPUT);
//JoyStick
pinMode(PIN_BUTTON_RIGHT, INPUT); //set Joystick inputs to INPUT and set buttons to HIGH
digitalWrite(PIN_BUTTON_RIGHT, HIGH);
pinMode(PIN_BUTTON_LEFT, INPUT);
digitalWrite(PIN_BUTTON_LEFT, HIGH);
pinMode(PIN_BUTTON_UP, INPUT);
digitalWrite(PIN_BUTTON_UP, HIGH);
pinMode(PIN_BUTTON_DOWN, INPUT);
digitalWrite(PIN_BUTTON_DOWN, HIGH);
pinMode(PIN_BUTTON_SELECT, INPUT);
digitalWrite(PIN_BUTTON_SELECT, HIGH);
}
void loop()
{
void Light();
//JoyStick
x_direction = 0; //set x/y_direction values to 0
y_direction = 0;
x_position = analogRead(PIN_ANALOG_X); //set values for Joystick x/y_position
y_position = analogRead(PIN_ANALOG_Y);
if (x_position > X_THRESHOLD_HIGH) { //set threshold values for Joystick (make the Joystick less sensitive)
x_direction = 1;
} else if (x_position < X_THRESHOLD_LOW) {
x_direction = -1;
}
if (y_position > Y_THRESHOLD_HIGH) {
y_direction = 1;
} else if (y_position < Y_THRESHOLD_LOW) {
y_direction = -1;
}
if (x_direction == -1) {
if (y_direction == -1) {
Serial.println("left-down");
} else if (y_direction == 0) {
Serial.println("left");
motor1->setSpeed(100); //run motor1 at 100 BACKWARD
motor1->run(BACKWARD);
} else {
// y_direction == 1
Serial.println("left-up");
}
} else if (x_direction == 0) {
if (y_direction == -1) {
Serial.println("down");
motor2->setSpeed(100); //run motor2 at 100 FORWARD
motor2->run(FORWARD);
} else if (y_direction == 0) {
Serial.println("centered");
} else {
// y_direction == 1
Serial.println("up");
motor2->setSpeed(100); //run motor2 at 100 BACKWARD
motor2->run(BACKWARD);
}
} else {
// x_direction == 1
if (y_direction == -1) {
Serial.println("right-down");
} else if (y_direction == 0) {
Serial.println("right");
motor1->setSpeed(100); //run motor1 at 100 FORWARD
motor1->run(FORWARD);
} else {
// y_direction == 1
Serial.println("right-up");
}
}
//print button direction to Serial and move motors
Serial.print("l:");
Serial.print(digitalRead(PIN_BUTTON_LEFT));
motor4->setSpeed(100); //run motor4 at 100 FORWARD
motor4->run(FORWARD);
Serial.print(" ");
Serial.print("r:");
Serial.print(digitalRead(PIN_BUTTON_RIGHT));
motor4->setSpeed(100); //run motor4 at 100 BACKWARD
motor4->run(BACKWARD);
Serial.print(" ");
Serial.print("u:");
Serial.print(digitalRead(PIN_BUTTON_UP));
motor3->setSpeed(100); //run motor3 at 100 FORWARD
motor3->run(FORWARD);
Serial.print(" ");
Serial.print("d:");
Serial.print(digitalRead(PIN_BUTTON_DOWN));
motor3->setSpeed(100); //run motor3 at 100 BACKWARD
motor3->run(BACKWARD);
Serial.print(" ");
input(); // wait for return to be hit
}
When @PaulS said to read all of the serial data in one place how would I do that; would it be something like combining all the sub functions into one function?
Suppose that you had one function called readSerialData(). How hard would THAT be to implement?