lundi 18 juin 2018

Prendre des photos avec le module caméra du Raspberry Pi

Aujourd'hui, je vous invite à explorer avec moi diverses façons de prendre une photo avec le module caméra du Raspberry Pi: je vais tour à tour utiliser raspistill, la bibliothèque picamera (python), Scratch et le logiciel Pi Vision.

Un support pour la caméra

Puisque le module caméra du Raspberry Pi est un petit circuit intégré d'environ 2 cm de côtés, ce n'est pas toujours évident de l'orienter pour qu'il photographie ce qu'on désire photographier.  Vous pouvez le laisser à plat sur la table mais...vous aller alors photographier le plafond, et ce n'est peut-être pas votre but!

De plus, le ruban connecteur fourni avec le module n'est long que d'une dizaine de centimètres et la caméra doit donc rester à proximité du Raspberry Pi.

Tout ça pour dire qu'à mon avis, un module caméra sans support inclinable est à toute fin pratique inutilisable.

Il faut donc penser à un dispositif qui tiendra votre module caméra dans la position désirée.  Vous pouvez en acheter un spécialement conçu à cette fin, en fabriquer un au moyen d'une imprimante 3D, ou en bricoler un avec les moyens du bord.  Comme vous pouvez le constater sur la photographie ci-dessous, j'ai choisi l'option "bricolage avec les moyens du bord": mon support de caméra est constitué de deux petits blocs de bois reliés par une charnière. Le module caméra est fixé à un des blocs au moyen de deux petits clous.  Grâce à la charnière, je peux régler à volonté l'orientation verticale de la caméra.



Remarquez que, dans cette position (ruban connecteur en haut), la caméra est à l'envers, ce qui va m'obliger, dans la suite de cet article, à retourner l'image de façon logicielle.


Connexion de la caméra

Pour éviter d'endommager votre matériel, il est recommandé de brancher le module caméra pendant que le Raspberry Pi est éteint.

La caméra se branche dans le port CSI (camera serial interface) du Raspberry Pi.



Observez le ruban du module caméra:  à une extrémité, pour pouvez voir 15 courtes bandes conductrices: lorsque le ruban est inséré dans le connecteur CSI, ces bandes doivent être orientées vers le connecteur HDMI.


Vous ouvrez le "couvercle" du connecteur CSI en le tirant délicatement vers le haut, tout en poussant vers l'intérieur avec le pouce et l'index.  Vous insérez le ruban connecteur de la caméra le plus profondément possible, avec les connecteurs métalliques orientés vers le connecteur HDMI, et vous refermez le couvercle en poussant vers le bas (ça devrait faire "clic", et le ruban reste bien en place même si vous tirez dessus).



Configuration du Raspberry Pi

Si vous n'avez jamais utilisé de module caméra avec votre Raspberry Pi, il faut l'activer dans le menu "Préférences" / "Configuration du Raspberry Pi":


Dans l'onglet "Interfaces", vous vous assurez que "Caméra" est réglée à "Activé", puis vous cliquez sur le bouton "Valider".



Prendre une photo depuis le terminal (raspistill)

Vous pouvez prendre une photographie à partir du terminal en lignes de commandes, grâce à la fonction raspistill.

Par exemple, écrivez la commande "raspistill -o ma_photo.jpeg"


Résultat:  pendant plusieurs secondes, l'image captée par votre module caméra sera affichée à l'écran, et elle sera ensuite enregistrée dans le répertoire "/home/pi" dans un fichier portant le nom "ma_photo.jpeg".

Le paramètre "-o" signifie "output", et sert à indiquer le nom qu'on désire donner à notre fichier.

Voici donc la photo enregistrée dans le fichier "ma_photo.jpeg":



Tel que mentionné au début de cet article, ma caméra est positionnée à l'envers. Si c'est aussi votre cas, c'est très facile à corriger: il s'agit d'ajouter les paramètres -hf et -vf à raspistill (-hf pour "horizontal flip" et -vf pour "vertical flip").

Par défaut, la photo est prise à la résolution maximale du module caméra, c'est à dire 2592 X 1944.  Si vous désirez une résolution plus faible (pour économiser l'espace sur votre carte SD, par exemple), vous pouvez utiliser les paramètres -w et -h (où -w représente la largeur en pixels, et -h représente la hauteur en pixels.

Dans ce nouvel essai, je vais prendre une photo retournée, de résolution 640 X 480, qui va s'enregistrer dans un fichier intitulé "ma_photo2.jpeg".  Pour ce faire, j'écris la commande "raspistill -hf -vf -w 640 -h 480 -o ma_photo2.jpeg"...



Résultat: la photo est maintenant dans le bon sens, et sa résolution n'est plus que de 640 X 480:


Par défaut, l'aperçu de la photo apparaît à l'écran pendant 5 secondes avant que la photo ne soit prise.  Si vous désirer modifier ce délai, vous utilisez le paramètre "-t" accompagné du délai désiré en millisecondes.  Par exemple, "raspistill -t 10000 -o photo.jpeg" affichera l'aperçu pendant 10 secondes avant d'enregistrer la photo, ce qui vous laisse plus de temps pour ajuster le cadrage.

D'autres paramètres vous permettent d'ajuster la luminosité, de modifier la saturation, d'ajouter des filtres.  Pour connaître toutes les options disponibles, tapez simplement "raspistill", sans paramètres, dans le terminal.

Voici, par exemple, le résultat obtenu avec la commande "raspistill -hf -vf -ifx colourswap -o photo.jpeg": une succulente pomme bleue!:



Prendre une photo avec le logiciel Pi Vision

Si vous désirez prendre une photo de temps à autre, écrire de longues commandes dans le terminal n'est probablement pas l'option la plus agréable: il faut retenir la syntaxe, éviter les fautes de frappe...  Il existe évidemment quelques applications à interface graphique spécialement conçues pour contrôler le module caméra.

J'ai testé Pi Vision, que vous pouvez télécharger ici.  Après avoir décompressé le fichier "PiVision.RPi.tar.gz", vous obtenez un fichier inexplicablement intitulé "rpiCC".  Avant de l'ouvrir, il est important de modifier les permissions de "rpiCC" pour le rendre exécutable.


Pour prendre une photo, il s'agit de cliquer sur l'onglet "Photo", de modifier les paramètres en fonction de nos préférences, puis de cliquer sur le bouton "Take a Picture".  On nous présente ensuite les dialogues habituels nous permettant de choisir le nom du fichier et l'endroit où on désire l'enregistrer.



Prendre une photo avec un script en Python

Grâce à la bibliothèque picamera, il n'est pas très difficile de contrôler le module caméra au moyen d'un script en langage python (cette bibliothèque est déjà installée par défaut dans Raspbian, et la documentation complète qui la concerne se trouve ici).



L'instruction "camera.resolution = (1024,768)", qui règle la résolution de la photo qui sera enregistrée en fichier, est optionnelle.  Si vous l'omettez, la résolution sera, par défaut, de 1440 X 900.

L'instruction "camera.rotation = 180 " sert à retourner la photo, puisque mon module caméra est placé à l'envers.  Cette ligne est évidemment inutile si votre module caméra est à l'endroit.

L'instruction "camera.start_preview(fullscreen = False, window = (50,50,640,480))" fait apparaître l'aperçu à l'écran, dans un rectangle de 640 pixels de largeur et de 480 pixels de hauteur.  Si j'avais simplement écrit "camera.start_preview()", l'aperçu remplirait tout l'écran.  Mais attention: en cas de bug quelque part dans votre script, le programme s'interrompt sans se rendre à l'instruction "camera.stop_preview()", et l'aperçu demeure stupidement affiché à l'écran, vous empêchant d'accéder aux contrôles de votre IDE pour python...je le sais, car ça m'est arrivé!  Pour cette raison, je préfère éviter que l'aperçu couvre la totalité de l'écran.

C'est l'instruction "camera.capture('/home/pi/Bureau/image.jpeg')" qui fait la partie la plus importante du travail: enregistrer la photo dans un fichier!  Ici, j'ai écrit le chemin d'accès complet du fichier pour qu'il s'enregistre sur le bureau (si votre Rasbperry Pi parle anglais, ce sera "Desktop" plutôt que "Bureau").  Vous pouvez vous contenter d'écrire le nom du fichier désiré ("camera.capture('image.jpeg)") pour qu'ils s'enregistre dans le répertoire "/home/pi".

Prendre une photo avec Scratch?!?!

La version de Scratch conçue pour le Raspberry Pi permet de prendre une photo avec le module caméra.

Dans l'onglet "Costumes", si vous cliquez sur le bouton "Camera", une petite fenêtre montrant un aperçu de la photo apparaît à l'écran.



Si vous cliquez sur le bouton qui présente une icône en forme de caméra, le lutin a maintenant, comme costume, la photo prise par la caméra.


Le bouton "Fait" permet de faire disparaître la fenêtre, lorsque vous avez terminé.

Dans mon cas, clic avec le bouton droit pour mettre la photo à l'endroit...



Ce n'est pas tout: vous pouvez concevoir des programmes qui prennent des photos.  Pour ce faire, vous devez d'abord d'abord démarrer le serveur GPIO:



Vous prenez une nouvelle photographie grâce à un bloc "envoyer à tous" qui envoie le message "photo":


Le costume du lutin est remplacé par une nouvelle photo:



Yves Pelletier   (TwitterFacebook)


vendredi 15 juin 2018

MIDI par usb avec Arduino Leonardo

Jusqu'à maintenant, chaque fois que j'ai abordé un projet impliquant le protocole MIDI, j'ai utilisé les traditionnels connecteurs DIN à 5 broches.  Ces connecteurs sont tout à fait appropriés lorsqu'on veut brancher une carte Arduino à un clavier MIDI, par exemple.  Mais pour établir une communication MIDI entre l'Arduino et un ordinateur, un simple câble usb s'avère plus pratique (surtout si vous ne possédez pas d'instruments de musique compatibles MIDI).

Dans ce tuto, nous explorons donc l'utilisation d'une carte Arduino Leonardo pour établir une communication MIDI avec un ordinateur.  Plutôt qu'un Leonardo, n'importe quelle carte Arduino pouvant se comporter comme un périphérique USB pourrait faire l'affaire (Zero, Due, 101...); toutefois, ce projet ne fonctionnera pas avec une carte Arduino Uno.

Installation d'un logiciel MIDI sur l'ordinateur

Nous aurons besoin d'un logiciel compatible MIDI sur l'ordinateur auquel nous brancherons le Leonardo.  Si vous avez déjà l'habitude de jouer avec des contrôleurs MIDI, utilisez votre logiciel préféré.  Sinon, je vous propose VMPK, ou Virtual MIDI Piano Keyboard qui est léger, gratuit, et convient parfaitement à nos besoins.  Le logiciel est disponible pour Windows, Linux et Mac, mais j'ai fait mes tests sous Windows 7.



Installation de la bibliothèque MIDIUSB

Vous devez également installer la bibliothèque MIDIUSB dans votre IDE Arduino.  Attention, il ne s'agit pas de la bibliothèque MIDI conventionnelle que vous avez peut-être déjà installée dans le passé.



Exemple 1:  communication de l'Arduino vers l'ordinateur (MIDI out)

Une première utilisation possible consiste à envoyer des instructions MIDI de la carte Arduino vers l'ordinateur (le Leonardo agit comme contrôleur MIDI).  L'exemple "MIDIUSB_write" qui accompagne la bibliothèque MIDIUSB envoie à l'ordinateur une même note de façon répétitive; j'ai modifié cet exemple pour jouer en boucle une courte mélodie constituée de 16 notes.

Le sketch

Le sketch contient une fonction noteOn qui permet de jouer une note.  Cette fonction nécessite trois paramètres:  channel (le canal MIDI utilisé), pitch (la note de la gamme à jouer) et velocity (le volume sonore avec lequel la note doit être jouée).

Ainsi,  "noteOn(0, 0x48, 64)" jouera la note "do du 5e octave" avec une vélocité de 64 (moyenne) sur le canal 0.

Dans le protocole MIDI, chaque note est jouée aussi longtemps qu'elle n'est pas interrompue par un message "noteOff", qui prend les mêmes arguments que la fonction "noteOn".

Les 16 notes qui constituent notre mélodie sont stockées dans un tableau bidimensionnel nommé "melodie":  le premier élément est le "pitch", et le deuxième est la durée en millisecondes.  J'aurais pu ajouter un troisième élément pour la vélocité mais, dans cette exemple, toutes les notes de la mélodie sont jouées avec la même intensité.



Réglages du logiciel MIDI

Pour que la mélodie émise par l'Arduino soit jouée par l'ordinateur, il faut faire en sorte que Virtual MIDI Piano Keyboard utilise la carte Leonardo comme entrée MIDI.  Pour  ce faire, vous choisissez "Connexions MIDI" dans le menu "Éditer".


Si la carte est branchée à un port USB de l'ordinateur, "Arduino Leonardo" devrait être disponible dans la liste proposée pour "Connexion du port d'entrée MIDI".  Il vous faut également un pilote capable de jouer les sons ("Pilote MIDI OUT").  Dans mon cas, on me propose "Windows MM", probablement parce que Windows Movie Maker était déjà installé sur l'ordinateur.  Si la liste "Pilote MIDI OUT" est vide pour vous, vous devrez installer un pilote sur votre ordinateur (VirtualMIDISynth, par exemple).

La mélodie devrait maintenant être jouée sur la carte de son de l'ordinateur.  Notez que vous pouvez modifier le "programme" (l'instrument utilisé pour jouer la mélodie): ça peut être un son de piano, de trompette, de clarinette, etc.

D'autres exemples de MIDI out

Comme je l'ai déjà mentionné, l'exemple "MIDIUSB_write" fournit avec la bibliothèque MIDIUSB fait la même chose, mais avec une seule note.  De plus, des informations apparaissent dans le moniteur série de l'IDE Arduino, ce qui peut aider au débogage.

Si vous préférez fabriquer un petit contrôleur MIDI, jetez un oeil sur la page MidiDevice du site officiel Arduino: on vous guide dans la fabrication d'un clavier MIDI constitué de 7 boutons poussoirs.


Exemple 2:  communication de l'ordinateur vers l'Arduino (MIDI in)

Dans ce deuxième exemple, nous allons envoyer des messages MIDI de l'ordinateur vers l'Arduino.  Pour vérifier que ça fonctionne, vous pouvez essayer l'exemple "MIDIUSB_read" fourni avec la bibliothèque MIDIUSB: lorsque vous jouez une note sur le clavier du logiciel Virtual MIDI Piano Keyboard, elle s'affiche dans le moniteur série de l'IDE Arduino.

Pour ma part, j'ai essayé quelque chose qui me semblait un tout petit peu plus amusant:  chaque fois que je clique sur une note du logiciel Virtual MIDI Piano Keyboard, l'Arduino produit cette note à travers un haut-parleur.  Le Leonardo servira donc de synthétiseur MIDI (remarquez que la pertinence du projet est un peu discutable: la carte de son de l'ordinateur produit un son de bien meilleur qualité que la fonction tone de l'Arduino...).

Circuit

Le haut-parleur est relié à la broche 8 du Leonardo, par l'entremise d'un transistor pour éviter que le haut-parleur, à cause de sa très faible impédance, ne draine trop de courant (plus de détails ici).



Sketch

Lorsque le Leonardo reçoit un message "noteOn", il établit une correspondance entre le code MIDI qui indique la hauteur de la note (pitch) et la fréquence qui devra être émise par le haut parleur.  La variable MidiToFreq est un tableau bi-dimensionnel qui contient, pour chaque pitch MIDI, la fréquence en hertz.  Une fois la fréquence connue, on utilise la fonction tone pour jouer cette note sur le haut-parleur (broche 8).  Lorsqu'on reçoit un message "noteOff", on utilise noTone pour interrompre le signal PWM de la broche 8.



Réglages du logiciel MIDI

Pour que le logiciel Virtual MIDI Piano Keyboard achemine les messages vers la carte Leonardo, il faut effectuer quelques réglages, en passant par "Connexions MIDI" dans le menu Éditer.


Si la carte est branchée à un port USB de l'ordinateur, "Arduino Leonardo" devrait être disponible dans la liste "Connexion du port de sortie".



Chaque fois que vous cliquez sur une touche du clavier de piano dans la fenêtre du logiciel Virtual MIDI Piano Keyboard, la note se fait entendre dans le haut-parleur branché à l'Arduino (pour que toutes les touches fonctionnent, réglez le paramètre "Octave de base" à 3).

Yves Pelletier   (TwitterFacebook)


dimanche 10 juin 2018

Data logging avec Arduino Leonardo

Les microcontrôleurs constituent un outil précieux dans le domaine scientifique, grâce à la possibilité d'y brancher différents capteurs afin de prendre des mesures. 

Lorsqu'il s'agit de mesures nombreuses, étalées sur une certaine plage de temps, il faut penser à un moyen d'enregistrer ces données et les rendre disponibles à l'utilisateur.

Pour ce faire, il existe plusieurs méthodes, et j'en ai déjà exploré quelques-unes  dans ce blog: enregistrer un fichier "csv" sur une carte SD, ajouter une macro à votre tableur pour qu'il recueille les données par communication série, utiliser un service en ligne comme carriots, ou simplement utiliser le moniteur série et/ou le traceur série intégrés dans l'IDE Arduino...

Aujourd'hui, je procède autrement:  puisque la carte Arduino Leonardo peut se comporter comme un clavier USB, il est facile de la programmer pour qu'elle écrive les données dans un tableur.

Ce n'est probablement pas la façon la plus élégante de procéder; l'utilisateur devra prendre soin d'ouvrir un tableur (Excel, Google Sheets, Libre Office Calc), d'y sélectionner la cellule qui recevra la première donnée, et de conserver le logiciel à l'avant-plan pendant toute la durée de la mesure... Mais ça fonctionne, et ce n'est pas très difficile à réaliser.

Le circuit

Pour faire mes tests, j'ai fabriqué un capteur de température constitué d'une thermistance et d'une résistance.  Lorsque la température augmente, la thermistance devient moins résistive, ce qui a pour effet de diminuer la tension acheminée à l'entrée A0 de la carte Leonardo.

Évidemment, vous pouvez remplacer ce capteur par n'importe quel autre, peu importe qu'il soit analogique ou numérique (il peut même y en avoir plusieurs), en apportant des modifications mineures au sketch présenté plus bas.



Le sketch

Le bref programme présenté ci-dessous "tape au clavier" le temps écoulé depuis le démarrage de la carte (fonction"millis"), envoie le code ASCII de la touche "tab" pour passer à la cellule voisine de droite, écrit la valeur lu à l'entrée analogique A0, envoie le code ASCII de la touche "enter" pour descendre d'une ligne, puis attend 1 seconde avant de recommencer.

Prenez note d'une importante précaution qui nous permet d'interrompre au besoin la prise de données:  la routine s'effectue à la condition que la broche 2 de la carte soit au niveau logique haut (5 V).  Ainsi, lorsque vous désirez reprogrammer la carte, vous reliez la broche 2 à GND pour éviter que les mesures soient dactylographiées à l'intérieur de votre sketch!!!



Le résultat

Après avoir ouvert un tableur, vous sélectionnez  une de ces cellules, puis vous reliez la broche 2 à 5 V.  Les données s'écrivent sur deux colonnes: le temps dans la colonne de gauche, et la mesure de l'entrée A0 dans la colonne de droite.

Le graphique ci-dessous a été produit dans Google Sheets: j'ai tenu la thermistance entre mon pouce et mon index pour la réchauffer, puis je l'ai laissé reprendre sa température initiale.


Si vous voulez, vous pouvez préparer le tableur pour que les données soient présentées sous forme de graphique à mesure qu'elles sont prises.  Vous pouvez également effectuer les calculs nécessaires pour convertir les mesures (soit dans le sketch Arduino, soit dans le tableur).


Yves Pelletier   (TwitterFacebook)

samedi 2 juin 2018

Émuler une souris avec l'Arduino Leonardo

Une caractéristique intéressante des cartes Arduino Leonardo, c'est que les ordinateurs les reconnaissent comme de véritables périphériques USB.  On peut donc programmer le Leonardo afin qu'il se comporte comme un clavier ou une souris.

Le langage Arduino vous propose 7 fonctions permettant de reproduire le mouvement d'une souris d'ordinateur:


  • Mouse.begin() est nécessaire pour initialiser l'émulation et utiliser les autres fonctions décrites ci-dessous.  Typiquement, vous l'utilisez à l'intérieur de setup().  Si vous désirez interrompre l'émulation de la souris, utilisez Mouse.end().
  • Mouse.move(x, y, wheel) permet de faire bouger le pointeur de souris à l'écran de l'ordinateur.  x est le nombre de pixels dont on désire faire bouger le pointeur horizontalement, alors que y est le nombre de pixels dont on désire déplacer le pointeur verticalement.  Notez que ces déplacements sont relatifs à la position initiale du pointeur sur l'écran.
  • Avec Mouse.click(), votre Leonardo aura le même comportement que si vous aviez cliqué avec le bouton gauche de la souris.  Si vous désirez produire un clic sur le bouton droit, vous utilisez Mouse.click(MOUSE_RIGHT).
  • Mouse.press() ressemble à Mouse.click(), sauf que le bouton demeure enfoncé jusqu'à ce que vous appeliez Mouse.release().
  • Mouse.isPressed() est un booléen dont la valeur sera vraie si une le bouton d'une souris reliée à l'ordinateur est enfoncé.

Le site officiel Arduino présente deux exemples très clairs pour construire votre propre souris au moyen de 5 boutons poussoirs, ou pour contrôler le pointeur au moyen d'un joystick analogique.

Question de ne pas refaire inutilement des projets qui existent déjà, je vous propose un petit sketch inutile mais rigolo qui vous permettra  de jouer un tour à vos amis: la souris truquée.  Lorsque vous branchez l'Arduino Leonardo au port USB de l'ordinateur, le pointeur de souris se mettra à bouger avec une trajectoire circulaire, comme dans la vidéo ci-dessous.  Avec une telle souris hyperactive, l'utilisateur aura bien du mal à contrôler son ordinateur...



Mais prenez garde de ne pas vous piéger vous-mêmes: si le pointeur se met à faire des cercles aussitôt que la carte Leonardo est branchée à votre ordinateur, vous serez incapable de téléverser un autre sketch dans la carte, lorsque vous en aurez assez de celui-ci.  Pour cette raison, il faut prévoir un moyen de d'empêcher la carte d'exécuter sa routine.  Dans le sktech ci-dessous, nous vérifions d'abord l'état de la broche numéro 2 de l'Arduino.  Si elle est au niveau logique haut, nous faisons bouger le pointeur de la souris, mais si elle est au niveau logique bas, nous ne faisons rien.  Donc vous reliez la broche 2 à la sortie 5 V au moyen d'un fil conducteur lorsque vous voulez faire tourner le pointeur à l'écran, mais vous la reliez à la masse (GND) lorsque vous souhaitez reprogrammer la carte.



Yves Pelletier   (TwitterFacebook)

dimanche 27 mai 2018

Livre: Petits robots à fabriquer

Petits robots à fabriquer
par Daniel Knox
Éditions Eyrolles, collection Serial Makers
2018
160 pages

Les 13 projets de robotiques présentés dans cet ouvrage sont classés en 3 catégories: les robots basiques, les robots simples et les robots évolués.  La relative simplicité des projets ainsi que l'importance accordée  la décoration du robot me permettent de supposer qu'on cible surtout un public assez jeune (10 à 15 ans).

Robots basiques

Les 5 premiers robots ne comportent ni microcontrôleur, ni véritable capteur.  Par conséquent, leur comportement n'a rien de très sophistiqué.  Toutefois, puisqu'il est relativement facile de les construire à partir de matériel facile à trouver, ils constituent une option très intéressante pour les débutants.

  • Le robot brosse est une brosse à ongles qui se déplace de façon aléatoire grâce aux vibrations générées par un petit moteur à courant continu.
  • Le mouvement du robot gribouilleur est tout aussi aléatoire, mais il est causé par une petite roue, mue par un moteur à courant continu, qui tourne autour d'un axe vertical.  Des crayons ont été fixés au robot, qui dessine donc des oeuvres d'art aléatoires.
  • Le robot papillon est une version miniaturisée du robot brosse: ici, la brosse à ongles est emplacée par l'extrémité d'une brosse à dents jumelée au vibreur d'un téléphone portable.
  • Construit au moyen d'un châssis de robot roulant, le robot insecte a un comportement plus intéressant que ses prédécesseurs:  chacun de ses deux moteurs est relié à un interrupteur actionné par une antenne.  Lorsque l'antenne touche un obstacle, la roue qui lui est associée se met momentanément à tourner en sens inverse, ce qui fait tourner le robot.
  • Grâce à deux moteurs à engrenages et un mécanisme constitué de bâtonnets d'esquimau, le robot spirographe est en mesure de tracer des motifs beaucoup plus élégants que ceux du robot gribouilleur.


Robots simples

Cette deuxième catégorie présente des robots qui, grâce à un microcontrôleur, font preuve d'un peu plus de jugeote que ceux de la catégorie "basique".  Tous les projets de cette catégorie nécessitent l'utilisation d'une carte de prototypage micro:bit, qui se programme dans un environnement graphique très similaire à Scratch.

Le mot "robot" est certainement un tantinet discutable en ce qui concerne le robot avatar, qui est en fait un prétexte pour montrer les bases de la programmation de la carte micro:bit. Les LEDs intégrées à la carte s'allument de façon à montrer un visage heureux ou triste selon le bouton sur lequel on appuie.

Le robot speed est un petit véhicule qui roule grâce à deux servomoteurs; on le contrôle via bluetooth grâce à un téléphone ou une tablette.

Le robot catapulte est en fait est une catapulte miniature qui, grâce à un servomoteur et un  détecteur de mouvement à infrarouge, bombarde automatiquement tout intrus qui oserait entrer dans la pièce.

Le robot jardinier vous avertit lorsque votre plante a besoin d'être arrosée (vous devrez l'arroser vous-mêmes, toutefois).  Ici encore, considérant l'absence totale de mouvement, je n'aurais pas tendance à considérer ce dispositif comme un robot.

Grâce à deux jambes constituées de servomoteurs directement fixés à la carte micro:bit, le robot marcheur... marche.  C'est le robot qu'on peut voir sur la page couverture.


Robots évolués

Finalement, après vous être fait la main sur des robots simples, vous pourrez passer à des projets plus ambitieux:

Le robot guerrier présente certaines similitudes avec le robot speed, mais il est conçu pour renverser son adversaire lors d'un combat de robots.  Il est basé sur un récepteur de radiocommande Hobby King, et propulsé par une paire de servomoteurs à rotation continue.

Le robot imprimeur est la classique machine à commande numérique (CNC) construite à partir de deux mécanismes de lecteurs CD.  Il s'agit du premier de deux projets impliquant une carte Arduino.  Le fichier de code Arduino est offert en ligne sur le site des éditions Eyrolles, mais le livre ne comporte aucune information sur son fonctionnement, la programmation en C étant considérée comme trop compliquée pour le lecteur débutant.

Finalement, le robot martien se veut une réplique du Mars Pathfinder.  C'est une plate-forme à 6 roues, contrôlable par smartphone par l'intermédiaire d'un Romeo BLE all-in-one de DFRobot (compatible Arduino).  Il comporte un faux panneau solaire, qui est purement décoratif!

En bref, il s'agit d'un bon livre pour un jeune qui veut faire ses tous premiers pas en robotique: les instructions sont claires et détaillées, les photographies sont nombreuses, les projets sont variés et présentés en ordre croissant de difficulté.  Il est toutefois important de remarquer que presque tous ces robots, quand ils n'ont pas un comportement aléatoire, sont conçus pour être contrôlés par un humain.  Ce livre ne vous apprendra pas comment fabriquer des robots autonomes, qui prennent leurs propres décisions en fonction des résultats tirés de leurs capteurs (il y a bien la catapulte automatique, mais il n'y a aucun robot suiveur de ligne ou éviteur d'obstacles, par exemple).


Yves Pelletier   (TwitterFacebook)


lundi 23 avril 2018

Livre: Arduino, S'exercer au prototypage électronique

Arduino
S'exercer au prototypage électronique
(10 projets créatifs à réaliser soi-même)
par Cédric Doutriaux
Éditions ENI (collection La Fabrique), 2017
298 pages

Une première qualité de ce livre, c'est qu'il s'adresse à des gens qui ont déjà une petite expérience de l'Arduino (car, admettons-le, nous n'avons pas vraiment besoin d'un autre livre qui consacrerait des dizaines de pages à l'installation de l'IDE et à la mise à l'essai de l'exemple "blink"!).

Nul besoin d'être un expert, toutefois, pour apprécier les 10 projets présentés dans cet ouvrage, car ils sont tous expliqués clairement, et de façon détaillée.  Ainsi, on vous guidera dans la fabrication d'un synthétiseur thérémine, d'un jeu de mémorisation musicale, d'un petit système d'arrosage automatique, d'un oscilloscope minimaliste, d'un robot suiveur de ligne, d'une lampe multicolore contrôlable via bluetooth, d'une station météo consultable par wi-fi, d'un télémètre à ultrasons, d'un robot hexapode capable d'éviter les obstacles et, finalement, d'un affichage "POV" (persistance rétinienne) monté sur une roue de vélo.

Bien sûr, il est possible de trouver de nombreuses variantes de tous ces projets sur internet.  Mais un aspect qui m'a semblé très intéressant, c'est que l'auteur ne se contente pas de nous présenter le code de la version finale du programme; il nous guide plutôt dans un processus qui consiste à coder une première version du programme et à vérifier son fonctionnement correct avant d'ajouter des fonctionnalités supplémentaires.  Par exemple, dans le jeu de mémorisation musicale, on commence par produire un sketch qui joue une mélodie.  Après avoir vérifié que tout fonctionne convenablement, on ajoute la partie qui enregistre la séquence de boutons actionnés et la compare avec la bonne réponse.  Finalement, on ajoute une fonction qui génère des nouvelles mélodies.
Je pense qu'il s'agit d'une bonne façon de faire acquérir au lecteur une méthode de travail qui lui sera utile lorsqu'il voudra concevoir ses propres projets.

Yves Pelletier   (TwitterFacebook)

vendredi 30 mars 2018

Forums de discussion en français sur l'électronique et les microcontrôleurs


Je ne suis pas un habitué des forums de discussion.  Quand je m'y aventure, c'est généralement parce qu'une recherche par mots clés dans Google m'y a entraîné (et là, je suis bien d'accord: quand on cherche une information, il y a presque toujours quelqu'un qui a posé la question avant nous dans un forum de discussion).  Mais voilà: puisque je parviens généralement à trouver l'information désirée par une recherche dans Google, il m'arrive rarement de poser une question dans un forum.

Les forums de discussion pourraient probablement servir de base à d'intéressantes recherches en sociologie: on y retrouve des gens qui n'ont fait aucun effort pour se documenter, et qui espèrent que quelqu'un fera tout le travail à leur place; il y a ceux qui demandent pourquoi ce qu'ils ont fait n'a pas fonctionné, sans juger utile d'expliquer ce qu'ils ont fait; il y a ceux qui prennent plaisir à répondre de façon condescendante et à humilier ceux qui posent des questions trop naïves, et ceux qui n'y connaissent rien, mais qui répondent quand même...   Heureusement, on y trouve aussi (et surtout) des questions clairement formulées, suivies de réponses pertinentes et instructives.

Avant d'envoyer votre premier message, prenez toujours la peine de lire les règles du forum, effectuez préalablement une recherche pour vous assurer que votre problème n'a pas déjà été résolu dans une discussion précédente, et expliquez clairement ce que vous avez fait et ce qui ne fonctionne pas (en incluant les schémas de circuits, programmes, etc).  Si vous ne vous donnez pas la peine d'être clair, pourquoi des inconnus voudraient-ils avoir envie de vous répondre?

Tentons donc d'établir un petit répertoire des forums de discussion en français, consacrés à l'électronique et aux microcontrôleurs.  Si vous connaissez un bon forum qui n'apparaît pas dans cette liste, n'hésitez pas à nous en faire part dans la section "commentaires", ci-dessous.


Forums sur l'électronique en général

ABC Électronique


Depuis 2005, plus de 50 000 discussions portant sur l'électronique.  Si vous désirez de l'information sur la réparation d'un appareil, visitez plutôt le forum de dépannage.   Avant de publier un premier message, assurez-vous de consulter les règles du forum.


Forum d'électronique de Futura-Sciences


Un gros forum très, très fréquenté, dans lequel on retrouve un nombre incalculable de discussions portant sur l'électronique en général (y compris les microcontrôleurs).  Par contre, tel que spécifié dans les règles du forum,  les questions concernant la réparation d'appareils électroménagers doivent plutôt être dirigées dans le forum dédié à cette fin.  Notez aussi l'existence du forum Projets électroniques, qui sert à...la présentation de projets électroniques.

Forum d'Elektor


Le magazine d'électronique a son forum de discussion: plus de 41 000 messages dans 4000 discussion, incluant une catégorie "Mon circuit marche" et une catégorie "Mon circuit ne marche pas (encore)".  Et je ne parle ici que des forums généraux, car il y a également une partie consacrée aux discussions sur les articles publiés dans la revue!

Mentionnons rapidement quelques forums tout aussi généralistes que les précédents, mais plus modestes: Électro-bidouilleur,  BricotroniqueForum lelectroniqueHardware.fr, Elekronique.

 Forums plus spécialisés

Forum Arduino


La partie francophone du forum hébergé sur le site officiel arduino.cc est très fréquentée: près de 200 000 interventions réparties sur 20 000 discussions depuis janvier 2011.  C'est l'endroit incontournable où aller lorsque vous avez une question pour un projet impliquant une carte Arduino.  Au minimum, votre question sera visionnée par quelques dizaines de personnes, et elle recevra très probablement au moins une réponse.  Pour cette raison, je vois mal pourquoi quelqu'un choisirait de poser à un autre endroit une question concernant l'Arduino.  Évidemment, avant d'y publier quoi que ce soit, prenez le temps de bien lire les règles et apprenez à utiliser les balises de code...

Forum Framboise314


Le forum de discussion sur le Rasbperry Pi associé au site de François Mocq n'existe que depuis 2014, mais 2918 membres y ont malgré tout publié 26215 messages répartis sur 4248 sujets.  Le domaine étant très vaste, les subdivisions sont nombreuses, ce qui permet aux adeptes de domotique de ne pas embêter les fanatiques de retro gaming.   Un incontournable, bien sûr.

Forum Rasbpian France


Un autre bon forum sur le Raspberry Pi, avec moins de catégories différentes que sur le forum de Framboise 314 (ce qui est un peu normal, puisqu'on se limite à un seul système d'exploitation). Il y a des nouveaux messages tous les jours.  Vous pouvez lire les règles ici.


Fantaspic


Je n'ai découvert que très récemment ce forum consacré à la programmation de microcontrôleurs PIC, démarré en juillet 2015.  535 membres inscrits, 8643 messages répartis sur 590 sujets.  Vous y trouverez des tutoriels, une section réservée à chaque langage de programmation (C, assembleur, basic, pascal), etc.  N'oubliez pas de consulter les règles du forum.

Forum Pinguino


Pinguino est un projet inspiré d'Arduino, mais impliquant des cartes munies d'un microcontrôleur PIC.  Le forum hébergé sur le site officiel pinguino.cc comporte un volet en français depuis 2011 (les règles sont en anglais, toutefois).  530 messages, répartis sur 75 discussions.  L'activité y est très faible: au moment où j'écris ces lignes, le message le plus récent date de quelques mois, mais a quand même été visionné 600 fois.  J'ai l'impression que le projet est sur son déclin, malheureusement.

Yves Pelletier   (TwitterFacebook)

samedi 10 mars 2018

Livre: À l'aventure avec Arduino


À l'aventure avec Arduino
par Becky Stewart
Collection Pour les kids
Éditions Eyrolles
340 pages
2015

La particularité de ce livre d'initiation à l'Arduino, c'est qu'il s'adresse à des lecteurs âgés entre 10 et 15 ans.  Je précise donc tout de suite que 35 années me séparent du public cible (mes trois enfants en font partie, par contre).

En quoi un livre sur Arduino destiné aux jeunes adolescents diffère-t-il d'un livre sur Arduino destiné aux adultes?
  • On tutoie le lecteur.
  • Les mises en garde de sécurité sont fréquentes.
  • En plus du codage et de la réalisation d'un circuit électronique, les projets comportent tous une bonne part de bricolage impliquant du carton, de la colle et des ciseaux.
Ce livre est particulièrement efficace, à mon avis, dans sa façon de proposer la fabrication de bidules inhabituels comportant un circuit électronique relativement simple: un panneau d'affichage qui illumine le message de votre choix, un coffre-fort à combinaison dont le couvercle s'ouvre tout seul si vous placez les 3 potentiomètres dans la bonne position, un carillon à vent qui produit des sons synthétiques lorsque ses grelots conducteurs entrent en contact, un labyrinthe à bille, etc.

Pendant la réalisation de ces projets, en plus d'apprendre les principes de base de la programmation, les jeunes auront l'occasion d'utiliser des LEDs, un servomoteur, un élément piézoélectrique, un registre à décalage...  Sans transformer votre enfant en ingénieur diplômé, on dépasse nettement le circuit où une petite lumière s'allume lorsqu'on appuie sur un bouton.

Puisque le livre s'adresse à une génération dont le premier réflexe est de se documenter sur Youtube sous prétexte que 30 images par secondes valent...heu...30 000 mots par seconde, je ne suis pas certain qu'une description de ce genre soit optimale:  "Insère l'un des fils de la résistance dans une rangée courte de la moitié haute de ta plaque, vers le bord gauche. Insère l'autre fil dans la rangée courte en face de la précédente, dans la partie basse de la plaque."  Heureusement, de nombreux schémas Fritzing rendent superflues ces longues descriptions.

Le plupart des sketches du livre sont présentés en deux versions distinctes: une version en français (commentaires et noms de variable en  français) et la version originale en anglais (commentaires et noms de variable en anglais).  J'ai beau chercher, la pertinence de présenter la version en anglais m'échappe totalement.

Et pendant qu'on parle de français et d'anglais, j'aurais quelques commentaires négatifs à formuler... Le traducteur explique son choix de conserver la plupart des recommandations de lecture de l'édition originale, c'est à dire en anglais.  "Malheureusement, les sources d'informations les plus à jour et les plus complètes sont presque toujours dans la langue de Shakespeare..." et "En plus, cela améliorera ton niveau en anglais".

!!!

Je sais que je ne suis pas tout à fait neutre, mais...il existe des tas d'excellentes ressources sur l'Arduino en français sur le web!  Comment peut-on proposer la consultation de DIY Drones (site anglophone n'ayant pas grand chose à voir avec le sujet du livre) et se contenter de citer deux uniques blogs en français (le blog de MC Hobby, qui est effectivement excellent, et le défunt TutoArduino, qui l'était moins)?  Comment peut-on proposer des vidéos en anglais sur Youtube et ne pas remarquer qu'il en existe une énorme quantité sur les mêmes sujets qui sont en français?  Et pourquoi recommander la lecture de Getting Started With Arduino, par Massimo Banzi dans sa version anglaise, alors que sa traduction française "Démarrez avec Arduino" en est à sa 3e édition?  Même dans la description du site officiel arduino.cc, le forum en français n'est mentionné qu'en dernier recours, en cas de "difficultés avec la langue anglaise"!

Malgré cette préoccupante négation d'une communauté francophone de pasionnés de l'Arduino, il me semble que ce livre atteint correctement son but.  Bien sûr, vous pouvez également opter pour la version originale anglaise publiée chez Wiley, puisque "ça améliorera ton niveau en anglais"... 😉

Yves Pelletier   (TwitterFacebook)

lundi 5 mars 2018

digitalRead(): où se situe la frontière entre LOW et HIGH?

Une des premières choses qu'on apprend lorsqu'on s'initie à l'Arduino, c'est que la fonction digitalRead() retourne 0 lorsque l'entrée numérique qui lui est associée est soumise à une tension nulle, et 1 lorsque l'entrée numérique est soumise à une tension de 5 V.  Mais qu'arrive-t-il si la tension de cette entrée numérique se situe quelque part entre 0 et 5 V?  Quelle valeur de tension constitue la frontière entre 0 et 1?

On peut trouver la réponse dans la fiche technique du mircontrôleur Atmega 328, qui est à la base de l'Arduino Uno.  Si vous avez en tête une fiche technique de moins de 10 pages comme celles qui accompagnent les transistors ou les amplificateurs opérationnels, détrompez-vous: les fiches techniques des microcontrôleurs sont beaucoup plus volumineuses (442 pages dans le cas de notre Atmega 328).

À la page 365, dans la section 32.2 intitulée "Common DC Characteristics", on peut voir les informations reproduites ci-dessous:


VIL (pour "voltage input low") représente la plus grande tension d'entrée qui sera, de façon certaine, interprétée comme un signal logique bas.  Pour une tension d'alimentation de 5 V, le tableau indique une valeur correspondant à 0,3*Vcc, c'est à dire 1,5 V.

VIH (pour "voltage input high") représente la plus petite tension d'entrée qui sera, de façon certaine, interprétée comme un signal logique haut. Pour une tension d'alimentation de 5 V, le tableau indique 0,6*Vcc, donc 3 V.

Le fabricant s'engage donc à ce que tous les microcontrôleurs qui sortent de son usine interprètent comme "bas" un signal d'entrée de 1,5 V ou moins, et interprètent comme "haut" un signal d'entrée de 3 V ou plus.

Il s'agit d'une bonne chose si vous devez brancher à l'Arduino un capteur qui utilise un niveau logique de 3,3 V: cette tension de 3,3 V sera correctement interprétée par l'Arduino comme un signal logique haut, même s'il est significativement inférieur à 5 V.

Mais qu'arrive-t-il si le signal d'entrée se situe entre 1,5 V et 3 V?  Vous vous retrouvez alors à l'extérieur de la zone garantie par le fabricant.   Les résultats pourraient donc être différent pour deux cartes Arduino Uno en apparence identiques entre elles.

Par curiosité, j'ai mesuré la tension de seuil pour quelques-unes de mes cartes Arduino.  J'ai utilisé le montage illustré ci-dessous:  une tension pouvant varier de 0 à 5 V grâce à un potentiomètre est acheminée à la fois à l'entrée numérique dont je désire mesurer la tension de seuil, et à une entrée analogique qui nous sert de voltmètre.


Le sketch ci-dessous permet d'afficher dans le moniteur série la tension correspondant à chaque changement d'état de l'entrée numérique (il faut, bien sûr, faire varier la tension en tournant lentement le potentiomètre).




Voici les résultats pour la broche 5 d'une de mes cartes.


On peut remarquer une petite hystérésis: lorsque le niveau initialement bas, il devient haut lorsque la tension atteint 2,55 V.  Par contre, si le niveau est initialement haut, il doit descendre à 2,23 V pour devenir un niveau bas.  En d'autres mots, le niveau logique ne change pas d'état lorsque la tension se situe entre 2,24 V et 2,54 V.

Sans surprise,  ces résultats respectent très facilement les valeurs minimales garanties dans la fiche technique.

J'ai effectué des mesures sur 5 cartes différentes, des clones chinois achetés de vendeurs différents à des moments différents, et je n'ai observé que de très faibles variations d'un carte à l'autre.


On peut voir que pour l'ensemble des 5 cartes testées, la tension nécessaire pour passer de l'état "bas" à l'état "haut" n'est pas très éloignée de 2,55 V, alors que la tension qui permet de passer de l'état "haut" à l'état "bas" se situe quelque part entre 2,20 et 2,25 V.

Je m'attendais à une assez forte dépendance à la température mais, après avoir laissé une carte au congélateur pendant plusieurs minutes (de façon à ce qu'elle devienne très froide), les résultats sont demeurés très similaires.

Yves Pelletier   (TwitterFacebook)

dimanche 25 février 2018

Communication RF 433 MHz entre ATTiny85 et Arduino

Je vous propose aujourd'hui un petit projet consistant à transmettre à une carte Arduino la mesure d'un capteur analogique branché à un ATTiny85, au moyen d'un signal radio de 433 MHz.  Si vous le désirez, vous pouvez utiliser les principes exposés dans ce billet pour mettre en place un réseau constitué de plusieurs capteurs satellites peu coûteux qui communiquent leurs données à un seul Arduino.

Si vous préférez, vous pouvez également utiliser les informations présentées ici pour créer une communication entre deux ATTiny85, ou entre deux cartes Arduino.

Matériel nécessaire pour faire cette activité: une paire émetteur/récepteur 433 MHz, une carte Arduino, un ATTiny85 (avec une alimentation et ce qu'il faut pour le programmer). et un potentiomètre qui tiendra lieu de capteur.



Installation de la bibliothèque Manchester

Le sketch que je vous propose pour l'émetteur et pour le récepteur nécessitent tous deux la bibliothèque Manchester, que vous devrez donc installer dans votre IDE Arduino.

Deux fichiers d'exemple sont fournis avec la bibliothèque: "ManchesterRX_Array-unfixed_length" et "ManchesterTX_Array-unfixed_length".  Ces deux sketches fonctionnent très bien (ils ont d'ailleurs servi de fondation aux sketches que je vous propose ci-dessous), mais pour obtenir de bons résultats, j'ai dû supprimer l'appel à la routine "man.workAround1MhzTinyCore()" dans le sketch de l'émetteur et diminuer la vitesse de la communication (2400 plutôt que 9600).

Sketch de l'émetteur (pour l'ATTiny85)

Voici le sketch destiné à l'ATTiny85.  Au besoin, vous pouvez vous référer à ce précédent billet qui explique comment programmer l'ATTiny avec l'IDE Arduino et une carte Arduino Uno.  Comme d'habitude, j'ai utilisé le noyau de David A. Mellis.

Le sketch est plutôt simple: une fois par seconde, l'ATTiny enverra, par l'entremise de l'émetteur RF, un message constitué de 4 octets: le premier octet contient la taille du message, et le deuxième octet contient le numéro de l'émetteur (qui n'a aucune utilité si votre carte Arduino ne reçoit des messages qu'en provenance d'un seul ATTiny, mais qui pourrait s'avérer essentiel pour distinguer plusieurs ATTiny émetteurs l'un de l'autre).

Les deux autres octets contiennent la lecture analogique que nous désirons transmettre.  Puisque le convertisseur analogique-numérique de l'ATTiny produit des valeurs à 10 bits, la lecture du potentiomètre doit être distribuée sur deux octets distincts, grâce aux fonctions highByte et lowByte (l'Arduino récepteur s'occupera de les fusionner lors de la réception).



Sketch du récepteur (pour la carte Arduino)

Rien de très complexe de ce côté non plus, puisque c'est la bibliothèque Manchester qui effectue le sale boulot: chaque fois qu'un message est reçu, il est affiché sur le moniteur série.



Circuit de l'émetteur (ATTiny85)

Une LED indicatrice est branchée à la pin 0, l'émetteur est branché à la pin 1, et le potentiomètre est branché à la pin 2 de l'ATTiny85, tel qu'indiqué sur le schéma ci-dessous.
La LED n'est pas obligatoire;  elle change d'état chaque fois qu'un message est envoyé, ce qui peut être utile pour savoir si votre ATTiny est actif ou non.



Circuit du récepteur

Le récepteur est connecté à la broche 4 de l'Arduino.  C'est la LED intégrée à la carte qui change d'état pour indiquer la réception d'un message.



Résultats

Toutes les secondes, l'ATTiny mesure la position du potentiomètre et envoie le résultat à l'Arduino. Sur réception d'un message, l'Arduino l'affiche dans le moniteur série.  Lorsque vous tournez le potentiomètre, la valeur transmise est modifiée.


Et ensuite?

Vous trouverez ici d'autres projets impliquant l'ATTiny85.  En ce qui concerne les émetteurs et récepteurs RF 433 MHz, vous serez peut-être intéressé par ce projet impliquant deux cartes Arduino, ou celui qui établit une communication entre Arduino et Raspberry Pi.

Yves Pelletier   (TwitterFacebook)
Related Posts Plugin for WordPress, Blogger...