FLORAISON

Initiation à la programmation

04--Alimentation 02--Courant, tension et loi d'Ohm 03--Les principaux composants 01--Fonctionnement électricité

Ce cours (que dis-je, ce pavé) sera jusqu'à présent le plus technique, mais rassurez vous : ce n'est pas grave si vous ne comprenez pas tout, je vais essayer d'expliquer au mieux, la programmation est un domaine qui prend du temps à apprendre, comprendre et maitriser, donc allez y tranquille, les cours seront toujours en libre accès, vous pourrez y revenir quand vous voulez. Bonne lecture ;)

Note : Ici, on ne va pas trop rentrer dans les détails, on va essayer de comprendre la base de la manière la plus digeste possible. Dans un second temps, vous avez sûrement remarqué un petit lierre à coté du principal, celui-ci est dédié à l'approfondissement de cette feuille, on passera plus de temps sur chacune des notions que nous allons voir.

Pour les plus téméraires : la feuille "XX.5--Programmation" est un quizz pour tester vos connaissances [Lien (feuille pas encore créée)], j'ai aussi fait une feuille "XX.6--Exos-Programmation" pour vous exercer, repérer les erreurs de code... [Lien (pareil pas créée encore)]

C'est quoi le code ?

Très bonne question. Pourquoi on ne peut pas parler à une machine comme vous lisez un texte en langage "humain", comme ces feuilles ?

Imaginez que j'ai un robot super obéissant, il ne parle pas, mais il ne comprend qu'une seule chose : allumé ou éteint. Comme un interrupteur de lumière. C'est tout ce qu'il sait faire. Oui/Non, 0/1, courant qui passe ou courant qui passe pas.

Nous, les humains, quand on parle, on utilise des mots, et ces mots ont plein de sens différents, si je demande à mon robot "Va me chercher un verre", il va se demander :

  • Un verre de quelle taille ?
  • Je le rapporte où ?
  • Je marche comment ?
  • C'est quoi "chercher" exactement ? (C'est un peu un over-thinker)

Nous on sais, on devine tout ça grâce au contexte, à l'habitude, au bon sens. Mais une machine n'a aucun bon sens. Elle ne devine rien du tout. Si je ne lui dis pas exactement quoi faire, dans le bon ordre, mon robot est complètement perdu.

Le code, c'est comme une recette de cuisine ultra précise, écrite pour quelqu'un qui ne sait absolument rien deviner :

  1. Prends 200g de farine
  2. Ajoute 2 œufs
  3. Mélanges pendant 30 secondes On ne lui dit pas "Prends un peu de farine", ni "Mélange un moment", tout est exact.

Le code, c'est un langage qu'on a inventé exprès pour parler à la machine avec des instructions super claires, toujours dans le même ordre, sans place pour le doute. Et à la fin, tout ce code est traduit en plein de petits "allumé / éteint" (des 0 et des 1, le fameux "binaire" [définition binaire au clic]) que le processeur peut comprendre avec ses circuits électriques.

Résumé : On utilise du code parce que les machines ne comprennent que l'électricité (allumé/éteint), alors que le langage humain est plein de sens cachés que seule une machine ne peut pas deviner. Le code, c'est le pont qui traduit nos idées floues en instructions parfaitement précises.

Le C++, version Arduino

Chaque code a son langage, ses force et ses fonctions privilégiées. Ici le langage Arduino s'appuie sur le C++, avec des fonctions simplifiées ajoutées pour nous faciliter la vie, vous en avez peut être déjà entendu parler, il n'est pas dédié uniquement à l'Arduino, on le trouve dans de nombreux logiciels. A partir de maintenant on appellera "le code Arduino" -> C++, ça fait plus pro :) [meme image de pro]

BREAKDOWN du TP "Faire clignoter une LED"

Nous allons maintenant décortiquer le code qui nous a permis de faire clignoter notre merveilleuse LED, en expliquant chaque ligne, chaque concept Je ne rentrerai volontairement pas dans les détails, pour la simple et bonne raison que j'ai dédié un lierre entier (Ressources -> Electronique -> Petit lierre) pour expliquer chaque notions de manière plus complète.

On rafraîchit la mémoire : [Screen ou markdown AVEC COULEUR là c'est horrible]

1     // Clignotement d'une LED 
2	     
3     // La LED est reliee sur la broche 2 de l'Arduino Uno (c'est ici le 
4     point d'attention n°2 dont je parlais, si vous avez changé de pin, 
5     changez son numéro ici) 
6     #define BROCHE_LED_ROUGE 2 
7     
8     void setup() { 
9	     // Declare la broche sur laquelle la LED est 
10	     // reliee comme une sortie de l'Arduino Uno 
11	     pinMode(BROCHE_LED_ROUGE, OUTPUT); 
12	   } 
13	 
14	   void loop() { 
15		 // Passer le sortie de l'Arduino à l'état HAUT pour allumer la LED
16		 digitalWrite(BROCHE_LED_ROUGE, HIGH); 
17		 
18		 // Attendre 1 seconde, pendant ce temps le processeur ne fait rien 
19		 // et la LED reste donc allumee 
20		 delay(1000); 
21		 
22		 // Passer le sortie de l'Arduino à l'état BAS pour eteindre la LED
23		 digitalWrite(BROCHE_LED_ROUGE, LOW); 
24		 
25		 // Attendre 1 seconde, pendant ce temps le processeur ne fait rien 
26		 // et la LED reste donc éteinte 
27		 delay(1000); 
28	   }
Les Commentaires

On voit beaucoup de lignes commençant par "//", ça, c'est pour l'humain, la machine ne lit pas ça, c'est ce qu'on appelle un commentaire, ça nous permet d'expliquer, de noter ce qu'on veut/trouve pertinent, sans impacter le code en lui même.

  • Pour un code de plusieurs centaines/milliers de lignes, les commentaires sont hyper utiles, si on cherche un truc en particulier à modifier, si on rouvre le fichier après ne pas y avoir touché pendant quelques temps.

      // Voici un commentaire, la machine ne me lit pas, je peux écrire n'importe
      quoi.    
    
Les Fonctions

En ligne 8 et 14, on voit deux lignes étranges :

8	void setup () {
		...
		...
		...
	}    
	
14	void loop () {
		...
		...
		...
	}    

Ces deux lignes déclarent des fonctions : des blocs qui regroupent des instructions. Pour l'instant, ne vous laissez pas intimider par le void et les parenthèses () qui les entourent. Ce sont des mots de formule obligatoires en C++, on décortiquera leur rôle exact dans la feuille dédiée aux fonctions. Ce qui compte ici, c'est le nom au milieu : setup et loop. C'est lui qui dit quand le bloc s'exécute.

1. Setup : Toutes les lignes à l'intérieur de cette fonction ne s'exécuteront
qu'une seule fois, au démarrage du programme; c'est la mise en place.

2. Loop : Contrairement à setup, loop va s'exécuter indéfiniment en boucle, 
 comme un moteur qui tourne constamment jusqu'à ce qu'on éteigne sa voiture. 
  • Les crochets {} : Toutes nos instructions, on va les glisser dans ces crochets, c'est un peu comme si je mettais une phrase entre guillemets au milieu de lettres aléatoires :

      		zfoeifnzeozinc"J'adore les pommes"zoeifnzoecnz
    

    Notre cerveau va se dire "ok j'adore les pommes" je connais, zfoeifnzeozinc je connais pas.

Les paramètres

11 pinMode(BROCHE_LED_ROUGE, OUTPUT);

Sur cette ligne, on repère plusieurs choses :

  1. pinMode
  2. Des parenthèses
  3. BROCHE_LED_ROUGE
  4. OUTPUT
La fonction pinMode

pinMode, c'est une fonction. Une fonction, on l'appelle par son nom, et on lui donne des infos entre parenthèses.

Mais attention, ici on ne l'écrit pas comme setup/loop, pinMode est une fonction que Arduino nous fournit toute prête. On ne nous dit pas comment elle marche à l'intérieur, et on n'en a pas besoin : on l'utilise. C'est là qu'on voit la différence entre écrire une fonction et en appeler une :

  • setup/loop, on les écrit ;
  • pinMode, on l'appelle, on s'en sert.

Et pour l'appeler, on écrit son nom (pinMode), suivi de parenthèses. Souvenez-vous, tout à l'heure les parenthèses de setup() étaient vides, ici elles ne le sont pas.

Les parenthèses et les paramètres

Les parenthèses, c'est là où on donne des informations à la fonction pour qu'elle sache quoi faire précisément. Ces informations s'appellent des paramètres.

Reprenons mon robot obéissant, si je lui dit "Met du courant sur la broche reliée à ma LED", il va se demander "Quelle broche ? Quelle LED ? Où ça ?..."

La fonction ne peut pas deviner (rappel : la machine ne devine rien). Donc on le lui précise dans les parenthèses.

Ici, pinMode attend deux paramètres, séparés par une virgule :

BROCHE_LED_ROUGE (le 1er paramètre) : quelle broche on configure. C'est notre constante. dans notre code, on lui a donné le nom BROCHE_LED_ROUGE pour dire « la broche 2 ». Donc ici, on dit à pinMode : « occupe-toi de la broche 2 ».

OUTPUT (le 2e paramètre) : en quoi on la configure. Souvenez-vous, une broche peut être une entrée (écouter) ou une sortie (agir). [Lien 06-Microcontrôleurs]

OUTPUT, c'est « sortie » : on déclare que cette broche va agir (envoyer du courant pour allumer la LED), pas écouter.

Donc la ligne entière, traduite en français : « Configure la broche 2 comme une sortie. » C'est tout. pinMode(quelle broche, en quel mode).

Le casdigitalWrite : Si vous êtes observateurs, vous avez sûrement compris que digitalWrite et pinMode ont la même structure, mais évidemment fonctionnent différemment; digitalWrite pourrais se traduire en humain par "écris un état sur la broche". Et l'état ici, c'est soit HIGH (courant qui passe = LED allumée) ou LOW (courant qui passe pas = LED éteinte).

On a encore une fonction du coup ! delay(1000) : même structure que les autres, son nom delay, elle prend des paramètres (), et ici on a mis 1000. C'est quoi 1000 ? C'est le temps, que l'on écrit en millisecondes (ms). 1000ms = 1 seconde.


Notre programme en langage humain vs C++ :

Voici une traduction pour vous faire comprendre au mieux le code, en reprenant l'ordre qui nous a permis d'allumer notre LED :

C++Humain (nous)
#define BROCHE_LED_ROUGE 2J'écris que notre LED est placé à la broche n°2
void setup() {}Mes instructions vont s'effectuer une seule fois, je prépare le terrain
pinMode(BROCHE_LED_ROUGE, OUTPUT);Je dis qu'on doit AGIR sur notre LED, pas l'écouter
void loop() {}Mes instructions vont s'effectuer en boucle, sans fin
digitalWrite(BROCHE_LED_ROUGE, HIGH);Je mets du courant à la broche n°2 (ma LED s'allume)
delay(1000);On attend 1000ms (1 seconde)
digitalWrite(BROCHE_LED_ROUGE, LOW);Je ne mets plus de courant à la broche n°2 (ma LED s'éteint)
delay(1000);On attend 1000ms (1 seconde)

[Ne pas oublier de dessiner une flèche qui remonte de delay(1000) à void loop et écrire (quand on arrive tout en bas, on recommence)]


Petits points d'attention

Comme on a pu le voir, la machine attend des règles précises, elle refuse d'interpréter quelque chose si elle ne le comprend/connait pas. En programmation, il existe quelques détails auxquels faire attention, les voici :

  • Faire attention aux majuscules/minuscules. Le code est sensible à la casse, OUTPUT // Output // output // outPut = Totalement différent pour une machine.

  • [Image meme drake je me suis compris]

  • Faire attention aux points virgules. A la fin d'une instruction, il ne faut pas oublier de préciser à la machine qu'on a finit son instruction avant de passer à la suivante, mon robot ne comprend pas la virgule, il ne parle qu'une phrase à la fois, en n'oubliant jamais le point.

  • Il en va de même pour les parenthèses () et les crochets {} qui vont toujours de paires (si le point virgule est notre fin de phrase, les crochets/parenthèses sont nos début/fin de paragraphes).


Voilà, on a attaqué un sacré morceau, si vous avez un peu de mal il ne faut pas s'inquiéter, c'est un domaine qui requiert du temps, de l'entrainement. Si vous avez des questions, des remarques, le forum est toujours ouvert pour ça aussi, en attendant, soufflez un peu, aérez vous l'esprit, vous pouvez être fiers de vous, car moi je le suis, si vous êtes encore là c'est que vous êtes une personne curieuse, et c'est toute la philosophie de Floraison.

forest-background