Tuer un serveur de production en deux clics

Si je chope le gros malin qui a eu l’idée de faire apparaître la carte réseau comme périphérique USB amovible sur Windows Server 2012, je le plume.

  • Le premier clic malencontreux fait apparaitre la liste des périphériques amovibles au lieu du task manager;

  • Le deuxième déconnecte la carte réseau sans poser la moindre question.

Alors d’accord, je vise mal, je clique trop vite, tout ça, mais quand même…

Au passage, WordPress commence à me les briser avec ses erreurs d’upload d’images.

[Tuto] Programmation non bloquante pour Arduino & Co

  • Nico! C’est quoi le programme du jour ?
  • Heu… T’es sûr de vouloir le savoir?
  • Bah oui, ça fait trop longtemps, j’en peux plus d’attendre!
  • Ok, alors si on parlait Arduino et temps réel? Je vais te montrer comment on programme des événements récurrents de façon non bloquante!

Une petite contextualisation me semble nécessaire. En ce moment je travaille sur une interface MIDI, pour synchroniser un microcontrôleur (Teensy) avec des instruments de musique. Pour la faire courte, la Teensy va donner un tempo en BPM, et les instruments MIDI vont se caler dessus.

La Teensy est géniale dans ce contexte, parce qu’elle peut se faire passer pour un périphérique MIDI standard et son API dispose de toute une batterie de fonctions pour envoyer des instructions MIDI à qui veut bien les écouter.

Mais pour l’instant, pas besoin de rentrer dans le protocole d’horloge midi, on va se contenter d’afficher du texte dans le moniteur série, et après si vous êtes sages, on fera clignoter des LEDs. Houlala, mais quel programme trépidant!

1. Approche naïve pour gérer un événement récurrent

Si vous êtes en train de lire ceci, il y a de forte chances pour que vous ayez testé votre première Arduino avec l’exemple blink.

Rien de choquant, on est tous passé par là :).

Affichons plutôt des messages, ce sera plus pratique pour la suite:

Si j’ai maintenant envie d’afficher « Paf » toutes les 500ms et « Pif » toutes les 3 secondes… Comment faire?
On pourrait utiliser un compteur, mettre un delay(500), à chaque tour afficher Paf, et tous les 6 tours afficher Pif.

Ça peut vite devenir très compliqué l’histoire. Et d’autant plus que pendant l’appel à delay(), il ne se passe rien, le programme est bloqué pendant 500ms.
C’est la méga-cagade si on doit faire d’autres traitements en parallèle (lecture d’entrées, affichage…).

2. Approche non bloquante

Pour remédier à cela, on doit avoir une approche non bloquante, basée sur l’heure actuelle (ou plus précisément sur le nombre de millisecondes (ou microsecondes) écoulées depuis le démarrage du programme).
On va utiliser les fonction millis() ou micros(), selon la précision désirée (respectivement à la milliseconde ou à la microseconde près).

L’exemple proposé dans l’IDE Arduino est BlinkWithoutDelay, et on peut l’adapter ainsi pour notre exemple:

Dans ce cas, à chaque tour de loop(), on va regarder si la durée nécessaire est passée, et si ce n’est pas le cas on laisse filer (et du coup on peut faire autre chose plutôt que d’attendre bêtement).

3. Approche plus encapsulée

On est déjà bien mieux que dans le tout premier exemple, mais il y a des variables globales qui se baladent, des grosses conditions dans les if(), ce n’est pas encore très élégant.

Pour mon projet, j’ai encapsulé ce fonctionnement dans une classe C++ histoire de faciliter l’utilisation:

Pour reprendre notre exemple précédent, on aurait donc:

C’est plus léger. Plus de variables globales pour stocker des états dont on se fout royalement dans le programme principal.
Vous noterez que l’heure (ici en microsecondes) est lue une seule fois, puis passée en paramètre aux méthodes de test. Ça permet d’éviter des décalages de temps causés par l’exécution du code qui peut être « longue » (~100µs pour un analogRead() par exemple). En faisant comme ça, on travaille sur la même référence de temps pour toutes les opérations.

4. Application : Faire clignoter une LED de façon contrôlée et non bloquante

Je dis LED, mais le concept s’applique évidemment au contrôle de moteurs pas à pas, à l’envoi de signaux d’horloge MIDI, et que sais-je encore.

Voici l’interface de la classe :

Si je veux faire clignoter une LED à 3Hz, pendant 5 impulsions, il me suffit d’écrire:

Si je veux faire 3 clignotements à 5 Hz chaque seconde, il me suffit d’écrire le programme suivant:

Les deux projets sont dispo sur GitHub et dans les bibliothèques Arduino avec des exemples!

https://github.com/toxnico/DMTimer

https://github.com/toxnico/DMOscillator

Windows et les zip

[fort-agacement-on]

Pourquoi, POURQUOI?? Pourquoi compresser un répertoire avec la fonctionnalité standard de windows (envoyer vers/dossier compressé) est elle si longue???

Mais pire: pourquoi est-ce que la décompression est elle d’une durée infinie?

Putain, 7zip arrive à diviser le temps de décompression par… je ne sais même pas combien tellement c’est énorme.

[fort-agacement-off]

Capturer du son avec une Arduino Uno

Je vous ai déjà parlé de ma femme?

Bon. Après la chute des dominos, elle veut maintenant photographier un ballon de baudruche qui explose, en projetant de la farine qu’on aura préalablement introduite dans le ballon susmentionné. Je ne me prononcerai pas, car je suis assez mal placé pour juger de la folie des gens. Je vais d’ailleurs le prouver sous peu… Non, et puis ça peut quand même avoir un chouette rendu, ce ballon!

Et du coup, j’ai commencé à bricoler avec un micro à électret, pour voir comment je pouvais récupérer le signal sur une Arduino. De fil en aiguille, j’ai fini par carrément enregistrer un fichier son à partir du montage. Qui parlait de folie?

1. Connecter un micro à électret

Voici comment ça se passe. Comme d’hab, s’il y a des électroniciens (des vrais) dans la salle, j’attends les conseils avisés… Je ne suis pas du tout expert dans le domaine.

A l’oscilloscope, on peut voir qu’en soufflant dans le micro, on obtient un pic à environ 0.1V, ce qui est trop peu pour être traité par l’ADC de Arduino. Nous devons donc…

2. Amplifier le signal du micro

Rhooo mais quelle transition!

Pour l’amplification, j’ai pensé à un bête transistor; mais je recherche surtout un gain en tension, donc j’ai opté pour un petit amplificateur opérationnel, le LM358.

Les attentifs verront que RF=320k, alors que par la suite je parle de 220k. Vous referiez une capture, vous?

Selon la fiche technique du LM358, la tension maximale de sortie est égale à la tension d’alimentation moins 1.5v. Dans mon cas, la tension d’alimentation étant de 5v, je peux espérer un maximum de 3.5v en sortie.

Dans ce montage en mode inverseur, le gain en tension est égal à RF/RI, soit 220/4.7 = 47. Donc un pic à 0.1v à l’entrée ressortirait à 4.7v. Sauf qu’en vrai, on l’a vu, il sera plafonné à 3.5v environ. Mais pour la démo, on s’en fout en fait.

3. Acquérir le signal sur l’Arduino et le retransmettre à un PC par le port série

Alors maintenant, l’idée est de lire le signal de sortie de l’ampli, et de le resservir au PC pour construire un semblant de fichier son, brut de brut.

La première étape consiste donc écrire un petit programme pour l’Arduino, qui lit la valeur du signal à intervalles réguliers (4KHz) et les rebalance aussitôt à travers le port série.

J’ai décidé de brider à 4KHz, parce qu’une lecture avec analogRead(9) prend un temps non négligeable: 100 microsecondes.

Pour être large, une mesure toutes les 250μs, c’est bon. Et c’est de toute façon bien plus rapide que de trouver comment faire un μ sur un clavier suisse.

4. Lire les valeurs brutes depuis le port série du PC, et les enregistrer dans un fichier

Tout est dans le titre. Un peu de python fera l’affaire

Fonctionnement: on démarre le programme, on braille « Ah! Ah! Ah! » (ou une bonne vieille exclamation si chère à Gilles de la Tourette) dans le micro, et on quitte avec Ctrl+C. Il en ressort un fichier output.raw

5. Importer le fichier raw dans Audacity

Je vous préviens d’abord, le son est tout à fait crado.

Il faut préalablement installer Audacity.

Démarrer Audacity, et aller dans Fichier>Importer>Données brutes(Raw).

Sélectionner le fichier créé au point 4.

  • Fréquence d’échantillonnage : 4000Hz.
  • Encodage: Unsigned 8 bits PCM.
  • 1 canal.

6. Écouter l’horreur

AAAhkssssshhhAAHkkssshhhLAPINksshhhhCULssshhh

Inception informatique

Ce soir, je suis allé plus profond que jamais. Il fallait que je fasse une petite maintenance sur un serveur depuis la maison. En suivant ces couches successives:

  • Linux Mint (natif)
  • Windows 7 (virtualbox)
  • Windows 7 du bureau (Teamviewer)
  • Windows 7 du client (Citrix)
  • Windows 2012 server (RDP)

A la fin de l’intervention, pour rire, j’ai copié du texte depuis mon linux et j’ai fait un ctrl+v dans un bloc notes du serveur.
Hé ben ça a marché.

Utiliser F-Engrave pour usiner des poches avec une fraise droite

Un lecteur m’a contacté il y a quelques semaines pour savoir comment usiner des poches toutes simples avec F-Engrave. Vaste question, puisque je n’en avais aucune idée! En cherchant, on a réussi à trouver la solution (spoiler : il faut le faire en deux étapes). L’ami Hurlubier a eu la bonne idée d’écrire un petit tuto pour expliquer comment procéder. Alors Hurlubier, c’est à toi de parler, je te passe le micro!


Pour arriver au résultat ci-dessous, j’ai pas mal galéré (je remercie Dirty Marmotte pour son aide précieuse).

En effet, malgré que j’utilise une fraise droite, il faut utiliser le module de V-carving.
De plus, l’opération se fait en deux fois : d’abord la gravure du contour, puis le débouchage (cleanup dans le texte).

Paramètres de l’écran principal:

Dans Text Font Properties les éléments de description de mon texte.
Dans Gcode Properties:

  • Feed Rate 400mm/min je pense qu’on peut aller plus vite, selon la fraiseuse.
  • Plunge Rate Je suis passé à 200mm/min ce qui semble acceptable.
  • Z Safe Indique la hauteur de relevage de la fraise par rapport au plan de l’objet lors des déplacements. La valeur par défaut est très élevée, et c’est donc très long (quand la CNC relève la fraise, elle ne fait que cela). Je suis donc passé à 3mm ce qui laisse une bonne marge contre l’accrochage, est est assez rapide.
  • Engrave Depth Profondeur de la gravure. Ne sert normalement que pour la gravure en mode « Engrave », je l’ai fixé à ma profondeur maxi (2.5mm) par sécurité.
    Nota : cette option n’est accessible que quand le bouton « Engrave » est sélectionné. Quand on passe en mode « V-Carve », la valeur est grisée, et on ne peut la modifier.

Paramètres de l’écran V-Carve:

  • Straight correspond au type de la fraise utilisée.
  • Straight Bit Diameter Diamètre de la fraise installée.
  • Cut Depth Limit Profondeur totale de la gravure.
    Le champ du dessous est le rappel de la profondeur que nous avions déterminé dans l’écran précédent et qui n’est plus accessible.
  • Sub Step Length valeur par défaut.
  • V-Carve finish Pass Stock Profondeur de la dernière passe, dans la capture d’écran, nous avons 1mm ce qui est une valeur aberrante, la passe de finition devant être légère, plutôt 0.3mm.
    Cette valeur dit être renseignée pour graver en plusieurs passes.
  • V-Carve Max Depth Per Pass dans notre cas 0.5mm ce qui fera 5 passes pour une profondeur de 2.5mm.
  • Cleanup Cut Diameter diamètre de la fraise utilisée pour le nettoyage (dans notre cas, ce devrait être le même que pour le détourage).
  • Cleanup Cut Step Over pourcentage de recouvrement des trajectoires de la fraise. J’ai laissé 50%, mais on peur diminuer le pourcentage pour accélérer le processus.
    Les paramètres non décrits ne m’ont pas servi.

Mode opératoire:

  1. Depuis l’écran cliquer sur le bouton Calc V-Carve, puis du menu file cliquer sur Save G-Code.
    Le fichier généré sera celui du détourage.

  2. Depuis l’écran V-Carve Settings cliquer sur Calculate Cleanup, puis sur Save Cleanup G-Code.
    Le fichier généré sera celui du nettoyage de l’intérieur des lettres.

Gravure:

  1. Lancer la gravure du fichier de détourage.
  2. Ramener la fraise au zéro.
  3. Lancer le fichier de nettoyage.
  4. Contempler votre œuvre.

Bonne gravure.
HURLUBIER


Merci Christophe, c’est vraiment cool d’avoir pris le temps d’écrire cette marche à suivre 🙂

J’espère qu’elle pourra vous être utile, et puisqu’on en est là, si vous avez envie de publier un article ici, il suffit de m’en parler!

Tests unitaires en C++

Monsieur Jourdain: Adieu Sganarelle, quoi de prévu pour aujourd’hui?

Sganarelle: Les tests unitaires.

Monsieur Jourdain: Ah… Mais vous êtes au courant que même si l’on sait que c’est bien, on n’aime pas faire ça…

Sganarelle: Ouais, mais là j’ai un argument choc: le développement sur microcontrôleurs!

Monsieur Jourdain: …

Ça annonce du lourd, n’est-ce pas?

J’ai eu très récemment besoin d’écrire une classe de pilotage de moteur pas à pas pour un microcontrôleur type Arduino (Teensy pour être exact, mais là n’est pas la question).

La classe en question doit gérer l’accélération et décélération du moteur en début et fin de mouvement.

Vous allez me dire, il existe déjà des bibliothèques pour ça. Hé bien oui, mais vous commencez à me connaitre, et j’étais très curieux de développer mon propre contrôleur de moteur. C’était d’ailleurs très instructif de se replonger dans les maths de terminale S pour calculer tout ce bordel; notamment réapprendre la notion d’intégrale pour calculer la distance parcourue pendant la durée du mouvement, avec une accélération et décélération constantes en début et fin de mouvement.

J’en ai aussi profité pour découvrir des outils mathématiques en ligne extrêmement pratiques, comme Desmos ça, c’est la courbe de vitesse par rapport au temps

En résumé, j’ai dû écrire une série de fonctions de calcul purement mathématiques pour calculer la durée d’accélération, le nombre de pas selon l’accélération et la vitesse max, ce genre de trucs.

J’aurais pu y aller empiriquement, et débugger avec des traces dans la console Arduino, à base de Serial.println(), mais franchement… franchement… C’est super relou de débugger sur ce genre de plateforme…

Alors dans un premier temps, j’ai écrit ces fonctions en Python (oui, je m’y suis mis et je kiffe pas mal), et comme Python dispose en standard d’un environnement de tests unitaires, c’était cool.

Puis, une fois mes fonctions validées en Python, je les ai transposées en C++ dans une classe statique. Mais là, c’est méga chiant, parce que les langages sont quand même très différents :/

J’ai cherché un environnement de tests unitaires en C++ (j’en avais de mauvais souvenirs en termes de dépendance, et c’est essentiellement pour ça que je suis passé par Python). Et j’ai trouvé la perle: Catch

C’est HYPER simple à mettre en place. Aucun héritage, ni nommage conventionnel à faire.
Juste UN fichier d’en-tête à inclure, et une syntaxe à la cool pour écrire les tests 🙂

Imaginons que j’aie à tester une classe qui permet d’effectuer des opérations très complexes, telles qu’ajouter deux nombres, calculer une puissance ou pire, diviser deux nombres (float).

Pour info, REQUIRE arrête l’exécution des tests en cas d’erreur, alors que CHECK indique l’erreur et continue avec les autres tests. Pour plus de détails (notamment sur l’approximation des nombres à virgule flottante), voir la documentation officielle.

Et qu’est-ce qu’il dit?

[Tuto FlatCAM] Fabrication d’un circuit imprimé: du fichier Gerber au fraisage

Voici l’article qui boucle la boucle, et que je voulais écrire depuis longtemps!
Nous allons fabriquer le circuit imprimé dessiné sous KiCAD lors des dernières sessions.

Voici les étapes qui vont nous mener à un circuit opérationnel:
1. Export du circuit au format Gerber (isolation, perçage et découpe)
2. Importation des fichiers Gerber dans FlatCAM
3. Traitement dans FlatCAM (miroir, manipulation de géométrie et export en G-Code)
4. Ouverture des fichiers G-Code dans bCNC, mise à zéro, mise à niveau automatique.(Hum, désolé, ça c’est pour plus tard)
5. Usinage

1. Export au format Gerber depuis KiCAD

Nous partirons de ce schéma:

Le format Gerber est le standard utilisé dans la production de circuits imprimés. Il contient la description des pistes, des textes, des perçages, et toutes les informations nécessaires à la fabrication du circuit.

Pour notre projet, nous allons exporter 3 fichier Gerber:
* Contour des pistes
* Perçages
* Contour du circuit (pour la découpe)

Cliquons sur le bouton

Comme je disais, nous n’exporterons que les pistes de la couche de cuivre (rouge, F.Cu) et les découpes (jaune, Edge.Cuts).

En haut, choisissons le répertoire de sortie, relatif au projet KiCAD (ici, gerber/), et cliquons sur le bouton [Plot] en bas de la fenêtre. Normalement, KiCAD nous a généré deux fichiers d’extension gbr.

Il ne nous reste plus que le fichier de perçage. Cliquons sur le bouton [Generate Drill File].

On va choisir le format Gerber, et les millimètres comme unité. Attention, ne pas cocher [Mirror Y Axis] !

Une fois que tout est prêt, cliquer sur [Drill File]

KiCAD a généré un fichier .drl dans notre répertoire, et c’est tout ce qu’il nous manquait! Nous pouvons passer à l’étape suivante 🙂

2. Import des fichiers Gerber dans FlatCAM

Si vous ne connaissez pas encore FlatCAM, c’est le bon moment!
C’est un programme très puissant, même s’il est parfois un peu buggé lorsqu’il s’agit de manipuler les géométries. Mais pas de panique, je vais vous expliquer.

FlatCAM, brut de décoffrage

Nous allons importer nos trois fichiers (deux gbr et un drl):
* File>Open Gerber, et sélectionner les deux fichiers gbr.
* File>Open Excellon, et sélectionner le fichier drl.

Et voici où nous en sommes:

Ok donc là, FlatCAM affiche nos fichiers Gerber. Nous allons maintenant les manipuler pour pouvoir générer du G-Code (oui, c’est le but, faut pas l’oublier)

La première chose à faire, c’est de tout retourner, car le circuit sera gravé par en-dessous. FlatCAM a une fonction pour ça, qui s’appelle mirror. Alors nous allons déjà renommer les 3 fichiers dans FlatCAM, et vous comprendrez pourquoi.

Double-cliquons sur le 1er fichier, et changeons son nom par quelque chose de plus court, comme cuivre par exemple. Pareil pour les deux autres (decoupe, percage).

Si j’ai voulu donner des noms plus courts aux fichiers gerber, c’est parce que nous allons devoir effectuer une symétrie (miroir selon l’axe Y). Bah oui, nous devons graver le circuit à l’envers…

Pour appliquer la symétrie à nos 3 fichiers, malheureusement, pas de solution « cliquer ici ». Nous allons utiliser la console de FlatCAM. Si elle n’est pas déjà visible en bas de l’écran, aller dans le menu Tool>Command Line.

Il y a une tapée de commandes disponibles (help pour avoir la liste).

Nous allons symétriser nos 3 fichiers gerber avec la commande suivante:

Ok, on a symétrisé nos objets, mais vous avez vu où ils sont maintenant?? On va repositionner tout ça aux alentours de (0,0) pour une question de… maniaquerie. Et de volonté de ne pas péter les outils au moment de l’usinage avec un retour à (0,0) aléatoire.
Allez, +146 en X, et +108 en Y:

Il ne se passe rien? cliquons sur le bouton [Replot] de la barre d’outils, et FlatCAM va redessiner l’affichage. Je parlais de bugs, c’en est un.

2.1 Génération de G-Code pour la gravure d’isolation

Superbe! Nous n’avons maintenant plus qu’à générer le G-Code pour fabriquer notre circuit imprimé.

Double cliquons sur l’objet cuivre dans la liste de gauche.

Les détails s’affichent.

Je ne vais malheureusement pas tout détailler car je suis une grosse feignasse.
Les blocs qui nous intéresseront sont essentiellement Isolation Routing et Board Cutout.

Dans notre cas précis, nous allons ignorer Board Cutout, car nous avons une découpe assez tarabiscotée pour ce circuit. Mais sachez que cette commande permet de générer un tracé de découpe rectangulaire autour du circuit. C’est souvent suffisant.

Nous devons définir le diamètre de notre outil (ici, c’est une pointe de 0.4mm), et le nombre de passes d’isolation (en général je laisse une seule passe).

Une fois ces paramètres définis, cliquons sur [Generate Geometry] (le premier bouton, en bas du bloc Isolation Routing. Vous allez voir les pistes s’entourer de lignes rouges, éloignées de 0.2mm (le rayon de notre outil).

Retournons dans l’onglet Project. FlatCAM a créé un nouvel objet, cuivre_iso. Dans la terminologie de FlatCAM, c’est un objet de type géométrie. Il contient les lignes rouges en question.

Vous voyez le panneau de détails? On se rapproche du G-Code 🙂

Il faut indiquer la profondeur de gravure (Cut Z), la hauteur lors des déplacements rapides (Travel Z), la vitesse d’avance pour la gravure (Feed rate), et le diamètre de l’outil (Tool Dia.) On clique sur [Generate], et hop! Apparaissent des lignes bleues, qui représentent les traces réelles de l’outil.

Retournons sur l’onglet Project, et ô surprise, FlatCAM nous a généré un objet de type cnc : cuivre_iso_cnc.

On arrive au bout!

S’il n’y a rien à ajouter au début ou à la fin du fichier G-Code, il n’y a plus qu’à cliquer sur [Export G-Code], en bas, et enregistrer le fichier où bon vous semble.

2.2 Génération de G-Code pour le perçage

Wouuuhou! Bon, d’accord ça a l’air un peu long comme ça, mais c’était décrit en profondeur.

Passons au perçage. Z’allez voir, c’est plus rapide. On va revenir sur l’onglet Projet, et double cliquer sur notre objet percage.

FlatCAM nous affiche la liste des différents diamètres de trous utilisés dans le circuit (0.8mm, 1.0mm et 1.32mm).

Si vous vous en foutez et que pour vous, un trou c’est un trou, avec une taille unique, laissez les 3 lignes sélectionnées. Sinon, si vous voulez distinguer les diamètres et changer d’outil entre chaque série de perçage, il faudra sélectionner successivement les 3 lignes, et générer 3 objets cnc.

Pour la démo, on ne va pas se casser la nénette (oui, je suis toujours aussi peu courageux), et générer un seul objet cnc. Donc laissons les 3 tailles d’outils sélectionnées. Ajustons la profondeur de perçage (Cut Z, la hauteur pour les déplacements rapides (Travel Z) et la vitesse d’avance verticale (Feed rate), puis cliquons sur [Generate].

J’ai spoilé, je suis désolé. FlatCAM a généré un nouvel objet cnc: percage_cnc.

Et c’est kiki va générer un G-Code pour le perçage?

2.3 Une découpe un poil compliquée – manipulation de géométrie

Alors bon, cette partie, c’est seulement si on veut une découpe un peu tordue, comme celle de mon exemple. Sinon, passez votre chemin.

Parmi les fichiers Gerber, il y en a un qui s’appelle decoupe. Sélectionnons-le.

Disons qu’on veut l’attaquer avec une fraise de 1.5mm. On va précéder exactement comme pour générer la géométrie de l’isolation des pistes, sauf que le diamètre de l’outil sera de 1.5mm

J’avais prévenu que ce serait la merde… FlatCAM génère deux lignes: une à l’extérieur, et une à l’intérieur. Nous devons nous débarrasser de cette dernière.

Il faut pour cela sélectionner l’objet Géométrie créé (dans notre cas, decoupe_iso), et passer en mode Edit Geometry avec le bouton . Les lignes rouges changent alors de couleur.

Le but de la manœuvre, c’est de dessiner un polygone entre les deux lignes rouges, et d’effectuer une union booléenne entre les 2 lignes rouges d’origine et ce polygone, pour ne conserver que l’extérieur. Oui, c’est un peu lourdingue, mais c’est la seule façon que j’ai trouvée pour arriver à mes fins. Si vous en avez une autre, je suis preneur!

Donc, une fois en édition de géométrie, cliquons sur le bouton . Il s’agit ensuite de dessiner notre polygone entre les deux lignes de contour. Pour terminer le polygone, taper [Espace].

Une fois le polygone terminé, cliquer sur le bouton pour rafraîchir la géométrie et quitter le mode édition. Mais pas de panique, on y retourne tout de suite.

Allez! Rebelote :

La manip qui va suivre est un peu délicate pour cause de petit bug de sélection. On va zoomer à mort dans un coin de notre circuit, et cliquer sur le polygone que nous avons tracé précédemment. Il doit devenir noir.

Ensuite, appuyer sur Ctrl et cliquer sur le contour restant. Le reste devient noir.

Cliquer ensuite sur le bouton Polygon Union :

Les deux lignes intérieures devient rouges.

Valider en cliquant sur .

Notre géométrie est maintenant correcte!

Encore une étape et nous pourrons sauter au point 2.1 pour la génération du G-Code… Il faut créer des petits points d’attache (tenons, ou tabs en anglais), sinon notre circuit va voler à la fin de la découpe.

L’article est long hein… Je suis éreinté. Je voulais enchaîner sur bCNC mais je le ferai dans un prochain article.

Allez, on y va pour les tenons, dedieu dedieu!

Pour créer des tenons, il faut modifier encore un peu la géométrie précédente, en coupant la ligne à deux endroits.

Nous allons de nouveau éditer la géométrie decoupe_iso, et dessiner deux rectangles de 5mm sur la ligne, un en haut et un en bas.

On va revalider en cliquant sur le bouton OK en haut, puis retourner en mode édition. Maintenant, on va sélectionner le tracé du contour, puis le rectangle avec Ctrl. Les deux sont noirs? Ok. Allons dans le menu Drawing>Cut Path. Boum. FlatCAM a coupé notre contour. Il n’y a plus qu’à sélectionner le rectangle et l’effacer (touche – du clavier). Et pareil pour le tenon du bas.

Il suffit maintenant de refaire le point __2.1__, en ajustant le diamètre d’outil, la profondeur, et en cochant éventuellement la case Multi Depth pour faire plusieurs passes de découpe (dans ce cas, indiquer la profondeur de chaque passe juste en-dessous).

Ouf! On a enfin fini!

Nous avons donc maintenant nos trois fichiers G-Code (gravure, perçage et découpe), et il n’y a plus qu’à les envoyer dans la machine avec bCNC. Mais ça, c’est pour un prochain article, parce que là, cet article est déjà trèèèès long et je suis au bout de mes forces 😀

[Tuto KiCad] Concevoir un circuit imprimé partie 2: le circuit imprimé

Vous avez aimé le premier article sur KiCAD? vous n’avez plus rien mangé ni bu en attendant la suite? Hé bien faites-vous un gros sandwich avec une bonne bière, car la voici!

Alors avant de commencer, je souhaite me dédouaner d’une chose. Dans le premier tuto, je vous ai présenté les fonctions de base de KiCad en construisant un schéma sans queue ni tête.
Dans cette seconde partie, nous n’utiliserons pas le schéma présenté précédemment, mais un vrai schéma pour un vrai projet. C’est plus concret, et surtout, je ne travaillerai pas pour rien, hé hé 🙂

Alors voilà, nous allons partir sur un petit circuit pas méchant. L’idée, c’est de faire un mini shield pour une Arduino Uno, qui va générer un signal sinusoïdal grâce à un DAC (MCP4921). Le DAC pilote un MOSFET pour alimenter une LED de puissance.

Voici le schéma KiCad :

Assigner des empreintes aux composants

Le schéma reste un schéma, et ne reflète pas forcément la réalité physique des composants. D’ailleurs, un même composant peut se présenter sous différentes formes. Typiquement, il peut y avoir une version montée en surface (SMD, ou CMS en français) et une version traversante.

Et malheureusement, KiCad ne peut pas savoir quelle version de chaque composant nous voulons implanter sur notre circuit.

Par conséquent, à chaque composant, nous allons devoir associer une empreinte (c’est à dire une forme physique du composant). Et ce sont ces empreinte que nous allons par la suite positionner sur notre circuit imprimé.

Pour associer une empreinte à un composant du schéma, placez la souris au dessus du composant (ici le MOSFET) et appuyez sur F (comme Footprint).

En appuyant sur le bouton [Sélection], une fenêtre s’ouvre, et nous affiche une méga liste vraiment mal foutue, parce qu’on ne peut pas faire de recherche dedans. Il faut savoir ce qu’on veut.
A gauche, on a les grandes familles de composants (résistances, transistors, connecteurs…), éventuellement sous-catégorisés en SMD (Surface Mount Device) et THT (Through Hole Technology).
En cliquant sur une famille, on a à droite sa liste d’empreintes de composants.

Dans notre cas, nous allons implanter un MOSFET au format TO-220. Je ne croyais pas dire des choses pareilles en public un jour, mais je réalise que parler de boîtiers TO-220, ça doit quand même faire une sacrée impression dans les dîners mondains.

Pour le DAC, c’est un Housings_DIP:DIP-8_W7.62mm.

Et pour les connecteurs, j’ai pris des
Connect:AK300-2 pour les gros (entraxe de 5mm)
Pin_Headers:Pin_Header_Straight_1x02_Pitch2.54mm pour les petits.

Ok, donc tous nos composants sont maintenant associés à une empreinte, alors passons à la suite!

Ah il faudra quand même que je vous montre comment créer une empreinte de composant, si jamais vous avez besoin de quelque chose qui n’existe pas dans la librairie standard. C’est important de savoir faire, et vous verrez c’est vraiment facile. Je ferai une aparté à la fin de l’article à ce sujet.

Donc!

Sur la barre d’outils de KiCad, en haut, il y a un bouton [NET]. Cette fonction va nous permettre de générer la netlist, qui est en fait un fichier texte récapitulant toutes les connexions entre les composants. C’est le maillage de notre circuit.

Cliquez sur [Générer], et KiCad va nous proposer d’enregistrer un fichier nom_du_projet.net dans le répertoire du projet. Parfait. Une fenêtre devrait apparaitre.

En fait, KiCad nous explique que chaque composant doit être annoté (par exemple, les résistances doivent être nommées R1, R2, R3…).
Alors là, en général je m’en contrefous et je clique sur [Numérotation]. Je fais en général de petits circuits et je sais ce que je vais mettre dessus, et où.

Hop! Notre fichier .net est créé et nous allons pouvoir passer à la vue de conception de circuit imprimé. Pour cela, cliquer sur . Ce bouton est à droite de la barre d’outils.

La fenêtre PcbNew d’ouvre, avec un fond noir, encadré de rouge. Vide. Ah. T’inquiète, c’est normal. Nous allons importer notre netlist, et tout va se charger correctement: clic sur le bouton [NET] dans la barre d’outils, puis [Read Current Netlist]. L’opération peut prendre quelques secondes, et une fois terminée, nous pouvons fermer cette fenêtre.

Positionner les composants

Tout est bien là, mais VRAIMENT en vrac. On va réarranger un peu tout ce bazar avec les touche M et R (déplacer et pivoter, comme lors de la conception du schéma).

On y voit un peu plus clair!

Comme il s’agit d’un shield pour une Arduino Uno, il va falloir être précis au niveau des 4 connecteurs du haut et des deux du bas. L’espacement vertical doit être de 1.9 pouce.

Soit on la joue naïve (en regardant les coordonnées en bas), soit on utilise la grille comme il faut pour un placement efficace. Allez, je choisis pour vous: réponse 2.

La grille est un outil super puissant, pour peu qu’on sache l’exploiter. Nous allons définir une grille personnalisée, avec comme pas vertical 1.9 pouce, et comme pas horizontal 0.1 pouce (2.54mm) (on s’occupera de l’horizontal juste après).

Dans le menu Dimensions>Grid, entrons les deux pas (attention, selon votre configuration régionale, il faut peut être utiliser une virgule à la place du point. J’ai ce problème).

Une fois la grille validée, cliquons sur le bouton tout en bas de la barre d’outils de droite:

Il va nous permettre fixer l’origine de la grille. Nous allons poser cette origine sur la pin SCK du connecteur du haut. C’est la pin 13 de notre Arduino.

Ensuite, activons notre grille personnalisée avec clic droit>Grid select>User Grid.

On peut voir que la partie basse descend un peu trop bas… On va déplacer notre connecteur du bas pour qu’il soit placé sur la ligne de la grille, puis rétablir une grille au pas de 2.54mm pour réarranger vite fait les autres composants.

Procédons de la même manière pour placer notre connecteur du bas correctement en X, et réarrangeons le tout.

Nous pouvons maintenant créer les pistes de cuivre qui relieront nos composants, avec le bouton .

Peu à peu, nous arrivons à quelque chose comme ça:

Zone de remplissage

Nous allons relier toutes les masses à l’aire d’une zone de remplissage. Pour cela, cliquons sur le bouton , puis quelque part sur notre schéma. On choisit la couche de cuivre, le Net (dans ce cas, GND), puis OK. Nous pouvons ensuite dessiner un chouette rectangle autour de notre circuit (double clic pour le valider).

On peut afficher ou pas les zones de remplissage avec les boutons suivants:

Et pour reconstruire la zone, c’est la touche B du clavier.

Oh yeah! Mais le contour… C’est un peu trop conventionnel, non?

Pour terminer, nous allons donner une forme un peu exotique à notre circuit final.

Sélectionnons la couche Edge.Cuts à droite (elle est jaune normalement).

A l’aide des boutons et , nous allons nous éclater à dessiner un contour totalement déliraaaant (avec la voix de Stéphane Bern), puis re-appuyer sur B pour que KiCAD recalcule le remplissage de masse, et hooooop!

Supplément gratuit spécial été : créer une empreinte de composant personnalisée

Savoir créer des composants custom, c’est capital. Pouvoir le faire hyper facilement, c’est encore mieux. C’est d’ailleurs la raison principale qui m’a fait quitter Fritzing pour KiCAD. Avec Fritzing, pour créer un composant, c’est une putain de plaie. Ouverte. Et pas désinfectée. KiCAD, lui, a soigné cette plaie sans douleur ni cicatrice, et m’a même fait un gros bisou sur le front pour que j’oublie tout 🙂

Pour la démo, je vais créer un circuit intégré, le CD4011 (quatre portes NAND). Il a une valeur sentimentale, c’est le premier circuit intégré que j’ai eu l’occasion d’utiliser (Kosmos Electronic 2000… Souvenirs…)

Bref! Voici la tronche du circuit dans KiCAD, vite fait:

CD4011 à la Nico

Bien, maintenant nous allons créer l’empreinte de ce circuit.

Dans l’éditeur de schéma, cliquons sur le bouton Footprint Editor, puis sur New Footprint. On va l’appeler CD4011-DIP.

On va cliquer à droite sur Add Pads, et poser les 14 pastilles de notre circuit intégré (espacées de 2.54mm, et la largeur du circuit est de 7.62mm.

Avant de poser la 2ème pastille, on peut éditer la 1ère (touche E), et régler par exemple la forme et le diamètre de la pastille. Ce réglage sera repris sur les suivantes.

On va créer un répertoire cd4011.pretty dans le dossier du projet, puis aller dans Préférences>Footprint Libraries Manager, cliquer sur l’onglet Project Specific Libraries, et ajouter notre librairie d’empreinte comme ceci:

Après ça, File>Save Footprint in active Library, et on lui donne un nom (CD4011-DIP).

Et voilà! Les numéros de pins de l’empreinte collent avec celles du composant dans le schéma, et c’est toute ce dont on a besoin!

Il ne nous reste plus qu’à dire à KiCAD « Hey, j’ai créé une nouvelle bibliothèque d’empreintes, et j’aimerais l’utiliser dans mon projet. Je peux te montrer où elle se trouve? »

Depuis l’éditeur d’empreintes, on va donc dans Préférences>Assistant des librairies d’empreintes, et on parcourt notre disque dur jusqu’à l’emplacement de notre répertoire pretty. Il nous propose d’importer l’empreinte de façon globale, ou bien juste pour le projet actuel. Pour la démo, choisissons le projet actuel.

De retour dans l’éditeur de schéma, plaçons la souris sur notre composant, appuyons sur F, suis Sélection. On déroule la liste, et voici le graal: notre empreinte du CD4011 est présente et utilisable!

Bilan des courses

Si vous en êtes à lire ce paragraphe, félicitations!

J’avoue que l’article est assez long, j’ai essayé de l’illustrer le plus possible pour expliquer la démarche pas à pas… Normalement, entre le premier article et celui-ci, KiCAD devrait sembler plus accessible qu’au premier abord.

En fait, les raccourcis clavier sont capitaux dans KiCAD, et notamment:

  • M (move) : déplacer un élément
  • G (grab) : déplacer un élément en conservant ses connexions
  • E (edit) : modifier les propriétés d’un élément
  • F (footprint) : assigner une empreinte physique à un composant de schéma
  • Suppr (Delete pour nos amis suisses) : effacer un élément

Si KiCAD a un doute quant à l’élément qui se trouve sous la souris, il affichera un menu Clarification qui nous permet d’indiquer avec précision l’élément sur lequel on veut agir.

Avec tout ça, nous avons un beau circuit imprimé virtuel, il ne reste plus qu’à le fabriquer! Mais ce sera l’objet d’un prochain article 😀