I've redone a previous Arduino sketch I posted in which I was having trouble capturing encoder counts within critical statements, having no luck properly attaching and detaching interrupts. I've studied various ISR sketches but haven't been able to produce anything that caters to my needs.
I now have a switch case in which a DC motor with CPR encoder correctly rotates back and forth between specified boundaries if it alone is in the void loop. However, once enclosed within a critical statement (I want this action to occur only if a button is pressed), the DC motor continues to rotate only one direction.
I need assistance in where to properly attach and detach these interrupts and how to correctly pass the encoder value to the next action. Below is what I've done so far and any help would greatly be appreciated.
#define enA 9
#define in1 6
#define in2 7
const int button1Pin = 8;
int button1State = 0;
volatile long temp, counter = 0;
long local_counter=counter;
enum {IdleState, ForwardState, BackwardState} State;
void setup() {
Serial.begin(9600);
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
Serial.begin (9600);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
attachInterrupt(0, ai0, RISING);
attachInterrupt(1, ai1, RISING);
pinMode(button1Pin, INPUT);
State = IdleState;
}
void loop() {
button1State = digitalRead(button1Pin);
if( counter != temp ){
Serial.print("counter = ");
Serial.print (counter);
Serial.print(" local counter = ");
Serial.println(local_counter);
temp = counter;
}
//if (button1State == HIGH) {
switch (State) {
case IdleState:
halt ();
if (counter<2000)
State = ForwardState;
break;
case ForwardState:
clockwise();
if (counter>=2000)
State = BackwardState;
break;
case BackwardState:
counterclockwise();
if (counter <=0)
State = ForwardState;
break;
} // end switch
// }
}
void ai0() {
if(digitalRead(3)==LOW) {
counter++;
}else{
counter--;
}
}
void ai1() {
if(digitalRead(2)==LOW) {
counter--;
}else{
counter++;
}
}
void clockwise (){
analogWrite(enA, 255);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
}
void counterclockwise () {
analogWrite(enA, 255);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
void halt () {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
An explanation of my setup is as follows:
My button is a tactile button on breadboard (connected to pin 8 of an Arduino Uno), with 5V supply from Arduino. Pins 6 of the Arduino is connected input 1 of the L298N motor driver, pin 7 of Arduino connected to input 2 of the motor driver, and pin 9 of the Adruino connected to the enable of the motor driver. Them motor driver is being supplied by an external 12V supply which is also power the 12V DC geared motor with encoder. The encoder outputs are connected to pin 2 and 3 of the Arduino.
halt()
doesn't seem to be correct