Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Code to Test Robotic Arm Receiver (Connected to Arm) - Written by Jonathan DeWitt
- #include <Servo.h>
- #include <SoftwareSerial.h>
- #include <Wire.h> //Not that this was actually needed. Was used in Reference 1
- SoftwareSerial HC12(8,7); // Arduino Pin 8 Rx to Tx on HC-12, Arduino Pin 7 Tx to Rx on HC-12
- Servo Servo1;
- Servo Servo2;
- Servo Servo3;
- Servo Servo4;
- Servo Servo5;
- Servo Servo6;
- int J1 = 5; //J1 Servo Signal Wire Attached to Pin 5
- int J2 = 6; //J2 Servo Signal Wire Attached to Pin 6
- int J3 = 9; //J3 Servo Signal Wire Attached to Pin 9
- int J4 = 10; //J4 Servo Signal Wire Attached to Pin 10
- int J5 = 11; //J5 Servo Signal Wire Attached to Pin 11
- int J6 = 3; //J6 Servo Signal Wire Attached to Pin 3
- // int PotPin1 = A0; //Joint 1 Potentiometer is Tied to Pin A0
- // int PotPin2 = A1; //Joint 2 Potentiometer is Tied to Pin A1
- // int PotPin3 = A2; //Joint 3 Potentiometer is Tied to Pin A2
- // int PotPin4 = A3; //Joint 4 Potentiometer is Tied to Pin A3
- // int PotPin5 = A4; //Joint 5 Potentiometer is Tied to Pin A4
- // int PotPin6 = A5; //Joint 6 Potentiometer is Tied to Pin A5
- // int PotVal1 = 0; //Stores Potentiometer 1 Value
- // int PotVal2 = 0; //Stores Potentiometer 2 Value
- // int PotVal3 = 0; //Stores Potentiometer 3 Value
- // int PotVal4 = 0; //Stores Potentiometer 4 Value
- // int PotVal5 = 0; //Stores Potentiometer 5 Value
- // int PotVal6 = 0; //Stores Potentiometer 6 Value
- // int angle1 = 0; //Stores Angle to Move Servo 1 To
- // int angle2 = 0; //Stores Angle to Move Servo 2 To
- // int angle3 = 0; //Stores Angle to Move Servo 3 To
- // int angle4 = 0; //Stores Angle to Move Servo 4 To
- // int angle5 = 0; //Stores Angle to Move Servo 5 To
- // int angle6 = 0; //Stores Angle to Move Servo 6 To
- int angle1; //Stores Angle to Move Servo 1 To
- int angle2; //Stores Angle to Move Servo 2 To
- int angle3; //Stores Angle to Move Servo 3 To
- int angle4; //Stores Angle to Move Servo 4 To
- int angle5; //Stores Angle to Move Servo 5 To
- int angle6; //Stores Angle to Move Servo 6 To
- //The following variables are needed only to receive data from the HC-12 remote control
- String input;
- int boundLow;
- int boundHigh;
- const char delimiter = ',';
- void setup() {
- // put your setup code here, to run once:
- Serial.begin(9600);
- // pinMode(PotPin1, INPUT); //Sets Pin Potentiometer 1 is Tied to To an Input
- // pinMode(PotPin2, INPUT); //Sets Pin Potentiometer 2 is Tied to To an Input
- // pinMode(PotPin3, INPUT); //Sets Pin Potentiometer 3 is Tied to To an Input
- // pinMode(PotPin4, INPUT); //Sets Pin Potentiometer 4 is Tied to To an Input
- // pinMode(PotPin5, INPUT); //Sets Pin Potentiometer 5 is Tied to To an Input
- // pinMode(PotPin6, INPUT); //Sets Pin Potentiometer 6 is Tied to To an Input
- Servo1.attach(J1); //Calls this is like a pinmode command but also does more from the servo library
- Servo2.attach(J2); //Calls this is like a pinmode command but also does more from the servo library
- Servo3.attach(J3); //Calls this is like a pinmode command but also does more from the servo library
- Servo4.attach(J4); //Calls this is like a pinmode command but also does more from the servo library
- Servo5.attach(J5); //Calls this is like a pinmode command but also does more from the servo library
- Servo6.attach(J6); //Calls this is like a pinmode command but also does more from the servo library
- //Move the robot to a good home pose
- Servo1.write(90); //Moves Specified Servo to Specified Angle
- Servo2.write(110); //Moves Specified Servo to Specified Angle
- Servo3.write(120); //Moves Specified Servo to Specified Angle
- Servo4.write(50); //Moves Specified Servo to Specified Angle
- Servo5.write(50); //Moves Specified Servo to Specified Angle
- Servo6.write(120); //Moves Specified Servo to Specified Angle
- HC12.begin(9600); //Start the HC-12 Module
- delay(2000); //I assume this delay is to give the HC-12 time to read
- }
- void loop() {
- // put your main code here, to run repeatedly:
- // PotVal1 = analogRead(PotPin1); //Reads Voltage Between 0 and 5 V and Gives Number Between 0 and 1023 Where 2^8 = 1024. Starts at 0 therefore 1023.
- // PotVal2 = analogRead(PotPin2); //Reads Voltage Between 0 and 5 V and Gives Number Between 0 and 1023 Where 2^8 = 1024. Starts at 0 therefore 1023.
- // PotVal3 = analogRead(PotPin3); //Reads Voltage Between 0 and 5 V and Gives Number Between 0 and 1023 Where 2^8 = 1024. Starts at 0 therefore 1023.
- // PotVal4 = analogRead(PotPin4); //Reads Voltage Between 0 and 5 V and Gives Number Between 0 and 1023 Where 2^8 = 1024. Starts at 0 therefore 1023.
- // PotVal5 = analogRead(PotPin5); //Reads Voltage Between 0 and 5 V and Gives Number Between 0 and 1023 Where 2^8 = 1024. Starts at 0 therefore 1023.
- // PotVal6 = analogRead(PotPin6); //Reads Voltage Between 0 and 5 V and Gives Number Between 0 and 1023 Where 2^8 = 1024. Starts at 0 therefore 1023.
- //
- // Serial.print("PotVal1: ");
- // Serial.print(PotVal1);
- // Serial.print(", ");
- // Serial.print("PotVal2: ");
- // Serial.print(PotVal2);
- // Serial.print(", ");
- // Serial.print("PotVal3: ");
- // Serial.print(PotVal3);
- // Serial.print(", ");
- // Serial.print("PotVal4: ");
- // Serial.print(PotVal4);
- // Serial.print(", ");
- // Serial.print("PotVal5: ");
- // Serial.print(PotVal5);
- // Serial.print(", ");
- // Serial.print("PotVal6: ");
- // Serial.print(PotVal6);
- // Serial.println(".");
- // // scale the numbers from the pot
- // angle1 = map(PotVal1, 0, 1023, 20, 150); //Scales Converted Values Between 0 and 1023 to Angles Setting Servo Range
- // angle2 = map(PotVal2, 0, 1023, 110, 150); //Scales Converted Values Between 0 and 1023 to Angles Setting Servo Range - Default Value 100 to 170 - But if leave at 100 it cannot lift the arm back up
- // angle3 = map(PotVal3, 0, 1023, 100, 180); //Scales Converted Values Between 0 and 1023 to Angles Setting Servo Range
- // angle4 = map(PotVal4, 0, 1023, 0, 140); //Scales Converted Values Between 0 and 1023 to Angles Setting Servo Range
- // angle5 = map(PotVal5, 0, 1023, 10, 140); //Scales Converted Values Between 0 and 1023 to Angles Setting Servo Range
- // angle6 = map(PotVal6, 0, 1023, 50, 120); //Scales Converted Values Between 0 and 1023 to Angles Setting Servo Range
- if(HC12.available()) //This section is receiving data from the HC-12 Module - Purely for Remote Control
- {
- input = HC12.readStringUntil('n');
- if (input.length() > 0)
- {
- Serial.println(input);
- boundLow = input.indexOf(delimiter); //Locates index of first delimiter i.e. comma https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/indexof/
- angle1 = input.substring(0, boundLow).toInt(); //.substring creates a sub string of input string starting at index position zero up to but not including first comma https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/substring/
- boundHigh = input.indexOf(delimiter, boundLow+1); //This instance is going to search for the next delimiter i.e. comma starting at boundLow+1 i.e. one character after the previous comma https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/indexof/
- angle2 = input.substring(boundLow+1, boundHigh).toInt(); //Creates a substring of input starting one character after the first comma ending one character before the second comma
- boundLow = input.indexOf(delimiter, boundHigh+1); //Does the same thing as the previous boundHigh line except this locates third comma's index
- angle3 = input.substring(boundHigh+1, boundLow).toInt(); //Creates a substring from after second comma up to just before third comma
- boundHigh = input.indexOf(delimiter, boundLow+1); //Repeats first boundHigh line operation, Locates fourth comma's index
- angle4 = input.substring(boundLow+1, boundHigh).toInt(); //Creates a subtring of input starting one character after third comma up to just before fourth comma
- boundLow = input.indexOf(delimiter, boundHigh+1); //Does the same thing as the previous boundHigh line except this locates fifth comma's index
- angle5 = input.substring(boundHigh+1, boundLow).toInt(); //Creates a substring from after fourth comma up to just before fifth comma
- angle6 = input.substring(boundLow+1).toInt(); //Creates a substring of input starting one character after fifth comma up to the end of input
- delay(10);
- }
- }
- //Print out the angle for the servo motor to the serial monitor for debugging purposes
- Serial.print("Angle 1: ");
- Serial.print(angle1);
- Serial.print(", ");
- Serial.print("Angle 2: ");
- Serial.print(angle2);
- Serial.print(", ");
- Serial.print("Angle 3: ");
- Serial.print(angle3);
- Serial.print(", ");
- Serial.print("Angle 4: ");
- Serial.print(angle4);
- Serial.print(", ");
- Serial.print("Angle 5: ");
- Serial.print(angle5);
- Serial.print(", ");
- Serial.print("Angle 6: ");
- Serial.print(angle6);
- Serial.println(".");
- //Servo.write commands are commented out for the purposes of figuring out where the bugs are in the code.
- //In the final version these will not be commented out
- // Servo1.write(angle1); //Moves Specified Servo to Specified Angle
- // Servo2.write(angle2); //Moves Specified Servo to Specified Angle
- // Servo3.write(angle3); //Moves Specified Servo to Specified Angle
- // Servo4.write(angle4); //Moves Specified Servo to Specified Angle
- // Servo5.write(angle5); //Moves Specified Servo to Specified Angle
- // Servo6.write(angle6); //Moves Specified Servo to Specified Angle
- delay(15); //Gives Servos time to move to position
- }
- //Notes
- //Restrict Joint 1 from 20 to 150 degrees. It can go down to 0 degrees but buzzes. I haven't taken it over 150. It might go further
- //Restrict Joint 2 from 110 to 150 degrees. It can go down to 110 degrees but buzzes a little. Any lower it can really buzz. Over 150 it really buzzes.
- //Restrict Joint 3 from 100 to 180 degrees. 100 seems to be very high up position (arm raised). 180 seems to be the arm lowered.
- //Restrict Joint 4 from 0 to 140 degrees. It can comfortably do this
- //Restrict Joint 5 from 10 to 140 degrees. It can 0 to 150 (I tested these)
- //Restrict Joint 6 from 50 to 120 degrees. 50 is closed gripper. 120 is fully open.
- //A good resting pose
- // Servo1.write(90); //Moves Specified Servo to Specified Angle
- // Servo2.write(110); //Moves Specified Servo to Specified Angle
- // Servo3.write(120); //Moves Specified Servo to Specified Angle
- // Servo4.write(50); //Moves Specified Servo to Specified Angle
- // Servo5.write(50); //Moves Specified Servo to Specified Angle
- // Servo6.write(120); //Moves Specified Servo to Specified Angle
- //Reference 1 https://rootsaid.com/long-range-remote-controller/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement