Passionnement
Bonjour et bienvenu,

Bonjour et bienvenu sur le forum. Ici tu verra, la bonne humeur et l'entraide sont de mise.
Pas de reproche ni de prise de tête. Respect et Amitié sont de rigueur.
Pour la convivialité, nous te demandons de prendre 5mn pour te présenter a tout le monde et de renseigner ton profil le plus précisément possible.

Pour cela, ==> clique ici <== et tu créer un nouveaux sujet (une petite explication est en haut de la page).

Si tu ne fait pas de présentation, ton compte sera supprimé automatiquement après 48H.

Sans présentation, tu n'aura pas accès a la totalité du forum (qui comporte plus de 30.000 messages). Quand tu aura fait ta présentation, un modérateur ou administrateur te donnera les droits pour le forum dans sa totalité dans les 24 h.

Le Staff

Bienvenu sur ton Forum 
Invité  
Juillet 2017
LunMarMerJeuVenSamDim
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Calendrier Calendrier

Rechercher
 
 

Résultats par :
 

 


Rechercher Recherche avancée

Derniers sujets
» Magasins préféré des modélistes.
Aujourd'hui à 12:47 par dany-om

» arduino easy plug
Aujourd'hui à 11:17 par dany-om

» Fête nationale
Hier à 20:33 par Cousin Hub

» Arduino et les servomoteur.
Dim 16 Juil 2017 - 11:12 par dany-om

» Les trains autour du monde
Dim 16 Juil 2017 - 11:10 par dany-om

» White Pass & Yukon Route ou le train de l'OR.
Jeu 13 Juil 2017 - 5:57 par likiki

» Grassmaster et flocages pas chers
Mer 12 Juil 2017 - 17:28 par Vince Belgium

» Les microcontrôleurs
Mer 12 Juil 2017 - 17:12 par Cousin Hub

» Nouveaux articles sur Locoduino !
Mar 11 Juil 2017 - 18:53 par Cousin Hub

» Construction d'une BR52 au 1/35
Lun 19 Juin 2017 - 21:46 par dany-om

» Transformation d'un véhicule statique 1/87 en véhicule roulant autonome
Sam 10 Juin 2017 - 19:26 par Filou

» Le grassmaster de Likiki
Jeu 25 Mai 2017 - 8:11 par Filou

» Pourquoi il faut s'arrêter a un passage a niveau.
Ven 19 Mai 2017 - 20:37 par dany-om

» Le nouveau gouvernement
Ven 19 Mai 2017 - 20:34 par lherve54

» Photos du monde.
Jeu 11 Mai 2017 - 22:12 par dany-om

» Car-system de chez Faller
Mer 10 Mai 2017 - 18:58 par dany-om

» Realistic Scenery
Mar 9 Mai 2017 - 18:05 par lherve54

» Circulation routière animée
Lun 1 Mai 2017 - 14:40 par Cousin Hub

» [France] Signalisation et service de la circulation
Sam 29 Avr 2017 - 13:35 par dany-om

» Accident du Tunnel du Crozet.Samedi 20 mars 1971
Sam 29 Avr 2017 - 9:37 par dany-om


** La programmation ** (cours)

Voir le sujet précédent Voir le sujet suivant Aller en bas

** La programmation ** (cours)

Message par Admin le Sam 19 Oct 2013 - 16:04

Elle est simple, et a la porté de tous.

Nous allons essayer ici de vous y emmener.

Wink


Dernière édition par Admin le Dim 22 Déc 2013 - 12:39, édité 1 fois
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Admin le Sam 21 Déc 2013 - 11:51

Bit et byte (ou comment sont stockées les infos)

Un circuit électronique est capable de réagir en fonction de l'absence ou de la présence d'une tension. Absence de tension = 0 V (on marquera cet état par 0) et présence de tension = 5 V (par exemple). On marquera ce dernier état par 1.

Un bit est donc la plus petite information élémentaire qu'on puisse donner à un circuit électronique. Par exemple, appuyez sur le bouton marche/arrêt de votre aspirateur : le moteur reçoit du jus (état 1) et il démarre (l'aspirateur aspire). Appuyez à nouveau sur le bouton marche/arrêt : le moteur ne reçoit plus de jus (état 0) et il s'arrête. A ce niveau, vous êtes déjà capable de passer l'aspirateur et c'est Madame qui va être contente  :mdr2:

Un bit ne peut donc avoir que deux valeurs 0 ou 1 ; c'est un peu juste pour faire des choses compliquées. On a donc inventé le byte (octet en français) qui est la juxtaposition de huit bits (c'est pour cela qu'on l'appelle octet) .  :siffle:

Imaginez huit petites cases que vous pouvez remplir de 0 ou de 1 à votre convenance : combien pourriez-vous faire de possibilités ? Et bien 256 (soit 2 à la puissance 8 ou encore 2 X 2 X 2 X ... 8 fois de suite). Ainsi, si vous mettez des 0 dans toutes les cases, vous aurez un octet égal à 0, et si vous mettez 1 dans toutes les cases votre octet est égal à 255, ce qui fait au total 256 possibilités. Et vous pouvez avoir toutes les possibilités entre 0 et 255.

256 possibilités, c'est déjà mieux que 2. Peut-on faire mieux ? Oui car je peux dire à mon programme qu'il doit examiner deux octets pour déduire un nombre. Dans ce cas, j'ai donc 16 bits et 2 à la puissance 16 possibilités (soit un nombre compris entre 0 et 65535). Et en prenant encore plus d'octets, on peut traiter des nombres encores plus grands, positifs ou négatifs et même des nombres à virgule (qu'on remplace par un point en informatique).

256 possibilités pour un octet, c'est amplement suffisant pour coder les lettres de l'alphabet (qui ne sont que 26) ; oui, on peut même mettre majuscule ou minuscule, et même d'autres caractères comme la virgule, le point, etc. Mais alors un même octet peut être un nombre (par exemple 65) ou bien un caractère (par exemple A) ; oui, et c'est le programme qui fera la différence car il sait (c'est vous qui lui avez appris) que dans telle partie, il traite un nombre, dans telle autre partie, il traite un caractère. Et il ne les traitera pas de la même façon !

Ce qu'il faut retenir : l'information (quelle que soit sa forme) peut être représentée avec un ou plusieurs octets.

Ces octets sont écrits en mémoire du microcontrôleur et sur Arduino, il y a trois types de mémoires : la mémoire programme (là où votre programme est écrit, car un programme, c'est une suite d'informations), la mémoire RAM (mais la mémoire s'efface dès qu'Arduino n'est plus alimenté) et la mémoire EEPROM (l'information persiste même après coupure de l'alimentation).

On verra dans un prochain micro-cours les différents types de variables (on en a déjà évoqué quelques uns dans ce post), car si vous ne choisissez pas le bon type, cela risque de produire des choses étranges...  :diable:

Christian (Arduino sur le forum LR press ==> Page d'origine ).
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Admin le Sam 21 Déc 2013 - 11:55

Les types de variables

Dans le précédent cours, nous avons vu que l'information est stockée sous forme d'octets. Or, la mémoire vive pour stocker des données est limitée ; dans la plupart des programmes simples, cette limite ne sera jamais atteinte. Mais dans des programmes plus complexes, on peut arriver à ne plus avoir assez d'espace mémoire, ce qui peut faire planter votre programme ! (il existe des techniques pour récupérer de l'espace mémoire, mais c'est un peu compliqué et pas le sujet aujourd'hui).

Il est donc important de bien choisir le bon type de variables pour ne pas gaspiller de l'espace mémoire et pour ne pas avoir de choses bizarres lors des calculs (telles qu'évoqué plus haut par d'autres, dans ce forum).

Pour suivre ce que je vais vous dire, consultez la page Reference du site officiel Arduino car pour ma part, je vais simplifier. Voici différents types de variables qu'il faut bien connaitre :

byte : le programme réserve un octet en mémoire pour stocker la variable ; celle-ci doit donc être comprise entre 0 et 255 (voir précédent cours)

int : le programme réserve 2 octets cette fois, soit 16 bits (4 octets soit 32 bits pour une carte Due, mais ne compliquons pas et supposons qu'on travaille avec Uno ou bien Mega2560). Le bit le plus fort (le plus à gauche si vous visualisez) est le bit de signe, le reste est la valeur. Je passe sur la technique du complément à deux, elle ne vous apprendra rien dans un premier temps sauf de vous embrouiller l'esprit. La valeur est donc comprise entre -32768 et +32767.

unsigned int : le programme réserve toujours 2 octets (4 sur Due) mais cette fois, la variable n'est pas signée, donc positive et comprise entre 0 et 65535.

Comme ce n'est parfois pas suffisant pour les grands nombres, on a également :

long : le programme réserve 4 octets en mémoire pour stocker un nombre signé (positif ou négatif) compris entre -2 147 483 648 et +2 147 483 647.

unsigned long : vous l'avez deviné, même chose que long (4 octets) mais la valeur est positive et comprise entre 0 et 4 294 967 295.

On a également word identique à unsigned int et short identique à int (ne me demandez pas pourquoi il y a les deux, je suis incapable de répondre ...)

Tout cela n'est encore pas suffisant car on n'a que des nombres entiers naturels, or dans la vraie vie, les nombres sont réels, c'est à dire avec une virgule et des décimales (le fameux PI = 3,141592.........  Smile ) Pour cela, on a inventé (pas moi !) :

float : le programme réserve 4 octets pour stocker un nombre réel avec une précision de 6 à 7 décimales après la virgule qui est remplacée d'ailleurs par un point. La valeur peut donc être comprise entre -3.40... 10^38 et +3.40... 10^38. Le symbole ^ veut dire puissance.

Attention : les calculs avec float ne sont pas forcément exacts (6.0 / 3.0 peut ne pas donner 2.0, mais peut être 1.9999999) et de plus, calculer avec float cela prend du temps.

double : identique à float mais cette fois avec 4 octets ; je doute que vous l'utilisiez très souvent  Laughing

Voilà, on a fait le tour des données numériques, mais il y a aussi d'autres types de variables :

char : le programme réserve 1 octet en mémoire pour stocker un caractère alphanumérique. Voir la table ASCII sur le site Arduino ; par exemple, le caractère A est un octet égal à 65.

boolean : uniquement deux valeurs TRUE ou bien FALSE, ce qui prend un simple petit octet. On verra par la suite à quoi cela peut servir (les fameux tests).

array : ce sont des tableaux, c'est-à-dire une suite de données ayant la même propriété (le même type, le même profil). On accède à ces données par un index qui commence toujours par zéro. On verra par la suite l'utilité des tableaux.

Voyons un exemple pour terminer ; si vous voulez déclarer la broche sur laquelle vous branchez une diode LED, vous pouvez utiliser int ou même unsigned int (vous le verrez dans de nombreux programmes), mais vous utilisez deux octets alors qu'un seul suffirait en utilisant byte ! Voilà, c'est comme cela qu'on peut économiser la place en mémoire vive !

C'est tout pour aujourd'hui  Laughing

Christian (Arduino sur le forum LR press ==> Page d'origine ).
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Admin le Sam 21 Déc 2013 - 11:58

Systèmes de numération

Il n'est pas nécessaire de maîtriser ces notions pour commencer à programmer Arduino ; ceci dit, ce n'est pas si compliqué que cela puisque ma sœur, qui a été institutrice, l'a enseigné à des gamins de primaire. Ces notions vous seront utiles pour comprendre des programmes trouvés sur le net ou dans des livres.

On a vu précédemment que les octets constituent des nombres ; voici comment passer de l'un à l'autre, l'exemple étant limité (pour l'instant) à des octets non signés (allant de 0 à 255, voir précédents cours). geek

Système décimal :
On compte tous en décimal, ce qui signifie qu'il y a dix chiffres (0 à 9) pour constituer un nombre. Prenons le nombre 137 par exemple. Si on le décompose, on a 1 centaine (10^2), 3 dizaines (10^1) plus 7 unités (10^0). Le symbole ^ signifie puissance et on rappelle ici que 10^1 = 10 et 10^0 = 1.
Donc, quand on regarde les chiffres qui composent un nombre décimal, de la droite vers la gauche, on a :
le nombre d'unités (nombre de fois 10 puissance 0)
le nombre de dizaines (nombre de fois 10 puissance 1)
le nombre de centaines (nombre de fois 10 puissance 2)
etc.
Jusque là, vous le saviez déjà ... :wink:

Système binaire :
Là, il n'y a que deux chiffres possibles, 0 et 1
Un octet est une combinaison des différentes possibilités avec 8 cases comprenant chacune 0 ou 1.
Par exemple l'octet 11100101 ; c'est un nombre (binaire) composé de chiffres égaux à 0 ou 1.
Si on le regarde de la droite vers la gauche, le nombre se décompose en :
1 fois 2 puissance 0 (tout nombre à la puissance 0 vaut 1)
0 fois 2 puissance 1 (soit 0 X 2 = 0)
1 fois 2 puissance 2 (soit 4)
0 fois 2 puissance 3 (soit 0 X 8 = 0)
0 fois 2 puissance 4 (soit 0 X 16 = 0)
1 fois 2 puissance 5 (soit 1 X 32 = 32)
1 fois 2 puissance 6 (soit 1 X 64 = 64)
1 fois 2 puissance 7 (soit 1 X 128 = 128)
En faisant la somme, notre octet vaut :
1 + 0 + 4 + 0 + 0 + 32 + 64 + 128 = 229 (en décimal)
11100101 en binaire vaut 229 en décimal. Retenez le bien ... Rolling Eyes

Système hexadécimal :
Ce système compte avec 16 chiffres, de 0 à 9, puis A, B, C, D, E et F, ce qui fait bien 16 symboles.
Par exemple A en hexadécimal vaut 10 en décimal, B vaut 11, etc.
Prenons le nombre 3FF en hexadécimal. Si on le décompose, on a 3 fois 16², F (c'est-à-dire 15) fois 16 et F (c'est-à-dire 15) unités, soit une somme de 1023.

Le passage du binaire en décimal est très simple. Reprenons notre octet 11100101 et décomposons le en deux fois quatre bits ; nous obtenons 1110 et 0101.
1110 vaut 14 soit E en hexadécimal (on l'a fait plus haut)
0101 vaut 5
En hexadécimal, cet octet vaut E5
Ou encore (E étant égal à 14) : 14 X 16 + 5 = 224 + 5 = 229 (en décimal). Tiens, on retrouve la même chose ! Laughing

Pour un humain, avec un peu d'habitude, on passe très vite de quatre bits au chiffre hexadécimal de 0 à F, et E5 est plus digeste que 11100101 !!! 8)

Beaucoup de calculatrices font la transformation hexadécimal en décimal ou binaire et réciproquement (notamment la calculatrice de Windows (ou Mac ou Linux, pour ne vexer personne) en affichage programmeur !). Vous pouvez essayer par vous même et vous verrez notre nombre (229) affiché en binaire et en hexadécimal. :wink:

Dans un prochain cours, nous verrons comment Arduino fait des calculs.

Christian (Arduino sur le forum LR press ==> Page d'origine ).
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Admin le Sam 21 Déc 2013 - 12:03

Arduino et les calculs

Nous allons voir comment Arduino effectue des calculs. Comme vous le verrez, il peut y avoir quelques pièges et les connaître vous évitera de tomber dedans.

Addition, soustraction, multiplication et division (+, - , * , / ).
Vous connaissez tous ces quatre opérations de base. Arduino sait additionner, soustraire, multiplier et diviser. Le piège vient du type des variables (voir mon cours en page 1 de ce forum). Voici quelques exemples :

9 divisé par 4 donne 2 au lieu de 2,25. En effet, 9 et 4 sont deux entiers, Pour Arduino, le résultat doit donc être un entier, si on ne lui a donné aucune autre directive.

On peut aussi arriver à ce qu'on appelle un débordement (overflow en anglais) si le résultat de l'opération est plus large que ce que peut contenir la donnée. Si on ajoute 1 à un entier signé (int) égal à 32767, on n'obtient pas 32768 mais -32767, tout simplement parce que 32768 ne peut pas tenir dans un entier signé. Par contre, cela aurait donné le bon résultat avec un entier non signé (qui peut être compris entre 0 et 65535).

Pour éviter cela, il faut qu'au moins un des nombres de notre opération soit du type float ou double, car dans ce cas, Arduino considérera que le résultat doit aussi être de ce type.
Ainsi, 60 * 1000 donne un résultat négatif, mais 60.0 * 1000 = 60000.0.

Quand on fait un calcul, il faut choisir un type de variable dont la taille soit assez grande pour contenir le résultat.

Signe égal ( = )
En algèbre, on ne peut pas écrire x = x + 1 ; cela n'aurait aucun sens.

En informatique, c'est possible et c'est parfois ce qui trouble le programmeur débutant (vraiment débutant car ceux qui ont fait un peu de basic ont déjà compris Laughing ).

En fait, quand on écrit x = x + 1, cela signifie qu'on prend la valeur de x, qu'on lui rajoute 1 et que le résultat devient la nouvelle valeur de x.

Le signe = permet de stocker la valeur qui se trouve à droite du signe, dans la variable qui se trouve à gauche du signe.

X = 16 ; // signifie que X prend la valeur 16
X = X + 1 ; // X est maintenant égal à 17
(J'ai même respecté la syntaxe avec le point-virgule, et le double slash pour les commentaires :wink: !)

L'opérateur modulo ( % )
Cet opérateur donne le reste de la division euclidienne qu'on a appris à l'école primaire, et qui concerne des nombres entiers.

Par exemple, si je divise 9 par 2, j'obtiens 4 et il reste 1.
X = 9 % 2 ; // X est égal à 1

Comme on l'a dit, la division euclidienne concerne les nombres entiers, donc modulo ne fonctionne pas avec des nombres de type float.

Autres opérations mathématiques.

Carré (en anglais square) et racine carrée (en anglais square root)
sq (x) calcule le carré du nombre x (soit x² ou encore x fois x)
sqrt (y) calcule la racine carrée de y (c'est l'opération inverse du carré) (y peut être de n'importe quel type, sqrt (y) sera de type double)

Arduino est aussi capable d'élever à la puissance, de traiter des fonctions trigonométriques (sinus, cosinus et tangente) et de générer des nombres aléatoires (en fin pas complètement aléatoires, mais presque ; on les appelle nombres pseudo-aléatoires Rolling Eyes ).

Pour plus de détails sur toutes ces opérations de calculs, on se réferrera à la page Reference du site officiel Arduino. :wink:

http://arduino.cc/en/Reference/HomePage

Avant de terminer ce cours, voyons deux autres fonctions qui peuvent avoir de l'intérêt dans notre hobby, la fonction valeur absolue et la fonction map.

Valeur absolue
abs (x) donne la valeur absolue de x, c'est à dire x si x est plus grand que zéro (positif) et -x si x est plus petit que zéro (négatif).
abs (2) = 2
abs (-2) = 2
La valeur absolue d'un nombre est ce nombre sans considérer le signe (oh, que les mathématiciens doivent me haïr :colere: !). Prenez la définition que vous voulez, ce qui compte, c'est que ça vous parle :ange: .

Fonction map
Cette fonction sert à ramener une valeur évoluant dans un intervalle, dans un autre intervalle. Par exemple, pour ramener la mesure d'une entrée analogique (pouvant être comprise entre 0 et 1023) dans un intervalle 0-255 (dans le but ensuite de générer un signal PWM par exemple) :

void loop()
{
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}

Cette fonction génère des entiers et non des fractions. En général, la fonction map sera intéressante lorsque vous utiliserez des entrées analogiques.

Maintenant, vous êtes capables de comprendre pourquoi certains de vos calculs réalisés avec Arduino ne donnent pas le bon résultat. Amusez-vous bien Laughing .

Christian ( Arduino sur le forum LR press ==> Page d'origine).
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Admin le Sam 21 Déc 2013 - 12:09

Arduino – Les fonctions setup et loop

Comme vous le savez, un programme pour Arduino doit contenir au moins ces deux fonctions. Comme elles ne retournent aucun résultat, ces fonctions sont du type void (vide en anglais). Un programme minimum pour Arduino se présente comme le montre la photo 4 page 75 du LR796 de novembre 2013 (vous pouvez vous référer aussi à cet article pour avoir déjà les notions de base).

Les instructions contenues dans la fonction setup ne sont exécutées qu'une seule fois.

Les instructions contenues dans la fonction loop sont répétées indéfiniment, c'est-à-dire en boucle sans fin (d'où le nom de la fonction puisque loop signifie boucle en anglais).

En général, on utilise la fonction setup pour faire toutes les initialisations nécessaires (d'où son nom setup) et on utilise la fonction loop pour réaliser les actions induites par le programme ; on peut dire que la fonction loop constitue le corps du programme.

En dehors de cette particularité, il convient de bien comprendre que ces deux fonctions sont des fonctions comme les autres ; on peut donc y mettre, comme instructions, tout ce qui constitue le langage Arduino.

Par exemple, l'initialisation des lignes d'entrées-sorties, à l'intérieur de la fonction setup, peut se faire avec une boucle for, ce qui évite d'avoir à écrire plusieurs fois le même type de lignes de code (surtout avec un Arduino Mega2560 qui a 54 lignes d'E/S numériques :wink: ).

De même, on peut utiliser le fait que la fonction setup n'est exécutée qu'une seule fois pour faire réaliser à Arduino un programme, une fois et une seule.

Voyez par exemple le programme Melody donné en exemple pour la fonction tone :

http://arduino.cc/en/Tutorial/Tone

Le montage à réaliser est des plus simple (un petit haut parleur récupéré dans un jouet et une résistance) et il vous amusera. Comme vous le voyez, le corps du programme est dans la fonction setup et la fonction loop est vide (hormis un commentaire). La mélodie n'est jouée qu'une seule fois, ce qui est bien suffisant vu que ce n'est pas du Mozart !

Vous pouvez aussi créer vos propres fonctions, qui seront appelées par le programme principal ; nous en reparlerons plus tard, à chaque jour suffit sa peine. Rolling Eyes

Christian (Arduino sur le forum LR press ==> Page d'origine).
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Admin le Sam 21 Déc 2013 - 12:19

Arduino et le temps

Cette année, les vitrines de Noël des Galeries Lafayette à Paris ont pour thème « Le temporel » : sabliers, horloges, pendules, coucous suisses, mouvements d'horlogerie, nous rappellent, dans une ambiance enfantine, notre rapport au temps qui passe  Crying or Very sad . Rien à voir en tout cas avec ce que décrit un certain conte, sur un certain forum …  Laughing

Nous y voyons là une excellente occasion pour faire le point sur la façon d'appréhender le temps par Arduino.

Dans un programme informatique, il est souvent nécessaire de faire une pause, c'est-à-dire de ralentir le cours du temps pour pouvoir observer ce qui se passe. Si on regarde la page Reference du site Arduino, nous pouvons voir que quatre fonctions existent dans le langage Arduino pour traiter le temps.

delay() : cette fonction met en pause le programme pour un certain délai exprimé en millisecondes. De même qu'il y a 1000 millimètres dans un mètre, il y a mille millisecondes dans une seconde. Donc si on veut faire une pause de 1 seconde, la fonction est delay(1000). C'est tout simple, et si vous avez déjà utilisé le programme blink (donné en exemple avec le logiciel Arduino), vous êtes habitués à cette fonction.  :gne:

L'argument passé entre parenthèse (le délai en ms), est une variable de type unsigned long (voir précédents cours).

delayMicroseconds() : cette fonction est identique à la précédente, sauf que le délai est exprimé en microsecondes. Il y a 1 000 000 de microsecondes dans une seconde et il y a mille microsecondes dans une millisecondes.

L'argument passé entre parenthèse (le délai en µs), est une variable de type unsigned int (voir précédents cours). Pour avoir une bonne précision, cet argument doit être compris entre 3 et 16383 ; au-delà de 16383, il vaut mieux utiliser delay() en millisecondes.

L'inconvénient de ces deux fonctions est qu'on ne peut rien faire d'autre en attendant. Les deux fonctions suivantes vont nous permettre de résoudre ce problème.  :wink:

millis() : cette fonction retourne le nombre de millisecondes écoulées depuis le début du programme.

La valeur retournée est du type unsigned long ; pour traiter ce résultat, il faut donc utiliser le même type de variable. Cette valeur recommence à zéro au bout de 50 jours approximativement.

La fonction millis() peut donc servir à traiter des attentes sans pour autant bloquer le déroulé du programme. On peut en avoir un exemple avec le programme blink without delay donné en exemple dans le logiciel Arduino.

micros() : comme la fonction précédente, cette fonction retourne le nombre de microsecondes écoulées depuis le début du programme. La variable de type unsigned long, retourne à zéro après approximativement 70 minutes. La résolution de cette fonction est de 4 µs sur une carte cadencée à 16 MHz (Uno, Mega2560, Nano) et 8 µs sur une carte cadencée à 8 MHz.

Vous obtiendrez d'autres précisions à partir de la page Reference du site Arduino. Je vous invite également à regarder les programmes donnés en exemples (notamment blink et blink without delay) dans votre environnement de développement intégré Arduino. Consultez également « Gérer le temps » écrit par jlb un peu plus haut dans ce forum.  geek

Voilà, vous savez tout, mais n'y passez pas trop de temps !  

Christian (Arduino sur le forum LR press ==> Page d'origine).


Dernière édition par Admin le Dim 9 Fév 2014 - 10:16, édité 1 fois
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Admin le Dim 9 Fév 2014 - 10:15

Les interruptions externes avec Arduino

Qu'est-ce qu'une interruption ?

C'est ce qui arrive dans la vie de tous les jours. Imaginez que vous soyez au téléphone et que l'on sonne à votre porte. Vous demandez à votre interlocuteur de patienter, vous posez votre téléphone puis vous allez ouvrir. C'est le facteur qui vous apporte un colis. Une fois celui-ci réceptionné et la porte refermée, vous retournez prendre votre téléphone pour continuer votre conversation. L'interruption (sonnerie) vous a fait vous détourner de votre programme principal (conversation téléphonique) pour aller réaliser un sous-programme (ouvrir la porte) puis vous avez repris votre programme principal là où vous l'aviez laissé (si vous n'avez pas perdu le fil de votre conversation  Laughing  !)  .

Pourquoi interruption externe ?

Le micro-contrôleur peut gérer un événement extérieur comme quelque chose de prioritaire et pour cela exécuter un sous-programme. On parle d'interruption externe car c'est un événement extérieur au microcontrôleur qui crée l'interruption (par exemple l'appui d'un poussoir). Le microcontrôleur est informé de cet événement (car le poussoir est connecté à une de ses broches) ; il va immédiatement arrêter son programme principal pour aller exécuter un sous-programme de gestion de l'événement, et lorsque ce sous-programme est entièrement exécuté, le microcontrôleur reprend l'exécution du programme principal, là où il s'était arrêté.

Quel est l'intérêt ?

Entre chaque interruption, le microcontrôleur peut faire autre chose, sans être obligé de surveiller les événements extérieurs. Prenons l'exemple de notre poussoir : le programme principal peut surveiller périodiquement le poussoir, tout en faisant autre chose entre chaque surveillance. Mais si le poussoir est appuyé (très brièvement) entre deux surveillances, le risque est grand de louper l'événement, malgré le fait que les microcontrôleurs travaillent très rapidement  Rolling Eyes . Avec une interruption, l'appui sur le poussoir « prévient » le microcontrôleur qu'il doit immédiatement réaliser la tâche que vous avez définie pour l'appui du poussoir.   

Concrètement avec Arduino Uno ?

Arduino Uno est conçu autour du microcontrôleur ATMega328, capable de gérer beaucoup d'interruptions internes ou externes (une interruption interne vient du microcontrôleur lui-même, mais ce n'est pas le sujet de ce post). Le langage Arduino (compilateur qui transforme notre programme en code machine) n'en fait pas autant  Sad , mais a prévu toutefois de gérer deux interruptions externes (c'est mieux que rien !   ). L'événement extérieur doit provoquer un changement d'état (changement de tension) sur les broches numériques 2 ou 3. Par exemple, un poussoir monté sur la broche 2 ou la broche 3, selon le schéma de la figure 4 de l'article paru dans LR798, peut provoquer un changement d'état sur la broche (passage de 0 à 5 V, ou l'inverse). La broche 2 (ou la broche 3) est donc une entrée et doit être déclarée comme tel par pinMode (2, INPUT). Mais cela ne suffit pas  Twisted Evil; il faut également faire savoir au microcontrôleur, que la broche est utilisée pour créer une interruption, quel sous-programme réaliser alors, et quel type de signal doit créer l'interruption (car on a le choix, comme nous allons le voir     ).

Quatre fonctions pour nos interruptions externes

attachInterrupt (entrée, ISR, mode)
entrée = 0 si vous utilisez la broche 2 et 1 si vous utilisez la broche 3
ISR (Interrupt Service Routine) est le nom de la fonction à exécuter lorsqu'il y a interruption
mode détermine le type de changement sur la broche, devant déclencher l'interruption, et est égal à :
LOW si le niveau logique bas (0 V) doit déclencher l'interruption
CHANGE pour n'importe quel changement de niveau logique (0 à 5 V ou 5 V à 0)
RISING passage du niveau bas (0 V) à haut (5 V) encore appelé front montant
FALLING passage du niveau haut (5 V) à bas (0 V) encore appelé front descendant

Le contraire de cette fonction est detachInterrupt(entrée) qui permet d'arrêter la génération d'interruption sur une entrée préalablement affectée par attachInterupt (entrée vaut 0 ou 1 selon que la broche utilisée est 2 ou 3).

Parfois, il est nécessaire qu'une portion de code ne soit pas interrompue (code sensible au temps écoulé par exemple), dans ce cas, on utilise juste avant noInterrupts() (il n'y a rien dans la parenthèse). Pour ensuite permettre à nouveau les interruptions (une fois le code sensible exécuté), on utilise interrupts().

Dans le cas d'Arduino, les interruptions sont autorisées par défaut car utilisées dans des fonctions comme delay, millis ou bien Serial ; il faut donc être extrêmement prudent lorsqu'on interdit les interruptions !  :diable:

Le sous-programme d'interruption (ISR)

Ce sous-programme se présente comme une fonction ; il ne faut donc pas oublier le return à la fin   Evil or Very Mad   ! Cette fonction ne peut recevoir aucun paramètre et ne retourne aucun résultat. Si cette fonction modifie des variables du programme principal, ces variables doivent être déclarées comme « volatile » ; cela indique au compilateur de charger ces variables en mémoire RAM et non dans des registres du microcontrôleur afin qu'elles ne soient pas écrasées accidentellement  Twisted Evil  . A l'intérieur de la fonction ISR, delay ne fonctionne pas et millis n'est plus incrémentée. De plus, des données éventuellement reçues par Serial peuvent être perdues   Evil or Very Mad  .

On voit donc qu'il faut prendre beaucoup de précautions quand on veut utiliser les interruptions. Voici quelques conseils concernant l'ISR, prodigués par Nick Gammon sur son site référencé sur le site officiel d'Arduino (c'est dire qu'ils sont de bons conseils    Rolling Eyes ).
1 - l'ISR doit être courte
2 - ne pas utiliser delay
3 - ne pas faire de Serial prints
4 - déclarer comme volatile toutes variables partagées avec le programme principal
5 - ne pas tenter d'interdire les interruptions
Vous pouvez retrouver tous les conseils de Nick Gammon à cette adresse :
http://gammon.com.au/interrupts  
(il y a beaucoup de choses et c'est plutôt pour des Arduineurs confirmés     )

Lorsqu'une interruption est en cours de traitement, les autres interruptions sont ignorées jusqu'à la fin du traitement de l'interruption en cours ; c'est pourquoi delay et millis (qui utilisent des interruptions) ne fonctionnent plus pendant une interruption en cours, par contre delayMicroseconds fonctionne comme prévu car n'ayant pas recours à un processus d'interruption       .

Malgré toutes ces précautions à prendre, les interruptions offrent beaucoup de possibilités et il serait dommage de préférer s'en passer. Maintenant, c'est à vous de jouer, et si votre programme ne se comporte pas tout à fait comme vous l'espérez, sachez qu'il y a moyen de résoudre cela, surtout si vous avez bien respecté les 5 principes listés plus haut     .

Arduino Mega2560 et Leonardo

Ces modules Arduino possèdent respectivement 6 et 4 broches permettant des interruptions externes. En consultant le site Arduino – Reference – attachInterrupt, vous trouverez la description des broches et leur déclaration dans la fonction attachInterrupt. Le reste est quasiment identique à l'Uno. Enfin, cette fonction est un peu différente pour les modules Due ; l'interruption peut être attachée à toutes broches disponibles, et il existe le mode HIGH (tout comme LOW) en plus (même si le mode HIGH peut parfois fonctionner sur un Uno Rev 3   Wink  ).

Vers la page Original
avatar
Admin
Administrateur
Administrateur

Humeur : Joyeuse
Messages : 79

http://passionnement.forumactif.org

Revenir en haut Aller en bas

Re: ** La programmation ** (cours)

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum