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

ÉDITO

SOMMAIRE

Personnaliser ça n’est pas important. . c’est capital !

Peut-être qu’une tel e affirmation vous parait évidente, mais

ÉQUIPEMENT

ce n’est généralement pas le cas pour tout le monde. Ce que la

plupart des gens ne réalisent souvent jamais durant toute leur

04

vie est que la plupart des objets qui les entourent ne leur sont

pas réel ement adaptés ou destinés. Il ne s’agit que d’objets

Utilisez un programmeur d'EPROM

dont l’utilité, l’aspect ou les fonctionnalités sont génériques,

adaptés non pas aux individus qui les possèdent, mais à une

avec votre Raspberry Pi

moyenne des préférences d’un ensemble, d’un groupe.

Cette il usion qui consiste à disposer d’objets, d’accessoires

et d’outils qui semblent nous convenir n’est rien d’autre qu’une adaptation de nos personnes ARDU'N'CO

aux objets en question, alors que le principe naturel est précisément strictement opposé.

Lorsqu’on y réfléchit un peu, on se rend compte que même lorsqu’on change, par exemple, sa 14

vieil e bouil oire pour une autre, on fait un choix qui est forcément biaisé. On choisit dans une gamme de produits qui finalement ne sont faits pour personne en particulier, et certainement Créez un effet « feu » avec une

pas pour nous-mêmes. En cela, la diversité du choix qui vous est proposé ne change absolu-matrice de leds

ment rien, il s’agit toujours de produits dont le but est de satisfaire un ensemble de personnes, mais, en même temps, qui sont voués par définition à ne jamais satisfaire personne totalement.

Pourtant, tout autour de nous, dans nos vies, nous avons ces objets que nous côtoyons EN COUVERTURE

régulièrement, quotidiennement. Chaque matin, j’utilise « ma » bouil oire pour mon petit-déjeu-ner (café, mails, café, GitHub, café, Twitter. . Oui je sais « faut » manger le matin, mais je suis un rebel e), mais ce n’est pas réel ement ma bouil oire, c’est un clone de cel e de bien d’autres 24

personnes. Du moins c’était le cas avant que je ne décide de changer les leds vertes qui Créez des boutons à copier/coller

l’éclairent pour des leds bleues. Là et uniquement là, c’est devenu MA bouil oire. La seule où j’ai changé ce petit élément et qui, même si d’autres personnes peuvent avoir eu la même idée, la seule où moi j’ai fait ce changement. El e est maintenant unique. . unique et vraiment mienne.

30

Peu importe la façon dont vous vous appropriez ces objets, qu’il s’agisse d’y faire des Créez un contrôleur de volume pour

modifications complexes ou d’y col er simplement un autocol ant, l’élément clé consiste à avoir une connexion avec ce qui vous entoure et ne pas finir par vivre dans un catalogue Ikea, dans votre ordinateur

un environnement qui finalement ne vous ressemble pas, n’est pas vraiment le vôtre, mais un ensemble de pièces génériques.

44

Le résultat de cette approche est non seulement de vivre dans un environnement qui vous est réel ement familier, mais également de développer de plus en plus de capacités à adapter, Transformez un vieux matériel de

transformer et créer des objets. Que cela commence par un coup de peinture, la couture d’un bout de tissu ou le changement de leds dans une bouil oire, importe peu, cela réveil e votre 30 ans en clavier USB

créativité, votre capacité à changer les choses et à les adapter à vos besoins. Peut-être que le résultat laissera stoïque votre voisin ou vos amis, mais ces objets contrairement aux leurs, seront adaptés à vos préférences. Vous y aurez mis votre marque.

EMBARQUÉ & INFORMATIQUE

Sans doute suis-je en train de prêcher des convertis, mais vous êtes aussi les personnes les mieux placées pour rappeler autour de vous que cette capacité à ne pas se satisfaire de 60

produits qui ne sont créés pour personne et qu’adapter, modifier et personnaliser est un don présent en chacun de nous, indubitablement propre à l’espèce humaine, et qui devrait s’expri-Configurez un clavier Bluetooth pour

mer en chaque instant, quel que soit le moyen, électronique ou non. .

votre Pi

66

Changez la configuration des leds de

Plate-forme de Saint-Quentin-Fallavier.

votre Raspberry Pi

Hackable Magazine

Tél. : 04 74 82 63 04

est édité par Les Éditions Diamond

Service des ventes : Abomarque : 09 53 15 21 77

IMPRIMÉ en Allemagne - PRINTED in Germany

DÉMONTAGE, HACKS & RÉCUP

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

N° ISSN : 2427-4631

76

Commission paritaire : K92470

10, Place de la Cathédrale - 68000 Colmar

Périodicité : bimestriel

Utilisez votre Arduino UNO comme

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

Prix de vente : 7,90 €

périphérique USB

E-mail : lecteurs@hackable.fr

La rédaction n’est pas

Service commercial : cial@ed-diamond.com

responsable des textes,

illustrations et photos qui

Sites : http://www.hackable.fr/

lui sont communiqués par

http://www.ed-diamond.com

leurs auteurs. La repro-

REPÈRE & SCIENCE

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.

Rédacteur en chef : Denis Bodor

Sauf accord particulier, les manuscrits, photos et dessins adressés à 88

Réalisation graphique : Kathrin Scali

Hackable Magazine, publiés ou non, ne sont ni rendus, ni renvoyés. Les Responsable publicité : Valérie Fréchard,

indications de prix et d’adresses figurant dans les pages rédactionnel es Les codes tournants ou comment ne

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 respectif. Tous les logos représentés dans le magazine sont la propriété pas envoyer le même message

Service abonnement : Tél. : 03 67 10 00 20

de leur ayant droit respectif.

Impression : pva, Landau, Allemagne

deux fois

Distribution France : (uniquement pour les

Suivez-nous sur Twitter

dépositaires de presse)

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

@hackablemag

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

ABONNEMENT

À PROPOS DE HACKABLE...

51/52

Abonnements multi-supports

HACKS, HACKERS & HACKABLE

Ce magazine ne traite pas de piratage. Un hack est une solution rapide et bricolée pour régler un 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 haztitnp:/

e a é w

t w

é ch w

ois .ed

i pou-d

r reiaflém

te o

r c netd.

e ncotoiom

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°17

3

ÉQUIPEMENT

PROGRAMMEUR EPROM

UTILISEZ UN

PROGRAMMEUR

D’EPROM AVEC VOTRE

RASPBERRY PI

Denis Bodor

Le titre de cet article ne fait pas honneur au matériel et au logiciel que je vais décrire ici. Bien au-delà de la lecture et l’écriture de simples mémoires comme les EPROM, UVPROM ou EEPROM, le périphérique

que vous êtes sur le point de découvrir sait également gérer la

mémoire des microcontrôleurs Atmel AVR, Microchip PIC ou encore de la famille 80C51/87C51/80C52/87C52 de plusieurs constructeurs, mais également tester les circuits logiques, manipuler les mémoires i2c, les mémoires SRAM, les GAL, etc.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez un programmeur d'EPROM avec votre Raspberry Pi

Le matériel/logiciel dont

nous al ons parler est

en mesure d’utiliser

plus de 11000 compo-

sants, en lecture, en

écriture ou en test. C’est un outil

polyvalent qui pourra vous être

d’une grande aide dans bien des

domaines même si c’est avant tout

une solution pour lire et écrire des

mémoires de divers types. La rai-

son initiale de cette acquisition, en

ce qui me concerne, est un projet

de construction d’un ordinateur 8

bits à base de microprocesseur

Zilog Z80 et de MOS 6502 par

la suite (ou l’inverse, je ne suis

pas décidé). Ce genre de projets

implique généralement l’écriture

de programmes en code machine

Le Minipro

(assemblé à la main SVP) qui sont

TL866CS est de

alors stockés dans une mémoire

construction solide

programmeur de mémoires, mais il peut également lire

EPROM ou EEPROM directement

et se présente

et programmer des microcontrôleurs et en particulier les

sous la forme

accédée par le processeur.

Atmel AVR qui sont à la base de la plupart des cartes

d’un « pavé »

de 65x100x25

Ceci sort totalement du cadre du

Arduino. Il est ainsi possible, tout comme avec un pro-

millimètres. Il se

présent article, mais j’en reparlerai

grammeur AVR Dragon d’Atmel ou un montage à base

connecte à un PC,

dans les pages du magazine dès

d’Arduino (voir Hackable n°8), de sauvegarder le croquis

un Mac ou une

lors que cela aura pris une tournure

binaire d’une carte Arduino, d’en faire des copies d’un

Raspberry Pi à

l’aide d’un simple

« présentable ». Quoi qu’il en soit, il

AVR à un autre (du même modèle bien sûr) ou de tout

câble USB.

me fal ait un moyen de lire et écrire

simplement programmer des AVR sans carte Arduino.

ce type de mémoire et je n’avais

Ceci est également valable pour un autre type de micro-

aucunement l’intention de jongler

contrôleur très populaire : le PIC de Microchip (compa-

entre GNU/Linux (édition et déve-

gnie qui a récemment racheté Atmel).

loppement) et Windows (enregistre-

ment) pour ce genre de choses. Il

1. LE MATÉRIEL :

me fal ait donc un programmeur utili-

sable sous Debian GNU/Linux et par LE PROGRAMMEUR TL866CS

conséquent forcément compatible

Raspbian. Finalement, j’ai trouvé

Le matériel qui nous intéresse ici est le Minipro de

bien plus que cela et, je pense, des

XG Autoelectric, modèle TL866CS. Celui-ci est très

choses qui pourront également vous facile à trouver auprès de revendeurs partout dans le servir, vous faire faire des écono-monde, sur Amazon et bien entendu sur eBay. Il vous

mies et surtout, vous sortir du pétrin

coûtera quelques 50€, plus ou moins quelques euros

dans certains cas.

en fonction des accessoires optionnels fournis et des

frais de port. J’ai acquis le mien sur eBay pour 45,96€

En effet, le produit dont je vais

(+ 10€ de port) auprès d’un vendeur al emand appelé

vous parler n’est pas un simple

womenfashion4evernew (????).

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

HACKABLE MAGAZINE n°17

5

ÉQUIPEMENT

PROGRAMMEUR EPROM

composants « en place » dans

un circuit. Les cartes Arduino,

par exemple, possèdent un

connecteur 6 broches, destiné à

la connexion d’un programmeur

AVR pour accéder au microcon-

trôleur sans avoir à retirer le com-

posant de son support.

Le modèle TL866A possède

non seulement un connecteur

supplémentaire, mais utilise

Voici la plus vieille

également un firmware dif-

mémoire EPROM en

férent. Bien que possible, la

ma possession :

Le TL866CS se présente sous la forme d’un

transformation d’un TL866CS

une TMS2616 de

boîtier plastique blanc relativement robuste équipé

en TL866A, est une opération

2Ko fabriquée par

d’un support ZIF (Zero Insertion Force) 40 broches

Texas Instruments la

délicate et, bien entendu, il égale

permettant d’enficher un composant et de le blo-

40ème semaine de

en principe. La programmation

1979. Ce composant

quer à l’aide d’un petit levier. Le matériel est livré

ICSP pourra être nécessaire

a plus de 35 ans

avec son câble USB et un jeu d’adaptateurs per-

et... il fonctionne

pour les cartes Arduino Micro ou

mettant d’utiliser d’autres formats de composants

toujours ! J’ai pu en

que DIP : PLCC44, PLCC32, MSOP8/SSOP8 et

Leonardo par exemple, puisqu’il

lire le contenu sans

le moindre problème

SOIC8. Un CD d’instal ation ainsi qu’une pince

n’est pas possible de retirer le

avec le Minipro

d’extraction PLCC sont également fournis.

microcontrôleur de la carte. De

(l’écriture cependant

la même façon, les microcontrô-

n’est pas prise en

Le logiciel livré sur CD n’est pas forcément inté-

leurs PIC de plus de 40 broches

charge).

ressant dans le cadre de cet article puisque l’ob-

ne pourront pas être placés sur

jectif est avant tout une utilisation sur Raspberry Pi

le support ZIF et nécessiteront

et/ou sur un PC sous GNU/Linux. De toute façon,

également l’utilisation de l’ICSP

même en cas d’utilisation sous Windows, il sera

pour leur programmation. Néan-

plus intéressant de récupérer directement la der-

moins, étant donné le prix du

nière version du logiciel sur le site officiel (http://

modèle TL866A, qui est presque

www.autoelectric.cn/en/TL866_main.html).

le double du modèle TL866CS,

C’est à se demander pourquoi certains fabricants

il sera plus judicieux et écono-

fournissent encore des CD. .

mique de simplement acheter un

La connexion du produit à la Pi ou un PC se

programmeur AVR (AVR ISP) ou

résume au branchement du câble USB fournissant

PIC (PICkit) supplémentaire, ou

à la fois l’alimentation et le lien de communication

tout simplement utiliser une carte

pour piloter le périphérique.

Arduino en tant que program-

meur ICSP comme nous l’avons

Notez que le Minipro se décline en deux

fait dans Hackable n°8.

modèles : le TL866CS et le TL866A, plus cher

et plus difficile à trouver. Le TL866CS est plus

Note : Avant de traiter de

récent, mais moins complet. En effet, le modèle

l’utilisation du TL866CS avec

TL866A se distingue par la possibilité de pro-

Raspbian, je tiens à préciser qu’il

grammer des composants via une interface ICSP

est cependant de bon ton de pro-

en plus de l’interface paral èle via le support ZIF.

céder à une première instal ation,

L’ICSP est une connexion permettant la pro-

sous Windows. Il suffit pour cela

grammation in situ ou en d’autres termes cel e de

de télécharger le logiciel sur le

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez un programmeur d'EPROM avec votre Raspberry Pi site du fabricant et l’instal er avant de brancher le périphérique, car l’outil instal e également le pilote adéquat. Une fois cette étape franchie, il vous suffira de connecter le TL866CS et laisser Windows mettre en œuvre le pilote. Lors du premier lancement de l’application, cel e-ci vous demandera alors de mettre à jour le firmware du périphérique et c’est précisément ce que nous cherchons à faire. Il n’existe pas, à ma connaissance, d’autre solution simple pour faire cette mise à jour autrement que via Windows et le logiciel officiel.

2. PRISE EN CHARGE DU TL866CS PAR LA PI

Lors du branchement du TL866CS à votre Raspberry Pi, cel e-ci détectera effectivement la connexion du périphérique, mais aucun pilote ne sera utilisé. Ce produit n’apparaît ni comme un périphérique HID ni comme un port série, mais simplement comme un matériel USB non supporté par le noyau Linux. L’utilisation de la commande dmesg vous confirmera cependant la détection :

new full-speed USB device number 6 using dwc_otg

New USB device found, idVendor=04d8, idProduct=e11c

New USB device strings: Mfr=1, Product=2, SerialNumber=0

Product: MiniPro TL-866 Programmer

Manufacturer: www.autoelectric.com

Le logiciel Minipro officiel n’existe qu’en version Windows, il ne peut donc être utilisé sur la Pi.

Mais un développeur du nom de Valentin Dudouyt, a décidé début 2014 de créer son propre outil pour prendre en charge ce matériel. Depuis, le logiciel a évolué et s’étoffe peu à peu de fonctionnalités. Celui-ci n’existe pas sous forme de paquet pour Raspbian, mais Valentin a très tôt ajouté les éléments nécessaires pour produire facilement un paquet Debian/Ubuntu. Comme vous le savez sans doute, Raspbian n’est rien d’autre d’une version de Debian GNU/Linux pour notre chère framboise, nous pouvons donc utiliser ce système de construction pour produire facilement un paquet.

Avant toutes choses, nous devons instal er les éléments nous permettant de récupérer et compiler le logiciel de Valentin, appelé judicieusement minipro !

$ sudo apt-get install git build-essential \

debhelper libusb-1.0-0-dev

Ceci devrait suffire sur une instal ation « fraîche » de Raspbian, mais restez attentif aux messages d’erreurs dans la suite des opérations. Nous al ons récupérer les sources du logiciel directement sur GitHub via la commande git :

$ mkdir DEB

$ cd DEB

$ git clone https://github.com/vdudouyt/minipro.git

Clonage dans 'minipro'... remote:

Counting objects: 513, done.

remote: Total 513 (delta 0), reused 0 (delta 0), pack-reused 513

Réception d'objets: 100% (513/513), 451.46 KiB | 0 bytes/s, fait.

Résolution des deltas: 100% (279/279), fait.

Vérification de la connectivité... fait.

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

HACKABLE MAGAZINE n°17

7

ÉQUIPEMENT

PROGRAMMEUR EPROM

Ceci devrait avoir pour effet de vous créer un répertoire minipro, clone du dépôt GitHub contenant les sources. Il nous suffit alors de nous placer dans ce répertoire et d’utiliser la commande dpkg-buildpackage permettant la création d’un paquet :

$ cd minipro

$ dpkg-buildpackage -b

dpkg-buildpackage: paquet source minipro

dpkg-buildpackage: version source 0.1-1

dpkg-buildpackage: distribution source unstable

[...]

dpkg-source --after-build minipro

dpkg-buildpackage: envoi d'un binaire seulement

(aucune inclusion de code source)

À ce stade, dpkg-buildpackage va vérifier que tous les paquets nécessaires à la compila-tion sont présents. Normalement nos manipulations précédentes ont réglé ce point, mais il n’est pas impossible qu’en fonction de l’évolution de la distribution Raspbian, ceci ne soit plus le cas d’ici quelques versions. dpkg-buildpackage ne manquera cependant pas de vous signaler son mécontentement en précisant les paquets manquants, et il vous suffira de les instal er avec apt-get avant de lancer à nouveau la construction.

Une fois la tâche de dpkg-buildpackage accomplie, il ne vous restera plus qu’à remonter d’un cran dans l’arborescence et de procéder à l’instal ation du paquet qui s’y trouve : $ cd ..

$ sudo dpkg -i minipro_0.1-1_armhf.deb

Les commandes minipro et miniprohex sont désormais instal ées dans votre système, mais nous n’en avons pas fini avec la configuration. Le TL866CS ne dispose pas de pilote et l’outil que nous venons d’instal er accède donc directement au périphérique. Ceci demande des permissions particulières, car seul le super-utilisateur root peut faire ce genre de choses.

Nous al ons donc modifier la configuration du système de façon à préciser que les utilisateurs du groupe adm, dont l’utilisateur pi fait partie, peuvent accéder à ce nouveau périphérique en lecture comme en écriture. Pour cela, nous ajoutons un fichier 90-minipro.rules dans le répertoire /etc/udev/rules.d, contenant (sur une ligne) :

SUBSYSTEM=="usb",ATTRS{idVendor}=="04d8",ATTRS{idProduct}=="e11c", MODE="0660", GROUP="adm"

Ceci précise que, lors de sa connexion, le périphérique identifié par 04d8:0xe11c, appar-tiendra au groupe adm et que les permissions seront ajustées pour que le propriétaire (root) et le groupe puisse y lire et écrire des données (0660). Il suffira alors de relancer le service udev avec la commande sudo service udev restart puis de débrancher/rebrancher le TL866CS.

Enfin, il peut être très intéressant d’instal er un autre paquet en compagnie de minipro : srecord. Cet outil permet de manipuler des fichiers contenant des valeurs hexadécimales dans différents formats et, en compagnie de miniprohex (qui est en réalité un script shel ), permettra de travail er avec des fichiers Motorola S-Record (alias srec) ou Intel Hex (alias ihex).

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez un programmeur d'EPROM avec votre Raspberry Pi

3. UTILISONS

Vous n’avez pas à vous soucier de ce genre de

NOTRE TL866CS

choses ici, puisqu’il vous suffit de spécifier le bon

composant.

L’utilisation de minipro est

La liste des modèles supportés est conséquente,

relativement simple puisqu’il ne

très très conséquente. . Vous pouvez l’afficher en

s’agit que d’un outil de lecture/

utilisant minipro -l mais, il faut l’avouer, défiler

Le Minipro TL866CS

écriture sur différents compo-

est livré avec un

quelques 11551 lignes n’est pas très pratique. Heu-

sants. En fonction du modèle

certain nombre

reusement, les outils en ligne de commandes sont

placé sur le support ZIF, le péri-

d’adaptateurs

là pour nous aider, et en particulier grep. Il suffit

permettant de placer,

phérique se chargera d’automati-

alors de rediriger la sortie de minipro -l vers grep

sur le support ZIF,

quement ajuster à la fois l’utilisa-

des composants

avec un | (AltGr+6) et spécifier tout ou partie de la

tion des broches et les tensions

qui ne sont pas au

chaîne de caractères souhaitée. Exemple avec une

à mettre en œuvre. En effet,

format DIP. La pince

mémoire flash Atmel AT29C010A de 1 mégabit :

d’extraction PLCC

certains composants comme les

sur la droite est de

EPROM effaçables par exposition

$ minipro -l | grep AT29C01

piètre qualité, mais

aux UV nécessitent une tension

fait le travail pour

AT29C010A

particulière (12,7 V généralement)

peu que l’on soit

AT29C010A @PLCC32

délicat. Un câble USB,

pour pouvoir procéder à l’écriture.

AT29C010A @TSOP32

non présent ici, est

également livré avec le

produit.

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

HACKABLE MAGAZINE n°17

9

ÉQUIPEMENT

PROGRAMMEUR EPROM

Nous trouvons dans la liste, trois modèles utilisables, le premier au format DIP (avec des petites pattes adaptées aux platines à essais), un au format PLCC (carré avec les connecteurs en bordure) et un au format TSOP (pour un montage en surface avec des pattes au pas de 0,5 mm).

Pour lire le contenu de cette mémoire flash, nous utilisons alors minopro ainsi : $ minipro -p "AT29C010A" -r flash.bin

Found Minipro TL866CS v03.2.72

Chip ID OK: 0x1fd5

Reading Code... OK

L’option -p permet de préciser le modèle de composant à utiliser. Notez la présence de guil emets qui est généralement une bonne habitude à prendre, car certains modèles possèdent un espace dans leur nom et, par exemple, -p AT29C010A @PLCC32 ne fonctionnera donc pas alors que -p “AT29C010A @PLCC32” oui. L’option -r provoque la lecture du composant et el e est suivie d’un nom de fichier où seront alors placées les données obtenues.

Notez la ligne Chip ID OK. Dans la mesure du possible, le TL866CS et minipro tenteront de vérifier que le composant que vous avez spécifié est bien celui se trouvant dans le support ZIF. La plupart des composants possèdent un identifiant qui peut être lu et comparé à celui présent dans minipro et, en cas de différence, un message d’erreur sera affiché. Vous pouvez cependant passer outre en forçant l’opération avec l’option -y, qui est, bien entendu, à n’utiliser que si vous savez très bien ce que vous faites.

Le logiciel officiel

disponible au

téléchargement

sur le site du

fabricant offre

une interface

graphique et un

certain nombre

de fonctionnalités

supplémentaires

par rapport à la

version en ligne

de commandes

utilisable sous

Linux. C’est

aussi et surtout

le seul moyen de

mettre à jour le

firmware dans le

TL866CS...

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez un programmeur d'EPROM avec votre Raspberry Pi

Certains composants, comme les mémoires EEPROM

i2c par exemple, n’ont pas d’identifiant et aucune vérifica-

tion ne sera effectuée :

$ minipro -p "AT24C256" -r eeprom.bin

Found Minipro TL866CS v03.2.72

Reading Code... OK

L’écriture se fera tout aussi facilement, en remplaçant

l’option -r par -w et en spécifiant le fichier contenant les données à écrire :

$ minipro -p "AT24C256" -w eeprom.bin

Found Minipro TL866CS v03.2.72

Writing Code... OK

Reading Code... OK

Gros plan sur la puce d’une

Verification OK

mémoire EPROM exposée

sur un composant AMD

Notez que l’écriture est suivie automatiquement d’une lecture afin de s’assurer AM27256. On distingue

que les données enregistrées soient effectivement cel es présentes dans le fichier.

les grandes zones de

stockage, ainsi que les

Maintenant, si nous prenons notre fichier eeprom.bin de 32768 octets et tentons circuits de décodage

d’en écrire les données sur la mémoire flash, nous obtenons une erreur : d’adresse en bordure et les

connexions reliant le circuit

$ minipro -p "AT29C010A" -w eeprom.bin

intégré aux pattes. Même

Found Minipro TL866CS v03.2.72

sans en avoir l’usage,

ces composants sont de

Chip ID OK: 0x1fd5

magnifiques objets tout à

Incorrect file size: 32768 (needed 131072)

fait captivants...

En effet, minipro s’attend à avoir un fichier correspondant précisément à l’ensemble des données à écrire dans le composant. Ici, nous tentons de placer seulement 32768 octets dans une mémoire AT29C010A disposant d’un espace de stockage de 131072 octets. L’option -s nous permet de considérer cette erreur comme un simple avertissement. Un message apparaîtra effectivement pour signaler le problème, mais minipro s’exécutera malgré cela en n’écrivant que les données à sa disposition dans le composant :

$ minipro -p "AT29C010A" -w eeprom.bin -s

Found Minipro TL866CS v03.2.72

Chip ID OK: 0x1fd5

Warning: Incorrect file size: 32768 (needed 131072)

Writing Code... OK

Reading Code... OK

Verification OK

minipro utilise des fichiers au format binaire, c’est-à-dire que les données lues et enregistrées sont stockées « tel e que » dans des fichiers. En utilisant cependant miniprohex en lieu et place, vous pourrez préciser un autre format en spécifiant simplement l’extension de fichier à utiliser : .bin pour binaire, .hex pour Intel Hex ou .srec pour le format Motorola S-record. miniprohex est en réalité un script qui lance la commande srec_cat pour convertir les données avant d’exécuter minipro.

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

HACKABLE MAGAZINE n°17

11

ÉQUIPEMENT

PROGRAMMEUR EPROM

en flash, eeprom.bin qui contient

les données dans l’EEPROM

intégré au microcontrôleur et

fuses.conf :

$ cat fuses.conf

fuses_lo = 0x0062

fuses_hi = 0x00df

fuses_ext = 0x00f9

lock_byte = 0x00ff

Les « fusibles » d’un AVR

déterminent sa configuration : s’il

doit utiliser un bootloader comme

celui d’Arduino, sa source d’hor-

loge, la protection de la mémoire,

la capacité de reset en cas de

chute de tension, etc. Tous ces

éléments sont généralement gé-

rés pour vous avec Arduino mais

là, on parle de programmation de

microcontrôleur AVR. minipro

vous permet de récupérer tout

ce qui se trouve dans la mémoire

À la rédaction de Hackable, il y

de l’AVR, de façon à en faire une

a des coutumes et des rites...

sauvegarde ou permettre la copie

Systématiquement démonter

le matériel testé en fait partie

4. LE CAS DES

sur un autre AVR (même si vous

et on découvre ici qu’on en a

vraiment pour notre argent,

MICROCONTRÔLEURS avez perdu le croquis original par

exemple).

la construction est propre et

de qualité. Remarquez les

AVR

Les dernières versions de

nombreuses bobines sur la

En plaçant un microcontrôleur Atmel AVR

l’environnement Arduino per-

platine inférieure, faisant partie

du circuit destiné à produire

comme un ATmega328P d’une carte Ardui-

mettent également d’obtenir une

les tensions élevées pour la

no Uno dans le TL866CS, il est également

version compilée d’un croquis

programmation de certains

possible d’en lire le contenu, exactement de

sous la forme d’un fichier Intel

composants.

la même manière qu’une mémoire de type

Hex, via le menu Croquis puis

EPROM ou flash :

Exporter les binaires compilés.

Vous retrouverez alors, dans le

$ miniprohex -p ATMEGA328P -r atmega.hex

répertoire du croquis en ques-

Found Minipro TL866CS v03.2.72

tion, les fichiers dont les noms se

Chip ID OK: 0x1e950f

terminent avec .ino.standard.

Reading Code... OK

Reading Data... OK

hex et .ino.with_bootloader.

Reading fuses... OK

standard.hex. Respectivement,

une version avec juste votre cro-

Vous remarquez que la sortie affichée

quis et une version avec le boot-

par minipro est sensiblement différente.

loader en plus, placé en début

Nous n’avons pas ici un simple fichier, mais

du fichier. Ce dernier pourra être

trois : atmega.hex qui est le code contenu

utilisé avec miniprohex ainsi :

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez un programmeur d'EPROM avec votre Raspberry Pi

$ miniprohex -p ATMEGA328P \

-w ~/croquis.ino.with_bootloader.standard.hex

Found Minipro TL866CS v03.2.72

Chip ID OK: 0x1e950f

Writing Code... OK

Reading Code... OK

Verification OK

Le TL866CS pourra donc vous servir de programmeur pour vos microcontrô-

leurs (AVR ou autre) mais, il faut l’avouer, un matériel et un logiciel dédié sont Chose assez classique

généralement plus adaptés (avrdude par exemple). Ceci pourra cependant vous dans ce genre de

sortir du pétrin dans certaines situations délicates. En ce qui me concerne, je vois produits, la sérigraphie du

davantage dans le TL866CS une solution pour manipuler les mémoires que les composant « intelligent »

microcontrôleurs, même si cela pourrait m’être effectivement utile un jour.

dans le matériel a

été effacée. D’après

certains utilisateurs ayant

5. POUR FINIR

expérimenté plus avant, il

s’agirait d’un PIC18F87J50

de Microchip. On trouve

Tout le monde n’a pas forcément l’usage d’un tel matériel, mais je pense qu’il sur le Web différentes

constitue un élément important d’une boîte à outils électronique qui se veut techniques pour

complète.

transformer un TL866Cs

en TL866A en reflashant

Les mémoires EPROM et EEPROM paral èles sont de moins en moins utili-ce microcontrôleur.

sées au bénéfice des mémoires flash et EEPROM SPI ou i2c. Il y a cependant Personnellement, je n’en

vois pas l’intérêt étant

des domaines où ce type de matériel est tout simplement indispensable comme donné le bas coût des

la construction d’un ordinateur 8 bits

programmeurs ICSP...

(mon cas), les expérimentations avec

des BIOS de PC alternatifs (Coreboot

par exemple), l’extraction de ROM

de vieil es consoles de jeux (Atari

2600, etc.) ou de bornes d’arcade,

ou encore tout simplement pour le

plaisir de jouer avec ces adorables

EPROM dont on voit la puce par la

petite lucarne permettant l’exposition

aux UV...

Je n’ai pas parlé ici de l’environne-

ment Mac, mais sachez que minipro

peut également être compilé pour

Mac OS X (ou macOS comme on dit

depuis la version Sierra fin 2016).

C’est d’ail eurs la seule solution

permettant de nativement utiliser un

TL866CS ou TL866A sur ce sys-

tème. L’alternative consiste sinon à

démarrer le Mac sous Windows ou à

utiliser une machine virtuel e avec un

système Windows. DB

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

HACKABLE MAGAZINE n°17

13

ARDUINO'N'CO

LED WS2812b

CRÉEZ UN EFFET « FEU »

AVEC UNE MATRICE

DE LEDS

Denis Bodor

Les leds « intelligentes » de type WS2812b également appelées

Neopixels permettent toutes sortes de réalisations. Plus il y en a, plus on peut obtenir des résultats attrayants et des effets attirant l’œil.

Nous allons ici mettre en œuvre 64 de ces adorables composants,

agencés en un carré de 8 par 8 qui fera office d’écran à très basse résolution. Notre objectif : simuler et animer un feu.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

Les leds WS2812b ou

similaires sont des

petites merveil es.

El es se pilotent très

simplement depuis

une carte de type Arduino et

peuvent prendre n’importe quel e

couleur, mélange de rouge de

vert et de bleu. Mieux encore,

une seule broche, en plus de

l’alimentation 5V et de la masse,

suffit à en contrôler une seule

ou des dizaines, connectées les

unes aux autres en file indienne,

la broche OUT de l’une reliée à la

broche IN de la suivante et ainsi

de suite. Ces composants sont

Un effet de feu ou de

disponibles à l’unité ou montés

flamme tel que nous

sur des circuits imprimés ou des

Avec une tel e matrice, le nombre de réalisa-

allons l’utiliser n’a

rubans souples. Lignes, barres,

tions possibles est presque il imité : affichage de

rien de nouveau et

est un exercice assez

rubans, anneaux, rectangle,

texte, réalisation de jeux, VU-mètre, notifications

classique en termes

carré. . vous n’avez que l’embar-

diverses et variées, barres de progression, histo-

de programmation

ras du choix.

gramme, icône, simulateur de TV (voir Hackable

graphique. Ici le

n°9), éclairage animé, veil euse, simulateur d’aube,

résultat obtenu

Nous al ons utiliser ici une

horloge. . Mais en achetant ce module, j’avais une

en 320×240 avec

matrice de ces leds ou plus

idée bien précise en tête : créer un effet de flamme

un programme en

exactement 64 d’entre el es,

C reposant sur la

ou de feu réaliste en utilisant un algorithme très

bibliothèque SDL tel

agencées en un carré de 8 par 8.

classique et utilisé de longue date.

qu’on peut en trouver

Ce type d’organisation peut être

un peu partout sur le

facilement réalisé en utilisant des

Sans doute avez-vous déjà vu cet effet, c’est un

Web. Nous cherchons

leds achetées individuel ement

classique du genre, largement utilisé dans la scène

à obtenir un effet

similaire, mais sur un

ou encore avec des segments

démo où des programmeurs de talent réalisent des

carré de seulement 8

de rubans de 8 leds, mais il est

démonstrations (démos), généralement en utilisant

par 8 pixels/leds.

encore plus facile de simplement

des astuces techniques de pointe pour répondre à

acheter cela en module préfabri-

certaines contraintes imposées ou non. Cet effet

qué. Si le module est de qualité,

est relativement simple à obtenir et il existe un

vous évitez ainsi toute la phase

grand nombre d’exemples dans différents langages

de soudage des leds et les pro-

de programmation, mais, le plus souvent, qui

blèmes d’alignement qui l’accom-

sont destinés à s’afficher dans une fenêtre sur un

pagne. J’ai acheté mes modules

écran d’ordinateur. Ici, nous avons l’équivalent d’un

sur eBay auprès d’un vendeur

écran, mais nous ne disposons que d’une résolu-

appelé « trekdu » pour environ

tion de 8 pixels par 8 pixels.

13€. Il est possible d’en trouver

C’est donc une parfaite occasion de découvrir

pour moins de 10€, mais le fait de

cet algorithme et de jouer avec. Nous en profite-

choisir un vendeur français (sur

rons pour découvrir et utiliser une bibliothèque

Rennes) assure une livraison bien

différente de cel e que nous avons précédemment

plus rapide que depuis Shenzhen

mise en œuvre dans les pages du magazine afin

(et j’étais pressé).

de piloter nos WS2812b.

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

HACKABLE MAGAZINE n°17

15

ARDUINO'N'CO

LED WS2812b

Le montage ci-contre

présente 64 WS2812b

tels que généralement

1. LE MONTAGE ET

l’intensité des leds, le courant

connectés sur un

module 8×8. On

L’ALIMENTATION

nécessaire pour chaque compo-

sant peut grimper jusqu’à 60 mA.

prendra soin d’ajouter

un condensateur entre

Contrôler une ou plusieurs WS2812b avec un

Ainsi, il peut être envisa-

100µF et 1mF entre la

montage à base d’Arduino, ou toute autre carte

tension d’alimentation et

geable d’alimenter une poignée

de ce type, n’est pas très difficile. Une seule

la masse au plus proche

de WS2812b avec la broche 5V

sortie de l’Arduino est utilisée, cel e permettant

des leds, ainsi qu’une

d’une carte Arduino (200 mA),

résistance de protection

d’envoyer les données d’affichage aux leds. Si,

mais certainement pas 64. Un

de 220 à 470 Ohms

comme moi, vous optez pour un module tout

entre la carte Arduino

rapide calcul nous indique que

fait, tout ce que vous avez à faire est de relier

et la broche DIN de la

si toutes les leds sont al umées,

la broche de réception des données (In, DIN ou

première led.

notre alimentation devra être

Data In) à une sortie de la carte Arduino, et le

capable de fournir 64 x 0,06A,

tour est joué.

soit un peu moins de 4 ampères.

Mais un point important est également à

Dans les faits cependant, et selon

prendre en considération : l’alimentation des

l’origine du bloc d’alimentation

leds. Une WS2812b ou compatible demande

utilisé, mieux vaudra prévoir une

une alimentation 5V stable et propre (entre 3,5

marge de manœuvre. Une ali-

et 5,3 V pour être précis). Chaque composant

mentation 4A pourra parfaitement

contient un circuit intégré et trois leds haute

faire l’affaire, mais personnel e-

luminosité (rouge, vert et bleu). En fonction de

ment j’ai préféré utiliser une 10A

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

(achetée il y a quelque temps déjà

FastLED est une autre biblio-

sur eBay auprès d’un vendeur de

thèque permettant d’utiliser

Guangzhou appelé « chinly2012 »

les WS2812b ainsi que tous

à 12,80€ port gratuit). Rappelez-

les modèles de leds « intel i-

vous, contrairement à la tension,

gentes » cités précédemment.

le courant délivré par une alimen-

Initialement appelée FastSPI_

tation est un maximum qui peut

LED, la bibliothèque FastLED

être fourni, le montage n’utilisera

est l’œuvre de Daniel Garcia et

que le courant dont il a besoin.

Mark Kriegsman. Vous pouvez

l’instal er en version 3.1.0 direc-

tement depuis le gestionnaire

2. EXIT ADAFRUIT_ de bibliothèques de l’environne-

NEOPIXEL ET VIVE ment Arduino.

FastLED est non seulement

FASTLED !

très optimisé, mais supporte

Pour un peu plus

d’une dizaine

Dans les articles précédents

énormément de modèles différents de com-

d’euros on trouve

traitant des leds WS2812b nous

posants. De plus, cette bibliothèque est dispo-

des ensembles

avons systématiquement utilisé la

nible pour toutes les cartes Arduino (Due in-

de leds WS2812b

bibliothèque NeoPixel développée

cluse), mais également pour les cartes à base

déjà montés sous

diverses formes

par Adafruit Industries pour ses

d’ATTiny (Trinket par exemple), les Teensy 2 et

avec comme ici un

propres produits et modules. Cette 3, RFDuino, SparkCore, Photon et ESP8266/

carré de 64 leds.

bibliothèque est simple à utiliser,

NodeMCU.

Notez la présence

de condensateurs

mais comporte quelques pro-

Ce sont là des caractéristiques intéressantes,

de filtrage à côté de

blèmes parmi lesquels le manque

mais ce n’est pas tout. FastLED intègre également

chaque led, signe

de compatibilité en dehors des

des fonctionnalités très pratiques qui vont au-delà

de qualité pour ce

plateformes Arduino, un code

du simple pilotage des composants :

type de module.

très peu optimisé ou encore une

gamme réduite de composants

• fonctions mathématiques optimisées jusqu’à

utilisables.

10 fois plus rapides que leurs équivalents

Arduino ;

En effet, le NeoPixel d’Adafruit

• gestion de couleurs TSV (Teinte/Saturation/

n’est autre qu’une simple dési-

Valeur) et RVB (Rouge/Vert/Bleu), vous

gnation commerciale pour des

n’avez plus besoin d’écrire votre fonction de

leds WS2812b, mais il existe bien

conversion ;

d’autres composants fournissant

le même type de fonctionnalités :

• gestion de l’intensité non destructive, les cou-

APA102, lpd8806, P9813, tm1809,

leurs souhaitées ne sont pas impactées par

UCS1903, SM16716, SK6822. .

l’intensité globale des leds ;

Certains fonctionnent comme le

• correction de couleurs, vous pouvez obtenir

WS2812b et d’autres utilisent un

un vrai blanc en spécifiant des valeurs RVB

signal d’horloge supplémentaire

maximum ;

(ce qui évite la mise en œuvre

• manipulation de segments de leds ;

d’interruptions et donc permet

• gestion de palettes de couleurs ;

d’utiliser la communication série,

les servomoteurs ou encore les

• etc.

récepteurs IR sans problème, en

Pour vous donner une petite idée de ce qu’est

même temps que les leds).

capable de faire FastLED, voici un petit exemple :

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

HACKABLE MAGAZINE n°17

17

ARDUINO'N'CO

LED WS2812b

#include <FastLED.h>

CRGBArray<64> leds;

uint8_t teinte;

void setup() {

FastLED.addLeds<WS2812B, 6, GRB>(leds,64).setCorrection(TypicalLEDStrip); FastLED.setBrightness(100);

}

void loop() {

leds.fill_rainbow(teinte++);

FastLED.delay(10);

}

Ces quelques lignes permettent d’obtenir un dégradé arc-en-ciel se déplaçant doucement le long des 64 leds connectées à la broche 6 de la carte Arduino. Le tout avec une luminosité réduite et une correction de couleurs adaptée. . en moins de 20 lignes de code ! Notez cependant que ce croquis n’est pas typique de l’utilisation de FastLED

et repose sur des fonctionnalités en développement (donc susceptibles de changer dans un avenir plus ou moins proche).

3. L’ALGORITHME DE SIMULATION DE FEU

Précisons-le de suite, il n’y a pas une seule et unique façon d’obtenir l’effet recherché, mais une pléthore de solutions et d’algorithmes. De plus, celui que nous al ons mettre en œuvre est suffisamment simple pour être rapidement utilisé, tout en offrant l’oppor-tunité d’y faire des modifications qui, selon le résultat recherché pourront être très inté-

ressantes. Le principe cependant est toujours le même : placer une série de pixels au Une masse, une

alimentation 5V et une

hasard puis, sur cette base, propager les changements du bas vers le haut.

broche pour envoyer

les données, il n’en faut

C’est la façon de propager les changements qui crée le rendu que nous souhaitons pas plus pour piloter des

obtenir. Pour mettre en place cette logique, nous travail erons avec un tableau de 8

dizaines de leds WS2812b

par 8 cel ules correspondant aux valeurs que peut prendre chaque pixel. Il ne s’agit ou similaires... à condition,

pas ici de couleurs, mais d’une valeur sur 8 bits (uint8_t), entre 0 et 255, indiquant bien sûr, de disposer

d’une alimentation capable

la « température » du pixel (0 pour froid, 255 pour brûlant). Ce tableau de fournir le courant

représentera notre gril e de pixels qui sera ensuite traduite en couleurs à nécessaire.

afficher sur le module.

L’algorithme en lui-même n’a rien de bien complexe puisqu’après

avoir placé quelques pixels chauds au bas du tableau nous procèderons comme suit :

• pour chaque pixel de la ligne juste au-dessus de la dernière, additionner la valeur des trois pixels immédiatement inférieurs et diviser par 4 ;

• s’il s’agit du premier pixel et qu’il n’y a donc pas de valeur inférieure gauche, utiliser le dernier pixel de la ligne inférieure (le 8ème) ;

• s’il s’agit du dernier pixel, il n’y a pas de valeur inférieure droite, utiliser le premier pixel de la ligne inférieure ;

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

• rafraîchir l’affichage sur la

composante, le rouge par exemple, et trans-

base de ces nouvel es valeurs

poser directement les valeurs du tableau en

du tableau ;

intensité de rouge de 0 à 255. Cependant,

La base d’un

• passer à la ligne supérieure

pour que l’effet soit réaliste nous devons utiliser des couleurs

algorithme de

et recommencer l’opération

typiques d’une flamme, qui s’étalent généralement en un

simulation de

pour chaque pixel, et ainsi

dégradé du blanc au jaune, puis au rouge et enfin au noir.

feu est très

simple. Il suffit,

de suite ;

Notez que cette base d’algorithme peut être utilisée tel e

pour chaque

• une fois arrivé à la ligne la

quel e, mais également être ajustée en fonction des besoins.

pixel, de faire

un simple calcul

plus en haut, recommencer

Énormément de paramètres entrent en ligne de compte et

basé sur les

tout le processus après avoir

permettent d’ajuster le rendu final :

valeurs des

ajouté des pixels aléatoires

• Combien de pixels chauds doivent être aléatoirement

trois pixels

au bas du tableau.

al umés en bas du tableau ?

immédiatement

inférieurs.

L’opération consiste donc à

• Avec quel e probabilité ceci doit arriver ?

démarrer avec un jeu de pixels

• Les nouveaux pixels doivent-ils être dans une plage de

de valeurs aléatoirement choi-

valeurs spécifiques ou non ?

sies. Ceci peut être vu comme

• Faut-il prendre en compte ou non la valeur actuel e du

les braises de notre feu. Le fait de

pixel dans la moyenne ?

faire une moyenne des valeurs

• Faut-il prendre en compte les pixels adjacents de droite

des pixels inférieurs pour calculer

et de gauche dans le calcul de la valeur ?

cel e du pixel actuel a pour effet de

mélanger les valeurs et de créer

• Faut-il accélérer le refroidissement en divisant par une

des transitions douces. Comme il

plus grande valeur ?

ne s’agit pas d’une vraie moyenne,

• etc.

mais que nous divisons par 4 la

Je vais faire ici un certain nombre de ces choix dans le

somme de 3 pixels, plus nous mon-

croquis qui va suivre, mais je vous invite, comme toujours à

tons dans le tableau, plus l’intensité explorer par vous-même et adapter cela à vos attentes.

est réduite. Mais le dégradé reste

dépendant des valeurs initiales

de la ligne la plus en bas et des

4. NOTRE CROQUIS ARDUINO

valeurs des pixels alentour.

Il est temps d’entrer dans le vif du sujet et de mettre toutes

Voici pour la base. Tout ce que

ces théories en pratique. Après avoir instal é FastLED via le

nous avons à faire est finalement

gestionnaire de bibliothèque, nous pouvons débuter la rédaction

de parcourir toutes les cel ules du

du croquis en commençant par les classiques déclarations :

tableau et de faire un calcul relative-

ment simple. Nous obtenons alors

une grille complète de valeurs cor-

#include <FastLED.h>

respondant à la « température » de

// nombre de leds

chaque pixel. Nous devrons ensuite

#define NBRPIX 64

traduire cela en différentes couleurs

pour procéder à l’affichage. Pour

// matrice pour calculer l'image

cette étape, nous reposerons sur

uint8_t firematrice[8][8];

l’une des fonctionnalités de Fast-

// tableau de leds

LED : la gestion de palettes.

CRGB leds[NBRPIX];

// palette

Nous pourrions, en effet, nous

CRGBPalette16 gPal;

contenter d’utiliser une seule

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

HACKABLE MAGAZINE n°17

19

ARDUINO'N'CO

LED WS2812b

Après avoir inclus la bibliothèque, nous définissons une macro

NBRPIX correspondant au nombre total de leds WS2812b utili-

sées. S’en suit alors la déclaration de notre fameux tableau de 8

par 8 uint8_t. Comme il s’agit d’une variable globale et de C++, cel e-ci sera automatiquement initialisée à 0.

Nous enchaînons ensuite sur la déclaration d’une variable

leds, étant un tableau de CRGB d’une taille correspondant au nombre de leds. Contrairement à la bibliothèque Adafruit

NeoPixel, FastLED expose la variable correspondant à la

Exemple de

valeur des couleurs des leds. En effet, ce tableau leds pourra propagation de

directement être manipulé sans utiliser de méthode spécifique. Pour donner une couleur valeurs dans

notre tableau. On

à la première led par exemple, nous n’utiliserons pas quelque chose comme : démarre par des

valeurs choisies

pixels.setPixelColor(0, pixels.Color(255,0,0));

aléatoirement au bas

<file>

de l’affichage et on

remonte ligne par

mais directement :

ligne en calculant

<file>

chaque pixel. À

leds[0].setRGB( 255, 0, 0);

chaque ligne on

// ou

rafraîchit l’affichage

leds[0] = 0xFF0000;

et, arrivé en haut, on

// ou encore

repart pour un tour...

leds[0].r = 255;

leds[0].g = 0;

leds[0].b = 0;

// ou tout simplement

leds[0] = CRGB::Red;

Enfin, nous déclarons également une palette de couleurs gPal que nous initialiserons puis utiliserons par après. Tout est à présent en place et nous pouvons passer à notre fonction setup() :

void setup() {

// initialisation du PRNG

randomSeed(analogRead(0));

// configuration des leds

FastLED.addLeds<WS2812B, 6, GRB>(leds, NBRPIX);

// ajustement luminosité

FastLED.setBrightness(155);

// initialisation palette personnalisée

gPal = CRGBPalette16(CRGB::Black, CRGB::Red, CRGB::Red, CRGB::Yellow, CRGB::Yellow, CRGB::Yellow, CRGB::Yellow, CRGB::White, CRGB::White, CRGB::White, CRGB::White, CRGB::White, CRGB::White, CRGB::White, CRGB::White, CRGB::White);

}

Là encore, l’utilisation de FastLED se démarque de cel e d’Adafruit NeoPixel avec une syntaxe un peu particulière (utilisation de patron ou de template C++). Nous ajoutons les leds en appelant la méthode de classe FastLED.addLeds et en spécifiant le type de composant (ici des WS2812b), la broche Arduino utilisée et l’ordre des données de couleur.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

Dans le cas des WS2812b, il ne s’agit pas de

rouge/vert/bleu, mais de vert/rouge/bleu. On

précise également, en argument, la variable

leds que nous avons déclaré précédemment

ainsi que le nombre de leds présentes.

Nous réglons également l’intensité lumi-

neuse globale à 155 (sur 255 max), puis définis-

sons notre palette de 16 couleurs. Les valeurs

utilisées ici, avec un dégradé non linéaire et

une grosse part de blanc par rapport aux autres

couleurs, ont été choisies après tâtonnement et

de nombreux essais. Le choix de la palette est

dépendant de la façon dont nous calculons les

valeurs de température de chaque pixel et donc

Les WS2812b ne

de l’effet souhaité (flamme de bougie, feu de camp miniature, feu vif et attisé, etc.).

sont pas de simples

La façon dont je suis arrivé à cette solution est relativement simple : tester l’algorithme et leds. On distingue

clairement sur ce

ses différents paramètres avec une seule couleur (rouge) et donc sans palette, puis une fois gros plan le circuit

une animation satisfaisante obtenue, utiliser la palette et l’ajuster pour aligner chaque teinte.

intégré et les

trois leds reliées

Il est temps maintenant de passer à la fonction loop() effectuant tout le travail d’animation.

avec des fils en

On commence donc par placer un pixel chaud au bas du tableau :

or (Canon EOS

700D avec objectif

void loop() {

macro EF-S 60mm

// On ajoute peut-être un pixel chaud en bas

f/2.8 USM, pour

// 2 chances sur 3

les amateurs de

if(random(0,3)) {

photo).

firematrice[0][random(0,8)] = random(160,256);

}

Les arguments passés à random() sont respectivement la valeur minimum et maximum (exclue) qui peut être choisie aléatoirement. Comme nous utilisons ceci dans une condition if(), les instructions dans la portée ne sont exécutées que si la fonction retourne une valeur non nul e. Nous avons donc ici deux chances sur trois d’exécuter le code. Celui-ci est une simple affectation de valeur où la position verticale est fixe (ligne 0) et cel e horizontale est choisie aléatoirement. Enfin, la valeur affectée est également aléatoire, mais bornée entre 160

et 255 (inclus). Nous avons donc une chance sur trois de placer un pixel d’une valeur relativement élevée à n’importe quel endroit de la ligne du bas.

Dans l’état, l’algorithme fonctionne déjà relativement bien, mais les écarts de couleurs entre les pixels al umés et éteints sont trop importants. Nous voulons donc lisser tout cela. Pour ce faire, nous faisons, pour chaque pixel la moyenne « bricolée » des pixels de droite et de gauche :

// On lisse la dernière ligne en faisant la moyenne

for (int x=0; x<8; x++) {

firematrice[0][x]=

(firematrice[0][(x-1>0) ? x-1 : 7]+

firematrice[0][x]+

firematrice[0][(x+1<7) ? x+1 : 0])/4;

}

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

HACKABLE MAGAZINE n°17

21

ARDUINO'N'CO

LED WS2812b

Notez l’utilisation de l’opérateur ternaire nous permettant de choisir la valeur du dernier pixel de la ligne en lieu et place de celui de droite si nous sommes à la position 0 (si x-1>0 alors on utilise x-1, sinon 7), et le premier pixel de la ligne si nous sommes à la dernière position. L’afficheur est donc « enroulé sur lui-même ».

Nous pouvons ensuite parcourir le tableau en commençant par le premier pixel de la seconde ligne en partant du bas. On procèdera au calcul que nous avons détail é précé-

demment en faisant la somme des trois pixels inférieurs et en divisant pas 4 :

// Pour chaque pixel on fait une moyenne des pixels plus bas

// et on divise pour "refroidir" le tout

for (int y=1; y<8; y++) {

for(int x=0; x<8; x++) {

firematrice[y][x]=

(firematrice[y-1][(x-1>0) ? x-1 : 7]+

firematrice[y-1][x]+

firematrice[y-1][(x+1<7) ? x+1 : 0])/4;

}

// Après chaque ligne traitée, on rafraîchit l'affichage

for(int i=0; i<8; i++) {

for(int j=0; j<8; j++) {

// on applique la palette aux leds

CRGB color = ColorFromPalette(gPal, firematrice[i][j]);

leds[(j*8)+i]=color;

}

Pour assurer

}

un bon

// affichage

fonctionnement

FastLED.show();

et une protection

delay(10);

des WS2812b, il

}

est recommandé

}

d’ajouter un

condensateur

L’affichage des pixels dans les bonnes couleurs se fait en parcourant le tableau en-entre la masse

tièrement pour col ecter les valeurs qu’il contient et en les transposant en composantes et la ligne

de rouge, de vert et de bleu qu’on place dans leds[] avant d’appeler FastLED.show() d’alimentation,

au plus près des

pour communiquer les données aux WS2812b. Cette transposition se fait très simple-leds, ainsi qu’une

ment en utilisant la fonction ColorFromPalette() et en

résistance sur la

lui passant en argument la palette à utiliser et une valeur

broche DIN.

entre 0 et 255 (8 bits).

Notez que FastLED utilise ici une astuce. En effet, une

vraie palette de couleurs contient généralement un index de

256 valeurs, mais ceci occuperait quelques 768 octets de

mémoire vive, denrée rare sur un microcontrôleur comme ce-

lui d’un Arduino. Il est possible d’utiliser une tel e palette tra-

ditionnelle (type CRGBPalette256), mais il est généralement

préférable d’opter pour un CRGBPalette16 qui ne contient

qu’un index de 16 entrées, mais se comportera comme une

palette de 256 couleurs. FastLED se chargera, en coulisse,

de calculer les valeurs intermédiaires. Voilà pourquoi nous

n’avons défini que 16 couleurs en début de croquis, mais

pouvons utiliser une valeur d’index entre 0 et 255.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

5. AMÉLIORATIONS,

AJUSTEMENTS ET

RÉGLAGES

L’effet final obtenu sur les 64 leds que

compte notre afficheur est impacté par énor-

mément de choses, disséminées dans le

croquis :

La connexion de la

• la probabilité d’al umer un pixel chaud

carte Arduino au module

(if(random(0,3))),

d’affichage n’est pas l’élément clé

du projet. Sur cette base, il est

• le nombre de pixels al umés (nombre de

possible d’explorer par le code un

lignes dans la portée du if),

nombre inimaginable d’effets et

d’animations...

• le lissage utilisé sur la première ligne (ici

division par 4 ),

• la division opérée pour « refroidir » les pixels dans le calcul du tableau complet (premier parcours du tableau),

• la palette de couleurs utilisée lors de l’affichage.

Cette photo ne rend

Tous ces paramètres peuvent être ajustés pour avoir un feu plus « calme », concen-absolument pas

tré en un point particulier, avec des couleurs différentes ou encore davantage proches hommage au résultat

d’une animation de vieux jeux vidéos. Il est également possible d’utiliser deux tableaux, effectivement obtenu,

mais après une longue

un contenant l’état actuel des pixels et un autre pour le résultat des opérations arithmé-

discussion avec nos

tiques, de façon à ce que les calculs effectués ne s’impactent pas mutuel ement. On infographistes nous

peut également travail er par phase en procédant à plusieurs passages successifs : avons convenu qu’il

refroidissement, placement des nouveaux pixels, propagation des valeurs. .

nous serait vraiment

difficile de convaincre

Enfin, nous avons l’utilisation pratique de l’effet. Nous pouvons facilement jouer l’imprimeur de coucher

une vidéo sur du

sur les paramètres et les valeurs utilisées dans les calculs pour conditionner le rendu.

papier...

Ceci peut être un simple potentiomètre

sur une entrée analogique, mais éga-

lement une liaison série ou Bluetooth

permettant de faire un système de noti-

fication amusant : nombre de mails non

lus, charge système, température, etc.

Comme toujours, je ne peux que

vous conseil er de jouer avec ce

croquis et tester toutes les variations

possibles afin de vous approprier ce

projet et le rendre unique. Ce sera

là également l’occasion de faire

davantage connaissance avec FastLED

qui, sur bien des points, surpasse

admirablement les autres solutions de

contrôle de leds intel igentes de type

WS2812b. DB

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

HACKABLE MAGAZINE n°17

23

EN COUVERTURE

BOUTONS

CRÉEZ DES BOUTONS À

COPIER/COLLER

Denis Bodor

Inutile de le cacher, ce projet est une simple excuse pour découvrir quelque chose de bien plus vaste et intéressant que le fait de se faciliter la vie en faisant des copier/coller à l’aide de boutons dédiés.

Ce qui se cache derrière ce simple exemple n’est rien de moins que d’automatiser n’importe quelle séquence de touches, peu importe

leur nombre, pouvant être déclenchée par une simple pression sur un bouton.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez des boutons à copier/col er

Les cartes Arduino per- ou la faire dialoguer avec le moniteur série de l’environ-mettent de faire énor-

nement de programmation (IDE). Les Leonardo et Micro

mément de choses,

vont plus loin et vous permettent, à l’aide d’un croquis

mais certaines d’entre

rédigé par vos soins, d’avoir la mainmise sur ces fonc-

el es possèdent des

tionnalités USB et donc de créer un périphérique USB

caractéristiques très spécifiques.

personnalisé.

Je qualifierai les modèles UNO et

MEGA 2560 de génériques, car

permettant d’utiliser des fonction-

1. L’USB : OMNIPRÉSENT,

nalités de base comme le contrôle

des entrées/sorties, la communi-

MAIS RELATIVEMENT

cation série, SPI et i2c et offrant,

COMPLEXE

de façon générale, l’occasion de

se familiariser avec la richesse

L’interface USB, depuis une quinzaine d’années, a

(déjà importante) de la plateforme.

détrôné presque toutes les autres formes de connexions

permettant à un ordinateur de dialoguer avec un péri-

Et puis nous avons les modèles

phérique : port PS/2, port série, port paral èle, interface

plus « spécifiques » comme l’Es-

SCSI, cartes spécifiques pour scanner, etc. Désormais,

plora, la Due, la Zero ou encore

la quasi-totalité des appareils que vous pouvez brancher

la Yùn, proposant des caractéris-

à un PC ou un Mac sont en USB. Et c’est précisément là

tiques uniques venant compléter

le but initial de ce standard dont le nom lui-même a été

ce qu’offrent déjà les modèles

choisi en ce sens : Universal Serial Bus ou bus série uni-

les plus populaires : puissance

versel en bon français (ou « Umfassend Systematische

de calcul, architecture différente,

Bindung » si vous êtes un scientifique nazi œuvrant sur la

processeur 32 bits, audio, connec-

face cachée de la lune).

tivité sans fil ou filaire, etc.

Fut un temps, ceci a été une véritable catastrophe pour

À mi-chemin entre ces deux

les bidouil eurs de tout poil. Alors qu’il était très facile de

parties de la gamme Arduino/

brancher des montages sur un port paral èle, ou à défaut

Genuino, je placerai deux

sur un port série (merci le bon vieux MAX232), l’arrivée

modèles précis de cartes :

de l’USB a posé un énorme problème en nécessitant la

l’Arduino Leonardo et l’Arduino

prise en charge d’un protocole difficile à implémenter

Micro. Cel es-ci, comme la UNO

tant au niveau matériel (signaux) que logiciel (protocole,

par exemple, comprennent un

pilotes, etc.).

microcontrôleur Atmel de la famil e

AVR, mais celui-ci, l’ATmega32U4,

La polyvalence de l’USB et sa capacité à uniformiser

dispose d’une fonctionnalité

tous types de connexions induisent une grande complexi-

captivante : il peut se présenter

té. Bien entendu, avec la démocratisation de ce type de

comme un périphérique USB.

connexion, des solutions accessibles aux électroniciens

amateurs ont commencé à voir le jour, d’un simple pont

Bien sûr, lorsque vous bran-

série 5V vers RS232 puis à l’USB, aux solutions entière-

chez votre carte Arduino, quel que

ment logiciel es comme AVR-USB (devenu V-USB depuis)

soit son modèle, vous le faites en

USB, mais ce n’est pas de cela

permettant aux microcontrôleurs Atmel AVR de « parler »

qu’il s’agit. Avec une UNO par

USB à l’aide de seulement deux petites résistances de

exemple, l’USB n’est qu’un pont

68 ohms (mais en USB 1.1 uniquement).

permettant de faire communiquer

Il aura cependant fal u attendre l’Arduino Leonardo

le microcontrôleur avec votre ordi-

et son ATmega32U4, accompagné des bibliothèques

nateur pour programmer la carte

adéquates pour véritablement rendre le plus accessible

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

HACKABLE MAGAZINE n°17

25

EN COUVERTURE

BOUTONS

Créez des boutons à copier/col er

Matériellement, le montage se

résume à la mise en œuvre

de fonctionnalités simples de

la carte Arduino : 4 leds et 4

boutons. Pour la réalisation

pratique, j’ai utilisé des

boutons poussoirs intégrant

des leds rouges, mais il

n’existe pas de connexion

directe entre l’une et l’autre

fonction du produit. Un

résultat similaire peut donc

être obtenu en séparant les

composants.

possible la création de simples

périphériques USB, et masquer toute la

complexité du standard.

Ce que propose aujourd’hui

l’environnement Arduino pour les cartes

Leonardo et Micro est une solution à la

fois simple, mais modulaire, permettant

de construire vos périphériques. Simple,

car il est possible de rapidement créer

un tel montage et modulaire car, avec les

dernières versions de l’environnement et

des bibliothèques, il est possible de pousser

vraiment très loin le contrôle de l’USB.

2. DÉMARRER

Trois approches sont possibles de cette manière :

AVEC UN PETIT

• la plus simple consistant à utiliser les bibliothèques

Keyboard et Mouse permettant d’émuler un clavier ou

PROJET SIMPLE,

une souris ;

MAIS UTILE

• utiliser la bibliothèque HID servant de base aux deux

Notre objectif sera ici relative-

précédentes et permettant de créer n’importe quel péri-

ment simple puisque nous al ons

phérique USB de type (ou classe) HID (Human Interface

chercher à étendre les fonctionna-

Device) propre aux périphériques ayant une interaction

lités d’une instal ation informatique

physique avec l’utilisateur au sens général du terme ;

classique. Si, comme moi, le fait

• jouer, au plus bas niveau, avec PluggableUSB pour

de voir des personnes utiliser la

avoir un accès complet (et complexe) aux fonctionnalités

souris ou les menus pour faire

USB en développant un module PluggableUSB sous

du copier/col er plutôt que les

forme d’une bibliothèque, à la façon dont HID a été créé.

touches de raccourcis Ctrl+C et

Ctrl+V, a tendance à bien vous

Dans les pages qui vont suivre, nous aurons l’occasion

horripiler, voici une solution (pour

de découvrir différentes approches, sans pour autant arriver

vos nerfs) : donner à cette pauvre

à PluggableUSB (peut-être une prochaine fois) nécessitant

personne des boutons pour faire

l’assimilation d’une grande partie des spécifications USB.

de même plus rapidement.

Mais avant d’en arriver à des réalisations plus avancées,

voyons tout d’abord ce qu’il est possible de faire avec les

Concrètement, cette excuse

bibliothèques instal ées en standard dans l’environnement.

nous permettra de prendre en

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez des boutons à copier/col er

DISPONIBLE DÈS

LE 10 MARS !

HACKABLE HORS-SÉRIE n°2

main la fonction d’émulation (qui n’en est pas vrai-

ment une) de clavier et d’associer la pression sur

un bouton poussoir lu par la carte Arduino avec un

message, envoyé en USB, simulant l’utilisation d’un

raccourci.

Attention : deux choses sont ici importantes à

comprendre. Premièrement, ceci ne fonctionnera

qu’avec les cartes Leonardo et Micro, construites

autour du microcontrôleur ATmega32U4. Un hack est

possible sur les cartes comme la UNO à condition

qu’el es intègrent un microcontrôleur ATmega16U2

en guise de passerel e série/USB (cf. un peu plus

loin dans le magazine), mais cela reste une bidouil e

et ne fonctionne pas avec les clones Arduino.

L’autre point important concerne le fonctionne-

ment même de ce genre de croquis et fonctionna-

lités : la carte Arduino va se faire passer pour un

clavier USB et envoyer des séquences de touches.

Ceci signifie que, une fois le croquis chargé, votre

ordinateur verra un nouveau clavier (en plus d’une

carte Arduino) et le prendra en charge. Ainsi, si

votre croquis envoie du texte saisi, celui-ci a toutes

les chances de finir dans la fenêtre active à ce

moment, et donc, en toute logique dans l’éditeur de

code. La solution consiste donc, quoi que vous pro-

grammiez, à toujours conditionner l’envoi de texte et

de raccourcis à une action de votre part (pression

sur un bouton, connexion d’une broche, etc.) ou

au minimum, à une temporisation vous laissant le

Sous réserve de toutes modifications.

temps de prendre les devants.

Voici notre croquis de démonstration :

DÉBUTEZ EN

#include <Keyboard.h>

int bouton[] = {A0,A1,A2,A3};

PROGRAMMATION

int led[] = {11,10,9,6};

void raccourcis(int val) {

SUR RASPBERRY

// pour Win & Linux

//Keyboard.press(KEY_LEFT_CTRL);

// pour Mac

Keyboard.press(KEY_LEFT_GUI);

PI !

switch(val) {

case 0:

// "Annuler"

// attention QWERTY w=z !

Keyboard.press('w');

NE LE MANQUEZ PAS

break;

CHEZ VOTRE MARCHAND

DE JOURNAUX ET SUR :

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

HACKABLE MAGAZINE n°17

27

http://www.ed-diamond.com

pub_fev2017_half.indd 4

14/02/2017 18:35

EN COUVERTURE

BOUTONS

Créez des boutons à copier/col er

case 1:

// "Tout sélectionner"

// attention QWERTY q=a !

Keyboard.press(‘q’);

break;

case 2:

// "Copier"

Keyboard.press(‘c’);

break;

case 3:

// "Coller"

Keyboard.press(‘v’);

}

delay(100);

Keyboard.releaseAll();

}

// juste pour faire beau

void animation() {

for(int i=0; i<4; i++) {

digitalWrite(led[i], HIGH);

delay(150);

}

for(int i=0; i<4; i++) {

digitalWrite(led[i], LOW);

delay(150);

}

}

void setup() {

// les leds en sortie

for (int i=0; i<4; i++) {

pinMode(led[i], OUTPUT);

}

// les bouton en entrée

for (int i=0; i<4; i++) {

pinMode(bouton[i], INPUT_PULLUP);

}

Keyboard.begin();

animation();

}

La bibliothèque Keyboard est très simple

void loop() {

d’utilisation, une fois cel e-ci correctement

// on scanne les boutons

for (int i=0; i<4; i++) {

initialisée avec un petit Keyboard.begin()

if(!digitalRead(bouton[i])) {

dans la fonction setup(), une série de

// led allumée

fonctions sont alors utilisables. Nous pouvons,

digitalWrite(led[i], HIGH);

comme ici, dans raccourcis(), envoyer des

// envoi du raccourci

pressions sur les touches avec Keyboard.

raccourcis(i);

// on éteint doucement la led

press() et relâcher ces touches le moment

// tout en gérant les rebonds

venu avec Keyboard.release() ou

for(int j=250; j>=0; j=j-10) {

Keyboard.releaseAll() (relâcher toutes les

analogWrite(led[i],j);

touches précédemment enfoncées).

delay(10);

}

Pour pouvoir rendre le croquis plus modu-

}

laire et facile à étendre, nous plaçons les va-

}

leurs des broches utilisées dans des tableaux et

}

notre fonction d’envoi de séquence de touches

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez des boutons à copier/col er

NE MANQUEZ

PAS LA NOUVELLE

FORMULE !

prendra en argument une valeur. Ceci nous per-

LINUX PRATIQUE n°100

met de reposer massivement sur l’utilisation de

boucles for pour gérer à la fois les boutons et les

leds. Ainsi si vous souhaitez ajouter ou retirer des

boutons, il vous suffit de modifier le contenu des

tableaux avec les bonnes valeurs de broches ainsi

que la fonction raccourcis().

Keyboard nous permet donc d’enfoncer des

touches, directement désignée par un symbole

alphanumérique (caractère), mais également par

un nom pour les touches qui n’ont pas de sym-

boles, comme KEY_LEFT_CTRL (touche Ctrl de

gauche). La liste complète des noms (ou macros)

est disponible sur https://www.arduino.cc/en/

Reference/KeyboardModifiers. Vous remarque-

rez qu’el e est relativement limitée, mais nous y

reviendrons dans les projets suivants.

Nous pouvons également envoyer des

chaînes de caractères avec Keyboard.print()

et Keyboard.println(), à la manière des mé-

thodes équivalentes pour Serial. Notez cepen-

dant que, pour toutes les fonctions désignant

les touches par un caractère, c’est l’organisation

QWERTY US qui sera utilisée. Si vous envoyez

un «a« c’est dont un “q” qui apparaîtra sur

l’ordinateur...

3. LE CLAVIER, MAIS PAS

SEULEMENT

Ce bref, mais suffisant à mon goût, aperçu de

la bibliothèque Keyboard laisse entrevoir des pos-

sibilités intéressantes sans pour autant permettre

CONTRÔLEZ

des réalisations très poussées. Il en va de même

pour la bibliothèque sœur, Mouse, permettant de

faire de votre carte Arduino une souris USB. Là,

L’ACCÈS AU

je dois avouer que, bien qu’il soit très amusant

de faire se déplacer le pointeur de la souris ainsi

(avec Mouse.move()), l’intérêt pratique m’échappe

WEB !

un peu (à part pour faire une blague à quelqu’un).

Pour faire des choses un peu plus intéres-

santes avec les cartes Leonardo et Micro en

USB, il faut al er au-delà de ces bibliothèques.

ACTUELLEMENT

Chose que je vous propose de faire dans les

pages qui suivent. . DB

DISPONIBLE

CHEZ VOTRE MARCHAND

DE JOURNAUX ET SUR :

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

HACKABLE MAGAZINE n°17

29

http://www.ed-diamond.com

pub_fev2017_half.indd 6

14/02/2017 18:27

EN COUVERTURE

CONTRÔLEUR AUDIO

CRÉEZ UN CONTRÔLEUR

DE VOLUME POUR VOTRE

ORDINATEUR

Denis Bodor

Nous venons de voir que simuler un clavier ou une souris à l’aide d’un Arduino micro, ou Leonardo, n’est pas quelque chose de bien difficile.

Mais dès lors qu’on sort des sentiers battus, les choses peuvent

rapidement se corser. Notre objectif ici sera d’émuler l’utilisation des touches d’un clavier multimédia pour contrôler le volume audio.

Autrement dit, créer un « bouton » de volume qui fonctionne avec

n’importe quel ordinateur et n’importe quel système !

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

La bibliothèque Keyboard que nous venons de voir permet un certain nombre d’opérations que je qualifierai de basiques : envoyer des caractères et utiliser quelques touches spé-

ciales comme MAJ, Alt, Ctrl, etc. La bibliothèque cependant est construite d’une manière assez particulière et tout à fait inadaptée pour une utilisation avancée.

En effet, chaque touche d’un clavier est désignée par un code (keycode). C’est l’ordinateur auquel est connecté le clavier qui se charge d’associer ce code avec un symbole alphanumérique donné, en fonction de la disposition linguistique du périphérique. C’est entre autres pour cette raison que vous devez configurer vous-même la langue d’un clavier connecté à une Raspberry Pi. Ceci ne peut être déterminé automatiquement.

Or ce que fait la bibliothèque Keyboard se place un peu entre ces deux étapes. En regardant le contenu de Keyboard.cpp dans les fichiers de l’environnement Arduino, on peut voir des choses comme ceci :

size_t Keyboard_::press(uint8_t k)

{ uint8_t i;

if (k >= 136) { // it's a non-printing key (not a modifier)

k = k - 136;

} else if (k >= 128) { // it's a modifier key

_keyReport.modifiers |= (1<<(k-128));

k = 0;

} else { // it's a printing key

k = pgm_read_byte(_asciimap + k);

if (!k) {

setWriteError();

return 0;

}

if (k & 0x80) { // it's a capital letter or other character reached with shift _keyReport.modifiers |= 0x02; // the left shift modifier

k &= 0x7F;

}

}

Cette méthode press() prend en argument une valeur k qui peut être soit un caractère, soit le code d’une touche. Pour déterminer la nature du contenu de k, différents tests sont faits. Si k est su-périeur à 136, il est estimé qu’il ne s’agit pas d’un caractère, mais d’un code auquel on soustrait alors 136. Mais si k est entre 128 et 136, alors il doit s’agir d’un modificateur (Maj, Ctrl, etc.). Et enfin si tout ceci n’est pas vérifié, la bibliothèque considère alors que c’est un caractère et utilise le code correspondant recherché dans le tableau _asciimap en mémoire flash.

Ceci est très intéressant et pratique pour simplement utiliser Keyboard, mais qu’en est-il des codes supérieurs à 136 qu’on souhaiterait effectivement utiliser ? La réponse est simple, avec la bibliothèque dans cet état, ça n’est pas possible !

1. TORTURER LA BIBLIOTHÈQUE POUR RIEN

Instinctivement, la première chose à laquel e on pense devant cet état de fait, est de chercher à tout simplement modifier la bibliothèque pour sauter les différents tests. Bien entendu, modifier le fichier Keyboard.cpp directement dans le répertoire où est instal é l’environnement est hors de question. À la prochaine mise à jour, nos modifications seraient écrasées (et puis ce n’est absolument pas propre).

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

HACKABLE MAGAZINE n°17

31

EN COUVERTURE

CONTRÔLEUR AUDIO

On peut également

dite HID pour Human Interface

envisager de copier la

Device (périphérique d’interface

bibliothèque (le réper-

pour humain). Sans entrer outre

toire Keyboard et les

mesure dans le détail, cette classe

fichiers Keyboard.cpp

de périphériques comprenant cla-

et Keyboard.h) dans le

viers, souris, contrôleur de jeux,

répertoire libraries de

etc., communique sur le bus USB

son carnet de croquis. Il

avec un protocole particulier basé

faudrait alors réviser tout

sur la notion de rapports (reports).

le code pour changer son

Lors de la connexion à un ordi-

nom et éviter les conflits

nateur, un périphérique USB est

Un encodeur rotatif,

avec la bibliothèque originale. C’est beaucoup de

zone bleue, n’est rien

analysé, on parle d’énumération.

d’autre qu’une paire

travail et ça ne nous avance pas beaucoup.

Durant cette phase, un matériel

d’interrupteurs actionnés

Dernière option, nous pouvons tout simplement

compatible HID fournit non seule-

alternativement en

tournant la molette. Pour

prendre Keyboard.cpp et Keyboard.h et les copier

ment des informations sur sa na-

éviter les phénomènes

dans le répertoire de notre croquis tout en y spéci-

ture, mais également sur ses fonc-

de rebonds, on ajoute

fiant #include “Keyboard.h” et non #include

tionnalités et la façon de commu-

simplement une

niquer avec lui, par l’intermédiaire

<Keyboard.h>

résistance entre une

. Ainsi, dans l’environnement, nous

broche et l’alimentation,

obtenons trois onglets, un par fichier, et nous pouvons d’un descriptif de rapport HID.

et un condensateur

librement modifier la bibliothèque sans rien casser.

Dans les grandes lignes, il détaille

entre la broche et la

la forme que doivent prendre les

Là, il devient possible d’ajouter deux nouvel es mé-

masse. Ceci a pour

messages qu’il reçoit ainsi que

effet de « lisser » le

thodes, Keyboard_::pressRaw(uint8_t k)

ceux qu’il émet. Ce descriptif

changement d’état sur

et Keyboard_::releaseRaw(uint8_t k), en co-

de rapport permet également à

une brève période et

piant/collant le code déjà existant et en supprimant

donc d’obtenir un signal

l’ordinateur d’avoir un modèle des

les différents tests (sans oublier les prototypes dans

franc, débarrassé de

messages à venir et peut donc les

toutes interférences

Keyboard.h). Ainsi, en appelant Keyboard.press-

comprendre et les vérifier.

mécaniques.

Raw() en lieu et place de Keyboard.press(), nous

pouvons envoyer les codes de notre choix. .

Cette méthode de fonctionne-

ment rend les périphériques HID

Ceci fonctionnera très bien pour des codes

très souples, car les constructeurs

standards, comme par exemple ceux du pavé

peuvent alors utiliser ces rapports et

numérique, mais ne fonctionnera absolument pas

ce format plus ou moins comme ils

pour notre cas particulier : les boutons « Vol+ »,

le souhaitent tout en fournissant des

« Vol- » et « Muet » présents sur certains claviers

fonctionnalités communes à des

multimédias. En cherchant les codes sur le Web

types entiers de périphériques. Ceci

et en les utilisant ainsi, rien ne se passe, c’est

explique non seulement pourquoi

l’échec total. Il est temps d’appeler une Raspberry

n’importe quel clavier peut fonction-

Pi à la rescousse et d’éluder ce mystère. .

ner avec n’importe quel ordinateur,

mais que certaines touches ne

2. RAPPORTS HID ET

fonctionnent pas sans un pilote

spécifique, et en même temps

ESPIONNAGE DE CLAVIER que la classe HID est également

souvent utilisée pour des matériels

Pour comprendre la source du problème, il faut

qui ne sont pas des interfaces pour

avant tout se faire une idée précise de la manière

humain (programmeur de cartes,

dont fonctionne un clavier USB. Ce type de péri-

station météo USB, notificateurs à

phériques appartient à une gamme plus vaste

led, etc.).

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

Il existe, sous GNU/Linux, des outils très intéressants pour obtenir ce genre d’informations d’un péri-phérique et en particulier usbhid-dump (paquet usbutils). Nous pouvons donc nous en servir pour voir ce que raconte un clavier disposant des touches qui nous intéressent. Notre victime (volontaire) sera ici un des claviers que j’affectionne tout particulièrement, le G230 de Cherry (alias le Cherry Stream).

Nous devons tout d’abord trouver les identifiants USB avec :

$ lsusb

Bus 001 Device 005: ID 046a:0023 Cherry GmbH CyMotion Master Linux Keyboard G230

Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter

Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Notre matériel a comme ID vendeur 046a et comme ID produit 0023. Nous pouvons alors utiliser usbhid-dump pour obtenir le descriptif de rapport :

$ sudo usbhid-dump -m 046a:0023

001:005:001:DESCRIPTOR 1482164105.066372

05 0C 09 01 A1 01 85 01 19 00 2A FF 03 15 00 26

FF 03 95 01 75 10 81 00 C0 05 01 09 80 A1 01 85

02 19 81 29 83 15 00 25 01 75 01 95 03 81 02 95

05 81 01 C0

001:005:000:DESCRIPTOR 1482164105.091371

05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01

75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01

05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06

75 08 15 00 26 FF 00 05 07 19 00 2A FF 00 81 00

C0

Voilà qui n’est pas très parlant, mais nous montre déjà qu’il y a deux descriptifs disponibles. Ceci ne peut signifier qu’une chose : on peut communiquer avec ce clavier de deux façons, car même s’il s’agit bien d’un seul et même périphérique USB, il se compose de plusieurs interfaces (chose confirmée par un lsusb -v -d 046a:0023). Il y a deux descriptions disponibles parce que le clavier possède une interface « normale » et une permettant un ensemble minimum de fonctionnalités utilisées, par exemple, dans la configuration du BIOS d’un PC.

Nous pouvons ensuite voir ce qui se passe lorsque nous utilisons le clavier en ajoutant les options

-es à notre ligne de commandes :

$ sudo usbhid-dump -m 046a:0023 -es

Starting dumping interrupt transfer stream

with 1 minute timeout.

001:005:000:STREAM 1482164475.019037

00 00 14 00 00 00 00 00

001:005:000:STREAM 1482164475.075153

00 00 00 00 00 00 00 00

Ces deux messages, qui sont des rapports HID, apparaissent lorsque j’appuie sur la touche « A »

du clavier. Il y a un rapport pour la pression sur la touche, et un second lors du relâchement. Nous avons ici une série de 8 octets qui composent le message. Gardez bien cela en tête.

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

HACKABLE MAGAZINE n°17

33

EN COUVERTURE

CONTRÔLEUR AUDIO

Voyons maintenant ce qu’il se passe lorsque j’appuie sur le bouton « - » permettant de réduire le volume audio :

001:005:001:STREAM 1482164683.768131

01 EA 00

001:005:000:STREAM 1482164683.768374

00 00 00 00 00 00 00 00

001:005:001:STREAM 1482164684.008132

01 00 00

001:005:000:STREAM 1482164684.008308

00 00 00 00 00 00 00 00

Voilà qui est intéressant ! Nous n’avons pas un message pour la pression et un autre pour le relâchement, mais deux. Toujours un rapport de 8 octets, mais précédé d’un autre de 3. La logique cependant semble identique. Lorsque la touche est enfoncée, les rapports indiquent des chiffres, mais lorsqu’el e est relâchée, ils sont remplacés par 0.

De plus, le second rapport, lui, est toujours à 0. . Notez également que l’entête affiché avant les rapports se compose ainsi bus:périphérique:interface horodatage.

Les rapports de 3 octets proviennent de l’interface 1 et ceux de 8 octets de l’interface 0.

Ce qui confirme la supposition précédente basée sur la sortie de lsusb -v. Il y a bien

« deux claviers » dans le clavier. .

3. MAIS QUE FAIT LA BIBLIOTHÈQUE ARDUINO

KEYBOARD ?

Nous savons que le clavier n’utilise pas les mêmes rapports pour les touches

« standards » et les touches multimédias, c’est un début de piste intéressant, mais nous devons al er fouil er dans la bibliothèque Keyboard pour en avoir le cœur net et trouver la source du dysfonctionnement.

Ce diagramme représente les

changements d’état successifs

qui apparaissent sur les broches

d’un encodeur rotatif à mesure

que la molette est tournée. Les

deux signaux sont déphasés et il

suffit de réagir à un changement

d’état sur une broche pour

détecter un mouvement, mais

c’est la comparaison entre l’état

actuel de la seconde broche et

son état précédent qui indique le

sens de rotation.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

La méthode press() utilise la fonction sendReport(&_keyReport) pour envoyer un rapport après avoir vérifié quelques points à propos de la fameuse variable k. sendReport() est déclaré dans le même fichier Keyboard.cpp un peu plus haut :

void Keyboard_::sendReport(KeyReport* keys)

{ HID().SendReport(2,keys,sizeof(KeyReport));

}

Il s’agit d’un appel à la méthode SendReport() de la bibliothèque HID (la classe plus précisément). On voit également qu’un des arguments utilisés est keys, un pointeur sur une variable de type KeyReport qui est déclarée dans Keyboard.h : typedef struct

{ uint8_t modifiers;

uint8_t reserved;

uint8_t keys[6];

} KeyReport;

Ceci commence à prendre des al ures de jeu de piste, mais nous touchons au but. Ce qui compose le rapport du point de vue de la bibliothèque Keyboard est donc un tableau de 6 octets (uint8_t) et deux autres octets réunis dans une structure. Le tout envoyé avec HID().SendReport() directement à la machine où est branché la carte Arduino. Ceci n’a rien à voir avec ce que fait le clavier G230, il y a un problème.

Chose confirmée en programmant notre carte Arduino avec un croquis simulant l’utilisation d’une touche « A » et en observant les rapports envoyés :

$ sudo usbhid-dump -m 2341:8036 -es

Starting dumping interrupt transfer stream

with 1 minute timeout.

001:007:002:STREAM 1482222681.700084

02 00 00 04 00 00 00 00 00

001:007:002:STREAM 1482222681.800063

02 00 00 00 00 00 00 00 00

Notre Keyboard envoie donc uniquement des rapports d’une tail e précise qui ne peut être cel e correspondant à un rapport pour notre fameuse touche de contrôle du volume.

9 octets dans le rapport, le 2 passé en premier argument de HID().SendReport() et les 8 octets de la structure KeyReport. Ceci bien entendu fonctionne, bien qu’étant différent de notre G230, parce que le descriptif de rapport utilisé par le croquis de la carte Arduino, obtenu avec :

$ sudo usbhid-dump -m 2341:8036

001:007:002:DESCRIPTOR 1482223010.139500

05 01 09 06 A1 01 85 02 05 07 19 E0 29 E7 15 00

25 01 75 01 95 08 81 02 95 01 75 08 81 03 95 06

75 08 15 00 25 65 05 07 19 00 29 65 81 00 C0

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

HACKABLE MAGAZINE n°17

35

EN COUVERTURE

CONTRÔLEUR AUDIO

Un grand nombre

d’encodeurs rotatifs

permettent de « cliquer »

en appuyant sur la

le spécifie ainsi. Rappelez-vous, les rapports correspondent au descriptif molette. Ici, j’ai simplement

associé, mais ne sont pas identiques entre les périphériques, même de même représenté cette

nature. Notre souci donc va au-delà d’un simple code de touche mal utilisé. Nous fonctionnalité en ajoutant

avons un souci de rapport, de descriptif de rapport et c’est toute la bibliothèque un simple bouton poussoir,

Keyboard

connecté à la broche 4

qui devient inutilisable. Catastrophe !

de la carte Arduino. Que

Pas de panique. Ce que peut faire Keyboard en reposant sur HID nous pou-le bouton soit embarqué

dans l’encodeur ou comme

vons, nous aussi, le faire dans un croquis. Mieux encore, nous avons même un ici ajouté, le montage dans

exemple puisque Keyboard, dans les grandes lignes, fait presque le travail qu’on son ensemble ne change

lui demande de faire.

pas et le croquis associé

non plus.

Note : j’avoue avoir un peu romancé ici le processus de recherche pour rendre cela plus attrayant et ludique. En réalité, pour avoir déjà programmé des outils reposant sur USB HID, dès les rapports affichés avec usbhid-dump je savais que ceux créés, formatés et envoyés par Keyboard n’étaient pas adaptés et qu’il y avait clairement un problème dans la souplesse de configuration de cette bibliothèque. Mais je tenais ici à décrire un processus typique de ce genre d’investiga-tion. La réponse est toujours dans le code, toujours (« Use the source, Luke »).

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

4. UN CONTRÔLE d’augmenter le volume en la tournant dans un sens et le ré-

DE VOLUME QUI

duire en tournant dans l’autre sens. À chaque clic dans la rota-

tion, nous enverrons un rapport HID simulant l’action sur une

APPUIE SUR DES

touche d’un clavier multimédia. Il ne sera donc aucunement

nécessaire d’instal er un quelconque pilote sur l’ordinateur

TOUCHES

utilisé puisque celui-ci, quel que soit son type ou son système

(Windows, GNU/Linux, macOS, etc.) sera persuadé d’avoir

Avant d’attaquer le croquis,

affaire à un simple clavier. Cela fonctionnera même avec la

résumons rapidement en quoi

plupart des tablettes et smartphones (testé avec un Samsung

consiste l’objectif à atteindre.

Galaxy Nexus, un Galaxy S6 Edge et une Nvidia Shield).

Nous souhaitons ici créer un

contrôle de volume, plus ou moins

Un encodeur rotatif n’est rien d’autre qu’une paire d’inter-

comme on en trouve sur les

rupteurs actionnés par un mécanisme rotatif. Il ne fournit

appareils Hifi, avec une molette

donc aucune position ni aucune valeur comme le ferait, par

de réglage. Cette molette sera

exemple, un potentiomètre. Il n’a pas à proprement parler

un encodeur rotatif que j’ai très

d’état et il ne fait que signaler des changements, des événe-

brièvement abordé dans le numéro

ments. Ce sont les états successifs des deux interrupteurs qui

6, mais que nous al ons voir plus en

déterminent l’événement en cours, la rotation, et le sens de

détail. Cette molette nous permettra

cette rotation.

RaspberryPI2017_210x140mm_imp.pdf 1 13/02/2017 15:35:14

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

HACKABLE MAGAZINE n°17

37

EN COUVERTURE

CONTRÔLEUR AUDIO

Pour prendre en charge un encodeur rotatif, il faut

clic soit possible par pression. Ce

donc utiliser deux entrées d’une carte Arduino. Mais qui

contacteur supplémentaire propose

dit interrupteur dit également rebond. C’est un phéno-

alors deux autres broches pour cet

mène qui, à l’échel e humaine n’est pas perceptible, mais usage. Ceci correspond parfaite-qui pour un microcontrôleur cadencé à 16 Mhz comme

ment à nos présents besoins : la

celui équipant une carte Arduino Micro, pose problème.

rotation pour monter/descendre le

Il découle du fait que, mécaniquement, le contact lors de

volume et le clic pour la touche à

la fermeture de l’interrupteur n’est pas franc. La lamel e

bascule « muet ».

métal ique rebondie sur le support et génère non pas

En tournant l’encodeur, les deux

un changement d’état, mais plusieurs en un temps très

interrupteurs internes changent de

court. Pour contourner le problème, on utilise générale-

position et font apparaître sur les

ment soit un code qui prend ce phénomène en compte,

broches une succession d’états.

soit un montage à base de résistances et de condensa-

En lisant ces deux états et en ayant

teurs pour le masquer totalement.

connaissance des états précé-

Les broches d’un encodeur rotatif sont généralement

dents, il est possible de déterminer

au nombre de trois avec un commun et une broche

le sens de la rotation, la seule

pour chaque interrupteur/contacteur interne (A et B). Il

information utile, puisqu’il n’y a pas

arrive également qu’en plus de la rotation du bouton, un

de notion de position absolue ici.

Assemblé sur une platine à essais le

montage permet de vérifier rapidement le

concept et le fonctionnement du croquis.

Bien entendu, pour un usage plus régulier,

il conviendra d’assembler tout cela de

façon plus solide, sur plaque pastillée et,

de préférence, dans un joli boîtier.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

5. LE CROQUIS ET LA BIBLIOTHÈQUE HID

Avant toutes choses, nous devons prendre en main l’utilisation de la bibliothèque HID sur laquel e repose Keyboard. Ceci n’est pas aussi complexe qu’il peut sembler au premier abord, c’est même très simple. L’utilisation de la bibliothèque HID se compose de deux parties. Dans un premier temps, nous devons spécifier le descriptif de rapport dans setup() en déclarant un objet de type HIDSubDescriptor, lui-même utilisant un tableau d’octets contenant les données de cette description.

Nous n’avons pas réel ement besoin de nous soucier de la signification de ces octets et donc de lire des dizaines de pages de spécifications du standard HID, si nous pouvons simplement réutiliser quelque chose qui existe. Or, justement, nous avons cela sous la main : notre clavier G230.

Nous avons vu précédemment que nous pouvons obtenir à la fois la description de rapport et des exemples de rapport pour chaque pression des touches qui nous intéressent. Nous n’avons donc qu’à honteusement copier ce qui existe.

Pour nous aider dans cette tâche et rendre cela plus lisible, nous pouvons nous servir du site http://eleccelerator.com/usbdescreqparser. Celui-ci propose, en effet, de préciser une suite d’octets tel e que nous l’affiche usbhid-dump et nous retourne, en échange, des données bien formatées et commentées directement utilisables dans notre croquis. Notez que ceci n’est pas une absolue nécessité, mais c’est tout de même plus facile que de reprendre chaque valeur et d’ajouter manuel ement des 0x et des virgules partout (un bon programmeur est un programmeur feignant).

Via ce site nous obtenons donc de quoi remplir le tableau que nous déclarons alors ainsi : static const uint8_t hidReportDescriptor[] PROGMEM = {

0x05, 0x0C, // Usage Page (Consumer)

0x09, 0x01, // Usage (Consumer Control)

0xA1, 0x01, // Collection (Application)

0x85, 0x01, // Report ID (1)

0x19, 0x00, // Usage Minimum (Unassigned)

0x2A, 0xFF, 0x03, // Usage Maximum (0x03FF)

0x15, 0x00, // Logical Minimum (0)

0x26, 0xFF, 0x03, // Logical Maximum (1023)

0x95, 0x01, // Report Count (1)

0x75, 0x10, // Report Size (16)

0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xC0, // End Collection

0x05, 0x01, // Usage Page (Generic Desktop Ctrls)

0x09, 0x80, // Usage (Sys Control)

0xA1, 0x01, // Collection (Application)

0x85, 0x02, // Report ID (2)

0x19, 0x81, // Usage Minimum (Sys Power Down)

0x29, 0x83, // Usage Maximum (Sys Wake Up)

0x15, 0x00, // Logical Minimum (0)

0x25, 0x01, // Logical Maximum (1)

0x75, 0x01, // Report Size (1)

0x95, 0x03, // Report Count (3)

0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x95, 0x05, // Report Count (5)

0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xC0, // End Collection

};

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

HACKABLE MAGAZINE n°17

39

EN COUVERTURE

CONTRÔLEUR AUDIO

Nous pouvons alors composer notre fonction setup() en incluant le nécessaire pour la prise en charge de l’encodeur rotatif :

#include <HID.h>

#define PINA 3

#define PINB 2

#define CLIC 4

// dernier état de A

int derniereA = LOW;

// état actuel

int n = LOW;

int clic = HIGH;

void setup() {

pinMode(PINA,INPUT);

pinMode(PINB,INPUT);

pinMode(CLIC,INPUT);

static HIDSubDescriptor node(hidReportDescriptor,

sizeof(hidReportDescriptor));

HID().AppendDescriptor(&node);

}

Nous déclarons un objet node de type HIDSubDescriptor en spécifiant le tableau contenant nos octets ainsi que sa tail e. Un pointeur (notez-le & ) sur node est ensuite utilisé en argument de la méthode AppendDescriptor() de la classe HID() pour que le descripteur de rapport soit utilisé.

Nous pouvons alors nous pencher sur loop(), mais avant tout nous devons faire comme Keyboard et prévoir une structure qui contiendra les octets composant les rapports pour chaque touche. Encore une fois, nous faisons appel à usbhid-dump (avec -es) pour capturer ce qui nous intéresse depuis le clavier G230 :

• touche « volume- » : 01 EA 00,

• touche « volume+ » : 01 E9 00,

• touche « muet » : 01 E2 00,

• relâchement : 00 00 00.

Nous parierons ici que le second rapport, provenant de l’autre interface proposée par le périphérique USB, n’est pas important, car de toute façon tous les octets sont à 0, ce qui correspond à un « aucune pression de touche ». Contrairement au clavier G230 donc, nous n’enverrons qu’un seul type de rapport.

Notre structure inspirée de cel e présente dans Keyboard sera donc : typedef struct {

uint8_t modifiers = 0;

uint8_t key = 0;

} KeyReportMini;

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Créez un effet « feu » avec une matrice de leds

Tout ce que nous avons à faire à présent est d’envoyer le bon contenu de rapport au bon moment avec HID().SendReport(), qui prend en argument un identifiant numérique (id) qui est le premier octet du rapport, un pointeur sur les données à envoyer (notre variable de type KeyReportMini) et la tail e de ces données.

Voici donc notre fonction loop() écrite dans ce sens :

void loop() {

// données du rapport

KeyReportMini report;

// gestion du clic "muet"

if((digitalRead(CLIC) == LOW)) {

if(clic == HIGH) {

clic = LOW;

// on change la valeur du second octet du rapport

report1.modifiers = 0xe2;

// envoi du rapport

HID().SendReport(1,&report,sizeof(KeyReportMini));

// temps de pression sur la touche

delay(20);

// touche relâchée

report1.modifiers = 0x00;

// envoi du rapport

HID().SendReport(1,&report,sizeof(KeyReportMini));

}

} else {

clic = HIGH;

}

// Gestion de la rotation de l'encodeur

// lecture A

n = digitalRead(PINA);

// est-ce que l'état de A a changé ?

if ((derniereA == LOW) && (n == HIGH)) {

// oui et B est bas, donc c'est une rotation antihoraire

if (digitalRead(PINB) == LOW) {

// on décrémente

report1.modifiers = 0xea;

HID().SendReport(1,&report,sizeof(KeyReportMini));

delay(20);

report1.modifiers = 0x00;

HID().SendReport(1,&report,sizeof(KeyReportMini));

} else { // oui et B est haut, donc c'est une rotation horaire

// on incrémente

report1.modifiers = 0xe9;

HID().SendReport(1,&report,sizeof(KeyReportMini));

delay(20);

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

HACKABLE MAGAZINE n°17

41

EN COUVERTURE

CONTRÔLEUR AUDIO

report1.modifiers = 0x00;

HID().SendReport(1,&report,sizeof(KeyReportMini));

}

}

// l'état actuel devient l'état précédent

derniereA = n;

}

Les commentaires dans le croquis parlent d’eux-mêmes. Les changements d’état sur les broches A et B de l’encodeur rotatif nous permettent, une fois combinés et comparés aux précédents, de savoir dans quel sens la rotation vient d’être faite, et nous envoyons les rapports en conséquence, juste après avoir modifié l’octet qui nous intéresse.

6. CE N’EST QU’UN DÉBUT

Nous venons d’apprendre plusieurs choses grâce à ce projet. Premièrement, il est important de ne pas s’en tenir aux fonctionnalités offertes par les bibliothèques standards livrées avec l’environnement. Ici nous avons vu que « Keyboard » propose certaines fonctionnalités intéressantes et tout comme sa bibliothèque « sœur » Mouse pour émuler un périphérique de pointage, est construit sur HID, mais que cette dernière bibliothèque ne dispose pas d’exemples dédiés. Il est donc très intéressant, tantôt, de prendre le temps de ne pas simplement utiliser ce qui est mis à notre disposition, mais également d’en comprendre le fonctionnement interne.

Nous avons également constaté que cette façon de voir les choses est très bénéfique et nous permet de régler des problèmes qui peuvent paraître bloquants au premier abord.

La ténacité est une qualité importante chez un programmeur et un bidouil eur. Ce n’est pas parce que quelque chose semble impossible qu’il faut baisser les bras. La plupart du temps, il suffit de « descendre d’un cran » et de comprendre comment fonctionne et ce qu’utilise ce qui ne marche pas.

Enfin, et c’est peut-être là le plus important, nous avons ici utilisé davantage d’outils que ceux dont nous disposons initialement. Ce n’est pas parce que votre projet est basé sur Arduino qu’une Raspberry Pi ne peut pas vous rendre de grands services dans vos recherches. Ceci est tout aussi vrai dans ce sens que dans le sens opposé, une carte Arduino peut être d’un grand secours pour un projet basé sur une Pi. Garder l’esprit ouvert et utiliser toutes les ressources à sa disposition est souvent la meil eure approche. Rien ne vous empêche d’expérimenter sur une plateforme pour ensuite transposer le savoir acquis sur une autre.

Et bien sûr, ce que nous avons fait ici pour un simple contrôle de volume peut être fait pour n’importe quel e fonctionnalité d’un clavier multimédia ou autre. Vous pouvez associer n’importe quel e touche ou séquence de touches à n’importe quel e entrée d’une carte Arduino Micro ou Leonardo. Lecture/pause de vidéo ou de piste audio, avance rapide, contrôles associés à un lecteur multimédia comme VLC ou à n’importe quel e application. .

Tout ce que vous pouvez faire avec un clavier peut être transposé ainsi dans un montage utilisant des encodeurs rotatifs, des boutons, des capteurs ou encore des potentiomètres.

Les possibilités sont pratiquement il imitées. . DB

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

À PARTIR DU 1ER MARS, CONNECT ÉVOLUE !

LISEZ CE NUMÉRO ET PLUS

DE 15 AUTRES EN LIGNE !

ACTUELLEMENT SUR CONNECT :

• CE NUMÉRO

• 1 numéro

• et + de 15 autres numéros

Hors-Série de

+

de Hackable

Hackable

TOUT CELA À PARTIR DE 149 € TTC*/AN !

* Tarif France Métropolitaine

Rendez-vous sur connect.ed-diamond.com pour découvrir Connect !

Pour tous renseignements complementaires, contactez-nous :

· via notre site internet : www.ed-diamond.com

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

· par téléphone : 03 67 10 00 20

http:/ www.ed-diamond.com

HACKABLE MAGAZINE n°17

43

ou envoyez-nous un mail à connect@ed-diamond.com !

pub_magazines_fev2017.indd 11

15/02/2017 14:24

EN COUVERTURE

CLAVIER IBM XT

TRANSFORMEZ UN VIEUX

MATÉRIEL DE 30 ANS EN

CLAVIER USB

Denis Bodor

Rien se perd, tout se transforme... en particulier quand on prend l’habitude de ne rien jeter qui pourrait, un jour, servir à quelque chose.

C’est précisément le cas de ce clavier IBM XT de 1985 qui attendait patiemment dans mon grenier que je daigne lui donner une seconde

vie. L’article qui va suivre est tout autant une description technique de l’adaptation d’un clavier, qu’un retour d’expérience pouvant, je l’espère, vous aider dans vos propres expérimentations.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Transformez un vieux matériel de 30 ans en clavier USB

L’histoire commence Mais l’ensemble, avec écran, unité centrale et clavier avec un terrible regret,

pesant quelques 22 kilos et occupant une place non

celui d’avoir abandon-

négligeable, n’est pas le genre d’objet qu’il est facile

né il y a quelques an-

de conserver et celui-ci a donc, il y a fort longtemps

nées déjà, à l’occasion

et à contrecœur, été abandonné à son sort. Je ne

d’un déménagement, un magni-

saurai exprimer à quel point je regrette cette décision

fique IBM PC 5160, véritable point

aujourd’hui, mais je trouve une certaine forme de

de départ de l’ère « PC » dans

réconfort dans le fait d’avoir, tout de même, conservé le

laquel e nous nous trouvons en-

clavier, qui pour une raison inconnue s’est cependant

core. En effet, dans votre machine

vu amputé de son câble (sans doute pour en faire un

dernier cri se trouvent encore des

connecteur pour un Commodore 64).

éléments, réels ou émulés, héri-

Quoi qu’il en soit, j’avais donc en ma possession un

tés de cette machine légendaire

fantastique, magnifique, sale et pesant (~3 kg) clavier

dont la production a commencée

IBM modèle « F » XT de quelques 30 ans d’âge ne

en 1981. Regardez simplement

demandant qu’à reprendre du service, en faisant un

votre clavier par exemple, non

adorable « clic » à chaque pression d’une touche. Mais

loin du pavé numérique se trouve

les choses ne sont pas aussi simples que cela. .

une touche, « Arrêt défil » (Scroll

Lock), quasiment inutilisée de

nos jours (sauf rares exceptions),

1. PRISE DE CONTACT ET

cel e-ci est un héritage de l’IBM

PC original (qui l’a lui-même hérité

FLORILÈGE D’ERREURS

des terminaux IBM). Ceci n’est

Une trentaine d’années, ce n’est pas grand-chose à

qu’un exemple visible, le bus ISA

l’échel e de l’Histoire, un peu davantage à l’échel e d’une

du tout premier PC, par exemple,

vie, mais une véritable éternité lorsqu’on parle d’infor-

est toujours présent même sur les

matique. Dites-vous bien qu’il y a 30 ans, il n’y avait pas

architectures PC 64 bits actuel es,

d’Internet pour le grand public, pas de réseau Ethernet,

ce qui n’est bien entendu pas le

pas de Wifi. . que le Macintosh venait de naître et que

cas avec une Raspberry Pi (qui

la souris tout comme les disques durs étaient encore

n’est donc pas à proprement par-

quelque chose de relativement rare pour un chanceux

ler un PC).

(et riche) propriétaire de PC.

Voici la bête ! Un

clavier IBM modèle

« F » pour PC/XT

de 1985. C’est,

tristement, tout ce

qui'il me reste de la

machine originale

qui est maintenant

une véritable pièce

de musée. Ce genre

de choses se traite

avec respect et

humilité, car c’est

littéralement un

morceau d’histoire...

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

HACKABLE MAGAZINE n°17

45

EN COUVERTURE

CLAVIER IBM XT

La première

problème grave nécessitant sou-

étape, quasi

dure, mais simplement l’affaire

archéologique,

d’une connexion aisée à l’aide de

consiste donc

câbles/jumpers femelles.

à retrouver le

Le connecteur 10 broches (2×5)

dialecte utilisé à

en question et son morceau de

l’époque entre le

câble présentaient 4 connexions :

clavier et l’unité

rouge, noir, blanc et brun. En

centrale. Instincti-

toute logique, le rouge est syno-

vement, et après

nyme d’alimentation et le noir de

une recherche

masse. . Grave erreur que cel e-

bien trop sommaire

ci, car chez IBM on ne semblait,

sur le Web, on

à l’époque, n’accorder que peu

Le clavier mériterait

a tendance à tirer des conclusions hâtives. Ainsi,

en principe un bon

d’intérêt à ce genre de convention.

nettoyage méticuleux

sachant qu’une carte Arduino est en mesure de

La connexion erronée du clavier à

et prudent. Si vous en

prendre en charge un clavier de type PS/2 et que,

la carte Arduino n’apportant aucun

doutiez ou l’ignoriez,

de mémoire, il existait des adaptateurs DIN vers

résultat, une vérification des

oui, le terme « PC »

PS/2 permettant de connecter un ancien clavier à

est bel et bien une

connexions me donna l’occasion

référence directe au

une machine moderne (pré-2000), on est enclin à

de constater que le circuit intégré

Personal Computer

penser qu’il n’y a pas de grandes différences entre

du clavier semblait anormalement

d’IBM. C’est même

ces différents types de claviers.

chaud. Là, il n’y a aucune question

marqué dessus !

C’est là une grossière erreur, car même si effec-

à se poser, ce genre de phéno-

tivement, la bibliothèque PS2Keyboard est bien en

mène n’appel e qu’à une seule

mesure d’interpréter les messages d’un clavier à

réaction : tout déconnecter dans

l’aide de deux simples connexions, ceci se limite au

un mouvement de panique totale !

seul protocole PS/2 et donc à des périphériques qui

À ce stade, la conclusion est

ne sont de loin pas aussi vieux.

évidente et mon conseil à votre

Mon premier conseil donc pour vous éviter bien

attention tout autant : ne faites pas

des ennuis dans ce genre d’expérimentations est

confiance à la couleur des câbles,

de ne surtout pas faire de raccourcis et ne pas

ni selon les conventions d’usage,

supposer des vérités là où vous n’avez absolument

ni selon les documentations en

aucune preuve pour les étayer.

ligne et assurez-vous toujours que

la masse est là où vous pensez

Ces premières tentatives d’utilisation avec la

qu’el e se trouve.

bibliothèque PS2Keyboard ont également été l’oc-

casion d’une autre bonne leçon que je vous invite

La masse est généralement fa-

à retenir : ne faites JAMAIS confiance à la couleur

cile à trouver puisque présente un

des câbles !

peu partout dans un périphérique

et généralement reliée à toutes

Le clavier, qui s’avère être une véritable pièce

les masses métal iques en pré-

de col ection, a bien fail i vivre ses derniers jours

sence (blindage, etc.). Un simple

lors de la première connexion à une carte Arduino.

multimètre en mode « continuité »

Après un démontage de la bête par retrait du pan-

vous permettra de vérifier si un

neau métal ique arrière retenu par deux énormes

connecteur est effectivement relié

vis, la surprise fut grande de constater que le circuit

à la masse. Dans le cas de ce

imprimé animant l’objet dispose d’un connecteur

clavier, l’énorme plaque métal ique

interne. La coupure du câble n’était donc pas un

servant de support et de châssis

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Transformez un vieux matériel de 30 ans en clavier USB

aux touches est reliée au circuit

C’est le cas, par exemple, des deux circuits logiques

imprimé et à la broche centrale du

présents à côté de l’énorme contrôleur clavier :

connecteur, initialement branché. .

deux circuits intégrés de 14 pattes, dont un 74239

au câble rouge ! Oui, vous avez

de Texas Instruments (un décodeur/démultiplexeur

bien lu, le rouge était la masse et,

2-vers-4). Ce type de composants a un brochage

de ce fait, j’ai donc appliqué +5V

standardisé avec la masse en bas à gauche et la

directement à cet endroit, risquant

tension d’alimentation en haut à droite. Il suffit alors

de détruire le circuit intégré !

d’utiliser, encore une fois, le testeur de continuité

Une fois la masse trouvée,

pour :

l’étape suivante consiste à faire de

• vérifier que les deux circuits intégrés sont

même pour la tension d’alimenta-

connectés par leur masse et à la masse,

tion. Là, en l’absence de schéma

• qu’ils sont connectés par la broche en haut à

ou de documentation technique

droite supposée être la tension d’alimentation

des composants, il faut procéder

(VCC),

par déduction et vérifier ses sup-

positions. En toute logique, un

• qu’au moins un des condensateurs est à la fois

tel circuit, connecté à l’aide d’un

branché à la masse et à la tension d’alimentation

À l’intérieur du

clavier, un simple

long câble doit s’assurer que la

supposée et que ceci correspond effectivement

circuit imprimé

tension d’alimentation est exempte

à l’éventuel marquage sur ce condensateur.

double face, un

de « bruit ». Il y a donc forcément

énorme et solide

Après cette procédure, il s’est avéré que le câble

un condensateur placé entre la

support pour les

original de couleur brune était la tension d’alimenta-

touches et, non

tension d’alimentation et la masse,

tion et que le câble noir était connecté à un signal.

présents sur la photo

non loin du connecteur.

J’avais donc connecté ma masse à un signal en

faite après nettoyage,

30 ans de poussière

La masse étant identifiée, nous

sortie du clavier, ce qui, là encore, aurait pu poser un

accumulée, des

pouvons également la retrouver

problème (moindre que l’alimentation sur la masse,

miettes à profusion et

sur les circuits intégrés présents.

certes).

une araignée séchée

(d’époque sans

doute).

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

HACKABLE MAGAZINE n°17

47

EN COUVERTURE

CLAVIER IBM XT

Une fois deux des connecteurs identifiés, il

2. RETROUVER UNE

ne reste plus que les signaux. Wikipédia, sur la

page anglaise concernant l’IBM PC keyboard,

LANGUE PARLÉE IL

nous indique qu’il n’existe qu’une seule configu-

ration utilisant uniquement 4 connexions pour les

Y A 30 ANS

claviers PC (en dehors de l’USB) : le clavier du

Après reconnexion correcte de

PC XT type 2. Cette page indique également que

l’alimentation et de la masse, l’aven-

les deux autres connexions sont destinées aux

ture ne fait que commencer. Voyant

signaux d’horloge et de données provenant du

le fait de n’avoir pas détruit l’électro-

clavier et à destination du PC, et que la commu-

nique du clavier comme un signe du

nication est unidirectionnel e (pas de communica-

destin très encourageant, c’est à ce

tion du PC vers le clavier).

moment que j’ai commis une autre

Une charmante

Le lecteur attentif remarquera sans doute qu’il

erreur : supposer que « qui peut le

attention du

aurait été plus simple d’observer le circuit imprimé

plus peut le moins » ou en d’autres

constructeur : le

circuit imprimé

pour retrouver les connexions plus rapidement.

termes que le standard PS/2 devait

dans le clavier

Ceci est parfaitement vrai dans de nombreux cas,

sans doute être compatible avec les

est relié au câble

mais malheureusement difficilement applicable

claviers AT qui eux-mêmes devaient

par un connecteur

lorsqu’une masse de mousse tout aussi vieil e que

l’être avec les claviers XT.

d’excellente facture

et non simplement

le matériel lui-même est col ée sur l’une des faces

Niveau connectique, et ne

soudé. C’est

du circuit. Je n’ai pas souhaité retirer cette mousse

sachant pas quel câble était le

normal, fut un

fragile pour ne pas avoir à trouver une solution

temps, le matériel

signal d’horloge et lequel était

pour la remplacer au moment de refermer définiti-

informatique était

destiné à la transmission des

prévu pour pouvoir

vement le périphérique.

données, je me suis naïvement dit

être réparé. Fut un

qu’il me suffirait de tester les deux

temps...

combinaisons possibles avec la

bibliothèque PS2Keyboard. Le

résultat fut. . étonnant. Quel e que

soit la connexion, le clavier sem-

blait bel et bien émettre des don-

nées, mais de façon incohérente.

Une pression sur une touche ne

donnait pas de résultats, mais une

série de pressions sur plusieurs

touches oui. De la même façon,

une action répétée sur une même

touche affichait également un

résultat dans le terminal série,

mais. . sans cesse différent !

Un coup d’œil sur la page Wiki-

pédia précédemment citée montre

en effet une grande différence entre

le protocole utilisé par un clavier XT,

2 bits de start, 8 bits de données et

un bit de stop, et celui utilisé par un

clavier PS/2, 1 bit de start, 8 bits de

données, un bit de parité, et un bit

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Transformez un vieux matériel de 30 ans en clavier USB

de stop. Ce dernier format/protocole l’état de ce qu’on suppose être la ligne d’horloge et à chaque est également celui des claviers

changement d’état bas vers haut (0V à +5V), lire l’état de la

AT, ce qui explique pourquoi un

broche supposée des données pour col ecter chaque bit et

adaptateur DIN-5 vers miniDIN-6

former une valeur entière (int) sur 11 bits.

permettait aux propriétaires de

Deux façons de faire peuvent être envisagées : littérale-

claviers AT d’utiliser ce matériel sur

ment scruter l’état de la broche dans une boucle (technique

des machines plus récentes avec

du polling) ou utiliser une interruption qui déclenchera l’exé-

un port miniDIN (qui existe encore

cution d’une fonction en cas de changement d’état. Cette

tantôt sur les machines actuel es).

seconde solution étant la plus élégante, c’est donc cel e qui

C’est à ce stade qu’on peut se

sera utilisée avec le croquis suivant :

rendre compte que la bibliothèque

PS2Keyboard ne pourra pas être

#define CLOCK 2

#define DATA 8

utilisée dans l’état et que sa modi-

fication n’apportera pas forcément

// données cumulées

une solution. Il en va de même

volatile int b_data;

// compteur d’horloge

pour la bibliothèquePS2KeyAd-

volatile int cpt;

vanced plus souple d’utilisation et

// drapeau prêt/ready

offrant davantage de fonctionna-

volatile int rdy;

lités, mais comportant le même

// routine d’interruption

problème : au niveau le plus bas,

void clksig() {

les données émises par le clavier

b_data |= digitalRead(DATA) << cpt ;

n’ont pas le bon format.

cpt++;

if(cpt > 10) {

La solution consiste donc à

cpt=0;

développer un croquis permettant,

rdy=1;

au minimum, de régler un premier

}

}

problème : distinguer le signal

d’horloge de celui des données.

void setup() {

Serial.begin(115200);

Le principe est relativement

while(!Serial){;}

simple, nous avons un connecteur

Serial.println("Go go go!");

qui change d’état régulièrement pour

« donner la cadence » et signaler

pinMode(CLOCK, INPUT_PULLUP);

pinMode(DATA, INPUT_PULLUP);

qu’un bit peut être lu. L’autre connec-

teur présente le bit en question. Sur

// installation de la routine

la base des informations données

attachInterrupt(digitalPinToInterrupt(CLOCK), clksig, RISING);

par Wikipédia, nous sommes donc

}

censés pour chaque « événement »

void loop() {

(pression ou relâchement d’une

// données prêtes ?

touche), avoir 11 bits à lire et donc 11

if(rdy) {

changements d’état de la ligne d’hor-

// horodatage

Serial.print(millis());

loge. Là encore, faire des raccourcis

Serial.print(" : ");

maladroits et croire tout ce qu’on lit

// bits collectés

ou pense est ce qui fera perdre un

Serial.println(b_data,BIN);

temps non négligeable.

rdy=0;

b_data=0;

L’approche à adopter ici consiste

}

à écrire un croquis qui va scruter

}

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

HACKABLE MAGAZINE n°17

49

EN COUVERTURE

CLAVIER IBM XT

Là, je ne comprends

pas. Qu’est-ce

qui peut pousser

quelqu’un à décider,

quelque part dans

Go go go!

un laboratoire

3919 : 1001011

ou une usine,

4711 : 1010100010

qu’associer un

4817 : 1100000001

câble de couleur

5274 : 110000000

rouge à la masse

5365 : 1011000010

est une bonne

5913 : 101100001

idée ?! Car c’est

6005 : 10110010

un fait, le fil rouge

6766 : 1001011000

est ici la masse,

le brun la tension

6873 : 100101100

d’alimentation (+5V)

7527 : 10010110

et le noir comme le

blanc des signaux

Voilà qui n’est pas du tout ce

TTL.

que nous espérions. La même

touche, enfoncée et relâchée, doit

OBLIGATOIREMENT envoyer

les deux mêmes valeurs (une

Nous configurons ici la carte Arduino de manière à

pour l’appui et une autre pour le

appeler clksig() dès que l’état de la broche 2 passe

relâchement). Là, vous avons

de bas à haut (RISING) avec attachInterrupt() et en

à chaque fois une autre valeur,

précisant le nom de l’interruption grâce à la valeur re-

ça n’a pas de sens. Ce n’est pas

tournée par digitalPinToInterrupt() à qui on passe

grave, les signaux d’horloge et de

en argument le numéro de broche concernée.

données doivent simplement être

J’utilise ici une carte Arduino Micro, car l’objectif est, à

inversés. Second essai et. . non,

terme, de faire apparaître le montage comme un clavier

c’est encore pire ! En inversant les

USB. Sur ce modèle de carte, seules les broches 0, 1, 2, 3

broches, tantôt nous n’avons pas

et 7 peuvent être utilisées pour ce type de choses. Pour une

de données du tout et les valeurs

UNO, seules les broches 2 et 3 peuvent ainsi générer des

sont encore plus changeantes.

interruptions.

Quelque chose va vraiment de

Lorsque

travers...

clksig() est appelée, nous lisons l’état de

la broche 8 et stockons chaque bit obtenu décalé du

nombre de fois où la routine a été appelée. Le premier

3. PARFOIS UN

bit sera donc le bit de poids le plus faible (totalement à

droite dans la variable de type int) et le 11ème sera à la

PEU D’AIDE NE

position 10. Si le compteur atteint 11 c’est que le prochain

bit devrait être le 12ème et, dans ce cas, notre valeur lue

FAIT PAS DE MAL

est complète. Nous repassons cpt à 0 et plaçons 1 dans

À ce stade, la confusion et le

rdy (ready).

doute règnent en maîtres. L’inver-

Dans la boucle principale loop(), nous nous conten-

sion de polarité lors du premier

tons d’attendre que rdy soit non nul, indiquant qu’une

branchement a-t-el e endommagé

valeur complète est lue. Si tel est le cas, nous affichons

l’électronique du clavier ? S’agit-il

cette valeur en binaire dans le moniteur série et réinitiali-

d’une autre forme de communica-

sons à la fois la variable contenant la valeur et rdy à zéro

tion ? Notre Arduino a-t-il un pro-

pour col ecter les prochains bits.

blème ? Ou. . est-on simplement

al é trop vite en besogne ?

Tout semble en ordre, il ne nous reste plus qu’à tester

le croquis en appuyant de façon répétée sur une même

Dans ce genre de situations,

touche pour obtenir des données. Ce qui nous donne :

il faut savoir revenir à la base et

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Abonnez-vous !

Compléter ma

collection en

papier ou en

M’abonner ?

PDF ?

Me réabonner ?

Pouvoir consulter la base

documentaire de mon

magazine préféré ?

C’est simple... c’est possible sur :

http://www.ed-diamond.com

 ... OU SÉLECTIONNEZ VOTRE OFFRE DANS LA GRILLE AU VERSO 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.

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

HACKABLE MAGAZINE n°17

51

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.

ABO_formulaire2017_mags_R2.indd 15

15/02/2017 12:01

EN COUVERTURE

Bon d’abonnement

CHOISISSEZ VOTRE OFFRE !

PAPIER + BASE

SUPPORT

PAPIER

DOCUMENTAIRE

Prix TTC en Euros / France Métropolitaine*

1 connexion BD

Offre ABONNEMENT

Réf Tarif TTC

Réf

Tarif TTC

HK

6n° Hackable

HK1

39,-

HK13

169,-

LES COUPLAGES AVEC NOS AUTRES MAGAZINES

i

6n° Hackable

+

6n° MISC

i1

79,-

i13

419,-

6n° Hackable

+

i+

i+1

99,-

i+13

439,-

6n° MISC

+

2n° Hors-Série

J

11n° GNU/Linux Magazine France

+

6n° Hackable

J1

105,-

J13

399,-

J+

6n° Hackable

+

J+1

159,-

J+13

459,-

11n° GNU/Linux Magazine France

+

6n° Hors-Série

K

6n° Hackable

+ 6n° Linux Pratique

K1

75,-

K13

329,-

K+

6n° Hackable

+

K+1

99,-

K+13

359,-

6n° Linux Pratique

+

3n° Hors-Série

LA TOTALE DIAMOND !

L

11n° GLMF + 6n° HK* +

6n° LP

+ 6n° MISC

L1

189,-

L13

839,-

11n° GLMF +

6n° HS

+ 6n° HK* +

6n° LP

+

3n° HS +

L+

L+1

289,-

L+13

939,-

6n° MISC

+

2n° HS

Les abréviations des offres sont les suivantes : LM = GNU/Linux Magazine France | HS = Hors-Série | LP = Linux Pratique | HK = Hackable Particuliers = CONNECTEZ-VOUS SUR :



http://www.ed-diamond.com

pour consulter toutes les offres !

*Les tarifs hors France Métropolitaine, Europe, Asie, etc. sont disponibles en ligne !

Professionnels = CONNECTEZ-VOUS SUR :

http://proboutique.ed-diamond.com

Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) pour consulter toutes les offres !

52

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

*Les tarifs hors France Métropolitaine, Europe, Asie, etc. sont disponibles en ligne !

ABO_formulaire2017_mags_R2.indd 16

15/02/2017 12:01

Transformez un vieux matériel de 30 ans en clavier USB

vérifier ce sur quoi on aura basé notre expérience. Nous avons besoin ici de vérifier deux choses : où est le signal d’horloge et combien de bits sont effectivement envoyés lors d’une pression sur une touche.

La méthode la plus simple est de bénéficier de l’aide d’un oscil oscope ou d’un analyseur logique (voir Hackable n°5). En branchant les sondes de l’appareil sur les deux connecteurs mystérieux, nous aurons alors très rapidement les deux réponses en une fois. Dans les faits c’est précisément ce que j’ai décidé de faire et sans doute par là que j’aurai dû commencer.

Il y a ici aussi une leçon à retenir : utiliser tout l’équipement à sa disposition pour col ecter des informations avant de faire quoi que ce soit.

Comme il est possible que vous ne disposiez pas d’un tel matériel, que ce soit un oscil oscope numérique (~350€) ou un analyseur logique (~120€ pour un Salae Logic 4

canaux et ~20€ pour un clone), voici une méthode alternative. Ce que nous cherchons à détecter c’est un nombre récurrent de changements d’état, quel e que soit la touche du clavier utilisée. Les données ne nous intéressent pas, nous voulons simplement compter les ticks d’horloge. Or, pour cela, un croquis Arduino suffit.

Nous pouvons donc modifier notre croquis initial ainsi :

void clksig() {

cpt++;

}

et

unsigned long previousMillis = 0;

const long interval = 10;

void loop() {

unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {

previousMillis = currentMillis;

Retrouver la masse

if(cpt) {

n’est pas difficile, elle

Serial.print(millis());

est présente un peu

Serial.print(" : ");

partout. Pour la tension

Serial.println(cpt);

d’alimentation, il faut

cpt=0;

s’aider du condensateur

}

sur la gauche et du

}

brochage des deux

}

circuits logiques de 14

pattes à gauche de

l’énorme contrôleur.

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

HACKABLE MAGAZINE n°17

53

EN COUVERTURE

CLAVIER IBM XT

Pour trouver la signification

et l’usage des connexions

restantes, le plus simple

est encore d’utiliser un

oscilloscope en réglant un

niveau de déclenchement

(trigger) et une capture

unique (single shot). On voit

ici en haut en jaune le signal

d’horloge et en bas en cyan

les données découlant de la

pression sur la touche « K ».

Notre routine d’interruption ne fait plus qu’une seule

mais l’horloge, el e, est régulière.

chose : incrémenter une variable cpt. Nous reposons sur la

Nous avons donc identifié notre

fonction millis() pour régulièrement afficher et remettre

signal et c’est cette broche qui

à zéro cette variable (si el e est différente de 0). Il ne s’agit

devra être connectée à la broche

ni plus ni moins que de l’exemple BlinkWithoutDelay de

2 de la carte Arduino.

l’environnement Arduino avec, en prime, notre routine

d’interruption.

L’autre point intéressant est

la valeur affichée : 10. Que

Après enregistrement du croquis dans la carte, une

l’interruption soit déclenchée

broche nous donne des valeurs différentes à chaque fois,

par un changement de bas vers

mais l’autre nous affiche ceci :

haut (RISING) ou de haut vers

bas (FALLING), le résultat est le

11650 : 10

11791 : 10

même. Nous avons 10 flancs

12704 : 10

montants ou descendants et donc

12855 : 10

10 bits, non 11 ! Donc, soit il n’y

14090 : 10

a pas deux bits de start (destinés

14240 : 10

15154 : 10

à signaler l’arrivée de données),

15335 : 10

mais un, soit il n’y a pas de bit de

stop. On peut raisonnablement

Ah ! Voici donc notre signal d’horloge, constant, propre

penser que les bits de données

et bien discipliné. Les changements d’état sur la broche de

sont effectivement au nombre de

données sont forcément souvent différents d’une touche à

8, pour former un octet (mais là

l’autre, en fonction du nombre de successions de 1 ou de 0,

aussi ça pourrait être une erreur).

La capture faite à l’oscilloscope

permet de confirmer une des

sources de documentation sur

l’encodage des données. Ici le

diagramme reproduit à partir

des informations de kbdbabel.

org avec, en rose, le code

correspondant à la touche K,

en tout point similaire au signal

capturé. C’est la lumière au

bout du tunnel... Enfin !

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Transformez un vieux matériel de 30 ans en clavier USB

Pourtant, une tel e configuration n’existe pas d’après

une valeur. Dès que nous arrivons

Wikipédia et il faut al er creuser dans le fin fond d’Internet

au bit de stop, notre variable est

pour trouver un autre son de cloche. Après une bonne heure

utilisable et ceci est traité dans

de recherche avec, sous les yeux mon écran d’oscilloscope,

loop(), que nous étoffons un peu

je finis alors par tomber sur http://www.kbdbabel.org.

au passage :

D’aspect spartiate, le site pourtant regorge d’informations

techniques très intéressantes à propos des protocoles de

void loop() {

divers claviers du Macintosh à l’Apple Lisa en passant par

// données prêtes ?

l’Amiga, le Tandy 1000, l’AT ou encore l’IBM PC/XT. Et là,

if(rdy) {

surprise ! Il est effectivement question de 10 bits avec 1 bit

// horodatage

de start, 8 de données et 1 de stop.

Serial.print(millis());

Serial.print(" : ");

Encore une leçon qui s’ajoute à cel es déjà reçues : ne

// en hexa

jamais faire confiance à une source unique d’information

Serial.print(b_data,HEX);

Serial.print(" : ");

fut-elle Wikipédia.

// en décimal

Une cherche complémentaire à propos du flanc me

Serial.print(b_data,DEC);

dirige vers un forum où un utilisateur en 2006 confirme

Serial.print(" : ");

// en binaire

mes soupçons et ce que montre à la fois mon oscil oscope

Serial.println(b_data,BIN);

et kbdbabel.org : les données sont valides sur un flanc

rdy=0;

montant du signal d’horloge, contrairement aux claviers AT

b_data=0;

qui utilisent le flanc descendant. Chose confirmée, de plus,

}

par la « PC Keyboard FAQ » (http://ilkerf.tripod.com/

}

c64tower/F_Keyboard_FAQ.html), un fichier texte de

1995 regroupant également une masse impressionnante de

La valeur hexadécimale affichée

données (deux demi-leçons de plus, toujours privilégier les

va nous permettre de vérifier la

données au plus proche de l’époque concernée et plus c’est

mention dans l’image présentée

moche, mieux c’est !).

sur kbdbabel.org montrant que

la touche « K » correspond à la

Fort de ces informations, il ne nous reste plus qu’à valider

valeur 0x25. Et effectivement :

tout cela avec une nouvel e évolution de notre croquis en

adaptant notre routine d’interruption :

Go go go!

2113 : 25 : 37 : 100101

// routine d’interruption

2189 : A5 : 165 : 10100101

void clksig() {

2585 : 25 : 37 : 100101

// on saut le bit de start

2646 : A5 : 165 : 10100101

if(cpt > 0)

3102 : 25 : 37 : 100101

// stockage

3163 : A5 : 165 : 10100101

b_data|=digitalRead(DATA) << cpt-1 ;

3604 : 25 : 37 : 100101

cpt++;

3650 : A5 : 165 : 10100101

// on ignore le bit de stop

if(cpt > 9) {

Victoire !

cpt=0;

rdy=1;

Notez dans le résultat obtenu

}

que le bit de poids le plus fort (à

}

gauche) indique s’il s’agit d’une

pression sur la touche (0) ou d’un

Cette fois, nous gérons le bon nombre de bits et ajoutons

relâchement de cel e-ci (1). Les 7

une condition pour sauter le premier bit. Nous ne stockons

autres bits sont identiques. 0xA5

donc dans b_data que les 8 bits de données pour former

est 0x25 avec le bit 7 à 1.

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

HACKABLE MAGAZINE n°17

55

EN COUVERTURE

CLAVIER IBM XT

4. DIRECTION USB !

projets, el e possède un certain

nombre de limitations. Nous

Nous avons maintenant un résultat probant et

l’avons vu dans un autre article

utilisable. Chaque touche enfoncée ou relâchée

de ce numéro, certaines touches

peut être identifiée par son code et associée à

manquent à l’appel par exemple.

un caractère. Mais nous n’avons en réalité pas

Ici, plutôt que de nous amuser

besoin de faire une tel e chose, car même si la

à jouer avec des rapports USB

bibliothèque Keyboard disponible pour les cartes

HID comme précédemment,

Arduino Micro et Leonardo permet d’envoyer direc-

nous al ons reposer sur une

tement du texte comme si celui-ci avait été saisi au autre bibliothèque : HID-Project clavier nous pouvons trouver un raccourci.

de NicoHood (cf. l’article sur

En effet, chaque touche d’un clavier est asso-

HoodLoader2).

ciée à un symbole par l’ordinateur et uniquement

l’ordinateur. Du point de vue du clavier lui-même,

Cel e-ci est disponible via le

la sérigraphie des touches importe peu, ce qui

gestionnaire de bibliothèques

compte c’est le code de la touche et plus exac-

de l’environnement Arduino et

tement le scancode. À la charge de l’ordinateur

s’installera donc d’un simple clic.

de faire le rapprochement avec le symbole

Le principal avantage de cette

adéquat. Ceci permet l’utilisation de plusieurs

bibliothèque, dans le cas qui nous

organisations de clavier sans pour autant revoir

occupe ici, est la définition d’une

l’électronique d’un périphérique. Seule la phase

énumération (ou liste énumérée)

finale d’assemblage en usine change et c’est

dans ImprovedKeylayouts.h.

L’arrière du châssis

l’impression des caractères sur les touches qui

Cel e-ci contient les noms de

clavier possède

détermine la « nationalité » du clavier.

toutes les touches imaginables et

une étiquette

leur valeur associée sous la forme

avec le paraphe

Le travail à faire n’en sera pas moins pénible

de KeyboardKeycode (qui ne

des personnes

pour obtenir un clavier USB. Il faut, en effet, uti-

sont pas les scancodes de notre

ayant procédé aux

liser le précédent croquis et associer le numéro

tests. Je ne peux

clavier).

obtenu pour chaque touche avec le nom de la

m’empêcher de me

demander si ces

touche tel que spécifié dans la bibliothèque que

La tâche pénible consiste donc

gens se doutaient

nous al ons utiliser.

à faire ceci 83 fois :

un seul instant

que 32 ans plus

À ce propos d’ail eurs, même si la bibliothèque

• appuyer sur une touche pour

tard le fruit de leur

Keyboard est fort sympathique pour des petits

obtenir son code,

travail serait encore

utilisable et utilisé...

• chercher dans

ImprovedKeylayouts.h

le nom correspondant dans

l’énumération,

• placer ce nom dans un

tableau que nous intègrerons

à notre croquis, dans l’ordre

croissant des codes.

Après quelques looooooon-

gues et éprouvantes dizaines de

minutes et de nombreuses fautes

de frappe et d’inattention, nous

finissons pas obtenir ceci :

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Transformez un vieux matériel de 30 ans en clavier USB

const byte xtmap[] = {

KEY_RESERVED, KEY_ESC, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5,

KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL,

KEY_BACKSPACE, KEY_TAB, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T,

KEY_Y, KEY_I, KEY_U, KEY_O, KEY_P, KEY_LEFT_BRACE,

KEY_RIGHT_BRACE, KEY_RETURN, KEY_LEFT_CTRL, KEY_A, KEY_S,

KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, KEY_QUOTE,KEY_TILDE, KEY_LEFT_SHIFT, KEY_BACKSLASH, KEY_Z,

KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA,

KEY_PERIOD, KEY_SLASH, KEY_RIGHT_SHIFT, KEY_PRINTSCREEN,

KEY_LEFT_ALT, KEY_SPACE, KEY_CAPS_LOCK, KEY_F1, KEY_F2,

KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9,

KEY_F10, KEY_NUM_LOCK, KEY_SCROLL_LOCK, KEYPAD_7, KEYPAD_8,

KEYPAD_9, KEYPAD_SUBTRACT, KEYPAD_4, KEYPAD_5, KEYPAD_6,

KEYPAD_ADD, KEYPAD_1, KEYPAD_2, KEYPAD_3, KEYPAD_0, KEYPAD_DOT

};

Vous trouvez ça difficile à lire ? Je vous rassure, ce n’est rien à côté du fait de l’écrire !

La version téléchargeable du croquis complet dans le dépôt GitHub de ce numéro inclut une version plus lisible, parce que je suis quelqu’un de vraiment très gentil. .

Cette variable xtmap peut être déclarée directement dans le croquis, mais j’ai préféré le faire dans un fichier xtmap.h qui prendra place dans un nouvel onglet de l’environnement Arduino. L’autre onglet, quant à lui, contiendra notre croquis :

#include <HID-Project.h>

#include "xtmap.h"

#define CLOCK 2

#define DATA 8

// données cumulées

volatile byte touche;

// compteur d’horloge

volatile int cpt;

// drapeau prêt/ready

volatile int rdy;

// routine d’interruption

void clksig() {

// on saute le bit de start

if(cpt > 0)

// stockage

touche |= digitalRead(DATA) << cpt-1 ;

cpt++;

// on ignore le bit de stop

if(cpt > 9) {

cpt=0;

rdy=1;

}

}

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

HACKABLE MAGAZINE n°17

57

EN COUVERTURE

CLAVIER IBM XT

void setup() {

Serial.begin(115200);

// bloquant si aucune connexion série

//while(!Serial){;}

delay(2000);

Serial.println("Go go go!");

Keyboard.begin();

pinMode(CLOCK, INPUT_PULLUP);

pinMode(DATA, INPUT_PULLUP);

delay(2000);

// installation de la routine

attachInterrupt(digitalPinToInterrupt(CLOCK), clksig, RISING);

}

void loop() {

// données prêtes et touche valide ?

if(rdy && touche > 0 && touche < 83) {

// scancode

Serial.print("0x");

Serial.print(touche,HEX);

Serial.print(": touche [");

// KeyboardKeycode

Serial.print(xtmap[touche & 127]);

Serial.print("]");

if(touche & 128) {

// si bit 7 alors relâchement

Serial.println(" relacher");

Keyboard.release(KeyboardKeycode(xtmap[touche & 127]));

} else {

// sinon pression

Serial.println(" presser");

Keyboard.press(KeyboardKeycode(xtmap[touche & 127]));

}

rdy=0;

touche=0;

}

}

La grande majorité du code est identique au croquis d’analyse précédent. La seule différence réside dans l’utilisation des fonctions propres à la bibliothèque de Nicohood et en particulier :

• Keyboard.press() qui permet de simuler l’appui sur une touche en précisant le keycode correspondant,

• Keyboard.release() qui fait de même, mais pour le relâchement d’une touche,

• et KeyboardKeycode() qui permet d’obtenir un keycode à partir d’un code brut, car vous n’êtes pas censé utiliser les valeurs numériques directement (et donc un des énumérateurs non plus).

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Transformez un vieux matériel de 30 ans en clavier USB

Oh comme

c’est gentil !

Les personnes

qui ont conçu

ce périphérique

nous ont laissé

suffisamment

de place pour

ajouter une

carte Arduino

à l’intérieur

(et même une

Raspberry Pi

Zero si besoin).

La logique du croquis est donc

périphérique et la carte peut se faire sous forme d’un lien série

très simple, dès qu’une valeur de

synchrone (avec un signal d’horloge), tout ceci est directement

touche est lue, cel e-ci sert d’index transposable (claviers AT, Amiga, Amstrad PC1512, IBM 3104, pour obtenir le keycode corres-Mac Classic, Wyse, NeXT, Sun, etc.).

pondant qui est utilisé pour simu-

ler la pression ou le relâchement

d’une touche. L’ensemble des

5. POUR FINIR

messages affichés sur le moniteur

série ne sont là qu’à des fins de

Parfois le voyage est plus important que la destination et

mise au point du croquis.

je pense que c’est clairement le cas ici. Faire fonctionner un

clavier d’une trentaine d’années avec une Raspberry Pi, un PC

Notez à ce propos qu’une perte

actuel ou un Mac est amusant, certes, mais j’ai surtout beau-

de temps notable provenait d’une

coup appris, et je l’espère vous aussi. Très souvent certains

mauvaise compréhension de ma

projets se limitent à la réutilisation de bibliothèques et à un

part de l’utilisation de if(Serial)

assemblage de pièces où le résultat rapidement obtenu est ce

(ici while(Serial)). Ceci ne per-

qui apporte satisfaction.

met pas d’attendre que la liaison

série soit utilisable, la condition

Bien entendu, lorsque cela est trop facile, ce n’est pas vrai-

est VRAIE lorsqu’une liaison est

ment amusant, même si un peu de plaisir est au rendez-vous.

effectivement établie. Ce type de

Parfois cependant l’aboutissement en lui-même devient l’élé-

choses n’est possible qu’avec les

ment primordial. Passé un certain stade, le résultat n’est plus

Arduino utilisant un microcontrô-

de faire fonctionner le montage, mais de faire fonctionner son

leur ATmega32u4 et, si aucun outil

cerveau malgré les erreurs, l’absence de documentation, les

n’accède à la carte via la liaison

suppositions trompeuses, etc.

série, cette instruction peut être

Ce n’est qu’après avoir creusé jusqu’aux fondations des

bloquante et passablement éner-

choses, d’en avoir dépilé chaque pièce et tiré la quintessence,

vante (comme par exemple quand

pour ensuite tout assembler dans le bon ordre, que viennent

vous mettez au point et que tout

le réconfort et le sentiment d’accomplissement. Pour ce projet,

marche, mais que le montage

ce n’est pas tant le fait de voir s’afficher le texte saisi au clavier refuse de « parler » dès qu’il est

qui est important, mais plutôt la signification et la justification

branché à un ordinateur de test).

des efforts qui se cachent derrière chaque pression sur une

Tout ce qui vient d’être décrit ici

touche. Mieux encore, ceci révèle l’importance de faire des

peut être reproduit avec n’importe

erreurs et de ne jamais jeter l’éponge.

quel clavier de n’importe quel

Je vous le dis sans détour et en toute sympathie, ce que je

type (ou presque). Du moment

vous souhaite c’est de faire vous aussi des erreurs, car c’est

que la communication entre le

tout simplement le meilleur moyen d’apprendre. . DB

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

HACKABLE MAGAZINE n°17

59

EMBARQUÉ & INFORMATIQUE

CLAVIER BLUETOOTH

CONFIGUREZ UN

CLAVIER BLUETOOTH

POUR VOTRE PI

Denis Bodor

Qu’il s’agisse de la Raspberry Pi 3 ou d’un modèle précédent équipé d’un adaptateur USB Bluetooth, l’un des usages les plus courants

pour ce type de connectivité se résume souvent à l’utilisation de périphériques d’entrée comme un clavier ou une souris. Ceci est très facile à configurer via l’interface graphique, mais qu’en est-il lorsqu’on utilise Raspbian Lite et qu’on préfère la ligne de commandes ?

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Configurez un clavier Bluetooth pour votre Pi

Lorsqu’on joue avec Mais voilà, lorsqu’on décide d’utiliser Raspbian Jessie plusieurs Pi pour diffé-

Lite et non la version avec interface graphique, plus

rents projets qui tantôt

lourde, ce n’est pas pour devoir instal er tout ce petit

nécessitent une inter-

monde sous prétexte de devoir configurer un clavier

vention, une reconfigu-

(chose qui peut effectivement être fait en instal ant le

ration ou une mise à jour, il n’est

paquet raspberrypi-ui-mods et donc toutes ses

pas toujours agréable de s’amuser

dépendances). Mieux vaut se creuser un peu les

à brancher/débrancher un clavier,

méninges, se documenter et faire cela en ligne de

en particulier lorsque l’instal ation

commandes.

est bien propre et dans un coffret

Comme souvent, on retrouve sur le Web, quelques

par exemple. La solution consiste

guides, bil ets de blog et howto qui détail ent ce

donc à utiliser une liaison sans fil

genre de configuration et, comme souvent, il ne

et, si l’on souhaite ne pas devoir

s’agit que de copier/col er d’autres guides, bil ets

jongler avec les dongles, cette

de blog et howto qui n’expliquent rien et assument

solution est tout naturel ement le

que certaines manipulations font effectivement

Bluetooth.

partie de la procédure, alors que ce n’est pas le

Ceci est pris en charge très

cas. Ainsi, pour le sujet qui nous intéresse ici, on

facilement via l’interface gra-

retrouve généralement la modification de deux

phique PIXEL (qui se résume à

fichiers système, /etc/default/bluetooth et

une adaptation/personnalisation

/etc/default/bluetooth, alors que ceux-ci n’ont

de LXDE) puisqu’il est directement

rien à voir avec la configuration d’un périphérique

possible de configurer un clavier

comme un clavier ou une souris. Pire encore, cette

et une souris depuis une petite

modification n’est souvent pas nécessaire et en partie

icône située en haut de l’écran.

totalement obsolète. .

Un clavier Bluetooth de bonne facture sera le

compagnon idéal d’une Raspberry Pi 3, puisque celle-

ci intègre de base la connectivité adaptée ainsi que

le Wifi. Pour les précédents modèles, il vous faudra

acquérir un ou des adaptateurs USB Bluetooth.

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

HACKABLE MAGAZINE n°17

61

EMBARQUÉ & INFORMATIQUE

CLAVIER BLUETOOTH

Les claviers

Bluetooth disposent

généralement

d’un petit bouton à

1. CONNEXION ET APPAIRAGE

l’arrière permettant

Le matériel de démonstration utilisé ici est un sympathique clavier Bluetooth AZERTY

de rendre le

de marque Perixx et plus exactement un Periboard-804 KT-1063. Je ne peux guère vous périphérique

en dire plus puisque je possède ce périphérique depuis bien longtemps et ne sais plus où, découvrable

pour procéder

quand et comment j’en ai fait l’acquisition. Mais ceci n’est pas important, car tous les péri-

à l’appairage. Il

phériques de saisie (clavier, souris, etc.) Bluetooth fonctionnant de la même façon, ce qui faudra ensuite taper

va suivre pourra s’appliquer à n’importe quel produit récent ou ancien.

un code au clavier

pour confirmer

Avec l’implémentation actuel e du support Bluetooth sous GNU/Linux nommée BlueZ

l’association.

(version 5.23 dans Raspbian), tout est directement configurable via une simple commande : bluetoothctl. On lancera donc cel e-ci accompagnée de l’option -a de façon à ce qu’el e intègre directement un agent qui nous permettra de gérer l’authentification lors de l’appairage (on peut également lancer la commande sans l’option puis utiliser agent on).

Une fois la commande lancée, on commencera par un petit scan destiné à rechercher des appareils Bluetooth pouvant être découverts. Côté clavier, un petit bouton à l’arrière du matériel permet de rendre le périphérique temporairement visible :

[bluetooth]# scan on

Discovery started

[CHG] Controller B8:27:EB:10:1F:A8 Discovering: yes

[NEW] Device 90:7F:61:80:8A:9E Bluetooth Keyboard

Le clavier a été détecté par la Pi et nous pouvons nous renseigner sur ce dernier avec info suivi de son adresse :

[bluetooth]# info 90:7F:61:80:8A:9E

Device 90:7F:61:80:8A:9E

Name: Bluetooth Keyboard

Alias: Bluetooth Keyboard

Class: 0x002540

Icon: input-keyboard

Paired: no

Trusted: no

Blocked: no

Connected: no

LegacyPairing: yes

Le périphérique n’est ni appairé, ni connecté, ni de confiance. Nous commençons donc par l’appairage avec :

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Configurez un clavier Bluetooth pour votre Pi

[bluetooth]# pair 90:7F:61:80:8A:9E

Attempting to pair with 90:7F:61:80:8A:9E

[CHG] Device 90:7F:61:80:8A:9E Connected: yes

[agent] PIN code: 358206

L’association se fera après authentification. L’idée est ici de prouver qu’on a physiquement ac-cès aux deux matériels. Le code qui nous est alors présenté à l’écran par l’agent doit être utilisé sur le clavier. Cette procédure peut être différente d’un matériel à l’autre. Ici, il suffit de taper les six chiffres sur le clavier (qui est alors en QWERTY et ne demande donc pas d’utiliser la touche Maj pour entrer les chiffres) et de finir par la touche Entrée.

Ceci fait, bluetoothctl nous confirme le succès de l’opération :

[CHG] Device 90:7F:61:80:8A:9E Paired: yes

Pairing successful

Pour que la liaison puisse s’établir automatiquement la prochaine fois que les périphériques (Pi et clavier) seront réunis, nous devons faire confiance au clavier. Nous utilisons donc la commande trust suivie de l’adresse du périphérique pour entériner la liaison :

[bluetooth]# trust 90:7F:61:80:8A:9E

[CHG] Device 90:7F:61:80:8A:9E Trusted: yes

Changing 90:7F:61:80:8A:9E trust succeeded

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

HACKABLE MAGAZINE n°17

63

EMBARQUÉ & INFORMATIQUE

CLAVIER BLUETOOTH

Configurez un clavier Bluetooth pour votre Pi

Enfin, on jette un dernier coup d’œil à la configuration :

[bluetooth]# info 90:7F:61:80:8A:9E

Device 90:7F:61:80:8A:9E

Name: Bluetooth Keyboard

Alias: Bluetooth Keyboard

Class: 0x002540

Icon: input-keyboard

Paired: yes

Trusted: yes

Blocked: no

Connected: no

LegacyPairing: yes

Les lignes Paired et Trusted sont à yes, le périphérique est donc bien appairé et la liaison est de confiance. Dès cet instant, le clavier doit être utilisable exactement En termes de qualité de

comme un modèle connecté en USB. Il vous sera peut-être nécessaire cependant de fabrication et de solidité,

configurer son agencement de clavier en lançant sudo raspi-config et en faisant un ce qu’on trouve sur le

tour dans Internationalisation Options et Change Keyboard Layout pour choisir un clavier Web est assez variable.

français AZERTY.

Ici au premier plan un

clavier très peu cher

Notez la ligne Connected dans la sortie. Ceci pourra vous permettre de vous (~15€), peu solide, avec

une frappe très moyenne

assurer que le clavier Bluetooth est bel et bien connecté, en cas de problème d’utilisa-et une alimentation

tion. N’oubliez pas, non plus, que les périphériques Bluetooth passent généralement via une paire de piles

rapidement en veil e et qu’une frappe sur un clavier qui est endormi mettra parfois AAA. En arrière-plan,

quelques secondes pour le réveil er et rétablir la connexion.

un modèle de meilleure

qualité, rechargeable via

une connexion micro-

USB.

2. CONFIGURATION

DU CLAVIER

En dehors de l’agencement des

touches, il n’y a strictement rien à

configurer pour faire fonctionner

votre clavier. D’où sortent donc ces

informations concernant la modifi-

cation de certains fichiers ?

Le premier, /etc/default/

bluetooth, permet de régler

un problème rencontré avec

certains adaptateurs Bluetooth.

Le matériel moderne s’utilise

généralement avec un protocole

appelé HCI pour Host Control er

Interface. Celui-ci décrit la

façon dont l’hôte (votre Pi) et le

contrôleur (l’adaptateur Bluetooth)

communiquent. Cependant,

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Configurez un clavier Bluetooth pour votre Pi

DISPONIBLE DÈS

LE 24 MARS !

LINUX PRATIQUE HORS-SÉRIE n°38

certains modèles, lorsque vous les connectez à la

machine, apparaissent comme des périphériques

HID (Human Interface Device), une classe de

périphériques USB correspondant généralement

aux périphériques de saisie.

Pour contrôler l’adaptateur, nous devons lui

parler HCI et non HID, ces adaptateurs doivent

donc changer de mode de communication pour

être utilisés. C’est là qu’intervient un outil appelé

hid2hci (placé dans /lib/udev). L’idée est, lors

de la détection de l’adaptateur USB, de demander

au système d’automatiquement lancer hid2hci

pour le faire changer de mode (via udev). Ceci se

configure en changeant une ligne dans le fichier

/etc/default/bluetooth :

HID2HCI_ENABLED=1

Dans le cas d’une Raspberry Pi 3 et son adap-

tateur Bluetooth intégré, le changement de mode

n’est pas nécessaire puisqu’il communique, de

base, en HCI. Je pense que la confusion concer-

nant l’utilisation de ce fichier vient du fait qu’il est

question de HID, terme qui rappel e les périphé-

riques USB HID et donc les claviers/souris USB.

Pourtant ceci n’a rien à voir avec le périphérique

et la prise en charge de claviers Bluetooth, cela ne

concerne que l’adaptateur et sa connexion.

L’autre fichier généralement cité est /etc/

bluetooth/hcid.conf. Là, c’est encore pire, car ce

fichier n’est tout simplement pas utilisé. Il s’agissait,

Sous réserve de toutes modifications.

avec BlueZ 3.x, du fichier de configuration de hcid,

le démon de gestion HCI. Celui-ci, avec l’arrivée de

la version 4.0 de BlueZ (en août 2008 !), a laissé

DÉBUTEZ SOUS

place à bluetoothd, encore utilisé aujourd’hui.

hcid.conf n’a aucune utilité puisque hcid n’est plus

là depuis plus de 8 ans. .

LINUX AVEC LA

Moralité, mieux vaut regarder les dates des

pages (bil er, wiki, etc.) avant de suivre une

RASPBERRY PI

procédure et s’assurer que ce qui est décrit

correspond bien à la documentation officielle.

Car, bien entendu, en ajoutant un hcid.conf

et en modifiant son /etc/default/bluetooth,

cela fonctionne, mais en ajoutant un pouet.conf

NE LE MANQUEZ PAS

dans /etc/bluetooth, cela fonctionnera tout

aussi bien... DB

CHEZ VOTRE MARCHAND

DE JOURNAUX ET SUR :

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

HACKABLE MAGAZINE n°17

65

http://www.ed-diamond.com

pub_fev2017_half.indd 1

15/02/2017 10:02

EMBARQUÉ & INFORMATIQUE

LED

CHANGEZ LA

CONFIGURATION

DES LEDS DE VOTRE

RASPBERRY PI

Denis Bodor

... ou de n’importe quel autre ordinateur monocarte du même type.

Les leds équipant généralement les cartes comme la Raspberry Pi, la BeagleBone Black, l’OrangePi, ou encore la NanoPi sont généralement configurées par défaut pour indiquer un certain type d’activité. Ceci peut cependant être changé relativement facilement pour adapter le comportement de ces leds à vos besoins.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Changez la configuration des leds de votre Raspberry Pi

A

La toute première

Raspberry Pi

vant que le système

disposait de 5 leds

dont nous al ons

dont trois contrôlées

par l’interface réseau,

parler soit ajouté

une directement

dans Linux (et je

branchée à

parle ici du noyau),

l’alimentation et une,

disposer d’une led témoin d’une

ACT, pilotable comme

détaillée dans cet

activité quelconque n’était pas

article.

une mince affaire. Il fal ait soit

écrire un module noyau, soit un

programme utilisateur se char-

geant de changer l’état de la, ou

des leds. Ce n’était pas une mince

affaire et cela demandait pas mal

de connaissances et d’expérience.

disposition par le système. Avant toutes choses, précisons

Puis fut introduit, avec la version

ici que ce qui va suivre s’applique, dans le cas de nos

3.4 du noyau, le support pour la

chères Pi, aux modèles 2, B, B+ et A+ en ce qui concerne

classe de périphériques LED per-

les deux leds intégrées à la carte : la rouge libel ée PWR

mettant une prise en charge de ce

pour power et la verte notée ACT comme activity. La

genre de fonctionnalités directe-

Raspberry Pi Zero n’a pas de led rouge « PWR » et la

ment par le noyau, mais de façon

Raspberry Pi 3 en dispose, mais el e est physiquement

configurable par l’utilisateur.

connectée à l’alimentation (donc non contrôlable par le

Bon nombre de plateformes

système). La Raspberry Pi première du nom (cel e avec un

utilisent à présent ce mécanisme

connecteur RCA jaune) dispose de 5 leds, mais seule cel e

pour toutes sortes de choses, les

marquée ACT est, là aussi, contrôlable de la façon que je

Raspberry Pi bien sûr pour les

vais m’empresser de détailler.

leds verte et rouge placées sur la

Pour accéder à l’état de cette ou ces leds, rendez-vous

carte el e-même (verte unique-

simplement dans le répertoire /sys/class/leds. Là vous

ment pour la Pi 3), bien d’autres

y trouverez un sous-répertoire pour chaque led pilotable

nano-ordinateurs monocartes

de cette façon : led0 pour la verte et led1 pour la rouge et même les ordinateurs de type

(si utilisable). Si vous avez connecté une clé USB Wifi,

PC, portables ou non. De plus,

par exemple, il est également possible que d’autres réper-

certains matériels exposent éga-

toires apparaissent à cet endroit : rt73usb-phy0::assoc,

lement ce type de périphériques,

rt73usb-phy0::quality, et rt73usb-phy0::radio, par

comme par exemple les clés USB

exemple, dans le cas de ma Linksys WUSB54GC (toutes

Wifi, permettant à l’utilisateur de

les leds ne sont pas forcément visibles, mais le pilote fourni

configurer librement l’utilisation et

néanmoins un accès dans /sys/).

la signification de ces leds.

Tous ces répertoires contiennent la même structure et

les mêmes fichiers :

1. JOUONS AVEC

LES LEDS

$ ls -F

brightness

device@

L’objet même de la classe de

max_brightness

périphérique LED est de vous

power/

permettre de manipuler leur état

subsystem@

depuis la ligne de commandes,

trigger

uevent

à l’aide de simples outils mis à

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

HACKABLE MAGAZINE n°17

67

EMBARQUÉ & INFORMATIQUE

LED

Notez qu’il ne s’agit pas de réels fichiers et répertoires présents sur la carte SD ou microSD, mais d’une façon pour le système de vous donner un accès à ces informations. Il en va de même pour /sys que pour /proc, /dev ou encore le contenu de /tmp ou /run.

Le fichier important, déterminant la façon dont se comporte la led concernée par le répertoire choisi, est trigger. Celui-ci permet de connaître et de modifier ce qui déclenche (trigger en anglais) un changement d’état de la led. Nous pouvons consulter le contenu du fichier avec :

$ cat /sys/class/leds/led0/trigger

none kbd-scrollock kbd-numlock kbd-capslock

kbd-kanalock kbd-shiftlock kbd-altgrlock

kbd-ctrllock kbd-altlock kbd-shiftllock

kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock

[mmc0] mmc1 timer oneshot heartbeat backlight

gpio cpu0 cpu1 cpu2 cpu3 default-on input

rfkill0 rfkill1

Ce qui se présente alors à l’écran est l’ensemble des déclencheurs utilisables avec, entre crochets, celui qui est actuel ement configuré : mmc0, une activité sur première carte mémoire ou, en d’autres termes, la microSD de cette Raspberry Pi 3. Le contenu du fichier est dépendant des pilotes actuel ement chargés par le noyau et de la carte utilisée, Voici les deux leds

mais un certain nombre de déclencheurs sont généralement présents par défaut : intégrées à une

Pi modèle B+ et

• mmc0 : activité sur le support de stockage (SD, microSD, eMMC, etc.). Très pratique pilotables, l’une

comme l’autre

pour s’assurer que la Pi « travail e » ;

directement depuis

• heartbeat : produit un battement cardiaque dont le rythme est proportionnel à la le système via

la manipulation

charge système. Plus la Pi fait de choses, plus le rythme est important ; de simples

fichiers dans /sys.

• timer : permet une configuration personnalisée en choisissant la durée active et Remarquez les

inactive de la led en mil isecondes ;

transistors Q1 et

Q6 placés juste

• gpio : permet de changer automatiquement l’état de la led en fonction de celui d’une dessus permettant

broche de la Pi (GPIO), comme témoin d’activité en somme ;

le pilotage à l’aide

de simples GPIO.

• cpu* : configure la led de façon à mon-

trer l’activité d’un processeur (ou d’un

cœur). Ceci permet avec suffisamment

de leds disponibles d’avoir un témoin

d’activité par CPU/cœur. Le nombre

de déclencheurs (ici 4) est fonction du

nombre de cœurs disponibles ;

• none : aucun déclencheur ;

• default-on : toujours active.

Les déclencheurs dont le nom débute par

kbd font référence à l’état des éventuel es

leds d’un clavier. Il est ainsi possible de confi-

gurer la led concernée par le répertoire où se

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Changez la configuration des leds de votre Raspberry Pi trouve trigger pour suivre l’état de ces dernières.

2. CONFIGURER LE

Enfin, tout comme les leds physiques de certains

périphériques sont exposés via /sys/class/leds,

COMPORTEMENT PAR

on retrouve tantôt dans triggers les déclen-

cheurs supplémentaires correspondants, proposés

DÉFAUT SUR UNE PI

par le pilote du périphérique. Dans le cas de ma

Par défaut, les Raspberry Pi sont configu-

clé wifi Linksys, par exemple, les déclencheurs

rées avec une led verte libel ée ACT (led0)

phy0rx, phy0tx, phy0assoc, et phy0radio sont notifiant d’une activité sur le support de stoc-ainsi également disponibles (émission, réception,

kage (mmc0). On retrouve un peu partout sur

association et radio wifi active).

le Web différentes méthodes permettant de

Pour changer le déclencheur, rien de plus

changer cet état de fait : commandes à placer

simple, il suffit de placer dans le fichier celui

dans rc.local, passage de paramètres au

qu’on souhaite utiliser. Il faut pour cela disposer

noyau ou encore bidouil age ignoble dans des

des permissions adéquates, le fichier appartenant

fichiers systèmes. .

au super-utilisateur root :

Depuis quelques versions de Raspbian

$ cd /sys/class/leds/led0

pourtant, accompagnée d’un noyau supportant

$ sudo -s

le device tree (voir article sur la configuration

# echo timer > trigger

de deux minis écrans SPI dans Hackable n°9),

il n’est pas nécessaire de faire ces choses,

Nous venons ici de configurer le déclencheur

aussi honteuses que dégoûtantes. Dans ce

timer et ce faisant, deux nouveaux fichiers

genre de situation, il est important de ne pas

sont apparus dans le répertoire, delay_off et

se poser la question « comment je peux avoir

delay_on. Ceux-ci permettent de choisir le délai

ce que je veux ? », mais plutôt « comment ceci

des deux états de la led :

est actuel ement configuré ? ».

# cat delay_on

On peut supposer, en effet, que les déve-

500

# cat delay_off

loppeurs ont poursuivi exactement le même

500

objectif que vous en configurant le comporte-

ment par défaut et que, de ce fait, ils ont sans

Ici, la led sera al umée 500ms, éteinte 500ms,

doute appliqué la solution la plus optimale pos-

et ainsi de suite. Nous pouvons, avec echo et une

sible. En d’autres termes, la première approche

redirection, changer ces valeurs à loisir :

à envisager doit être teintée d’humilité. .

# echo 50 > delay_on

Or justement, cette fameuse led verte

# echo 1000 > delay_off

n’est pas du tout configurée par un script de

démarrage ou un programme quelconque,

Nous aurons alors une brève pulsation lumi-

el e fait partie des périphériques non détec-

neuse de 50 mil isecondes toutes les secondes.

tables définis dans ce qu’on appel e le device

Bien entendu, en fonction du déclencheur confi-

tree. Contrairement aux périphériques USB

guré et placé dans trigger ceci changera et

par exemple, dont la connexion déclenche la

d’autres fichiers feront (ou pas) leur apparition

mise en œuvre d’un processus de détection

dans le répertoire. Notez également qu’en cas

et de sélection de pilotes, certains matériels

de changement de déclencheur, la configuration

et composants d’un ordinateur qu’il s’agisse

précédente ne sera pas conservée. Si vous bas-

d’une Pi ou d’un PC, ne peuvent être détectés

culez de timer à mmc0 puis revenez à timer, les

automatiquement.

valeurs dans delay_off et delay_on revien-

dront à 500ms par défaut. Bien entendu, il en ira

Jusqu’à l’arrivée du device tree, cette

de même en cas de redémarrage du système. .

configuration spécifique était embarquée

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

HACKABLE MAGAZINE n°17

69

EMBARQUÉ & INFORMATIQUE

LED

Raspberry Pi, ceci prend la forme

d’un fichier placé sur la carte SD/

microSD, sur la partition FAT,

accessible via le répertoire /boot

une fois le système démarré :

$ ls /boot/*.dtb

/boot/bcm2708-rpi-b.dtb

/boot/bcm2708-rpi-b-plus.dtb

/boot/bcm2708-rpi-cm.dtb

/boot/bcm2709-rpi-2-b.dtb

/boot/bcm2710-rpi-3-b.dtb

/boot/bcm2710-rpi-cm3.dtb

Il y a un fichier par modèle de

Pi. Les modèles B et A ne se dif-

férenciant que par l’absence de

quelques éléments, connectés

en USB et donc détectables, il

n’y a de distinctions qu’entre les

modèles B, B+, 2B, 3B, compute

module et compute module 3.

Pour être utilisable, le fichier

du device tree, qui se présente

initialement sous la forme de texte

structuré, doit être transformé

(compilé) en un fichier binaire

utilisable par le noyau. On utilise

pour cela un outil nommé dtc

(paquet device-tree-compiler).

Comme il peut être relativement

pénible de devoir faire cette trans-

formation en cas de changement

de configuration comme cel e

Ajouter des leds

qui nous intéresse ici, un autre

configurées de la

même façon que celles

directement dans le plus important des

mécanisme a été mis en place.

intégrées à la carte se

programmes : le noyau. Puis quelques dé-

Il est possible de compléter la

résume à une connexion

veloppeurs ont eu l’idée de rationaliser cela

configuration initiale à l’aide de

classique de ce genre

de composants sur les

et de faciliter la vie de tous leurs confrères

« modules » additionnels : les

broches d’une Pi. La

(et des utilisateurs par la même occasion)

overlays.

partie délicate concerne

en créant un format unique permettant de

surtout la configuration

Ceux-ci, placés dans /boot/

décrire précisément la composition d’une

logicielle, mais rien n’est

overlays, permettent d’ajouter

insurmontable dans ce

machine : le device tree.

des configurations de périphé-

domaine...

Celui-ci est, dans un format binaire,

riques non détectables sans

chargé directement au tout début du démar-

avoir à éditer et recompiler un

rage et le noyau l’utilise pour savoir préci-

nouveau fichier binaire du device

sément à quel matériel il a affaire. Sur une

tree. Si vous voulez ajouter

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Changez la configuration des leds de votre Raspberry Pi une horloge temps réel type DS3231 à votre

À l’époque, les fichiers overlays étaient nommés

configuration, par exemple, vous n’avez qu’à

NOM-overlay.dtb et étaient spécifiés avec NOM

utiliser i2c-rtc.dtbo.

dans config.txt. À présent, les fichiers ont sim-

Pour ce faire, il vous suffit d’ajouter deux

plement une extension .dtbo et leur nom, sans

petites lignes dans

l’extension, est utilisé dans la configuration.

/boot/config.txt :

Notez également que la led rouge, sur les Pi

# activer le bus I2C

où el e est configurable, n’est pas branchée de

dtparam=i2c_arm=on

la même façon que sa consœur verte. Cette led

# prendre en charge la RTC

est active avec un signal à l’état bas. De ce fait,

dtoverlay=i2c-rtc,ds3231

si vous souhaitez rendre votre Pi plus discrète en

désactivant les deux leds, vous devrez ajouter

Il en va exactement de même pour la

ceci dans config.txt :

configuration du comportement de la ou des

leds soudées à votre Pi. Là, cependant, il

n’est pas nécessaire d’utiliser le mécanisme

# Eteindre la led verte

dtparam=act_led_trigger=none

d’overlays, car il ne s’agit pas d’un ajout

de matériel, mais de la configuration d’un

# Eteindre la led rouge

matériel existant. L’option dtparam permet

dtparam=pwr_led_trigger=none

ainsi d’activer et paramétrer des éléments déjà

dtparam=pwr_led_activelow=off

pris en charge. Ainsi, pour automatiquement

configurer le déclencheur associé à la led ACT,

Cette dernière ligne précise que la logique est

nous pouvons simplement ajouter au fichier

inversée et qu’avec aucun déclencheur configuré

config.txt :

(none), la led est effectivement éteinte. Cette ligne

devra également être précisée si vous voulez que

dtparam=act_led_trigger=heartbeat

votre déclencheur fournisse visuel ement l’effet

attendu et non son opposé.

Dans le device tree, cette led est nommée

act_led et un paramètre act_led_trigger

détermine le déclencheur à utiliser par

3. CONFIGURER LE

défaut. Remplacez simplement heartbeat

COMPORTEMENT SUR

par l’un des déclencheurs dont nous avons

pris connaissance précédemment et le tour

D’AUTRES CARTES

est joué. Pour les Raspberry Pi supportant

Les versions récentes du système Raspbian

également la configuration de la led rouge

reposent sur le mécanisme de device tree, mais il

(led1 dans /sysfs), nous pouvons procéder

n’en a pas toujours été ainsi. D’autre part, toutes

de même en utilisant pwr_led_trigger en lieu

les plateformes ne l’utilisent pas forcément. Le

et place de act_led_trigger.

système Debian instal able sur les NanoPi, par

Redémarrez ensuite votre Pi et vous pour-

exemple, n’en fait pas (encore) usage. Comment

rez constater que dès les premières étapes du

alors modifier le comportement par défaut des

démarrage, votre déclencheur sera utilisé. Pas

leds pourtant effectivement accessibles via

besoin de scripts, pas besoin de bidouil e. . le

/sys/class/leds ?

seul fichier modifié est celui qui est précisé-

Là encore, inutile de chercher à bidouil er dans

ment là pour ajuster la configuration matériel e

les coins et se montrer humble est l’attitude à

à vos besoins. C’est propre et sans bavure.

adopter. Mieux vaut se dire « les développeurs ont

Note : remarquez que les choses ont un peu

sûrement pensé à quelque chose » plutôt que « ils

évolué depuis mon article dans Hackable n°9.

ont oublié de prévoir quelque chose ». Ici, il ne

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

HACKABLE MAGAZINE n°17

71

EMBARQUÉ & INFORMATIQUE

LED

s’agit pas des développeurs du noyau ou de ceux travail ant sur le système de la Raspberry Pi, mais des développeurs Debian.

Il est, en effet, possible, même sur une Pi si vous ne voulez pas toucher à config.txt, d’instal er un simple paquet pour pouvoir à loisir déterminer une configuration par défaut appliquée au démarrage dans n’importe quel fichier de /sys : sysfsutils.

Après instal ation de ce paquet avec un petit sudo apt-get install sysfsutils, il vous suffira alors de créer un nouveau fichier de configuration. Comme on souhaite changer le contenu du fichier /sys/class/leds/led0/trigger, par exemple, nous créons simplement un fichier

/etc/sysfs.d/led0.conf (le nom importe peu du moment qu’il finisse par .conf), contenant : class/leds/led0/trigger = heartbeat

On précise simplement le fichier à modifier et la valeur à y placer. Notez que /sys n’est pas précisé puisque sysfsutils ne concerne que le contenu de /sys. Il suffit ensuite de redémarrer le service instal é par sysfsutils pour appliquer les changements : $ sudo service sysfsutils restart

En cas de problème, les outils de systemd vous permettront de savoir d’où vient une éventuel e erreur (comme cel e consistant à utiliser bêtement des guil emets autour du nom du déclencheur) :

$ sudo systemctl status sysfsutils.service

$ sudo journalctl -xn -n 30

4. DEUX LEDS NE VOUS SUFFISENT PAS ? IL SUFFIT

D’EN AJOUTER

Disons-le de suite, là les choses vont devenir un peu plus délicates et complexes. Mais à vaincre sans péril, on triomphe sans gloire, paraît-il.

Sur ma Pi 3, je dispose d’un processeur possédant 4 cœurs et, en toute logique, je dispose donc des déclencheurs cpu0 à cpu3. L’idée même de littéralement voir les cœurs s’exciter au rythme des commandes et programmes exécutés me semble tout bonnement merveil euse ! Seulement voilà, sur une Raspberry Pi 3, la seule led que je peux utiliser ainsi est la led verte ACT, et le pilotage de la led rouge ne changerait pas grand-chose à l’affaire. Il nous faut plus de leds (oui, il faut toujours plus de leds)

C’est frustrant ! Inacceptable ! Être ainsi privé d’une tel e stimulation visuel e est à la limite du supportable. Il faut agir !

Je l’ai précisé précédemment, le support de ce périphérique est pris en charge par le mécanisme de device tree. De ce fait, quelque part dans le fichier textuel ou dans l’un des fichiers overlays est forcément défini qu’une broche est connectée à cette led verte et qu’el e doit être utilisée de cette façon précise par le noyau.

Pour accéder aux structures du device tree sous une forme lisible, il est nécessaire de s’en référer aux sources du noyau (ou d’utiliser dtc pour décompiler un binaire, mais on perd les Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 72

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Changez la configuration des leds de votre Raspberry Pi

Piloter des

leds avec une

Raspberry Pi

n’est pas très

compliqué, mais il

faut bien prendre

en considération

que les GPIO ne

peuvent pas en

supporter plus d’un

certain nombre

faute de courant

suffisant. L’une des

solutions possibles

consiste à utiliser

un ULN2803A,

un circuit intégré

comprenant

huit transistors

Darlington, chacun

capable d’accepter

jusqu’à 500mA.

commentaires). Pas de panique, nous n’avons pas à y faire de modification ni même à produire un nouveau paquet à cet effet (si vraiment vous y tenez, jetez un coup d’œil dans Hackable n°10), tout ce que nous voulons c’est savoir comment ceci est mis en place.

Et effectivement dans le fichier linux/arch/arm/boot/dts/bcm2710-rpi-3-b.dts, la version texte du fichier bcm2710-rpi-3-b.dtb présent dans votre /boot, nous pouvons lire ceci :

&leds {

act_led: act {

label = "led0";

linux,default-trigger = "mmc0";

gpios = <&virtgpio 0 0>;

};

};

[...]

act_led_gpio = <&act_led>,"gpios:4"; act_led_activelow = <&act_led>,"gpios:8"; act_led_trigger = <&act_led>,"linux,default-trigger"; Nous avons donc la confirmation de ce que nous supposions, l’association GPIO/led est bien dans le device tree et non dans le noyau lui-même. Ceci implique également qu’il nous est donc possible d’écrire de toutes pièces un overlay, le compiler et l’ajouter dans /boot/overlays pour pouvoir avoir bien plus de leds accessibles via /sysfs.

Je vous ferai grâce ici de la démarche complète de recherche et vous fournirai simplement le contenu du fichier à créer, que nous appel erons mesleds.dts : Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) http:/ www.ed-diamond.com

HACKABLE MAGAZINE n°17

73

EMBARQUÉ & INFORMATIQUE

LED

/dts-v1/;

/plugin/;

/ {

compatible = "brcm,bcm2708", "brcm,bcm2709", "brcm,bcm2710"; fragment@0 {

target = <&leds>;

__overlay__ {

ma_led0: maled0 {

label = "maled0";

gpios = <&gpio 26 0>;

linux,default-trigger = "cpu0";

};

ma_led1: maled1 {

label = "maled1";

gpios = <&gpio 19 0>;

linux,default-trigger = "cpu1";

};

ma_led2: maled2 {

label = "maled2";

gpios = <&gpio 13 0>;

linux,default-trigger = "cpu2";

};

ma_led3: maled3 {

label = "maled3";

gpios = <&gpio 6 0>;

linux,default-trigger = "cpu3";

};

};

};

};

Nous définissons ici 4 nouveaux périphériques, maled0 à maled3 respectivement connectés aux GPIO 26, 19, 13, et 6 de la Pi (broches 37, 35, 33 et 31). Nous définissons également le déclencheur par défaut pour chaque led de façon à les voir s’activer dès que le cœur correspondant du processeur est actif.

Il ne nous reste alors plus qu’à créer un fichier binaire à partir de cette description textuel e avec :

$ sudo dtc -@ -I dts -O dtb \

-o /boot/overlays/myled.dtbo myled.dts

Nous lançons dtc en précisant directement le nom du fichier de sortie, myled.dtbo, à l’emplacement où il pourra être utilisé (/boot/overlays). Enfin, nous ajoutons une ligne dans notre config.txt afin de prendre en charge cet overlay :

dtoverlay=myled

Au prochain redémarrage, cette modification sera utilisée et il nous suffit d’éteindre la Pi proprement pour y connecter nos leds. En fonction du nombre de leds utilisées et de leurs caracté-

ristiques, il ne vous sera pas possible de les piloter directement, car la Pi ne sera pas capable de fournir le courant nécessaire. Mieux vaudra passer par un petit montage reposant sur un Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) 74

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Changez la configuration des leds de votre Raspberry Pi

ULN2803A par exemple, des MOSFET ou encore des transistors. Ma solution repose sur un ULN2803A puisque ce composant est parfaitement adapté à un tel usage.

Une fois les leds connectées, il vous suffira de démarrer votre Pi pour admirer le magnifique clignotement rythmé par l’activité du processeur. Un petit coup d’œil dans

/sys nous confirmera qu’effectivement, nous venons d’ajouter ces périphériques que nous pourrons manipuler exactement comme la led ACT depuis la ligne de commandes :

$ ls /sys/class/leds/

led0 maled0 maled1 maled2 maled3

Pour piloter 8 leds

comme celle-ci

$ ls /sys/class/leds/maled0/

depuis les broches

brightness device max_brightness

d’une Raspberry Pi, il

serait déraisonnable

power subsystem trigger uevent

d’envisager une

connexion directe.

$ cat /sys/class/leds/maled0/trigger

Mieux vaut utiliser

none kbd-scrollock kbd-numlock kbd-capslock

un circuit intégré

kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock

spécialisé comme

kbd-altlock kbd-shiftllock kbd-shiftrlock

l’ULN2803A capable

kbd-ctrlllock kbd-ctrlrlock mmc0 mmc1 timer oneshot

de prendre en charge

heartbeat backlight gpio [cpu0] cpu1 cpu2 cpu3

le courant nécessaire,

default-on input rfkill0 rfkill1

si d’aventure toutes

les leds étaient

allumées en même

Là, vous pouvez vous amuser à lancer des commandes

temps.

et voir physiquement chaque cœur s’exténuer docilement

pour accomplir vos souhaits. . Un pur bonheur !

5. POUR FINIR

La morale de cet article est relativement simple : faites

confiance aux développeurs et ne partez jamais du prin-

cipe que quelque chose a été mal pensé ou oublié. Bien

sûr, il est possible qu’une tel e chose puisse arriver, là

n’est pas la question. Si ce n’était pas le cas, il n’y aurait

pas de correction de bogues et encore moins d’évolution

des versions. Les erreurs existent, mais il est générale-

ment plus intel igent de tout d’abord remettre ses propres

compétences en cause, reposer sur cel es des déve-

loppeurs pour ensuite, et seulement ensuite, envisager

une erreur ou un oubli.

Je finirai en précisant que le dernier point de l’article

est perfectible. Notre overlay n’est pas configurable

comme d’autres, mais ceci peut être ajouté pour plus de

souplesse. Je vous recommande donc de fouil er dans

les fichiers .dts présents dans les sources du noyau dis-

ponibles sur https://github.com/raspberrypi/linux, et

de vous inspirer de ce qui s’y trouve pour tenter d’accom-

plir cela par vous-même. . DB

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

HACKABLE MAGAZINE n°17

75

DÉMONTAGE, HACKS & RÉCUP

USB UNO

UTILISEZ VOTRE

ARDUINO UNO COMME

PÉRIPHÉRIQUE USB

Denis Bodor

Les cartes Arduino Leonardo et Micro utilisent un microcontrôleur bien différent des modèles UNO ou Mega, un ATmega32U4. De ce

fait non seulement ces cartes n’ont plus besoin d’une puce faisant la liaison série/USB, mais elles peuvent également apparaître comme des périphériques USB sur-mesure. Les Arduino UNO semblent donc un

peu en reste de ce point de vue, mais c’était sans compter un certain NicoHood et son HoodLoader2 ! Les Uno aussi peuvent devenir des

périphériques USB. Suivez le guide !

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez votre Arduino UNO comme périphérique USB

Précisons de suite c’est presque la moitié des

que je vais parler ici

ressources offertes par

des modèles récents

l’ATmega238P qui forme la

d’Arduino UNO et

base d’une carte UNO !

plus exactement des

Autre précision que je

R3 (alias REV3). Les premières

tiens également à appor-

UNO utilisant une puce FTDI en

ter, le fait de se servir de

guise de pont de communication

ce composant n’a rien

entre le microcontrôleur AVR

de nouveau. Sans doute

ATmega328P et le port USB ne

avez-vous déjà remarqué le

sont pas compatibles avec ce qui

connecteur à 6 broches se

va suivre, pas plus que les clones

trouvant à proximité du port

utilisant généralement des puces

USB et du bouton reset, en

USB/série CH340/CH341.

tous points identique à celui

La raison pour laquel e seules

marqué « ICSP » à l’autre

les cartes UNO (et Mega2560)

bout de la carte. C’est le

officiel es et récentes peuvent

connecteur permettant de

être utilisées est simple : il y a

programmer l’ATmega16U2

deux microcontrôleurs sur ces

à l’aide d’un programmeur

cartes, un ATmega238P (ou un

AVR-ISP, exactement

ATmega2560) et un ATmega16U2.

comme il est possible de

Le microcontrôleur

Nous nous concentrerons ici sur la le faire pour l’ATmega238P via son connecteur Atmel AVR

carte UNO, mais ce qui va suivre

dédié.

ATmega16U2 sert

initialement de relais

est également applicable (mais

La nouveauté apportée par NicoHood et son

entre la connexion USB

non testé par mes soins) sur une

HoodLoader2 réside dans le fait de ne plus avoir

et le microcontrôleur

Mega2560.

animant la carte

besoin d’utiliser un matériel spécialisé comme

Arduino UNO. Il peut

Le microcontrôleur ATmega16U2

un programmeur AVR-ISP (ou une carte Arduino

cependant être utilisé

est une déclinaison plus modeste

utilisée comme tel e), mais de pouvoir program-

pour vos croquis. Ici

de bas en haut, son

de l’ATmega32U4 utilisé sur les

mer simplement les deux microcontrôleurs depuis

oscillateur à quartz,

cartes Leonardo et Micro. Celui-ci,

l’environnement Arduino, en choisissant simple-

le microcontrôleur

sur une UNO, est programmé avec

ment dans un menu à quel microcontrôleur on

lui-même, à sa droite

un croquis opérant exactement

souhaite s’adresser.

les leds qu’il contrôle,

4 ports utilisables à

comme une puce FTDI ou CH340 :

Enfin, pour en finir avec cette introduction, il est

souder et le connecteur

faire apparaître la carte comme un

important de vous préciser que le fait de tritouil er

ICSP pour le

port USB/série et transmettre tout

l’ATmega16U2 et son bootloader (voir ci-après)

programmer.

ce qu’il reçoit à l’ATmega238P et,

n’est pas une opération sans risque. En cas de

inversement, envoyer en USB tout

maladresse, de déconnexion intempestive lors de

ce que veut bien raconter l’ATme-

l’instal ation ou de problème, votre carte Arduino

ga238P. Ce qui est cependant très

UNO pourrait se retrouver totalement muette.

intéressant dans cette histoire c’est

Rien de matériel ement catastrophique et d’irrépa-

qu’un ATmega16U2 n’est pas un

rable, mais si cela devait vous arriver, il vous sera

petit composant insignifiant : 16 Ko

alors nécessaire d’utiliser une autre carte Arduino

de mémoire flash pour les pro-

comme programmeur AVR-ISP (ou un vrai pro-

grammes, 512 octets de mémoire

grammeur AVR-ISP) pour réinstal er tous les élé-

vive, 512 octets d’EEPROM inté-

ments dans la mémoire de l’ATmega16U2 et peut-

grée, fonctionnement à 16 Mhz. .

être de l’ATmega238P. Vous voici prévenu.

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

HACKABLE MAGAZINE n°17

77

DÉMONTAGE, HACKS & RÉCUP

USB UNO

1. BOOTLOADER

par un composant tout neuf, il

ne vous sera pas possible de le

ET PRINCIPE DE

programmer de cette façon. Par

FONCTIONNEMENT

défaut, les AVR neufs sont vierges

et ne sont pas configurés pour

Posons dans un premier temps correctement

exécuter un bootloader. Il faut tout

le décor. Un microcontrôleur comme l’AVR

d’abord programmer et paramétrer

d’Atmel qui est au cœur d’une carte Arduino, se

tout cela en utilisant le connecteur

programme normalement d’une certaine façon

ICSP et utiliser l’entrée Graver la

à l’aide d’un programmeur dédié. C’est la raison

séquence d’initialisation (bootloader

d’être du connecteur ISCP de 6 broches en bor-

en bon français tout joli) du menu

dure de la carte. Pour simplifier les choses et

Outils de l’IDE.

rendre la programmation du composant indépen-

L’ATmega16U2 qui sert de

dante d’un matériel spécifique, un autre mode de

relais USB/série n’utilise par

programmation peut être utilisé : un bootloader.

défaut pas de bootloader, mais ce

Les AVR disposent d’une fonctionnalité per-

microcontrôleur peut être confi-

mettant de démarrer, dès la mise sous tension,

guré dans ce sens (en fait si, il y a

un tout petit programme avant de passer la main

un bootloader DFU, mais ce n’est

L’ATmega32U4 au

cœur des Arduino

à un autre, chargé de faire le gros du travail :

pas important ici). De ce fait, avec

Leonardo (obsolète) et

ce code c’est le bootloader. Celui-ci dispose de

un bootloader adapté il devient

Micro/(Pro) équivaut

fonctionnalités qu’un programme standard n’a

possible de non seulement utiliser

à un l’ATmega328P

pas et en particulier la capacité d’écrire dans la

l’ATmega16U2 comme relais entre

d’un Arduino UNO en

termes de ressources.

mémoire flash. L’idée est, après une réinitialisa-

l’USB et l’ATmega238P, mais éga-

Il intègre en plus

tion par exemple, que le bootloader attende un

lement de l’utiliser pour y placer

des fonctionnalités

certain temps une éventuel e communication, si

ses propres croquis. La logique

permettant de créer

cel e-ci n’intervient pas, il passe le relai. Mais si

serait la suivante :

des périphériques

USB comme des

cette communication est initiée dans les temps,

• Si l’ATmega16U2 démarre sur

émulations de clavier,

le bootloader va alors servir de relais pour la

le bootloader « maison », il

souris, instruments

programmation de la mémoire et charger le

de musique MIDI,

sert de relais pour la program-

séquenceur MIDI, etc.,

programme reçu avant de redémarrer. C’est

mation standard de la carte

à l’aide de simples

précisément ce qui arrive

Arduino (et donc de l’ATme-

croquis.

lorsque vous cliquez sur

ga238P), fonction remplie par

le bouton Téléverser dans

le croquis standard dans la

l’environnement Arduino, le

configuration d’origine.

bootloader Optiboot s’active

et vous permet d’enregistrer

• S’il démarre normalement

votre croquis sur la carte

et que le bootloader passe

via USB.

la main au croquis dans

l’ATmega16U2, les ceux cro-

Sans le bootloader dans

quis fonctionnent de façon

l’ATmega238P, il n’est pas

indépendante, mais disposent

possible de charger un cro-

d’une liaison série entre eux.

quis dans la mémoire via le

Dans ce cas de figure, le cro-

câble USB. Ceci explique

quis dans l’ATmega238P n’a

par exemple pourquoi si vous

plus accès au moniteur série

retirez l’ATmega238P de

de l’environnement Arduino,

votre carte et le remplacez

mais communique avec

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez votre Arduino UNO comme périphérique USB

l’ATmega16U2. Sauf, bien

2. INSTALLATION DE

entendu, si le croquis dans

l’ATmega16U2 sert de relais,

HOODLOADER2

mais là, il n’y a plus vraiment

Je me baserai ici sur la dernière version à jour de l’envi-

d’intérêt à changer le compor-

ronnement Arduino (1.8.1 à cette date), mais ces manipula-

tement d’origine qui est exac-

tions devraient également fonctionner avec n’importe quel e

tement le même.

version égale ou supérieure à 1.6.6 (testé par mes soins avec

Ce comportement est préci-

la 1.6.13).

sément celui de HoodLoader2, si

Pour pouvoir profiter des avantages de HoodLoader2,

ce n’est que NicoHood ne s’est

deux manipulations importantes doivent être opérées : pré-

pas limité à cela. En effet, il a non

parer l’environnement Arduino pour supporter ces modifi-

seulement développé le bootloa-

cations et reprogrammer le contenu de l’ATmega16U2 de la

der en question, mais également

carte UNO.

tout le nécessaire pour simplifier

au maximum l’instal ation et l’utili-

L’instal ation des éléments logiciels se fera entièrement

sation au sein de l’environnement

(ou presque) dans l’environnement lui-même. Commencez

Arduino. Une fois HoodLoader2

par afficher les préférences de l’environnement via le menu

instal é dans l’ATmega16U2 de

Fichier. Là, vous remarquerez une ligne URL de gestionnaire

votre carte Arduino, il vous suffit

de cartes supplémentaires. Un clic sur le bouton à droite du de spécifier le bon type de carte

champ de saisie vous ouvrira une fenêtre permettant de saisir

dans le menu Outils pour program-

une URL par ligne. Ces lignes indiquent où l’environnement

mer soit l’ATmega16U2, soit

Arduino, et plus précisément le gestionnaire de cartes, doit

l’ATmega238P, sans autre mani-

chercher les informations pour instal er le support d’autres

pulation nécessaire. C’est là jus-

plateformes (ESP8266, ATtiny, etc.). Pour pouvoir instal er le

tement toute la beauté de la réali-

support HoodLoader2, utilisez l’URL suivante : https://raw.

sation de NicoHood par rapport à

githubusercontent.com/NicoHood/HoodLoader2/master/

d’autres solutions similaires.

package_NicoHood_HoodLoader2_index.json.

La fenêtre des

préférences de

l’environnement

Arduino est

l’endroit où

vous pouvez

spécifier des

URL permettant

l’installation du

support pour

d’autres cartes

que les Arduino

officielles et

compatibles.

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

HACKABLE MAGAZINE n°17

79

DÉMONTAGE, HACKS & RÉCUP

USB UNO

La liste des

plateformes

proposées par le

gestionnaire de

cartes est fonction

des modèles

supportés par

défaut, mais

également des

URL que vous

avez spécifiées

dans les

préférences.

Aucun redémarrage de l’environnement ne sera néces-

à un endroit que l’environnement

saire et vous pourrez alors lancer le gestionnaire de

Arduino ne « voit » pas par défaut

cartes via le menu Outils et Type de carte, puis parcourir comme contenant des exemples.

la liste à la recherche de Hoodloader2 by NicoHood puis Notez que ce problème est

cliquer sur Installer pour ajouter le support de cette plate-corrigé dans la version de déve-

forme. La version actuel e est la 2.0.5, mais il est possible

loppement actuel ement dispo-

qu’assez rapidement cel e-ci soit remplacée par une

nible sur GitHub, grâce à une

nouvelle qui verra le problème dont je vais parler dans un

contribution d’un utilisateur en

instant corrigé. Si, lorsque vous lirez cet article, la version

septembre dernier, mais que le

est supérieure à 2.0.5, ce qui va suivre ne s’appliquera

correctif en question n’est pas

sans doute pas.

intégré dans la version 2.0.5,

En principe à ce stade, tout est prêt pour passer à

mise à disposition quelques jours

la phase « matériel e ». La prochaine étape consiste à

seulement avant la contribution

instal er le bootloader dans l’ATmega16U2. Plusieurs

de cet utilisateur. Lorsque la 2.0.6

solutions sont à votre disposition pour ce faire, mais une

sera disponible, il ne sera donc

seule d’entre el es n’implique que la carte Arduino UNO

plus nécessaire de corriger cela

el e-même. L’idée est la suivante : programmer un croquis

à la main.

dans l’ATmega328P de façon à provoquer une reprogram-

Pour procéder à la correction,

mation de l’ATmega16U2 en reliant certaines broches des

vous devrez vous rendre dans le

connecteurs ICSP. De cette façon, l’ATmega328P va faire

répertoire de gestion des données

un reset de l’ATmega16U2, reprogrammer sa mémoire et

de l’environnement Arduino. Celui-

configurer ses « fusibles » pour activer la fonctionnalité

ci, sous Windows, se trouve dans

bootloader.

le répertoire AppData (caché par

C’est la méthode que nous al ons utiliser ici et NicoHood

défaut) de votre répertoire utilisa-

met à disposition un croquis pour ce faire, celui-ci est

teur, sous-répertoire Local puis

même compris dans les fichiers qui ont été instal és avec le

Arduino15 (ce qui correspond à

support de la plateforme via le gestionnaire de cartes. Petit

~/.arduino15/ sous GNU/Linux,

problème cependant, ce croquis, ainsi que d’autres for-

et à ~/Library/Arduino15 sous

mant des exemples d’utilisation de Hoodloader2 se trouve

MacOS).

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez votre Arduino UNO comme périphérique USB

Dans ce répertoire, vous trouve-

HEXFILE_HoodLoader2_0_5_Uno_atmega16u2_hex.

rez les sous-répertoires packages,

Cette déclaration de la macro HEXFILE spécifie le

HoodLoader2, hardware, avr

« fichier » du bootloader à programmer. Les lignes

puis 2.0.5. Là, se trouve un sous-

qui suivent dans le croquis sont également des

répertoire examples contenant les

déclarations de macros, il y en a une pour chaque type

croquis qui nous intéressent et qui

de carte et de microcontrôleur supporté (Hoodloader2

ne sont, pour l’instant, pas visibles

ne se limitant pas à l’Arduino UNO). Dans le cas qui

dans l’environnement Arduino.

nous intéresse ici, HEXFILE_HoodLoader2_0_5_Uno_

Vous devrez alors :

atmega16u2_hex est la macro à utiliser et c’est cel e

• créer un répertoire libraries

présente par défaut (du moins avec la version 2.0.5).

et un sous-répertoire

L’autre macro qui pourrait vous être utile est

Pour que le croquis

HoodLoader2,

HEXFILE_Arduino_COMBINED_dfu_usbserial_

d’installation puisse

faire son travail,

• déplacer examples et son

atmega16u2_Uno_Rev3_hex_Full (ligne 34). En

il faut relier les

contenu dans

modifiant la déclaration de

HoodLoader2,

HEXFILE pour la faire

deux connecteurs

correspondre à cette macro, vous pouvez réinstal er

• créer un fichier

ICSP de cette

le croquis initial dans l’ATmega16U2 et revenir à un

façon et ajouter

HoodLoader2.h à ce même

fonctionnement « normal » de la carte UNO.

un condensateur

endroit, contenant une

de 100nF entre la

simple ligne de commen-

Une fois HEXFILE à la bonne valeur ou que vous

masse et la broche

RESET de la carte

taire (//HoodLoader2 par

vous soyez simplement assuré que la valeur par défaut

Arduino (notez que

exemple).

est la bonne, il ne vous reste plus qu’à programmer

certains clones

votre Arduino UNO avec ce croquis. Celui-ci démarrera

Arduino utilisant

Le fichier HoodLoader2.h est

automatiquement, mais ce n’est pas grave, puisque les

un ATmega16U2

important pour éviter un message

deux connecteurs ICSP ne sont pas encore reliés.

ont tantôt le

d’erreur de l’environnement Ardui-

connecteur ICSP

no précisant que la bibliothèque

tourné à 180°).

n’est pas valide. Une fois ces

manipulations effectuées et l’IDE

Arduino redémarré, en basculant

sur n’importe quel e carte Hoo-

dloader2 via Outils et Type de carte,

les exemples seront visibles dans

Fichier, Exemples.

À présent, procédez comme

suit :

• sélectionnez n’importe quel e

carte Hoodloader2,

• ouvrez le croquis Installa-

tion_Sketch via le menu Fichier,

Exemples, Hoodloader2,

• sélectionnez à nouveau le

type de carte « Arduino/

Genuino Uno ».

En tout début de ce croquis

d’instal ation se trouve une ligne

(11) précisant #define HEXFILE

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

HACKABLE MAGAZINE n°17

81

DÉMONTAGE, HACKS & RÉCUP

USB UNO

Vient alors l’étape la plus

MCU » pour l’ATmega16U2 et

importante, la programmation

« I/O MCU » pour l’ATmega328P,

de l’ATmega16U2. Débranchez

ou en d’autres termes, respec-

votre carte Arduino du port USB

tivement, le microcontrôleur

et procédez au câblage des

chargé de l’USB et celui chargé

deux connecteurs ICSP : MISO

des entrées/sorties.

sur MOSI, MOSI sur MISO,

SCK sur SCK et le RESET de

l’ATmega16U2 sur la broche

3. UTILISEZ

10 de la carte Arduino. Placez

HOODLOADER2

également un condensateur

de 100nF entre la masse et

ET L’ARDUINO

la broche RESET de la carte

(celui-ci est destiné à empêcher

UNO MODIFIÉ

un reset de l’ATmega328P par

À ce stade, vous disposez sur

l’ATmega16U2). Vérifiez les

la carte de deux microcontrôleurs

connexions plusieurs fois puis

facilement programmables. Pour

branchez l’Arduino UNO en

sélectionner l’un ou l’autre, il vous

Le connecteur ICSP

USB et attendez.

suffit de choisir la bonne « carte »

présent sur toutes les

cartes Arduino à base

Le croquis programmé dans l’ATmega328P

dans le menu Outils :

d’Atmel AVR permet

va alors s’exécuter et reprogrammer l’ATme-

une méthode alternative

• « Hoodloader2 Uno » pour

de programmation

ga16U2. Cette opération ne prendra pas plus

programmer l’I/O MCU (l’AT-

du microcontrôleur.

d’une trentaine de secondes maximum. Dans

mega328P). En choisissant

C’est aussi par ce

un premier temps, la led « L » de la carte cli-

cette carte, l’environnement

biais que vous pouvez

gnotera lentement (une fois par seconde), puis

programmer un AVR

Arduino va procéder à un

totalement vierge pour

la programmation aura lieu et la led se mettra

reset de l’ATmega16U2 qui va

le rendre compatible

à clignoter rapidement (dix fois par seconde)

démarrer sur son bootloader

avec l’environnement

pour indiquer que l’opération a réussi. SOYEZ

chargé de faire la liaison avec

de développement

Arduino (installation

PATIENT ! Si la led ne clignote pas rapide-

l’ATmega328P qui sera, à son

du bootloader et

ment au bout de plus de 30 secondes, c’est

tour, redémarré et qui lui aussi

configuration des

que la programmation a échoué. Vérifiez les

démarrera sur son bootloader

fusibles).

connexions et la présence du condensateur

pour pouvoir procéder au

(au minimum 100nF), puis éventuel ement,

chargement de votre croquis.

accédez au moniteur série de l’environnement

Notez qu’il ne vous est plus

Arduino pour voir les messages du croquis

possible d’utiliser la carte

(115200 bps) et vous assurer qu’il se lance

« Arduino/Genuino Uno »

correctement.

puisque l’ATmega16U2 ne fait

Une fois Hoodloader instal é et la led « L »

office de relais que lorsqu’il

clignotant rapidement, débranchez la carte

démarre sur son bootloader.

du port USB puis retirez les câbles reliant les

• « Hoodloader2 16u2 » pour

deux connecteurs ICSP ainsi que le conden-

programmer l’USB MCU

sateur. Votre Arduino UNO est maintenant

(l’ATmega16U2). Là, l’envi-

prêt à être utilisé d’une nouvel e façon et avec

ronnement Arduino s’adresse

les deux microcontrôleurs que nous désigne-

directement au microcontrô-

rons maintenant de la même manière que

leur USB sans s’occuper de

la documentation de Hoodloader2 : « USB

l’ATmega328P.

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez votre Arduino UNO comme périphérique USB

Pour asseoir tout cela, voyons un petit exemple simple. Dans un premier temps, choisis-sez « Hoodloader2 16u2 » puis chargez le croquis suivant :

void setup() {

pinMode(LED_BUILTIN_RX, OUTPUT);

pinMode(LED_BUILTIN_TX, OUTPUT);

}

void loop() {

digitalWrite(LED_BUILTIN_RX, LOW);

digitalWrite(LED_BUILTIN_TX, LOW);

delay(100);

digitalWrite(LED_BUILTIN_RX, HIGH);

digitalWrite(LED_BUILTIN_TX, HIGH);

delay(1000);

}

L’USB MCU n’a pas accès à la led « L » mais, par contre, c’est lui qui contrôle les leds

« RX » et « TX » de la carte et ses broches sont directement référencées par les macros LED_BUILTIN_RX et LED_BUILTIN_TX. Nous n’avons donc ici rien de plus que le croquis Blink, adapté à l’ATmega16U2. Notez que les niveaux logiques sont inversés, un LOW al ume les leds et un HIGH les éteint, car les deux sont connectés aux broches correspondantes et à la tension d’alimentation (et non à la masse).

Une fois le croquis compilé et enregistré dans la mémoire, basculez sur la carte « Hoodloader2 Uno » et utilisez le croquis exemple Blink standard. Compilez-le et chargez-le dans la mémoire.

Le résultat sera, en toute logique, un clignotement bref et simultané des deux leds « RX »

et « TX », et un clignotement d’une seconde sur « L ». Les deux premières leds sont contrô-

lées par l’USB MCU et la dernière par l’I/O MCU. Nous avons donc deux croquis différents fonctionnant indépendamment sur les deux microcontrôleurs d’une même carte.

Il est important de comprendre que lorsque l’USB MCU exécute son croquis, il ne fait plus son travail de relais entre le port USB et l’ATmega328P que vous aviez l’habitude d’utiliser sur votre Arduino UNO. Ce n’est que lorsqu’il démarre sur son bootloader qu’il remplit cette tâche. Vous pouvez revenir à un fonctionnement standard sans inverser toute la procédure en utilisant le croquis suivant pour l’USB MCU (également disponible sous forme d’exemple sous le nom « RunBootloader ») :

#include <avr/wdt.h>

void setup() {

cli();

*(uint16_t*)MAGIC_KEY_POS = 0x7777;

wdt_enable(WDTO_120MS);

}

void loop() {}

Ces quelques lignes provoquent une réinitialisation de l’ATmega16U2 directement sur son bootloader. Lorsque vous brancherez la carte en USB, les deux microcontrôleurs vont se Ce document est la propriété exclusive de Alex Arnaud(balinuxdroid@gmail.com) http:/ www.ed-diamond.com

HACKABLE MAGAZINE n°17

83

DÉMONTAGE, HACKS & RÉCUP

USB UNO

réinitialiser normalement, puis ce croquis sera exé-

4. UN EXEMPLE

cuté sur l’USB MCU qui se réinitialisera une seconde

fois et restera sur le code du bootloader. Ce faisant,

CONCRET :

la carte pourra à nouveau être utilisée avec l’entrée

L’ARDUINO UNO

« Arduino/Genuino Uno ».

Note : Attention, en jonglant entre des types

COMME CLAVIER

de cartes, à ce qui semble être un bug mineur de

USB

l’environnement Arduino. Lorsque vous ouvrez un

exemple associé à un type de carte et y faites des

Vous l’avez compris, avec

modifications, une tentative de sauvegarde affiche

Hoodloader2 vous pouvez utiliser

un message vous précisant qu’il faut l’enregistrer

l’ATmega16U2 à la manière d’un

dans votre carnet de croquis. C’est le comportement

ATmega32U3 d’une carte Arduino

normal. Cependant, si vous ouvrez un exemple pour

Micro et donc obtenir les mêmes

une carte, changez de plateforme puis tentez de sau-

fonctionnalités, dont l’émulation

vegarder, l’opération réussira, écrasant par la même

de clavier et de souris USB

occasion l’exemple original. Faites donc attention

(classe HID). Il y a cependant un

en jouant avec les exemples et les changements de

petit souci ou plus exactement

cartes et éventuel ement, prenez l’habitude de tou-

un point auquel il faut faire

jours enregistrer un exemple modifié avec Ctrl+Maj+S très attention : l’ATmega16U2

et non Ctrl+S.

dispose de ressources limitées.

Non seulement une très grande

Un autre point important en rapport avec ce nou-

partie de ses broches ne sont

veau mode de fonctionnement concerne le port série

pas utilisables (juste 2 leds sur

de l’I/O MCU. Celui-ci est relié, sur le circuit, à l’USB

17 et 18, et 4 broches à souder

MCU qui fait normalement la liaison avec l’USB.

sur 4, 5, 6 et 7 (PWM)), mais

Or, à présent, cette liaison n’est plus faite si l’USB

la mémoire vive disponible est

MCU exécute lui aussi un croquis. Ceci signifie qu’un

vraiment réduite (512 octets). De

Serial.print(), par exemple, dans un croquis exé-

plus, la mémoire flash pour les

cuté par l’I/O USB ne vous sera plus retransmis dans

croquis peut sembler suffisante

le moniteur série (sauf en forçant l’USB MCU à redé-

avec ses 16 Ko, mais il ne reste

marrer sur son bootloader avec le croquis précédent

en réalité que 12288 octets pour

par exemple).

vos croquis après instal ation du

Il y a donc deux modes d’utilisation de votre carte

bootloader.

Arduino UNO à présent. Soit vous chargez ce mini-

L’ATmega16U2 n’offrira donc

croquis dans l’USB MCU et la carte se comporte

que peu de possibilités pour des

comme avant la modification, soit vous faites travail-

projets intéressants. Ce qu’il est

ler de concert les deux microcontrôleurs sachant que

possible de faire, en revanche,

le Serial de l’I/O MCU est connecté au Serial1

c’est de confier toute la partie

de l’USB MCU et que le Serial de l’USB MCI est

entrée/sortie et le « gros oeuvre »

connecté via le port USB à votre ordinateur.

à l’ATmega328P et de laisser le

Ceci peut, certes, rendre la mise au point de

soin à l’ATmega16U2 de se char-

croquis complexes un peu plus difficile mais, d’un

ger de la communication.

autre côté, vous ajoutez des fonctionnalités USB à

Pour il ustrer cette répartition

une carte qui initialement n’en possède pas. On ne

des tâches, nous al ons utiliser

peut pas tout avoir, le beurre, l’argent du beurre et la

deux croquis selon le cahier des

bibliothèque USB HID de la crémière. .

charges suivant : l’ATmega328P

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Utilisez votre Arduino UNO comme périphérique USB

va envoyer du texte sur son port série toutes les secondes et l’ATmega16U2 va utiliser celui-ci pour émuler une saisie au clavier. C’est simple, mais efficace. Commençons donc par le premier croquis destiné à ATmega16U2 :

#include <Keyboard.h>

void setup() {

// configuration des leds et extinction

pinMode(LED_BUILTIN_RX, OUTPUT);

pinMode(LED_BUILTIN_TX, OUTPUT);

digitalWrite(LED_BUILTIN_RX, HIGH);

digitalWrite(LED_BUILTIN_TX, HIGH);

// Liaison série vers l'ATmega328P à 2400 bps

Serial1.begin(2400);

// Mise en route du clavier USB HID

Keyboard.begin();

}

void loop() {

// A-t-on des données à lire ?

if (Serial1.available() > 0) {

// récupération d'un caractère

char c = Serial1.read();

// on envoie le caractère comme tapé au clavier

Keyboard.print(c);

}

}

Rien de bien complexe dans l’ensemble, nous nous contentons d’initialiser à la fois la liaison série et l’émulation clavier puis, dans la boucle principale, nous prenons chaque caractère qui arrive et l’envoyons comme une saisie clavier.

Côté ATmega328P, c’est tout aussi simpliste :

void setup() {

// led L en sortie

pinMode(LED_BUILTIN, OUTPUT);

// Liaison série vers l'ATmega16U2 à 2400 bps

Serial.begin(2400);

// Petite pause pour laisser le temps de démarrer

delay(5000);

}

void loop() {

// Ecriture de texte sur le port série

Serial.print("Coucou ");

// Clignotement de la led à chaque envoi

digitalWrite(LED_BUILTIN, HIGH);

delay(100);

digitalWrite(LED_BUILTIN, LOW);

delay(1000);

}

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

HACKABLE MAGAZINE n°17

85

DÉMONTAGE, HACKS & RÉCUP

USB UNO

voyer sauvagement du texte sans

une petite pause.

Le maître mot dans l’utilisation

d’une carte Arduino de cette façon

est « économie ». Vous devez gar-

der à l’esprit qu’il est nécessaire

d’optimiser au mieux le croquis de

l’ATmega16U2 et de le maintenir le

plus concis possible.

5. POUR FINIR...

OU COMMENCER...

Il est amusant de constater

qu’au sein même des cartes

Arduino se cachent des ressources

La carte Arduino

UNO possède

intéressantes et tantôt très utiles. Il

Après configuration de la liaison série et de la led

deux connecteurs

est certes indéniable que les mani-

ICSP, un pour

« L », nous envoyons environ toutes les secondes le

pulations décrites ici ne sont pas

l’ATmega328P

texte « coucou » en faisant clignoter la led (comme

des plus évidentes, mais le résultat

et un autre pour

indicateur en cas de problème).

l’ATmega16U2.

est bien là : il est possible d’utiliser

Pour programmer

Les difficultés sont plus subtiles qu’il n’y paraît.

une carte Arduino UNO là où nor-

le bootloader

En termes de ressources par exemple, le croquis

malement une Leonardo ou une

Hoodloader2 dans

pour l’ATmega16U2 consomme à lui seul 47% de la

Micro serait nécessaire.

l’ATmega16U2

sans avoir recours

mémoire flash (5800 octets) et la même proportion

Nous n’avons fait qu’entrevoir

à un équipement

pour la mémoire vive (245 octets). Ce qui démontre

le travail énorme et admirable de

complémentaire

qu’on est effectivement rapidement limité avec ce

comme un

NicoHood qui se doit d’être salué

microcontrôleur.

programmeur

comme il le mérite (tant pour Hoo-

AVR-ISP, il vous

De plus, la gestion des délais et de la chronologie

dLoader2/1, que pour sa biblio-

suffit de relier les

deux connecteurs

est importante. Remarquez la faible vitesse de com-

thèque HID-Project ou encore

et d’utiliser un

munication utilisée. 115200 bps semblait clairement

IRLremote). Son code est une

croquis spécial

trop élevé et une partie des caractères n’étaient

véritable source d’inspiration et de

d’installation.

pas envoyés en USB. Ce n’est pas une question de

motivation, et cela ouvre la porte à

vitesse de communication, mais le fait que le cro-

bien des possibilités. Il vous suffit

quis de l’ATmega16U2 doit créer un rapport HID et

de tester, échouer et recommencer,

l’envoyer pour chaque caractère reçu.

et vous finirez par arriver à vos fins.

Enfin, le délai de 5 secondes à la fin de la fonction

NicoHood le précise d’ailleurs

setup() du croquis pour l’ATmega328P est égale-

sur l’une des pages de documen-

ment important. Il est destiné à laisser le temps au

tation de HoodLoader2 : « J’ai tout

bootloader de l’ATmega16U2 de passer la main au

appris par moi-même. Apprendre

croquis qui doit ensuite initialiser la communication

en faisant. J’ai débuté en partant

HID. De plus, l’ordinateur sur lequel est branchée

de zéro fin janvier 2014 dans le

la carte UNO doit également énumérer les périphé-

domaine Arduino/électronique.

riques USB proposés et les prendre en charge. Tout

Donc vous pouvez aussi le faire, je

ceci prend du temps et nous ne pouvons pas en-

crois en vous :) ». Bien dit ! DB

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

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

REPÈRE & SCIENCE

CODES TOURNANTS

LES CODES TOURNANTS

OU COMMENT NE PAS

ENVOYER LE MÊME

MESSAGE DEUX FOIS

Denis Bodor

Lorsqu’on utilise une télécommande que ce soit à fréquence ou

infrarouge, un message est transmis de l’émetteur au récepteur. Cela fonctionne très bien, mais si quelqu’un capte un message, le copie et l’envoie à votre place, le voici capable de piloter votre installation. Ceci s’appelle le rejeu et pour contrer ce type d’attaque, l’astuce consiste à ne jamais envoyer deux fois le même message. C’est précisément ce que font, plus ou moins toujours selon les modèles, les télécommandes pour le verrouillage centralisé des voitures par exemple et ceci repose sur une notion particulière : les codes tournants. Chose que nous allons découvrir en pratique dans cet article...

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Les codes tournants ou comment ne pas envoyer le même message deux fois Dans le numéro

précédent, nous

avons vu qu’avec

un matériel comme

le HackRF One ou

n’importe quel autre émetteur/

récepteur SDR (ou montage fait

maison), il était possible de cap-

turer un signal radio, l’enregistrer

et le rejouer pour prendre la place

de la télécommande à fréquence

Les codes tournants

ou rolling codes

initialement utilisée. Ce genre de

à confirmer son identité en fournissant un code, sou-

sont généralement

pratique est applicable pour bon

vent numérique, provenant soit d’une application pour

très utilisés, en

nombre de dispositifs du carillon

smartphone, soit d’un petit porte-clé doté d’un affi-

compagnie de

systèmes de

sans fil à la porte de garage en

cheur. Ce type de système est, par exemple, proposé

chiffrement, sur

passant par la télécommande IR

par Blizzard pour son service de jeux en ligne Battle.

les systèmes

de votre téléviseur.

net (WoW, StarCraft, Diablo III, OverWatch, etc.).

de verrouillage

centralisé des

Le fait de chiffrer les don-

Avant de poursuivre, je tiens à préciser ici que

véhicules récents.

nées transmises ne règle pas

l’objet de l’article est de vous présenter et d’il ustrer

C’est également

le problème. Si vous chiffrez un

par la pratique ce qu’est un système de codes tour-

quelque chose

qu’on voit peu à peu

message « ouvre garage » en

nants et en AUCUN CAS de fournir une solution

apparaître dans les

« eofjdlksfuir » et que le récepteur

sécurisée. La création d’un système sécurisé robuste

télécommandes de

le déchiffre pour retrouver le mes-

repose sur une compréhension parfaite et l’utilisation

portes de garage,

même si c’est encore

sage initial, ceci n’empêchera ab-

de mécanismes et de principes cryptographiques qui

relativement rare...

solument pas le fait que quelqu’un

sortent totalement du cadre de cet article (et je dois

puisse capturer « eofjdlksfuir » et

l’avouer, de mes compétences).

l’envoyer à votre place. Le chiffre-

ment n’est donc pas la solution au

problème de rejeu.

1. LE PRINCIPE DES CODES

La solution consiste à utiliser

TOURNANTS

des codes tournants, rolling codes

Dans l’absolu, le cahier des charges permettant

ou hopping codes en anglais et

de mettre en œuvre des codes tournants est d’une

son fonctionnement n’a rien de

grande simplicité : l’émetteur et le récepteur utilisent

bien complexe une fois le méca-

une série de valeurs ou de codes identiques et, à

nisme général compris. Nous

chaque fois qu’un code est utilisé, on passe au sui-

al ons mettre en pratique cette

vant. Dans les faits, à chaque message l’émetteur

technique avec une carte Arduino

envoie le prochain code dans la liste, peu importe que

et réaliser notre propre implémen-

le récepteur le reçoive effectivement ou non, la com-

tation dans la suite de cet article.

munication est à sens unique. Un code envoyé n’est

Comme vous al ez le découvrir,

jamais réutilisé, on ne revient jamais en arrière dans

ce principe ne se limite pas aux

la série.

télécommandes de toutes sortes,

mais rejoint également la notion

Côté récepteur en revanche il faut prendre en

d’authentification à deux facteurs

compte le fait que l’émetteur a peut-être envoyé un

consistant à saisir son nom d’uti-

code de la liste alors qu’on ne l’a pas reçu. Le code

lisateur et son mot de passe, puis

effectivement réceptionné pourrait parfaitement ne

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

HACKABLE MAGAZINE n°17

89

REPÈRE & SCIENCE

CODES TOURNANTS

pas être le prochain, mais l’un de ceux qui se trouvent

liste faute de place, quel e que soit

plus loin dans la série. Cependant cette série est

la plateforme. De tel es listes ont,

connue de part et d’autre, il suffit au récepteur de com-

par définition, une fin et surtout,

parer le code reçu, non pas uniquement au prochain

peuvent être copiées. La solution

de la série, mais également aux 5, 10, ou 50 suivants.

consiste donc à créer un bout de

Si le code est effectivement trouvé, le récepteur

programme qui, à chaque appel,

considère qu’un certain nombre de codes ont été

nous donnera une nouvelle valeur

perdus et que le prochain qui devra être réceptionné

qui paraîtra aléatoire. En d’autres

se trouve après le code validé (on ne revient jamais

termes, nous pouvons remplacer

en arrière dans la série, oui, je me répète, c’est fait

une vraie série par un générateur

exprès).

de nombres pseudo-aléatoires.

Là, deux problèmes doivent vous venir en tête : il

faut une liste monstrueuse de valeurs/codes d’un côté

2. LES

comme de l’autre de la transmission, et la question de

ce qui se passe si l’émetteur a envoyé davantage de

GÉNÉRATEURS

code de la série que la tail e de la plage de recherche

DE NOMBRES

du récepteur.

PSEUDO-

Nous verrons le premier point et sa solution dans

un instant, mais penchons-nous d’abord sur cette cap-

ALÉATOIRES

tivante question. La réponse est évidente : ça ne mar-

chera pas car, comme il n’est pas possible de revenir

Comme vous le savez, les ordi-

en arrière dans la série, la synchronisation est alors

nateurs, les microcontrôleurs et

définitivement perdue. Dans la pratique avec des sys-

les processeurs fonctionnent de

tèmes comme ceux des télécommandes de verrouil-

manière déterministe et prévisible

lage de voitures, la plage ou fenêtre de cherche, côté

(plus ou moins selon le système

récepteur, est tout simplement suffisamment grande

utilisé et le nombre de mails que

pour éviter les problèmes.

vous avez ouverts provenant de

soi-disant généreux princes ou

256 codes envoyés et non reçus est une valeur

diplomates africains). Obtenir des

souvent utilisée et est généralement bien suffisante

valeurs réel ement aléatoires avec

pour éviter l’effet de quelques pressions accidentel es

ce genre d’équipement est tout

sur les boutons (dans la poche ou dans un sac) ou

bonnement impossible (à moins

même découlant de tentatives pour retrouver son véhi-

d’utiliser du matériel spécifique).

cule sur un parking. Bien entendu, si vous appuyez

Au mieux, il est possible d’uti-

pour vous amuser ou par réflexe nerveux (vous savez

liser des programmes et/ou des

comme ces gens énervants qui ne peuvent s’empê-

fonctions fournissant des suites

cher de faire clic-clic avec leur stylo), il n’est pas im-

de valeurs ayant quelques carac-

possible que vous finissiez par atteindre la limite. Mais

téristiques au fruit du hasard,

là encore, les constructeurs proposent des solutions

comme une certaine indépen-

pour resynchroniser émetteur et récepteur comme

dance des valeurs les unes par

par exemple en accédant au véhicule mécaniquement

rapport aux autres ou encore

(serrure) et en opérant une manipulation spécifique

l’absence de propriétés com-

alors que la clé est sur le contact (pression longue sur

munes à toutes les valeurs géné-

le bouton par exemple).

rées. Il ne s’agit cependant pas

L’autre problème concerne la série elle-même et il

de valeurs réel ement aléatoires

est, bien entendu, impensable d’utiliser réel ement une

qui ne peuvent en aucun cas être

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Les codes tournants ou comment ne pas envoyer le même message deux fois obtenues par des méthodes purement arithmétiques.

La suite n’a rien de très aléatoire, car

C’est pour cette raison qu’on parle de générateurs

la valeur de la graine est tout le temps la

de nombres pseudo-aléatoires ou PRNG en anglais

même. Pourtant, les valeurs ne semblent

pour PseudoRandom Number Generator.

pas avoir de rapport entre el es autres, il n’y

Ces générateurs utilisent des algorithmes et des

a pas de suite logique, et el es ne semblent

pas non plus répondre à des caractéris-

méthodes mathématiques pour créer des suites de

tiques communes (ce ne sont pas des mul-

nombres, mais ils doivent être initialisés à partir d’une

tiples d’un même nombre, etc.).

valeur précise qu’on appel e graine (seed) qui, el e,

doit être le plus aléatoire possible. Ainsi dans un

La série est donc parfaitement prédic-

croquis Arduino, nous al ons généralement utiliser

tible et reproductible si randomSeed()

quelque chose comme ceci :

est utilisé avec une valeur connue et fixe.

Mieux encore, le même croquis ainsi utilisé

void setup() {

fournira des résultats identiques sur deux

Serial.begin(115200);

cartes Arduino utilisant un microcontrôleur

while(!Serial){;}

AVR. Une Arduino Due en revanche nous

fournira une autre suite (925, 41, 600,

int graine = analogRead(0);

964, 424, 705, 455, 202, 763, 938), car

Serial.print("Graine: ");

le PRNG utilisé est différent. Les biblio-

Serial.println(graine);

thèques standards (libC) utilisées ne sont

pas les mêmes pour les Arduino AVR et les

randomSeed(graine);

Arduino ARM Cortex-M, et l’algorithme est

for(int i=0; i < 10; i++) {

différent.

Serial.println(random(1000));

}

Néanmoins, nous avons là précisément

}

ce que nous cherchons : une fonction qui

génère une série de valeurs pseudo-aléa-

void loop() {

toires qui peut être à la fois identique côté

}

émetteur comme récepteur et pouvant être

initialisée avec une valeur de notre choix (la

Le générateur de nombres pseudo-aléatoires, que

graine). Le fonctionnement même du PRNG

je vais maintenant désigner par le terme PRNG, est

derrière random() sort du cadre de cet

initialisé, via randomSeed(), avec une graine décou-

article, mais en voici une version adaptée

lant d’une valeur obtenue par une lecture de l’entrée

pouvant être intégrée dans un croquis :

analogique A0 sur laquel e rien n’est connecté (entrée

flottante). Dans la boucle for qui s’en suit, random()

unsigned long x = 1023;

est utilisé pour obtenir, à chaque tour, une valeur

pseudo-aléatoire entre 0 et 999 que nous affichons

long mon_random() {

sur le moniteur série.

long hi, lo;

À chaque exécution du croquis, une série de 10

if (x == 0)

valeurs est ainsi affichée, précédée par la valeur

x = 123459876L;

lue sur A0, à chaque fois différente. Mais si nous

hi = x / 127773L;

connectons A0 à +5V via une résistance de rappel

lo = x % 127773L;

de quelques 10k ohms, le comportement du croquis

x = 16807L * lo - 2836L * hi;

change du tout au tout. La valeur lue est systéma-

if (x < 0)

x += 0x7fffffffL;

tiquement 1023 et la série de valeurs obtenues

return x;

devient : 561, 29, 195, 691, 775, 975, 456, 176, 211

}

et 775. . à chaque fois !

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

HACKABLE MAGAZINE n°17

91

REPÈRE & SCIENCE

CODES TOURNANTS

La variable globale x est initialisée, avant le premier

appel à cette fonction, avec la valeur de la graine, puis tous

les appels consécutifs changeront sa valeur (qui est égale-

ment retournée par la fonction). Pour obtenir un comporte-

ment identique à random(1000), il nous suffirait d’appeler

mon_random() % 1000 (% étant l’opérateur modulo, le

calcul du reste de la division par 1000). La suite de valeurs

obtenues avec x initialisé à 1023 est exactement la même

que cel e dans notre croquis exécuté sur un Arduino à base

d’AVR (testé sur Arduino Due).

3. ALLONS-Y !

Nous avons maintenant toutes les briques nécessaires

pour créer notre implémentation d’un système à codes tour-

nants. L’idée sera donc la suivante en reposant sur deux

Arduino :

• un montage « émetteur » autonome disposant d’un

afficheur LCD et d’un bouton permettant l’affichage

successif des différentes valeurs de la série ;

• un montage « récepteur » maintenant en interne une

liste de futures valeurs utilisables, connecté via le

moniteur série et permettant d’entrer une valeur et de la

vérifier/valider.

Commençons par le montage et le croquis le plus simple,

celui de l’émetteur :

Ce montage de boutons et

de résistances, utilisé sur le

#include <LiquidCrystal.h>

shield de DERobot, permet de

distinguer quel bouton est utilisé

LiquidCrystal lcd(8,9,4,5,6,7);

à l’aide d’une unique entrée

analogique de la carte Arduino.

void setup() {

lcd.begin(16, 2);

lcd.setCursor(0,0);

lcd.print("Hackable 17");

randomSeed(42424242);

}

void loop() {

if (analogRead(0) < 50) {

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Code tournant:");

lcd.setCursor(0,1);

lcd.print(random(1,65536));

delay(500);

}

}

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Les codes tournants ou comment ne pas envoyer le même message deux fois Voici un schéma du

L’afficheur LCD alphanumé-

en série. Ainsi en lisant simplement la valeur

montage émetteur.

rique utilisé ici est un shield à 10€

d’A0, il est possible de déterminer quel bou-

Malgré la complexité

apparente, il ne s’agit

de chez DFRobot comprenant

ton est enfoncé puisque la tension présente

que d’une liaison

l’écran LCD ainsi d’une série de

dépend du nombre de résistances connectées

classique d’un afficheur

boutons-poussoirs connectés sur

entre la tension d’alimentation et la masse

LCD alphanumérique

la broche A0 de la carte Arduino.

(principe du diviseur de tension).

compatible HD44780

accompagné d’un bouton

L’afficheur compatible HD44870

Le fonctionnement global du croquis est

poussoir connecté à

est connecté en mode 4 fils à la

relativement simple. Nous initialisons l’affi-

A0. Les connexions

carte via les broches : 8 (RS),

présentées ici sont

cheur ainsi que le PRNG avec une valeur

celles du shield « LCD

9 (EN), 4 (D4), 5 (D5), 6 (D6) et

arbitrairement choisie puis, à chaque pres-

KeyPad » de DFRobot,

7 (D7). C’est la configuration la

sion sur l’un des boutons (« RIGHT »), nous

si ce n’est que les 4

plus économique en termes de

affichons simplement la valeur retournée par

autres boutons et leurs

brochage, mais également la

résistances (+ reset) ne

random(1,65536) qui sera donc comprise

sont pas illustrés ici.

plus lente pour piloter l’afficheur

entre 1 et 65535. Chaque nouvel e utilisation

et cel e proposant le moins de

du bouton nous fera donc avancer d’une

fonctionnalités. Il est impossible

valeur dans la série pseudo-aléatoire.

de définir ses symboles person-

nalisés, par exemple, puisque la

L’émetteur a un travail relativement simple

broche RW est reliée à la masse.

puisqu’il ne fait qu’émettre une nouvel e valeur

de la série. Notez que je parle d’émettre

Les 5 boutons-poussoirs en

puisque, même s’il ne s’agit que d’un affichage

revanche n’utilisent qu’une seule

sur un écran LCD, l’opération consiste effecti-

broche de la carte Arduino grâce à vement à envoyer une valeur sur un canal de l’utilisation de résistances reliées

communication. Il se trouve simplement que

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

HACKABLE MAGAZINE n°17

93

REPÈRE & SCIENCE

CODES TOURNANTS

le canal en question se résume à vos yeux et vos doigts copiant cette information de l’afficheur au moniteur série. L’opération fonctionnera de la même manière en vous remplaçant par un dispositif infrarouge, à fréquence ou même audio (encodage/décodage DTMF).

Le récepteur a à sa charge de prendre en compte une éventuel e perte d’un code et, si tel est le cas, d’assurer un fonctionnement malgré ce problème. Pour ce faire, comme détail é précédemment, il doit donc disposer d’une solution pour tester une valeur reçue non pas uniquement avec la prochaine valeur attendue dans la série, mais avec un groupe de futures valeurs. Nous devons donc avoir à notre disposition une partie de cette série de valeurs.

Pour cela, nous utiliserons un tableau et commencerons par le remplir :

#define TAILLE_BUF 10

unsigned int buf[TAILLE_BUF];

void setup() {

Serial.begin(115200);

while(!Serial){;}

randomSeed(42424242);

Serial.println("Go go go");

for(int i=0; i < TAILLE_BUF; i++) {

buf[i] = random(1,65536);

}

}

La macro TAILLE_BUF déterminera la tail e de cette « fenêtre de test » et sera utilisée tout au long du croquis. Notre tableau, buf[] sera rempli de valeurs dans la fonction setup() après avoir initialisé le PRNG avec la même graine que celui de l’émetteur. Une simple boucle for permet de parcourir l’ensemble du tableau pour y placer consécutive-ment les valeurs obtenues via random(1,65536).

À ce stade, nous savons que les 10 premières valeurs que nous recevrons de la part de l’émetteur seront cel es du tableau ou, éventuel ement, une partie d’entre el es. Afin de ne pas rendre le croquis il isible, nous créons des fonctions permettant deux opérations : chercher une valeur dans le tableau et mettre à jour le tableau si cette valeur est trouvée et donc que le code est accepté.

La recherche est relativement simple puisqu’el e consiste à parcourir le tableau et comparer chaque valeur à cel e reçue :

int cherchecode(unsigned int code) {

for(int i=0; i < TAILLE_BUF; i++) {

if(buf[i] == code)

return i;

}

return -1;

}

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Les codes tournants ou comment ne pas envoyer le même message deux fois Si la valeur passée en argument de l’appel

à cette fonction est trouvée, la position dans le

tableau est retournée. Si tel n’est pas le cas ou,

en d’autres termes, si la valeur reçue ne fait pas

partie des 10 (TAILLE_BUF) prochaines valeurs

attendues, el e retournera -1 (une valeur qui ne

peut en aucun cas être cel e d’une position dans

le tableau).

Vient ensuite la problématique de la mise à

jour. Si la valeur reçue est effectivement trou-

vée, toutes les valeurs à des positions précé-

dant la sienne deviennent obsolètes et inutiles.

Nous pouvons donc décaler les valeurs dans le

tableau de manière à mettre en première posi-

tion la prochaine valeur attendue, déplacer les

suivantes et compléter par de nouvel es valeurs

fournies par random(1,65536) :

La mise à jour du

tableau se fait à l’aide

void majcode(int pos) {

d’une simple boucle.

for(int i=0; i < TAILLE_BUF; i++) {

En haut, le tableau

if(i < TAILLE_BUF-pos)

avant mise à jour avec,

buf[i] = buf[i+pos+1];

en bleu, la position du

else

code trouvé. Toutes

buf[i] = random(1,65536);

les valeurs sont

}

copiées aux nouveaux

emplacements en

}

écrasant les valeurs

inutiles (en rouge) puis

La boucle for parcourt ici aussi tous les emplacements du tableau, mais pour les le tableau est complété

positions avant cel es correspondant au nombre de valeurs à conserver, on copie la de nouvelles valeurs

pseudo-aléatoires (en

valeur se trouvant à une distance égale à pos+1. Une fois passée cette position, il vert) en écrasant celles

suffit de faire appel à random(1,65536) pour stocker les prochaines valeurs de la déjà présentes (en

série. On se retrouve, en sortie de la boucle, avec un tableau tout neuf, avec en pre-rouge également).

mière position le code qu’on est censé recevoir la prochaine fois.

Ces deux fonctions utilitaires peuvent ensuite être utilisées dans la fonction loop() chargée de réceptionner et traiter les codes via le moniteur série : void loop() {

while (Serial.available() > 0) {

unsigned int valeur = Serial.parseInt();

if(!valeur)

return;

Serial.print("recu: ");

Serial.println(valeur);

int ret = cherchecode(valeur);

if(ret >= 0) {

Serial.print("Code valide en position: ");

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

HACKABLE MAGAZINE n°17

95

REPÈRE & SCIENCE

CODES TOURNANTS

Serial.println(ret);

majcode(ret);

} else {

Serial.println("Code non trouve");

}

}

}

Matériellement, notre

Si des données sont disponibles sur la liaison série, on appel e la

montage se résume à

méthode parseInt() afin d’obtenir immédiatement un entier (int) et un afficheur LCD et un

bouton. La partie vitale est

non une chaîne de caractères. Cette méthode retourne 0 à la fois si

la génération, la gestion

« 0 » est reçu ou si une chaîne ne se traduit pas en nombre. Voilà pour-et les manipulations faites

quoi nous utilisons random() avec une valeur minimum de 1, il ne serait dans les croquis. Il vous

pas possible sinon de faire la différence entre un code 0 et une entrée sera possible d’appliquer

«coucou«

le principe des codes

sur le moniteur série par exemple. Si l’entier obtenu est zéro,

tournants à n’importe quel

la fonction loop() se termine là, nous écartons la saisie.

type d’échanges, que ce soit

par les ondes, une saisie

Il ne nous reste ensuite plus qu’à chercher le code obtenu avec notre manuelle, une transmission

cherchecode() et agir en fonction du résultat. Si la valeur retournée est infrarouge ou encore audio...

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

1 6 -1 8

M A I PARIS

F R A N C E

2 0 1 7

WHERE INNOVATION GROWS

U N E A P P R O C H E H U M A I N E D E L A R O B O T I Q U E

SMART HOMES

INDUSTRY 4.0 &

MEDICAL & HEALTH

TECHNOLOGIES

SMART CITIES

HOSPITALITY

FIELD ROBOTICS

SUPPLY CHAIN SERVICES

& FORESIGHT

RETAIL & TOURISM

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

HACKABLE MAGAZINE n°17

97

AP-PlanRobot 225x295-2017.indd 2

08/02/2017 14:42

REPÈRE & SCIENCE

CODES TOURNANTS

positive, alors il s’agit d’une position dans le tableau et

les échanges, les codes tour-

le code est valide. Dans ce cas, nous mettons à jour

nants deviennent impossibles

le tableau avec majcode() en passant la position du

à prédire. Mais attention, il faut

code trouvé. Dans le cas contraire, nous ne touchons

vraiment savoir ce qu’on fait

pas au tableau et nous rejetons le code avec un mes-

car, dans la pratique, même des

sage d’erreur.

applications commerciales sont

souvent mises à mal en raison

Pour tester notre réalisation, rien de plus simple : il

d’une maladresse de conception

suffit de programmer le premier croquis dans l’Arduino

ou d’implémentation. La concep-

émetteur et le second dans le récepteur, puis d'ouvrir

tion de ce genre de système est

le moniteur série. Une pression sur le bouton nous

un vrai métier.

affichera un code que nous pouvons entrer dans le

moniteur pour validation. On peut également tester la

De plus, le fonctionnement

plage de recherche en appuyant plusieurs fois sur le

général des codes tournants

bouton et en testant le code obtenu.

peut être perverti. Dans le cas

d’une émission du code par

Bien entendu, si le nombre de valeurs affichées,

radio comme dans le cas des

mais non saisies dépasse la tail e du tableau, ou en

télécommandes pour véhicules,

d’autres termes la fenêtre de validation, les deux mon-

une certaine forme d’attaque par

tages sont alors désynchronisés et la seule solution

rejeu reste possible : brouil er le

est de faire un reset de l’un comme de l’autre. Exacte-

signal de manière à empêcher

ment comme avec les télécommandes de verrouil age

le récepteur d’obtenir les codes,

centralisé des voitures. Notez que le croquis de récep-

intercepter un premier message,

tion est conçu pour définir la tail e de la fenêtre de

attendre une seconde tentative,

validation via la valeur de la macro TAILLE_BUF. Pour

intercepter le second message et

plus de souplesse, il suffit d’augmenter la valeur et le

là, envoyer le premier message

reste du code s’adaptera en conséquence.

au récepteur. On introduit alors

un décalage entre émetteur et

4. ALLER PLUS LOIN

récepteur, et le second code

capturé peut alors être utilisé

Comme précisé en introduction de l’article, ceci

ultérieurement.

n’est bien entendu absolument pas sécurisé. Non

Enfin, vous l’avez sans doute

seulement les codes sont visibles, mais surtout, le

remarqué, ces montages démons-

PRNG est relativement simple. Pire encore, son fonc-

tratifs ne supportent pas un reset,

tionnement même (en dehors du modulo) fait qu’il est

car tout est stocké en mémoire

possible de prédire relativement facilement le prochain

vive. Il est cependant possible

code. Il suffit de connaître le croquis pour arriver à

d’envisager une solution en

mettre le système en péril. Or dans ce domaine, le fait

jouant avec le PRNG (non, je ne

que le fonctionnement du système soit secret n’est pas l’avais pas intégré dans l’article une sécurité. La sécurité par obscurantisme ne fonc-par hasard) et en stockant en

tionne jamais...

EEPROM la valeur de la variable

globale utilisée, et/ou les valeurs

Pour améliorer le système, il faut non seulement

du tableau, pour ensuite reprendre

utiliser un meil eur PRNG ou du moins en augmenter

le processus là où il s’était arrêté

l’entropie (65535 valeurs différentes possibles ne

avant redémarrage. Ceci peut

sont clairement pas suffisantes), mais surtout il est

être un exercice amusant et très

nécessaire de rendre l’échange illisible. En utilisant

enrichissant pour faire évoluer ses

des valeurs possibles plus importantes et en chiffrant

croquis... DB

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

HACKABLE MAGAZINE n°17

http:/ www.hackable.fr/

Cowlab

IDE pour l'embarqué

Développez

Editeur de code en ligne: vous accédez à

vos projets de partout et à tout moment.

Compilez

De nombreux compilateurs disponibles pour

vos cibles préférées (gcc, yosys, spinalHDL, ...)

Collaborez

Cowlab est en plein développement. Nous

sommes à l'écoute de vos avis, souhaits et

remarques pour que cet outil fasse demain

ce dont vous revez aujourd'hui.

http://www.cowlab.fr

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

I ACK

Votre boutique On-line

Raspberry Pi

Raspberry Pi 3

Avec Raspberry Pi, une multitude de fonctionnalités s’offrent à vous ...

Découvrez l’univers du Raspberry Pi

et plus de 250 accessoires !

Code KDO : HACKABLE

5€ pour 100€ d’achat

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

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

Document Outline

- creez_un_effet_feu_avec_une_matrice_de_l

- le_montage_et_l_alimentation

- exit_adafruit_neopixel_et_vive_fastled

- l_algorithme_de_simulation_de_feu

- ameliorations_ajustement_et_reglages

- creez_un_controleur_de_volume_pour_votre

- torturer_la_bibliotheque_pour_rien

- rapports_hid_et_espionnage_de_clavier

- mais_que_fait_la_bibliotheque_arduino_ke

- un_controle_de_volume_qui_appuie_sur_des

- le_croquis_et_la_bibliotheque_hid

- ce_n_est_qu_un_debut

- changez_la_configuration_des_leds_de_vot

- jouons_avec_les_leds

- configurer_le_comportement_par_defaut_su

- configurer_le_comportement_sur_d_autres_

- deux_leds_ne_vous_suffisent_pas_il_suffi

- pour_finir

- les_codes_tournants_ou_comment_ne_pas_en

- le_principe_des_codes_tournants

- les_generateurs_de_nombres_pseudo-aleato

- allons-y

- aller_plus_loin

- utilisez_un_programmeur_d_eprom_avec_vot

- le_materielle_programmeur_tl866cs

- prise_en_charge_du_tl866cs_par_la_pi

- utilisons_notre_tl866cs

- le_cas_des_microcontroleurs_avr

- pour_finir

- utilisez_votre_arduino_uno_comme_periphe

- bootloader_et_principe_de_fonctionnement

- installation_de_hoodloader2

- utilisez_hoodloader2_et_l_arduino_uno_mo

- un_exemple_concretl_arduino_uno_comme_cl

- pour_finir..._ou_commencer

- configurez_un_clavier_bluetooth_pour_vot

- connexion_et_appairage

- configuration_du_clavier

- transformez_un_vieux_materiel_de_30_ans_

- prise_de_contact_et_florilege_d_erreurs

- retrouver_une_langue_parlee_il_y_a_30_an

- parfois_un_peu_d_aide_ne_fait_pas_de_mal

- direction_usb

- pour_finir

- creez_des_boutons_a_copier_coller

- l_usbomnipresent_mais_relativement_compl

- demarrer_avec_un_petit_projet_simple_mai

- le_clavier_mais_pas_seulement

Table of Contents

creez_un_effet_feu_avec_une_matrice_de_l

le_montage_et_l_alimentation

exit_adafruit_neopixel_et_vive_fastled

l_algorithme_de_simulation_de_feu

ameliorations_ajustement_et_reglages

creez_un_controleur_de_volume_pour_votre

torturer_la_bibliotheque_pour_rien

rapports_hid_et_espionnage_de_clavier

mais_que_fait_la_bibliotheque_arduino_ke

un_controle_de_volume_qui_appuie_sur_des

le_croquis_et_la_bibliotheque_hid

ce_n_est_qu_un_debut

changez_la_configuration_des_leds_de_vot

jouons_avec_les_leds

configurer_le_comportement_par_defaut_su

configurer_le_comportement_sur_d_autres_

deux_leds_ne_vous_suffisent_pas_il_suffi

pour_finir

les_codes_tournants_ou_comment_ne_pas_en

le_principe_des_codes_tournants

les_generateurs_de_nombres_pseudo-aleato

allons-y

aller_plus_loin

utilisez_un_programmeur_d_eprom_avec_vot

le_materielle_programmeur_tl866cs

prise_en_charge_du_tl866cs_par_la_pi

utilisons_notre_tl866cs

le_cas_des_microcontroleurs_avr

pour_finir

utilisez_votre_arduino_uno_comme_periphe

bootloader_et_principe_de_fonctionnement

installation_de_hoodloader2

utilisez_hoodloader2_et_l_arduino_uno_mo

un_exemple_concretl_arduino_uno_comme_cl

pour_finir..._ou_commencer

configurez_un_clavier_bluetooth_pour_vot

connexion_et_appairage

configuration_du_clavier

transformez_un_vieux_materiel_de_30_ans_

prise_de_contact_et_florilege_d_erreurs

retrouver_une_langue_parlee_il_y_a_30_an

parfois_un_peu_d_aide_ne_fait_pas_de_mal

direction_usb

pour_finir

creez_des_boutons_a_copier_coller

l_usbomnipresent_mais_relativement_compl

demarrer_avec_un_petit_projet_simple_mai

le_clavier_mais_pas_seulement