De retour avec un circuit imprimé custom
Posted on dim. 05 novembre 2023 in Datalogging, Arduino
Ça fait un moment que j’ai pas donné de nouvelles de ce projet… Qui est tombé aux oubliettes pendant plus d’un mois, il faut bien l’avouer. La partie software était bien avancée, quasiment terminée même, mais j’ai rencontré quelques soucis avec la partie matérielle.
Pourquoi un PCB ?¶
Le montage sur breadboard, c’est bien, ça permet de tester le fonctionnement du circuit, mais c’est du provisoire. Pour pouvoir installer mon logger « en dur », il me faut quelque chose de plus durable. Et là, l’option de base qui s’offre au « maker » dans le domaine du DIY, c’est le montage sur perfboard/stripboard.
J’ai d’abord commencé à monter mon circuit sur une perfboard. C’est un peu long, pas très esthétique, mais c’est surtout pas pratique pour les « rails » (comme les rails d’alimentation ou de GND). J’ai oublié 2-3 jonctions, ça ne fonctionnait pas comme prévu… Bref, ça m’a un peu démotivé.
Mais comme j’avais un schéma électronique de mon dispositif, je me suis dit qu’après tout pourquoi pas essayer d’en faire un circuit imprimé (ou PCB, pour Printed Circuit Board) ? La première version est simpliste, et réutilise les modules dont je dispose déjà. La raison est simple : je n’ai ainsi pas besoin de sourcer les composants principaux individuels (la RTC, le microcontrôleur…), et encore moins tous les composants annexes (résistances, condensateurs, régulateurs…). À la place, j’ai juste à placer des headers avec le bon pas, et à les relier les uns aux autres.
Le PCB sur le papier¶
J’ai réalisé le schéma et le plan du PCB avec Kicad version 7. La commande a été passée le 05/11 auprès d’un fabricant chinois. Rendez-vous d’ici une quinzaine de jours pour la réception !
Vous remarquerez qu’il y a un emplacement pour un terminal supplémentaire, appelé « Temp ». C’est pour accueillir un capteur de température analogique. Pour le projet actuel ce n’est pas une nécessité absolue, mais j’aime bien avoir une lecture de la température ambiante en parallèle des mesures de déplacement. Ça me permet de corriger les effets liés à ces variations de température lorsque j’analyse les données. Ici je pars sur un DS18B20, choix déterminé par… le fait que j’en possède un. Je réutilise les composants que j’ai à disposition. La précision annoncée n’est pas terrible pour qui veut un suivi au dixième de degré près, mais pour notre projet de suivi de fissure ça sera amplement suffisant.
Le DS18B20 est un capteur numérique, c’est à dire que le signal qu’il renvoie est une suite de 0 et de 1 encodant une valeur qui a été mesurée et convertie dans le bloc capteur. Le protocole utilisé par ce capteur est le 1-Wire qui, comme son nom l’indique, communique sur un seul fil. Ces communications sur un fil sont bidirectionnelles (à contrario, par exemple, du RS-232 qui utilise un fil pour envoyer les données et un second pour les recevoir).
Le PCB en vrai !¶
Ça y est, ma commande est arrivée 10 jours après l’avoir placée ! Il est temps de déballer tout ça.
À quoi ça ressemble ?¶
Le résultat est franchement propre ! En terme d’encombrement, on est plutôt bons, le circuit prend peu de place, mais je remarque déjà trois problèmes liés à mon design.
- La taille du PCB est tout juste inférieure à celle d’un shield pour Arduino UNO. En anticipant un peu, j’aurais pu faire un PCB qui puisse s’adapter autant sur un UNO qu’accueillir un Nano…
- Les broches J1 et J2 sont trop proches, en l’état le module SD et la RTC se gênent… Je vais devoir modifier les connecteurs de l’un ou l’autre des modules pour que ça passe.
- Et enfin, il j’ai oublié de rajouter la résistance de pullup entre VCC et le signal du capteur de température. Il faudra que je la rajoute au niveau du connecteur.
En résumé, si je veux en faire une seconde version, il faudrait que j’adopte la forme d’un shield pour Arduino UNO, et que je prenne garde à bien espacer les différents éléments. Pour ce premier jet, néanmoins, ça devrait passer.
Est-ce que ça fonctionne ?¶
Maintenant qu’il est assemblé, il n’y a plus qu’à tester ! Pour ça, je choisis de procéder par étapes, en revenant à des sketches plus simples. En premier lieu, tester la mesure analogique : ça fonctionne. Si j’essaie le sketch complet, en revanche, ça ne fonctionne pas… À priori, j’aurais inversé les lignes SCL et SDA de la RTC, donc ça coince, il va falloir opérer…
Autre petit souci, j'ai également connecté l'alimentation du fissuromètre avec le pin Vin de l'Arduino, et non le pin 5 V. Or, je ne sais pas pourquoi, mais la tension sur ce pin n'est pas tout à fait égale à 5 V — et en tous cas pas égale à la tension de référence de l'ADC — donc la valeur lue et convertie ne correspond pas à l'ouverture réelle du capteur (l'ADC me renvoie une valeur max avant conversion de 890).
Partant de là, j'ai deux options : soit adapter mon code pour modifier l'échelle de référence (au lieu de convertir une valeur issue de l'ADC de 0 à 1 203, je convertis entre 0 et 890), soit modifier mon circuit. Comme je dois déjà le modifier pour inverser SCL et SDA, autant modifier aussi l'alimentation du capteur.
Le bricolage est assez simple : avec un cutter, il faut entailler les traces fautives de manière à enlever le cuivre conducteur. Ensuite, avec un peu de fil et un fer à souder, on recrée les bonnes liaisons.
Une fois que ce bricolage est fait, le dispositif fonctionne normalement. Il ne me reste plus qu'à l'installer et à mesurer, on se retrouve dans un prochain post pour les résultats !
Une suite ?¶
Comme je l’ai dit plus haut, ce PCB utilise les modules pré-construits dont je dispose. Maintenant qu’on a testé et que ça fonctionne, je peux envisager 2 évolutions : * reprendre les composants de ces modules, et refaire un PCB pour les utiliser directement ou ; * faire un PCB avec des composants équivalents (une RTC, un microcontrôleur…) mais plus optimisés (par exemple avec une consommation électrique moins importante).
Les fichiers du projet¶
Une archive du projet, corrigé du défaut du swap SDA/SCL et de l'alimentation analogique, est téléchargeable ici.