J'ai modifié l'histoire comme ceci et la le port s'ouvre, etc
#include <TimerOne.h>
#define BUFF_LEN 40
unsigned int Speed = 0;
int Distance = 0;
int val;
int clock = 5;
int dir = 3;
int step_half = 4;
int Enable = 6;
int count_val = 0;
int stop_mot = 0;
char c;
char buffer[BUFF_LEN];
int buff_index = 0;
void setup()
{
Serial.begin(21000);
pinMode(clock,OUTPUT);
pinMode(Enable,OUTPUT);
pinMode(dir,OUTPUT);
pinMode(step_half,OUTPUT);
}
void loop()
{
//Boucle qui traite le message reçu
if(Serial.available() > 0)
{
c = Serial.read();
if (c == '
Mais...
int speed ne prends pas une bonne valeur, je m'explique
quand j'obtiens Speed j'effectue un calcul pour le remettre en période d'oscillation en µs.
donc unsigned long int µs : (1/Speed*3.33)*10000
et ensuite j'appelle µs dans Timer1.initialize(µs);
Mais au moment ou le moteur doit se lancer, ça foire, il considère que la vitesse est de 1.000.000 µs soit 1 seconde, et l'acquisition se fait toutes les seconde aussi, donc il reste coincé dans une boucle qui l'empêche de travailler assez vite)
gere_reception();
else
switch (c)
{
case '4' :
{
Serial.println(analogRead(A5));
break;
}
case '5' :
{
val = analogRead(A5);
Serial.println(val);
//int Deplacement = Distance / 0.005;
//int ms = (1/(Speed * 3.33))*10000;
if (stop_mot == 0)
{
Timer1.initialize(10000);
Timer1.attachInterrupt(count);
digitalWrite(Enable,HIGH);
}
break;
}
case '6' :
{
Timer1.stop();
digitalWrite(clock,LOW);
digitalWrite(Enable,LOW);
digitalWrite(dir,LOW);
count_val=0;
stop_mot = 0;
break;
}
}
}
}
void count()
{
if (++count_val <=200 && val <= 53)
{
digitalWrite( clock, digitalRead( clock ) ^ 1 );
if (count_val <=100)
digitalWrite(dir,HIGH);
if (count_val > 100 && count_val < 200)
digitalWrite(dir,LOW);
}
else
{
stop_mot = 1;
digitalWrite(clock,LOW);
digitalWrite(Enable,LOW);
digitalWrite(dir,LOW);
}
}
void gere_reception()
{
if (buff_index == 0)
{
// attente caractère de synchro
// tant qu'on ne l'a pas reçu on reste à l'index 0
if (c == '
Mais...
int speed ne prends pas une bonne valeur, je m'explique
quand j'obtiens Speed j'effectue un calcul pour le remettre en période d'oscillation en µs.
donc unsigned long int µs : (1/Speed*3.33)*10000
et ensuite j'appelle µs dans Timer1.initialize(µs);
Mais au moment ou le moteur doit se lancer, ça foire, il considère que la vitesse est de 1.000.000 µs soit 1 seconde, et l'acquisition se fait toutes les seconde aussi, donc il reste coincé dans une boucle qui l'empêche de travailler assez vite)
++buff_index;
}
else
{
// on empile les caractères dans le buffer jusqu'au max
if (buff_index < (BUFF_LEN - 1))
++buff_index;
// si le caractère est le marqueur de fin, on a reçu un message entier
if (c == '\r' )
traite_message();
// le message a été traité, on repart à 0
buff_index = 0;
}
}
void traite_message()
{
// on sait que le 1er caractère est $, on s'en fout
// le 2nd caractère est l'ID du message
switch( buffer[1])
{
case 'A' :
{
// message A, on lit la valeur numérique qui est derrière
// si le message était plus complexe avec plusieurs valeurs, on pourrait utiliser strtok()
int Speed = atoi ( &buffer[2]);
//utiliser la valeur
break;
}
case 'B' :
{
int Deplacement = atoi ( &buffer[2]);
break;
}
}
}
Mais...
int speed ne prends pas une bonne valeur, je m'explique
quand j'obtiens Speed j'effectue un calcul pour le remettre en période d'oscillation en µs.
donc unsigned long int µs : (1/Speed*3.33)*10000
et ensuite j'appelle µs dans Timer1.initialize(µs);
Mais au moment ou le moteur doit se lancer, ça foire, il considère que la vitesse est de 1.000.000 µs soit 1 seconde, et l'acquisition se fait toutes les seconde aussi, donc il reste coincé dans une boucle qui l'empêche de travailler assez vite