I have two sketches and each one of them are used for controlling the robotic arm. One of the programs is for automatic control and second for hand control by potentiometers. I am using two drivers. L298N and PCA9685. I want to make one program and be able to switch between them by using a 2 position switch. I used a function switch but it dont work well. If the robot is in automatic control I cant switch it to hand control. Below I attach the code. I dont know what I can do else?
#include <LedControl.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <AccelStepper.h>
#include <Stepper.h>
#define MIN_PULSE_WIDTH 650
#define MAX_PULSE_WIDTH 2350
#define FREQUENCY 50
#define STEPS 200
#define SERVOMIN 130 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 575 // this is the 'maximum' pulse length count (out of 4096)
#define Motor 4
byte button = 2;
byte programToRun;
uint8_t servonum = 0;
AccelStepper stepper = AccelStepper(Motor, 8, 9, 10, 11);
Stepper stepper_reczny(STEPS, 8, 9, 10, 11);
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int DIN = 5;
int CS = 6;
int CLK = 7;
//int state= digitalRead(button);
int controlservo1 = A1;
int controlservo2 = A2;
int controlservo3 = A0;
int controlservo4 = A4;
int controlservo5 = A3;
int previous = 0;
int bit1;
int motor1 = 0;
int motor2 = 4;
int motor3 = 8;
int motor4 = 12;
int motor5 = 15;
int mtrDegreeServo1;
int mtrDegreeServo2;
int mtrDegreeServo3;
int mtrDegreeServo4;
int mtrDegreeServo5;
LedControl screen = LedControl(DIN, CLK, CS, 0);
void setup() {
screen.shutdown(0, false);
screen.setIntensity(0, 15);
screen.clearDisplay(0);
pinMode(button, INPUT_PULLUP);
pwm.begin();
pwm.setPWMFreq(FREQUENCY);
stepper.setSpeed(30);
Serial.begin(115200);
Serial.begin(9600);
//Serial.println("16 channel Servo test!");
stepper.setMaxSpeed(200);
pwm.begin();
pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates
pwm.setPWM(0, 0, angleToPulse(50));
delay(500);
pwm.setPWM(4, 0, angleToPulse(90));
delay(500);
pwm.setPWM(8, 0, angleToPulse(60));//jest na równo człon 3
delay(500);
pwm.setPWM(12, 0, angleToPulse(60));//narzędzie
delay(500);
pwm.setPWM(15, 0, angleToPulse(130));
delay(5000);
}
// Function to move motor to specific position
void moveMotorDeg(int moveDegree, int motorOut)
{
int pulse_wide, pulse_width;
// Convert to pulse width
pulse_wide = map(moveDegree, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
pulse_width = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
//Control Motor
pwm.setPWM(motorOut, 0, pulse_width);
}
// Function to convert potentiometer position into servo angle
int getDegree(int controlIn)
{
int potVal, srvDegree;
// Read values from potentiometer
potVal = analogRead(controlIn);
// Calculate angle in degrees
srvDegree = map(potVal, 0, 1023, 0, 180);
// Return angle in degrees
return srvDegree;
}
void loop() {
//int state= digitalRead(button);
if (digitalRead(button) == HIGH) {
bit1 = 1;
Serial.println("1");
}
else {
bit1 = 0;
Serial.println("0");
}
programToRun = bit1;
switch (programToRun) {
case 1:
byte a[8] =
{
B00011000,
B00111100,
B01100110,
B11000011,
B11111111,
B11111111,
B11000011,
B11000011
};
printByte(a);
delay(1000);
delay(200);
stepper.setCurrentPosition(0);
delay(1000);
// Run the motor forward at 200 steps/second until the motor reaches 400 steps (2 revolutions):
while (stepper.currentPosition() != -49) {
stepper.setSpeed(-20);
stepper.runSpeed();
}
delay(1000);
for ( int angle = 50; angle < 120; angle += 2) {
delay(50);
pwm.setPWM(0, 0, angleToPulse(angle));
}
delay(1000);
for ( int angle = 90; angle > 60; angle -= 1.8) {
delay(50);
// Pozycja wyjścjowa
pwm.setPWM(4, 0, angleToPulse(angle));
}
delay(1500);
for ( int angle = 60; angle > 0; angle -= 1.8) {
delay(50);
pwm.setPWM(12, 0, angleToPulse(angle));
}
delay(1500);
for ( int angle = 60; angle < 120; angle += 2) {
delay(50);
// Pozycja wyjścjowa
pwm.setPWM(8, 0, angleToPulse(angle));
}
delay(1500);
for ( int angle = 120; angle < 155; angle += 1.8) {
delay(50);
pwm.setPWM(0, 0, angleToPulse(angle));
}
// Run the motor forward at 200 steps/second until the motor reaches 400 steps (2 revolutions):
while (stepper.currentPosition() != 5) {
stepper.setSpeed(10);
stepper.runSpeed();
}
delay(1500);
for ( int angle = 130; angle > 50; angle -= 1.8) {
delay(50);
pwm.setPWM(15, 0, angleToPulse(angle));
}
delay(1500);
for ( int angle = 155; angle > 120; angle -= 1.8) {
delay(50);
pwm.setPWM(0, 0, angleToPulse(angle));
}
delay(1500);
for ( int angle = 120; angle > 60; angle -= 2) {
delay(50);
// Pozycja wyjścjowa
pwm.setPWM(8, 0, angleToPulse(angle));
}
delay(1000);
// Run the motor backwards at 600 steps/second until the motor reaches -200 steps (1 revolution):
while (stepper.currentPosition() != 40) {
stepper.setSpeed(20);//dla (-)silnik wzgledem osi pionowej jedzie w prawo
stepper.runSpeed();
}
delay(500);
break;
case 0:
byte b[8] =
{
B11111111,
B11111111,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000,
B00011000
};
printByte(b);
// get the sensor value
int val = analogRead(0);
int step = map(val, 0, 1023, 0, STEPS);
// move a number of steps equal to the change in the
// sensor reading
stepper_reczny.step(step - previous);
// remember the previous value of the sensor
previous = step;
//Control Base Motor
// Get desired position
mtrDegreeServo1 = getDegree(controlservo1);
// Move motor
moveMotorDeg(mtrDegreeServo1, motor1);
//Control Elbow Motor
// Get desired position
mtrDegreeServo2 = getDegree(controlservo2);
// Move motor
moveMotorDeg(mtrDegreeServo2, motor2);
//Control Wrist Motor
// Get desired position
mtrDegreeServo3 = getDegree(controlservo3);
// Move motor
moveMotorDeg(mtrDegreeServo3, motor3);
//Control Pivot Motor
// Get desired position
mtrDegreeServo4 = getDegree(controlservo4);
// Move motor
moveMotorDeg(mtrDegreeServo4, motor4);
//Control Pivot 2 Motor
// Get desired position
mtrDegreeServo5 = getDegree(controlservo5);
// Move motor
moveMotorDeg(mtrDegreeServo5, motor5);
break;
}
}
int angleToPulse(int ang) {
int pulse = map(ang, 0, 180, SERVOMIN, SERVOMAX); // map angle of 0 to 180 to Servo min and Servo max
Serial.print("Angle: "); Serial.print(ang);
Serial.print(" pulse: "); Serial.println(pulse);
return pulse;
}
void printByte(byte character[])
{
int i = 0;
for (i = 0; i < 8; i++)
{
screen.setRow(0, i, character[i]);
}
}