Bonjour à tous, j'espère que vous allez bien. J'aurai besoin d'aide pour mon projet, je dois gérer l'angle de l'aiguille d'une horloge en utilisant Arduino mais je ne sais pas comment faire. Je vous transmets le code en pièce jointe de ce message. Merci beaucoup pour votre aide.
String mySt = "";
char myChar;
boolean stringComplete = false;
boolean motor_start = false;
const byte pin_a = 2;
const byte pin_b = 3;
const byte pin_bwd = 8;
const byte pin_fwd = 9;
const byte pin_pwm = 11;
const byte sensor_IR = 4;
double pv_speed = 0;
double e_speed = 0;
double e_speed_pre = 0;
double e_speed_sum = 0;
unsigned int pwm_pulse = 0;
long int RPM = 0;
volatile long tempo, contador = 0;
int timer1_counter;
int flag_IR = 0;
int encoder = 0;
int m_direction = 0;
// set values [Ziegler–Nichols method]
double set_speed = 30;
double kp = 3;
double ki = 0;
double kd = 0;
void setup() {
Serial.begin(9600);
pinMode(pin_a, INPUT_PULLUP);
//pinMode(pin_b, INPUT_PULLUP);
pinMode(sensor_IR, INPUT);
pinMode(pin_fwd, OUTPUT);
pinMode(pin_bwd, OUTPUT);
pinMode(pin_pwm, OUTPUT);
attachInterrupt(digitalPinToInterrupt(pin_a), detect_encoder, RISING);
while (!Serial) {
;
}
analogWrite(pin_pwm, 0);
digitalWrite(pin_fwd, 0);
digitalWrite(pin_bwd, 0);
}
void loop() {
if (stringComplete) {
mySt = "";
stringComplete = false;
}
if (mySt == "i") {
digitalWrite(pin_fwd, 1);
digitalWrite(pin_bwd, 0);
motor_start = true;
}
if (mySt == "p") {
digitalWrite(pin_fwd, 0);
digitalWrite(pin_bwd, 0);
motor_start = false;
RPM = 0;
contador = 0;
e_speed = 0;
e_speed_pre = 0;
e_speed_sum = 0;
pwm_pulse = 0;
}
if (motor_start) {
controlador_PID();
}
mySt = "";
delay(500);
}
void detect_encoder() {
if (digitalRead(pin_a) == HIGH) {
contador++;
}
}
void controlador_PID() {
detachInterrupt(digitalPinToInterrupt(detect_encoder));
if (motor_start) {
RPM = contador * 0.058;
pv_speed = RPM;
RPM = 0;
contador = 0;
if (Serial.available() <= 0) {
Serial.println(pv_speed);
}
e_speed = set_speed - pv_speed;
//Serial.println(e_speed);
double P = e_speed * kp;
double I = e_speed_sum * ki;
double D = (e_speed - e_speed_pre) * kd;
//Serial.println("P: " + String(P) + " I: " + String(I) + " D: " + String(D));
pwm_pulse = P + I + D;
e_speed_pre = e_speed;
e_speed_sum += e_speed;
if (pwm_pulse >= 0 && pwm_pulse <= 255) {
analogWrite(pin_pwm, pwm_pulse);
//Serial.println(pwm_pulse);
}
attachInterrupt(digitalPinToInterrupt(sensor_IR), detect_encoder, RISING);
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar != '\n') {
mySt += inChar;
}
if (inChar == '\n') {
stringComplete = true;
}
}
}