et le code de l'escalve
#include <SPI.h>
#include <Servo.h>
char buf [100];//tampon de réception
volatile byte pos;//position dans le tampon
volatile boolean process_it;//information récupérée
boolean test_data=false;//résultat information testé
int Priority = 9;
int Com_Avaible=10;
Servo Rpm_1_Servo;
String C_role="01";
float data;
String datac="coucou les petit enfant\n";
char* hexadec[]={"0", "1", "2", "3", "4", "5", "6","7", "8", "9", "a", "b", "c", "d", "e", "f","\n"};
void setup (void)
{
Serial.begin (115200);
Serial.println ("Esclave ok");
pinMode(Priority, INPUT);//coupure de toute les transmitions sortantes
pinMode(Com_Avaible, INPUT);//indicateur de donnée à réceptionné
pinMode(MISO, OUTPUT);//Réglage en mod esclave
pinMode(5, OUTPUT);//Information pour le servo en sortant
SPCR |= _BV(SPE);//Réglage en mod esclave
pos = 0; // purge du buffer
process_it = false;//pas d'info en stock
SPI.attachInterrupt();
SPI.setClockDivider(SPI_CLOCK_DIV8);
pinMode(5, OUTPUT);// For the servo.
Rpm_1_Servo.attach(5);
for(int i=0; i<180; i=i+10)
{
Rpm_1_Servo.write(i);
delay(200);
}
Rpm_1_Servo.write(5);
}
// SPI interrupt routine
ISR (SPI_STC_vect)
{
if(digitalRead(Com_Avaible) == LOW)
{
byte c = SPDR; // grab byte from SPI Data Register
if (pos < sizeof (buf))
{
buf [pos++] = c;
if (c == '\n')
process_it = true;
}
}
}
boolean DATA_test(String Buffer)
{
boolean sepa=true;
boolean carac=false;
int Buffer_size=Buffer.length();
Serial.print("data:");
Serial.println(Buffer);
//vérification de la cohérence des données
for(int i=1; i<Buffer_size+1; i++)
{
carac=false;
if(i!=0 && i!=Buffer_size)
{
if(i%3==0)
{
if (Buffer.substring(i-1,i) ==":"){sepa=true;}
else{sepa=false;break;}
}
else{
for(int a=0; a<16; a++){if(Buffer.substring(i-1,i) == hexadec[a]){carac=true;}}
if(carac==false || sepa==false){break;}
}
}
else if(i==Buffer_size)
{
if(Buffer.substring(i-1,i) == "\n"){}
else {break;}
}
else
{
for(int a=0; a<16; a++){if(Buffer.substring(i-1,i) == hexadec[a]){carac=true;}}
if(carac==false || sepa==false){break;}
}
}
return true;
}
float Data_extract(String Buffer)
{
int signe;
if(Buffer.substring(6,8)=="AA"){signe=-1;}
else if(Buffer.substring(6,8)=="FF"){signe=1;}
int size_data;
size_data=Buffer.substring(3,5).toInt();
float data;
String data_t;
for(int i=0; i<size_data; i++){data_t+=Buffer.substring(9+(3*i),11+(3*i));}
data=data_t.toInt();
data=signe*(data/1000000);
return data;
}
void loop (void)
{
if (process_it)
{
buf [pos] = 0;
pos = 0;
String Buffer = buf;
data=0;
if(DATA_test(Buffer))
{
data=Data_extract(Buffer);
}
String role;
role=Buffer.substring(0,2);
Rpm_1_Servo.write(data+5);
/* début de la partie qui catouille
delay(2000);
pinMode(Com_Avaible, OUTPUT);//indicateur de donnée à réceptionné
digitalWrite(Com_Avaible, LOW);//réveil électrique de la carte réceptrice
for (int i=0; i< datac.length(); i++)
{
SPI.transfer (datac.charAt(i));delayMicroseconds(20);
Serial.println(datac.charAt(i));
}
digitalWrite(Com_Avaible, HIGH);
pinMode(Com_Avaible, INPUT);//indicateur de donnée à réceptionné
*/ fin de partie qui catouille
}
process_it=false;
}
je recherche de la doc, des exemples pour la communication entre arduino bidirectionnel, mais je ne trouve que sur des périphériques et pour moi ce n'est pas explicite.
Pourriez vous m'aider.
Merci d'avance Flo