السلام عليكم و رحمة الله و بركاته
اخى العزيز , قم بتجربة هذا الكود
كود:
MD03A_Motor_basic + encoder
#define InA1 10 // INA motor pin
#define InB1 11 // INB motor pin
#define PWM1 6 // PWM motor pin
#define encodPin 3 // encoder pin
//#define encodPinB1 8 // encoder B pin
//#define LOOPTIME 100 // PID loop time
#define FORWARD 1 // direction of rotation
#define BACKWARD 2 // direction of rotation
//unsigned long lastMilli = 0; // loop timing
//unsigned long lastMilliPrint = 0; // loop timing
long count = 0; // rotation counter
long countInit;
long encoderPulses = 0;
boolean run = false; // motor moves
void setup() {
pinMode(InA1, OUTPUT);
pinMode(InB1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(encodPin, INPUT_PULLUP);
// pinMode(encodPinB1, INPUT);
// digitalWrite(encodPinA1, HIGH); // turn on pullup resistor
// digitalWrite(encodPinB1, HIGH);
attachInterrupt(digitalPinToInterrupt(encodPin), encoderCounter, FALLING);
}
void loop() {
moveMotor(FORWARD, 50, 100*5); // direction, PWM, ticks number
delay(3000);
moveMotor(BACKWARD, 50, 100*5); // 464=360°
delay(3000);
}
void moveMotor(int direction, int PWM_val, long tick) {
countInit = count; // abs(count)
encoderPulses = tick;
if(direction==FORWARD) motorForward(PWM_val);
else if(direction==BACKWARD) motorBackward(PWM_val);
}
void encoderCounter() { // pulse and direction, direct port reading to save cycles
if(digitalRead(encodPin)==HIGH) count ++;
//if (digitalRead(encodPinA1)==LOW) count --;
if(run)
if((abs(abs(count)-abs(countInit))) >= encoderPulses) motorBrake();
}
void motorForward(int PWM_val) {
analogWrite(PWM1, PWM_val);
digitalWrite(InA1, LOW);
digitalWrite(InB1, HIGH);
run = true;
}
void motorBackward(int PWM_val) {
analogWrite(PWM1, PWM_val);
digitalWrite(InA1, HIGH);
digitalWrite(InB1, LOW);
run = true;
}
void motorBrake() {
analogWrite(PWM1, 0);
digitalWrite(InA1, HIGH);
digitalWrite(InB1, HIGH);
run = false;
}
و ما توفيقى الا بالله