juillet 19

Envoyer plusieurs données entre Teensy et Xbee

J’avais déjà indiqué comment envoyer une donnée à la fois (en faite un byte à la fois) pour commander en ON/OFF une LED par exemple MAIS si l’on souhaite envoyer plusieurs données en série du style :  Si j’envoie la lettre A alors les 3 données suivantes concerne le groupe A,  ça se complique.

J’ai essayé via la library fournis par Xbee mais je n’arrive à rien !

Le code émetteur

/* testé sur Teensy 3.1 et Xbee série 1.
#define HWSERIAL Serial2 //TX2 pin10


void setup() {/********************** SETUP *****************************/
  HWSERIAL.begin(9600);
}

void loop() {
  
  HWSERIAL.write('a');
  HWSERIAL.write(1);
  HWSERIAL.write(2);
  HWSERIAL.write(3);
  delay(1000);
  
   HWSERIAL.write('b');
  HWSERIAL.write(10);
  HWSERIAL.write(20);
  HWSERIAL.write(30);
  delay(1000);
}//loop

Le code récepteur

/* testé sur Teensy 3.1 
on envoie via serie un write(a ou b), si il est reçu, on reçoit les 3 données suivantes.
*/
#define HWSERIAL Serial1

byte DataSerie[4];
byte InSerie;

void setup(){
   HWSERIAL.begin(9600);
 
}


void loop(){
 while (HWSERIAL.available())
{// on place les 4 bytes reçu dans un tableau

      for (int i=0; i<=3; i++)
      {
byte InSerie = HWSERIAL.read();  
DataSerie[i] = InSerie;
      }//for
if (DataSerie[0] == 'a')// le premier byte envoyé doit être le caractère a 
{
 Serial.println("bien recu a"); 
 Serial.println(byte(DataSerie[1]));
  Serial.println(byte(DataSerie[2]));
   Serial.println(byte(DataSerie[3]));
}
if (DataSerie[0] == 'b')
{
 Serial.println("bien recu b"); 
 Serial.println(byte(DataSerie[1]));
  Serial.println(byte(DataSerie[2]));
   Serial.println(byte(DataSerie[3]));  
}
}//while
}//loop

J’ai délibérément fait simple mais c’est une base pour faire des trucs sympa !

Autre façon de faire

Catégorie : Teensy/Arduino | Commenter
juillet 13

Fonction pour afficher dans le moniteur serie

Il n’est parfois pas facile, vu la vitesse de défilement du moniteur série d’Arduino, de voir la valeur d’une variable.

Placer l’appel de la fonction :

MoniteurSerie(String("Valeur du volume"), ValeurVolume);

Et après le LOOP, la fonction.
Il suffira juste de jouer sur le delay pour ralentir l’affiche de tous les appels à la fonction.

void MoniteurSerie(String texte, int variable)
{
  Serial.print(texte);
  Serial.print(": ");
  Serial.print(variable);
  Serial.println("");
  delay(10); 
}

 

Catégorie : Teensy/Arduino | Commenter
juillet 13

Modification de variable via une liaison série

J’ai fais un montage avec Teensy et Xee permettant à 1 bouton de dire via une liaison série :  si je suis appuyé, la variable MaVariable = 1, sinon MaVariable = 0.

J’ai donc : appuie bouton = envoie série de « on », si pas d’appuie = envoie série de « off ». Problème, au repos, j’envoie sans arret le code « off » ce qui est pas top en terme de gestion de l’énergie.

Je pourrais faire, sur la partie réception : si j’envoie autre chose que « on », alors on considère que c’est « off ».
Le truc est que en même temps, j’envoie d’autres code en série, donc cette solution ne tient pas.

J’ai trouvé l’astuce en jouant sur un compteur.

Si le bouton sur OFF, je compte jusqu’à 3 MAIS SEULEMENT à 2, j’envoie le code série « off ». Le compteur reste bloqué à 3 (donc plus d’envoie série) jusqu’à que je bouton soit « on », quand i l’est, l’incrément du compteur se remet sur 1 et attend donc que le bouton soit « off » pour recompter.

Je ne mat pas le code qui fait : si tu appuie, fait : HWSERIAL.write(« on »);

if(Bouton == 1) // si le bouton est ON, on met le compteur = 1
{
  ComptBouton = 1;
  }
if (Bouton == 0 && ComptBouton <=3)//quand le bouton est OFF, on compte jusqu'à 3
{
for (ComptBouton = 1; ComptBouton <=3; ComptBouton++)
{
if(ComptBouton == 2)// à 2, on envoie le code off
{
HWSERIAL.write("off"); 
}//if
}//for
}//if bouton

Comme j’ai galéré un moment sur ça, je partage !

Catégorie : Teensy/Arduino | Commenter
juillet 9

Volume MIDI via liaison série

Le Teensy 3.1 est reconnu nativement comme un périphérique compatible MIDI et il permet aussi de créer des touches à effleurement (capacitive).
Le Xbee (serie 1) est très simple à configurer, voila de quoi faire une belle télécommande audio.

Code émetteur

/* testé sur Teensy 3.1 :
Un les touches à effleurement incrémentent ou décrémentent une valeur de volume (0 à 127).
Un appuie sur une des deux touches envoie via serie, la lettre 'v' qui indique au récepteur que l'on envoie une valeur de volume.
Ensuite, on evoie la valeur de volume. */

#define HWSERIAL Serial2 //TX2 - pin 8
#include <CapacitiveSensor.h>

/*VOLUME*/
int TestBouton10;
int EtatBouton10;
int TestBouton11;
int EtatBouton11;
int ValeurVolume;
/* au changement de set Ableton, à la 1er impulsion des boutons, le volume se met une fraction de seconde au volume du set précédent (ComptVolume part de la dernière valeur) */
const int latenceVolume = 10; // vitesse du curseur
const int MaxHaut = 127; //127 en MIDI

/* TOUCHE SENSITIVE */
int BoutonCommun = 14; // pin commune
int NBtestBoutons = 30; // nombres de test des boutons
int ValCapacitive = 2000; // valeur de l'entrée capacitive

//VOLUME
CapacitiveSensor   Bouton10 = CapacitiveSensor(BoutonCommun, 32); // Volume + (pin 32)
CapacitiveSensor   Bouton11 = CapacitiveSensor(BoutonCommun, 33); // Volume - (pin 33)

void setup() {/********************** SETUP *****************************/
  HWSERIAL.begin(9600); 
}

void loop() {

  //VOLUME
  long TestBouton10 =  Bouton10.capacitiveSensor(NBtestBoutons);
  long TestBouton11 =  Bouton11.capacitiveSensor(NBtestBoutons);

   /**************************************************************** ENVOIE SERIE - VOLUME */
  if (TestBouton10 > ValCapacitive && ValeurVolume < MaxHaut)
  {
       HWSERIAL.write('v');
        ValeurVolume++;
HWSERIAL.write(ValeurVolume);
    delay(latenceVolume);
  }

  if (TestBouton11 > ValCapacitive && ValeurVolume > 0)
  {    
   HWSERIAL.write('v'); 
      ValeurVolume--;
HWSERIAL.write(ValeurVolume);
    delay(latenceVolume);
  }
Serial.println(ValeurVolume);
}//loop

Code récepteur

/* testé sur Teensy 3.1 
on envoie via serie un write('v') et ensuite un write avec une valeur numérique.
si le a est reçu, alors on affiche la valeur numérisue.
*/
#define HWSERIAL Serial1

byte DataSerie[1]; //tableau de 2 valeurs (0 et 1)
byte InSerie;
int i;

void setup(){
   HWSERIAL.begin(9600);
 
}


void loop(){
 while (HWSERIAL.available())
{// on place les 2 byte recu dans un tableau
i = 0;
      for (i=0; i<=2; i++)
      {
byte InSerie = HWSERIAL.read();  
DataSerie[i] = InSerie;

if (char(DataSerie[0]) == 'v')// le premier byte envoyé doit être le caractère v 
{
 Serial.println("bien recu v"); 
 int ValeurVolume = byte(DataSerie[1]);
 usbMIDI.sendControlChange(12, ValeurVolume, 1); //ProgramChange 12, canal MIDI 1
 Serial.println(ValeurVolume );
}
      }//for
      i = 0;
}//while
 
          }//loop



Limitation

Si on envoie d’autre données série en même temps, cela perturbe  le système, les autres données s’intercalant entre la lettre déclencheur ‘v’ et la valeur du volume.
L’idéal serait d’envoyer une seule donnée du style V+ValeurVolume et de découper ensuite en 2 dans la partie récepteur.

 

Catégorie : Teensy/Arduino | Commenter
juin 8

Envoyer une donnée entre Teensy et Xbee

Le pitch étant d’envoyer une phrase, ou une variable, entre 2 Teensy 3.1, relié chacun à un Xbee serie 1.

La connexion

  • 1 = 3.3 Volt –> vers pin 3.3 Volts du Teensy
  • 2 = Digital OUT —> vers pin 0 (RX1) du Teensy
  • 3 = Digital IN —> vers pin 1 (TX1) du Teensy
  • 10 = GND –> vers pin GND du Teensy

xbee-pins teensy31_front_pinout

 

Pour ma part, je n’ai pas eu besoin de programmer quoi que ce soit sur les Xbee.
J’ai un couple Teensy/Xbee sur mon PC fixe et un autre couple sur mon portable.

La programmation

J’ai vu beaucoup d’exemples divers de sketch Arduino ou Teensy, vers comme souvent, les gens n’indique pas la version de leur matos. Donc, j’ai fais ma petite sauce, qui fonctionne sur Teensy 3.1.

Envoie

/* Testé sur Teensy 3.1 */ 
#define HWSERIAL Serial1 // pin 0 et 1
void setup() {
HWSERIAL.begin(9600);
}
void loop() {
HWSERIAL.println("Hello"); //ln pour avoir un retour à la ligne après "hello"
delay(500);
}

Réception

/* Testé sur Teensy 3.1 et Xbee serie 1 */
#define HWSERIAL Serial1

void setup() {
HWSERIAL.begin(9600);
}
 
void loop() {
if (HWSERIAL.available())// si des données sont présentes
{
Serial.print(char(HWSERIAL.read())); // char ) caractère, rien ou int = code ASCII
} 
}//loop

 

Dans la console moniteur serie du récepteur, on récupère le mot ou la phrase envoyé.

OK mais le top c’est que ça serve à quelque chose. On va donc tacher d’envoyer une variable précise qui va déclencher l’allumage de la LED interne du Teensy.

/* Testé sur Teensy 3.1 et Xbee serie 1.
Xbee sur pin 0 et 1 du Teensy */
#define HWSERIAL Serial1
byte InSerie;

void setup() {
HWSERIAL.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
 
void loop() {

if (HWSERIAL.available())
{
byte InSerie = HWSERIAL.read();
Serial.println(InSerie);
if (InSerie == 'A')
{
Serial.print("recu");// pour vérification
digitalWrite(13, HIGH);
}
else
{
digitalWrite(13, LOW);  
}
}
}//loop

Amélioration

La fonction Print est plus dédié à l’affichage dans une console ou un afficheur LCD, lisible pour un humain.

Dans mon cas, je souhaite envoyer des valeurs, parfois sur plusieurs chiffres. dans ce cas, la fonction write et byte est préférable.

Envoie

#define HWSERIAL Serial1

void setup() {
HWSERIAL.begin(9600); 
}

void loop() {
HWSERIAL.write(1);
delay(1000);
HWSERIAL.write(0);
delay(1000);
}//loop

Réception

#define HWSERIAL Serial1
byte InSerie;

void setup() {
HWSERIAL.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
 
void loop() {

if (HWSERIAL.available()>0)
{
InSerie = HWSERIAL.read();
Serial.println(byte(InSerie) );
if (InSerie == 1)
{
digitalWrite(13, HIGH);
}
if (InSerie == 0)
{
digitalWrite(13, LOW); 
}
}
}//loop

La pour le coup, on peut commencer à vraiment commander des trucs entre les 2 teensy.

Notes sur la liaison série

Le protocole série n’envoie par des lettres et/ou des symboles mais des nombres, du code  binaire, hexadécimal… qui sont en correspondance.

Selon ce tableau, faire un Serial.write(‘a’); et Serial.write(97);  (97 en décimal = ‘a’) enverra le même code. On ne peux pas dire au Teensy de faire : si tu reçois ‘a’, fait ça et si tu reçois 97 fait ça; L’action sera la même.

Catégorie : Teensy/Arduino | Commenter