Bonjour
J'ai un projet qui utilise un servomoteur AC piloté par un arduino uno ce code fonctionne parfaitement
Mais je voudrais utilisé 2 arduino connecté par i2c:
-pour l'esclave son rôle est d'envoyé les signaux de pas au servo (il contient le code qui pilote le moteur) en prenant compte de 3 paramètre (3 octet envoyé par le maitre)
(les paramètres sont le nombre de tour a effectué, la vitesse de rotation et l'accélération)
-le maître lui envoie les 3 paramétré et n'attend rien en retour
(cela me permet de pouvoir lire des capteurs pendant que le moteur tourne)
mon code fonctionne mais quand je mesure la fréquence des signaux sur la pin d2 avec un oscilloscope je constate que la fréquence est trop faible
Pourtant les octet réceptionné sont les bons (vérifié avec le moniteur serie)
la valeur de la variable pause est bonne aussi
Par contre si a la place de Wire.read() je rentre directement la valeur cela fonctionne, la frequence est bonne
si au lieu d'envoyé 3 paramètres j'envoie juste le premier (celui qui gère la fréquence) et que je code directement les 2 autres a la place de Wire.read() sa fonctionne également.
Je ne comprend vraiment pas!!
Normalement que la valeur soit affecté avec la fonction Wire.read() ou manuellement je suis sensé avoir le même résultat non ?
code du maitre
#include <Wire.h>
void setup()
{
Serial.begin(128000);
Wire.begin();
}
void loop()
{
Wire.beginTransmission(0b1001001); // Commencer transmission vers l'esclave
Wire.write(100);
Wire.write(30);
Wire.write(5);
Wire.endTransmission(); // fin transmission
}
code de l'esclave (la fonction start_vitesse_constante() est simplifié pour mieux cerné le probléme)
#include <Wire.h>
#define NB_PAS_PAR_TOUR 200
#define FREQ_MIN 1
#define PAS 2 // affection pin digital du pas
#define DIR 3// affection pin digital de la direction
void setup()
{
Wire.begin(0b1001001);
Wire.onReceive(receiveEvent);
pinMode(PAS,OUTPUT);
pinMode(DIR,OUTPUT);
}
void loop()
{
delay(100);
}
// Fonction qui est exécutée lorsque des données sont envoyées par le Maître.
void receiveEvent(int howMany)
{
long vitesse_max;
long course;
long distance_acc;
while(3!=Wire.available())
{
delay(100);
}
vitesse_max = Wire.read()*6;// conversion mm/s en tr/min
course = Wire.read()*(NB_PAS_PAR_TOUR/10) ;//conversion mm en nombre de pas
distance_acc= Wire.read()*(NB_PAS_PAR_TOUR/10) ;//conversion mm en nombre de pas
start_vitesse_constante(vitesse_max,course,distance_acc);
}
//fonction qui execute un cycle (une acceleration + vitesse constante + deceleration)
//la frequence est en tour/minute
void start_vitesse_constante(long tour_min_max,long nb_pas_total,long nb_pas_acc) //fonction qui execute un cycle (une acceleration + vitesse constante + deceleration)
{
int nb_pas_envoye=0L;
long f_actuel;
long pause;
// vitesse constante
for(nb_pas_envoye=nb_pas_acc ; nb_pas_envoye < (nb_pas_total-nb_pas_acc) ; nb_pas_envoye++)
{
pause=60000000/(NB_PAS_PAR_TOUR*tour_min_max);
digitalWrite(PAS,HIGH);//envoie du pas
digitalWrite(PAS,LOW);
do // pause
{
if( pause <= 10000 )
{
delayMicroseconds(pause);
pause=0;
}
else
{
delayMicroseconds(10000);
pause -= 10000;
}
} while( pause > 0);
}
}