Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
10
11
6
void setup() {
pinMode(InA1, OUTPUT);
pinMode(InB1, OUTPUT);
pinMode(PWM1, OUTPUT);
}
void loop() {
motorForward(200);
delay(5000);
motorStop();
delay(2000);
motorBackward(200);
delay(5000);
}
void motorForward(int PWM_val) {
analogWrite(PWM1, PWM_val);
digitalWrite(InA1, LOW);
digitalWrite(InB1, HIGH);
}
void motorBackward(int PWM_val) {
analogWrite(PWM1, PWM_val);
digitalWrite(InA1, HIGH);
digitalWrite(InB1, LOW);
}
void motorStop() {
analogWrite(PWM1, 0);
digitalWrite(InA1, LOW);
digitalWrite(InB1, LOW);
}
#define InA1
10
#define InB1
11
#define PWM1
#define encodPinA1
// encoder A pin
#define encodPinB1
// encoder B pin
#define Vpin
#define Apin
pin
#define CURRENT_LIMIT 1000
#define LOW_BAT
10000
#define LOOPTIME
100
#define NUMREADINGS
10
int readings[NUMREADINGS];
unsigned long lastMilli = 0;
unsigned long lastMilliPrint = 0;
int speed_req = 300;
// loop timing
// loop timing
// speed (Set Point)
int speed_act = 0;
int PWM_val = 0;
int voltage = 0;
// in mV
int current = 0;
// in mA
// rev counter
float Kp = .4;
float Kd =
1;
void setup() {
analogReference(EXTERNAL);
3.3V
Serial.begin(115600);
pinMode(InA1, OUTPUT);
pinMode(InB1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(encodPinA1, INPUT);
pinMode(encodPinB1, INPUT);
digitalWrite(encodPinA1, HIGH);
digitalWrite(encodPinB1, HIGH);
attachInterrupt(1, rencoder, FALLING);
for(int i=0; i<NUMREADINGS; i++) readings[i] = 0; // initialize
readings to 0
analogWrite(PWM1, PWM_val);
digitalWrite(InA1, LOW);
digitalWrite(InB1, HIGH);
}
void loop() {
getParam();
if((millis()-lastMilli) >= LOOPTIME) {
tmed loop
// check keyboard
// enter
lastMilli = millis();
getMotorData();
// calculate
// send
PWM to motor
}
printMotorInfo();
// display data
}
void getMotorData() {
// calculate
// last count
//
//
// PID
// display data
Serial.print(speed_req);
Serial.print(" RPM:");
Serial.print(speed_act);
Serial.print(" PWM:");
Serial.print(PWM_val);
Serial.print(" V:");
Serial.print(float(voltage)/1000,1);
Serial.print(" mA:");
Serial.println(current);
Serial.println("***
CURRENT_LIMIT ***");
if (voltage > 1000 && voltage < LOW_BAT) Serial.println("***
LOW_BAT ***");
}
}
void rencoder() {
count++;
//
count--;
// if
return 0;
delay(10);
param = Serial.read();
if(!Serial.available())
cmd = Serial.read();
Serial.flush();
switch (param) {
case 'v':
// adjust speed
if(cmd=='+') {
speed_req += 20;
if(speed_req>400) speed_req=400;
}
if(cmd=='-')
speed_req -= 20;
if(speed_req<0) speed_req=0;
}
break;
case 's':
// adjust direction
if(cmd=='+'){
digitalWrite(InA1, LOW);
digitalWrite(InB1, HIGH);
}
if(cmd=='-') {
digitalWrite(InA1, HIGH);
digitalWrite(InB1, LOW);
}
break;
case 'o':
digitalWrite(InA1, LOW);
digitalWrite(InB1, LOW);
speed_req = 0;
break;
default:
Serial.println("???");
}
}
int digital_smooth(int value, int *data_array) {
count++;
return total/count;
}
// MD03A_Motor_basic + encoder
#define
#define
#define
#define
#define
InA1
10
InB1
11
PWM1
6
encodPinA1
3
encodPinB1
8
#define LOOPTIME
#define FORWARD
100
1
#define BACKWARD
// direction of rotation
// loop timing
// loop timing
// rotation counter
void setup() {
pinMode(InA1, OUTPUT);
pinMode(InB1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(encodPinA1, INPUT);
pinMode(encodPinB1, INPUT);
digitalWrite(encodPinA1, HIGH);
digitalWrite(encodPinB1, HIGH);
attachInterrupt(1, rencoder, FALLING);
}
void loop() {
moveMotor(FORWARD, 50, 464*2);
ticks number
delay(3000);
moveMotor(BACKWARD, 50, 464*2);
delay(3000);
}
// motor moves
// direction, PWM,
// 464=360
motorBrake();