Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com)

ÉDITO

SOMMAIRE

Tout change et rien ne change. .

Dans ce numéro, vous trouverez un article un

ÉQUIPEMENT

peu particulier traitant d’un processeur dont la

conception remonte à plus de 40 ans. Toutefois,

04

celui-ci fonctionne dans les grandes lignes exac-

tement sur les mêmes bases qu’un modèle dernier

Fabriquez vos câbles/jumpers

cri comme l’AMD Ryzen Threadripper (qui, soit dit

pour platines à essais

en passant, semble être une merveille. C’est plai-

sant de voir AMD revenir dans la course).

Plus d’intégration, plus de vitesse, plus de cœurs, plus de fonctionnali-EN COUVERTURE

tés, plus de bits. . mais au final, les mêmes fondations et la même logique.

Ceci n’a rien d’exceptionnel et, si l’on regarde de près (de très très près), 12

on se rend rapidement compte qu’entre un SoC ARM d’une Raspberry Pi, un Intel Core i9, le microcontrôleur de votre Arduino ou encore le proces-Créez une lampe lunaire :

seur MIPS d’un routeur ou d’une box, au bout du compte, il n’y a pas vrai-préparation

ment de différences, seul l’usage change. Celui que vous, vous décidez d’en faire.

24

Python sur Raspberry Pi, C/C++ sur Arduino, assembleur sur un Z80. .

Créez une lampe lunaire :

En réalité, la seule chose qui change, c’est votre comportement, vos préfé-

rences. Ceci est tout aussi vrai dans bien des domaines qui nous occupent en route !

ici, la radio logiciel e, la bidouil e, l’électronique, la programmation, le bricolage. . mais plus largement encore, c’est vrai dans toutes les disciplines.

Et si vous al ez à contre-courant, à l’opposé des usages et des habitudes, EMBARQUÉ & INFORMATIQUE

et obtenez le résultat escompté ou plus encore, vous arrivez dans le hacking, au sens noble du terme : une solution innovante, créative, originale et 38

montrant une certaine excel ence technique (n’en déplaise aux médias qui Visualisez la charge

nous martèlent le pénible hacker=pirate).

processeur de votre Pi avec

Et grâce à cela, à cette continuité, nous pouvons améliorer notre compréhension du présent grâce à des choses qui peuvent aujourd’hui paraître Pimoroni Piglow

« primitives ». Et si cela est vrai pour la technologie, cette « chose » qui fait de nous des humains, ça l’est très certainement aussi pour tout le reste. Je 50

crois que si on expliquait l’importance qu’a l’Histoire ainsi aux plus jeunes, Sense HAT pour donner de

le monde serait bien différent. Mais cela est un tout autre débat. .

la couleur et plus à votre

Sur cette note hautement « philosophique », je vous laisse découvrir ce Raspberry Pi

numéro de rentrée. Les vacances sont finies, au boulot ! ;)

DÉMONTAGE, HACKS & RÉCUP

70

Hackable Magazine

Plate-forme de Saint-Quentin-Fallavier.

Créez votre ordinateur

Tél. : 04 74 82 63 04

est édité par Les Éditions Diamond

Service des ventes : Abomarque : 09 53 15 21 77

8 bits sur platine à essais :

IMPRIMÉ en Allemagne - PRINTED in Germany

Dépôt légal : À parution,

le processeur

N° ISSN : 2427-4631

Commission paritaire : K92470

10, Place de la Cathédrale - 68000 Colmar

Périodicité : bimestriel

TENSIONS & COURANTS

Tél. : 03 67 10 00 20 – Fax : 03 67 10 00 21

Prix de vente : 7,90 €

E-mail : lecteurs@hackable.fr

La rédaction n’est pas

Service commercial : cial@ed-diamond.com

responsable des textes,

84

illustrations et photos qui

Sites : https://www.hackable.fr/

lui sont communiqués par

Prenez de bonnes mesures !

https://www.ed-diamond.com

leurs auteurs. La repro-

Directeur de publication : Arnaud Metzler

duction totale ou partiel e des articles publiés dans Hackable Magazine est interdite sans accord écrit de la société Les Éditions Diamond.

Et si dès la rentrée on se

Rédacteur en chef : Denis Bodor

Sauf accord particulier, les manuscrits, photos et dessins adressés à Réalisation graphique : Kathrin Scali

Hackable Magazine, publiés ou non, ne sont ni rendus, ni renvoyés. Les mettait au courant ?

Responsable publicité : Valérie Fréchard,

indications de prix et d’adresses figurant dans les pages rédactionnel es Tél. : 03 67 10 00 27 v.frechard@ed-diamond.com

sont données à titre d’information, sans aucun but publicitaire. Toutes les marques citées dans ce numéro sont déposées par leur propriétaire Service abonnement : Tél. : 03 67 10 00 20

respectif. Tous les logos représentés dans le magazine sont la propriété de leur ayant droit respectif.

ABONNEMENT

Impression : pva, Landau, Allemagne

Distribution France : (uniquement pour les

Suivez-nous sur Twitter

dépositaires de presse)

63/64

MLP Réassort : Plate-forme de Saint-Barthélemy-

@hackablemag

d’Anjou. Tél. : 02 41 27 53 12

Abonnements multi-supports

À PROPOS DE HACKABLE...

HACKS, HACKERS & HACKABLE

Ce magazine ne traite pas de piratage. Un hack est une solution rapide et bricolée pour régler un ENCART JETÉ INCLUS

problème, tantôt élégante, tantôt brouil onne, mais systématiquement créative. Les personnes utilisant ce type de techniques sont appelées hackers, quel que soit le domaine technologique. C’est un abus de langage médiatisé que de confondre « pirate informatique » et « hacker ». Le nom de ce Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) mag haztitnps:

e a é /t w

é chwoiw

s .

i p ed

our r-edfliéatem

r c oetnd

e n .octioom

n d e bidouil age créatif sur la base d’un terme utilisé dans sa définition légitime, véritable et historique.

HACKABLE MAGAZINE n°20

3

ÉQUIPEMENT

CÂBLES/JUMPERS

FABRIQUEZ VOS

CÂBLES/JUMPERS POUR

PLATINES À ESSAIS

Denis Bodor

L’électronique de loisir est un hobby souvent relativement peu coûteux, en particulier lorsqu’on achète des composants, des modules et des accessoires sur des sites de discount ou d’enchères en ligne. Il n’en reste pas moins qu’il n’y a pas de petites économies et que tantôt, un peu d’huile de coude ne fait pas de mal. Si, en plus, cela permet d’avoir un gros stock pour les années à venir et que le résultat est bien plus pratique, on gagne sur tous les tableaux...

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 4

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Fabriquez vos câbles/jumpers pour platines à essais

Souvent je me dis que utiliser pour autre chose, quitte à les souder ou s’en les idées simples ou

servir comme antenne, bobine ou électroaimant.

les petites astuces

Se pose alors la question de l’achat d’une nouvel e

ne méritent pas un

boîte avec, à la clé, invariablement, le même parcours et

article, en particu-

donc le même problème. Même à moins de 3€ la boîte de

lier lorsque cela concerne une

140 pièces de tail es différentes en provenance de Chine,

pratique qui m’est devenu quoti-

à force, cela finit par coûter le prix d’une carte Arduino.

dienne. C’est en discutant alors

Une autre solution pourtant assure un stock pour une

avec d’autres personnes, en par-

longue durée, un choix de couleurs plus étoffé et surtout

ticulier mes chers lecteurs croisés

une économie substantiel e sur le long terme : réaliser ses

lors de salons, de manifestations

câbles soi-même.

ou de portes ouvertes que je me

rends finalement compte que cela

pourrait être moins désuet que je

1. TYPES ET TAILLES DE CÂBLES :

ne l’imagine.

C’EST PAS SI SIMPLE !

Le cas qui nous intéresse

Voilà typiquement

aujourd’hui est celui des câbles,

L’idée de base n’est pas compliquée, il suffit d’acheter

le genre de câble,

souvent appelé

connecteurs, jumper-wire...

plusieurs mètres de câble, de les couper à la tail e sou-

« jumper wire »

utilisés généralement avec les

haitée et d’en dénuder les extrémités. Mais on se heurte

qui est utilisé sur

platines à essais. Lorsqu’on

alors à un petit problème qui prend la forme d’une simple

les platines à

débute, on acquiert généralement

question : quel type de câble choisir ?

essais. Répartis

en plusieurs

une ou deux platines et une

La première chose à prendre en considération est la

tailles en quantité

sympathique boîte contenant des

structure du câble en question. On parle généralement

limitée, ceux-ci

sortes de « fils de fer » gainés

de câbles électriques souples (comme une rallonge

posent toujours le

problème typique

permettant d’établir les liaisons

électrique) ou rigides (comme les câbles dans les murs),

des « lots » : il n’y

proprement. Invariablement, on

mais il est plus juste d’utiliser les termes « conducteurs

a jamais assez

finit par en manquer, les tordre

monobrin » et « conducteurs multibrin ». Le câble monobrin

de ce dont on a

dans tous les sens, voire les

se compose d’un corps d’une pièce couvert d’un isolant.

besoin et trop de

ce qui ne sert pas

souvent.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

5

ÉQUIPEMENT

CÂBLES/JUMPERS

main. Du fait de l’effet de peau, le

courant provenant d’une bobine

ne pénétrait pas dans son corps et

il ne risquait donc pas l’électrocu-

tion, mais le résultat avait le mérite

d’étonner son auditoire. . Un peu

comme les discours et arguments

sans fin sur les forums audiophiles,

concernant le type de câbles à utili-

ser pour tel ou tel style musical.

Dans le cas qui nous concerne

ici, l’effet de peau ou la souplesse

des câbles n’a presque aucune

importance. En effet, quiconque a

déjà essayé d’enfoncer un câble

multibrin dans une platine à essais

Le câble multibrin contient plusieurs conducteurs de petits

connaît parfaitement le problème.

11 rouleaux de

diamètres, torsadés ou non, surmoulés avec un isolant. Le

C’est un peu comme essayer de

20m de câble

monobrin gainé

matériau utilisé comme conducteur peut être du cuivre, de

passer un fil de laine dans le chas

pour un coût

l’aluminium, du fer ou un al iage composé de ces métaux

d’une aiguil e sans le mouil er. .

d’environ 40

et d’autres (or, argent, nickel, magnésium, silicium, etc.).

en pire. Pour fabriquer vos câbles

euros. Non

Il existe une grande variété de conducteurs, mais le plus

pour platines à essais, il vous

seulement ceci

est bien plus

souvent il s’agit simplement de cuivre étamé.

faut donc du câble monobrin (ou

rentable que

solid core en anglais). La question

l’achat de boites

Le choix entre multibrin et monobrin dans le domaine

mérite à peine d’être posée.

complètes mais,

électrique ou hifi est généralement une question de pratique

en plus, la

et/ou tantôt de théories plus ou moins fumeuses. Les câbles

Reste ensuite à déterminer le

couleur n’est pas

monobrin ne doivent pas subir de courbures ou de torsions

diamètre du câble en question afin

liée à la taille. On

peut donc, par

répétées, car cela fragilise le conducteur qui finit invariable-

que celui-ci entre bien dans le trou,

exemple, avoir

ment, à un moment ou un autre, par casser. C’est la raison

mais ne soit pour autant pas trop

toutes les lignes

pour laquel e les appareils électriques, les ral onges et les

mince et qu’il puisse tenir en place

d’alimentation

multiprises utilisent systématiquement des câbles multibrin.

sans problème. Seulement voilà,

en rouge et les

vous ne trouverez nul e part de

masses en noir,

Concernant la transmission de signaux et de puissance,

indépendamment

câble avec un diamètre donné car,

on entend parfois parler de l’effet de peau (ou effet pel i-

des longueurs

dans ce domaine, cette valeur n’est

utilisées.

culaire). C’est un phénomène physique se traduisant par

pas utilisée. C’est la section du

une circulation plus importante des charges électriques

câble qui compte, non le diamètre.

en proximité avec surface du conducteur et non dans leur

cœur. Ce phénomène cependant n’apparaît qu’avec un

La section du câble, ou en

courant alternatif à haute fréquence, avec un courant conti-

d’autres termes, la surface d’une

nu les charges se déplacent dans le conducteur de manière

tranche de la partie conductrice

uniforme. En hifi certains vous diront que le choix de l’un

lorsque celui-ci est coupé, est une

ou l’autre type de câble est important pour cette raison, et

valeur exprimée en millimètres car-

d’autres affirmeront que c’est de la superstition et qu’aucune rés. Ce choix a été fait, car il existe différence audible n’existe. Pour l’anecdote, sachez que

une relation directe entre cette

Nikola Tesla utilisait ce phénomène pour ses présentations,

valeur et la solidité du câble, son

en faisant circuler un courant à haute fréquence dans son

poids, sa résistance et surtout la

corps pour il uminer un tube basse pression tenu dans sa

quantité de courant qu’il peut trans-

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 6

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Fabriquez vos câbles/jumpers pour platines à essais

porter. Différentes sections normalisées (IEC 60228)

Alors que la conversion d’un diamètre en sec-

existent de 0,5 mm², 0,75 mm², 1 mm². . jusqu’à 2500

tion, et inversement, relève d’un calcul relative-

mm². Un certain nombre de normes imposent, pour les

ment simple, il n’en va pas de même pour l’AWG.

instal ations électriques, des sections d’une valeur spé-

En premier lieu, contrairement à la relation

cifique en fonction de la distance et de la puissance de

diamètre/section, la valeur AWG est proportion-

courant à transporter.

nel ement inverse à la mesure du diamètre. Plus

Convertir un diamètre en section n’est pas très diffi-

la valeur AWG est grande, plus le diamètre du

cile, il suffit de se souvenir de ses cours de géométrie de

conducteur est petit.

primaire : surface d’un cercle = rayon fois rayon fois pi.

Initialement le créateur de ce système, la

Et donc, section = (diamètre / 2)² x pi = pi x diamètre² / 4.

société Brown & Sharpe, a arbitrairement défini

Inversement, on pourra obtenir le diamètre à partir de la

deux valeurs, basées sur deux diamètres : 0000

surface en calculant la racine carrée de la surface fois

AWG (ou 4/0 AWG) pour le diamètre de 0,46

deux divisée par pi.

pouces et 36 AWG pour 0,005 pouces. De cette

Cette désignation en mm² est cependant spécifique

base a été calculée une liste de 40 valeurs sui-

aux pays utilisant le système métrique (dont nous). Les

vant une progression géométrique (comme la

USA et implicitement donc un grand nombre de ven-

section est multipliée par une constante pour

deurs sur le net préfèrent un autre système : AWG pour

obtenir chaque valeur, le diamètre lui, augmente

American Wire Gauge (littéralement « calibre de fils

de façon dite géométrique). Cette gamme a, par

américain »).

la suite, été étendue pour al er jusqu’à 40 AWG.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

7

ÉQUIPEMENT

CÂBLES/JUMPERS

Il est possible de faire les calculs pour déduire le diamètre d’une valeur AWG et inversement, mais ceci est relativement fastidieux. Il existe d’ail eurs des astuces pour avoir une approximation, comme par exemple le fait que le diamètre d’un conducteur est doublé lorsque la valeur AWG est réduite par 6 ou encore que réduire de 3 la valeur AWG double la section d’un câble. Mais le plus simple est de tout bonnement se réfé-

rer à un tableau présentant les correspondances AWG, diamètre et section comme celui ci-contre : AWG

Diamètre en pouce

Diamètre en mm

Section en mm²

0000 (4/0)

0,46

11,684

107

000 (3/0)

0,4096

10,405

85,0

00 (2/0)

0,3648

9,266

67,4

0 (1/0)

0,3249

8,251

53,5

1

0,2893

7,348

42,4

2

0,2576

6,544

33,6

3

0,2294

5,827

26,7

4

0,2043

5,189

21,2

5

0,1819

4,621

16,8

6

0,162

4,115

13,3

7

0,1443

3,665

10,5

8

0,1285

3,264

8,37

9

0,1144

2,906

6,63

10

0,1019

2,588

5,26

11

0,0907

2,305

4,17

12

0,0808

2,053

3,31

13

0,072

1,828

2,62

14

0,0641

1,628

2,08

15

0,0571

1,45

1,65

16

0,0508

1,291

1,31

17

0,0453

1,15

1,04

18

0,0403

1,024

0,823

19

0,0359

0,912

0,653

20

0,032

0,812

0,518

21

0,0285

0,723

0,41

22

0,0253

0,644

0,326

23

0,0226

0,573

0,258

24

0,0201

0,511

0,205

25

0,0179

0,455

0,162

26

0,0159

0,405

0,129

27

0,0142

0,361

0,102

28

0,0126

0,321

0,081

29

0,0113

0,286

0,0642

30

0,01

0,255

0,0509

31

0,00893

0,227

0,0404

32

0,00795

0,202

0,032

33

0,00708

0,18

0,0254

34

0,0063

0,16

0,0201

35

0,00561

0,143

0,016

36

0,005

0,127

0,0127

37

0,00445

0,113

0,01

38

0,00397

0,101

0,00797

39

0,00353

0,0897

0,00632

40

0,00314

0,0799

0,00501

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 8

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Fabriquez vos câbles/jumpers pour platines à essais

Dans le cas des câbles rigides pour pla-

tines à essais, il s’agit généralement de

conducteurs monobrin en 22 AWG et donc

avec un diamètre de 0,644 mm et une section

de 0,326 mm². Vous remarquerez également

qu’un câble 21 AWG ou 23 AWG ne présente

pas de grande différence et pourrait tout aussi

bien convenir. Mais si nous restons dans les

valeurs initiales, tout ce que nous avons à

faire est de rechercher du câble gainé de ce

type, ce qui se traduit généralement en une

utilisation des termes « solid wire 22 awg

breadboard jumpers ».

Une tel e recherche sur eBay, par exemple,

Cette pince coupante spécialement

devrait vous retourner un certain nombre de résultats intéressants à la conçue pour l’électronique dispose, à

fois de vendeurs en Europe et en Asie. En ce qui me concerne, j’ai fait l’arrière, d’un ingénieux mécanisme

mon achat chez un vendeur anglais (mal inson-electrical). Je dis bien pour dénuder les câbles avec deux

« mon achat », au singulier, car celui-ci portait sur un lot de 11 rouleaux petites mâchoires qui pincent le câble

et deux autres, coupantes, qui se

de couleurs différentes de 20 mètres, le tout pour un montant d’une quarétractent pour retirer la gaine isolante.

rantaine d’euros. Avec plus de 200m de câble, autant vous dire que ceci Ce modèle d’Amtech coûte environ 15€,

risque de me durer un petit bout de temps. .

mais pour un câble monobrin un simple

cutter pourra parfaitement faire l’affaire.

2. UTILISER LES CÂBLES

Réceptionner un lot de câbles bruts et s’extasier devant les bel es couleurs offertes est une chose, en faire des « jumpers » pouvant être utilisés sur platine à essais en est une autre. Pour transformer la matière brute en quelque chose d’utilisable il faut : couper, dénuder et plier.

Personnel ement, je ne prépare pas de « jumpers » à l’avance, mais La plupart des mesures de câbles qu’on

préfère consommer le câble au fur et à mesure. Le coupage du câble trouve sur le net lorsqu’on cherche du

et éventuel ement la pliure de ce dernier ne posent pas vraiment de matériel ou des fournitures à acheter

utilisent le système AWG. Ici, la poignée

problème. Un outil age de qualité sera un plus mais, si nécessaire, les d’une pince coupante précise des

moyens du bord feront l’affaire. J’ai d’ail eurs toujours un coupe-ongles à calibres utilisables entre 26 et 14 AWG,

portée de main sur mon bureau, ceci fonctionne très bien et tantôt même soit une section entre 0,129 mm² et 2,08

mm² et donc un diamètre entre 0,405

mieux qu’une pince hors de prix.

mm et 1,63 mm.

Dénuder le câble est une autre paire de manches et

plusieurs techniques existent :

• Utiliser une pince à dénuder. Généralement, ceci fonc-

tionne très bien avec des câbles multibrin, mais n’est

souvent pas optimal avec du monobrin.

• Utiliser une pince coupante standard en ajustant judi-

cieusement la fermeture des mâchoires. Cette tech-

nique est relativement difficile à maîtriser et demande

pas mal de pratique. Il faut arriver à contrôler sa main

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

9

ÉQUIPEMENT

CÂBLES/JUMPERS

effet à créer des connexions « à

plat » sur la platine même si pour

certaines d’entre el es cela peut

être plus pratique (connexion à la

masse ou à la ligne d’alimenta-

tion, sur le bord de la platine par

exemple).

3. POUR FINIR

Les câbles monobrin de ce

genre de calibre peuvent être

Voici le résultat visé

utilisés pour bien des choses

lorsque vous décidez de

de façon à pincer le câble juste ce qu’il

et non pas simplement comme

réaliser vos « jumpers »

faut pour entamer l’isolant et appliquer un

« jumpers » sur platine. Vous

avec à gauche (en rouge)

mouvement de traction pour le retirer. . Le

un exemplaire provenant

pouvez par exemple créer des

tout sans couper le conducteur ou étirer

d’une boîte et à droite

bobines, des antennes, des élec-

(en rose) la version

simplement l’isolant sans l’enlever. Cette

troaimants, etc. Ils présentent

« faite maison » avec le

technique, à mon sens, est plus adaptée

généralement une limitation,

morceau de gaine retiré.

aux câbles souples multibrin.

du moins en 22 AWG, dans le

• Utiliser un briquet, ce qui généralement est

sens où ils peuvent difficilement

une vieil e technique d’électricien, donnant

être utilisés pour une connexion

des résultats assez douteux et surtout étant

directe sur une carte Arduino par

relativement douloureuse. L’idée est de

exemple.

chauffer le bout du câble pour ramol ir la

En effet, les emplacements sur

gaine et la retirer d’un coup sec en la pre-

la carte sont trop grands (ou le

nant entre le pouce et l’index. Ne le faites

diamètre du conducteur trop petit,

pas, c’est barbare et fort désagréable.

c’est selon) et même en choisissant

• Et enfin, ma méthode préférée qui consiste

un câble avec un diamètre plus

à utiliser un objet coupant comme un cutter

important, leur rigidité ne facilite

ou un couteau. Il suffit de rouler le câble sur

pas la connexion avec une platine

la lame avec une pression suffisante pour

à essais et/ou un module. Dans

couper la gaine, mais sans endommager

ce genre de situations, l’option du

le conducteur (qui est généralement assez

câble souple avec des connecteurs

tendre puisqu’il s’agit en principe de cuivre).

adaptés (souvent appelés câbles

Le morceau d’isolant est ensuite retiré,

« Dupont ») est préférable. Il est

parfaitement sectionné, en le glissant tout

possible de tricher en donnant une

simplement sur le conducteur (et en plus

forme en dent de scie au conduc-

vous obtenez un mini macaroni tout mignon). teur monobrin, mais le résultat est Cette approche fonctionne merveilleuse-loin d’être idéal.

ment avec du monobrin, mais peut facile-

Comme dans d’autres domaines,

ment endommager les câbles souples en

finalement, pour chaque usage

coupant des brins.

il existe une solution adaptée et

Plier la partie dénudée du câble n’est, bien

optimale. À vous de la choisir en

entendu, pas difficile, mais surtout, el e n’est pas

fonction de ce que vous avez sous

forcément nécessaire. Rien ne vous oblige en

la main et du but à atteindre. DB

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 10

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

PROFESSIONNELS, R&D, ÉDUCATION...

DÉCOUVREZ CONNECT

LA PLATEFORME DE LECTURE EN LIGNE !

LISEZ LE

DERNIER

NUMÉRO PARU

LISEZ PLUS

DE 300

NUMÉROS ET

HORS-SÉRIES

* Tarif France

TOUT CELA À PARTIR DE 149 € TTC*/AN Métropolitaine

OFFRE DÉCOUVERTE CONNECT

1 MOIS GRATUIT, RÉSERVÉE AUX PROFESSIONNELS

Appelez le 03 67 10 00 28 et donnez le code « HK20 » pour

découvrir Connect gratuitement pendant 1 mois !

Visitez : connect.ed-diamond.com

Pour tous renseignements complémentaires, contactez-nous via notre site internet : www.ed-diamond.com, Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

par téléphone : 03 67 10 00 28

H

ou envoyez-nous un mail à ACKABLE MAGAZINE n°20

connect@ed-diamond.com !

11

* Offre valable jusqu’au 31/12/2018 pour un magazine au choix, une seule fois par famille, entreprise ou établissement durant cette période. Cette Offre Découverte n’est pas cumulable à un abonnement Connect déjà en cours.

pub_connect_aout2017.indd 3

22/08/2017 11:16

EN COUVERTURE

LAMPE LUNAIRE

CRÉEZ UNE LAMPE

LUNAIRE : PRÉPARATION

Denis Bodor

On peut s’intéresser à la lune pour de nombreuses raisons, de la plus raisonnable à la plus farfelue, mais quelle qu’elle soit il faut avouer que ce satellite naturel de la Terre est du plus bel effet dans le ciel.

Pourquoi donc alors le laisser à sa place et ne pas le rapporter chez vous, dans votre chambre ou dans votre salon ? Les budgets spatiaux n’étant pas dans les plages utilisables pour le magazine, nous allons nous contenter de reproduire l’astre avec la plus grande précision possible.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 12

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : préparation

Une fois n’est pas années, et d’enregistrer tout cela dans une carte Arduino coutume, ce projet

accompagnée d’un petit croquis de lecture. Mais non,

est également une

voyez-vous, je me suis mis en tête de chercher un bout

aventure et l’occa-

de code en C que je pourrais réutiliser, porter sur Arduino

sion d’apprendre

et étendre à souhait par la suite. En effet, l’idée même de

énormément. Ce qui a commencé

devoir assimiler toute une littérature grouil ant de termes

par une simple idée amusante,

étranges et de transformer tout cela en code me paraissait

« tiens ce serait drôle d’avoir une

un peu. . démesurée (jetez simplement un œil à la page

lune lumineuse qui suit les phases

Wikipédia de l’équation de Kepler et vous comprendrez).

en temps réel », a presque fail i

finir en véritable cauchemar. En

effet, et c’est sans doute pour cela

1. LE CODE DE DÉPART

qu’on dit que la lune est trom-

peuse, en regardant un calendrier

J’ai ainsi mis la main sur le code d’un certain John Wal-

tout cela paraît fort simple : il suffit

ker datant de 1987, repris par Bill Randle en 1991 afin de

de suivre le cycle lunaire et incré-

l’intégrer dans un outil appelé calentool et faisant partie menter petit à petit au fil du temps

de FreeBSD 1.0 (1993). En domaine public, ce code en C,

qui passe. . Eh bien non, pas du

prenant la forme d’un fichier moon.c, était un composant

tout !

d’un outil utilisant XView/Xlib, une « interface » graphique

(toolkit) à la mode à l’époque. La première phase du travail

Figurez-vous que la lune

consista donc principalement à débarrasser le code de

ne va pas toujours à la même

toute la gestion graphique puis de le modifier pour obtenir

vitesse, qu’el e n’est pas toujours

une première version utilisable en ligne de commandes

à la même distance de la Terre,

sous GNU/Linux. Les résultats calculés pouvaient être

que la Terre a une position tout

ensuite comparés avec des données disponibles sur diffé-

aussi variable par rapport au

rents sites, ainsi que cel es fournies par des applications

soleil. . et qu’en mélangeant tout

Android par exemple.

cela à grands coups de calculs

trigonométriques, c’est presque la

Pour adapter un code existant de cette manière, la tech-

migraine assurée, du moins si on

nique est relativement simple, mais fastidieuse. On com-

mence tout naturel ement par supprimer les instructions

n’est pas amateur d’astronomie

incluant les fichiers d’entête .h inutiles (ce qu’on appel e (ce que je ne suis aucunement,

généralement des bibliothèques dans l’environnement

je trouvais simplement l’idée

Arduino). On tente ensuite de compiler le code et on utilise

rigolote).

les erreurs générées pour retrouver les fonctions posant

Avec le recul, il eut été plus

problème et devant être supprimées. Tout ceci pourrait

simple de calculer l’illumination

être fait dans l’environnement Arduino, mais je trouve que

lunaire à partir d’un site ou d’une

le cycle compilation/correction est plus rapide sur un PC

application pour les 15 prochaines

GNU/Linux ou une Raspberry Pi.

Voici les différentes phases

de la lune au cours d’une

lunaison. Petite astuce pour

savoir si la lune est croissante

ou décroissante : « la lune

est menteuse », lorsque la

partie lumineuse forme un

« C » la lune est Décroissante,

lorsqu’elle forme un « D » elle

est Croissante...

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

13

EN COUVERTURE

LAMPE LUNAIRE

Une fois toutes les erreurs éliminées, on

cette partie de l’article se veut la plus générique

active ensuite les messages d’avertissement du

possible, je n’entrerai pas dans le détail de la

compilateur (option -Wall) de façon à afficher

façon d’écrire un code en C fonctionnant, par

toutes les variables déclarées et non utilisées.

exemple, sur Raspberry Pi. Vous pourrez trou-

Là encore le processus est relativement simple,

ver sur le dépôt GitHub du magazine le fichier

mais néanmoins pénible. Il s’agit principale-

source moon.c modifié et complété ainsi d’un

ment de se débarrasser de la majeure partie du

fichier Makefile permettant de simplifier la

« code mort » de manière à obtenir une version

compilation (placez-vous simplement dans le

la plus édulcorée possible, constituée du strict

répertoire et utilisez la commande make pour

minimum utile.

obtenir un binaire moon).

Enfin, il faut étudier le code restant, car un

Au final, ce qui reste du code original se

certain nombre de déclarations inutiles ne sont

résume aux fonctions suivantes (notez que les

pas détectées par le compilateur. En effet, si je

noms des fonctions et des variables sont ceux

déclare une variable toto en début d’une fonc-

choisis par l’auteur original du code) :

tion par exemple et que, plus loin, je lui attribue

une valeur avec un toto=12, le compilateur

• void jyear(double td, int *yy, int

ne la considèrera bien entendu pas comme

*mm, int *dd) : permet de convertir une

non utilisée, même si el e ne sert à rien ail eurs

date exprimée en jours juliens en trois

dans le code. Là, la seule recommandation

entiers représentant l’année, le mois et

pour ce travail consiste à ne pas vous précipiter

le jour. Le jour julien est la base d’un sys-

et recompiler à chaque variable traitée afin de

tème de datation utilisé en astronomie et

vous assurer que vous n’avez effectivement

qui consiste à représenter une date en un

rien raté. Si vous supprimez un lot de variables

nombre de jours et une fraction de jours

et obtenez une erreur concernant l’une d’entre

écoulés depuis une date fixée par conven-

el es, il sera problématique de revenir en arrière

tion. Normalement cette date est le 1er

sans annuler tous les changements.

janvier -4712 à 12 heures, mais le CNES

utilise le 1er janvier 1950 à 0 heure et la

Dans ce cas précis, pour le fichier moon.c, le

NASA le 24 mai 1968 à 0 heure, date de

code n’était qu’un élément d’un programme plus

début des missions Apol o (les Américains

important. Il n’avait pas de fonction principale

ne peuvent pas s’empêcher de fanfaronner

(main()) permettant l’exécution à proprement

apparemment). Le code de John Walker,

parler. Dans le cas d’un croquis Arduino, cette

lui, utilise la date conventionnel e, le jour

fonction vous est masquée, mais el e existe

julien astronomique ou AJD en anglais.

également. El e est constituée de quelque

chose comme ceci :

• void jhms(double j, int *h, int

*m, int *s) : fait la même chose que

int main(void)

jyear(), mais permet d’obtenir l’heure,

{

les minutes et les secondes d’une date

setup();

en jours juliens. Notez que cette fonction,

for (;;) {

comme la précédente, prend en premier

loop();

argument une valeur en virgule flottante

if (serialEventRun) serialEventRun();

double précision, mais ensuite des poin-

}

return 0;

teurs où placer les valeurs calculées. On

}

doit donc déclarer des variables, appeler

ces fonctions en passant les pointeurs sur

C’est cette fonction qui déclenchera l’utilisa-

les variables en argument, pour enfin utili-

tion de cel es que nous voulons tester. Comme

ser ces variables ainsi initialisées.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 14

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : préparation

UNO et Due :

les deux sont

des Arduino,

les deux sont

bleues, les deux

se programment

avec le même

environnement et

le même langage...

mais ces deux

cartes sont vraiment

très différentes.

Celle de droite utilise

des « double » et

une arithmétique en

64 bits et l’autre en

32 bits seulement.

• double meanphase(double sdate,

calculer les dates et heures précises des

double k) : retourne la date « approxi-

cinq phases. Notez que, comme avec

mative » de la nouvel e lune en jours

jyear() et jhms(), le tableau permettant

juliens pour une date donnée en argu-

de stocker ces cinq dates doit être décla-

ment ainsi que le numéro du mois lunaire

ré avant l’appel à la fonction et c’est un

(ou synodique) depuis l’an 1900. Notez

pointeur sur cette variable qui est passé

qu’un mois lunaire synodique, également

en argument (phase et phase[0] pointant

appelé une lunaison, est l’espace entre

sur la même donnée).

deux nouvel es lunes (totalement obscur),

• double kepler(double m, double

soit environ 29,53 jours (oui, utiliser une

ecc) : calcule l’équation de Kepler per-

date de nouvel e lune et calculer des in-

mettant de déterminer la position des

terval es de 29,53 est une solution simple

astres pour un instant donné sur leurs

pour déduire les phases de la lune, mais

orbites el iptiques. Cette fonction est uti-

cela reste approximatif).

lisée par la fonction principale du fichier

• double truephase(double k, double

moon.c (phase()).

phase) : permet d’obtenir une date et heure

• long jdate(struct tm *t) : retourne

exacte d’une phase exprimée en fraction

la partie entière du jour julien pour une

de un (0 étant la nouvel e lune, 0,25 le pre-

date donnée sous la forme d’une structure

mier quartier, 0,5 la pleine lune, etc.). k est

standard tm définie dans time.h sur un

ici, comme avec la fonction précédente, le

système Unix comme GNU/Linux. Cette

numéro de mois lunaire depuis 1900.

structure est sensiblement différente dans

• void phasehunt(double sdate,

l’environnement Arduino et cette fonction

double phases[5]) : permet d’obtenir

doit être adaptée.

cinq phases lunaires (nouvel e lune, pre-

• double jtime(struct tm *t) : retourne

mier quartier, pleine lune, dernier quartier,

la partie entière et décimale du jour julien

nouvel e lune) entourant une date donnée

pour une date donnée sous la forme d’une

en jour julien. Cette fonction utilise à la

structure tm. Cette fonction utilise la pré-

fois meanphase() pour trouver les mois

cédente et retourne donc une valeur en

lunaires adéquats puis truephase() pour

virgule flottante.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

15

EN COUVERTURE

LAMPE LUNAIRE

La valeur retournée

par la fonction phase()

• double phase(double pdate, double *pphase, double *mage, double est suffisante pour

*dist, double *sudist) : enfin, voici la fonction principale qui nous intéresse notre projet puisqu’elle

dans moon.c. Cel e-ci prend en argument une date en jours juliens et une série fournit à elle seule une

excellente indication de

de pointeurs vers des variables qui seront initialisées : la quantité de lune éclairée l’illumination de la lune

sous la forme d’une fraction de un, l’âge de la lune en jour (par rapport à la nouvel e pour une date donnée.

lune), la distance entre le centre de la Terre et la lune et la distance du soleil en kilo-Ici, il faut s’imaginer être

mètres. Cette fonction retourne également une valeur correspondante à un angle de au-dessus de la lune,

avec un observateur

rotation entre 0 et 1 représentant un cycle lunaire complet en terme d’il umination. Il se trouvant en bas de

faut imaginer cette valeur comme une rotation imaginaire du soleil autour de la lune l’illustration. La rotation

ou encore comme une bal e bicolore (obscure/lumineuse) tournant sur el e-même, et indiquée par phase()

où la rotation est représentée par une valeur entre 0 et 1 (cf. il ustration).

nous donne à la fois la

portion illuminée, mais

Voici pour les fonctions utiles récupérées de moon.c qui peuvent directement être également notre position

utilisées pour obtenir des informations intéressantes en fonction de la date et heure temporelle dans le cycle

lunaire (lune croissante

actuel e. Pour l’occasion, j’ai également ajouté une nouvel e fonction, nextmoon(double ou décroissante).

sdate, double phase) directement inspirée de phasehunt() et permettant d’obtenir la date d’une prochaine phase en passant en argument la date actuel e et la phase en question sous forme d’une fraction de un :

double nextmoon(double sdate, double phase)

{ int yy, mm, dd;

double k, ret;

// calcul de la date en jours juliens

jyear(sdate, &yy, &mm, &dd);

// calcul du mois lunaire

k = floor((yy + ((mm - 1) * (1.0 / 12.0)) - 1900) * 12.3685);

// on cherche la date de la prochaine phase demandée

while((ret=truephase(k, phase)) < sdate) {

k++;

}

// on retourne la date trouvée

return ret;

}

On pourra ainsi rapidement obtenir la date et l’heure de, par exemple, la prochaine pleine lune (0.5) ou nouvel e lune (0.0), mais également de n’importe quel e phase intermédiaire « officiel e », voire cel e d’une fraction totalement arbitraire. Une fois le code totalement nettoyé et adapté, le résultat obtenu en ligne de commandes sur une machine GNU/Linux comme une Raspberry Pi ressemble à ceci :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 16

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : préparation

Maintenant (GMT): Mon Mar 6 10:29:37 2017

Jour julien: 2457818.94

Lune croissante

angle = 0.28 [....****]

illumination = 61% 5/8

age lunaire = 8.40j

distance = 365221.12 km

distance soleil = 148447908.33 km

phase 0: Nouvelle lune = 26/02/2017 15:00:15

phase 1: Premier quartier = 05/03/2017 11:33:38

phase 2: Pleine lune = 12/03/2017 14:54:49

phase 3: Dernier quartier = 20/03/2017 16:01:29

phase 4: Nouvelle lune = 28/03/2017 02:59:26

Prochaine pleine lune = 12/03/2017 14:54:49

Prochaine nouvelle lune = 28/03/2017 02:59:26

Toutes ces informations sont bien plus étoffées que cel es pouvant être utiles pour un montage simple éclairant une lune en plastique ou un disque imprimé, mais nous avons une base solide avec des résultats confirmés par différents sites, logiciels et applications Android. Il ne reste plus qu’à transférer tout ça dans l’environnement Arduino.

2. DES « DOUBLE » PAS VRAIMENT « DOUBLE »

En adaptant rapidement le code pour en faire un croquis Arduino, on se rend compte d’un gros problème. Cette adaptation consiste principalement à remplacer les appels à la fonction printf par Serial.print(), obtenir la date et l’heure actuel e via une horloge temps réel type DS1307/

DS1338 et, bien entendu, à réorganiser le code de la fonction main() pour le placer dans setup().

Ce n’est pas un travail très difficile puisque la majorité des fonctions originales sont directement utilisables sans changement. C’est l’affaire de quelques minutes, mais. .

Lors de l’exécution sur une carte Arduino UNO, par exemple, les informations affichées laissent dubitatif :

Maintenant (GMT): 06/03/2017 10:30:11

Jour julien: 2457818.25

Lune Croissante

angle: 0.26

illumination: 53% 5/10

age lunaire: 7.67j

distance: 364056.78km

distance soleil: 148421536.00km

Nouvelle lune = 26/02/2017 12:00:00

Premier quartier = 05/03/2017 12:00:00

Pleine lune = 12/03/2017 12:00:00

Dernier quartier = 20/03/2017 18:00:00

Nouvelle lune = 28/03/2017 00:00:00

Prochaine pleine lune = 12/03/2017 12:00:00

Prochaine nouvelle lune = 28/03/2017 00:00:00

Toutes les valeurs sont différentes, et ce dans une mesure qui va bien au-delà de l’écart de temps entre l’exécution sur une Pi et cel e sur Arduino. Pire encore, les cinq valeurs retournées par Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

17

EN COUVERTURE

LAMPE LUNAIRE

Le problème de

précision sur les

valeurs à virgule

flottante (ou « les

flottants ») n’est

pas spécifique à

Arduino. Le MSP430

et son compilateur

intégré à Energia

se comportent de la

même manière, les

« double » sont en

réalité des « float ».

À droite, une

Launchpad MSP-

EXP430F5529LP

avec des « double »

en 32 bits et

à gauche une

Launchpad Tiva

C TM4C123G

avec des vrais

« double ».

phasehunt(), une fois converties au format du calendrier civil, (1 bit de signe, 8 bits d’exposant et

affichent des heures étrangement « rondes ».

23 bits de mantisse).

Ce sont pourtant exactement les mêmes fonctions qui sont

Je n’entrerai pas ici dans le

utilisées et le problème ne vient certainement pas du code uti-

détail de la manière dont un ordi-

lisé pour l’affichage. Il s’agit donc clairement d’une différence nateur, au sens large du terme,

concernant la plateforme el e-même ou son support logiciel.

peut stocker une valeur en virgule

En réalité, nous venons de toucher une limitation impor-

flottante, mais retenez simplement

tante de la plateforme et plus exactement des cartes Arduino

que plus le nombre de bits est

reposant sur un microcontrôleur AVR. Celui-ci intègre en effet

important, plus la précision l’est

un processeur 8 bits possédant des limitations importantes en

tout autant. Le nom des différents

termes de calcul. L’une d’el es concerne la tail e en bits des

types utilisé est une chose, et le

types de variables destinées à stocker des valeurs en virgule

format exact en est une autre.

flottante. Cette limitation est intimement liée à la fois au compiLes notions de simple précision et

lateur et aux bibliothèques standards (libc) pour cette architec-double précision sont trop vagues

ture, sans être strictement liée au processeur lui-même, si ce

pour clarifier la situation et une

n’est en termes de performances.

norme a été établie. Il existe donc

maintenant des désignations pré-

Lorsque je parle de précision, ceci concerne un type bien parti-

cises : binary32, binary64 et bi-

culier utilisé tout du long dans le code que nous avons récupéré : nary128. Le fait est que, avec une

le type double utilisé pour stocker des valeurs réel es (à virgule carte et un compilateur pour AVR,

flottante) en double précision. Ce type est normalement censé

que ce soit avec des types float

être normalisé (IEEE 754) selon une représentation sur 64 bits

ou double, c’est du binary32 qui

(1 bit de signe, 8 bits d’exposant et 52 bits de mantisse) et on est utilisé.

parle alors d’une précision de 53 bits. Or dans le cas du compilateur œuvrant en coulisse de l’environnement Arduino, les double Essayez simplement ce croquis

sont en réalité des float (simple précision), codés sur 32 bits et vous en aurez le cœur net :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 18

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : préparation

Voici un ESP-12E monté sur une carte

NodeMCU. Sous le blindage en métal se

cache un microcontrôleur ESP8266 à base

de Tensilica Xtensa LX106, un processeur

32 bits à 80 Mhz. Cette plateforme

économique peut être utilisée simplement

avec l’environnement Arduino et propose

des vrais « double » binary64 codés sur

64 bits, avec une précision de 53 bits.

Exactement ce qu’il nous faut pour nos

calculs lunaires. Et en prime, l’ESP8266

dispose d’une connectivité Wifi !

Le code initial provenant de BSD

void setup() {

Serial.begin(115200);

utilise des double pour une bonne

raison, mais l’environnement Arduino

Serial.print("char : ");

pour Atmel AVR ne nous propose que

Serial.println(sizeof(char)*8);

des « faux » double (il en va de même

Serial.print("int : ");

pour les cartes Launchpad MSP430

Serial.println(sizeof(int)*8);

Serial.print("long : ");

de Ti et l’environnement Energia).

Serial.println(sizeof(long)*8);

Dans l’état, tout ce travail d’adaptation

Serial.print("float : ");

aura-t-il donc été fait pour rien ?

Serial.println(sizeof(float)*8);

Serial.print("double : ");

Serial.println(sizeof(double)*8);

}

3. LE PROBLÈME ET

void loop() {

LA SOLUTION

}

Les calculs opérés par le code sont

relativement complexes et je n’ai pas

Dans le moniteur série s’affichera, lors de l’exécution :

honte de l’avouer, me sont totalement

char : 8

incompréhensibles à ce stade. L’objec-

int : 16

tif même de la démarche consistant

long : 32

à trouver et adapter un code existant

float : 32

était justement de ne pas avoir à me

double : 32

documenter et prendre le temps d’as-

similer des informations et principes

Faites de même avec une carte Arduino Due par

pour réimplémenter tout l’algorithme.

exemple, et :

Trois solutions sont alors envisa-

char : 8

geables pour régler ce problème :

int : 32

long : 32

• Réécrire une grande partie du

float : 32

code pour essayer, au mieux, de

double : 64

corriger le problème de précision

en basant tous les calculs sur des

Nous n’avons rien changé au croquis, c’est l’environ-

float de 32 bits. La tâche n’est

nement de développement (compilateur, etc.) et les biblio-

pas impossible, mais relativement

thèques utilisés qui changent.

fastidieuse et surtout impose de

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

19

EN COUVERTURE

LAMPE LUNAIRE

comprendre clairement ce que fait le fameux code. Or juste-

J’ai insidieusement évoqué cette

ment, c’est précisément ce qu’on essaie d’éviter ici (hé oui,

solution précédemment puisque, en

je veux juste une « veil euse » lunaire, pas créer un planéta-

effet, le croquis fonctionne déjà à la

rium ou me prendre pour Galilée).

perfection avec une carte Arduino

• Trouver une solution pour pouvoir utiliser des vrais

Due (ainsi que la Zero ou encore la

double

de 64 bits dans l’environnement Arduino pour Atmel AVR. Là

MKRZero), utilisant un Atmel AT-

encore, dans l’absolu, c’est quelque chose de parfaitement

91SAM3X8E (32 bits) et une chaîne

envisageable. . sous réserve d’y mettre le temps et les efforts de compilation totalement différente nécessaires. Il ne s’agit pas seulement de disposer du type

de cel e des Arduino AVR.

double ou de trouver une astuce pour « émuler » ce type,

Le petit problème n’est cepen-

mais également d’adapter toutes les fonctions mathéma-

dant pas technique, mais financier.

tiques utilisées pour travail er avec des valeurs en double

Une carte Arduino Due officiel e

précision. Ceci fait, il faudra ensuite, en plus, adapter le crovous coûtera quelques 35€ et un

quis en conséquence. La tâche est encore plus pénible que

clone environ 15€. Sachant que

de tout retravail er avec des float.

cette plateforme peut faire bien

• Opter pour une solution matériel e. Là, deux options

énormément que de simplement

existent : utiliser un coprocesseur ou changer de plate-

accéder à une horloge en temps

forme. La première peut paraître amusante puisqu’il existe

réel (RTC) et contrôler quelques

en effet des produits comme l’uM-FPU64 de Micromega se

leds, cela serait un beau gâchis que

connectant en SPI ou en i2c et fournissant littéralement ce

de la réserver à ce type d’usage

qu’était le 80387 pour l’Intel 80386. Malheureusement, cette (pas de planétarium, j’ai dit !).

solution est coûteuse et impose également une adaptation

Le but est donc de trouver une

du code. La seconde solution est bien plus rapide et aisée

plateforme supportant des opéra-

puisqu’il suffit de trouver une carte avec un vrai double de tions arithmétiques en double pré-

64 bits et des fonctions mathématiques standards corres-

cision la plus économique possible

pondantes.

et tout aussi facile à programmer

Le module ESP-01,

généralement le

moins cher, pourrait

convenir si nous

nous limitons à

l’aspect logiciel.

Malheureusement le

nombre d’entrées/

sorties est trop

limité pour contrôler

facilement à la fois

une horloge et un

système de leds

(mais ce n’est pas

impossible dans

l’absolu en utilisant

un PCF8574).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 20

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : préparation

ACTUELLEMENT

DISPONIBLE !

LINUX PRATIQUE n°103

qu’une carte Arduino. Idéalement, je dirais même

qu’il faudrait que cette carte puisse directement

prendre en charge notre croquis sans change-

ments (un bon programmeur est un programmeur

feignant) et ce dans l’environnement Arduino. .

Est-ce beaucoup demander ? Eh bien non, cette

plateforme existe et nous en avons déjà parlé

dans le magazine, c’est l’ESP8266 !

La plateforme ESP8266 a bien évolué

depuis le numéro 7 du magazine où el e était en

vedette en couverture. El e s’est énormément

popularisée, le nombre de cartes s’est grande-

ment étoffé et le support dans l’environnement

Arduino a gagné en maturité et en stabilité

(compilateur, gestion, intégration, bibliothèques,

etc.).

Pour rappel, cette plateforme a commencé

sa carrière dans le monde de l’électronique

amateur et de la bidouil e comme un module

de communication permettant à un montage

à base d’Arduino, par exemple, de bénéficier

d’une connectivité Wifi. Rapidement, de nom-

breux développeurs se sont rendu compte

qu’il était bien plus efficace d’utiliser le module

seul et de programmer l’ESP8266 exactement

comme le microcontrôleur d’une carte Arduino.

Il existe à présent toute une famil e de

« modules » ESP8266 du plus simpliste et

économique ESP-01, très pauvre en terme de

connexions, jusqu’aux modèles très complets

montés sur un circuit imprimé fournissant à la

fois la connectivité en termes d’entrée/sorties,

NOS CONSEILS

beaucoup de mémoire et tout le nécessaire

pour l’alimentation et la programmation via un

port USB. Le plus populaire, à mon avis, est le

modèle ESP-12 également utilisé pour la plate-

POUR ACCÉLÉRER

forme NodeMCU regroupant tout le nécessaire à

l’instar d’une carte Arduino.

VOTRE SYSTÈME !

Ce type de plateforme se trouve très faci-

lement entre 4€ et 5€ (port gratuit) en cher-

chant simplement quelque chose comme

« EPS8266 ESP-12 nodeMCU » sur eBay ou

Amazon. Il faudra ensuite se tourner vers son

environnement Arduino, et en particulier les

NE LE MANQUEZ PAS

préférences, pour ajouter une URL permettant

CHEZ VOTRE MARCHAND

DE JOURNAUX ET SUR :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

21

http://www.ed-diamond.com

pub_aout2017_half.indd 5

22/08/2017 14:23

EN COUVERTURE

LAMPE LUNAIRE

au gestionnaire de cartes de trouver les éléments à instal er : http://arduino.esp8266.com/

stable/package_esp8266com_index.json. Enfin, un tour dans le gestionnaire de carte afin d’instal er le support ESP8266 et vous aurez alors à votre disposition tout le nécessaire pour programmer votre clone NodeMCU/ESP-12 aussi facilement qu’une simple carte Arduino.

Le NodeMCU est une plateforme de développement basée sur l’ESP8266 permettant initialement de développer des programmes dans un langage appelé Lua, mais cel e-ci peut également être utilisée via l’environnement Arduino comme nous al ons le faire.

Ce support pour la plateforme ESP8266 prend en charge presque tous les modèles possibles et imaginables. Et ce, au point où retrouver le bon modèle dans la liste n’est pas Pour ajouter le

support ESP8266

dans votre

environnement de

développement

Arduino, vous

devrez tout d’abord

ajouter une URL où

le gestionnaire de

carte pourra trouver

les éléments.

Une fois que

l’environnement

Arduino sait

où retrouver le

nécessaire, ajouter le

support d’une nouvelle

plateforme est un jeu

d’enfant puisque ceci

se limite à cliquer sur

le bouton « Installer »

dans le gestionnaire

de cartes.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 22

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : préparation

toujours évident. Dans le cas d’un clone de No-

dans ce sens. Ici, le code « actif » de moon.c peut être

deMCU, on hésitera généralement entre l’ESP-12

utilisé sur n’importe quel environnement (Raspberry Pi,

(NodeMCU 0.9) et l’ESP-12E (NodeMCU 1.0).

PC, console, machine ancienne, cartes, microcontrôleur,

Visuel ement, la différence réside dans le logo

etc.) pour peu que l’on prenne en compte ses particulari-

dans le coin supérieur gauche du blindage du

tés et cel e de l’environnement cible.

module : « AI » pour l’ESP-12E et un logo Espres-

Enfin, je soulignerai le fait que récupérer et retra-

sif Inc en forme de boule pour l’ESP-12.

vail er un code est, comme vous pouvez le voir, un

exercice très enrichissant en plus de permettre de re-

4. AVANT DE PASSER À LA poser sur le travail et l’expertise de quelqu’un d’autre.

Ici le code utilisé était placé dans le domaine public,

PRATIQUE...

mais il en va, bien entendu, de même pour le logiciel

libre. Il y a sur le Web une quantité astronomique de

Cet article que je qualifierai de préparatoire

codes et de morceaux de code qui n’attendent que

montre que la récupération d’un code existant est

votre attention pour fonctionner dans vos projets. Si

quelque chose de toujours faisable. Le propre d’un

une bibliothèque toute faite n’existe pas, chercher

langage comme C/C++, utilisé avec Arduino, est

sur d’autres plateformes est souvent une bonne idée

d’être portable. Même si aujourd’hui on pense natu-

avant de vous lancer dans une réécriture complète.

rel ement à des choses comme Java ou Python pour

Dans les sources du système de votre Raspberry Pi,

créer du code portable (facile à adapter sur plusieurs

par exemple, vous avez toutes les chances de trouver

plateformes), le C a été initialement créé justement

votre bonheur, quel que soit votre objectif. . DB

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

23

EN COUVERTURE

LAMPE LUNAIRE

CRÉEZ UNE LAMPE

LUNAIRE : EN ROUTE !

Denis Bodor

Dans l’article précédent, nous avons récupéré et réutilisé un morceau de code permettant de faire tous les calculs importants et avons réglé le problème lié au manque de précision dans ces derniers. Nous sommes maintenant prêts pour mettre tout cela en œuvre, utiliser les fonctions à notre disposition et terminer par la construction de notre lune personnelle lumineuse.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 24

H

ACKABLE MAGAZINE n

E °

n 20

°

h

htttps

:/:// w

w w

w w

w .hac

.hac k

k a

a ble.fr/

Créez une lampe lunaire : en route !

Si vous avez sauté directement à cet article (ouh, vilain lecteur, vilain !), nous avons donc à ce stade décidé d’utiliser une carte NodeMCU/ESP8266 pour notre projet, car celle-ci est très économique et l’environnement de développement associé dispose des bibliothèques, fonctions et types de variables dont nous avons besoin. Nous disposons de fonctions nous permettant d’obtenir, à partir d’une date et heure, tout un tas d’informations sur l’état de la lune. Cependant, seules deux informations nous intéressent ici : la partie actuel ement éclairée de la lune et éventuel ement la date de la prochaine pleine lune (ce n’est qu’une option pour une future évolution du projet).

1. METTONS UN PEU D’ORDRE

La première chose à faire pour intégrer du code « étranger » dans un projet est, à mon sens, de l’isoler sur le reste de notre création. Ceci permet de confiner les éventuels problèmes et de clairement séparer la partie « métier » du reste du projet. Bien entendu, le fait que les fonctions importées soient bien identifiées est une première étape propre au langage utilisé. À ce niveau, l’idée se résume à ne pas pol uer un code qui fonctionne très bien et qui est portable (car non spécifique à une plateforme) avec des appels à des fonctions propres à Arduino.

Mais je pousserais le raisonnement encore plus loin au point de limiter ce code d’emprunt à un fichier spécifique prenant la forme d’un onglet dans l’environnement de développement. Le code importé sera donc placé dans un fichier moonfnct.cpp (oui, c’est du C, mais dans un fichier .cpp, vous al ez comprendre). Lorsqu’on travail e ainsi avec plusieurs fichiers, notre croquis moon placé dans le premier onglet doit pouvoir savoir que les fonctions présentes dans moonfnct.cpp existent.

En effet, le compilateur intégré dans l’environnement transforme les fichiers sources (.c, .cpp) en fichier objet (.o) individuel ement. On se retrouve donc avec plusieurs de ces fichiers qui sont ensuite liés entre eux pour former un binaire (au format ELF). Celui-ci est ensuite transformé en représentation hexadécimale pour être chargé dans la mémoire du microcontrôleur. Le compilateur au moment de compiler le croquis n’a aucune connaissance du code présent dans les autres fichiers, ceci c’est l’affaire de l’éditeur de liens créant un binaire.

Ainsi, notre croquis doit avoir un modèle de ce à quoi ressemblent les fonctions des autres fichiers : des prototypes. Comme ces prototypes de fonctions doivent être partagés entre les fichiers sources, on les place généralement dans un fichier d’entête qui est inclus. Dans notre cas, nous al ons donc créer un nouveau fichier/onglet, appelé moonfnct.h, regroupant les macros utilisées dans le code importé (#define), les inclusions de bibliothèques Arduino (pour l’horloge en temps réel) et les prototypes des fonctions se trouvant dans moonfnct.cpp dont nous avons parlé dans l’article précédent :

// convertir une date en jours juliens en années, mois et jours void jyear(double td, int *yy, int *mm, int *dd);

// convertir une date en jours juliens en heures, minutes et secondes void jhms(double j, int *h, int *m, int *s);

// retourne la date de la nouvelle lune

double meanphase(double sdate, double k);

// retourne la date précise pour une phase lunaire donnée

double truephase(double k, double phase);

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

25

EN COUVERTURE

LAMPE LUNAIRE

// donne des informations sur les prochaines phases lunaires

void phasehunt(double sdate, double phases[5]);

// retourne la date de la prochaine phase spécifiée

double nextmoon(double sdate, double phase);

// calcule l'équation de Kepler

double kepler(double m, double ecc);

// convertit une date standard en jours juliens

double jdate(tmElements_t *t);

// fait de même, mais avec l'heure en plus

double jtime(tmElements_t *t);

// calcul diverses données lunaires

double phase(double pdate, double *pphase, double *mage, double *dist, double *sudist);

Un prototype n’est pas différent d’une déclaration de fonction si ce n’est que le corps de la fonction n’est pas présent et que la déclaration se termine, bien naturel ement, par un point-virgule. Ce fichier d’entête sera ensuite inclus dans moonfnct.cpp et dans notre croquis avec une ligne #include “moonfnct.h” . Notez l’utilisation de guil emets et non de < et > comme pour une bibliothèque, le fichier d’entête en question est « local ».

Je vous fais grâce ici de l’ensemble du code importé qui n’apporte pas grand-chose à la thématique de l’article. Celui-ci est disponible dans les fichiers du magazine présent sur https://github.

com/Hackable-magazine/Hackable18.

2. LE MONTAGE

Le montage complet repose sur une carte NodeMCU, mais n’importe quel e autre carte ESP8266 pourra faire l’affaire du moment qu’el e met effectivement à disposition les sorties adé-

quates ou, du moins, en nombre suffisant. L’ESP8266 fonctionne en 3,3V, mais est tolérant au 5V (ceci est enfin officialisé après de longs mois de doute). Ceci signifie cependant que nous ne pouvons pas utiliser d’horloge temps réel DS1307, mais devons opter pour une DS1338 pouvant être alimenté entre 3V et 5,5V. Les modules à base de DS3231 pourront également être utilisés, à condition d’adapter légèrement le croquis.

Le DS1338 est un composant interfacé en i2c, mais l’ESP8266 ne dispose pas de bus i2c matériel. L’environnement fournit néanmoins une bibliothèque Wire permettant l’utilisation de composants i2c en utilisant deux broches de façon logiciel e (bitbanging). Les broches par défaut sur une carte NodeMCU sont D2 pour le signal SDA et D1 pour SCL.

Pour contrôler des leds, les choses sont un peu plus délicates. Seront utilisés ici des rubans de leds blanches alimentées en +12V afin d’éclairer la lune de l’intérieur (cf. plus loin dans l’article).

Mais le problème n’est pas tant la tension utilisée que le nombre de leds à gérer et donc le courant à manipuler. De plus, l’idée derrière ce projet est également de se laisser l’opportunité de le faire évoluer. L’une des évolutions possibles consisterait, par exemple, à ne pas segmenter la lune en uniquement 8 « quartiers », mais en bien davantage, et ce à une échel e tout autre (une énorme lune de 2m de diagonale par exemple).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 26

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : en route !

Il nous faut donc trouver un moyen de

est stocké en mémoire et peut alors influer

contrôler un nombre arbitraire de leds (ou de

l’état des 8 sorties du composant (notées QP0

morceaux de rubans à leds) avec un minimum

à QP7).

de broches. Une solution serait d’utiliser les

leds WS2812b, mais cel es-ci sont bien plus

• OE (Output Enable) : contrôle l’état global des

chères que les rubans monochromes et sur-

sorties. Si cette broche est placée à l’état lo-

tout, nous n’avons que faire de la couleur, il

gique haut, le contenu du registre est présenté

n’y a aucune raison que notre lune change de

sur les sorties.

teinte. . à moins de calculer les conditions de

La technique permettant d’utiliser ce composant

ces changements en fonction de la position des

est relativement simple : on envoie 8 bits en chan-

astres (mais j’avais dit « pas de planétarium »).

geant l’état de D et en validant chacun d’eux avec

Plutôt que de reposer sur de coûteuses

CP, puis on enregistre le tout dans le registre en

WS2812b, nous pouvons tout simplement

passant STR à l’état haut et, éventuel ement, on

utiliser un registre à décalage comme le

active ensuite les sorties avec OE. Il est toutefois

74HC4094. Celui-ci se contrôle généralement

possible de physiquement relier à la tension d’ali-

via quatre signaux/broches (mais il est possible

mentation la ligne OE afin que les changements

de se passer de certains d’entre eux) :

d’état soient toujours appliqués sur les sorties « en

direct », et nous pourrions économiser une broche.

• D (Data) : permet de présenter une donnée

binaire (0 ou 1) devant s’ajouter dans le

L’avantage de ce type de registre à décalage est

registre.

sa modularité. Non seulement nous pouvons utili-

ser les sorties en 3,3V du NodeMCU pour obtenir

• CP (Clock Pulse) : valide la donnée présen-

des sorties en 5V, mais, de plus, il est possible de

tée sur D. Il s’agit donc d’un envoi en série

chaîner plusieurs 74HC4094 de façon à obtenir 16,

des 8 bits totaux. On présente un bit et on

24, 32. . sorties, toujours contrôlées par seulement

le valide avec CP.

4 broches. L’objectif ici est de diviser la surface

• STR (Strobe) : enregistre les données

lunaire en 8 segments contrôlables, mais nous

présentées dans le composant. L’état des

pourrions très facilement multiplier cette quantité

sorties, déterminées par les 8 bits envoyés

en utilisant plusieurs registres à décalage chaînés.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

27

EN COUVERTURE

LAMPE LUNAIRE

La version platine à essais permettra

de vérifier le concept sur un coin de

bureau et de s’assurer que les leds

soient correctement gérées via le

registre à décalage et l’ULN2803A.

Enfin, comme les sorties du 74HC4094 ne

mique (radiateur) sur le composant. Si vous

sont pas en mesure de contrôler directement

comptez utiliser les longs rubans, il vous

des rubans de leds alimentés en 12V, cel es-ci

faudra remplacer l’ULN2803A par autant de

sont reliées à un ULN2803A. Ce circuit intégré

MOSFET-N IRL520, par exemple, que vous

est composé de huit transistors en montage

aurez de segments à contrôler.

darlington capables d’accepter le courant né-

Nous avons donc ici, en tout, trois tensions

cessaire aux leds jusqu’à une tension de 50V.

en usage. Les sorties du NodeMCU sont en

Notez que les ULN2803A ne fournissent pas le

+3,3V, cel es du 74HC4094 en +5V (tension

courant, l’anode des rubans de leds est donc

d’alimentation du 74HC4094, fournie par le

connectée à la tension d’alimentation et leur

NodeMCU via la broche Vin correspondant à

cathodes à l’ULN2803A.

la tension USB) et +12V permettant d’alimenter

Attention : L’utilisation d’un ULB2803A

les leds. Notez que le schéma ci-contre pré-

dépendra totalement du nombre de leds uti-

sente les rubans de leds comme de simples

lisées et du courant qui circulera. Dans l’état

leds blanches, mais c’est uniquement pour

et avec quelques leds, il est déjà fortement

simplifier visuel ement le montage (ne branchez

recommandé d’ajouter un dissipateur ther-

pas des leds au +12V !).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 28

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : en route !

3. LE CROQUIS PRINCIPAL ET NOS FONCTIONS

« MAISON »

À présent que nous avons mis un peu d’ordre dans le code et défini l’aspect matériel du projet, il ne nous reste plus qu’à ajouter le code de notre croquis pour lier tout cela.

Commençons par la fonction setup() qui nous permet de planter le décor et de détail er ensuite les fonctions utilisées :

#include "moonfnct.h"

#define PIN_D D5

#define PIN_STR D7

#define PIN_CP D6

#define PIN_OE D8

#define TAILLELED 8

void setup() {

// structure pour stocker la date/heure

tmElements_t tm;

// configuration des broches

pinMode(PIN_D, OUTPUT);

pinMode(PIN_STR, OUTPUT);

pinMode(PIN_CP, OUTPUT);

pinMode(PIN_OE, OUTPUT);

// configuration série

Serial.begin(115200);

Serial.println("Go go go");

// lecture de l'horloge

if(!RTC.read(tm)) {

Serial.println("RTC error");

while(1) {;}

}

// petite animation

animled();

delay(100);

// information

Serial.print("Maintenant (GMT): ");

printTmDate(tm);

// affichage illumination et gestion des leds

barmoon(&tm);

// affichage prochaine pleine lune

printnextnew(&tm);

// affichage prochaine nouvelle lune

printnextfull(&tm);

}

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

29

EN COUVERTURE

LAMPE LUNAIRE

Lors de sa mise sous tension, la carte

stockée dans tm.tm_hour,

NodeMCU (ou compatible) tentera de lire la

mais dans tm.Hour. Autre

date et l’heure enregistrée dans l’horloge, juste

changement notable, l’année

après avoir configuré les broches reliées au

est, sur Pi, un nombre d’an-

registre à décalage. Notez ici que dans le cas

nées écoulées depuis 1900

d’un DS1338, la fonction RTC.read() retournera

alors que pour DS1307RTC et

une valeur non nul e en cas de problème, mais

DS3232RTC, l’année de base

que, dans le cas d’une DS3231, ce sera l’inverse.

est 1970. Enfin, nous partons

Cette fonction est mise à disposition à la fois par

du principe, dans l’ensemble

les bibliothèques DS1307RTC et DS3232RTC, per-

du croquis, que l’heure de

mettant respectivement la prise en charge des

l’horloge est cel e du méridien

puces DS1338/DS1307 et DS3231. Il faudra donc

de Greenwich (GMT) et non

faire attention à cette ligne selon l’horloge que

l’heure locale (CET ou CEST).

vous comptez utiliser.

Remarquez que les fonc-

Une fois cet appel fait correctement, tm doit

tions jtime() et jdate() uti-

contenir une date et une heure tel es que lues

lisent également la structure

dans l’horloge. Nous pouvons ensuite nous en ser-

tmElements_t et un petit

vir pour l’afficher, calculer l’activation des leds puis

ajustement sera nécessaire. De

afficher, sur le moniteur série, les dates et heures

plus, afin d’éviter des inclusions

des prochaines pleine lune et nouvel e lune.

éparpil ées dans tous les fichiers

Pour afficher la date lue, nous construisons

du projet, nous avons décidé de

une fonction printTmDate() se contentant de

placer les #include des biblio-

prendre les données dans la structure tm passée

thèques Time et DS1307dans

en argument et à les afficher du mieux possible :

notre fichier moonfnct.h. Or

DS1307RTC.h est un fichier

void printTmDate(tmElements_t tm) {

d’entête C++ (il y a une définition

if(tm.Day<10) Serial.print("0");

de classe à l’intérieur). Comme

Serial.print(tm.Day);

DS1307RTC.h est inclus par

Serial.print("/");

moonfnct.h, lui-même inclus au

if(tm.Month<10) Serial.print("0");

début du fichier du code importé,

Serial.print(tm.Month);

ce dernier ne peut être qu’un

Serial.print("/");

code C++ (le compilateur C ne

Serial.print(tm.Year+1970);

reconnaîtrait pas la directive

Serial.print(" ");

class de DS1307RTC.h). Ce

if(tm.Hour<10) Serial.print("0");

genre de choses peut être tantôt

Serial.print(tm.Hour);

important, en particulier avec du

Serial.print(":");

code importé, certaines choses

if(tm.Minute<10) Serial.print("0");

prennent un sens sensiblement

Serial.print(tm.Minute);

différent en C ou en C++.

Serial.print(":");

if(tm.Second<10) Serial.print("0");

Nous pouvons passer à la fonc-

Serial.println(tm.Second);

tion sans doute la plus importante

}

puisque c’est cel e chargée de

déterminer l’état des leds, mais

Notez que la structure tmElements_t,

également d’afficher une repré-

n’est pas identique à cel e que l’on trouve sur

sentation de ces dernières à des

Raspberry Pi. L’heure, par exemple, n’est pas

fins de mise au point :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 30

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : en route !

void barmoon(tmElements_t *tm) {

// date en jours juliens

double pdatetime;

// variables pour phase()

double pphase, mage, dist, sudist;

// construction de la barre

char moonslide[TAILLELED*3];

memset(moonslide, ‘.', TAILLELED*3);

memset(moonslide+TAILLELED, ‘*', TAILLELED);

// conversion de la date

pdatetime = jtime(tm);

// calculs

double pangle = phase(pdatetime, &pphase, &mage, &dist, &sudist);

// index du premier caractère

int pos = (int)(pangle*TAILLELED*2);

// désactivation sorties leds

digitalWrite(PIN_OE, LOW);

Serial.print("[");

// on boucle sur les positions à afficher

for(int i=pos; i<pos+TAILLELED; i++) {

Serial.write(moonslide[i]);

// donnée : "*" ou led allumée

if(moonslide[i]=='*')

digitalWrite(PIN_D, HIGH);

else

digitalWrite(PIN_D, LOW);

// clock

digitalWrite(PIN_CP, HIGH);

delayMicroseconds(1);

digitalWrite(PIN_CP, LOW);

delayMicroseconds(1);

}

Serial.println("]");

// enregistrement dans le registre

digitalWrite(PIN_STR, HIGH);

delayMicroseconds(1);

digitalWrite(PIN_STR, LOW);

// activation des sorties leds

digitalWrite(PIN_OE, HIGH);

}

L’idée générale derrière cette fonction est la suivante : on compose une « barre » représentant un cycle lunaire complet de nouvel e lune à nouvel e lune comprise, puis on utilise un segment de cette barre pour déterminer l’état des leds. La barre est composée du nombre de leds présentes (TAILLELED) multiplié par trois. On détermine le point de départ sur la barre en fonction de l’angle retourné par la fonction phase() et on compte toujours le même nombre de positions à partir de cet endroit. Cette incrémentation est également facteur de TAILLELED.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

31

EN COUVERTURE

LAMPE LUNAIRE

Pour déterminer

l’illumination de la

lune à partir de l’angle

retourné par l’une des

Pour créer cette barre en mémoire, qui en fait est un tableau, de manière à ne fonctions originales, on

« déroule » simplement

pas avoir à changer le code si nous pilotons davantage de leds, nous utilisons le cycle lunaire dans

également la macro TAILLELED. Nous remplissons ensuite le tableau avec des un tableau avec un

caractères «.« et «*« en utilisant la fonction memeset() prenant en argument un nombre de cellules

emplacement mémoire (un pointeur), un octet et une quantité de mémoire à traiter correspondant au

nombre de leds à

à partir de l’endroit pointé. Ici nous remplissons d’abord tout le tableau de «.« puis contrôler, multiplié

la partie centrale de «*«. Si TAILLELED est égal à 8, alors moonslide[] contien-par trois. Il suffit alors

dra «........********........« (sans \0 puisqu’il ne s’agit pas d’une chaîne de de déterminer où on

caractères).

commence à compter

dans le tableau et lire

Une fois ce tableau rempli dynamiquement, il nous suffit de trouver où com-autant de cellules qu’il

y a de leds.

mencer la lecture parmi les 16 premières cel ules (TAILLELED fois 2 donc) et ceci est possible grâce à la valeur de l’angle retournée, entre 0 et 1, par phase(). Il ne nous reste plus ensuite qu’à comparer un nombre de cel ules correspondant à TAILLELED et le tour est joué, à la fois pour l’affichage dans le moniteur série et pour le registre à décalage où l’état de D dépendra de la présence de «*« dans la cellule lue.

Et enfin nous avons la recherche de la prochaine date de pleine lune et de la nouvel e lune avec des fonctions comme cel e-ci :

void printnextfull(tmElements_t *tm) {

// jour, mois, année, heure, minute, seconde

int dd, mm, yy, hh, mn, ss;

// date en jours juliens

double pdatetime = jtime(tm);

// calcul de la date pour la phase

double next = nextmoon(pdatetime, 0.5);

// décodage de la date à partir des jours juliens

jyear(next, &yy, &mm, &dd);

jhms(next, &hh, &mn, &ss);

// affichage

Serial.print("Prochaine pleine lune = ");

printDate(dd,mm,yy,hh,mn,ss);

}

On utilise simplement la fonction nextmoon() décrite précédemment et placée dans le fichier moonfnct.cpp puis on traite les données obtenues pour les utiliser avec printDate() qui n’est autre qu’une variation de printTmDate() prenant en argument différentes valeurs plutôt qu’une structure tmElements_t.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 32

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : en route !

Bien entendu, s’il s’agit de suivre en temps réel l’évolution du cycle lunaire, on accompagnera le croquis de la fonction loop() reprenant une partie de ce que nous venons de voir pour setup(), mais ajoutant une temporisation entre les relevés de l’horloge : void loop() {

tmElements_t tm;

// lecture de l'horloge

if(!RTC.read(tm)) {

Serial.println("RTC error");

while(1) {;}

}

// information

Serial.print("Maintenant (GMT): ");

printTmDate(tm);

// affichage illumination et gestion des leds

barmoon(&tm);

delay(5000);

}

4. C’EST LE MOMENT

DE BRICOLER !

Nous avons le code, nous avons l’élec-

tronique, il ne nous reste plus qu’à mettre

tout cela en forme pour faire quelque

chose de (vaguement) présentable. Je dois

avouer que je ne suis pas aussi débrouil-

lard dans le thème du bricolage façon

« loisir créatif » que je peux l’être éventuel-

lement dans d’autres domaines, même si

Bonne idée ou

l’intention et la motivation sont bien là.

non, mon idée

initiale était de

L’idée générale du « bricolage du

tout simplement

dimanche » en question est la suivante :

utiliser une balle/

utiliser une bal e gonflable (style bal e de

lune gonflable de

plage) comme support de départ puis la

26cm de diamètre

pour obtenir la

découper pour en faire une hémisphère

texture souhaitée.

« mol e » qui couvrira un support.

Ce modèle précis

disposait même

Le support quant à lui sera construit

d’un orifice à

avec du carton-plume de manière à for-

la base pour

mer des quartiers circulaires col és sur

y glisser une

lumière, mais

une base. Sur cette base seront égale-

c’était insuffisant

ment col ées les lamel es séparant les

pour autre chose

quartiers et, entre el es, seront placés les

qu’un éclairage

rubans de leds contrôlés par le montage.

global.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

33

EN COUVERTURE

LAMPE LUNAIRE

La base de la structure est un

simple morceau de carton de

récupération avec, tracés au

crayon, les emplacements pour les

segments et les rubans de leds.

En termes de construction, la partie la plus

col age au pistolet à col e. Cet outil

délicate est d’estimer correctement le rayon de la

est parfaitement adapté, en parti-

bal e, car celui-ci servira à tracer les formes au

culier en utilisant un grand modèle

compas sur le carton-plume en ayant préalable-

avec des bâtons de 11mm (merci

ment retranché le rayon du morceau de carton

au passage à Sylviane pour le prêt

formant la base de la structure. Les rubans de

de l’engin). La col e est moins facile

leds font 1 centimètre de large et le carton-plume

à doser, mais la température est

4 mm d’épaisseur. Nous avons 8 phases et donc

idéale pour ce type de support.

9 séparations. Ces mesures sont reportées sur un

Les lamel es en carton plume

morceau de carton souple et les « tranches » tra-

ainsi col ées forment une sorte

cées au crayon. On prendra soin éventuel ement

Le câblage préalable

d’accordéon/éventail qu’on pourra

des segments de

de bien repasser sur les traits au stylo à bil e pour

déplier pour former une demi-

ruban de leds permet

marquer le support et faciliter la pliure.

de vérifier leur

sphère grossière. Les segments

fonctionnement et,

Après plusieurs essais et tâtonnements, on

de ruban possèdent généralement

en même temps, de

arrive à un équilibre correct et on peut débuter le

un adhésif double face permettant

faciliter l’assemblage.

le col age au milieu de chaque

quartier. J’ai trouvé plus pratique

de souder les anodes des rubans

entre el es ainsi que les câbles

de connexion avant col age, en

pratiquant des ouvertures au

cutter aux endroits stratégiques

sur la base du support. L’idée de

jongler avec le fer à souder entre

les morceaux de carton-plume ne

me semblait pas très pratique, pas

plus que de tenter de placer les

lamelles après les leds.

On peut alors tester le fonction-

nement en plaçant, par dessus,

la demi-sphère souple obtenue à

partir de la bal e. Le résultat que

j’ai obtenu n’est pas optimal, car la

matière utilisée est destinée à être

tendue par la pression de l’air. En

l’absence de gonflage, la courbure

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 34

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez une lampe lunaire : en route !

Mis à plat après collage des séparations,

nous obtenons nos huit phases lunaires

individuellement activables. Le collage au

pistolet à colle semble fournir une adhésion

solide et durable.

En « dépliant » la structure, on obtient

précisément le résultat attendu : une demi-

sphère segmentée en mesure de diffuser une

lumière parfaitement diffuse et contrôlée.

n’est pas parfaite et, de plus, les

soudures des différentes parties de

la surface sont bien trop visibles.

Le résultat est un peu difforme,

mais acceptable. . de loin.

Une autre approche possible

sera de travail er en deux dimen-

sions à partir d’une photo de la

lune, en plaçant les leds à l’arrière.

On obtiendrait alors un disque

lunaire plus facile à travail er, mais

les leds seraient, quant à el es,

plus difficiles à placer pour obtenir

un rendu réaliste (il faudrait suivre

les courbes des phases de la lune

avec des rubans relativement

rigides).

Enfin, on peut également ache-

ter une lune en plastique, comme

un globe terrestre, qu’on pourra

ensuite massacrer à loisir. Le coût

cependant sera plus important,

car ici la bal e et le carton-plume

sont l’affaire d’une douzaine d’eu-

ros seulement.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

35

EN COUVERTURE

LAMPE LUNAIRE

circuits intégrés supplémen-

taires pour minimiser l’utilisa-

tion des broches.

Mon approche consistant à

éviter l’utilisation de leds WS2812b

dites Neopixels était toute person-

nel e, mais, là encore, il y a plus

d’une évolution possible. Ceci per-

mettrait non seulement de choisir

la ou les couleurs utilisées, mais

aussi, et surtout de faire facilement

varier l’intensité lumineuse de l’en-

semble (faire de la PWM logiciel e

avec un registre à décalage n’est

pas impossible, mais cela reste

délicat). Si, de plus, on connecte

une photorésistance (LDR) sur la

broche A0 du NodeMCU, il sera

même possible d’ajuster automati-

quement la luminosité en fonction

de l’éclairage d’une pièce. Idéal

pour une chambre. .

Enfin, la fonctionnalité princi-

pale généralement recherchée

lorsqu’on en arrive à opter pour

l’ESP8266 est ici laissée totale-

ment de côté : le Wifi. Il y a suffi-

Le résultat final avant

samment d’espace en flash et en

collage de la surface

n’est pas parfait et

mérite encore un peu

5. PERSPECTIVES

RAM pour prévoir, par exemple,

un serveur web embarqué pré-

de travail. Lorsque

Ce croquis comme le montage lui-même

sentant différentes informations

c’est la pleine lune,

est prévu pour être facile à étendre et complé-

lunaires en temps réel, voire

par exemple, on

distingue clairement

té par différentes fonctionnalités. Il n’est, par

permettant différents réglages ou

les segments, tout

exemple, pas difficile d’imaginer multiplier les

encore la modification de la date

autant que les

leds et donc le nombre de segments de lune

et heure. On pourra aussi totale-

différents morceaux qui

contrôlables. Dans l’état, il suffit d’ajouter un

ment oublier la RTC et récupérer

composent la surface

initiale de la balle. Il

ou plusieurs registres à décalage chaînés et

l’information temporel e sur le net

n’est pas impossible

d’ajuster TAILLELED en conséquence. .

auprès d’un serveur NTP ou autre.

que je finisse par

opter pour une autre

De la même manière, les fonctions

Ce qui aura commencé comme

approche et revoie ma

printnextfull() et printnextnew()

un simple projet de décoration

copie dans un proche

ne font qu’envoyer du texte sur le moni-

pourrait donc se transformer rapi-

avenir.

teur série. On pourra rapidement ajouter

dement en quelque chose de plus

un afficheur LCD alphanumérique (type

complexe, voire de totalement dif-

HD44780) pour présenter ces informations.

férent. Mais cela sera laissé à votre

Bien entendu, il faudra utiliser un afficheur

imagination et à votre envie de

avec une interface i2c ou jongler avec des

torturer le concept initial. . DB

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 36

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

CODE PR

H

OM

AC

O

K

:

ABLE

ère

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

37

EMBARQUÉ & INFORMATIQUE

LEDS/CPU

VISUALISEZ LA CHARGE

PROCESSEUR DE VOTRE

PI AVEC PIMORONI

PIGLOW

Yann Morère

La petite carte Piglow de chez Pimoroni [1] embarque 18 leds de couleurs pilotables individuellement. Elle peut être utilisée pour réaliser une ambiance lumineuse autour de votre Raspberry Pi, mais aussi pour vous donner visuellement des informations sur votre système. Ainsi, dans cet article nous allons la mettre en œuvre pour notifier la charge CPU globale de votre framboise sur Raspbian et Recalbox.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 38

HACKABLE MAGAZINE n°20

http://www.hackable.fr/

Visualisez la charge processeur de votre Pi avec Pimoroni Piglow Le module Piglow est

Figure 2

une carte petit format

(36mm x 34mm x

7mm) fabriquée par la

société Pimoroni pour

la Raspberry Pi. El e est com-

posée de 18 leds de couleurs

contrôlables individuel ement. Il

ne s’agit pas de leds RGB, mais

de 3 séries de 6 leds de couleurs

différentes disposées en spirale

(cf. figure 1). Du centre de la spi-

rale vers l’extérieur, les couleurs

sont disposées comme suit :

Crédits : https://shop.pimoroni.

com/products/piglow.

blanc, bleu, vert, jaune, orange

et rouge.

Le circuit intégré responsable

de la gestion des leds est le

SN3218, un microchip PWM

Prévue au départ pour le Raspberry Pi de première géné-

8-bits à 18 canaux. Il commu-

ration, el e possède un connecteur 26 broches. Cependant

nique avec le Raspberry Pi par

el e est utilisable avec toutes les versions de Raspberry Pi

l’intermédiaire du bus I2C, à

(cf. figure 2).

l’adresse 0x54. Les leds peuvent

se voir attribuer une valeur com-

Son instal ation est des plus simples, il suffit de l’enficher

prise entre 0 et 255 pour régler

sur le GPIO de votre Raspberry Pi. Si vous désirez déporter

leur intensité.

l’instal ation de cette carte, le câblage utile est disponible à l’adresse [2].

1. MISE EN ŒUVRE

AVEC RASPBIAN

La manière la plus simple de mettre

en œuvre le module piglow est d’utiliser

la bibliothèque écrite en python par les

fabricants de la carte [3]. Cependant,

el e peut être utilisée avec de nombreux

autres langages/bibliothèques : Scratch,

WiringPi, Node.js, Golang, Java.

Dans la suite, nous utiliserons la

bibliothèque objet [4] à la place de la

bibliothèque originale. Mais avant cela, il

faut instal er quelques dépendances sur

notre distribution fraîchement instal ée.

Après avoir téléchargé la dernière

Figure 1

version de la distribution Raspbian

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

39

EMBARQUÉ & INFORMATIQUE

LEDS/CPU

Jessie Lite à l’adresse [5], on commence par créer la carte SD : $ sudo dd bs=4M if=2017-04-10-raspbian-jessie-lite.img of=/dev/sdc Une fois le système démarré, nous al ons instal er le serveur SSH Dropbear pour interagir à distance avec notre Raspberry Pi (NDLR : Dropbear est plus léger que le serveur OpenSSH

instal é (mais non activé) par défaut. Si vous préférez OpenSSH, ajoutez simplement un fichier ssh avec un contenu quelconque sur la partition FAT de la carte SD avant de démarrer votre Pi, le serveur SSH sera alors automatiquement activé (configuration headless)). On en profite pour instal er le clavier français pour plus de facilité et des utilitaires pour le bus I2C : $ sudo apt-get install dropbear console-data i2c-tools

$ sudo loadkeys fr

Par défaut, le serveur Dropbear n’est pas actif. Il faut modifier son fichier de configuration

/etc/default/dropbear pour une activation au démarrage du système : $ sudo nano /etc/default/dropbear

et on le modifie comme suit :

# disabled because OpenSSH is installed

# change to NO_START=0 to enable Dropbear

NO_START=0

Ensuite, il s’agit activer le support du bus I2C par le noyau. Pour cela, il faut modifier le fichier

/boot/config.txt comme suit :

$ sudo nano /boot/config.txt

et l’on ajoute :

#activate i2c

dtparam=i2c1=on

dtparam=i2c_arm=on

Ensuite on modifie le fichier /etc/modules.conf :

$ sudo nano /etc/modules.conf

et l’on y ajoute :

i2c-bcm2708

i2c-dev

On redémarre ensuite notre Raspberry Pi et l’on vérifie que le bus I2C est bien géré. La commande suivante permet de détecter les périphériques I2C :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 40

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Visualisez la charge processeur de votre Pi avec Pimoroni Piglow $ sudo i2cdetect -y 1

0 1 2 3 4 5 6 7 8 9 a b c d e f

00: -- -- -- -- -- -- -- -- -- -- -- -- --

10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

70: -- -- -- -- -- -- -- --

Bien que le module Piglow soit instal é et utilise l’adresse 0X54, il n’apparaît pas, cependant il fonctionnera très bien.

On instal e ensuite la bibliothèque dédiée à notre petite carte par l’intermédiaire du dépôt git : $ sudo apt-get install git

$ apt-get install i2c-tools python-smbus python-sn3218

$ git clone https://github.com/Boeeerb/PiGlow.git

Tout est prêt pour pouvoir utiliser votre piglow. On peut tester l’un des exemples fournis avec la bibliothèque. Par exemple, le programme cpu.py permet d’afficher en temps réel la charge cpu de votre Raspberry Pi en al umant un certain nombre de leds avec plus ou moins d’intensité.

Afin de pouvoir utiliser ce programme, il est nécessaire d’instal er des utilitaires supplémentaires : $ sudo apt-get install python-psutil

On lance le programme dans une première console à l’aide la commande : $ sudo python cpu.py

Note : Il est nécessaire d’être administrateur afin de bénéficier des droits requis pour l’utilisation du bus I2C.

Pour tester le programme avec le cpu en charge, on pourra utiliser le programme sysbench dans une autre console :

$ sudo apt-get install sysbench

Il s’utilise comme suit :

$ sysbench --test=cpu --cpu-max-prime=20000 run

pour un système mono cœur.

Dans le cas d’un Raspberry Pi 3, il peut être intéressant d’utiliser l’option --num-threads afin de mettre en charge tous les cœurs du cpu.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

41

EMBARQUÉ & INFORMATIQUE

LEDS/CPU

$ sysbench --test=cpu --cpu-max-prime=20000 --num-threads=4 run Ceci permet de tester différents niveaux de charges CPU et le comportement associé du programme cpu.py en changeant le nombre de threads utilisés (de 1 à 4).

2. L’API PYTHON DE PIGLOW

La classe PiGlow ne contient que 14 méthodes qui permettent de contrôler complètement le module.

Votre programme python devra toujours commencer par l’importation de la classe et l’instancia-tion d’un objet de type PiGlow :

from piglow import PiGlow

piglow = PiGlow()

Cet objet sera ensuite utilisé pour accéder au pilotage des leds.

Ces dernières sont adressables soit par leur couleur, soit par leur numéro. L’intensité d’éclairage est réglable par une valeur entière comprise en 0 et 255. El es peuvent aussi être pilotables par groupe de 6, car el es sont disposées sur 3 « bras » en spirale.

Le tableau ci-dessous résume l’ensemble des méthodes utilisables : Méthodes

Options/Définition

piglow.colour([1-6],[0-255])

1=Blanc, 2=Bleu, 3=Vert, 4=Jaune, 5=Orange, 6=Rouge

piglow.colour([color],[0-255])

"white", "blue", "green", "yellow", "orange", "red"

piglow.white([0-255])

Contrôle toutes les leds blanches

piglow.blue([0-255])

Contrôle toutes les leds bleues

piglow.green([0-255])

Contrôle toutes les leds vertes

piglow.yellow([0-255])

Contrôle toutes les leds jaunes

piglow.orange([0-255])

Contrôle toutes les leds oranges

piglow.red([0-255])

Contrôle toutes les leds rouges

piglow.all([0-255])

Contrôle toutes les leds

piglow.led([1-18],[0-255])

Contrôle une led individuellement par son numéro

piglow.led1-led18([0-255])

Contrôle une led individuellement par sa propre fonction

piglow.arm([1-3],[0-255])

Contrôle un bras de leds du module via son numéro

piglow.arm1([0-255])

Contrôle le bras supérieur

piglow.arm2([0-255])

Contrôle le bras de droite

piglow.arm3([0-255])

Contrôle le bras de gauche

L’étude des exemples fournis avec la classe vous permettra facilement d’écrire vos propres programmes. La page [4] présente aussi une méthode adaptée à Raspbian pour lancer au démarrage un programme python qui utilise le module PiGlow.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 42

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Visualisez la charge processeur de votre Pi avec Pimoroni Piglow Voyons maintenant comment l’intégrer à la distribution de retrogaming Recalbox pour avoir une information lumineuse en temps réel correspondant à la charge du système pendant son exécution.

3. MISE EN ŒUVRE AVEC RECALBOX

Recalbox [6] n’est pas basée sur une distribution Linux à l’instar de Retropie qui utilise Raspbian par exemple. El e se base sur Buildroot qui permet de générer une distribution

« Linux from scratch » optimisée en fonction de l’architecture et possédant les seuls paquets nécessaires à la destination du système. Ainsi, dans Recalbox, il n’existe pas de gestionnaire de paquets pour l’instal ation d’applications supplémentaires. Seuls les logiciels voulus par l’équipe de développement seront présents. Ainsi il ne sera pas aisé d’ajouter facilement de nouvel es fonctionnalités sans passer par le développement d’un « package » à intégrer dans le système Buildroot de Recalbox. Je vous renvoie à la lecture de l’article dédié à Recalbox dans le hors-série Linux Pratique n° 38 pour une présentation détail ée.

Dans la suite, je considère que votre système Recalbox est opérationnel, enregistré sur votre réseau et que vous pouvez vous y connecter via SSH.

Par chance, Recalbox utilise python pour sa gestion interne, et de nombreux utilitaires et bibliothèques sont déjà présents sur le système. Pour mettre en œuvre notre module PiGlow, il ne sera pas nécessaire de réaliser un développement conséquent, mais seulement d’ajouter quelques fichiers et d’en modifier certains.

Dans la suite, je vais prendre l’exemple d’un petit boîtier de retrogaming à la forme d’une NES : pitendo. Ce boîtier est disponible sur « thingiverse » à l’adresse [7]. Ce dernier embarque 2 boutons, qui permettent de réinitialiser le Raspberry Pi, mais aussi de l’éteindre proprement (cf. figure 3). Ces boutons sont directement câblés sur le GPIO et sont gérés nativement par Recalbox.

Figure 3

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

43

EMBARQUÉ & INFORMATIQUE

LEDS/CPU

Cependant, le câblage natif utilisé par les scripts utilise les GPIO dédiés au bus I2C qui nous est nécessaire (GPIO 2 et 3 sur les pins 3 et 5), cf. [8]. Il nous faudra donc modifier les scripts de Recalbox pour utiliser d’autres GPIO pour les boutons et ainsi libérer le bus I2C.

3.1 Mise en œuvre du bus I2C sur Recalbox

On commence par activer le bus I2C sur le système en modifiant le fichier /boot/config.txt comme suit.

#activate i2c

dtparam=i2c1=on

dtparam=i2c_arm=on

Pour cela, on se connecte en ssh sur le système à l’aide de l’identifiant root et du mot de passe recalboxroot.

$ ssh root@IPdeRecalbox

Un fois connecté, il est possible de passer temporairement les partitions en lecture/écriture pour réaliser les modifications par les commandes suivantes :

# mount -o remount, rw /boot

# mount -o remount, rw /

On modifie ensuite le fichier /etc/modules.conf en ajoutant : i2c-bcm2708

i2c-dev

On redémarre le système et on vérifie si le bus i2C est bien actif par l’intermédiaire de la commande suivante :

$ sudo i2cdetect -y 1

3.2 Mise en œuvre du module PiGlow

Pour pouvoir utiliser le module sur Recalbox, il est nécessaire d’ajouter la classe piglow, mais aussi la bibliothèque de support du composant sn3218. Cette dernière est disponible à l’adresse [9].

On commence par créer un répertoire, puis on télécharge les fichiers nécessaires :

# mkdir piglow

# cd piglow

# wget https://github.com/pimoroni/sn3218/blob/master/library/sn3218.py

# wget https://github.com/pimoroni/piglow/blob/master/library/piglow.py

# wget https://github.com/Boeeerb/PiGlow/blob/master/Examples/cpu.

pyOn peut alors tester rapidement le fonctionnement de notre module par la commande suivante :

# python ./cpu.py

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 44

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Visualisez la charge processeur de votre Pi avec Pimoroni Piglow Normalement, le module devrait s’al umer et donner une image de la charge cpu de votre système.

Lors de mes essais, les réglages par défaut du fichier cpu.py ne sont pas adaptés pour un Raspberry Pi3 et « l’animation » de la charge CPU est assez pauvre en couleur. Après quelques essais, j’ai modifié le programme comme suit (cf. figure 4) :

##########################################################

## Show your current CPU usage on your PiGlow! ##

## ##

## Requires psutil - sudo apt-get install python-psutil ##

## ##

## Example by Jason - @Boeeerb modification ian57 ##

##########################################################

from piglow import PiGlow

from time import sleep

import psutil

piglow = PiGlow()

piglow.all(0)

while True:

cpu = psutil.cpu_percent()

piglow.all(0)

if cpu < 8:

piglow.red(5)

elif cpu < 14:

piglow.red(10)

piglow.orange(40)

elif cpu < 22:

piglow.red(20)

piglow.orange(60)

piglow.yellow(60)

elif cpu < 27:

piglow.red(30)

piglow.orange(80)

piglow.yellow(80)

piglow.green(80)

elif cpu < 32:

piglow.red(40)

piglow.orange(100)

piglow.yellow(100)

piglow.green(100)

piglow.blue(100)

elif cpu < 36:

piglow.red(40)

piglow.orange(100)

piglow.yellow(100)

piglow.green(100)

piglow.blue(100)

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

45

EMBARQUÉ & INFORMATIQUE

LEDS/CPU

piglow.white(100)

elif cpu < 40:

piglow.all(120)

elif cpu < 50:

piglow.all(140)

elif cpu < 60:

piglow.all(160)

elif cpu < 70:

piglow.all(180)

elif cpu < 80:

piglow.all(200)

elif cpu < 90:

piglow.all(220)

else:

piglow.all(250)

sleep(0.1)

J’ai aussi réduit la temporisation afin que l’affi-

chage soit plus réactif.

3.3 Mise en route au démarrage

Figure 4

Afin que notre programme d’affichage de charge

CPU fonctionne dès le démarrage du système, nous

al ons créer le fichier /etc/init.d/S99piglow

contenant le script suivant :

#!/bin/sh

case "$1" in

start)

printf "Starting piglowcpu ... "

# Wait for emulationstation or Kodi, but not more than 20 seconds count=0

while [[ ! -f "/tmp/emulationstation.ready" && ! -e "/var/run/

kodi.msg" && $count -lt 20 ]]; do

sleep 1

((count++))

done

start-stop-daemon -S -q -m -b -p /var/run/piglowcpu.pid --exec python /recalbox/share/system/piglowcpu/cpu2.py -- -n

#python /recalbox/share/system/piglowcpu/cpu.py echo "done."

;;

stop)

printf "Stopping piglowcpu ..."

python /recalbox/share/system/piglowcpu/alloff.py start-stop-daemon -K -q -p /var/run/piglowcpu.pid echo "done."

;;

restart)

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 46

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Visualisez la charge processeur de votre Pi avec Pimoroni Piglow $0 stop

sleep 1

$0 start

;;

*)

echo "usage: $0 {start|stop|restart}"

;;

esac

Celui-ci fait intervenir les fichiers cpu.pu et alloff.py. Ce dernier permet d’éteindre toutes les leds de la carte à l’extinction du système :

###################

## All Off ##

## ##

## Ian57 ##

###################

from piglow import PiGlow

piglow = PiGlow()

piglow.all(0)

Pour une bonne intégration à Recalbox, il faut retarder la mise en route du programme qui utilise la carte piglow. En effet si le programme de gestion d’affichage de la charge CPU est lancé trop tôt, il se termine prématurément. Une interaction avec un autre programme doit être à l’origine de ce dys-fonctionnement.

Il est donc lancé en dernier (S99) depuis /etc/init.d et son activation est retardée de 20s maximum grâce aux lignes suivantes :

while [[ ! -f "/tmp/emulationstation.ready" && ! -e "/var/run/kodi.msg" && $count -lt 20 ]]; do

sleep 1

((count++))

done

Le démarrage et l’arrêt de notre programme d’affichage de charge CPU sont maintenant automati-sés sur Recalbox.

3.4 Mise en œuvre des boutons du boîtier Pitendo

Comme indiqué précédemment, la gestion native de ces boutons entre en conflit avec le bus I2C.

Il est donc nécessaire de déplacer le câblage de ces derniers vers des broches GPIO non utilisées.

Le support de ces boutons par Recalbox est assuré par la configuration d’une variable dans le fichier recalbox.conf :

# ------------ A - System Options ----------- #

# Uncomment the system.power.switch you use

;system.power.switch=ATX_RASPI_R2_6 # http://lowpowerlab.com/

atxraspi/#installation

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

47

EMBARQUÉ & INFORMATIQUE

LEDS/CPU

;system.power.switch=MAUSBERRY # http://mausberry-circuits.

myshopify.com/pages/setup

;system.power.switch=REMOTEPIBOARD_2003 # http://www.msldigital.com/

pages/support-for-remotepi-board-2013

;system.power.switch=REMOTEPIBOARD_2005 # http://www.msldigital.com/

pages/support-for-remotepi-board-plus-2015

;system.power.switch=WITTYPI # http://www.uugear.com/witty-pi-realtime-clock-power-management-for-raspberry-pi

;system.power.switch=PIN56ONOFF # https://github.com/recalbox/

recalbox-os/wiki/Add-a-start-stop-button-to-your-recalbox-(EN)

;system.power.switch=PIN56PUSH # https://github.com/recalbox/

recalbox-os/wiki/Add-a-start-stop-button-to-your-recalbox-(EN)

;system.power.switch=PIN356ONOFFRESET # https://github.com/recalbox/

recalbox-os/wiki/Add-a-start-stop-button-to-your-recalbox-(EN) system.power.switch=PIN356PUSHRESET # https://github.com/recalbox/

recalbox-os/wiki/Add-a-start-stop-button-to-your-recalbox-(EN) Plusieurs systèmes de mise en route/arrêt sont supportés par la distribution. Dans notre cas, nous al ons activer la gestion des boutons poussoirs (« temporary switch ») en décommentant la dernière ligne.

Le script de gestion des boutons est lancé par le fichier /etc/init.d/S92switch qui utilise le fichier /recalbox/scripts/powerswitch.sh. Ce dernier définit les fonctions à utiliser en fonction de la méthode choisie dans le fichier recalbox.conf : dans notre cas c’est la fonction pin356_

start() qui sera lancée :

pin356_start()

{ mode=$1

python /recalbox/scripts/rpi-pin356-power.py -m "$mode" & pid=$!

echo "$pid" > /tmp/rpi-pin356-power.pid

wait "$pid"

}pin356_stop()

{ if [[ -f /tmp/rpi-pin356-power.pid ]]; then

kill `cat /tmp/rpi-pin356-power.pid`

fi

}

Cette dernière fait appel au script python /recalbox/scripts/rpi-pin356-power.py. Par défaut, il utilise les broches 3, 5 et 6 (GPIO 2, 3 et masse) qui sont utilisées par le module Piglow en I2C. Il nous faut donc utiliser de nouvel es broches. On choisira ici 29, 30 et 31, (GPIO5, masse et GPIO 6). On modifie alors le script rpi-pin356-power.py comme suit : import RPi.GPIO as GPIO

import time

import os

import thread

import argparse

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 48

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Visualisez la charge processeur de votre Pi avec Pimoroni Piglow parser = argparse.ArgumentParser(description='power manager') parser.add_argument("-m", help="mode onoff or push", type=str, required=True) args = parser.parse_args()

mode = args.m

#Unusable when I2C is enable and used by Piglow

#POWERPLUS = 3 #GPIO 3 on Pin 5

#RESETPLUS = 2 #GPIO 2 On Pin 3

POWERPLUS = 5 #GPIO 5 on Pin 29

RESETPLUS = 6 #GPIO 6 On Pin 31

LED = 14

On va ici utiliser les GPIO 5 et 6 sur les pins 29 et 31 du GPIO, et 30 pour la masse. Après un redé-

marrage, tout devrait fonctionner comme désiré.

Note : Nous avons ici modifié des scripts systèmes. Lors d’une mise à jour de Recalbox, ils seront remplacés par une nouvelle version et la modification sera à effectuer à nouveau pour avoir un module Piglow et des boutons fonctionnels.

CONCLUSION

En guise de conclusion, je vous renvoie vers la vidéo YouTube [10] qui présente le résultat de l’in-tégration du module Piglow dans un boîtier Pitendo embarquant un Raspberry Pi 3. Maintenant c’est à vous de jouer. YM

LIENS

[1] https://shop.pimoroni.com/products/piglow

[2] https://fr.pinout.xyz/pinout/piglow

[3] https://github.com/pimoroni/piglow

[4] https://github.com/Boeeerb/PiGlow

[5] https://www.raspberrypi.org/downloads/raspbian/

[6] http://www.recalbox.com/

[7] https://www.thingiverse.com/thing:2192614

[8] https://github.com/recalbox/recalbox-os/wiki/Add-a-start-stop-button-to-your-recalbox-

%28EN%29

[9] https://github.com/pimoroni/sn3218/blob/master/library/sn3218.py

[10] https://www.youtube.com/watch?v=xMrP1M-8r0o

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

49

EMBARQUÉ & INFORMATIQUE

SENSE HAT

SENSE HAT POUR

DONNER DE LA COULEUR

ET PLUS À VOTRE

RASPBERRY PI

Yann Morère

Les modules d’extension pour notre framboise préférée sont de plus en plus nombreux : carte son, carte de puissance pour moteur pas à pas, contrôleur de lumière et d’effets spéciaux, contrôles arcade, cartes relais, écran TFT, etc. Nous allons ici nous intéresser à un module qui embarque une matrice 8x8 de leds RGB ainsi que des capteurs environnementaux : la carte Sense HAT .Voyons comment la mettre en œuvre.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 50

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi Le GPIO (General Le but ici est de réaliser l’affichage d’informations Purpose Input Output)

venant des capteurs environnementaux, mais aussi des

du Raspberry Pi nous

animations de « sprites ». Le gros intérêt de ce type de

permet de connecter

matériels est qu’il est pilotable via des scripts Python et

différents matériels et

une API dédiée très simple d’accès.

les piloter suivant différentes mé-

thodes par l’intermédiaire des en-

trées/sorties (Digital IO, PWM) et

Note : Dans un jeu vidéo, un sprite est un élément graphique

des bus de données disponibles :

qui peut se déplacer sur l’écran. En principe, un sprite est en SPI, I2C, DPI. Cette ouverture

partie transparent, et il peut être animé par l’intermédiaire de vers le monde réel a permis d’ini-plusieurs images matricielles qui s’affichent les unes après

tier de nombreux projets autour de

les autres.

cartes d’extension dont chacune

couvre un besoin bien particulier :

Dans la suite, la distribution utilisée sur le Raspberry

son, IoT, moteur pas à pas, etc.

Pi 3 de test est une Raspbian Lite d’avril 2017 [8].

On retrouve de nombreux produits

chez Adafruit [1], Pimoroni [2],

mais aussi des modules réalisés

Note : Des notions de programmation en langage python

par l’intermédiaire de finance-

sont un plus pour suivre facilement l’article.

ments participatifs [3-4]. Ces

cartes qui se connectent au GPIO

et de fait, se positionnent au-des-

sus du Raspberry Pi, sont nom-

1. SENSE HAT ET LA MISSION

mées des « Hat » (chapeaux). On

ASTROPI

retrouvera une liste importante,

mais non exhaustive de modules

Le module Sense HAT ne peut pas être dissocié de

à l’adresse [5]. Tous ces matériels

la mission AstroPi [9] (le module fut d’ailleurs nommé

contribuent à faire du Raspberry

ainsi au départ). Deux Raspberry Pi (appelés Astro Pis)

Pi un couteau suisse de l’informa-

ont été envoyés dans la Station Spatiale Internationale

tique embarquée.

(ISS) dans le cadre de la mission (Principia) de l’astro-

naute britannique de l’ESA Tim Peake. Ils sont tous deux

Nous al ons dans ces lignes

équipés d’un module Sense

nous concentrer sur la carte

HAT qui peut mesurer l’envi-

Sense HAT [6] qui embarque une

ronnement à l’intérieur de

matrice 8x8 de LEDs RGB ainsi

la station, détecter la façon

que des capteurs environnemen-

dont la station se déplace

taux, une centrale inertiel e et un

dans l’espace et récupérer le

joystick.

champ magnétique terrestre.

Chaque Astro Pi est égale-

ment équipé d’un type de

Note : La carte Unicorn Hat

caméra différent : Izzy (eh

[7] embarque elle aussi une

oui, ils ont des noms) pos-

matrice de 64 LEDs RGB et

sède une caméra infrarouge

aurait pu être utilisée. Sa

et Ed dispose d’une caméra

mise en œuvre fera peut-

dans le spectre visible stan-

être l’objet d’un prochain

dard. Chaque Raspberry Pi

Figure 1

article.

est placé dans une coque

adaptée (cf. figure 1).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

51

EMBARQUÉ & INFORMATIQUE

SENSE HAT

En utilisant les capteurs de la Sense HAT, Tim a exé-

ST LSM9DS1. Ce circuit

cuté des expériences créées et codées par des étudiants

comporte un accéléromètre

du Royaume-Uni dans la première phase de la mission.

3D, un gyroscope 3D et un

Sept équipes ont eu la chance d’envoyer leur code dans

magnétomètre 3D combi-

l’espace. Leurs expériences se présentent sous la forme

nés dans une seule puce.

de programmes Python écrits et testés par les étudiants

Il s’agit du composant qui

(jeux, temps de réaction, détection de personnes, détec-

se trouve juste au-dessus

tion de rayonnement grâce aux caméras). Les programmes

du texte « ACCEL/GYRO/

gagnants ont décol é de la base aérienne de Cap Canaveral

MAG ». Le LSM9DS1 peut

en Floride en décembre 2015 et sont arrivés à l’ISS quelques

mesurer des accélérations

jours avant Tim. Les Astro Pis ont été instal és à l’intérieur

de ±2g/±4g/±8g/±16g, un

du module européen Columbus. Les résultats de la première

champ magnétique de

phase sont disponibles à l’adresse [10]. Leur mission se

±4/±8/±12/±16 gauss ainsi

poursuit avec la Mission Proxima où des écoliers de toute

qu’une vitesse angulaire de

l’Europe ont rédigé des programmes pour l’astronaute fran-

±245/±500/±2000 degrés/

çais Thomas Pesquet de l’ESA [11].

seconde. Il est donc capable

de fournir des informations

2. LE MODULE SENSE HAT EN

de tangage, roulis et lacet sur

les mouvements qu’il subit.

DÉTAIL

• Un capteur d’humidité relative

et capteur de température :

Les fonctionnalités principales de la carte Sense HAT sont

référence ST HTS221. Ce

mises en valeur dans la figure 2.

capteur fournit le pourcentage

On y retrouve les composants suivants [12] :

d’humidité relative ainsi que la

température en degrés centi-

Sur le bus I2C :

grades. Il s’agit du composant

• Une centrale de mesure inertiel e (Inertial Measurement

qui est placé en dessous du

Unit en anglais, souvent appelée IMU) de référence

texte « HUMIDITY ».

Figure 2

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 52

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi

• Un capteur de pression

pilote de LED à courant constant (un LED2472G) et

barométrique et capteur de

de l’ATTiny88 Atmel exécutant un firmware qui gère

température : référence ST

l’affichage 8x8 en RVB avec une résolution

LPS25H (« PRESSURE »

de 15 bits.

sur la carte). Ce circuit peut

• Un joystick qui permettra, en cas d’absence de

mesurer une pression abso-

clavier et de souris, de piloter les applications pré-

lue comprise entre 260 et

sentes sur le Raspberry Pi. Il dispose de 5 contacts :

1260 hPa avec une précision

haut, bas, droite, gauche et clic vertical. Il s’agit du

d’1Pa. Il intègre une compen-

modèle Alps SKRHABE010. Il pourra émuler les

sation de la température et

touches de direction du clavier et la touche Entrée

un convertisseur analogique-

avec le clic central.

numérique 24 bits.

Pilotés par un microcontrôleur

Atmel Tiny88 :

3. INSTALLATION MATÉRIELLE

• Une matrice 8x8 de 64 LEDs.

ET LOGICIELLE

Sans écran connecté, elle

peut être utilisée comme

L’instal ation matériel e consiste simplement à enficher

un afficheur. La matrice

la carte sur le connecteur GPIO. Il est possible de mettre

de LED est pilotée par une

en place les entretoises et les vis fournies avec le module

combinaison formée d’un

afin que ce dernier soit fixé solidement.

Figure 3

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

53

EMBARQUÉ & INFORMATIQUE

SENSE HAT

Cette carte ayant vu le jour en 2015, el e est très bien documentée et supportée par la distribution Raspbian. L’instal ation de ses composants (bibliothèque de gestion de la Sense HAT et de gestion d’image) est très simple :

$ sudo apt-get update

$ sudo apt-get install sense-hat

$ sudo apt-get install python-pil

$ sudo reboot

Note : Si vous désirez utiliser la version 3 de python pour exécuter vos programmes, il faudra installer les paquets idoines : python3-sense-hat et python3-pil:armhf disponibles par défaut dans la distribution.

Une fois le Raspberry Pi redémarré, il est possible de tester le bon fonctionnement de la Sense HAT par l’intermédiaire du script temperature.py par exemple : from sense_hat import SenseHat

sense = SenseHat()

temp = sense.get_temperature()

print("Temperature: %s C" % temp)

Une fois le petit programme saisi dans le fichier temperature.py à l’aide de l’éditeur de votre choix, on l’exécute à l’aide de la commande suivante :

pi@raspberrypi:~/sensehat $ python temperature.py

Temperature: 34.0726776123 C

pi@raspberrypi:~/sensehat $

Ce programme très simple nous affiche la température ambiante. . juste au-dessus du radiateur de mon Raspberry Pi 3 ! Donc non, il ne fait pas 34°C dans mon bureau.

Si vous désirez avoir une lecture de température plus précise, il faudra déporter la carte en câblant les GPIO nécessaires d’après le schéma donné en [13].

La documentation complète de la bibliothèque Sense HAT est disponible à l’adresse [14]. Le nombre de fonctions n’est pas très important, mais permet d’accéder de manière simple à l’ensemble des composants de la carte. L’API est décomposée en 4 parties : fonctions propres à la matrice de LEDs, fonctions relatives aux capteurs d’environnement, fonctions relatives à la centrale inertielle et fonctions permettant de gérer le joystick.

L’adresse [15] contient de nombreux exemples de mises en œuvre des capteurs et le tout en français. Si vous désirez utiliser le module Sense HAT sans l’acheter, c’est possible grâce à l’émula-teur en ligne [16] (Figure 4).

Note : Lors de la simulation, le joystick de la carte Sense HAT est géré par les touches de direction du clavier et la touche Entrée. Il est possible de faire tourner l’ensemble Raspberry Pi et Sense HAT dans les 3 dimensions pour modifier en simulation l’état de la centrale inertielle (cf. figure 4).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 54

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi Figure 4

Dans la suite, nous nous focaliserons sur l’utilisation de la matrice de LEDs et les capteurs d’environnement. Si vous désirez mettre en œuvre basiquement la centrale inertiel e et le joystick, je vous renvoie vers les pages [17] et [18].

4. AFFICHER DES IMAGES

Afin d’afficher une image sur la matrice de LEDs, il faut créer une liste de 64 « sous »-listes qui contiendront la couleur de chaque LED et ensuite fournir cette liste à la fonction set_pixels.

L’exemple python suivant permet d’afficher un « creeper » sur la matrice de LEDs : from sense_hat import SenseHat

sense = SenseHat()

O = (0, 255, 0) # Green

X = (0, 0, 0) # Black

creeper_pixels = [

O, O, O, O, O, O, O, O,

O, O, O, O, O, O, O, O,

O, X, X, O, O, X, X, O,

O, X, X, O, O, X, X, O,

O, O, O, X, X, O, O, O,

O, O, X, X, X, X, O, O,

O, O, X, X, X, X, O, O,

O, O, X, O, O, X, O, O

]sense.set_pixels(creeper_pixels)

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

55

EMBARQUÉ & INFORMATIQUE

SENSE HAT

La commande :

$ python creeper1.py

donne le résultat suivant :

Figure 5

Après avoir instancié un nouvel objet sensehat, on définit 2 variables qui vont contenir les couleurs désirées (vert et noir -> éteint). Ensuite, on remplit la liste de 64 pixels avec la couleur désirée pour chaque pixel. Cette liste est linéaire, mais on la représente dans le code sous la forme d’une matrice 8x8 afin de vérifier visuel ement la position de nos couleurs. Ensuite, on envoie cette liste à l’affichage.

Figure 6

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 56

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi Cependant, la manière la plus simple d’afficher des images est d’utiliser la fonction load_

images disponible dans l’API. Cette dernière permet d’afficher une image PNG de 8x8 pixels sur la matrice de LEDs. El e renvoie aussi la liste de 64 pixels qui compose l’image.

On pourra par exemple afficher un « creeper » ( avec toutes ses nuances de couleurs) sans être obligé de déclarer les variables associées (figure 6).

La fonction load_images possède une option intéressante, qui permet de charger l’image, mais de ne pas l’afficher immédiatement sur la matrice de LEDs. Si l’on récupère la liste des pixels dans une variable, on pourra alors afficher notre image ultérieurement. Le programme suivant montre l’utilisation de la fonction de deux manières différentes : affichage immédiat et affichage différé.

La méthode time.sleep() permet de temporiser l’exécution du programme. La méthode sense.

clear() permet d’éteindre tous les pixels de la matrice.

from sense_hat import SenseHat

import time

sense = SenseHat()

sense.clear()

sense.load_image("sprites/creeper.png",True)

time.sleep(1)

sense.clear()

time.sleep(1)

pixel_list = sense.load_image("sprites/creeper.png",False) print("Wait!!!")

time.sleep(1)

print("Display!!!")

sense.set_pixels(pixel_list)

time.sleep(1)

sense.clear()

Cette méthode d’affichage différé sera très utile dans le cas de la création de petites animations.

On chargera dans un premier temps tous les « sprites » de notre animation en mémoire, et ensuite on les affichera en temps voulu.

5. RÉALISER UNE ANIMATION

5.1 Animer simplement un texte

L’animation la plus simple à réaliser sur la Sense HAT est le défilement horizontal de texte. Ceci est réalisé par l’intermédiaire de la méthode show_message qui ne retourne rien, mais qui prend en paramètres la chaîne de caractères à afficher, la vitesse de défilement, la couleur des lettres et la couleur de l’arrière-plan.

from sense_hat import SenseHat

sense = SenseHat()

sense.show_message(text_string="Sir... On en a gros!!!", scroll_speed=0.1, text_colour=[255,0,0], back_colour=[0,0,255] )

sense.clear()

Le script ci-dessus fait défiler à la vitesse d’une colonne toutes les 0,1s, le texte en rouge sur fond bleu.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

57

EMBARQUÉ & INFORMATIQUE

SENSE HAT

5.2 Animer des sprites

Si maintenant vous désirez animer des « sprites » à la place d’un texte, il va fal oir créer chaque image de votre animation et les enchaîner.

Pour cela, on peut utiliser le logiciel aseprite [19] qui est disponible sur les distributions Linux classiques comme Debian, Ubuntu, etc. Il ne s’agit pas d’un logiciel libre, mais ses sources sont disponibles à l’adresse [20].

Aseprite est dédié à la création de « sprites » animés. Il permet la sauvegarde aux formats PNG/GIF, il gère plusieurs modes de couleurs (indexé, RGBA, niveaux de gris), utilise les notions de calques (layers) et cadres (frames). Son interface nous ramène un peu au bon vieux temps de l’Amiga et de l’Atari, ce qui n’est pas pour me déplaire :) (figure 7). Sa prise en main est assez simple et une très bonne documentation est disponible à l’adresse [21].

Dans l’animation que nous al ons créer, nous al ons faire se déplacer Inky (le petit fantôme bleu de Pacman) sur la matrice de LEDs. Pour cela, on crée un nouveau « sprite » de 8x8 pixels et l’on dessine notre petit fantôme comme décrit en figure 7. On fera attention de choisir un fond transparent (cela correspondra aux LEDs éteintes).

Figure 7

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 58

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi L’animation va se dérouler en 15 images. Il faudra donc créer 15 « frames » et chacune d’el es sera une partie du déplacement de notre fantôme (cf. figure 7). On crée une nouvel e « frame » via le menu Frame > New Frame. Pour al er plus vite, et ne pas redessiner à chaque fois tous les pixels, on peut sélectionner une zone rectangulaire et la déplacer. On peut ensuite enregistrer chaque

« frame » dans un fichier PNG en une seule action en utilisant le menu Save as. Pour notre exemple, cela génèrera les fichiers inky1.png, inky2.png... inky15.png (figure 8).

Figure 8

Après avoir téléversé les « sprites » sur le Raspberry Pi, on écrit le petit programme inky_

anim.py qui va réaliser notre animation :

from sense_hat import SenseHat

import time

sense = SenseHat()

sense.set_rotation(180)

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

59

EMBARQUÉ & INFORMATIQUE

SENSE HAT

Abonnez-vous !

inky=[]

for nbr in range(1, 15):

M’abonner !

inky.append(sense.load_image("sprites/inky"+str(nbr)+".png", redraw=False)) def Move(sprites, direction):

if direction:

animation = sprites

Me réabonner !

else:

animation = reversed(sprites)

for sprite in animation:

sense.set_pixels(sprite)

time.sleep(0.1) # delays for 100 miliseconds

Compléter ma

Move(inky,1)

collection !

sense.clear()

time.sleep(1)

Move(inky,0)

sense.clear()

time.sleep(1)

Pouvoir lire

Après avoir déclaré une liste vide, on va ajouter dans cette dernière les différentes « frames »

de notre animation grâce à la méthode sense.load_image et une boucle.

en ligne mon

Ensuite, on définit une fonction qui aura pour objet de réaliser l’animation du déplacement magazine préféré !

de notre « sprite » sur la matrice de LEDs. Pour cela, on va afficher successivement les différentes « frames » de notre liste sur la matrice de LEDs. Notre fonction prend deux paramètres qui sont la liste des frames ainsi que la direction de déplacement. Ainsi pour effectuer



le déplacement en sens opposé, il suffit de retourner les éléments de la liste et de les afficher (méthode reversed).

Plutôt que de charger des images distinctes une par une dans une liste, il est possible, avec aseprite, de générer une seule image (feuil e de « sprite »/« sprite sheet) », qui contiendra l’ensemble des « frames ». Il nous faut alors extraire de cette image globale chaque « frame »

pour l’insérer dans une liste. Le gain est intéressant en terme de nombre de fichiers générés, PARTICULIERS,

PROFESSIONNELS,

mais la mise en œuvre est un peu plus complexe. Voyons cela en détail.

On commence par générer la « feuil e de sprites » avec aseprite en effectuant un export de l’animation via le menu

 Rendez-vous sur :

 Rendez-vous sur :

File > Export Sprite Sheet. Cela génère un fichier contenant la succession des « frames » de l’animation (cf. figure 7). Ce fichier ne sera pas directement utilisable avec les fonctions de l’API de la carte Sense HAT. Il faut décomposer cette image et www.ed-diamond.com

proboutique.ed-diamond.com

pour cela nous aurons besoin de la bibliothèque python de gestion d’image Pil ow qui a déjà été instal ée.

pour consulter

Le morceau de code suivant permet de tester la présence de la bibliothèque PIL.

pour consulter

try:

toutes les

toutes les offres

from PIL import Image

except ImportError:

offres !

dédiées !

exit("This script requires the pillow module\nInstall with: sudo pip install pillow")

 ...ou renvoyez-nous

 ...ou renvoyez-nous

le document au verso

le document au verso

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 60

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

complété !

complété !

ABO_formulaire2017_mags_R3.indd 10

07/08/2017 17:37

Abonnez-vous !

M’abonner !

Me réabonner !

Compléter ma

collection !

Pouvoir lire

en ligne mon

magazine préféré !



PARTICULIERS,

PROFESSIONNELS,

 Rendez-vous sur :

 Rendez-vous sur :

www.ed-diamond.com

proboutique.ed-diamond.com

pour consulter

pour consulter

toutes les

toutes les offres

offres !

dédiées !

 ...ou renvoyez-nous

 ...ou renvoyez-nous

le document au verso

le document au verso

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

complété !

HACKABLE M

complété ! AGAZINE n°20 61

ABO_formulaire2017_mags_R3.indd 10

07/08/2017 17:37

VOICI LES OFFRES D’ABONNEMENT AVEC HACKABLE !

EMBARQUÉ & INFORMATIQUE

XXXXXX

CHOISISSEZ VOTRE OFFRE ! Prix TTC en Euros / France Métropolitaine*

PAPIER

Offre ABONNEMENT

Réf

Tarif TTC

HK

6n° HK

HK1

39 €

LES COUPLAGES AVEC NOS AUTRES MAGAZINES

I

6n° HK + 6n° MISC

I1

79 €

I+

6n° HK + 6n° MISC +

2n° HS

I+1

99 €

J

6n° HK + 11n° GLMF

J1

105 €

J+

6n° HK + 11n° GLMF +

6n° HS

J+1

159 €

K

6n° HK +

6n° LP

K1

75 €

K+

6n° HK +

6n° LP

+

3n° HS

K+1

99 €

L

6n° HK +

6n° LP

+ 11n° GLMF + 6n° MISC

L1

189 €

L+

6n° HK +

6n° LP

+

3n° HS

+ 11n° GLMF +

6n° HS

+ 6n° MISC + 2n° HS

L+1

289 €

Les abréviations des offres sont les suivantes : GLMF = GNU/Linux Magazine France | HS = Hors-Série | LP = Linux Pratique | HK = Hackable J’indique l’offre si différente que celles ci-dessus :

J’indique la somme due (Total) :

€

Je choisis de régler par :



Chèque bancaire ou postal à l’ordre des Éditions Diamond



Pour les règlements par virements, veuillez nous contacter via e-mail : (uniquement France et DOM TOM)

cial@ed-diamond.com ou par téléphone : +33 (0)3 67 10 00 20

SÉLECTIONNEZ VOTRE OFFRE DANS LA GRILLE CI-DESSUS ET RENVOYEZ CE DOCUMENT COMPLET À L’ADRESSE CI-DESSOUS !

Voici mes coordonnées postales :

Société :



Nom :

Prénom :

Adresse :

Les Éditions Diamond

Service des Abonnements

Code Postal :

10, Place de la Cathédrale

68000 Colmar – France

Ville :

Tél. : + 33 (0) 3 67 10 00 20

Pays :

Fax : + 33 (0) 3 67 10 00 21

Téléphone :

E-mail :

Vos remarques :

 Je souhaite recevoir les offres promotionnelles et newsletters des Éditions Diamond.

 Je souhaite recevoir les offres promotionnelles des partenaires des Éditions Diamond.

En envoyant ce bon de commande, je reconnais avoir pris connaissance des conditions générales de vente des Éditions Diamond à l’adresse internet suivante : http://boutique.ed-diamond.com/content/3-conditions-generales-de-ventes et reconnais que ces conditions de vente me sont opposables.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 62

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

RETROUVEZ TOUTES NOS OFFRES SUR : www.ed-diamond.com !

*Les tarifs hors France Métropolitaine, Europe, Asie, etc. sont disponibles en ligne !

ABO_formulaire2017_mags_R3.indd 11

07/08/2017 17:37

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi La fonction suivante, lit une image PNG contenant une série de « frames » de dimension 8x8 pixels et stocke les images dans une liste :

def readSprites(filename):

img = Image.open(filename)

sprites_list = []

for o_x in range(int(img.size[0]/8)):

for o_y in range(int(img.size[1]/8)):

sprite=[]

for x in range(8):

for y in range(8):

pixel = img.getpixel(((o_x*8)+y,(o_y*8)+x)) r, g, b = int(pixel[0]),int(pixel[1]),int(pixel[2]) sprite.append([r,g,b])

sprites_list.append(sprite)

return sprites_list

Je ne rentrerai pas dans le détail des explications de la fonction, mais on peut tout de même remarquer que les pixels de chaque image sont stockés un par un. Ensuite, on réalise la fonction qui va animer le « sprite » :

def animateSprite(sprite,delay,direction):

# print(len(sprite), delay, direction)

if (len(sprite)!=0):

for index,spr in enumerate(sprite):

sense.clear()

if direction=='b':

flipped = []

for i in range(8):

offset = i * 8

flipped.extend(reversed(spr[offset:offset + 8])) sense.set_pixels(flipped)

else:

sense.set_pixels(spr)

time.sleep(delay)

else:

time.sleep(delay)

sense.clear()

Cette dernière prend en paramètres, la liste de « frames » qui compose le « sprite », la vitesse de défilement (réglée en fait par une temporisation entre deux affichages) et la direction de déplacement. On remarquera la facilité avec laquel e il est possible de retourner l’image grâce à l’utilisation de la méthode reversed.

Note : Il aurait été aussi possible de réaliser le retournement horizontal de l’image grâce à l’utilisation de la méthode flip_h de l’API de la Sense HAT.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

63

EMBARQUÉ & INFORMATIQUE

SENSE HAT

Voici le programme principal qui permet de gérer de mini scenarii d’animation : none=[]

skulls = readSprites('sprites/skulls.png')

clyde = readSprites('sprites/clyde-sheet.png')

blinky = readSprites('sprites/blinky-sheet.png')

inky = readSprites('sprites/inky-sheet.png')

deadghost = readSprites('sprites/deadghost-sheet.png')

pinky = readSprites('sprites/pinky-sheet.png')

pacman = readSprites('sprites/pacman-sheet.png')

animation_order = [[pacman, 0.12, 'f'], [none,0.8,'f'] , [clyde,0.1,'f'],

[none,0.8,'f'], [deadghost, 0.03, 'b'], [none,0.5,'f'], [pacman, 0.03, 'b']]

for i in range (len(animation_order)):

[animation,delay,direction] = animation_order.pop(0)

animateSprite(animation,delay,direction)

animation_order.append(animation)

Dans un premier temps, on charge tous les « sprites » en mémoire. Le « sprite » none, qui ne contient pas d’image, est présent pour réaliser une temporisation entre les animations.

On crée un scénario d’animation en enchaînant une liste de listes de paramètres qui seront passés à la fonction animateSprite. Dans cet exemple, Pacman est poursuivi par Clyde dans un premier temps, mais ensuite c’est Clyde qui fuit devant Pacman. Le script complet demo_

animation.py est disponible à l’adresse [22].

5.3 Ajouter des polices au texte qui défile

Par défaut, la méthode show_message de la bibliothèque permet de faire défiler du texte, mais ses options ne permettent pas de choisir la police de caractères. Dans cette partie, nous al ons utiliser figlet [23] afin de générer une « pseudo police » de caractères pour modifier l’apparence du texte à faire défiler.

« FIGlet est un logiciel qui crée des bannières textuel es dans différentes polices d’écriture.

Chaque caractère est composé d’un amas de plus petites lettres à la manière de l’art ASCI . » [24]

On commence par instal er figlet et le module python éponyme : $ sudo apt-get install figlet python-pyfiglet

On peut alors l’utiliser en ligne de commandes comme suit :

$ figlet -d figlet_fonts/ -f script "Hackable"

Ce qui donne le résultat suivant après avoir téléchargé le fichier script.flf dans le répertoire figlet_fonts depuis l’adresse [25] :

, _ _ _

/| | | | | | | |

|___| __, __ | | __, | | | | _

| |\/ | / |/_) / | |/ \_|/ |/

| |/\_/|_/\___/| \_/\_/|_/\_/ |__/|__/

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 64

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi Note : Certaines polices de caractères sont déjà présentes dans le répertoire /usr/share/figlet/.

Cependant pour notre application, nous al ons privilégier les polices figlet qui possèdent un nombre réduit de caractères pour composer les lettres afin de les remplacer par des couleurs différentes :

$ figlet -d figlet_fonts/ -f marquee "Hackable"

.:: .:: .:: .:: .::

.:: .:: .:: .:: .::

.:: .:: .:: .:::.:: .:: .:: .:: .:: .::

.:::::: .:: .:: .:: .:: .:: .:: .:: .:: .:: .:: .:: .: .::

.:: .::.:: .:: .:: .:.:: .:: .:: .:: .:: .::.::::: .::

.:: .::.:: .:: .:: .:: .:: .:: .:: .:: .:: .::.:

.:: .:: .:: .::: .:::.:: .:: .:: .:::.:: .:: .::: .:::: Les polices suivantes, en choisissant convenablement les couleurs, donnent des résultats satisfaisants : banner4, 3x5, 3-d, al igator, al igator2, contrast, marquee, o8, sblood, starwars, stellar et univers.

Cependant, avec l’utilisation de figlet, il n’est plus possible de mettre en œuvre la méthode show_message() de la bibliothèque. Il va nous fal oir réécrire cette fonction.

On commence par générer notre texte figlet à l’aide la fonction adéquate : try:

from pyfiglet import figlet_format

except ImportError:

exit("This script requires the pyfiglet module\nInstall with: sudo pip install pyfiglet")

TXT = "Hackable is fun!!!"

figletText = figlet_format(TXT+' ', "3-d", width=1000) print(figletText)

Ceci nous donne le résultat en figure 9.

Figure 9

On écrit ensuite la fonction qui va afficher ce texte à l’aide d’une matrice glissante de 8x8

pixels. Cette fonction remplace aussi les caractères par des couleurs : ici les « / » seront affichés en blanc et les « * » en rouge.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

65

EMBARQUÉ & INFORMATIQUE

SENSE HAT

textMatrix = figletText.split("\n")[:width] # width should be 8

textHeight = len(textMatrix)

if textMatrix[textHeight-1]=='':

textHeight = textHeight -1

textWidth = len(textMatrix[0]) # the total length of the result from figlet width = 8

height = 8

i=-1

def step():

global i

if i>=100*textWidth : # avoid overflow when looping forever i = 0

else:

i=i+1

for h in range(height):

for w in range(textHeight):

hPos = (i+h) % textWidth

chr = textMatrix[w][hPos]

if chr in ['/', '\\', '_', '(',')','d','8','P', 'b', 'Y', '8',

'o', '^', '|', '-', '`', 'a', '"' ]:

sense.set_pixel(width-w-1, h, 255, 255, 255)

elif chr == '#':

sense.set_pixel(width-w-1, h, 255, 0, 0)

elif chr == '*':

sense.set_pixel(width-w-1, h, 255, 0, 0)

elif chr == ':':

sense.set_pixel(width-w-1, h, 255, 255, 255)

elif chr == '.':

sense.set_pixel(width-w-1, h, 128, 255, 128)

elif chr == '+':

sense.set_pixel(width-w-1, h, 255, 0, 255)

elif chr == '@':

sense.set_pixel(width-w-1, h, 255, 0, 0 )

elif chr == '!':

sense.set_pixel(width-w-1, h, 255, 128, 128)

elif chr == '\'':

sense.set_pixel(width-w-1, h, 255, 0, 128)

else:

sense.set_pixel(width-w-1, h, 0, 0, 0)

Dans un premier temps, on génère les variables nécessaires : longueur et hauteur du texte en pixels afin de connaître le nombre d’itérations. Lorsque l’on a réalisé 100 itérations d’affichage du texte complet, on réinitialise le compteur afin d’éviter un potentiel « overflow ».

Une fois chaque pixel sélectionné dans la matrice (par l’intermédiaire de l’enchaînement des 2 boucles), on le teste pour lui affecter une couleur en fonction du caractère qu’il contient.

Finalement, on l’affiche.

Le programme complet demo_figlet.py est disponible à l’adresse [22] et une petite vidéo de l’animation est disponible à l’adresse [26].

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 66

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi 6. HORLOGE ET PLUS...

Nous al ons maintenant regrouper l’affichage de texte et d’animation à l’intérieur d’un petit programme qui va transformer notre Raspberry Pi et sa Sense HAT en un afficheur à LEDs sur lequel on diffusera, la date, l’heure, la température, l’hygrométrie et la pression atmos-phérique. Chaque affichage textuel sera précédé d’une petite animation graphique.

Comme notre Raspberry Pi ne possède pas de module RTC (Real Time Clock), nous al ons le synchroniser sur un serveur de temps au lancement du programme. Pour cela, nous aurons besoin du programme ntpdate ainsi que d’un serveur de temps. Afin d’avoir la date en français, il convient d’ajouter la locale « fr_FR.UTF8 » à l’aide de la commande : $ sudo dpkg-reconfigure locales

Ensuite, on fixe la langue choisie pour l’affichage des informations relatives au temps dans notre script python à l’aide du code suivant :

# Let's set a non-US locale

import locale

locale.setlocale(locale.LC_TIME, "fr_FR.UTF8")

Puis on le met à l’heure à l’aide du code suivant qui est en fait une succession de commandes Bash :

print("Setting time")

bashCommand = "sudo service ntp stop; sudo ntpdate 193.50.119.254; sudo service ntp start"

os.system(bashCommand)

now = datetime.datetime.now()

print(now.strftime("Date : %d %B %Y Heure : %H:%M")) On commence par stopper le service NTP, afin de pouvoir lancer la commande de mise à l’heure réalisée par le programme ntpdate. Il faudra bien sûr adapter l’adresse IP à cel e de votre serveur de temps. À l’exécution, on obtient le retour suivant : Setting time

12 Jun 17:13:23 ntpdate[17902]: adjust time server 193.50.119.254 offset 0.000010 sec

Date : 12 juin 2017 Heure : 17:13

Après avoir chargé tous nos « sprites » à l’aide du code suivant (exemple pour l’animation de inky) :

inky=[]

for nbr in range(1, 15):

inky.append(sense.load_image("sprites/inky"+str(nbr)+".png", redraw=

False))

On peut écrire la boucle infinie qui va enchaîner l’affichage des informations et des animations :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

67

EMBARQUÉ & INFORMATIQUE

SENSE HAT

while (True):

now = datetime.datetime.now()

pressure = sense.get_pressure()

temp = sense.get_temperature()

humidity = sense.get_humidity()

Move(inky,0)

sense.clear()

sense.show_message(now.strftime("Date : %d %B %Y "), text_colour=[0, 255, 255]) Move(blinky,0)

sense.clear()

sense.show_message(now.strftime("Heure : %H:%M"), text_colour=[255, 0, 0]) Move(clyde,0)

sense.clear()

sense.show_message("Temperature : "+"{0:.1f}".format(temp)+" C", text_

colour=[255, 102, 0])

Move(pinky,0)

sense.clear()

sense.show_message("Pression : "+"{0:.0f}".format(pressure)+" mB", text_

colour=[255, 0, 255])

Move(pacmanb,1)

sense.clear()

sense.show_message("Hygrometrie : "+"{0:.0f}".format(humidity)+"%", text_

colour=[255, 255, 0])

Move(deadghost,0)

sense.clear()

Move(pacmanb,1)

sense.clear()

time.sleep(0.5)

Ce code source est très simple. Le seul point important concerne la mise en forme des valeurs de température, pression et hygrométrie afin de limiter l’affichage des chiffres décimaux.

Le programme complet dmdclock.py, ainsi que les « sprites » sont disponibles à l’adresse [22].

Finalement, on peut lancer ce petit programme au démarrage de notre Raspberry Pi en ajoutant la ligne suivante au fichier /etc/rc.local avant le « exit 0 » final.

/home/pi/sensehat-examples/dmdclock.py &

On fera attention de mettre le chemin absolu vers les « sprites » lors de leur lecture et stockage en mémoire. Le cas échéant le programme python ne les trouvera pas et s’arrêtera. L’adresse [27]

vous propose une vidéo du programme final en fonctionnement.

CONCLUSION

En guise de conclusion, je vous renvoie vers les pages [28] et [29] qui vous proposent de programmer deux petits jeux qui utilisent la centrale inertiel e et le joystick. Maintenant c’est à vous. YM

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 68

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Sense HAT pour donner de la couleur et plus à votre Raspberry Pi RÉFÉRENCES

[1] https://www.adafruit.com/category/286

[2] https://shop.pimoroni.com/collections/hats

[3] https://www.indiegogo.com/projects/pisound-audio-midi-interface-for-raspberry-pi#/

[4] https://www.kickstarter.com/projects/364371217/caphat-a-raspberry-pi-capacitive-keypad-hat-access

[5] https://pinout.xyz/boards#

[6] https://www.raspberrypi.org/products/sense-hat/

[7] https://shop.pimoroni.com/products/unicorn-hat

[8] https://www.raspberrypi.org/downloads/raspbian/

[9] https://astro-pi.org/

[10] https://astro-pi.org/principia/science-results/

[11] https://astro-pi.org/proxima/

[12] http://www.framboise314.fr/sense-hat-un-tour-dans-les-etoiles

[13] https://pinout.xyz/pinout/sense_hat

[14] https://pythonhosted.org/sense-hat/api/

[15] http://wiki.mchobby.be/index.php?title=RASP-SENSE-HAT-ASTRO-PI

[16] https://www.raspberrypi.org/learning/astro-pi-guide/emulation.md

[17] https://www.raspberrypi.org/learning/astro-pi-guide/sensors/movement.md

[18] https://www.raspberrypi.org/learning/astro-pi-guide/inputs-outputs/joystick.md

[19] https://www.aseprite.org/

[20] https://github.com/aseprite/aseprite/

[21] https://www.aseprite.org/docs

[22] https://github.com/ian57/sensehat-examples

[23] http://www.figlet.org/

[24] https://fr.wikipedia.org/wiki/FIGlet

[25] http://www.figlet.org/fontdb.cgi

[26] https://youtu.be/61VeplPmyLQ

[27] https://youtu.be/SOPMpa3ziWk

[28] https://www.raspberrypi.org/learning/sense-hat-pong/

[29] https://www.raspberrypi.org/learning/sense-hat-marble-maze/

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

69

DÉMONTAGE, HACKS & RÉCUP

8 BITS

CRÉEZ VOTRE

ORDINATEUR 8 BITS SUR

PLATINE À ESSAIS :

LE PROCESSEUR

Denis Bodor

Un PC, un Mac, une carte Raspberry Pi, un Arduino... tout ceci paraît tellement simple de nos jours. Quelques clics, quelques commandes ou quelques lignes de code et voilà la chose s’anime gaiement selon notre bon plaisir. En réalité, cette simplicité n’existe pas et n’est que le résultat d’une dissimulation de la complexité qui, elle, a toujours été présente dans ce domaine, depuis ces toutes premières heures et n’a jamais disparue. Renouer avec cette savoureuse complexité, cette technicité historique, est justement le but de cet article et d’autres qui suivront à l’avenir.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 70

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez votre ordinateur 8 bits sur platine à essais : le processeur Pourquoi ?! Pour- choses, et surtout d’apprendre toujours plus. Sans oublier, quoi donc vouloir

bien sûr, la dose de dopamine qui accompagne invaria-

aujourd’hui, alors

blement une expérimentation réussie. Comme le disait

que tout est main-

Corneil e, à programmer sans difficulté, on compile sans

tenant rendu très

plaisir (propos originaux qui ont étrangement été détour-

accessible, chercher à renouer

nés ensuite pour devenir intel igibles par tous, si, si).

avec quelque chose qui était

indispensable il y a des dizaines

d’années ? La première réponse

1. SOC, PROCESSEUR ET

qui me viendrait à l’esprit est tout

simplement « parce que c’est

MICROCONTRÔLEUR

amusant ». Mais ceci n’explique

Pour se débarrasser du voile cachant le monde de

finalement pas grand-chose et

l’informatique et de l’électronique numérique actuel e,

est avant tout une affaire de goût

il existe plusieurs solutions, tout dépend de la quantité

Dans le

microcontrôleur

et de perception. La raison pour

de voile que l’on souhaite soulever. Faire du C en lieu et

ATmega328P de

laquel e une tel e approche est

place de Python sur une Raspberry Pi est un pas dans

votre carte Arduino

amusante ou plaisante est l’envie

ce sens. Oublier l’environnement Arduino et programmer

se trouve tout

de satisfaire une certaine curio-

directement avec GCC et l’AVR Libc en est un autre. On

un ensemble qui

n’est pas sans

sité, d’accéder à l’essence des

peut également écarter le C et faire de l’assembleur sur

rappeler la structure

d’un ordinateur

comme un PC, à

la différence qu’ici,

rien n’est modulaire

et interchangeable,

et surtout, cela se

passe à une tout

autre échelle...

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

71

DÉMONTAGE, HACKS & RÉCUP

8 BITS

microcontrôleur Atmel

AVR. Le langage C qui,

du temps où j’étais en

classe, était considéré

comme un langage de

haut niveau alors qu’il

est maintenant dit de bas

niveau (plus le niveau

est bas, plus on est

proche du matériel). Si

nous poussons plus loin

encore, oublions égale-

ment l’assembleur, qui est

traditionnellement produit

par le compilateur C (ou

écrit à la main) et écri-

vons du code machine,

les instructions binaires

directement utilisées par

le processeur, traduites à

la main et placées ensuite

dans la mémoire.

Avec une carte comme

Arduino et son microcon-

trôleur Atmel AVR, c’est

le niveau le plus bas, et

donc la proximité la plus

grande, qu’on peut avoir

avec le matériel. Pour

désosser encore davan-

tage tout cela, il faudrait

pouvoir découper le com-

posant en ces éléments

les plus basiques.

Un microcontrôleur

comme un ATmega328P

d’une carte Arduino

Le diagramme de l’architecture d’un

UNO est, en un sens, un

ordinateur 8 bits comme le Commodore

ordinateur à lui tout seul

64 est très similaire à celle d’un

concentré en une simple puce. Celui-ci contient un processeur,

microcontrôleur. On y retrouve la RAM, la

de la mémoire vive (SRAM), de la mémoire de stockage flash,

ROM, les périphériques et bien entendu

le processeur (en rouge), le tout relié

deux bus internes, une gestion d’alimentation, un circuit d’hor-

par différents bus. Mais à la différence

loge et tout un tas de périphériques intégrés (port série, bus i2c, d’un microcontrôleur, ces éléments sont

SPI, convertisseurs ADC, timers, GPIO, etc.). Le diagramme

physiquement distincts sur le circuit

ci-contre extrait de la documentation (datasheet) Atmel montre

imprimé et non regroupés en une seule

puce.

clairement qu’il ne s’agit pas d’un simple processeur, mais d’un Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 72

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez votre ordinateur 8 bits sur platine à essais : le processeur système complet. Le processeur

ingénieurs de talent qui avaient conçu ces machines, cela

AVR lui, n’est qu’un élément, pré-

doit donc être inaccessible au commun des mortels, non ? En

senté en haut du schéma sous le

réalité, pas du tout. Bien avant l’arrivée de ces machines, des

terme « AVR CPU ».

groupes d’enthousiastes existaient, constitués de personnes

fabriquant leurs ordinateurs de cette manière. Certains de ces

Pour descendre encore plus

membres ont même fondé des sociétés qui existent toujours

profond dans le terrier du lapin

aujourd’hui, c’est le cas de Steve Wozniak, membre du Home-

blanc, il faudrait faire quelque

brew Computer Club, père de l’Apple I et co-fondateur d’Apple.

chose qui n’est pas physiquement

possible : casser le microcontrô-

Aujourd’hui, une tel e chose est à votre portée, une excel-

leur en plusieurs morceaux (avec

lente source de connaissances et un moyen fantastique de

un marteau c’est faisable, mais ça

renouer avec l’histoire de votre loisir, qu’il s’agisse d’élec-

marchera forcément moins bien

tronique, de programmation ou de bidouil e. Mieux encore,

ensuite). Une autre approche, plus

vous pouvez le faire à moindre coût, à votre rythme et avec

réaliste, consiste à se tourner vers

relativement peu de matériel. Pour vos premiers pas, une

quelque chose qui utilise toutes

platine à essais, un processeur, quelques résistances et leds,

ces briques séparément et qui

et quelque chose pour piloter l’expérimentation (une carte

à une certaine époque était la

Arduino) seront suffisants. .

norme : un ordinateur familial.

Ce dernier point peut paraître surprenant, mais c’est l’une

Lorsqu’on regarde côte à côte

des raisons qui rendent cet exercice très facile aujourd’hui,

le diagramme du microcontrô-

en évitant d’avoir recours à un équipement très coûteux et

leur ATmega328P et celui d’un

difficile à utiliser. Une carte Arduino est un excel ent moyen

vénérable Commodore 64, ou

de créer un environnement pour expérimenter puisqu’el e

de toutes autres machines de

permet de simuler des briques encore absentes au début du

la même époque, on remarque

projet, comme une horloge ou la mémoire, tout en fournissant

immédiatement les similarités.

un moyen simple de « voir ce qui se passe ». Il est également

Mais une différence ne transpa-

possible, plus tard, qu’une carte Raspberry Pi soit également

raît pas sur les schémas : dans

de la partie dans ce projet. . Mais nous verrons cela en temps

le cas de l’ordinateur familial des

et en heure.

années 80, chaque élément prend

la forme d’une puce. Ce que vous

avez sous les yeux n’est pas

2. CHOISIR SON PROCESSEUR

l’intérieur d’un composant unique,

Les ordinateurs familiaux des années 80 utilisaient diffé-

mais tout le circuit imprimé de la

rents processeurs en fonction de la marque et tantôt du mo-

machine.

dèle. Deux processeurs cependant se partageaient la vedette,

Pour toucher du doigt et com-

les Zilog Z80 (TRS-80, Sinclair ZX80, Amstrad CPC, Cam-

prendre les relations entre ces

bridge Z88, MSX, Philips VG5000, etc.) et les MOS 6502/6510

briques de base, il nous suffit

(Commodore 64, Apple II, ACORN, Oric, BBC Micro, Nintendo

donc d’expérimenter exactement

NES, etc.). Il existe bien entendu d’autres modèles, comme

sur la même base, dans l’ordre

le Motorola 6809, successeur du 6800 et source d’inspiration

d’importance des éléments : le

du 6502, qui équipait, par exemple le Thomson MO5 (pour

les nostalgiques du « plan informatique pour tous »). Notez au

processeur, la mémoire et les

passage que le Commodore 128 contenait non seulement un

périphériques.

MOS 8502, une version compatible du 6502 capable de fonc-

Ceci peut vous sembler être

tionner jusqu’à 2 Mhz, mais également un Zilog Z80A, un Z80

un défi insurmontable. Après

capable de monter à 4 Mhz (plus un 6502 pilotant le lecteur de

tout, c’était des entreprises et des

disquette pour le Commodore 128D).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

73

DÉMONTAGE, HACKS & RÉCUP

8 BITS

Lorsqu’on se lance dans ce type de projet qui,

imposée comme pour d’autres

je le rappel e, à terme, consiste tout de même à

processeurs plus modernes

construire un ordinateur complet, le maître mot du

(comme le Motorola 68000 par

choix du processeur est la quantité de documen-

exemple). L’objectif est principale-

tation (vieil e comme récente) disponible sur le

ment ici de « voir » le processeur

sujet et la disponibilité des composants. Les 6502

fonctionner et donc utiliser une

(ou leurs dérivés les 6510) et les Z80 sont, dans

cadence d’horloge humainement

ce domaine, les seules options intéressantes. Le

raisonnable, et contrôlable (par

Motorola 68000 (MC680000P12F plus précisé-

l’Arduino).

ment) est également un bon choix, mais unique-

ment pour un second projet, car ce processeur

Vous trouverez très certaine-

16 bits est bien plus complexe à utiliser.

ment plus facilement des Z80 et

Z80A que d’autres modèles. Il

Au risque d’énerver quelques lecteurs

est également possible que vous

puristes passionnés au passage, je dirais que

tombiez sur des processeurs Z80

Z80 et 6502 se valent du point de vue pédago-

ne provenant pas de chez Zilog, le

gique. En termes de disponibilité cependant, le

constructeur original. Il s’agit sim-

Z80 est bien plus facile à se procurer puisqu’on

plement de clones fabriqués sous

en trouve pour quelques euros sur eBay par

licence qui devraient fonctionner

exemple, y compris de la part de vendeurs fran-

exactement de la même façon

çais. Assurez-vous cependant de bien opter pour

que l’original. Ce à quoi il faut

un modèle au format DIP-40 pouvant être placé

faire attention, en revanche, est la

sur une platine à essais et non une version plus

présence d’annonces mentionnant

moderne dans un format peu utilisable pour un

« Z80 », mais ne concernant pas

Zilog n’a pas été le

hobbyiste (PLCC ou PQFP).

un processeur, mais un périphé-

seul fabricant de

processeurs Z80. Ici,

Nous nous baserons donc ici sur le Z80, mais

rique compatible :

un composant de chez

tout ceci devrait être transposable sur un MOS

STMicroelectronics

• Le CTC (Counter/Timer Chan-

sous la désignation

6502/6510/8502 ou n’importe quel autre proces-

nel) Z8430 qui fournit un timer

Z84C00 qui s’avère

seur 8 bits avec quelques efforts et recherches.

programmable comme ceux

être un Z80 amélioré

compatible avec

Il existe plusieurs modèles de Z80, l’original à

intégrés dans le microcontrô-

l’original, mais intégrant,

2,5 Mhz, le Z80A à 4 Mhz, le Z80B à 6 Mhz et le

leur de votre Arduino et qui

en plus, les instructions

Z80H à 8 Mhz. Bien entendu, il faut comprendre ici

gèrent delay() ou la PWM.

compatibles avec Intel

« jusqu’à » puisqu’il ne s’agit pas d’une fréquence

8080A. Le brochage est

• Le PIO (Parallel Input-Out-

parfaitement identique

put) Z8420, fournissant des

et il pourra être utilisé ici

ports d’entrée/sortie (GPIO),

exactement comme un

là encore, comme sur votre

Z80 de chez Zilog.

Arduino.

• Le SIO (Serial Input Output)

Z8440 qui permet d’avoir un

port série, comme le moniteur

de. . vous avez compris.

• Le DMA (Direct Memory

Access) Z8410, un contrôleur

permettant de provoquer des

transferts directs entre deux

périphériques.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 74

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez votre ordinateur 8 bits sur platine à essais : le processeur

• Le DART (Dual Asynchronous

Voici le brochage

d’un Zilog Z80.

Receiver Transmitter) Z8470,

Contrairement

un double port série.

à ce que vous

pourriez croire,

Ces composants ne sont

toutes ces

PAS des processeurs, qui eux

broches ne

sont sérigraphiés « Z8400 » ou

sont pas des

entrées/sorties

« Z8400A » pour les modèles

comme sur un

de chez Zilog, mais des périphé-

ATmega328P, le

riques qui peuvent s’y connecter

Z80 n’en dispose

et qui sont spécialement conçus

pas. Ce sont

des bus et des

pour le Z80. Lisez l’annonce,

signaux, le Z80

regardez la photo et cherchez le

est un processeur

nom du composant s’il est spécifié

et non un

dans l’annonce, il serait dommage

microcontrôleur.

de vous retrouver à mettre la char-

rue avant les bœufs. .

3. LE Z80 SUR

• l’instruction 0x00, n’est composée que de l’opcode NOP

(No OPeration), « ne rien faire », ayant pour valeur 0x00 ;

PLATINE :

• l’instruction 0xc3 0x06 0x00, se compose de l’opcode LE B.A.BA

JP (comme jump) de valeur 0xc3 suivi de deux octets formant l’adresse à laquel e sauter (ici 0x0006) ;

Et voilà ! Tout fébrile, vous

avez décidé de vous lancer dans

• l’instruction 0x3e 0x42 se compose de l’opcode LD A l’aventure, avez commandé votre

de valeur 0x3e et de l’argument 0x42, et a pour effet de

ou vos processeurs (2 c’est mieux,

charger cette valeur dans le registre A (un registre est

on ne sait jamais) et ils viennent

une minuscule zone mémoire interne au processeur, il en

d’arriver par la poste. Il est temps

existe généralement plusieurs tantôt réservés à différents

de faire un premier essai pour

usages).

vérifier que tout cela fonctionne et,

Comme il est relativement difficile de travail er directement

par la même occasion, apprendre

en langage machine, on utilise une représentation plus intel-

énormément de choses dont

ligible appelée assembleur, composée d’instructions dési-

vous ne deviniez pas l’existence

gnées de façon plus logique et lisible. Les trois instructions

jusqu’alors...

précédentes, en assembleur, s’écriraient respectivement :

Un processeur est juste une

• NOP ;

unité centrale de traitement ou

• JP 0x0006 ;

CPU en anglais pour Central

Processing Unit. Son travail est

• LD A,0x42.

d’exécuter des instructions qui

Le fait de traduire l’assembleur en langage machine est la

prennent la forme de valeurs nu-

phase d’assemblage. Avec un système moderne, ceci est une

mériques. L’ensemble de ces ins-

étape de la compilation d’un programme, effectuée par l’as-

tructions compose un programme

sembleur. Vous ne le voyez pas en « vérifiant » un croquis en langage machine. Une ins-Arduino, mais celui-ci est compilé pour devenir de l’assem-

truction est composée d’un op-

bleur puis assemblé pour devenir du langage machine avant

code suivi ou non de valeurs qui

d’être chargé dans la mémoire du microcontrôleur de votre

forment des arguments. Exemple :

carte (dans les grandes lignes).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

75

DÉMONTAGE, HACKS & RÉCUP

8 BITS

Un processeur

Z80 sur platine à

Le Z80 utilise 252 instructions différentes

Si le processeur, par exemple

essais cadencée et

de base permettant toutes sortes d’opéra-

lit 0xc3, 0x06 puis 0x00, il sait

contrôlée par une

carte Arduino UNO, la

tions, des sauts, des conditions, des tests,

que la prochaine instruction devra

première étape d’un

des additions, des soustractions, des lectures

être lue à l’adresse 0x0006, soit

voyage d’exploration

en mémoire, etc.

au 7ème octet de la mémoire.

pédagogique avec

plein de leds qui

Le processeur, en brave exécutant ne fait

Pour savoir où il se trouve à n’im-

clignotent... tout le

que ce qu’on lui dit de faire sous forme d’ins-

porte quel moment de l’exécution,

monde aime les leds

tructions. Mais d’où viennent-elles puisque le

il embarque un compteur ordi-

qui clignotent !

processeur n’a aucune mémoire en lui-même ?

nal également appelé pointeur

Il les lit tout simplement sous la forme d’états

d’instruction (le terme pointeur

qui lui sont présentés sur une série de

vous rappel e quelque chose ?),

broches : c’est le bus de données (broches

en anglais un Program Counter

7, 8, 9, 10, 12, 13, 14 et 15 sur le Z80). À

abrégé PC.

chaque cycle d’horloge, le processeur va lire

L’instruction en question ne fait

l’état de ces 8 broches, en déduire un octet et

rien d’autre que de dire au proces-

l’utiliser comme une partie d’une instruction.

seur que le compteur ordinal vaut

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 76

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez votre ordinateur 8 bits sur platine à essais : le processeur maintenant 0x0006. Reste ensuite

0xFFFD et utilise ensuite les valeurs lues pour le compteur à trouver un moyen pour faire en

ordinal. Si les valeurs 0x10 et 0x00 sont successivement sorte que la mémoire sache quel

lues de cette manière, le compteur ordinal contiendra 0x0010

octet présenter sur le bus de don-

et le processeur lira le début de la prochaine instruction à

nées. Pour cela, le processeur

cette adresse. On parle alors de vecteur de reset à l’adresse

dispose de broches spécifiques

0xFFFC/0xFFFD ou $FFFC/$FFFD (les valeurs hexadécimales formant également un bus : le

sont souvent spécifiées avec $ et non 0x dans le domaine).

bus d’adresse (broches 1 à 5

Notez au passage que le premier octet lu est celui le plus

et 30 à 40). Les différents états

à gauche et le second le plus à droite de la valeur finale

des broches ou lignes d’adresse

sur 16 bits. Le Z80 fonctionne de la même manière. On

forment une valeur d’adresse et

parle d’architecture little endian pour décrire cet ordre de

cel e-ci est directement intel igible

lecture. Remarquez également que le bus de données utilise

par le composant qui gère la

8 broches et donc 8 bits. De plus, dans son fonctionnement

mémoire.

interne, le processeur utilise également uniquement des

Ainsi comme nous avons

valeurs sur 8 bits, les adresses sont coupées en deux (d’où le

changé le compteur ordinal

little endian). C’est cet état de fait qui explique le terme « pro-pour sauter à l’adresse 0x0006,

cesseur 8 bits », par opposition à, par exemple, un Motorola

le processeur va changer l’état

68000, avec 16 bits de données et un fonctionnement interne

des broches du bus d’adresse en

utilisant des valeurs sur 16 bits (et des registres de 16 bits).

conséquence puis, à nouveau lire

En résumé donc, on pourrait se dire que deux choses nous

le bus de données. Il récupère

sont indispensables, un signal d’horloge pour cadencer tout

ainsi le début de la prochaine ins-

cela et faire en sorte que le processeur exécute ses cycles, et

truction, et le programme poursuit

de la mémoire pour y placer les instructions.

son exécution. Bien entendu, le

compteur ordinal change éga-

Le premier point est juste, mais pas le second. Une carte

lement lui-même, et s’incrémente

Arduino peut nous permettre de fournir un signal d’horloge

automatiquement en fonction de

à la vitesse de notre choix, il suffit de changer l’état d’une

la lecture des instructions. En

broche, mais également de simuler la mémoire. En effet, ceci

lisant 0xc3, l’opcode JP, le pro-

se résume dans les grandes lignes à lire l’état de 16 broches

cesseur sait qu’il doit encore lire

du bus d’adresse et changer l’état des huit broches du bus

deux fois le bus de donnée pour

de données. Quand le processeur demandera une donnée à

avoir l’instruction complète. La

une adresse spécifique, la carte Arduino pourra lui présenter

valeur du compteur ordinal est

sur le bus de données comme s’il s’agissait du contenu d’une

alors augmentée de 1, l’adresse

mémoire.

présentée sur le bus d’adresse, et

Mais ceci est pour plus tard. Avant cela, nous pouvons

le bus de donnée à nouveau lu, et

faire un premier test avec simplement le signal d’horloge,

ainsi de suite.

quelques résistances et des leds.

Dans le cas du Z80, après ini-

tialisation, le compteur ordinal est

à 0x0000, c’est là que le proces-

4. LE Z80 SUR PLATINE :

seur s’attendra à avoir le premier

octet d’une instruction à exécuter.

VERS LE PREMIER ESSAI

D’autres processeurs fonctionnent

Sur la base des informations que nous venons de

de manière différente. Le MOS

résumer, nous pouvons faire un premier test simple, sans

6502, par exemple, présente sur

mémoire. En effet, le Z80 s’attend à lire un octet sur son bus

le bus d’adresse 0xFFFC puis

de données en fonction de l’adresse qu’il présente sur le

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

77

DÉMONTAGE, HACKS & RÉCUP

8 BITS

bus d’adresse. Si le bus de données est toujours à 0x00,

Le processeur Z80 dispose

le processeur pensera lire l’instruction NOP à n’importe

également d’un certain nombre de

quel e adresse demandée. Pour cela, rien de plus simple,

broches en entrée que nous de-

il nous suffit de mettre les 8 broches du bus à la masse

vons contrôler pour qu’il s’anime :

via des résistances de rappel de 1 Kohm (ou 470 ohms,

• /INT (16) : Le signal INTerrupt

ça marche aussi).

Request permet à un péri-

Le bus d’adresse lui est unidirectionnel et n’a pas

phérique de demander une

besoin d’être connecté pour l’instant, si ce n’est à trois

interruption du fonctionne-

leds via des résistances de 470 ohms et reliées à la

ment du processeur. Celui-ci

masse. Nous n’avons pas besoin des 16 broches du

va alors terminer l’exécution

bus d’adresse pour constater une activité, les trois

de l’instruction en cours et

premiers bits de l’adresse seront suffisants : A0 (30),

honorer, ou non, la demande

A1 (31) et A2 (32). Notez au passage que ces sorties

selon la configuration en

ne sont pas faites pour contrôler directement des leds,

place. Le signal, comme

car le processeur n’est pas censé fournir autant de

tous ceux qui suivent, est

courant (ce ne sont pas des GPIO). C’est également

actif à l’état bas (interruption

pour cette raison que nous nous limitons à trois sorties/

demandée si la broche est

leds et non 8 ou 16. Nous verrons ultérieurement qu’il

mise à la masse). Nous n’en

existe d’autres solutions pour visualiser l’activité du bus

avons pas l’usage et mettons

d’adresse.

donc cette broche, comme

Ce processeur

Zilog Z80A

(marqué Z8400A)

a été fabriqué la

16ème semaine

de l’année 1984

(marquage

« 8416 »), soit il y

a plus de 33 ans.

Non seulement il

fonctionne encore,

mais en plus il est

toujours capable

de nous apprendre

énormément

de choses et

nous donner

énormément de

plaisir.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 78

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez votre ordinateur 8 bits sur platine à essais : le processeur toutes les suivantes à la tension d’alimentation via une

résistance de 1 Kohm.

• /NMI (17) : NonMaskable

Interrupt est une version plus

« agressive » du signal pré-

cédent. Là encore c’est une

demande d’interruption, mais

le processeur doit l’honorer

après avoir fini l’exécution de

l’instruction courante, sans

possibilité de l’ignorer.

• /BUSRQ (25) : BUS Request

est une demande de priorité

encore plus élevée que le

signal NMI. Si cette broche

est passée à l’état bas le pro-

cesseur va se déconnecter

du bus d’adresse et des diffé-

rents autres signaux/broches

qu’il contrôle (/MREQ, /IORQ,

/RD et /WR) après la fin du

cycle courant. Ce signal per-

met donc de dire au proces-

seur de « tout lâcher », car

quelque chose d’autre veut

accéder aux bus.

• /WAIT (24) : Demande au

processeur d’attendre, car

les informations sur le bus de

données ou d’adresse ne sont

pas encore prêtes.

Nous aurons donc besoin d’uti-

Voici le Micro-Professor MPF-I,

liser 4 résistances de rappel à la

un « ordinateur » pédagogique

tension d’alimentation pour que

8 bits historiquement fabriqué et

Actif au niveau bas (d’où le « / »

commercialisé en 1981 par Multitech

le processeur considère ces si-

devant le nom), ce signal indique

(maintenant Acer), construit autour d’un

gnaux comme non actifs. Le Z80

que le Z80 est dans la phase de

Zilog Z80 à 1.79 Mhz. Construire ce type

dispose également de broches

lecture de l’opcode d’une ins-

de machine aujourd’hui prend du temps,

utilisées en sortie, mais toutes ne

mais est quelque chose de totalement

truction. « M1 » signifie Machine

accessible pour un amateur passionné.

nous intéressent pas (pour l’ins-

Cycle One (premier cycle ma-

Le MPF-1B est encore fabriqué de

tant). L’un des deux signaux qui

chine) et pour interpréter le sens

nos jours par Flite Electronics qui en

vont nous permettre de voir que

de ce signal, il faut comprendre le

a racheté les droits à Acer en 1993, et

le processeur fonctionne, en plus

vendu pour quelques £225 sur le Web.

cycle de fonctionnement d’un pro-

des leds sur le bus d’adresse, est

cesseur. Celui-ci est constitué de

/M1 (27).

trois étapes :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

79

DÉMONTAGE, HACKS & RÉCUP

8 BITS

• Fetch (récupération) : le processeur

sur le bus d’adresse pour

lit l’instruction complète en mémoire

récupérer le prochain opcode

tout en conservant l’adresse dans

pour un saut, ou encore chan-

un registre, le fameux compteur

ger la valeur dans un registre.

Ceci est mon Cambridge

ordinal. Le premier octet lu est

Une fois tout cela fait, le cycle

Z88, un ordinateur portable

l’opcode, c’est à ce moment que la

d’un peu moins d’un kilo,

recommence. On parle de cycle

au format A4 (avec clavier

broche /M1 est active.

d’instruction ou de cycle machine.

français SVP), avec un

• Decode (décodage) : Le processeur

Notez qu’un cycle ne correspond

magnifique écran STN

de 64 x 640 pixels, 128

analyse l’opcode et éventuel ement

pas à un cycle d’horloge. En fonc-

Ko de ROM, 32 Ko de

récupère d’autres données en mé-

tion des instructions exécutées,

RAM, le tout animé par un

moire, comme l’adresse pour un saut

le nombre de cycles d’horloge (le

processeur Z80A à 3.2768

MHz et fonctionnant avec

(

nombre d’impulsions envoyées

JP) ou encore une valeur à placer

un système d’exploitation

dans un registre (

sur la broche dédiée) peut être

LD). Le compteur

appelé OZ. Ceci est

plus ou moins important. Sur le

ordinal est incrémenté au besoin.

littéralement une pièce de

Z80, un NOP par exemple, utilise

collection et des applications

• Execute (exécution) : Le processeur

4 cycles d’horloge et un JP 10

sont toujours développées

fait ce qu’on lui demande comme par

cycles d’horloge, mais le traite-

aujourd’hui pour cette

machine commercialisée en

exemple changer l’état des broches

ment complet de ces instructions

1988.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 80

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez votre ordinateur 8 bits sur platine à essais : le processeur correspond toujours à un cycle

haut, 40 ms bas, soit environ 12 Hz). Notez que c’est la

machine complet. En connectant

transition de l’état bas à l’état haut qui est significative, on

/M1 à une led via une résistance

parle de déclenchement sur le front montant.

et à la tension d’alimentation nous

Enfin, /RESET (26) est le signal qui, comme son nom

pourrons donc voir quand le pro-

l’indique permet de réinitialiser le processeur. Notez que

cesseur est à l’étape fetch et la

ceci est également valable pour la mise sous tension, car

led clignotera au rythme du cycle

le Z80 se trouve, à ce moment-là, dans un état inconnu.

machine.

Certains processeurs et surtout microcontrôleurs se réi-

/RD (21) est un autre signal

nitialisent tout seuls à la mise sous tension, on parle alors

que nous pouvons observer de

de Power-on Reset ou PoR. Le Z80 comme tous les pro-

la même manière via une led

cesseurs de cette époque ne dispose pas de cette fonc-

connectée de la même façon. Ce

tionnalité et doit donc être réinitialisé à chaque mise sous

signal actif à l’état bas est contrôlé

tension.

par le Z80 pour signifier qu’il sou-

En pratique, nous pourrions nous passer de gérer ce

haite accéder à la mémoire. En

signal et simplement relier cette broche à la masse avec

pratique cette broche est reliée à

une résistance comme pour /INT ou /WAIT, mais mieux

la broche /OE (Output Enable) de

vaut faire les choses proprement. Ce signal sera donc

la mémoire, lui demandant ainsi

piloté par la carte Arduino en accord avec la documentation

de prendre en compte l’adresse

du Z80 qui précise que la réinitialisation doit être faite en

sur le bus et de présenter les don-

plaçant cette broche à la masse pendant au moins trois

nées sur le bus de données. Ici,

cycles d’horloge.

avec une led, ceci nous permettra

de voir lorsque le processeur ten-

Enfin, il conviendra d’alimenter le Z80 en +5V appliqués

tera de lire la mémoire.

sur la broche 11, avec la masse connectée sur la broche

29. Cette alimentation peut être ici fournie directement par

Il ne nous reste que deux

la carte Arduino, mais il est très important d’avoir une ali-

broches à contrôler pour finir

mentation parfaitement stable. Il est relativement facile de

le circuit. La broche 6 est le

s’en assurer en plaçant un condensateur (~200 nF) entre

signal d’horloge qui n’est pas

l’alimentation et la masse, au plus proche du Z80. Une ali-nommé dans la documentation,

mentation instable ou pleine de « bruit » est généralement

mais simplement désigné par la

la source de tous les maux et c’est donc de ce côté que

lettre phi de l’alphabet grec (en

vous devrez regarder en premier lieu en cas de problème.

France un parti politique a choisi

Placer le condensateur à cheval par-dessus le processeur

cette lettre comme logo, ce qui

sur la platine à essais est une excel ente idée.

est assez drôle puisqu’ici c’est

un signal littéralement fait pour

faire marcher le processeur au

5. LE MONTAGE ET LE

pas et le soumettre). Ce signal

d’horloge est une succession

RÉSULTAT

d’états hauts et bas permettant

Le montage sur platine à essais se résume à la mise en

au Z80 d’être cadencé, c’est le

œuvre des explications précédentes sans le moindre chan-

cycle d’horloge. En fonction du

gement. L’alimentation +5V et la masse sont fournies direc-

modèle de Z80, il est possible de

tement par la carte Arduino UNO. Les lignes /RESET et phi

monter la fréquence de ce signal

(l’horloge) sont respectivement connectées aux broches

jusqu’à 8 Mhz, mais ici nous le

7 et 6. Bien entendu, vous pourrez choisir arbitrairement

contrôlerons bien en deçà avec

les sorties qui vous arrangent le plus ici, vous n’aurez qu’à

une carte Arduino UNO (40 ms

modifier le code en conséquence.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

81

DÉMONTAGE, HACKS & RÉCUP

8 BITS

Le croquis associé à ce projet est, pour l’instant, très simple

Pour faciliter les choses, nous

puisqu’il ne fait que cadencer le fonctionnement du Z80 et le

commençons par déclarer deux

réinitialiser :

fonctions. La première, doClock(),

a pour tâche d’envoyer une impul-

#define CLKDELAY 40

sion sur la broche phi du Z80 avec

#define B_CLOCK 6

des délais définis par la macro

#define B_RESET 7

CLKDELAY en mil isecondes. La

// donne une impulsion sur la broche phi

valeur choisie ici est 40, ce qui

void doClock(unsigned int n) {

laisse le temps de bien voir ce qui

for(int i=0; i<n; i++) {

se passe tout en essayant de faire

digitalWrite(B_CLOCK, HIGH);

delay(CLKDELAY);

en sorte que ce ne soit pas trop

digitalWrite(B_CLOCK, LOW);

ennuyant. Cette fonction prend en

delay(CLKDELAY);

argument le nombre d’impulsions

}

à envoyer.

}

La seconde fonction, doReset(),

// provoque un reset en accord avec la doc

void doReset() {

provoque une réinitialisation

digitalWrite(B_RESET, LOW);

« propre » du Z80 en plaçant la

doClock(5);

ligne /RESET à la masse et en

digitalWrite(B_RESET, HIGH);

envoyant 5 signaux d’horloge (la

}

documentation parle de 3 mini-

// configuration

mum), avant de faire revenir la

void setup() {

broche à l’état haut.

pinMode(B_CLOCK, OUTPUT);

pinMode(B_RESET, OUTPUT);

On passe ensuite à notre fonc-

doReset();

tion de configuration (setup())

}

configurant classiquement les sor-

// boucle principale

ties et provoquant la réinitialisation

void loop() {

avec doReset(), puis à la boucle

doClock(1);

}

principale se contentant se fournir

une impulsion d’horloge à l’infini.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 82

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Créez votre ordinateur 8 bits sur platine à essais : le processeur Une fois le croquis chargé, si

que vous connaissiez le sens de ces clignotements qui

tout est correctement connecté

donne toute son l’importance au résultat : vous faites

(et l’alimentation stable), le Z80

fonctionner un processeur dont la conception remonte

devrait s’animer. À la vitesse

à 1976 et qui est toujours utilisé aujourd’hui dans les

utilisée ici, vous devrez être en

calculatrices Texas Instruments par exemple (TI-83

mesure de voir /M1 s’activer

juste un peu avant /RD de façon

Premium CE, TI-82 Advanced, etc.). Une véritable

régulière (et plus lentement que

légende !

le signal d’horloge) et surtout

Mieux encore, vous avez sous les yeux quelque chose

constater une incrémentation en

que vous ne pourrez jamais voir avec un microcontrôleur

binaire sur les trois leds du bus

comme l’AVR d’un Arduino : son fonctionnement interne.

d’adresse : 000, 001, 010, 011,

100, 101, 110, 111, 000, 001. .

Nous avons appris ici ce qu’est un bus d’adresse et de

données, le principe basique de fonctionnement d’un

Ceci montre clairement que le

processeur, les signaux qu’il doit prendre en compte, et

processeur fait son travail, tente

les cycles qui font que ce fonctionnement est possible.

de lire la mémoire à partir de

Nous avons même, en quelque sorte, écrit notre premier

l’adresse 0x0000, récupère l’op-

programme que nous avons assemblé à la main. Certes

code NOP, exécute l’instruction,

il n’est constitué que d’un seul opcode, mais nous l’avons

incrémente le compteur ordinal,

physiquement fourni au processeur avec nos petits

puis passe à l’instruction sui-

doigts musclés. .

vante et ainsi de suite. Comme

nous ne visualisons que les trois

Je n’aime pas faire des articles à suite étalés sur plu-

premiers bits de l’adresse, nous

sieurs numéros, mais ici nous n’avons malheureusement

avons l’impression que le cycle

pas le choix. Après tout, nous venons de débuter un

se répète. C’est effectivement

voyage qui comprend de nombreuses étapes et dont la

le cas, mais uniquement une

destination finale se résume à la construction d’un ordi-

fois que les 65536 adresses

nateur des années 80.

mémoire auront été parcourues.

La suite logique dans ce genre d’expérimentations

16 bits = 2^16 combinaisons =

consiste normalement à construire un circuit d’hor-

65536 adresses possibles ou,

loge cadençant le processeur (avec un NE555 ou un

en d’autres termes, une mémoire

oscil ateur à quartz par exemple) et à associer une

adressable de 65536 octets ou

mémoire (généralement une UVPROM) au Z80. Ceci

64 Ko.

cependant nécessite d’autres composants et surtout

du matériel, comme un programmeur d’EPROM et un

6. CE QUE NOUS

effaceur UV.

Une autre approche est cependant possible et plus

AVONS APPRIS ET pédagogique : reposer sur la carte Arduino, du moins LA SUITE

encore quelque temps, avant de passer à quelque chose

« en dur ». Si la carte Arduino est en mesure de se com-

Le résultat obtenu peut

porter comme une mémoire et donc de lire une adresse

paraître, pour un œil non averti,

sur tout ou partie du bus, alors el e sera également

quelque chose de relativement

capable de présenter des données en conséquence.

peu d’intérêt. Après tout, il ne

Nous pouvons donc nous servir du croquis non seule-

s’agit que de quelques leds qui

ment comme source d’horloge et de réinitialisation, mais

clignotent et un tel effet peut être

également comme mémoire et ainsi faire exécuter notre

obtenu facilement avec une carte

premier vrai programme au Z80. Voilà précisément quel

Arduino seule. Mais c’est le fait

sera l’objet du prochain article. DB

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

83

TENSIONS & COURANTS

MESURES

PRENEZ DE BONNES

MESURES !

ET SI DÈS LA RENTRÉE ON SE METTAIT AU

COURANT ?

Éric Le Bras

Le domaine du hack rime souvent avec la nécessité de répondre à un besoin nouveau par le biais d’un bricolage rapide. Cette démarche nous conduit spontanément à explorer de nouveaux territoires, à nous immerger dans le monde des techniques électroniques au-delà de la réflexion initiale. Au départ, le cadre d’analyse s’articulait essentiellement autour de la détection de la mise en fonctionnement d’une pompe à l’aide d’un montage Arduino. Cependant, pour

appréhender pleinement ce sujet, un détour s’est vite imposé vers la route de la (re-)découverte de certaines lois visitées lors de notre passage au lycée. Un monde inconnu demeurait face à moi : celui de la détection et de la mesure du courant. Cet article vous propose un panorama des techniques et composants permettant de détecter et mesurer les courants et tensions électriques.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 84

HACKABLE MAGAZINE n°20

http://www.hackable.fr/

Prenez de bonnes mesures !

Détecter le courant Évidemment, le quoi dépendra fortement du pourquoi. S’il circulant dans un

s’agit de vérifier le niveau d’une batterie, il suffira de mesurer circuit, c’est bien

la tension entre ses deux bornes. Mais si l’on veut savoir si un joli, mais de quoi

appareil est en fonctionnement, c’est à la mesure du courant

parle-t-on préci-

que nous nous intéresserons. Et si nous souhaitons connaître

sément ? Lecteur de Hackable,

la quantité d’énergie consommée – et accessoirement ce que

vous possédez probablement déjà

cela va nous coûter –, nous souhaiterons alors mesurer la

les concepts permettant de com-

puissance.

prendre le phénomène électrique

et les principales grandeurs s’y

attachant : courant, tension, puis-

1. MESURER LA TENSION

sance, résistance. Si ce n’est pas

Commençons par le plus simple. L’Arduino est pourvu d’en-

le cas, que vous preniez le train en

trées analogiques (A0 à A5 sur un Uno) servant précisément

marche, ou que simplement vous

à cela.

souhaitiez rafraîchir ces notions,

je ne peux que vous encourager

Pour mesurer une tension située dans la plage de l’entrée

chaudement à lire – ou relire –

(0 à +5 volts), rien de plus simple : relions le dipôle (la batterie l’excel ent article consacré à la Loi

ou le composant électronique alimenté) aux bornes duquel

d’Ohm publié dans le numéro 1 de

nous souhaitons mesurer la tension, à l’entrée analogique, en

votre magazine. Dans la suite de

respectant la polarité : le pôle + sur l’entrée analogique A0 à

cet article, nous appliquerons ces

A5, le pôle - sur la masse GND.

notions, ainsi que quelques autres

Si la tension à mesurer est supérieure à 5 volts (tout en

permettant de comprendre les

restant dans des limites ne vous mettant pas en danger, en

courants alternatifs.

gros jusqu’à 30 volts pour un courant continu), on peut utiliser Mais d’abord, qu’entend-on

un pont diviseur de tension constitué de deux résistances, ou

exactement par mesurer une

bien un potentiomètre, pour ramener la tension dans la plage

tension ou un courant ? À quel e

de 0 à 5 volts.

grandeur s’intéresser et pour quel

Le principe du pont diviseur est assez simple. Il s’appuie

besoin ?

sur la loi d’additivité des tensions, qui précise que la tension Fig.1 : Schéma

d’un pont diviseur.

Le dipôle peut être

indifféremment un

générateur (batterie,

transformateur,

etc.), ou bien un

composant dans un

circuit alimenté.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

85

TENSIONS & COURANTS

MESURES

Fig. 2 : En ajoutant

une tension de 2,5

aux bornes d’un ensemble de récepteurs branchés

En ce qui concerne l’entrée

volts, on décale

tout le signal vers le

en série correspond à la somme des tensions de

analogique de l’Arduino, comme

positif. Ici, un signal

chacun d’entre eux. En particulier, si R1 = R2,

nous l’avons vu sa plage d’uti-

alternatif de 2,5 volts

alors la tension aux bornes de R1 est égale à la

lisation est comprise entre 0

(alternant entre -2,5 et

tension aux bornes de R2, et aussi égale à la moi-

et +5 volts. Il n’est pas recom-

+2,5 volts) devient un

signal positif compris

tié de la tension à mesurer. Précisons qu’un poten-

mandé d’appliquer une tension

entre 0 et +5 volts.

tiomètre peut être vu comme un pont diviseur,

négative (gare aux erreurs de

dont le rapport entre les deux résistances pourrait

polarité !) sans risque pour

varier de façon continue en fonction de la position

l’entrée analogique, voire pour

du curseur.

le microcontrôleur. En pra-

tique, des diodes de coupure

La lecture de l’entrée analogique s’effectue

protègent l’entrée, ce qui limite

au moyen de la fonction analogRead(), avec en

nettement le risque. Il n’est tou-

paramètre l’identifiant de l’entrée analogique à lire.

tefois pas recommandé de lire

Le convertisseur analogique-numérique (ADC)

une tension alternative direc-

effectue un échantil onnage de la tension présente

tement (une tension alternative

sur l’entrée analogique avec une précision de

change de sens selon une cer-

10 bits, ce qui signifie que la valeur retournée par

taine périodicité), ne serait-ce

analogRead() est un entier compris dans l’inter-

que parce que la partie négative

val e 0 à 1023 (210-1), 0 correspondant à la valeur

du signal sera écrêtée. Pour

minimale 0 volt, 1023 à la valeur maximum +5

contourner cette difficulté, il faut

volts. L’application d’une simple règle de 3 permet

décaler le signal dans une plage

de calculer la tension lue sous forme de réel :

positive, en lui ajoutant une ten-

tension = (analogRead(A0) * 5)/1024.0;

sion continue égale à Vcc / 2.

Cette astuce utilise là encore la

loi d’additivité. Supposons un

Notez le point décimal et le 0 après 1024, qui

signal alternatif compris entre

permettent d’obtenir une division flottante.

-2,5 volts et +2,5 volts. En ajou-

Si vous avez utilisé un pont diviseur pour rame-

tant une tension continue de 2,5

ner la tension dans la plage 0 à +5V, alors une

volts, on décale le signal dans la

multiplication supplémentaire par le coefficient de

plage 0 à +5 volts, en déplaçant

division nous donnera la tension à mesurer.

le point 0 vers Vcc / 2.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 86

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Prenez de bonnes mesures !

Fig. 3 : Mesure

d’une tension

alternative. Le

transformateur

est raccordé

en parallèle

avec le circuit

électrique dont

on souhaite

mesurer la

tension.

Cette fois-ci le pont diviseur

plage, puis si nécessaire un pont diviseur ou un potentiomètre,

utilisera deux résistances de

avant de décaler le signal dans la plage 0 à +5 volts.

valeur identique (10 KΩ ou plus)

Selon le but recherché, il se peut que seule la valeur absolue

pour diviser par 2 la tension Vcc

de la tension alternative nous intéresse (voir plus loin dans cet de l’Arduino (+5 V), et ainsi fournir

article le chapitre consacré à la mise en pratique du capteur

la tension de 2,5 V à ajouter au

CT). Cela peut être le cas si l’on souhaite mesurer de façon

signal d’entrée.

simple la valeur d’une tension alternative sinusoïdale. La tech-

Si la tension alternative

nique consiste à ne conserver que la partie positive du signal,

dépasse 12 volts, pour isoler le

en insérant une diode en série ou en paral èle dans le circuit

microcontrôleur on utilisera obliga-

de mesure. Ce composant électronique ne laissant passer le

toirement un transformateur pour

courant que dans un sens, le résultat obtenu est que la partie

ramener la tension dans cette

négative du signal alternatif est écrêtée.

Fig. 4 : La diode

écrête la partie

négative du

signal, en ne

laissant passer

le courant que

dans un seul

sens. Le triangle

indique le sens

du passage du

courant.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

87

TENSIONS & COURANTS

MESURES

2. MESURER LE COURANT

Il s’agit d’un phénomène

physique capital, à la base de

L’entrée analogique de l’Arduino permet de mesurer

nombreuses applications, parmi

une tension, mais non un courant. Pour mesurer un cou-

lesquel es le transformateur de

rant, nous avons besoin de le transformer en tension,

courant, l’alternateur, ou différents

avant de l’appliquer à l’entrée analogique. La loi d’Ohm

capteurs audios tels que : micro-

nous vient ici en aide.

phone dynamique, tête de lecture

Le principe consiste à utiliser une « résistance de

vinyle, magnétophone, guitare

shunt », de valeur connue, montée en série dans le

électrique. Quelle que soit l’appli-

montage où circule le courant que l’on souhaite mesurer,

cation, le principe est globalement

afin de produire une chute de tension. Lorsqu’un courant

la même : un signal électrique est

circule, une tension apparaît aux bornes de la résistance,

produit dans un conducteur sou-

que l’on peut mesurer avec l’entrée analogique. La ten-

mis à un champ magnétique va-

sion et la résistance étant connues, la loi d’Ohm nous

riable, ou bien par le déplacement

fourni la valeur du courant :

du conducteur lui-même dans un

champ magnétique fixe. Concrè-

I = U / R

tement, on utilise un bobinage de

Cependant, la tension mesurée correspond à une

fil de cuivre enroulé autour d’un

chute de tension dans le circuit, ce qui aura une incidence noyau (ferrite ou tôles feuil etées).

sur son fonctionnement. Plus la résistance est élevée,

L’ensemble est placé dans un

plus la chute de tension est importante. A contrario, une

champ magnétique variable. Selon

résistance basse correspond donc à une chute de tension l’application, le champ est dû à un faible, donc une incidence moindre sur le circuit, mais

phénomène physique variable :

une tension plus faible, donc une mesure moins précise.

mise en rotation d’aimants (alter-

Dans certains cas, une amplification pourra même être

nateur), circulation d’un courant

nécessaire ! Bien sûr, la mesure d’un courant en insérant

alternatif (transformateur), mise en

une résistance de shunt directement reliée à l’Arduino

vibration d’une pièce métal ique

dans le circuit à mesurer ne pourra être mise en œuvre

(diaphragme d’un micro dyna-

que lorsque les valeurs de tension et d’intensité du cou-

mique, corde de guitare, pointe

rant circulant dans le circuit à mesurer restent minimes.

de lecture vinyle), déplacement

Si l’on souhaite connaître le courant utilisé par un appareil d’une bande magnétique. Dans le relié au secteur 230 volts, il est totalement exclu de pro-cas de la pointe de lecture vinyle,

céder ainsi. On effectuera plutôt une mesure indirecte en

ce peut-être la bobine el e-même

se servant de l’électromagnétisme, et des composants

qui se déplace dans un champ

spécifiques présentés ci-dessous.

magnétique fixe. Quel e que soit

la cause du champ magnétique

variable (ou du déplacement de

3. UTILISER UN CAPTEUR DE

la bobine), une tension électrique

va apparaître aux bornes du bobi-

COURANT TRANSFORMATEUR nage, et le courant circulera dans le circuit qui lui est relié. Ce cou-

(CT SENSOR)

rant est proportionnel à l’intensité

Il s’agit d’un capteur utilisant le principe de l’induction

du champ magnétique.

électromagnétique. Ce phénomène consiste en l’appari-

Dans le cas du transforma-

tion d’une force électromotrice (donc un mouvement de

teur, nous avons affaire à deux

charges électriques) dans un conducteur soumis à un

bobinages : le primaire et le

champ magnétique variable.

secondaire. Les caractéristiques

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 88

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Prenez de bonnes mesures !

du courant induit dépendent des

• N1 = 1

grandeurs du courant appliqué

• N2 = le nombre de

au primaire, et du rapport entre le

spires du capteur

nombre de spires des deux bobi-

nages. Pour un transformateur

Le capteur TA12-100

idéal (sans pertes), ces rapports

que nous avons utilisé,

s’établissent ainsi :

avec 1000 spires, traversé

par un conducteur, consti-

• U1/U2 = N1/N2 (le rapport

tue un transformateur

entre les tensions primaires

de rapport 1/1000. Ce

et secondaires est égal au

capteur va donc produire

rapport entre les nombres de

un courant dont l’intensité

spires dans les bobinages

sera égale à 1/1000 de

primaires et secondaires).

l’intensité à mesurer cir-

• I2/I1 = N1/N2 (le rapport

culant dans le conducteur.

Fig. 5 : Un capteur

entre les courants primaires

Comme notre Arduino ne

de courant TA12-

et secondaires est l’inverse

mesure que des tensions,

100. On le trouve

du rapport entre les nombres

nous sommes ramenés au cas vu précédemment

souvent monté

d’utilisation de la résistance de shunt, à ceci près que

de spires dans les bobinages

sur une breakout

nous pouvons utiliser une valeur de résistance plus

board, avec une

primaires et secondaires).

élevée, car nous ne l’insérons pas dans un circuit

simple résistance

Il s’ensuit donc que l’intensité

alimentant un appareil. On parle dès lors plutôt de

de charge, pour

deux fois le prix du

du courant traversant le circuit

« résistance de charge ».

composant seul

côté secondaire est inversement

comme ici.

La valeur de la résistance de charge sera choisie

proportionnelle au rapport du

en fonction de l’intensité du courant à mesurer et du

nombre de spires entre les bobi-

nombre de spires du capteur, afin d’obtenir une ten-

nages primaires et secondaires.

sion aux bornes de la résistance correspondant à la

Notre capteur de courant fonc-

plage de mesure. Selon le but recherché, on « déca-

tionne sur le même principe. Le

lera » ensuite la tension alternative autour de Vcc / 2

champ magnétique variable est

(2,5 volts dans le cas de l’Arduino), ou bien on écrê-

produit par le courant circulant

tera la partie négative à l’aide d’une diode.

dans un conducteur (le câble

Le grand intérêt de ce capteur est son fonctionne-

alimentant la lampe ou le PC). Le

ment non invasif et totalement sécurisé, puisque qu’il

conducteur traverse un anneau

permet l’isolation galvanique entre le circuit à mesurer

de ferrite autour duquel est

et le capteur (il n’existe aucune liaison conductrice

enroulé un bobinage unique (at-

entre eux). Il est enfin très simple à mettre en œuvre.

tention : le conducteur peut être

indifféremment la phase ou le

Un défaut mineur réside toutefois dans le fait que

neutre, mais vous ne devez faire

le noyau se magnétisant avec l’usage, ceci dans le

passer qu’un seul des deux dans

temps introduit un biais dans la mesure, biais qui ne

le capteur). L’ensemble consti-

pourra être compensé qu’en démagnétisant le noyau

tué du conducteur traversant le

(on constate d’ail eurs ce même phénomène avec les

capteur peut être assimilé à un

micros).

transformateur avec le conduc-

Notons toutefois que ce capteur reposant sur

teur jouant le rôle du primaire, et

le phénomène de l’induction électromagnétique, il

le bobinage du capteur celui du

ne permet de détecter que des courants alternatifs

secondaire. On a donc :

(souvenez-vous : le courant induit est dû à un champ

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

89

TENSIONS & COURANTS

MESURES

magnétique variable). Si l’on souhaite mesurer un

Par ailleurs, le champ magné-

courant quelconque (alternatif ou continu), et si ce

tique pouvant être produit non

courant ne peut pas être mesuré dans des condi-

plus par un aimant, mais par un

tions de sécurité en utilisant la résistance de shunt,

courant électrique, dans le cas

un autre phénomène physique vient à notre aide :

qui nous intéresse l’effet Hall

l’effet Hal .

permet également de conce-

voir des détecteurs de courant.

Contrairement au phénomène

4. LES CAPTEURS À EFFET

d’induction vu précédemment, le

HALL

phénomène se produit dans tous

les cas de présence d’un champ

Le capteur à effet Hall repose sur un phénomène

magnétique, variable ou pas. Un

physique bien différent, quoique toujours relié à

capteur basé sur ce phénomène

l’électromagnétisme, découvert par Edwin Herbert

physique est donc – contraire-

Fig. 6 : Capteurs

Hall en 1879.

ment au capteur de type trans-

à effet Hall. Il

formateur – apte à mesurer un

s’agit de modèles

L’effet Hall consiste en l’apparition d’une tension

courant, quel qu’il soit, étant don-

plutôt destinés à

dirigée perpendiculairement à un conducteur tra-

détecter le champ

né que tout courant électrique,

magnétique d’un

versé par un courant, lorsque ce conducteur est

même continu, produit un champ

aimant, mais ils

soumis à un champ magnétique (fixe ou variable). La magnétique autour du conducteur peuvent également

tension de Hall est fonction de l’intensité du champ

qu’il traverse.

être mis en œuvre

magnétique. En mesurant cel e-ci, on connaît par

avec un tore

de ferrite pour

conséquent ce dernier. Le capteur à effet Hall

Les capteurs à effet Hall se

constituer un

mesure donc un flux magnétique, et non le courant

présentent généralement sous la

capteur très sûr,

induit par sa variation, comme dans le cas du trans-

forme d’un boîtier de quelques

sans connexion

formateur. Autre différence : un capteur basé sur

mil imètres de côté. Pour détecter

électrique directe

avec le courant à

l’effet Hall nécessite un courant d’alimentation.

un courant, le capteur est parfois

inséré dans un tore de ferrite.

mesurer.

Les capteurs à effet

Hall étant ainsi capables

de détecter un flux ma-

Attention : Une sonde

gnétique quelconque en

ampèremétrique fonction-

le transformant en ten-

nant sur ce principe peut

sion, ils trouvent de très

être fabriquée à la maison.

nombreuses applications,

Si vous souhaitez aller plus

notamment cel es basées

loin sur le sujet, je vous

sur la détection d’aimant.

recommande la lecture de

Ainsi, ils permettent de

cette excellente page de

créer des détecteurs

Yann Guidon : http://ygdes.

d’ouverture, de vitesse,

com/sonde-courant/.

de fonctionnement de

moteur ou de niveau de

liquide, pour ne citer que

Les capteurs à effet Hall se

les plus usuels. Ces cap-

déclinent dans de très nom-

teurs, n’étant soumis à

breuses variantes, toutefois ceux

aucun effort mécanique,

permettant de mesurer un courant

sont d’une très grande

possèdent généralement trois

fiabilité.

connexions :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 90

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Prenez de bonnes mesures !

Fig. 7 : Ces deux

modules sont à

base d’ACS712. Le

plus gros avec une

plaque d’isolation (en

haut) est celui qui a

donné les meilleurs

résultats lors de nos

expérimentations

(voir la mise en

pratique plus loin

dans cet article). On

le trouve pour un peu

moins de 5 euros

chez Deal Extreme

(www.dx.com).

• Vcc est reliée à une source de

utilisant l’effet Hal . Ce capteur nécessite une connexion élec-

tension (broche +5 volts sur

trique avec le circuit à mesurer. On le trouve souvent monté

l’Arduino).

sur breakout board, avec un bornier pour les connexions

• GND est reliée à la masse.

vers le circuit à mesurer. Ce capteur plutôt économique peut

trouver des applications s’il est utilisé sur une instal ation fixe

• La sortie Vout varie linéaire-

dans des conditions de sécurité satisfaisantes (du fait des

ment avec le courant (alternatif

connexions électriques nécessaires) : isolation, mais aussi

ou continu) capté en entrée.

respect du courant maximal spécifié par le composant.

Lorsque le capteur est au

repos (pas de courant détecté),

Bien d’autres solutions existent, mais la place – et le

Vout présente une tension

temps ! – manqueraient pour les citer toutes. Mentionnons

toutefois encore l’INA219 de Texas Instruments. Il s’agit

égale à Vcc/2. Lorsque le

d’un circuit intégré nettement plus complexe, intégrant de la

capteur détecte un courant, la

logique et avec des paramètres programmables, qui a pour

différence mesurée sur cette

particularité de mesurer en même temps le courant et la

broche en plus ou en moins

tension. Il peut même multiplier l’un par l’autre pour fournir la par rapport à Vcc/2 est propor-puissance en direct ! Ce circuit est un vrai périphérique doté

tionnel e au courant détecté.

d’une interface I2C pour communiquer avec le microcontrô-

Le coefficient à appliquer pour

leur. Comme il ne peut mesurer que des tensions comprises

convertir la tension en courant

entre -26 et +26 volts, son domaine d’application est destiné

correspond à la sensibilité en

au contrôle de tension ou de consommation au sein d’appa-

mV/A fournie par la datasheet.

reils utilisant des tensions comprises dans cette gamme.

Notons également l’existence

On le trouvera donc dans les équipements informatiques ou

de l’ACS712, un détecteur de cou-

télécoms, alimentations, chargeurs de batteries, fers à sou-

rant sous forme de circuit intégré

der, etc.).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

91

TENSIONS & COURANTS

MESURES

5. EXPÉRIMENTONS AVEC LES permet d’obtenir 2,5 volts à partir CAPTEURS

d’une broche 5 volts de l’Arduino.

Cette tension continue, du fait du

montage en série, s’ajoute à la

5.1 Utilisons le traceur pour

tension aux bornes de la résis-

visualiser le courant

tance de charge. Ainsi, la tension

Nous vous proposons maintenant de passer à la

alternative est centrée autour de

pratique en détectant le courant utilisé par un appareil

2,5 volts, au lieu de 0 volt.

électrique, à l’aide d’un capteur CT (basé sur un transfor-

Le choix de la valeur de la

mateur de courant).

résistance de charge va per-

L’environnement Arduino dispose, depuis quelques

mettre de jouer sur la tension

Fig. 8 : Le signal

versions, d’un « traceur série » permettant de représen-

mesurée. Le but est d’obtenir une

en sortie du

ter graphiquement des valeurs numériques, sous forme

tension alternative comprise dans

TA12-100 est

l’interval e -2,5 à +2,5 volts. La loi

additionné à la

de courbes. Ce traceur est très simple d’utilisation. Bien

tension continue

que rudimentaire, il nous suffira pour visualiser le cou-

d’Ohm intervient ici :

de 2,5 volts

rant détecté sous forme de courbe.

produite par le

I = U / R

pont diviseur formé

Le montage utilisé est le suivant :

des résistances

Ainsi, une résistance de

R1 et R2. Le zéro

200 ohms permet de mesurer

du signal est ainsi

une intensité maximale de 2,5 V /

porté à 2,5 volts.

200 Ω, soit 0,0125 A.

I2/I1 = N1/N2 (voir plus haut)

N1 = 1, et N2 = 1000 (nombre

de spires du TA12-100), donc I1 =

I2 x 1000 = 12,5 A

Le courant est alternatif et,

pour simplifier le calcul, sup-

posé de forme sinusoïdale, donc

l’intensité efficace est ici égale

à 12,5 / RAC(2) = 8,84 A (voir

l’explication de ce calcul dans le

chapitre suivant).

Un des fils alimentant l’appareil électrique (il peut

s’agir pour cette expérience d’un appareil quelconque :

Ceci correspond au courant

lampe, appareil de chauffage, PC, réfrigérateur, etc.)

circulant dans un appareil utilisant

traverse le capteur CT (ici : un TA12-100, mais tout

approximativement 2000 W (sous

capteur du même type fera l’affaire. Il faut cependant

230 V). C’est suffisant avec la plu-

connaître le nombre de spires du bobinage). Attention :

part des éclairages ou des appa-

un seul fil doit traverser le capteur, non pas le câble

reils courants. Si l’appareil fait

complet).

plus de 2000 W, il faudra utiliser

une résistance moins importante

Une résistance de charge est reliée aux deux

pour garder la tension mesurée en

bornes du capteur. Un pont diviseur avec deux résis-

deçà de 2,5 V.

tances de même valeur (10 K ohms, la valeur a rela-

tivement peu d’importance, mais elle doit néanmoins

Le croquis est on ne peut plus

être suffisante pour ne pas trop « tirer » sur l’Arduino)

simple :

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 92

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Prenez de bonnes mesures !

Fig. 9 :

Les données

échantillonnées

par le

convertisseur

ADC de l’Arduino,

telles qu’elles

apparaissent sur

le traceur série.

void setup() {

lampes, radiateurs, fers à repasser,

Serial.begin(2000000);

chauffe-eaux ou bouil oires, etc. : le

}

courant utilisé est égal à la tension

divisée par leur résistance, point. En

void loop() {

revanche dans le cas des appareils

Serial.print(analogRead(A0));

utilisant des composants tels que des

Serial.println();

moteurs ou des condensateurs, des

}

phénomènes inductifs et/ou capacitifs

entrent en jeu. Ces appareils renvoient

La boucle consiste à lire l’entrée analogique A0,

de l’énergie dans le courant d’alimen-

puis à écrire la valeur lue (entier compris entre 0 et

tation, d’où il résulte un déphasage

1023) sur la sortie série. Le croquis est conçu avec

entre la courbe du courant et cel e de

l’efficacité en tête : il s’agit simplement d’échantil on-

la tension. Des consommateurs plus

ner le courant le plus vite possible.

complexes, tels que les alimentations

Compilez et téléversez le croquis, puis lancez le

de PC, ont une courbe de consom-

traceur série.

mation de courant qui n’est plus sinu-

soïdale. Dans ce cas, si l’on souhaite

obtenir une mesure précise, il faudra

5.2 Mesurons le courant avec le opter pour des techniques de mesure capteur CT

plus complexes, que nous n’aborde-

Ici quelques notions sur le courant alternatif

rons pas ici faute de place.

valent d’être rappelées. Pour faire simple, nous sup-

Notons qu’ici intervient également

poserons que le courant circulant dans l’appareil,

la notion de facteur de puissance, qui

dont nous souhaitons mesurer l’utilisation, varie

permet de distinguer la puissance

selon une fonction sinusoïdale parfaitement en

active (la puissance réellement pro-

phase avec la tension. Ceci n’est totalement vrai

duite par l’appareil, et facturée par

que pour les appareils purement résistifs, tels que

le distributeur) mesurée en watts,

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

93

TENSIONS & COURANTS

MESURES

de la puissance apparente, égale au produit des valeurs

absolue. En particulier, lorsque le

efficaces du courant et de la tension (voir plus bas), et

courant est de forme sinusoïdale,

mesurée en VA (volts-ampères). Dans le cadre restreint qui

on démontre que l’intensité effi-

nous intéresse ici de la mesure du courant consommé par

cace est :

un appareil purement résistif, ces deux valeurs sont égales.

I = I / RAC(2)

On a donc la puissance réel ement consommée en calcu-

rms

max

lant la puissance apparente. Dans tous les autres cas, la

Concrètement, pour effectuer

puissance active est inférieure à la puissance apparente et

la mesure, nous al ons utiliser un

doit être déterminée par d’autres moyens.

montage sensiblement différent

par rapport à l’exemple précédent.

Ici nous n’avons pas besoin de

Pour approfondir ces notions, nous vous recom-

redresser le courant en déplaçant le

mandons la lecture de la page Wikipédia consa-

0 vers Vcc/2. En effet, il nous suffit

crée au facteur de puissance.

de mesurer l’intensité maximale

par rapport au 0. Nous n’utiliserons

donc pas de diviseur de tension

Dans le cas qui nous intéresse ici d’un courant alterna-

relié au +5 volts, mais une diode

tif sinusoïdal, l’intensité alterne selon une périodicité fixe

pour écrêter les alternances néga-

entre une valeur négative minimale et une valeur positive

tives. La diode sera placée en série

maximale, les deux étant égales en valeur absolue. Nous

avec le capteur, en amont de la

notons I cette intensité, mesurée au sommet de l’onde

max

résistance de charge de 200 ohms.

sinusoïdale.

Le croquis utilisé pour l’expéri-

Dans le cadre de la mesure d’un courant alternatif, nous

mentation effectue une mesure du

nous intéressons plus particulièrement au courant réel-

courant toutes les secondes. Le

lement consommé sur une période de temps. C’est ainsi

calcul suit les explications qui pré-

qu’intervient la notion de courant efficace, ou courant RMS.

cèdent sur la mesure du courant

Un appareil purement résistif consommant 1 A de courant

alternatif. On notera en particulier

efficace fournit la même énergie que s’il était traversé par

la détermination de I , obtenue

max

un courant continu d’1 A.

par échantillonnage en boucle de

Le courant efficace est défini comme la racine carrée

l’entrée A0 et mémorisation de

de la moyenne de l’intensité au carré (RMS = root mean

la valeur maximale pendant un

square), définie sur un interval e de temps donné. En sim-

interval e de temps égal à deux

plifiant, il s’agit de la moyenne du courant pris en valeur

périodes.

Fig. 10 : Le signal en

sortie du TA12-100 est

redressé au travers

de la diode, pour ne

conserver que les

alternances positives.

La résistance de charge

R1 présente à ses

bornes une tension

proportionnelle au

courant qui la traverse.

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 94

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Prenez de bonnes mesures !

// Mesure de courant avec le capteur TA12-100

int capteur = A0;

// Le pic de tension aux bornes de la résistance

float tensionMax;

// Pic de courant au travers de la résistance

float courantMax;

// Courant efficace au travers de la résistance

float courantRMS;

// Valeur réelle du courant détecté par le capteur

float courantCapteur;

void setup()

{

Serial.begin(115200);

Serial.println("Go!");

pinMode(capteur, INPUT);

}

void loop()

{

tensionMax = getTensionMax();

// Calcul du courant

// Loi d'Ohm, résultat en mA

courantMax = (tensionMax / 200.0) * 1000.0;

// Division par RAC(2) pour obtenir le courant efficace

courantRMS = courantMax / 1.4142;

// Multiplier par le nombre de spires du capteur

courantCapteur = courantRMS * 1000;

Serial.print("Tension (pic) : ");

Serial.print(tensionMax, 3);

Serial.println(" volts");

Serial.print("Courant au travers de la résistance (pic) : "); Serial.print(courantMax, 3);

Serial.println(" mA");

Serial.print("Courant au travers de la résistance (efficace) : "); Serial.print(courantRMS, 3);

Serial.println(" mA");

Serial.print("Courant détecté (efficace) : ");

Serial.print(courantCapteur, 3);

Serial.println(" mA");

Serial.println();

delay(1000);

}

float getTensionMax()

{ int valeurLue;

int valeurMax = 0;

uint32_t start_time = millis();

while((millis() - start_time) < 40) // 2/50 s {

valeurLue = analogRead(capteur);

if (valeurLue > valeurMax) {

valeurMax = valeurLue;

}

}

// Conversion de la valeur max en tension

return (valeurMax * 5) / 1024.0;

}

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

95

TENSIONS & COURANTS

MESURES

Téléversons le croquis sur l’Arduino, puis affichons la console série. Si le courant circule dans le câble passant au travers du capteur (dans notre essai nous alimentons une ampoule halogène de 70 watts), nous devrions obtenir une sortie semblable à ceci : Tension (pic) : 0.083 volts

Courant au travers de la résistance (pic) : 0.415 mA

Courant au travers de la résistance (efficace) : 0.293 mA

Courant détecté (efficace) : 293.480 mA

Le courant RMS apparaît sur la dernière ligne. En multipliant cette valeur par 230 volts (qui est la tension efficace du secteur en France, la tension maximale atteignant en valeur absolue 325

volts, c’est-à-dire 230 x RAC(2)), on trouve une puissance consommée de 67,5 watts, ce qui n’est pas éloigné des 70 watts inscrits sur l’ampoule.

5.3 Mesurons le courant avec un capteur à effet Hall

Reproduisons notre expérience précédente avec un capteur à effet Hal . Nous avons choisi d’utiliser plus spécifiquement un module à base d’ACS712, toutefois un autre modèle de capteur à effet Hall pourrait être utilisé.

Notre capteur, qui ressemble fort à un petit relais, possède d’un côté un bornier avec deux points permettant le montage en série avec le circuit électrique à mesurer. Contrairement au capteur CT, l’ACS712 nécessite donc une connexion directe avec le courant à mesurer. Bien sûr, nous vous recommandons comme toujours la plus grande prudence lors de son utilisation.

Effectuez toutes les connexions hors tension, vérifiez deux fois avant de mettre sous tension, et ne laissez rien traîner sur la table. Travail ez dans un environnement tranquil e, sans perturba-tion, mais non pas seul chez vous ! Si vous faites attention, vous ne prendrez pas plus de risque qu’en changeant une ampoule (et vous ne risquez pas de tomber de l’escabeau). Par ail eurs, ne dépassez pas le courant maximal spécifié par le fabricant, variable selon le modèle, et indiqué dans le datasheet. Vérifiez bien le marquage sur le boîtier (une bonne loupe vous sera peut-être nécessaire). On ne peut pas exclure qu’un vendeur peu scrupuleux vous ait fourgué un module équipé d’un ACS712ELCTR-05B-T (supportant un courant maximal de 5 ampères) comme étant un x20A ou un x30A. Une tel e « erreur » pourrait entraîner des conséquences funestes (et

« fumeuses »...).

Du côté opposé on trouve les trois broches détail ées plus haut dans le paragraphe introduisant les capteurs à effet Hal :

• Vcc doit être reliée à la broche 5 volts.

• GND doit être reliée à la broche GND.

• Vout doit être reliée à la broche A0.

Il n’y a pas de composant à ajouter, comme dans le cas du capteur CT : d’une part, le capteur génère en sortie une tension sur la broche Vout, qu’il suffit de mesurer directement (dans le cas du capteur CT une résistance de charge est nécessaire pour générer cette tension). D’autre part, par spécification, le signal généré sur cette même broche est centré sur Vcc/2, et borné entre 0 volts et Vcc, c’est-à-dire 5 volts. Il n’y a donc pas besoin de diode pour protéger l’entrée analogique.

Le croquis étant proche de celui utilisé dans l’expérience utilisant le capteur CT, nous ne men-tionnerons que ce qui diffère (le croquis complet peut être récupéré sur le GitHub d’Hackable).

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 96

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Prenez de bonnes mesures !

Fig. 11 :

L’ACS712

en action.

Comment ne

pas rappeler

d’effectuer

toutes les

connexions

hors tension,

avec les

précautions

d’usage ?

Tout d’abord, la valeur lue sur A0 étant centrée sur Vcc/2, nous avons besoin avant d’effectuer nos conversions, de la ramener dans un interval e centré sur 0. La valeur à soustraire est théoriquement égale à 2,5 volts (Vcc/2), toutefois il est prudent d’expérimenter le montage en l’absence de courant à mesurer, afin d’effectuer un calibrage de ce point 0. Lors de notre expé-

rience, en échantil onnant le capteur en l’absence de courant sur le bornier, nous avons obtenu une valeur de 516, soit légèrement supérieure à 1024/2. La valeur mesurée correspond donc à une tension au repos de 516 x 5 / 1024, soit 2,52 volts.

La dernière ligne de la fonction getTensionMax() devient donc : return ((valeurMax - 516) * 5) / 1024.0;

Bien sûr, comme disent les anglo-saxons, « votre kilométrage peut varier ». Vous devrez donc effectuer votre propre calibrage, et remplacer 516 par la valeur que vous aurez obtenue.

La conversion de la tension en courant fait intervenir la sensibilité en mV/A fournie par la datasheet. Notre capteur est un ACS712ELCTR-05B-T, il est prévu pour un courant maximal de 5 ampères, et sa sensibilité est de 185 mV par ampère. Le courant en ampères est donc obtenu en divisant la différence de tension par rapport à Vcc/2 (que nous avons calculée précédemment), par le coefficient 0,185 :

courantMax = (tensionMax / 0.185) * 1000.0; // Résultat en mA Le courant efficace est obtenu comme précédemment :

courantRMS = courantMax / 1.4142; // Division par RAC(2) pour obtenir le courant efficace

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) https:/ www.ed-diamond.com

HACKABLE MAGAZINE n°20

97

TENSIONS & COURANTS

MESURES

Cette fois-ci, nous obtenons directement la valeur du cou-

alternative n’ont plus tout à fait

rant en entrée du capteur (avec le capteur CT, il faut effec-

cours et donnent un résultat ap-

tuer une multiplication par le nombre de spires).

proximatif. Pour obtenir une me-

La sortie sur la console série, avec la même ampoule de

sure vraiment précise, il faut faire

70 watts, est la suivante :

appel à des algorithmes d’échan-

til onnage un peu plus complexes,

Valeur échantillon = 533

permettant de mesurer la puis-

Tension (pic) : 0.083 volts

sance active réellement consom-

Courant entrée capteur (pic) : 448.691 mA

mée dans toutes les situations,

Courant entrée capteur (efficace) : 317.275 mA

en mesurant en même temps le

courant et la tension. Il nous a

La puissance est ici : 0,317 A x 230 V = 72,91 W.

semblé plus pédagogique d’appré-

On est donc dans la même marge d’erreur qu’avec le cap-

hender le sujet par étape, et de

teur CT, mais cette fois-ci dans l’autre sens.

vous présenter la façon de faire

Précisons que pendant nos essais, nous avons testé deux la plus simple possible. Une mise modules basés sur le même circuit intégré ACS712 (le même en application plus orientée vers modèle pour un courant maximum de 5 ampères). Nous

des conditions réel es d’utilisation,

vous avons présenté les résultats obtenus avec l’un des

exploitant les librairies disponibles

deux. Le second a fourni des résultats très instables (inten-

dans le domaine, pourra faire

sité efficace oscil ant entre 149 et 317 mA, dans les mêmes

l’objet d’un second article dans un

conditions d’expérience). Étrangement ce dernier était parmi

prochain numéro.

les moins chers. .

Notons que si vous avez

besoin simplement de détecter

POUR CONCLURE

la mise en fonctionnement d’un

appareil (sans s’intéresser à sa

Précisons encore que tous ces essais ont été faits uni-

consommation), quel qu’il soit (par

quement avec un courant traversant une charge résistive

exemple : mise en fonctionnement

(une ampoule de 70 watts), donc un courant de forme sinu-

d’une pompe de forage ou de pis-

soïdale, en phase avec la tension. Dans ces conditions, les

cine, d’un PC. .), nul besoin d’une

résultats obtenus sont plutôt satisfaisants. Un calibrage plus

précision « au 1/10ème » : les

fin du montage, tenant compte des caractéristiques mesu-

montages ci-dessus conviennent

rées de l’entrée analogique de l’Arduino, de la résistance

parfaitement.

et de la diode dans le cas du capteur CT (les diodes à l’état

Cet article nous a permis

passant présentent une chute de tension qui constitue une

toutefois d’ouvrir les portes de

de leurs caractéristiques), permettrait sans aucun doute

la détection et de la mesure du

d’obtenir une mesure plus précise.

courant électrique et du champ

Toutefois, à l’échel e du domicile, notre utilisation de

électromagnétique, et d’entrevoir

l’énergie électrique ne se limite plus depuis très longtemps

les nombreuses applications pou-

aux ampoules à filaments, aux chauffages à résistance et

vant exploiter ces phénomènes, et

autres fers à repasser ou chauffe-eaux. La présence d’équi-

pas seulement dans le cadre de la

pements tels que réfrigérateurs, PC, télévisions, climatisa-

mesure du courant. Les capteurs

tions, VMC, machines à laver, etc. fait que le courant circu-

à effet Hall ouvrent notamment

lant dans les circuits n’est plus en phase avec la tension,

des perspectives d’emploi que l’on

et que la puissance en résultant s’écarte du modèle d’onde

imagine aisément assez vastes, en

sinusoïdale dont il est question dans cet article. Les fonc-

matière de contrôle, de sécurité, de

tions mathématiques de calcul de courant ou de tension

détection ou de mesure. ELB

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 98

HACKABLE MAGAZINE n°20

https:/ www.hackable.fr/

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com)

EXPLORE A WORLD OF POSSIBILITIES*

À 5 MINUTES DE L’OCÉAN ET EN PLEIN CŒUR

D’UN PÔLE D’EXCELLENCE TECHNOLOGIQUE,

LE SITE DE BREST RECRUTE DANS LES MÉTIERS

DE L’INGÉNIERIE MATÉRIEL.

Vous recherchez les challenges techniques et technologiques,

innover est pour vous une source de motivation professionnelle forte ?

Vous êtes développeur confirmé en hardware numérique

et souhaitez apporter votre expertise au service de nos

projets Aéroportés et navals ?

NOUS VOUS PROPOSONS DE VENIR DÉCOUVRIR NOTRE VILLE

ET SITE DE BREST UN WEEK-END, SEUL(E) OU EN FAMILLE !

Envoyez votre CV à thales-brest-recrute@fr.thalesgroup.com et venez nous rencontrer !

* ENSEMBLE NOUS EXPLORONS UN MONDE DE POSSIBILITÉS

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com)

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com)

Document Outline

- creez_une_lampe_lunairepreparation

- le_code_de_depart

- des_double_pas_vraiment_double

- le_probleme_et_la_solution

- avant_de_passer_a_la_pratique

- creez_une_lampe_lunaireen_route

- mettons_un_peu_d_ordre

- le_montage

- le_croquis_principal_et_nos_fonctions_ma

- c_est_le_moment_de_bricoler

- perspectives

- fabriquez_vos_cables_jumpers_pour_platin

- types_et_taille_de_cablesc_est_pas_si_si

- utiliser_les_cables

- pour_finir

- creez_votre_ordinateur_8_bit_sur_platine

- soc_processeur_et_microcontroleur

- choisir_son_processeur

- le_z80_sur_platinele_b.a.ba

- le_z80_sur_platinevers_le_premier_essai

- le_montage_et_le_resultat

- ce_que_nous_avons_appris_et_la_suite

Table of Contents

creez_une_lampe_lunairepreparation

le_code_de_depart

des_double_pas_vraiment_double

le_probleme_et_la_solution

avant_de_passer_a_la_pratique

creez_une_lampe_lunaireen_route

mettons_un_peu_d_ordre

le_montage

le_croquis_principal_et_nos_fonctions_ma

c_est_le_moment_de_bricoler

perspectives

fabriquez_vos_cables_jumpers_pour_platin

types_et_taille_de_cablesc_est_pas_si_si

utiliser_les_cables

pour_finir

creez_votre_ordinateur_8_bit_sur_platine

soc_processeur_et_microcontroleur

choisir_son_processeur

le_z80_sur_platinele_b.a.ba

le_z80_sur_platinevers_le_premier_essai

le_montage_et_le_resultat

ce_que_nous_avons_appris_et_la_suite