I am using a code for a gear motor, during the rotations, missing some revolutions in it, would someone help me to add an interrupt to it that I don't miss reading from the hall sensor
I want to get the accurate angles from the motor
Cheers
//Define pin setup
#define motor_in1 7
#define motor_in2 8
#define motor_enA 9
volatile int half_revolutions = 0;
int revolutions_per_pos;
int pos = 0;
void setup() {
// Set pin mode
pinMode(motor_enA, OUTPUT);
pinMode(motor_in1, OUTPUT);
pinMode(motor_in2, OUTPUT);
Serial.begin(115200);
// Hallsensor connected to the interrupt pin (Pin 2 on Arduino Uno)
attachInterrupt(0, magnet_detect, RISING);
}
void loop() {
// Run full cycle to each position and back to 0
revolutions_per_pos=706;
move_amount(1);
pos = 1;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(-1);
pos = 0;
Serial.print(pos);
delay(2000);
revolutions_per_pos=706;
move_amount(2);
pos = 2;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(-2);
pos = 0;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(3);
pos = 3;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(-3);
pos = 0;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(1);
pos = 4;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(-1);
pos = 0;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(2);
pos = 5;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(-2);
pos = 0;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(-3);
pos = 6;
Serial.print(pos);
delay(2000);
revolutions_per_pos= 706;
move_amount(3);
pos = 0;
Serial.print(pos);
delay(2000);
}
void magnet_detect() {
half_revolutions++;
}
void move_amount(int no_pos) {
half_revolutions = 0;
if (no_pos < 0) {
// Set rotation direction
digitalWrite(motor_in1, HIGH);
digitalWrite(motor_in2, LOW);
no_pos *= -1;
}
else {
// Set rotation direction
digitalWrite(motor_in1, LOW);
digitalWrite(motor_in2, HIGH);
}
while (half_revolutions < (no_pos * (2 * revolutions_per_pos))) {
Serial.println(half_revolutions);
analogWrite(motor_enA, 100);
}
analogWrite(motor_enA, 0);
}