dimanche 25 septembre 2016

Dialoguer a distance entre deux arduino avec APC220 portée 1km

Télécommande APC220 portée 1000m

Après plusieurs demandes, je met ce petit tuto concernant les module émetteur récepteur APC220. Permettant de communiquer soit entre PC et arduino ou entre deux arduino. Je vais me pencher sur cette dernière config.


D'après les spécifications technique ce petit module a une portée d'environ 1km en zone dégagée (pas testé)

Il est possible de configurer le module par le biais d'un petit soft (fréquence, ID, ....), j'y reviendrai plus tard.

Le câblage


Le câblage reste ultra simple !!


Il n'y a pas de module APC220 dans la bibliothèque Frizing j'ai donc pris un module approchant!
Je n'ai pas mis de led sur le récepteur car dans le sketch en exemple j'utilise celle de la carte. Vous remarquerez également que j'ai branché les bornes RX et TX des APC220 sur les bornes 10 et 11 de l'arduino ceci car j'utilise SoftwareSerial et donc je laisse la port série libre.

Les sketchs

Comme je l'ai dit plus haut, j'utilise la librairie SoftwareSerial.

Le programme reste simple:

L'émetteur

"mySerial.begin(9600);"

création d'un flag  "flag='a'; "

et envoie vers le récepteur
mySerial.print(flag);

Le récepteur

Ouverture du port virtuel
 "mySerial.begin(9600);"

Configuration en mode réception
 if(mySerial.available() > 0)
state = mySerial.read();

Réception du flag
if (state == 'a') {// (ici ce sera state car dans le programme final je force l'état du flag)
 digitalWrite(ld,HIGH);

 Les codes

Emetteur


//EMETTEUR by arduino-creations.blogspot.fr

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
int button_open =4;
int button_close =3;
int mes = 0;
char flag;

void setup()
{
  pinMode(button_open, INPUT_PULLUP);
  pinMode(button_close, INPUT_PULLUP);
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop()
{
  if( digitalRead(button_open)==LOW)
  {
    flag='a';
    mySerial.print(flag);
  }
  else
if( digitalRead(button_open)==HIGH)
{
    flag='A';
    mySerial.print(flag);
  }
 
 if(digitalRead(button_close)==LOW)
  {
    flag='b';
    mySerial.print(flag);
  }

   
  delay(20);
}

Récépteur

//RECEPTEUR by arduino-creations.blogspot.fr

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
int ld = 13;

int state;
int flag=0;

void setup() {
   Serial.begin(9600);
   mySerial.begin(9600);
    pinMode(ld, OUTPUT);
    digitalWrite (ld,LOW);
}

void loop() {
  if(mySerial.available() > 0){
  state = mySerial.read();
  flag=0;
  }
  if (state == 'a') {
  digitalWrite(ld,HIGH);
 Serial.print(state);
  if(flag == 0){
  flag=1;
  }
  }
  else if (state == 'A'){
  digitalWrite(ld,LOW);
  Serial.print(state);
  if(flag == 0){
  flag=1;
  }
  }
 delay(10);
 
}