I'm beginner in Arduino and I wrote this code to execute three cycle sequential movements of an 6-servos robot arm into the void loop (). Later I tried to implement an interruption to stop and resume the movements of the arm.
AttachInterrupt is declared in the void setup ().
Void checkSwitch () checks the status of the interruption button.
Serial monitor detects when the button is pressed.
I need a help to implement a interruption in this program to stop the void loop () when button is pressed and return from the point it left when the button is pressed again?
Basically I want the robot arm stop the movement when I pressed interrupt buttom and resume it when i pressed it again.
Thoughts? I really appreciate your help!
See code below:
// add servo libraries
#include <Servo.h>
// define servo pins (changed the pin numbers on 11-09-2022 to make pin #2 free for interrupt use)
#define pinServ1 3
#define pinServ2 4
#define pinServ3 5
#define pinServ4 6
#define pinServ5 7
#define pinServ6 8
// define potentiometers pins
//#define pot1 A0
//#define pot2 A1
//#define pot3 A2
//#define pot4 A3
//#define pot5 A4
//#define pot6 A5
//name servers
Servo serv1, serv2, serv3, serv4, serv5, serv6;
//create position variable
int base; //create position variable for servo1
int shoulder; //create position variable for servo2
int elbow; //create position variable for servo3
int fupdown; //create position variable for servo4
int frotate; //create position variable for servo5
int gripper; //create position variable for servo6
//define Led and button connections
const byte ledPin = 13;
const byte buttonPin = 2;
//Boolean to represent toggle state
volatile byte toggleState = LOW;
void checkSwitch() {
//check status of swicth
//toggle Led if button pressed
if (digitalRead(buttonPin) == LOW) {
//Switch was pressed
//Change state of toggle
toggleState = !toggleState;
//Indicate state on LED
digitalWrite(ledPin, toggleState);
Serial.println("interruption");
}
}
void setup() {
// Set LED pin as Output
pinMode(ledPin, OUTPUT);
// Set switch pin as Input with Pullup
pinMode (buttonPin, INPUT_PULLUP);
// Setup serial monitor. The serial monitor reads the data in the serial port.
Serial.begin(9600);
// Attach Interrupt to Interrupt Service Routine (ISR)
attachInterrupt(digitalPinToInterrupt(buttonPin), checkSwitch, FALLING);
// Atribute pins to their respective servos
serv1.attach(pinServ1);
serv2.attach(pinServ2);
serv3.attach(pinServ3);
serv4.attach(pinServ4);
serv5.attach(pinServ5);
serv6.attach(pinServ6);
}
void loop() {
// initial position. Execution of the initial position for each servo
serv1.write(5); //base
delay(300);
serv2.write(7); //shoulder
delay(300);
serv3.write(0); //elbow
delay(300);
serv4.write(0); //fupdown
delay(300);
serv5.write(85); //frotate
delay(300);
serv6.write(74); //gripper
delay(10000);
//cycle 1 moviment (picking and dropping roll #1)
//1.1 - fist moves from 0 to 90 degrees
for (fupdown = 0; fupdown <= 90; fupdown += 1) {
serv4.write(fupdown);
delay(10); //delay execution for 10ms
}
//1.2 - elbow move from 0 to 75 degrees
for (elbow = 0; elbow <= 75; elbow += 1) {
serv3.write(elbow);
delay(10);
}
//1.3 - fist rotate from 85 to 180
for (frotate = 85; frotate <= 180; frotate += 1) {
serv5.write(frotate);
delay(10);
}
//1.4 - fist moves from 90 to 180 degrees
for (fupdown = 90; fupdown <= 180; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//1.5 - gripper close
for (gripper = 74; gripper <= 138; gripper += 1) {
serv6.write(gripper);
delay(20);
}
delay(2000);
//1.6 - fist move from 180 to 0 degrees
for (fupdown = 180; fupdown >= 0; fupdown -= 1) {
serv4.write(fupdown);
delay(10);
}
//1.7 - fist moves from 0 to 30 degrees
for (fupdown = 0; fupdown <= 30; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//1.8 - elbow moves from 75 to 0 degrees
for (elbow = 75; elbow >= 0; elbow -= 1) {
serv3.write(elbow);
delay(10);
}
//1.9 - shoulder moves from 7 to 112 degrees
for (shoulder = 7; shoulder <= 112; shoulder += 1) {
serv2.write(shoulder);
delay(10);
}
delay(2000);
//1.10 - gripper open
for (gripper = 135; gripper >= 74; gripper -= 1) {
serv6.write(gripper);
delay(20);
}
//1.11 - elbow moves from 0 to 30 degrees
for (elbow = 0; elbow <= 30; elbow += 1) {
serv3.write(elbow);
delay(10);
}
//1.12 - fist rotate from 180 to 85
for (frotate = 180; frotate >= 85; frotate -= 1) {
serv5.write(frotate);
delay(10);
}
// Cycle 2 movement (picking and dropping roll #2)
// return to initial position:
serv1.write(5); //base
delay(300);
serv2.write(7); //shoulder
delay(300);
serv3.write(0); //elbow
delay(300);
serv4.write(0); //fupdown
delay(300);
serv5.write(85); //frotate
delay(300);
serv6.write(74); //gripper
delay(1000);
//2.1 - fist moves from 0 to 90 degrees
for (fupdown = 0; fupdown <= 90; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//2.2 - elbow move from 0 to 75 degrees
for (elbow = 0; elbow <= 75; elbow += 1) {
serv3.write(elbow);
delay(10);
}
//2.3 - fist rotate from 85 to 180
for (frotate = 85; frotate <= 180; frotate += 1) {
serv5.write(frotate);
delay(10);
}
//2.4 - fist moves from 90 to 180 degrees
for (fupdown = 90; fupdown <= 180; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//2.5 - gripper close
for (gripper = 74; gripper <= 138; gripper += 1) {
serv6.write(gripper);
delay(20);
}
delay(2000);
//2.6 - fist move from 180 to 0 degrees
for (fupdown = 180; fupdown >= 0; fupdown -= 1) {
serv4.write(fupdown);
delay(10);
}
//2.7 - fist moves from 0 to 20 degrees (fist slighly more closed to align the roll-2 on the top of roll-1 in the later movement #2.9 )
for (fupdown = 0; fupdown <= 20; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//2.8 - elbow moves from 75 to 0 degrees
for (elbow = 75; elbow >= 0; elbow -= 1) {
serv3.write(elbow);
delay(10);
}
//2.9 - shoulder moves from 7 to 95 degrees
for (shoulder = 7; shoulder <= 95; shoulder += 1) {
serv2.write(shoulder);
delay(10);
}
delay(2000);
//2.10 - gripper open
for (gripper = 135; gripper >= 74; gripper -= 1) {
serv6.write(gripper);
delay(20);
}
//2.11 - elbow moves from 0 to 30 degrees
for (elbow = 0; elbow <= 30; elbow += 1) {
serv3.write(elbow);
delay(10);
}
//2.12 - fist rotate from 180 to 85
for (frotate = 180; frotate >= 85; frotate -= 1) {
serv5.write(frotate);
delay(10);
}
// Cycle 3 movement (picking and dropping roll #3)
// return to initial position:
serv1.write(5); //base
delay(300);
serv2.write(7); //shoulder
delay(300);
serv3.write(0); //elbow
delay(300);
serv4.write(0); //fupdown
delay(300);
serv5.write(85); //frotate
delay(300);
serv6.write(74); //gripper
delay(1000);
//3.1 - fist moves from 0 to 90 degrees
for (fupdown = 0; fupdown <= 90; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//3.2 - elbow move from 0 to 75 degrees
for (elbow = 0; elbow <= 75; elbow += 1) {
serv3.write(elbow);
delay(10);
}
//3.3 - fist rotate from 85 to 180
for (frotate = 85; frotate <= 180; frotate += 1) {
serv5.write(frotate);
delay(10);
}
//3.4 - fist moves from 90 to 180 degrees
for (fupdown = 90; fupdown <= 180; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//3.5 - gripper close
for (gripper = 74; gripper <= 138; gripper += 1) {
serv6.write(gripper);
delay(20);
}
delay(2000);
//3.6 - fist move from 180 to 0 degrees
for (fupdown = 180; fupdown >= 0; fupdown -= 1) {
serv4.write(fupdown);
delay(10);
}
//3.7 - fist moves from 0 to 10 degrees (fist slighly more closed to align the roll-3 on the top of roll-2 in the later movement #3.9 )
for (fupdown = 0; fupdown <= 10; fupdown += 1) {
serv4.write(fupdown);
delay(10);
}
//3.8 - elbow moves from 75 to 0 degrees
for (elbow = 75; elbow >= 0; elbow -= 1) {
serv3.write(elbow);
delay(10);
}
//3.9 - shoulder moves from 7 to 90 degrees
for (shoulder = 7; shoulder <= 90; shoulder += 1) {
serv2.write(shoulder);
delay(10);
}
delay(2000);
//3.10 - gripper open
for (gripper = 135; gripper >= 74; gripper -= 1) {
serv6.write(gripper);
delay(20);
}
//3.11 - elbow moves from 0 to 30 degrees
for (elbow = 0; elbow <= 30; elbow += 1) {
serv3.write(elbow);
delay(10);
}
//3.12 - fist rotate from 180 to 85
for (frotate = 180; frotate >= 85; frotate -= 1) {
serv5.write(frotate);
delay(10);
}
}