par Anne-Laure DELPECH | 15 Avr 2016 | arduino
Pour créer le NoRobo, j’ai dû me pencher sur la notion d’interruptions (Wikipedia). Il s’agit d’un moyen de faire faire plusieurs choses différentes par un même microprocesseur. C’est un concept essentiel dès que l’on veut faire exécuter des activités et les ajuster selon des données entrées par le biais d’une interface utilisateur (la commande bluetooth d’un robot par exemple) ou par un capteur du système.
Les ondes PWM (MLI en français)
J’ai commencé à m’intéresser aux PWM lorsque j’ai cherché comment contrôler la vitesse d’un moteur à courant continu. Le code dont je m’inspirais utilisait des ondes PWM. J’ai finalement décidé d’utiliser AnalogWrite(x), avec x, de 0 à 255, représentant la vitesse souhaitée.
J’ai découvert à ce moment là que AnalogWrite() envoie aussi des ondes PWM, mais dont la fréquence n’est pas contrôlée. Et par ailleurs, AnalogWrite() n’est pas exécuté si l’arduino fait autre chose. Il est donc fort probable qu’il faille que j’ai recours aux PWM lorsque je vais finaliser le NoRobo (cf la série d’article à ce sujet ici).
Mes sources principales d’information ont été « Secrets of Arduino PWM » et « Changing PWM Frequency on the Arduino« . Ca m’a permis de comprendre les réglages d’horloge que l’on peut faire sur un arduino.
Seules les broches 3,5,6, 9, 10 et 11 de l’arduino uno peuvent être configurées en sorties PWM. Elles sont repérées par un petit symbole ∼.
On notera que la fréquence d’onde PWM à utiliser est fonction des moteurs. Chacun a ses spécificités. On peut seulement dire que la fréquence est comprise entre 1 et 15 kHz.
Les Interruptions (interrupt en anglais)
Elles sont utilisées pour réaliser des activités à une fréquence régulière. Tout le monde connaît delay(), qui permet d’interrompre le sketch arduino pendant un certain temps avant de reprendre. C’est très bien pour des activités simples, mais cette fonction a un énorme problème : elle arrête tout le reste du sketch ! On la réserve donc à des sketch très simples, avec une seule activité.
L’article d’Hobbytronics (en anglais) sur les interruptions Arduino propose un sketch qui permet d’allumer et éteindre une led toutes les secondes, sans utiliser delay(). La led clignote et on peut faire faire ce qu’on veut à l’arduino en même temps. Adafruit y consacre aussi un tutoriel.
Nick Gammon donne des informations sur les interruptions dans les arduino. J’ai également lu attentivement cet article, qui m’a été très utile.
Enfin, la notice du microprocesseur ATMEGA 328 de l’arduino UNO contient plein de détails sur les horloges :
- Chapitre 15. sur les « 8-bit Timer/Counter0 with PWM » en page 93;
- Chapitre 16. sur les « 16-bit Timer/Counter1 with PWM » en page 111;
- Chapitre 17. sur les « Timer/Counter0 and Timer/Counter1 Prescalers » en page 138;
- Chapitre 18. sur les « 8-bit Timer/Counter2 with PWM and Asynchronous Operation » en page 141;
Cas pratique : examen d’un morceau de code
Dans les différentes versions de sketch pour le NoRobo (par exemple celle-ci : NoRobo-Joystick-BT-commander-2016-04-12B.ino), il y a plusieurs éléments liés aux horloges. Dans les lignes ci-dessous, je n’ai laissé que les lignes qui me paraissent liées aux horloges :
uint16_t freqCounter = 0;
uint16_t oldfreqCounter = 0;
uint16_t loop_time = 0; //how fast is the main loop running
int motorG_enable = 11; //pwm
int motorD_enable = 3; //pwm
void setup()
{
Bl_Setup();
}
/****************************************************************************************************
* LOOP
****************************************************************************************************/
void loop()
{
//run main loop every ~4ms
if ((freqCounter & 0x07f) == 0)
{
// record when loop starts
oldfreqCounter = freqCounter;
// every ~1s
if ((freqCounter & 0x7FFF) == 0)
{
// Do something
}
// every ~0.13s
if ((freqCounter & 0xFFF) == 0)
{
// Do something else
}
//calculate loop time
if (freqCounter > oldfreqCounter)
{
if (loop_time < (freqCounter - oldfreqCounter)) loop_time = freqCounter - oldfreqCounter;
}
}
}
void Bl_Setup()
{
cli();//stop interrupts
//timer setup for 31.250KHZ phase correct PWM
TCCR0A = 0;
TCCR0B = 0;
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00);
TCCR0B = _BV(CS00);
TCCR1A = 0;
TCCR1B = 0;
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
TCCR1B = _BV(CS10);
TCCR2A = 0;
TCCR2B = 0;
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(CS20);
// enable Timer 1 interrupt
TIMSK1 = 0;
TIMSK1 |= _BV(TOIE1);
// disable arduino standard timer interrupt
TIMSK0 &= ~_BV(TOIE1);
sei(); // Start Interrupt
//turn off all PWM signals
OCR2A = 0; //11 APIN
OCR2B = 0; //D3
OCR1A = 0; //D9 CPIN
OCR1B = 0; //D10 BPIN
OCR0A = 0; //D6
OCR0B = 0; //D5
// switch off PWM Power
motorPowerOff();
}
//--------------------------------------------------------------
// code loop timing---------------------------------------------
//--------------------------------------------------------------
// minimize interrupt code length
// is called every 31.875us (510 clock cycles) ???????
ISR( TIMER1_OVF_vect )
{
//every 32 count of freqCounter ~1ms
freqCounter++;
if ((freqCounter & 0x01) == 0)
{
// do another thing
}
}
Durant le setup, les horloges sont réglées
cli() arrête les interruptions pour procéder aux réglages.
Les trois horloges sont réglées pour fournir des fréquences de 31.25 KHz « phase correct ».
//timer setup for 31.250KHZ phase correct PWM
TCCR0A = 0;
TCCR0B = 0;
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00);
TCCR0B = _BV(CS00);
TCCR1A = 0;
TCCR1B = 0;
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
TCCR1B = _BV(CS10);
TCCR2A = 0;
TCCR2B = 0;
TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(CS20);
Ici on règle les trois horloges, 0, 1 et 2.
Les horloges 0 et 2 ont des compteurs 8 bits et sont très semblables. L’horloge 0 gère delay() and millis() et tout réglage modifie ces deux fonctions.
L’horloge 1 dispose d’un compteur 16 bits (valeurs de 0 à 65535). La librairie servo.h s’en sert et il vaut mieux ne pas l’utiliser lorsqu’on a des servomoteurs.
Pour configurer une horloge, on doit modifier les registres de réglage correspondants. Ces registres, au nombre de 2 par horloge s’appellent des « Timer/Counter Control Registers ». On les appelle donc TCCRxA et TCCRxB, où x est le numéro de l’horloge. Chaque registre fait 8 bits et stocke une valeur de configuration.
Pour l’horloge 1, les bits les plus importants sont les trois derniers de TCCR1B (CS12, CS11 et CS10). En les modifiant, on peut changer la vitesse d’horloge.
PAr défaut, lorsque CS10, 11 et 12 sont à 0, l’horloge 1 tourne à 16 MHZ. C’est la même vitesse lorsque seul CS10 est à 1. On fera donc un cycle d’horloge toutes les (1/16*10ˆ6) seconde, soit 6.25*10-8 s. Notre compteur passera donc de 0 à 65535 en (65535 * 6.25*10-8s), soit toutes les 0.0041 seconds.
_BV(bit) est une macro qui convertit un numéro de bit en un octet. En écrivant TCCR1B = _BV(CS10); , on dit de régler CS10 à 1, CS11 et CS12 restant à 0. On a donc un « prescaler » fixé à 1, selon le tableau ci-dessous :
| CS12 |
CS11 |
CS10 |
Description |
| 0 |
0 |
0 |
No clock source (Timer/Counter stopped) |
| 0 |
0 |
1 |
clki/o/1 (No prescaling) |
| 0 |
1 |
0 |
clki/o/8 (From Prescaler) |
| 0 |
1 |
1 |
clki/o/64 (From Prescaler) |
| 1 |
0 |
0 |
clki/o/256 (From Prescaler) |
| 1 |
0 |
1 |
clki/o/1024 (From Prescaler) |
| 1 |
1 |
0 |
External clock source on T1 pin. Clock on falling edge |
| 1 |
1 |
1 |
External clock source on T1 pin. Clock on rising edge |
Ce prescaler permet de ralentir le compteur. Si le prescaler est à 1, le compteur fera un overflow tous les 0.004 secondes (4 millisecondes) comme vu précédemment.
Si le prescaler est à 256 par exemple ( TCCR1B = _BV(CS12); ), la vitesse d’horloge passe à 1/(16*10⁶/256), ou 0.000016 secondes (62500 Hz). L’horloge aura un overflow toutes les (65535 *0.000016=) 1.04856 secondes.
Si on ecrivait TCCR1B = _BV(CS10) | _BV(CS12), le prescaler serait 1024. On aurait donc une vitesse d’horloge de 1/(16*10⁶ / 1024), soit 0.000064 seconds (15625 Hz). Maintenant on aura un overflow toutes les (65535 * 6.4*10-5s), or 4.194s
Dans notre cas, on aura un overflow toutes les 4 millisecondes. C’est donc toutes les 4 millisecondes que se déclenchera l’ISR liée au timer 1.
Pour tout savoir sur les réglages du timer 0, voir l’arduino timer cheat sheet.
Enfin, la ligne suivante règle le timer 1 en mode
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
TCCR1A est réglé en Phase-correct PWM.
Les deux moteurs sont connectés aux broches du timer 2
Les broches 11 et 3 correspondent au timer 2. Les 9 et 10 au timer 1 et les 5 et 6 au timer 0.
Une interruption est réalisée grâce au timer 1
// enable Timer 1 interrupt
TIMSK1 = 0;
TIMSK1 |= _BV(TOIE1);
// disable arduino standard timer interrupt
TIMSK0 &= ~_BV(TOIE1);
sei(); // Start Interrupt
TIMSK1 |= _BV(TOIE1); définit que lors de l’overflow, il faut déclencher une interruption. Et comme on a mis à 1 le bit CS10, ce sera le vecteur (TIMER1_OVF_vect) qui sera déclenché à chaque overflow.
Les horloges fonctionnent en incrémentant un compteur. Il compte de 0 à 255 (si le registre fait 8 bits, 0 à 65535 s’il fait 16 bits). Lorsque le compteur atteint sa valeur maximale, il fait un « overflow » et se remet à 0. Lorsqu’un overflow se produit, on peut déclencher une interruption grâce à une routine de service d’interruption (ISR). c’est ce qui se passe dans l’ISR ci-dessous.
Pour voir la liste des interruptions, voir le chapitre « 12.4 Interrupt Vectors in ATmega328 and ATmega328P », en page 65 de la « datasheet » du ATmega328 (de l’arduino Uno).
Une ISR, Interruption Service Routine
//--------------------------------------------------------------
// code loop timing---------------------------------------------
//--------------------------------------------------------------
// minimize interrupt code length
// is called every 31.875us (510 clock cycles) ???????
ISR( TIMER1_OVF_vect )
{
//every 32 count of freqCounter ~1ms
freqCounter++;
if ((freqCounter & 0x01) == 0)
{
// do another thing
}
}
ISR( TIMER1_OVF_vect ) est une « interrupt service routine », qui s’éxécute lorsque TIMER1_OVF_vect se déclenche.
La boucle suit le temps
void loop()
{
//run main loop every ~4ms
if ((freqCounter & 0x07f) == 0)
{
// record when loop starts
oldfreqCounter = freqCounter;
// every ~1s
if ((freqCounter & 0x7FFF) == 0)
{
// Do something
}
// every ~0.13s
if ((freqCounter & 0xFFF) == 0)
{
// Do something else
}
//calculate loop time
if (freqCounter > oldfreqCounter)
{
if (loop_time < (freqCounter - oldfreqCounter)) loop_time = freqCounter - oldfreqCounter;
}
}
}
Les broches 2 et 3 pour des external interrupts…
voir le chapitre 13 « External Interrupts », en page 70 de la « datasheet » du ATmega328 (de l’arduino Uno).
Les broches « INT0 » et « INT1 » (respectivement 2 et 3 sur l’arduino Uno) servent à déclencher des interruptions externes.
Exemple suivant issu de cet article en français de Michael Bouvy.
par exemple sur le pin INT0 (soit D2) nous attachons une interruption, qui appellera la fonction « myInterrupt » lors d’un passage du pin à l’état haut :
attachInterrupt(0, myInterrupt(), RISING);
|
Bien que le pin Arduino soit « D2 », nous indiquons ici « 0 » qui est le n° de pin d’interruption (0 pour INT0 / D2, 1 pour INT1 / D3).
Ensuite, une fonction exécutera ce qui doit être fait lorsque la broche passe à l’état haut :
void myInterrupt() {
}
Noter que dans le programme du balancing robot, les moteurs utilisent les broches 3,5,6,9,10 et 11, donc toutes les broches connectées aux horloges de l’arduino. INT du gyroscope ne peut donc pas être relié à ces horloges…
Communication I2C
Dans la documentation du ATmega328 (de l’arduino Uno), le chapitre 22, en page 206 est intitulé « 2-wire Serial Interface » (TWI). C’est la partie qui correspond à I2C.
C’est la librairie wire.h qui gère le protocole I2C sur l’arduino.
http://www.robot-electronics.co.uk/i2c-tutorial
La ligne writeTo(MPU6050, PWR_MGMT_1, 0); de la fonction angle_setup() dit au gyroscope de se « réveiller » et d’utiliser l’horloge interne à 8MHz. D’après ce que je comprends, c’est l’horloge interne du gyroscope, pas une des horloges de l’arduino.
Mais si INT du gyroscope est connecté à une broche de l’arduino, que se passe-t-il ?
Et maintenant ?
Je suis loin d’avoir tout compris, mais le brouillard s’éclaircit. Je retourne donc à mon NoRobo, avec un article dans la série « un robot arduino ».
par Anne-Laure DELPECH | 13 Avr 2016 | arduino
Dans l’article précédent de cette série, « Un robot arduino« , j’ai vu comment lire les données d’un gyroscope avec un arduino. Aujourd’hui, cinquième article, je place ce gyroscope sur le NoRobo et je prépare le code pour connaitre l’inclinaison du robot vers l’avant ou vers l’arrière. Il a toujours 3 roues et cette fonction est inutile pour l’instant. Mais c’est le préalable pour que le robot tienne « debout » sur deux roues ! (suite…)
par Anne-Laure DELPECH | 10 Avr 2016 | arduino, astuces rapides
Dans le Mooc « Programmer un objet avec Arduino » de l’Institut Mines Télécom, nous sommes invités à utiliser 123d.circuits.io comme simulateur. Malheureusement, il fonctionne très mal : on croit sauvegarder et on se retrouve avec un circuit vide, on n’arrive pas à compiler le code pour simuler, …
Il existe une alternative à 123d.circuits.io, en anglais également, avec possibilité de poster ses réalisations en ligne. C’est fritzing. Mais malheureusement, ce logiciel ne permet pas de faire des simulations… Il est cependant très bien pour dessiner des schémas de montage.
Fritzing, comment ça fonctionne ?
Fritzing doit être téléchargé. Il est disponible pour Windows, Mac ou Linux.
On peut créer des montages et les mettre en ligne sur le site de Fritzing, comme pour 123d.circuits.io. Mais on ne peut pas incorporer les schémas de Fritzing dans un autre site comme on le fait sur 123d.circuits.io.
Pour savoir comment utiliser Fritzing pour dessiner des montages, on pourra consulter les guides ou tutoriels suivants :
Quand utiliser Fritzing ou 123d.circuits.io ?
123d.circuits.io est très bien pour :
- dessiner des circuits avec des composants déjà incorporés dans la bibliothèque de composants (il n’y en a pas beaucoup) ;
- faire des schémas que l’on veut incorporer dans un article de blog : si l’internaute veut des détails, il clique et arrive sur la vue en grande taille, avec tous les détails ;
- Faire des simulations de circuits.
Fritzing est beaucoup mieux lorsqu’on veut utiliser des composants spécifiques, qui n’existent pas, et qu’on ne peut pas créer avec 123d.circuits.io. Mais on est obligé de télécharger un logiciel pour visualiser les réalisations, et on ne peut pas simuler.
Dommage que ces deux propositions ne fusionnent pas !
par Anne-Laure DELPECH | 10 Avr 2016 | arduino
Cet article est le quatrième de la série Un robot arduino. Le NoRobo fonctionne sur 3 roues mais mon objectif reste de le transformer en robot à balancier. Il va donc falloir qu’il utilise un autre capteur, un gyroscope, pour mesurer l’accélération et l’angle en x,y et z.
Je vais procéder en plusieurs étapes :
- comprendre comment fonctionne un gyroscope (un gy-521, équipé d’un mpu6050) seul avec un arduino ;
- comprendre le code lié au gyroscope dans le programme du balancing robot qui me sert d’inspiration ;
- intégrer le gyroscope à mon NoRobo à 3 roues.
Comment fonctionne un gyroscope
Présentation du gyro MPU-6050
Ma source principale d’information est le site arduino, ici, en anglais.
Le gyroscope que j’utilise est un « gy-521 », équipé d’un MPU-6050 (ici pour 2.29 € sur amazon.fr). Le MPU6050 est un circuit contenant deux « MEMS » (microsystème électromécanique – cf wikipedia). Ces deux MEMS ont deux fonctions distinctes :
Les données sont calculées simultanément en x, y et z grâce à des convertisseurs 16-bits analogue à digital pour chaque canal.
Le capteur mesure également la température.
Le capteur communique avec l’arduino avec le protocole I2C.
Il existe aussi un autre circuit, le MPU-9150 qui combine le MPU-6050 avec un compas (un magnétomètre).
Premiers essais

J’ai simplement connecté le gyro à un arduino uno pour voir les valeurs lues.
Le cablage est très simple : VCC — 5V Arduino, GND — GND Arduino, SCI — A5 Arduino et SDA — A4 Arduino.
Le schéma est également ici sur Fritzing.
Le code arduino vient d’ici, je l’ai pris tel quel et il fonctionne correctement puisqu’il affiche des valeurs différentes lorsque je bouge le gyro. Voici un exemple de ce qui s’affiche (j’ai changé la vitesse de la liaison série dans le code pour qu’elle soit 57600 bauds, comme la console série.

Donc le gyro fonctionne. Reste maintenant à comprendre…
comprendre le protocole I2C
Pour une fois, je trouve une source d’information en français ! Il s’agit d’un excellent article expliquant le fonctionnement d’un capteur de température sur arduino et le protocole I2C. On peut le lire et comprendre comment fonctionne le code de lecture de notre prototype gyro-arduino.
Pour l’instant je n’ai qu’un capteur connecté en I2C à l’arduino. Je n’ai donc pas besoin d’ajouter des résistances. Je connecte donc directement A4 de l’arduino à SDA (les données) et A5 à SCL (l’horloge).
Par ailleurs l’adresse par défaut d’un gyro MPU-6050 est 0x68. On peut donc dire à l’arduino où il est puis, dans setup(), lancer la communication sachant qu’on a défini l’adresse du gyro par const int MPU_addr=0x68;
Ici notre Arduino Uno est le « maître » et le gyro est « esclave ». L’Arduino écrira (write) pour envoyer des données au gyro, ou lira (read) pour en recevoir des données. Par exemple :
Wire.write(0); // set to zero (wakes up the MPU-6050)
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
Pour communiquer en suivant le protocole I2C, on a inclus la bibliothèque Arduino Wire, avec #include<Wire.h> .
comprendre la lecture du gyro
C’est assez compliqué car il faut lire dans des registres de 16 bits les valeurs mesurées.
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; définit que les variables mesurées sont des codés sur 16 bits et sont signées (peuvent être négatives). Elles peuvent donc prendre une valeur allant de -32 768 à 32 767, soit de
à
(source wikipedia).
Que signifient les lignes de code suivantes , dans la boucle ?
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
Schématiquement (je ne suis pas sûre de tout comprendre), on doit lire dans un registre les valeurs stockées par le gyro.
On dit au gyro de commencer à fournir les données à partir du registre 0c3B qui contient une partie de l’accélération en x et on lui indique qu’on aura besoin de lire 14 registres en tout avec les lignes Wire.write(0x3B); et Wire.requestFrom(MPU_addr,14,true); .
Ensuite on lit les registres deux par deux car chaque valeur que l’on recherche est codée sur deux registres différents. Par exemple l’accélération en x est codée dans 0x3B (ACCEL_XOUT_H) et 0x3C (ACCEL_XOUT_L).
Pour les lire et les transformer en une seule valeur, on utilise, des « bit-shift », ou déplacements de bits comme expliqué par Edgar Bonet dans arduino.stackexchange ici, en anglais.
Le premier Wire.read() lit le premier registre : 0x3B puisqu’on a dit que c’est là qu’il faut commencer avec la commande Wire.write(0x3B); . Le deuxième lit le suivant (0x3C). L’accélération en x est calculée par la ligne AcX=Wire.read()<<8|Wire.read(); .
Chaque Wire.read() renvoie un entier de 16 bits et le suivant se décale d’un registre. La ligne AcX=Wire.read()<<8|Wire.read(); place aaaaaaaabbbbbbbb dans l’entier de 16 bits AcX par le mécanisme illustré dans cette image :

Le lien avec le programme du balancing robot
Il s’agit maintenant de comprendre le code lié au gyroscope dans le programme du balancing robot qui me sert d’inspiration ;
Dans ce programme, le setup() renvoit à une fonction, angle_setup(), qui réveille le gyro et lui donne quelques instructions.
On ne s’intéresse qu’à l’accélération en x et y et l’angle en z. On ne va donc lire que AcX, AcY et GyZ du programme précédent.
Pour celà, on se positionne d’abord sur le registre 0x3B, on déclare qu’on ne veut lire que 4 registres avec les lignes suivantes :
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU6050, 4, true);
On lit AcX et AcY puis on passe à la lecture de GyZ, dont le premier registre est en 0x47, et on ne lit que les deux registres correspondants :
Wire.write(0x47);
Wire.endTransmission(false);
Wire.requestFrom(MPU6050, 2, true); // request a total of 2 registers
Le code correspondant est visible ici : gyro-gyrobo.ino et sur GitHub ici.
Il fonctionne :

C’est un peu bizarre car je ne touchais pas au gyro, ni au bureau sur lequel il est posé. Je m’attendais donc à lire des valeurs stables…
Positionnement du gyro
Je vais profiter de ce prototype pour comprendre comment positionner le gyro sur le robot lorsque je l’intégrerai.
D’après les changements de valeur observés, voici les axes :

le gyro sera donc placé à l’horizontale, led vers le dessous, avec la flèche X pointant vers l’avant du robot et la flèche Y dans le même axe que les roues.
Et maintenant ?
La troisième étape de ces recherches sur le gyroscope va consister à l’intégrer à mon NoRobo à 3 roues. Ce sera l’objet de l’article suivant de cette série « Un robot arduino« .
par Anne-Laure DELPECH | 4 Avr 2016 | arduino
Cet article est le troisième de la série « Un robot arduino« . Je relate ici comment j’ai fait pour transformer la plateforme du NoRobo en un « robot » comparable à une voiture télécommandée, dirigé par l’action d’un joystick d’une application Android sur un téléphone.
(suite…)
par Anne-Laure DELPECH | 3 Avr 2016 | arduino
Commander un arduino avec l’application Blueterm
J’ai fait mes premiers essais avec cette application car j’avais déjà eu l’occasion de la tester sur un arduino et j’étais certaine qu’elle fonctionnerait ici.
L’application Blueterm (disponible ici pour android) permet d’envoyer des caractères un à un en connexion série bluetooth.
Le sketch complet est disponible ici, sur GitHub. Voici quelques explications sur son fonctionnement.
Utiliser la librairie SoftwareSerial.h
#include <SoftwareSerial.h> demande à l’arduino d’utiliser la librairie SoftwareSerial.h. Cette librairie est très utile car elle permet d’avoir plusieurs liaisons série entre l’arduino et divers appareils.
Ensuite, nous déclarons deux connexions séries distinctes :
Entre le module bluetooth et l’arduino :
SoftwareSerial AlSerial(2, 3); déclare une liaison série qui se fait via les ports 2 (correspondant à un « TX » de l’arduino) et 3 (RX de l’arduino).
AlSerial.begin(57600); déclare que cette liaison se fera à 57 600 bauds. Evidemment, cette vitesse doit être celle à laquelle on a réglé le module bluetooth précédemment.
La variable Btate prend la valeur de ce qui est écrit dans l’application android : int Btate = AlSerial.read() ;
Si cette variable est égale à « a », la led est allumée par la commande digitalWrite(WhiteLed, HIGH);
Entre l’ordinateur et l’arduino, par USB : 
Serial n’est pas déclaré car c’est une liaison par défaut.
Serial.begin(57600); déclare que cette liaison se fera à 57 600 bauds.
Serial.println(« Setup fait. »); imprime sur la console de l’ordinateur le texte « Setup fait. »
Et ça fonctionne !
Sur mon téléphone, si je tape « a », la led s’allume et « r » l’éteint.
C’est pareil dans la console série de l’ordinateur.
Avec l’application JoyStick Bluetooth Commander
Cette application est beaucoup plus sophistiquée puisqu’elle permet d’utiliser jusqu’à 6 boutons et un joystick pour commander notre arduino.
L’application android JoystickBluetooth Commander est disponible ici, sur google Play.
Un sketch arduino d’exemple est récupérable ici. C’est ce sketch que j’ai utilisé comme base pour réaliser mon propre sketch.
Mon sketch est disponible sur GitHub ici. J’ai réglé le bouton 1 pour qu’il allume la led de l’arduino (#13) et le bouton 2 pour qu’il allume la led connectée au port 7 de l’arduino. Les données dans les champs data1 et data2 sont bidon, générées par deux fonctions intégrées au sketch. Data3 contient un message généré lorsqu’on actionne un bouton, par l’intermédiaire de la variable displayStatus .
Voici le résultat sur mon téléphone android. Je viens d’appuyer sur le bouton B2 et le champs « Data3 » indique « White LED <ON> pour m’en informer. Comme B1 et B2 sont appuyés, la led blanche branchée sur le port #7 et la led intégrée à l’arduino sont toutes deux allumées. Tout fonctionne donc parfaitement.

Ca fonctionne aussi bien avec le module hc-05 qu’avec le module hc-06.
Et maintenant
Je vais pouvoir utiliser ce que j’ai appris ici pour commander un robot par mon téléphone android. Ce robot fait l’objet d’une série d’articles, dont le premier est Robot arduino – étape 0.
par Anne-Laure DELPECH | 31 Mar 2016 | arduino
Dans le premier article de cette série, Un robot arduino, je racontais pourquoi je veux faire un robot de base, avec juste des roues, deux moteurs, des piles rechargeables et un arduino. Nous allons maintenant voir comment créer cette base. (suite…)
par Anne-Laure DELPECH | 31 Mar 2016 | arduino
Au FabLab de Quimper, nous avons commencé un robot à balancier. Nous tenons un carnet de bord qui en raconte les péripéties (ici le premier article). Malheureusement le GyRobo ne tient pas encore debout, malgré plusieurs après-midi de travail collectif. Pourtant, tout semblait bien parti puisque nous disposions d’un tutoriel complet. Cette série d’articles (Un robot arduino) raconte mes expériences sur un autre robot, dans le but de mieux comprendre comment les concevoir. (suite…)
par Anne-Laure DELPECH | 13 Mar 2016 | arduino
Pour beaucoup d’applications, il est utile de déconnecter l’arduino de l’ordinateur pour lui donner de la mobilité. Je veux donc pouvoir utiliser des applications android permettant de commander un montage arduino. Dans cette première partie d’une série (Arduino et bluetooth (hc-05 ou hc-06)) sur le bluetooth et arduino, j’explique comment régler les modules HC-O6 ou HC-05 (commandes AT). (suite…)
par Anne-Laure DELPECH | 24 Fév 2016 | fonctionnalités, Plugin (extension) WordPress
Les caractéristiques des fichiers qu’on peut charger dans un site WordPress sont définies par WordPress. On peut souhaiter autoriser le chargement d’autres types de fichier, par exemple des fichiers .dxf pour mettre des plans à disposition des internautes. J’explique ici comment créer une extension autorisant l’ajout de fichiers différents. (suite…)
Commentaires récents