DC Motor with encoder issues

Hi there,

I am working on a group project which requires a 12V DC motor with encoder to be controlled by an arduino uno wifi.

Motor: https://www.robotshop.com/products/555-size-dc-motor-with-encoder-12v-8000-rpm

Motor shield: Arduino Motor shield | Electronics For You

The issue is we are all unfamiliar with arduino and no prior expereince working with it. So far we've tried different codes and setups, some of which dont work, others result in a "buzzing" coming from the motor but no rotation. The channel A lights aren't on, but the rest are signifying its recieving power. If anyone can help with the code or setup we'd greatly appreciate it!

Thanks

Thomas

what's the circuit?
what's the code?
what's the power supply for the arduino and the motor?

Homework?

The code:
// This alternate version of the code does not require
// atomic.h. Instead, interrupts() and noInterrupts()
// are used. Please use this code if your
// platform does not support ATOMIC_BLOCK.

#define ENCA 2 // YELLOW
#define ENCB 3 // WHITE
#define PWM 5
#define IN2 6
#define IN1 7

volatile int posi = 0; // specify posi as volatile: volatile - Arduino Reference
long prevT = 0;
float eprev = 0;
float eintegral = 0;

void setup() {
Serial.begin(9600);
pinMode(ENCA,INPUT);
pinMode(ENCB,INPUT);
attachInterrupt(digitalPinToInterrupt(ENCA),readEncoder,RISING);

pinMode(PWM,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);

Serial.println("target pos");
}

void loop() {

// set target position
//int target = 1200;
int target = 250*sin(prevT/1e6);

// PID constants
float kp = 1;
float kd = 0.025;
float ki = 0.0;

// time difference
long currT = micros();
float deltaT = ((float) (currT - prevT))/( 1.0e6 );
prevT = currT;

// Read the position
int pos = 0;
noInterrupts(); // disable interrupts temporarily while reading
pos = posi;
interrupts(); // turn interrupts back on

// error
int e = pos - target;

// derivative
float dedt = (e-eprev)/(deltaT);

// integral
eintegral = eintegral + e*deltaT;

// control signal
float u = kpe + kddedt + ki*eintegral;

// motor power
float pwr = fabs(u);
if( pwr > 255 ){
pwr = 255;
}

// motor direction
int dir = 1;
if(u<0){
dir = -1;
}

// signal the motor
setMotor(dir,pwr,PWM,IN1,IN2);

// store previous error
eprev = e;

Serial.print(target);
Serial.print(" ");
Serial.print(pos);
Serial.println();
}

void setMotor(int dir, int pwmVal, int pwm, int in1, int in2){
analogWrite(pwm,pwmVal);
if(dir == 1){
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
}
else if(dir == -1){
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
}
else{
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
}
}

void readEncoder(){
int b = digitalRead(ENCB);
if(b > 0){
posi++;
}
else{
posi--;
}
}

The circuit:

Were using 12V external power supply wired to the motor shield.

missing the code tags... please edit your post and add them

your motor is rated @ 12V and 0.4A with no load (up to 3.5A)
what's this small battery ?
image

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.