//EricDuino le 22-5-2012
// définition les pins du SN754410NE
#define EN12 9 // Left Motor Enable Pin EN1,2
#define IN1A 8 // LeftRight Motor Direction Pin 1A
#define IN2A 7 // Left Motor Direction Pin 2A
#define EN34 10 // Right Motor Enable Pin EN3,4
#define IN3A 5 // Right Motor Direction 3A
#define IN4A 4 // Right Motor Direction 4A
// la fonction moteur
#define FORW 1 // Forward
#define BACK 0 // Backward
// M1 = Moteur Gauche M2 = Moteur Droit
void Motor_Control (int M1_DIR, int M1_EN, int M2_DIR, int M2_EN) // Motor control function
{
////////// M1 ////////////////////////
if (M1_DIR == FORW) // Set M1 Motor Direction
{
digitalWrite (IN1A, LOW); // HIGH, Rotate clockwise
digitalWrite (IN2A, HIGH); // LOW, Rotate clockwise
}
else
{
digitalWrite (IN1A, HIGH); // LOW, Anti Rotate clockwise
digitalWrite (IN2A, LOW); // HIGH, Anti Rotate clockwise
}
analogWrite (EN12, M1_EN);
/////////// M2 //////////////////////
if (M2_DIR == FORW) // Set M2 Motor Direction
{
digitalWrite (IN3A, HIGH); // HIGH, Rotate clockwise
digitalWrite (IN4A, LOW); // LOW, Rotate clockwise
}
else
{
digitalWrite (IN3A, LOW); // LOW, Anti Rotate clockwise
digitalWrite (IN4A, HIGH); // HIGH, Anti Rotate clockwise
}
analogWrite (EN34, M2_EN);
}
// le setup
void setup()
{
// setup et init des pins SN754410NE
pinMode(EN12, OUTPUT);
pinMode(IN1A, OUTPUT);
pinMode(IN2A, OUTPUT);
pinMode(EN34, OUTPUT);
pinMode(IN3A, OUTPUT);
pinMode(IN4A, OUTPUT);
digitalWrite(EN12, LOW);
digitalWrite(IN1A, LOW);
digitalWrite(IN2A, LOW);
digitalWrite(EN34, LOW);
digitalWrite(IN3A, LOW);
digitalWrite(IN4A, LOW);
delay(3000);
}
//la boucle principale
void loop() {
Motor_Control (FORW, 0, FORW, 0);
delay(1000);
Motor_Control (FORW, 255, FORW, 255);
delay(1000);
Motor_Control (FORW, 0, FORW, 0);
delay(1000);
Motor_Control (BACK, 255, FORW, 255);
delay(1000);
}
/*
______ ___ ___________
___ |/ /_____ ______________ ___________ /___ /______________
__ /|_/ /_ __ `/_ ___/_ __ `__ \ __ \ __/_ __ \ __ \_ __ \
_ / / / / /_/ /_ / _ / / / / / /_/ / /_ _ / / / /_/ / / / /
/_/ /_/ \__,_/ /_/ /_/ /_/ /_/\____/\__/ /_/ /_/\____//_/ /_/
*/
#define motPin 10
#define motSens 8
#define motPin2 9
#define motSens2 12
int M1,M2;
int maxS = 1023;
int minS = 0;
int lastError = 0;
float KP; //0.6 - 1
float KD; //5 - 14
//float KI = 0.01;
int a,b,c,error;
//float integral = 0;
unsigned long lastMark = 0;
void setup() {
pinMode(0, INPUT);
pinMode(1, INPUT);
pinMode(3, INPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(motSens, LOW);
digitalWrite(motSens2, LOW);
digitalWrite(4, HIGH); // allumer led
if ( digitalRead(7) ){ // choix vitesse, rajouté pendant le tournoi pour essayer d'aller plus vite en gardant le retour en arrière possible.
M1 = 150;
M2 = 150;
KP = 1; //0.6 - 1
KD = 14;
} else {
M1 = 100;
M2 = 100;
KP = 0.6; //0.6 - 1
KD = 5;
}
//Serial.begin(9600);
int start = HIGH;
while ( start ) {
start = digitalRead(7);
//Serial.println("wait");
}
digitalWrite(13, HIGH);
delay(500);
calibrate();
digitalWrite(13, LOW);
}
void loop() {
// lecture de tout les capteurs de ligne dans un tableau
int Sensors[8];
Sensors[0] = digitalRead(0)*10;
Sensors[7] = digitalRead(1)*10;
int somme = Sensors[0];
for (int i = 0; i<6; i++){
Sensors[i+1] = map(analogRead(i), minS, maxS, 0, 10);
somme += Sensors[i+1];
}
somme += Sensors[7];
if (somme < 5) { // s'arreter si on tombe sur du blanc
analogWrite(motPin, 0);
analogWrite(motPin2, 0);
delay(500);
digitalWrite(13, HIGH);
while (1);
} else {
error = ( 100*Sensors[1]+200*Sensors[2]+300*Sensors[3]+400*Sensors[4]+500*Sensors[5]+600*Sensors[6]+700*Sensors[7] ) / somme;
error -= 350;
}
// -350 < error < 350
// 0 -> ligne milieu
//Serial.print("Error = ");
//Serial.println(error);
//integral += KI * error;
int motorSpeed = KP * error + KD * (error - lastError);
lastError = error;
//Serial.println(motorSpeed);
int m1Speed = M1 + motorSpeed;
int m2Speed = M2 - motorSpeed;
// pouvoir mettre un moteur à l’envers si vitesse négative
if (m1Speed < 0){
digitalWrite(motSens, HIGH);
digitalWrite(motSens2, LOW);
m1Speed *= -1;
} else if (m2Speed < 0){
digitalWrite(motSens2, HIGH);
digitalWrite(motSens, LOW);
m2Speed *= -1;
} else {
digitalWrite(motSens, LOW);
digitalWrite(motSens2, LOW);
}
//m1Speed = constrain(m1Speed, 0, 255);
//m2Speed = constrain(m2Speed, 0, 255);
/*Serial.print("m1Speed = ");
Serial.println(m1Speed);
Serial.print("m2Speed = ");
Serial.println(m2Speed);*/
analogWrite(motPin, m1Speed);
analogWrite(motPin2, m2Speed);
// arrêter le programme avec le bouton poussoir
if (!digitalRead(7)){
analogWrite(motPin, 0);
analogWrite(motPin2, 0);
delay(500);
digitalWrite(13, HIGH);
while (1);
}
}
void calibrate(){ // calibration des capteurs
//Serial.println("calibrate");
maxS = 0;
minS = 1023;
int start = HIGH;
while ( start ) {
for(int i = 0; i < 6; i++ ){
int a = analogRead(i);
if(a > maxS) maxS = a;
if(a < minS) minS = a;
}
start = digitalRead(7);
//Serial.println("cali");
}
delay(100);
/*Serial.print("maxS = ");
Serial.println(maxS);
Serial.print("minS = ");
Serial.println(minS);*/
}
Retourner vers Vos projets, vos idées
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité