<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://knowledge.pinon-hebert.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jpinon</id>
	<title>knowledge - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://knowledge.pinon-hebert.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jpinon"/>
	<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/Sp%C3%A9cial:Contributions/Jpinon"/>
	<updated>2026-07-19T20:32:57Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2097</id>
		<title>Fichier:SIGNAL COMARATEUR VS ESP32.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2097"/>
		<updated>2026-07-16T12:14:37Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:SIGNAL COMARATEUR VS ESP32.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le signal du comparateur vs un ESP32&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2096</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2096"/>
		<updated>2026-07-15T23:29:16Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
Sur l&#039;oscilloscope ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur num zoom out.png|sans_cadre|704x704px]]&lt;br /&gt;
&lt;br /&gt;
Au repos c&#039;est à 1(high). Le signal ce sont des 0 (low).&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
On voit bien qu&#039;il y a des données sur les 3 premiers quartés rien sur 4 et 5 (surement prévu pour un modèle plus précis) et de nouveau des données sur le dernier quartet.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
Pour la dernière ligne du tableau par exemple, on a la grille de décodage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-grille-decodage.png|sans_cadre|728x728px]]&lt;br /&gt;
&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Je viens de donner le résultat de l&#039;étude. [https://node-red.pinon-hebert.fr/files/mrmmpkuz-y23eb51c.pdf L&#039;étude au complet est là] avec tous les chronogrammes..&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du connecteur....&lt;br /&gt;
&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si l&#039;ESP32 est alimenté en avec un standard Vdd=3.3V, et si on compare ça avec le signal issue du comparateur on à: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|669x669px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau haut de l&#039;ESP 32. (1.6 &amp;lt; 2.475).&lt;br /&gt;
&lt;br /&gt;
Le &amp;quot;LOW&amp;quot; du comparateur sera donc bien considéré comme un &amp;quot;LOW&amp;quot; par l&#039;ESP32. En revanche le &amp;quot;HIGH&amp;quot; du comparateur se situe dans une zone indécise de l&#039;ESP32. Rien ne dit comment il le décodera.&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet et je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2095</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2095"/>
		<updated>2026-07-15T23:18:02Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Les niveaux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
Sur l&#039;oscilloscope ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur num zoom out.png|sans_cadre|704x704px]]&lt;br /&gt;
&lt;br /&gt;
Au repos c&#039;est à 1(high). Le signal ce sont des 0 (low).&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
ON arrive a la grille de décodage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-grille-decodage.png|sans_cadre|728x728px]]&lt;br /&gt;
&lt;br /&gt;
On voit bien qu&#039;il y a des données sur les 3 premiers quartés rien sur 4 et 5 (surement prévu pour un modèle plus précis) et de nouveau des données sur le dernier quartet.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Je viens de donner le résultat de l&#039;étude. [https://node-red.pinon-hebert.fr/files/mrmmpkuz-y23eb51c.pdf L&#039;étude au complet est là] avec tous les chronogrammes..&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du connecteur....&lt;br /&gt;
&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si l&#039;ESP32 est alimenté en avec un standard Vdd=3.3V, et si on compare ça avec le signal issue du comparateur on à: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|669x669px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau haut de l&#039;ESP 32. (1.6 &amp;lt; 2.475).&lt;br /&gt;
&lt;br /&gt;
Le &amp;quot;LOW&amp;quot; du comparateur sera donc bien considéré comme un &amp;quot;LOW&amp;quot; par l&#039;ESP32. En revanche le &amp;quot;HIGH&amp;quot; du comparateur se situe dans une zone indécise de l&#039;ESP32. Rien ne dit comment il le décodera.&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet et je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2094</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2094"/>
		<updated>2026-07-15T22:54:54Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Les niveaux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
Sur l&#039;oscilloscope ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur num zoom out.png|sans_cadre|704x704px]]&lt;br /&gt;
&lt;br /&gt;
Au repos c&#039;est à 1(high). Le signal ce sont des 0 (low).&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
ON arrive a la grille de décodage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-grille-decodage.png|sans_cadre|728x728px]]&lt;br /&gt;
&lt;br /&gt;
On voit bien qu&#039;il y a des données sur les 3 premiers quartés rien sur 4 et 5 (surement prévu pour un modèle plus précis) et de nouveau des données sur le dernier quartet.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Je viens de donner le résultat de l&#039;étude. [https://node-red.pinon-hebert.fr/files/mrmmpkuz-y23eb51c.pdf L&#039;étude au complet est là] avec tous les chronogrammes..&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du connecteur....&lt;br /&gt;
&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si l&#039;ESP32 est alimenté en avec un standard Vdd=3.3V, et si on compare ça avec le signal issue du comparateur on à: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|669x669px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau haut de l&#039;ESP 32. (1.6 &amp;lt; 2.475).&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet et je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2093</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2093"/>
		<updated>2026-07-15T22:52:40Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Les niveaux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
Sur l&#039;oscilloscope ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur num zoom out.png|sans_cadre|704x704px]]&lt;br /&gt;
&lt;br /&gt;
Au repos c&#039;est à 1(high). Le signal ce sont des 0 (low).&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
ON arrive a la grille de décodage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-grille-decodage.png|sans_cadre|728x728px]]&lt;br /&gt;
&lt;br /&gt;
On voit bien qu&#039;il y a des données sur les 3 premiers quartés rien sur 4 et 5 (surement prévu pour un modèle plus précis) et de nouveau des données sur le dernier quartet.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Je viens de donner le résultat de l&#039;étude. [https://node-red.pinon-hebert.fr/files/mrmmpkuz-y23eb51c.pdf L&#039;étude au complet est là] avec tous les chronogrammes..&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du connecteur....&lt;br /&gt;
&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si on compare ça avec le signal issue du comparateur on à: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|669x669px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau haut de l&#039;ESP 32. (1.6 &amp;lt; 2.4).&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet, je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2092</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2092"/>
		<updated>2026-07-15T22:51:40Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Le hardware nécessaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
Sur l&#039;oscilloscope ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur num zoom out.png|sans_cadre|704x704px]]&lt;br /&gt;
&lt;br /&gt;
Au repos c&#039;est à 1(high). Le signal ce sont des 0 (low).&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
ON arrive a la grille de décodage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-grille-decodage.png|sans_cadre|728x728px]]&lt;br /&gt;
&lt;br /&gt;
On voit bien qu&#039;il y a des données sur les 3 premiers quartés rien sur 4 et 5 (surement prévu pour un modèle plus précis) et de nouveau des données sur le dernier quartet.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Je viens de donner le résultat de l&#039;étude. [https://node-red.pinon-hebert.fr/files/mrmmpkuz-y23eb51c.pdf L&#039;étude au complet est là] avec tous les chronogrammes..&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du connecteur....&lt;br /&gt;
&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si on compare ça avec le signal issue du comparateur on à &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|669x669px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau haut de l&#039;ESP 32. (1.6 &amp;lt; 2.4).&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet, je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2091</id>
		<title>Fichier:SIGNAL COMARATEUR VS ESP32.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2091"/>
		<updated>2026-07-15T22:51:23Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:SIGNAL COMARATEUR VS ESP32.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le signal du comparateur vs un ESP32&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2090</id>
		<title>Fichier:SIGNAL COMARATEUR VS ESP32.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2090"/>
		<updated>2026-07-15T22:47:02Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:SIGNAL COMARATEUR VS ESP32.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le signal du comparateur vs un ESP32&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2089</id>
		<title>Fichier:SIGNAL COMARATEUR VS ESP32.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:SIGNAL_COMARATEUR_VS_ESP32.png&amp;diff=2089"/>
		<updated>2026-07-15T22:30:27Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:SIGNAL COMARATEUR VS ESP32.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le signal du comparateur vs un ESP32&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2088</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2088"/>
		<updated>2026-07-15T22:12:18Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
Sur l&#039;oscilloscope ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur num zoom out.png|sans_cadre|704x704px]]&lt;br /&gt;
&lt;br /&gt;
Au repos c&#039;est à 1(high). Le signal ce sont des 0 (low).&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
ON arrive a la grille de décodage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-grille-decodage.png|sans_cadre|728x728px]]&lt;br /&gt;
&lt;br /&gt;
On voit bien qu&#039;il y a des données sur les 3 premiers quartés rien sur 4 et 5 (surement prévu pour un modèle plus précis) et de nouveau des données sur le dernier quartet.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Je viens de donner le résultat de l&#039;étude. [https://node-red.pinon-hebert.fr/files/mrmmpkuz-y23eb51c.pdf L&#039;étude au complet est là] avec tous les chronogrammes..&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du connecteur....&lt;br /&gt;
&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si on compare ça avec le signal issue du comparateur on à &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|443x443px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau bas de l&#039;ESP 32. (1.6 &amp;lt; 2.4).&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet, je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-grille-decodage.png&amp;diff=2087</id>
		<title>Fichier:Comparateur-grille-decodage.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-grille-decodage.png&amp;diff=2087"/>
		<updated>2026-07-15T22:10:06Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;grille de décodage&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2086</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2086"/>
		<updated>2026-07-15T22:06:53Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Analyse du signal de sortie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
Sur l&#039;oscilloscope ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur num zoom out.png|sans_cadre|704x704px]]&lt;br /&gt;
&lt;br /&gt;
Au repos c&#039;est à 1(high). Le signal ce sont des 0 (low).&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Je viens de donner le résultat de l&#039;étude. [https://node-red.pinon-hebert.fr/files/mrmmpkuz-y23eb51c.pdf L&#039;étude au complet est là] avec tous les chronogrammes..&lt;br /&gt;
&lt;br /&gt;
Pour ce qui est du connecteur....&lt;br /&gt;
&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si on compare ça avec le signal issue du comparateur on à &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|443x443px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau bas de l&#039;ESP 32. (1.6 &amp;lt; 2.4).&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet, je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur_num_zoom_out.png&amp;diff=2085</id>
		<title>Fichier:Comparateur num zoom out.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur_num_zoom_out.png&amp;diff=2085"/>
		<updated>2026-07-15T21:56:30Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le signal du comparateur numérique sur un plus grand intervale de temps.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-regression-pouce.png&amp;diff=2084</id>
		<title>Fichier:Comparateur-regression-pouce.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-regression-pouce.png&amp;diff=2084"/>
		<updated>2026-07-15T21:53:05Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Comparateur-regression-pouce.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Comparateur-regression-pouce&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-message-zero_mm.png&amp;diff=2083</id>
		<title>Fichier:Comparateur-message-zero mm.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-message-zero_mm.png&amp;diff=2083"/>
		<updated>2026-07-15T21:45:15Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Comparateur-message-zero mm.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Comparateur-message-zero_mm&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2082</id>
		<title>Comparateur Numérique</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Comparateur_Num%C3%A9rique&amp;diff=2082"/>
		<updated>2026-07-15T21:44:12Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Analyse du signal de sortie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Analyse hardware ==&lt;br /&gt;
[[Fichier:Comparateur numerique.png|vignette|Comparateur numérique sans marque|254x254px]]&lt;br /&gt;
J&#039;ai acheté un comparateur numérique sur Amazon. Il est donné pour avoir une sortie RS232. &lt;br /&gt;
&lt;br /&gt;
En revanche la connectique est &amp;quot;exotique&amp;quot; (un trou dans le boitier et 4 traces sur le PCB de l&#039;appareil) et aucune explication dans la doc. La majorité des vendeurs disent que le &amp;quot;kit connectique&amp;quot; est disponible séparément mais aucun de mes messages aux distributeurs ni question sur le site Amazon ne m&#039;a donné de réponses.&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de marque sur ce modèle donc pas de fabricant à contacter. Alors je sors mon oscilloscope, mon multimètre et mes pointes de touches maisons pour comprendre de quoi il en retourne &amp;quot;à la main&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Si on ouvre le cache du connecteur (le petit, le grand c&#039;est celui de la pile) on voit qu&#039;on a accès directement au PCB de la carte et que 4 conducteurs sont présents.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Connecteur comparateur.png|sans_cadre|230x230px]]&lt;br /&gt;
&lt;br /&gt;
On nommera ces broches de 1 à 4 de gauche à droite. Les couleurs donnent déjà un indication de ce que j&#039;ai déduit de mes mesures.&lt;br /&gt;
&lt;br /&gt;
A priori la broche 4 est la masse et la 1 est la tension d&#039;alim de la pile (1,17V avec une pile... pas toute neuve mais 1.6 avec une pile neuve).&lt;br /&gt;
&lt;br /&gt;
En 2 (jaune) et en 3 (rouge) on voit passer des données.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur broche 3.png|sans_cadre|764x764px]]&lt;br /&gt;
&lt;br /&gt;
Pour arriver à un tel résultat il faut ouvrir le bidule et y souder des câbles.&lt;br /&gt;
&lt;br /&gt;
Il faut être très prudent lors de cette opération. L&#039;écran LCD est relié au circuit imprimé par un connecteur qui est un sandwich de couches conductrices et isolantes en plastique souple. C&#039;est impossible à remettre en place correctement. Au bout de 50 essais j&#039;ai un affichage &amp;quot;a peu près&amp;quot; correct. Faut se mettre bien en face!. Quand j&#039;aurais terminé je penses que j&#039;en achèterais un neuf!&lt;br /&gt;
&lt;br /&gt;
== Analyse du signal de sortie ==&lt;br /&gt;
Voie 1 (rouge) sur 3&lt;br /&gt;
&lt;br /&gt;
Voie 2 (jaune) sur 2&lt;br /&gt;
&lt;br /&gt;
Les deux masses à 4&lt;br /&gt;
&lt;br /&gt;
On visualise:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-messages-multiples.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Je n&#039;ai pas mis d&#039;échelle mais mes mesures donnent :&lt;br /&gt;
&lt;br /&gt;
* Un message toutes les 110 ms&lt;br /&gt;
* Le message lui même dure 8ms&lt;br /&gt;
&lt;br /&gt;
Regardons de près le signal pour une mesure à 0mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-message-zero mm.png|sans_cadre|700x700px]]&lt;br /&gt;
&lt;br /&gt;
Intuitivement :&lt;br /&gt;
&lt;br /&gt;
* La voie 1 (broche 3) semble être un horloge (elle ne change jamais quel que soit la mesure)&lt;br /&gt;
* La voie 2 (broche 2) semble être la mesure dans un format étrange.&lt;br /&gt;
&lt;br /&gt;
Après une après midi de creusage de tête j&#039;ai compris plusieurs choses:&lt;br /&gt;
&lt;br /&gt;
# Le signal de la voie 2 est un signal logique dont il faut lire l&#039;état à chaque &#039;&#039;&#039;front montant&#039;&#039;&#039; de l&#039;horloge.&lt;br /&gt;
# Le message contient 6 groupes de 4 bits. (24 bits)&lt;br /&gt;
# Le bit 23 indique l&#039;unité (0=&amp;quot;mm&amp;quot; et 1=&amp;quot;in&amp;quot;)&lt;br /&gt;
# Le bit 20 c&#039;est le signe (0=&amp;quot;+&amp;quot; et 1=&amp;quot;-&amp;quot;)&lt;br /&gt;
# Seul les 3 premiers quartets (12 premiers bits) semblent significatifs les 2 suivants sont toujours à zéro&lt;br /&gt;
# Pour le reste la seule chose que je vois c&#039;est que le bit 0 est l&#039;unité car il est à 0 pour les nombres paire et à 1 pour les impairs.&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode métrique (unité =&amp;quot;mm&amp;quot;) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Signal décodé&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits &lt;br /&gt;
!Valeur décimale&lt;br /&gt;
bit0 = lsb&lt;br /&gt;
|-&lt;br /&gt;
|0000 0000 0000 0000 0000 0000&lt;br /&gt;
|0mm&lt;br /&gt;
|000000000000 &lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0100 0000 0000 0000 0000 0000&lt;br /&gt;
|0,02mm&lt;br /&gt;
|010000000000 &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|0111 0100 1000 0000 0000 0000&lt;br /&gt;
|3.02mm&lt;br /&gt;
|011101001000 &lt;br /&gt;
|302&lt;br /&gt;
|-&lt;br /&gt;
|0101 0111 1100 0000 0000 0000&lt;br /&gt;
|10,02mm&lt;br /&gt;
|010101111100 &lt;br /&gt;
|1002&lt;br /&gt;
|-&lt;br /&gt;
|1111 0110 1000 0000 0000 0000&lt;br /&gt;
|3,67mm&lt;br /&gt;
|111101101000 &lt;br /&gt;
|367&lt;br /&gt;
|-&lt;br /&gt;
|0111 1110 1010 0000 0000 0000&lt;br /&gt;
|14,06mm&lt;br /&gt;
|011111101010 &lt;br /&gt;
|1406&lt;br /&gt;
|-&lt;br /&gt;
|1010 0100 0100 0000 0000 1000&lt;br /&gt;
| -05,59mm&lt;br /&gt;
|101001000100 &lt;br /&gt;
|549&lt;br /&gt;
|-&lt;br /&gt;
|1110 0101 0010 0000 0000 1000&lt;br /&gt;
| -11,91mm&lt;br /&gt;
|111001010010 &lt;br /&gt;
|1191&lt;br /&gt;
|}&lt;br /&gt;
On voit rapidement que la valeur binaire correspond à la mesure *100. On à le nombre de centièmes de mm.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est donc précis à 0.01 mm près soit 10µm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Décodage en mode impérial (US ?) ==&lt;br /&gt;
Le décodage est acquis je me focalise sur les correspondance entre l&#039;entier transmis et la valeur affichée.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Mesure affichée&lt;br /&gt;
!Valeur binaire &lt;br /&gt;
12 premiers bits&lt;br /&gt;
|-&lt;br /&gt;
|0 in&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|0.1445 in&lt;br /&gt;
|289&lt;br /&gt;
|-&lt;br /&gt;
|0.0025 in&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|0.1715 in&lt;br /&gt;
|343&lt;br /&gt;
|-&lt;br /&gt;
|0.277 in&lt;br /&gt;
|554&lt;br /&gt;
|-&lt;br /&gt;
|0.0245 in&lt;br /&gt;
|49&lt;br /&gt;
|-&lt;br /&gt;
|0.267 in&lt;br /&gt;
|534&lt;br /&gt;
|}&lt;br /&gt;
C&#039;est moins évidant (c&#039;est toujours bizarre avec les unités impériales).&lt;br /&gt;
&lt;br /&gt;
La représentation &amp;quot;XY&amp;quot; nous donne l&#039;équation : mesure=valeur*0,0005&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-regression-pouce.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
En gros on divise par 2000. on a le nombre de 1/2000 de pouces de la mesure. Quand je vous disais que les anglais étaient bizarres dans leurs unités.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On est précis à 1/2000  de pouces soit 25,4/2000 soit 0.0127 mm ou 12.7 µm. Il vaut mieux travailler en mm car les unités impériales semblent être des interpolations!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Dans la doc sur Amazon on a :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Comparateur-doc.png|sans_cadre|740x740px]] &lt;br /&gt;
&lt;br /&gt;
Déjà &amp;quot;Porta A&amp;quot; je ne comprends pas bien ce que ça veut dire mais &#039;&#039;&#039;RS232 c&#039;est archi faux&#039;&#039;&#039;. Le signal n&#039;est pas du tout compatible UART et pas non plus en niveaux -12/+12V du RS 232 (ni 0/5V).&lt;br /&gt;
&lt;br /&gt;
Si ça ressemble a quelque chose de standard ce serait plutôt de l&#039;I2C.&lt;br /&gt;
&lt;br /&gt;
En revanche &amp;quot;Porta B&amp;quot; c&#039;est bien un emplacement pour une pile LR44 !&lt;br /&gt;
&lt;br /&gt;
== Le hardware nécessaire ==&lt;br /&gt;
&lt;br /&gt;
=== Les niveaux ===&lt;br /&gt;
On a vu que le signal varie entre 0 et1.6 V max (si le pile est neuve mais à 1.2V le comparateur marche encore).&lt;br /&gt;
&lt;br /&gt;
Pour un microcontrôleur classique (ex [[ESP32]]) on a les valeurs limites haut bas suivantes:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ESP32LEVELS.png|sans_cadre|438x438px]]&lt;br /&gt;
&lt;br /&gt;
Si on compare ça avec le signal issue du comparateur on à &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SIGNAL COMARATEUR VS ESP32.png|sans_cadre|443x443px]] &lt;br /&gt;
&lt;br /&gt;
On voit bien que le niveau &amp;quot;haut&amp;quot; du signal du comparateur reste bien en dessous du minimum du niveau bas de l&#039;ESP 32. (1.6 &amp;lt; 2.4).&lt;br /&gt;
&lt;br /&gt;
Il faut donc amplifier ce signal. Certains utiliseraient des transistor MOSFET mais, je maitrise mal le sujet, je n&#039;en ai pas en stock. En revanche j&#039;ai des [[Le transistor bipolaire|transistors bipolaires]] et c&#039;est assez facile a gérer.&lt;br /&gt;
&lt;br /&gt;
==== L&#039;électronique ====&lt;br /&gt;
J&#039;ai fait le petit schéma :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema Interface Comparateur.png|sans_cadre|717x717px]]&lt;br /&gt;
&lt;br /&gt;
Riens de complexe, deux transistors NPN montés utilisé en mode saturé/bloqué.&lt;br /&gt;
&lt;br /&gt;
On fait un PCB:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB interface compatateur.png|sans_cadre|540x540px]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais des grosses traces et des pads éloignés car je veux utiliser ma [[CNC 3018|CNC]] pour faire le travail.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Le PCB termine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Le PCB usiné (il faudrait que j&#039;affine mes paramètres de coupe car c&#039;est un peu brutal)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avec les composants.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Avec les composants.&lt;br /&gt;
&lt;br /&gt;
==== Les mesures ====&lt;br /&gt;
[[Fichier:L&#039;interface comparateur en test.png|sans_cadre|508x508px]]&lt;br /&gt;
&lt;br /&gt;
===== Si on compare l&#039;entrée à la sortie =====&lt;br /&gt;
[[Fichier:Interface comparateur entrée-sortie.png|sans_cadre|504x504px]]&lt;br /&gt;
&lt;br /&gt;
Le signal d&#039;entrée (0-1,6V) est bien transformé en signal entre 0 et 3.3V.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Attention.png|sans_cadre|91x91px]]Attention cependant on a utilisé un transistor NPN le signal est inversé. Il faudra en tenir compte dans le logiciel!&lt;br /&gt;
&lt;br /&gt;
===== Visualisation clock + data =====&lt;br /&gt;
En entrée&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Entree .png|sans_cadre|520x520px]]&lt;br /&gt;
&lt;br /&gt;
En sortie&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sortie interface comparateur.png|alt=clock-data out|sans_cadre|511x511px]]:&lt;br /&gt;
&lt;br /&gt;
On a bien une mise à niveau et une inversion du signal.&lt;br /&gt;
&lt;br /&gt;
== Logiciel ==&lt;br /&gt;
J&#039;ai choisi de développer une application simple pour ESP32 (avec l&#039;IDE Arduino).&lt;br /&gt;
&lt;br /&gt;
On à trois tâches à réaliser :&lt;br /&gt;
&lt;br /&gt;
# Détecter le début d&#039;une &amp;quot;frame&amp;quot; sur la &amp;quot;clock&amp;quot;&lt;br /&gt;
# Lire la valeur de la broche &amp;quot;data&amp;quot; pour chaque front montant de clock.&lt;br /&gt;
# Décodage des bits acquis en en données réelles.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logic diagram.png|sans_cadre|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Logic 1 = clock inversée par un [[Le transistor bipolaire|transistor NPN]]&lt;br /&gt;
&lt;br /&gt;
Logic 0 = data inversée par un transistor NPN&lt;br /&gt;
&lt;br /&gt;
Logic 2 = Décodage de la &amp;quot;frame&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Logic 3 = Lecture de la valeur &amp;quot;data&amp;quot; sur chaque front montant de la clock (le front descendant de la clock à travers le NPN) &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Analyse comparator signal&lt;br /&gt;
// processing in µs on uint32_t integer&lt;br /&gt;
// 4 294 967 296 µs&lt;br /&gt;
// 4 294.967296 sec&lt;br /&gt;
// 1:11:34 so after 1 hour needs to reboot&lt;br /&gt;
// Related to https://knowledge.pinon-hebert.fr/index.php/Comparateur_Num%C3%A9rique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const int clk = 32;&lt;br /&gt;
const int dat = 33;&lt;br /&gt;
const int frame_out = 22; /// frame detection&lt;br /&gt;
const int dat_out=21; // data decode&lt;br /&gt;
&lt;br /&gt;
#define REVERSE     // Defined if input signal needs to be inverted (needed if level adaptation done with NPN)&lt;br /&gt;
&lt;br /&gt;
// ANALYSE THE CLOCK SIGNAL&lt;br /&gt;
uint32_t event_fall;   // timestamp of the last falling edge&lt;br /&gt;
uint32_t time_low;    // duration of last low level (between falling and rising edge)&lt;br /&gt;
&lt;br /&gt;
uint32_t event_rise;  // tlmestamp of the last rising edge&lt;br /&gt;
uint32_t time_high;   // duration of the last high levet (between rising and fallin edge)&lt;br /&gt;
&lt;br /&gt;
int bit=-1;&lt;br /&gt;
uint8_t bitFrame[24];&lt;br /&gt;
uint8_t measure[24];&lt;br /&gt;
&lt;br /&gt;
int state;&lt;br /&gt;
&lt;br /&gt;
inline int getClkState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(clk));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(clk));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
inline int getDatState(){ &lt;br /&gt;
  #ifdef REVERSE&lt;br /&gt;
    return (!digitalRead(dat));&lt;br /&gt;
  #else&lt;br /&gt;
    return (digitalRead(dat));&lt;br /&gt;
  #endif&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_rise(){&lt;br /&gt;
  state=HIGH;&lt;br /&gt;
  event_rise=micros();&lt;br /&gt;
  int value=getDatState();&lt;br /&gt;
  time_low=event_rise-event_fall;&lt;br /&gt;
  if (bit&amp;gt;=0){&lt;br /&gt;
    bitFrame[bit]=value;&lt;br /&gt;
    bit++;&lt;br /&gt;
    bit%=24;&lt;br /&gt;
  }&lt;br /&gt;
  if (bit==0){&lt;br /&gt;
    memcpy(measure,bitFrame,24);&lt;br /&gt;
  }&lt;br /&gt;
  digitalWrite(frame_out,(bit==0));&lt;br /&gt;
  digitalWrite(dat_out,value); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_fall(){&lt;br /&gt;
  state=LOW;&lt;br /&gt;
  event_fall=micros();&lt;br /&gt;
  time_high=event_fall-event_rise;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR clk_CHANGE() {&lt;br /&gt;
  uint32_t ti=micros();&lt;br /&gt;
  if(getClkState()){&lt;br /&gt;
    return clk_rise();&lt;br /&gt;
  }else{&lt;br /&gt;
    return clk_fall();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printMeasure(){&lt;br /&gt;
  int i;&lt;br /&gt;
  // Décode mesured value&lt;br /&gt;
  int val=0;&lt;br /&gt;
  for (i=11; i&amp;gt;=0; i--){&lt;br /&gt;
    val&amp;lt;&amp;lt;=1;&lt;br /&gt;
    val+=measure[i];&lt;br /&gt;
  }&lt;br /&gt;
  if (measure[20]==HIGH){&lt;br /&gt;
    val=-val;&lt;br /&gt;
  }&lt;br /&gt;
  // convert regarding the system (metric vs US)&lt;br /&gt;
  float fval;&lt;br /&gt;
  if (measure[23]==HIGH){&lt;br /&gt;
    fval=float(val)/2000.0;&lt;br /&gt;
    Serial.println(fval,4);&lt;br /&gt;
  }else{&lt;br /&gt;
    fval=float(val)/100.0;&lt;br /&gt;
    Serial.println(fval,2);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pinMode(clk, INPUT_PULLUP);&lt;br /&gt;
  pinMode(dat,INPUT_PULLUP);&lt;br /&gt;
  pinMode(frame_out,OUTPUT);&lt;br /&gt;
  pinMode(dat_out,OUTPUT);&lt;br /&gt;
  digitalWrite(frame_out,LOW);&lt;br /&gt;
  digitalWrite(dat_out,HIGH);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;\nInit interuption&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  state=getClkState();&lt;br /&gt;
  attachInterrupt(clk,clk_CHANGE,CHANGE);&lt;br /&gt;
  Serial.println(&amp;quot;Sync&amp;quot;);&lt;br /&gt;
  while (time_high&amp;lt;100000){&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  bit=0;&lt;br /&gt;
  Serial.println(getClkState());&lt;br /&gt;
  Serial.println(&amp;quot;Ready&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  delay(100);&lt;br /&gt;
  printMeasure();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les constantes&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 10 à 13 définitions des broches GPIO&lt;br /&gt;
* Ligne 15 on défini REVERSE si le signal est inversé en entrée ce qui est la cas avec notre montage à transistors NPN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les variables&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 17 à 22 des entiers non signés sur 32 bits qui servent a mémoriser les &amp;quot;timestamps en microsecondes&amp;quot; des derniers événements (&#039;&#039;RISE&#039;&#039; et  &#039;&#039;FALL&#039;&#039;) et la durée des états &#039;&#039;HAUTS&#039;&#039; BAS.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|47x47px]]&lt;br /&gt;
|Attention dans ce code on ne gère pas le cas ou la valeur du timestamp en microsecondes va repasser à zéro. &lt;br /&gt;
Apres 4 294 967 296 µs soit 1h11 notre programme va planter! (d&#039;où le commentaire en début de fichier)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Ligne 24 et 25 le cadre de décodage (buffer et pointeur)&lt;br /&gt;
* Ligne 26 la variable décodée (double buffering)&lt;br /&gt;
* Ligne 28 l&#039;état de la ligne à un instant donné.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Le code&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Lignes 30 à 44 gestion de la lecture de la valeur des deux lignes. Prends en compte la constante REVERSE (gestion du transistor NPN)&lt;br /&gt;
* &#039;&#039;&#039;Lignes 46 à 61 : C&#039;est l&#039;une des deux fonctions primordiales.&#039;&#039;&#039; C&#039;est une interruption appelée à chaque front montant (le NPN est géré). &lt;br /&gt;
** Elle &amp;quot;remplis&amp;quot; le buffer bit après bit à chaque front montant du signal du comparateur (attention NPN)&lt;br /&gt;
** Lorsque une &amp;quot;frame&amp;quot; est pleine on la transfère dans le buffer de lecture&lt;br /&gt;
** Accessoirement (lignes 59 et 61) on mets à disposition les signaux décodés sur des deux GPIO&lt;br /&gt;
* Lignes 63 à 66 : Gestion des fronts descendants (juste pour calculer la longueur de l&#039;état haut) &lt;br /&gt;
* Lignes 69 à 76 : C&#039;est l&#039;interruption matérielle. Elle ne sert qu&#039;a tester l&#039;état de la clock (gestion du REVERSE) et a appeler la fonction rise ou fall.&lt;br /&gt;
* Ligne 78 à 98 : C&#039;est la seconde fonction importante. On décode la valeur rangée dans le buffer de lecture. &lt;br /&gt;
** Les bits 0 à 11 représentent la valeur&lt;br /&gt;
** Le bit 20 le signe (si = 1 c&#039;est un nombre négatif)&lt;br /&gt;
** Le bit 23 représente l&#039;unité (&amp;quot;mm&amp;quot; ou &amp;quot;inches&amp;quot;)&lt;br /&gt;
** Ligne 90 on passe en flotant et on ajuste l&#039;échelle en fonction de l&#039;unité lignes 90 à 97.&lt;br /&gt;
* La fonction setup (lignes 100 à 121) n&#039;a rien de grandiose. On initialise les GPIO. La seule chose est le &#039;&#039;&#039;while&#039;&#039;&#039; de la ligne 115 qui attends un état haut &amp;gt; 100ms pour commencer la mesure.&lt;br /&gt;
* Les lignes 123 à 126 (le loop) est un exemple d&#039;affichage de la valeur mesurée a intervalle régulier (asynchrone par rapport à la mesure)&lt;br /&gt;
La sortie UART de l&#039;ESP 32 nous donne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
8.61&lt;br /&gt;
10.65&lt;br /&gt;
14.06&lt;br /&gt;
14.06&lt;br /&gt;
10.83&lt;br /&gt;
10.83&lt;br /&gt;
8.64&lt;br /&gt;
8.64&lt;br /&gt;
7.44&lt;br /&gt;
7.44&lt;br /&gt;
6.19&lt;br /&gt;
4.23&lt;br /&gt;
4.23&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
0.00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Qui sont les valeurs en mm mesurées (identique a celle affichées sur l&#039;écran LCD du comparateur). Je n&#039;ai pas ajouté l&#039;unité pour pouvoir utiliser le &amp;quot;plotter&amp;quot; de l&#039;IDE Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Arduino IDE plotter.png|sans_cadre|665x665px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons donc une méthode pour connaitre la valeur mesurées de façon logicielle. &lt;br /&gt;
&lt;br /&gt;
On pourra par exemple brancher notre montage sur l&#039;entrée série de l&#039;ordinateur de l&#039;atelier ou modifier le programme ci dessus pour mettre à disposition la valeur mesurée au travers d&#039;un web service ou un message [[MQTT]] sur le réseau.&lt;br /&gt;
&lt;br /&gt;
Il est amusant de constater que, même éteint, le comparateur continue à envoyer la valeur sur ses sorties numérique mais surtout de la mettre à jour. Seuls les  boutons &amp;quot;Unités&amp;quot; et &amp;quot;Zéro&amp;quot; arrêtent de fonctionner.&lt;br /&gt;
&lt;br /&gt;
== Les étapes suivantes... ==&lt;br /&gt;
Il faudra usiner un connecteur &amp;quot;maison&amp;quot; pour pas être obligé de démonter un comparateur à chaque fois.&lt;br /&gt;
&lt;br /&gt;
Et... le top du top, écrire une programme pour piloter une [[CNC 3018]] et sortir un fichier &amp;quot;heigth&amp;quot; pour corriger les erreurs de planéité.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-messages-multiples.png&amp;diff=2081</id>
		<title>Fichier:Comparateur-messages-multiples.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur-messages-multiples.png&amp;diff=2081"/>
		<updated>2026-07-15T21:43:44Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Comparateur-messages-multiples.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Comparateur-messages-multiples&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur_broche_3.png&amp;diff=2080</id>
		<title>Fichier:Comparateur broche 3.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Comparateur_broche_3.png&amp;diff=2080"/>
		<updated>2026-07-15T21:39:39Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Comparateur broche 3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;comparateur broche 3&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=CNC_3018&amp;diff=2079</id>
		<title>CNC 3018</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=CNC_3018&amp;diff=2079"/>
		<updated>2026-07-11T17:36:07Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Les forêt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sur Logiciels nécessaires ==&lt;br /&gt;
Une CNC c&#039;est bien mais &amp;quot;toute nue&amp;quot; avec seulement sa micro télécommande. c&#039;est pas l&#039;idéal.&lt;br /&gt;
&lt;br /&gt;
On trouve une liste de &amp;quot;ressources&amp;quot; chez [https://docs.sainsmart.com/article/3jgtgas880-genmitsu-3018-pro-resources Genmitsu].&lt;br /&gt;
&lt;br /&gt;
=== Conception ===&lt;br /&gt;
Il faut d&#039;abord faire de la conception. En 2D avec InkScape par exemple et en 3D avec [[FreeCad|FreeCAD]] (un excellent outil).&lt;br /&gt;
&lt;br /&gt;
Avec FREECAD on peut générer des plans de coupe en 2D (des fichiers DXF) que l&#039;on pourra utiliser avec un logiciel de FAO.&lt;br /&gt;
&lt;br /&gt;
=== Génération du gcode ===&lt;br /&gt;
Je conseille l&#039;utilisation de &#039;&#039;&#039;Carbide Create&#039;&#039;&#039; ([https://carbide3d.com/carbidecreate/ lien]) pour générer le gcode.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beaucoup d&#039;avertissements:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|70x70px]]&lt;br /&gt;
|Depuis la version 7 de Carbide Create on ne peut plus, sans payer une version pro, générer de gcode. On utilisera la V6 que l&#039;on [https://carbide3d.com/carbidecreate/download6 trouve ici].&lt;br /&gt;
Mais même la 6 est assez récente et pas la plus adaptée à la CNC3018. &lt;br /&gt;
&lt;br /&gt;
Moi j&#039;utilise une &amp;quot;vielle&amp;quot; 1.1.7 mise a dispo par Genmitsu. &lt;br /&gt;
&lt;br /&gt;
Mais là.... c&#039;est chrome qui nous pose des problèmes. &lt;br /&gt;
&lt;br /&gt;
Le lien lui plait pas!&lt;br /&gt;
http://s3.amazonaws.com/s3.image.smart/download/101-60-3018PROVER/Grblcontrol%28Candle_1.1.7%20%29.zip&lt;br /&gt;
&lt;br /&gt;
Un wget fat le travail! vive la ligne de commande!&lt;br /&gt;
&lt;br /&gt;
Comme je suis gentil je le propose ici : https://node-red.pinon-hebert.fr/files/mrgmr4kn-vnnua0d6.zip&lt;br /&gt;
&lt;br /&gt;
Et là chrome laisse passer!&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|70x70px]]&lt;br /&gt;
|Pour les utilisateurs de Windows en français Carbide gère mal les séparateurs décimaux. Il n&#039;autorise que la saisie avec des points (1.2mm par exemple) mais utilise les settings de Windows pour valider la saisie. &lt;br /&gt;
Pour entrer un diamètre de fraise de 1,6 mm on est obligé de taper 1.6 (carbide interdit de saisir une virgule) en revanche, lors de la vérification de la saisie il utilise les settings Windows. Donc il oblige de saisir les nombres au format anglo-saxon mais interdit la validation si ce n&#039;est pas une &amp;quot;,&amp;quot; dans le cas de la France.... On appelle ça un dead-lock !&lt;br /&gt;
La seule solution pour se sortir de ce mauvais pas c&#039;est de changer les settings Windows. C&#039;est sale car tout le PC est impacté mais c&#039;est comme ça!&lt;br /&gt;
Sous Windows 11 le changement est assez fastidieux. Je le [[Changer les settings numériques sous Windows|décris ici]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pilotage de la CNC ===&lt;br /&gt;
Ensuite il faudra un logiciel de gestion de la machine pour &amp;quot;jouer le gcode&amp;quot; sur la CNC. Moi j&#039;utilise Candle GRBL.&lt;br /&gt;
&lt;br /&gt;
== Perçages ==&lt;br /&gt;
Avec une CNC et des fraises on peut faire des perçages en tout genres. Les &amp;quot;pockets&amp;quot; avec Carbade Create sont là pour ça. Mais leur principe est basé sur l&#039;utilisation d&#039;une fraise.&lt;br /&gt;
&lt;br /&gt;
* On positionne la fraise au centre du trou&lt;br /&gt;
* On la descends pour faire une premiere passe&lt;br /&gt;
* On la déplace pour faire le trou (éventuellement en plusieurs fois)&lt;br /&gt;
* On descends un peu plus bas&lt;br /&gt;
* ....&lt;br /&gt;
&lt;br /&gt;
Cela implique d&#039;avoir des fraises plus petites que le trou. &lt;br /&gt;
&lt;br /&gt;
Mais si nous voulons faire un joli trou cylindrique et que l&#039;on dispose d&#039;un foret du bon diamètre pourquoi faire compliqué!&lt;br /&gt;
&lt;br /&gt;
* On positionne le foret au dessus du trou&lt;br /&gt;
* On descends par petits coup sucessifs (pour casser le copeau)&lt;br /&gt;
* Et on remonte&lt;br /&gt;
&lt;br /&gt;
C&#039;est tout.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais deux scripts python pour gérer ça. &lt;br /&gt;
&lt;br /&gt;
# Un pour traduire les fichiers Excellon (issue de [[EAGLE2PCB|EAGLE PCB]] par exemple) en une description JSON plus simple&lt;br /&gt;
# Un second qui prends un JSON généré plus haut et en fait le gCode pour Candle GRBL&lt;br /&gt;
&lt;br /&gt;
Entre les deux étapes on peut modifier le JSON (ou même en créer un beau tout neuf).&lt;br /&gt;
&lt;br /&gt;
On trouvera le code ici : https://github.com/villoiseaux/cnctools/tree/main/simple-drilling&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vitesse de coupe ==&lt;br /&gt;
C&#039;est l&#039;un des paramètres le plus difficile a gérer. Surtout lorsque on sort du traditionnel MDF qui accepte un peut tout.&lt;br /&gt;
&lt;br /&gt;
Normalement la fraise doit faire de jolis copeaux. Si on avance trop vite le copeau est trop gros la fraise bloque et se casse. Si on est sous la vitesse idéale la fraise ne fait qu&#039;user la matière. on a alors de la sciure plutôt que de beau copeaux. Normalement ça peut être un moindre mal : ça marche mais on pourrait aller plus vite.&lt;br /&gt;
&lt;br /&gt;
=== Acrylique ===&lt;br /&gt;
[[Fichier:Lubrifiant.png|vignette|154x154px|Fellowes Huile pour destructeur de papier]]&lt;br /&gt;
C&#039;est souvent ce que l&#039;on appelle &amp;quot;plexiglass&amp;quot;. Ce sont les plaques de plastique transparent que l&#039;on a vu fleurir entre nous et les commerçants à la caisse. On en trouve beaucoup depuis la fin de la crise sanitaire.&lt;br /&gt;
&lt;br /&gt;
Il est difficile a usiner car, si on va trop vite en terme d&#039;avance la fraise casse (ça c&#039;est du classique) mais si on ne va pas assez vite elle frotte et... elle casse.&lt;br /&gt;
&lt;br /&gt;
En plus sur nos CNC bas de gamme la réduction de de la vitesse de la broche lui enlève tout son couple.&lt;br /&gt;
&lt;br /&gt;
La solution : &amp;quot;mets de l&#039;huile&amp;quot;. Oui c&#039;est la lubrification qui nous permettra de faire un joli travail.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne &amp;quot;quel lubrifiant utiliser&amp;quot;; j&#039;utilisais auparavant de l&#039;huile de coupe achetée  en grande surface de bricolage. Ca se présentait en spray et c&#039;était pas idéal. C&#039;est le hasard qui m&#039;a fait trouvé le lubrifiant idéal. &lt;br /&gt;
&lt;br /&gt;
Suite a un déménagement au bureau où je travailles on allait jeter un carton de liquide de lubrification pour les broyeurs à papier. &lt;br /&gt;
==== Les fraises ====&lt;br /&gt;
&lt;br /&gt;
===== Les &amp;quot;grosses&amp;quot; =====&lt;br /&gt;
J&#039;utilise des fraise HSS assez standards et elles ne s&#039;usent pas très vites.&lt;br /&gt;
&lt;br /&gt;
Classiquement j&#039;utilise des fraises cylindrique de 2mm, 3mm, 4mm (queue de 4) et 5mm (queue de 6).&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;acrylique je préfère les fraises de 2, 3 et 4mm elles marchent très bien.&lt;br /&gt;
[[Fichier:Fraises standards.png|alt=https://www.amazon.fr/gp/product/B07DNJHCJS/ref=ppx_yo_dt_b_search_asin_image?ie=UTF8&amp;amp;psc=1|vignette|21€ le lot chez Amazon]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&lt;br /&gt;
!Vitesse de la broche&lt;br /&gt;
!nb flutes&lt;br /&gt;
!Plunge rate&lt;br /&gt;
vitesse de descente&lt;br /&gt;
!Feedrate&lt;br /&gt;
Vitesse d&#039;avance&lt;br /&gt;
!Depth&lt;br /&gt;
Profondeur de coupe&lt;br /&gt;
|-&lt;br /&gt;
!2mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|2&lt;br /&gt;
|800 m/min&lt;br /&gt;
|1000 m/min &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0,200 mm&lt;br /&gt;
|-&lt;br /&gt;
!3mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|2&lt;br /&gt;
|800 m/min&lt;br /&gt;
|400 m/min&lt;br /&gt;
|0,200 mm&lt;br /&gt;
|-&lt;br /&gt;
!4mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|2&lt;br /&gt;
|800 m/min&lt;br /&gt;
|400 m/min&lt;br /&gt;
|0,200 mm&lt;br /&gt;
|}&lt;br /&gt;
1 Avec une fraise de 2mm de bonne qualité on peut avancer assez vite (1000 m/min) sans vraiment de lubrifiants. On reste a côté avec la &amp;quot;soufflete&amp;quot; pour évacuer les copeaux récalcitrants. &lt;br /&gt;
&lt;br /&gt;
Le truc est de laisser toujours la fraise baigner dans le lubrifiant. Tant que les copaux restent transparents c&#039;est bon. Des qu&#039;ils deviennent blancs c&#039;est qu&#039;il faut de l&#039;huile.&lt;br /&gt;
&lt;br /&gt;
===== Les &amp;quot;petites&amp;quot; =====&lt;br /&gt;
Pour un projet j&#039;ai usiné de l&#039;acrylique avec des fraises de 1mm et de 0.6mm. Le tout sur des plaques de 3 à 6mm d&#039;épaisseur.&lt;br /&gt;
&lt;br /&gt;
Je ne précise pas le nombre de &amp;quot;flutes&amp;quot; car elles sont très petites et ce n&#039;est pas précisé dans la doc!&lt;br /&gt;
&lt;br /&gt;
Je me suis fournis chez Amazon:&lt;br /&gt;
&lt;br /&gt;
* 10 Fraises de 1mm à  11.99€ https://www.amazon.fr/dp/B082B46442?ref=ppx_yo2ov_dt_b_product_details&amp;amp;th=1&lt;br /&gt;
* 10 Fraises de 0.6 mm à 21.69€ https://www.amazon.fr/dp/B08TR6X93M?psc=1&amp;amp;ref=ppx_yo2ov_dt_b_product_details&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps parlons de la fraise 1mm achetée chez Amazon. Je l&#039;ai utilisée classiquement avec le trio [[FreeCad|freecad]] + carbide + candel.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&lt;br /&gt;
!Vitesse de la broche&lt;br /&gt;
!Plunge rate&lt;br /&gt;
vitesse de descente&lt;br /&gt;
!Feedrate&lt;br /&gt;
Vitesse d&#039;avance&lt;br /&gt;
!Depth&lt;br /&gt;
Profondeur de coupe&lt;br /&gt;
|-&lt;br /&gt;
|1.0 mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|800 m/min&lt;br /&gt;
|400 m/min*&lt;br /&gt;
|0.2&lt;br /&gt;
|-&lt;br /&gt;
|0.6 mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|50 m/min&lt;br /&gt;
|50 m/min&lt;br /&gt;
|0.1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; On peut monter à 800 m/min mais ça a l&#039;air de &amp;quot;forcer&amp;quot; à vous de voir.&lt;br /&gt;
&lt;br /&gt;
Bien sur j&#039;utilise de l&#039;huile de coupe &amp;quot;Fellowes&amp;quot; décrite ci dessus. Pour que ce soit idéal j&#039;usine d&#039;abord un cadre que je pose sur la plaque à usiner. Ca fait un &amp;quot;petit bassin&amp;quot; que je remplis d&#039;huile c&#039;est parfait.&lt;br /&gt;
&lt;br /&gt;
===== Les forêt =====&lt;br /&gt;
Je me fournis chez Farnell:&lt;br /&gt;
* Un foret C.I.F. de 0.6mm à 5,64€ https://fr.farnell.com/cif/du66/foret-carbure-0-6mm/dp/1418450&lt;br /&gt;
La version que j&#039;utilisais avant 2024 de Carbide ne savait pas faire. J&#039;avais fait un programme python pour générer du gCode. Je donne la page [[CNC Percages gcode|ici]]. &lt;br /&gt;
&lt;br /&gt;
Maintenant, j&#039;utilise le build 652 et l&#039;option Drill existe maintenant. &lt;br /&gt;
&lt;br /&gt;
Il y a trois méthodes pour &amp;quot;faire des trous&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Drill3028.png|sans_cadre|396x396px]] &lt;br /&gt;
&lt;br /&gt;
En rouge le mouvement rapide (mode déplacement) en bleu le mode usinage plus lent. &lt;br /&gt;
&lt;br /&gt;
# La première méthode consiste à faire le perçage en un seul coup&lt;br /&gt;
# La seconde fait des aller/retours pour faire le percage en plusieurs étapes.&lt;br /&gt;
# La troisième fait également des AR mais les prolonge en ressortant l&#039;outil de la pièce pour mieux &amp;quot;casser&amp;quot; le copaux&lt;br /&gt;
&lt;br /&gt;
La prudence m&#039;avait poussé à utiliser la troisième. En revanche, l&#039;expérience montre que, avec un polycarbonate de 3 ou 5mm un perçage de 0,6mm reste possible sans casser l&#039;outil ni l&#039;encrasser.&lt;br /&gt;
&lt;br /&gt;
Pour le polycarbonate entre 0.6 et 1mm j&#039;utilise les valeurs suivantes :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!diamètre (mm)&lt;br /&gt;
!0.6&lt;br /&gt;
!0.7&lt;br /&gt;
!1&lt;br /&gt;
|-&lt;br /&gt;
!Pluge rate (m/min)&lt;br /&gt;
|200&lt;br /&gt;
|200&lt;br /&gt;
|200&lt;br /&gt;
|-&lt;br /&gt;
!Feed rate (m/min)&lt;br /&gt;
|500&lt;br /&gt;
|500&lt;br /&gt;
|500&lt;br /&gt;
|-&lt;br /&gt;
!RPM (t/min)&lt;br /&gt;
|10000&lt;br /&gt;
|10000&lt;br /&gt;
|10000&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
== Mode LASER ==&lt;br /&gt;
La CNC possède deux modes un mode normal et un mode LASER.&lt;br /&gt;
&lt;br /&gt;
* Mode normal : Durant l&#039;usinage la broche continue à tourner pendant les déplacements rapides entre deux traveaux.&lt;br /&gt;
* Mode Laser : Le laser est éteint lors des parcours rapides.&lt;br /&gt;
&lt;br /&gt;
L&#039;usage du mode Laser en usinage fait allumer la broche alors que la fraise est déja rentré dans la matière.&lt;br /&gt;
&lt;br /&gt;
L&#039;usage du mode normal en marquage (découpe) laser va faire des traits lors des déplacements.&lt;br /&gt;
&lt;br /&gt;
Pour changer de mode c&#039;est :&amp;lt;syntaxhighlight lang=&amp;quot;gcode&amp;quot;&amp;gt;&lt;br /&gt;
(Mode normal)&lt;br /&gt;
$32=0&lt;br /&gt;
(Mode laser)&lt;br /&gt;
$32=1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans mon cas le logiciel de laser (Laser GRBL) Force le paramètre à $32=1 alors que Candle ne le positionne pas à $32=0! On peut le rajouter dans la chaine d&#039;init mais ce n&#039;est pas la conf par défaut.&lt;br /&gt;
&lt;br /&gt;
== Le hardware ==&lt;br /&gt;
[[Fichier:GRBL 1.1.png|alt= GRBL 1.1|vignette|119x119px|GRBL 1.1]]&lt;br /&gt;
&lt;br /&gt;
=== La carte mère ===&lt;br /&gt;
Pour remplacer la carte mère livrée avec la CNC 3018 PRO d&#039;origine j&#039;ai trouvé une version améliorée:&lt;br /&gt;
&lt;br /&gt;
* Il y a un bouton ON/OFF digne de ce nom (pas le pousseur infame de la version d&#039;origine)&lt;br /&gt;
* Le bouton reset a changé de place (pas plus accessible qu&#039;avant mais ailleurs)&lt;br /&gt;
* Les connecteurs &amp;quot;d&#039;en bas&amp;quot; ne sont plus de bêtes broches espacés de 2.54 mais une série de &amp;quot;vrais&amp;quot; JST à deux voie.&lt;br /&gt;
* Un nouveau connecteur pour un bouton d&#039;arrêt d&#039;urgence est disponible (toujours en JST 2 voies)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CarteMere3018grbl1.1.png|sans_cadre|473x473px]]&lt;br /&gt;
&lt;br /&gt;
==== Le connecteur Offline Control à 8 broches à le &amp;quot;pinout&amp;quot; suivant: ====&lt;br /&gt;
[[Fichier:IDC-CNC-CONTROL.png|sans_cadre|128x128px]]&lt;br /&gt;
&lt;br /&gt;
Dans le gitlab du controleur on trouve le schéma:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema CTRL CNC.png|sans_cadre|405x405px]]&lt;br /&gt;
&lt;br /&gt;
Donc le pinout: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!#&lt;br /&gt;
!Rôle&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
| +5V&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
| +5V&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|NC&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|RXD (réception des données par le contrôleur. Correspond TXD de la carte mère&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|USB (détection USB branché sur la carte mère)&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|TXD&lt;br /&gt;
|}&lt;br /&gt;
Les niveaux d&#039;entrées sont en 0 - 5V. Un petit pont diviseur protège la broche 7 et un &amp;quot;adaptateur du pauvre&amp;quot; pour RX/TX.&lt;br /&gt;
&lt;br /&gt;
=== Installer une broche plus puissante que celle d&#039;origine ===&lt;br /&gt;
&lt;br /&gt;
=== Utiliser la sonde d&#039;axe Z ===&lt;br /&gt;
&lt;br /&gt;
=== Installer des &amp;quot;fin de courses&amp;quot; ===&lt;br /&gt;
Apres un an avec des &amp;quot;fin de courses&amp;quot; mécaniques de type microswitch.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Switchs fin de course.png|sans_cadre|122x122px]]&lt;br /&gt;
&lt;br /&gt;
Le fonctionnement était assez satisfaisant mais la durabilité a été mauvaise. Malgré des petits boitiers sur mesure imprimés en 3D pour les protéger ils n&#039;ont pas duré plus de 12 mois en utilisation moyenne.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai procédé à un remplacement par des modèles optiques.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Fin de course optique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C&#039;est significativement le même prix (entre 1 et 2 € chacun)&lt;br /&gt;
&lt;br /&gt;
Attention cependant ils sont assez sensibles et l&#039;obstacle à la lumière doit être efficace. 4mm de CPE jaune ne suffit pas, il faut impérativement du noir.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai crée des petits dispositifs imprimés en 3D pour placer ces capteurs:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:3D-stops-3018.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
On voit les supports en jaune. (sans compter les deux molettes X Y)&lt;br /&gt;
&lt;br /&gt;
==== Le capteur de fin de course &amp;quot;X&amp;quot; ====&lt;br /&gt;
[[Fichier:X-stop.png|sans_cadre|420x420px]][[Fichier:EndstopX-2.png|sans_cadre|424x424px]]Une pièce fixe est fixée sur les rails profilés &amp;quot;X&amp;quot; avec deux &amp;quot;t-nuts&amp;quot;. le capteur optique est fixé dessus. Un index est lui fixé sur le chariot &amp;quot;X&amp;quot; avec deux vis M2. Un perçage de 1.6 est fait dans le chariot puis fileté. le capteur et l&#039;index peuvent être ajustés en serrant ou desserrant les vis. Le connecteur du capteur se retrouve tourné vers l&#039;arrière.&lt;br /&gt;
&lt;br /&gt;
==== Le capteur de fin de course &amp;quot;Y&amp;quot; ====&lt;br /&gt;
[[Fichier:Endstop-Y.png|sans_cadre|420x420px]][[Fichier:Endstop-Y-vue 2.png|sans_cadre|420x420px]]&lt;br /&gt;
&lt;br /&gt;
Une pièce fixe portant le module optique est serrée sur le profilé Y. L&#039;index est fixé sur le plateau Y (par dessous). La fixation se fait par des vis et des t-nuts toujours pour ajuster.&lt;br /&gt;
&lt;br /&gt;
==== Le capteur de fin de course &amp;quot;Z&amp;quot; ====&lt;br /&gt;
C&#039;est le plus difficile à réaliser et le plus complexe (3 pièces)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Zstop.png|sans_cadre|421x421px]][[Fichier:Zstop-view2.png|sans_cadre|420x420px]]&lt;br /&gt;
&lt;br /&gt;
Le support du module optique est fixé sur le chariot X avec une vis M2. Un perçage sera fait sur le chariot taraudé en M2.&lt;br /&gt;
&lt;br /&gt;
L&#039;index est fait de deux pièces affin qu&#039;il soit &amp;quot;imprimable&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Sur la vue de droite on voit le détail des deux pièces. La partie rouge rentre dans la fente de serrage du support de broche. Elle permet un ajustement de quelques mm de l&#039;index dans l&#039;axe des Y. La pièce verte et la rouge seront collées à la cyano.&lt;br /&gt;
&lt;br /&gt;
l&#039;ajustement se fait toujours grâce à une vise M2 et a un taraudage dans le porte broche.&lt;br /&gt;
&lt;br /&gt;
=== Molette de déplacement manuelle ===&lt;br /&gt;
A faire&lt;br /&gt;
&lt;br /&gt;
== Liens utiles ==&lt;br /&gt;
Dans certains cas je n&#039;ai pas encore eu le temps d&#039;écrire &amp;quot;à ma façon&amp;quot; une page sur un sujet alors je donne des liens.&lt;br /&gt;
&lt;br /&gt;
* Comment utiliser une CNC 3018 avec un [[Raspberry PI]] https://lebearcnc.com/preparation-dun-rapsberry-pi-4-pour-piloter-sa-cnc-avec-bcnc-et-ou-cncjs-on-vous-montre-tout/&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Drill3028.png&amp;diff=2078</id>
		<title>Fichier:Drill3028.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Drill3028.png&amp;diff=2078"/>
		<updated>2026-07-11T17:36:00Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Drill3028.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;percages 3 modes&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=CNC_3018&amp;diff=2077</id>
		<title>CNC 3018</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=CNC_3018&amp;diff=2077"/>
		<updated>2026-07-11T17:22:12Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Génération du gcode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sur Logiciels nécessaires ==&lt;br /&gt;
Une CNC c&#039;est bien mais &amp;quot;toute nue&amp;quot; avec seulement sa micro télécommande. c&#039;est pas l&#039;idéal.&lt;br /&gt;
&lt;br /&gt;
On trouve une liste de &amp;quot;ressources&amp;quot; chez [https://docs.sainsmart.com/article/3jgtgas880-genmitsu-3018-pro-resources Genmitsu].&lt;br /&gt;
&lt;br /&gt;
=== Conception ===&lt;br /&gt;
Il faut d&#039;abord faire de la conception. En 2D avec InkScape par exemple et en 3D avec [[FreeCad|FreeCAD]] (un excellent outil).&lt;br /&gt;
&lt;br /&gt;
Avec FREECAD on peut générer des plans de coupe en 2D (des fichiers DXF) que l&#039;on pourra utiliser avec un logiciel de FAO.&lt;br /&gt;
&lt;br /&gt;
=== Génération du gcode ===&lt;br /&gt;
Je conseille l&#039;utilisation de &#039;&#039;&#039;Carbide Create&#039;&#039;&#039; ([https://carbide3d.com/carbidecreate/ lien]) pour générer le gcode.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beaucoup d&#039;avertissements:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|70x70px]]&lt;br /&gt;
|Depuis la version 7 de Carbide Create on ne peut plus, sans payer une version pro, générer de gcode. On utilisera la V6 que l&#039;on [https://carbide3d.com/carbidecreate/download6 trouve ici].&lt;br /&gt;
Mais même la 6 est assez récente et pas la plus adaptée à la CNC3018. &lt;br /&gt;
&lt;br /&gt;
Moi j&#039;utilise une &amp;quot;vielle&amp;quot; 1.1.7 mise a dispo par Genmitsu. &lt;br /&gt;
&lt;br /&gt;
Mais là.... c&#039;est chrome qui nous pose des problèmes. &lt;br /&gt;
&lt;br /&gt;
Le lien lui plait pas!&lt;br /&gt;
http://s3.amazonaws.com/s3.image.smart/download/101-60-3018PROVER/Grblcontrol%28Candle_1.1.7%20%29.zip&lt;br /&gt;
&lt;br /&gt;
Un wget fat le travail! vive la ligne de commande!&lt;br /&gt;
&lt;br /&gt;
Comme je suis gentil je le propose ici : https://node-red.pinon-hebert.fr/files/mrgmr4kn-vnnua0d6.zip&lt;br /&gt;
&lt;br /&gt;
Et là chrome laisse passer!&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|[[Fichier:Attention.png|sans_cadre|70x70px]]&lt;br /&gt;
|Pour les utilisateurs de Windows en français Carbide gère mal les séparateurs décimaux. Il n&#039;autorise que la saisie avec des points (1.2mm par exemple) mais utilise les settings de Windows pour valider la saisie. &lt;br /&gt;
Pour entrer un diamètre de fraise de 1,6 mm on est obligé de taper 1.6 (carbide interdit de saisir une virgule) en revanche, lors de la vérification de la saisie il utilise les settings Windows. Donc il oblige de saisir les nombres au format anglo-saxon mais interdit la validation si ce n&#039;est pas une &amp;quot;,&amp;quot; dans le cas de la France.... On appelle ça un dead-lock !&lt;br /&gt;
La seule solution pour se sortir de ce mauvais pas c&#039;est de changer les settings Windows. C&#039;est sale car tout le PC est impacté mais c&#039;est comme ça!&lt;br /&gt;
Sous Windows 11 le changement est assez fastidieux. Je le [[Changer les settings numériques sous Windows|décris ici]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pilotage de la CNC ===&lt;br /&gt;
Ensuite il faudra un logiciel de gestion de la machine pour &amp;quot;jouer le gcode&amp;quot; sur la CNC. Moi j&#039;utilise Candle GRBL.&lt;br /&gt;
&lt;br /&gt;
== Perçages ==&lt;br /&gt;
Avec une CNC et des fraises on peut faire des perçages en tout genres. Les &amp;quot;pockets&amp;quot; avec Carbade Create sont là pour ça. Mais leur principe est basé sur l&#039;utilisation d&#039;une fraise.&lt;br /&gt;
&lt;br /&gt;
* On positionne la fraise au centre du trou&lt;br /&gt;
* On la descends pour faire une premiere passe&lt;br /&gt;
* On la déplace pour faire le trou (éventuellement en plusieurs fois)&lt;br /&gt;
* On descends un peu plus bas&lt;br /&gt;
* ....&lt;br /&gt;
&lt;br /&gt;
Cela implique d&#039;avoir des fraises plus petites que le trou. &lt;br /&gt;
&lt;br /&gt;
Mais si nous voulons faire un joli trou cylindrique et que l&#039;on dispose d&#039;un foret du bon diamètre pourquoi faire compliqué!&lt;br /&gt;
&lt;br /&gt;
* On positionne le foret au dessus du trou&lt;br /&gt;
* On descends par petits coup sucessifs (pour casser le copeau)&lt;br /&gt;
* Et on remonte&lt;br /&gt;
&lt;br /&gt;
C&#039;est tout.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai fais deux scripts python pour gérer ça. &lt;br /&gt;
&lt;br /&gt;
# Un pour traduire les fichiers Excellon (issue de [[EAGLE2PCB|EAGLE PCB]] par exemple) en une description JSON plus simple&lt;br /&gt;
# Un second qui prends un JSON généré plus haut et en fait le gCode pour Candle GRBL&lt;br /&gt;
&lt;br /&gt;
Entre les deux étapes on peut modifier le JSON (ou même en créer un beau tout neuf).&lt;br /&gt;
&lt;br /&gt;
On trouvera le code ici : https://github.com/villoiseaux/cnctools/tree/main/simple-drilling&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vitesse de coupe ==&lt;br /&gt;
C&#039;est l&#039;un des paramètres le plus difficile a gérer. Surtout lorsque on sort du traditionnel MDF qui accepte un peut tout.&lt;br /&gt;
&lt;br /&gt;
Normalement la fraise doit faire de jolis copeaux. Si on avance trop vite le copeau est trop gros la fraise bloque et se casse. Si on est sous la vitesse idéale la fraise ne fait qu&#039;user la matière. on a alors de la sciure plutôt que de beau copeaux. Normalement ça peut être un moindre mal : ça marche mais on pourrait aller plus vite.&lt;br /&gt;
&lt;br /&gt;
=== Acrylique ===&lt;br /&gt;
[[Fichier:Lubrifiant.png|vignette|154x154px|Fellowes Huile pour destructeur de papier]]&lt;br /&gt;
C&#039;est souvent ce que l&#039;on appelle &amp;quot;plexiglass&amp;quot;. Ce sont les plaques de plastique transparent que l&#039;on a vu fleurir entre nous et les commerçants à la caisse. On en trouve beaucoup depuis la fin de la crise sanitaire.&lt;br /&gt;
&lt;br /&gt;
Il est difficile a usiner car, si on va trop vite en terme d&#039;avance la fraise casse (ça c&#039;est du classique) mais si on ne va pas assez vite elle frotte et... elle casse.&lt;br /&gt;
&lt;br /&gt;
En plus sur nos CNC bas de gamme la réduction de de la vitesse de la broche lui enlève tout son couple.&lt;br /&gt;
&lt;br /&gt;
La solution : &amp;quot;mets de l&#039;huile&amp;quot;. Oui c&#039;est la lubrification qui nous permettra de faire un joli travail.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne &amp;quot;quel lubrifiant utiliser&amp;quot;; j&#039;utilisais auparavant de l&#039;huile de coupe achetée  en grande surface de bricolage. Ca se présentait en spray et c&#039;était pas idéal. C&#039;est le hasard qui m&#039;a fait trouvé le lubrifiant idéal. &lt;br /&gt;
&lt;br /&gt;
Suite a un déménagement au bureau où je travailles on allait jeter un carton de liquide de lubrification pour les broyeurs à papier. &lt;br /&gt;
==== Les fraises ====&lt;br /&gt;
&lt;br /&gt;
===== Les &amp;quot;grosses&amp;quot; =====&lt;br /&gt;
J&#039;utilise des fraise HSS assez standards et elles ne s&#039;usent pas très vites.&lt;br /&gt;
&lt;br /&gt;
Classiquement j&#039;utilise des fraises cylindrique de 2mm, 3mm, 4mm (queue de 4) et 5mm (queue de 6).&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;acrylique je préfère les fraises de 2, 3 et 4mm elles marchent très bien.&lt;br /&gt;
[[Fichier:Fraises standards.png|alt=https://www.amazon.fr/gp/product/B07DNJHCJS/ref=ppx_yo_dt_b_search_asin_image?ie=UTF8&amp;amp;psc=1|vignette|21€ le lot chez Amazon]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&lt;br /&gt;
!Vitesse de la broche&lt;br /&gt;
!nb flutes&lt;br /&gt;
!Plunge rate&lt;br /&gt;
vitesse de descente&lt;br /&gt;
!Feedrate&lt;br /&gt;
Vitesse d&#039;avance&lt;br /&gt;
!Depth&lt;br /&gt;
Profondeur de coupe&lt;br /&gt;
|-&lt;br /&gt;
!2mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|2&lt;br /&gt;
|800 m/min&lt;br /&gt;
|1000 m/min &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&lt;br /&gt;
|0,200 mm&lt;br /&gt;
|-&lt;br /&gt;
!3mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|2&lt;br /&gt;
|800 m/min&lt;br /&gt;
|400 m/min&lt;br /&gt;
|0,200 mm&lt;br /&gt;
|-&lt;br /&gt;
!4mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|2&lt;br /&gt;
|800 m/min&lt;br /&gt;
|400 m/min&lt;br /&gt;
|0,200 mm&lt;br /&gt;
|}&lt;br /&gt;
1 Avec une fraise de 2mm de bonne qualité on peut avancer assez vite (1000 m/min) sans vraiment de lubrifiants. On reste a côté avec la &amp;quot;soufflete&amp;quot; pour évacuer les copeaux récalcitrants. &lt;br /&gt;
&lt;br /&gt;
Le truc est de laisser toujours la fraise baigner dans le lubrifiant. Tant que les copaux restent transparents c&#039;est bon. Des qu&#039;ils deviennent blancs c&#039;est qu&#039;il faut de l&#039;huile.&lt;br /&gt;
&lt;br /&gt;
===== Les &amp;quot;petites&amp;quot; =====&lt;br /&gt;
Pour un projet j&#039;ai usiné de l&#039;acrylique avec des fraises de 1mm et de 0.6mm. Le tout sur des plaques de 3 à 6mm d&#039;épaisseur.&lt;br /&gt;
&lt;br /&gt;
Je ne précise pas le nombre de &amp;quot;flutes&amp;quot; car elles sont très petites et ce n&#039;est pas précisé dans la doc!&lt;br /&gt;
&lt;br /&gt;
Je me suis fournis chez Amazon:&lt;br /&gt;
&lt;br /&gt;
* 10 Fraises de 1mm à  11.99€ https://www.amazon.fr/dp/B082B46442?ref=ppx_yo2ov_dt_b_product_details&amp;amp;th=1&lt;br /&gt;
* 10 Fraises de 0.6 mm à 21.69€ https://www.amazon.fr/dp/B08TR6X93M?psc=1&amp;amp;ref=ppx_yo2ov_dt_b_product_details&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps parlons de la fraise 1mm achetée chez Amazon. Je l&#039;ai utilisée classiquement avec le trio [[FreeCad|freecad]] + carbide + candel.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&lt;br /&gt;
!Vitesse de la broche&lt;br /&gt;
!Plunge rate&lt;br /&gt;
vitesse de descente&lt;br /&gt;
!Feedrate&lt;br /&gt;
Vitesse d&#039;avance&lt;br /&gt;
!Depth&lt;br /&gt;
Profondeur de coupe&lt;br /&gt;
|-&lt;br /&gt;
|1.0 mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|800 m/min&lt;br /&gt;
|400 m/min*&lt;br /&gt;
|0.2&lt;br /&gt;
|-&lt;br /&gt;
|0.6 mm&lt;br /&gt;
|max (10 000 t/min)&lt;br /&gt;
|50 m/min&lt;br /&gt;
|50 m/min&lt;br /&gt;
|0.1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; On peut monter à 800 m/min mais ça a l&#039;air de &amp;quot;forcer&amp;quot; à vous de voir.&lt;br /&gt;
&lt;br /&gt;
Bien sur j&#039;utilise de l&#039;huile de coupe &amp;quot;Fellowes&amp;quot; décrite ci dessus. Pour que ce soit idéal j&#039;usine d&#039;abord un cadre que je pose sur la plaque à usiner. Ca fait un &amp;quot;petit bassin&amp;quot; que je remplis d&#039;huile c&#039;est parfait.&lt;br /&gt;
&lt;br /&gt;
===== Les forêt =====&lt;br /&gt;
Je me fournis chez Farnell:&lt;br /&gt;
* Un foret C.I.F. de 0.6mm à 5,64€ https://fr.farnell.com/cif/du66/foret-carbure-0-6mm/dp/1418450&lt;br /&gt;
La version que j&#039;utilisais avant 2024 de Carbide ne savait pas faire. J&#039;avais fait un programme python pour générer du gCode. Je donne la page [[CNC Percages gcode|ici]]. &lt;br /&gt;
&lt;br /&gt;
J&#039;utilise le build 652 et l&#039;option Drill existe maintenant. &lt;br /&gt;
&lt;br /&gt;
Il y a trois méthodes pour &amp;quot;faire des trous&amp;quot;: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Drill3028.png|sans_cadre|396x396px]] &lt;br /&gt;
&lt;br /&gt;
En rouge le mouvement rapide (mode déplacement) en bleu le mode usinage plus lent. &lt;br /&gt;
&lt;br /&gt;
# La première méthode consiste à faire le perçage en un seul coup&lt;br /&gt;
# La seconde fait des aller/retours pour faire le percage en plusieurs étapes.&lt;br /&gt;
# La troisième fait également des AR mais les prolonge en ressortant l&#039;outil de la pièce pour mieux &amp;quot;casser&amp;quot; le copaux&lt;br /&gt;
&lt;br /&gt;
La prudence m&#039;avait poussé à utiliser la troisième. En revanche, l&#039;expérience montre que, avec un polycarbonate de 3 ou 5mm un perçage de 0,6mm reste possible sans casser l&#039;outil ni l&#039;encrasser.&lt;br /&gt;
&lt;br /&gt;
Pour le polycarbonate entre 0.6 et 1mm j&#039;utilise les valeurs suivantes :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!diamètre (mm)&lt;br /&gt;
!0.6&lt;br /&gt;
!0.7&lt;br /&gt;
!1&lt;br /&gt;
|-&lt;br /&gt;
!Pluge rate (m/min)&lt;br /&gt;
|200&lt;br /&gt;
|200&lt;br /&gt;
|200&lt;br /&gt;
|-&lt;br /&gt;
!Feed rate (m/min)&lt;br /&gt;
|500&lt;br /&gt;
|500&lt;br /&gt;
|500&lt;br /&gt;
|-&lt;br /&gt;
!RPM (t/min)&lt;br /&gt;
|10000&lt;br /&gt;
|10000&lt;br /&gt;
|10000&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
== Mode LASER ==&lt;br /&gt;
La CNC possède deux modes un mode normal et un mode LASER.&lt;br /&gt;
&lt;br /&gt;
* Mode normal : Durant l&#039;usinage la broche continue à tourner pendant les déplacements rapides entre deux traveaux.&lt;br /&gt;
* Mode Laser : Le laser est éteint lors des parcours rapides.&lt;br /&gt;
&lt;br /&gt;
L&#039;usage du mode Laser en usinage fait allumer la broche alors que la fraise est déja rentré dans la matière.&lt;br /&gt;
&lt;br /&gt;
L&#039;usage du mode normal en marquage (découpe) laser va faire des traits lors des déplacements.&lt;br /&gt;
&lt;br /&gt;
Pour changer de mode c&#039;est :&amp;lt;syntaxhighlight lang=&amp;quot;gcode&amp;quot;&amp;gt;&lt;br /&gt;
(Mode normal)&lt;br /&gt;
$32=0&lt;br /&gt;
(Mode laser)&lt;br /&gt;
$32=1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans mon cas le logiciel de laser (Laser GRBL) Force le paramètre à $32=1 alors que Candle ne le positionne pas à $32=0! On peut le rajouter dans la chaine d&#039;init mais ce n&#039;est pas la conf par défaut.&lt;br /&gt;
&lt;br /&gt;
== Le hardware ==&lt;br /&gt;
[[Fichier:GRBL 1.1.png|alt= GRBL 1.1|vignette|119x119px|GRBL 1.1]]&lt;br /&gt;
&lt;br /&gt;
=== La carte mère ===&lt;br /&gt;
Pour remplacer la carte mère livrée avec la CNC 3018 PRO d&#039;origine j&#039;ai trouvé une version améliorée:&lt;br /&gt;
&lt;br /&gt;
* Il y a un bouton ON/OFF digne de ce nom (pas le pousseur infame de la version d&#039;origine)&lt;br /&gt;
* Le bouton reset a changé de place (pas plus accessible qu&#039;avant mais ailleurs)&lt;br /&gt;
* Les connecteurs &amp;quot;d&#039;en bas&amp;quot; ne sont plus de bêtes broches espacés de 2.54 mais une série de &amp;quot;vrais&amp;quot; JST à deux voie.&lt;br /&gt;
* Un nouveau connecteur pour un bouton d&#039;arrêt d&#039;urgence est disponible (toujours en JST 2 voies)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CarteMere3018grbl1.1.png|sans_cadre|473x473px]]&lt;br /&gt;
&lt;br /&gt;
==== Le connecteur Offline Control à 8 broches à le &amp;quot;pinout&amp;quot; suivant: ====&lt;br /&gt;
[[Fichier:IDC-CNC-CONTROL.png|sans_cadre|128x128px]]&lt;br /&gt;
&lt;br /&gt;
Dans le gitlab du controleur on trouve le schéma:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema CTRL CNC.png|sans_cadre|405x405px]]&lt;br /&gt;
&lt;br /&gt;
Donc le pinout: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!#&lt;br /&gt;
!Rôle&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
| +5V&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
| +5V&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|GND&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|NC&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|RXD (réception des données par le contrôleur. Correspond TXD de la carte mère&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|USB (détection USB branché sur la carte mère)&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|TXD&lt;br /&gt;
|}&lt;br /&gt;
Les niveaux d&#039;entrées sont en 0 - 5V. Un petit pont diviseur protège la broche 7 et un &amp;quot;adaptateur du pauvre&amp;quot; pour RX/TX.&lt;br /&gt;
&lt;br /&gt;
=== Installer une broche plus puissante que celle d&#039;origine ===&lt;br /&gt;
&lt;br /&gt;
=== Utiliser la sonde d&#039;axe Z ===&lt;br /&gt;
&lt;br /&gt;
=== Installer des &amp;quot;fin de courses&amp;quot; ===&lt;br /&gt;
Apres un an avec des &amp;quot;fin de courses&amp;quot; mécaniques de type microswitch.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Switchs fin de course.png|sans_cadre|122x122px]]&lt;br /&gt;
&lt;br /&gt;
Le fonctionnement était assez satisfaisant mais la durabilité a été mauvaise. Malgré des petits boitiers sur mesure imprimés en 3D pour les protéger ils n&#039;ont pas duré plus de 12 mois en utilisation moyenne.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai procédé à un remplacement par des modèles optiques.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Fin de course optique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C&#039;est significativement le même prix (entre 1 et 2 € chacun)&lt;br /&gt;
&lt;br /&gt;
Attention cependant ils sont assez sensibles et l&#039;obstacle à la lumière doit être efficace. 4mm de CPE jaune ne suffit pas, il faut impérativement du noir.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai crée des petits dispositifs imprimés en 3D pour placer ces capteurs:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:3D-stops-3018.png|sans_cadre|529x529px]]&lt;br /&gt;
&lt;br /&gt;
On voit les supports en jaune. (sans compter les deux molettes X Y)&lt;br /&gt;
&lt;br /&gt;
==== Le capteur de fin de course &amp;quot;X&amp;quot; ====&lt;br /&gt;
[[Fichier:X-stop.png|sans_cadre|420x420px]][[Fichier:EndstopX-2.png|sans_cadre|424x424px]]Une pièce fixe est fixée sur les rails profilés &amp;quot;X&amp;quot; avec deux &amp;quot;t-nuts&amp;quot;. le capteur optique est fixé dessus. Un index est lui fixé sur le chariot &amp;quot;X&amp;quot; avec deux vis M2. Un perçage de 1.6 est fait dans le chariot puis fileté. le capteur et l&#039;index peuvent être ajustés en serrant ou desserrant les vis. Le connecteur du capteur se retrouve tourné vers l&#039;arrière.&lt;br /&gt;
&lt;br /&gt;
==== Le capteur de fin de course &amp;quot;Y&amp;quot; ====&lt;br /&gt;
[[Fichier:Endstop-Y.png|sans_cadre|420x420px]][[Fichier:Endstop-Y-vue 2.png|sans_cadre|420x420px]]&lt;br /&gt;
&lt;br /&gt;
Une pièce fixe portant le module optique est serrée sur le profilé Y. L&#039;index est fixé sur le plateau Y (par dessous). La fixation se fait par des vis et des t-nuts toujours pour ajuster.&lt;br /&gt;
&lt;br /&gt;
==== Le capteur de fin de course &amp;quot;Z&amp;quot; ====&lt;br /&gt;
C&#039;est le plus difficile à réaliser et le plus complexe (3 pièces)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Zstop.png|sans_cadre|421x421px]][[Fichier:Zstop-view2.png|sans_cadre|420x420px]]&lt;br /&gt;
&lt;br /&gt;
Le support du module optique est fixé sur le chariot X avec une vis M2. Un perçage sera fait sur le chariot taraudé en M2.&lt;br /&gt;
&lt;br /&gt;
L&#039;index est fait de deux pièces affin qu&#039;il soit &amp;quot;imprimable&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Sur la vue de droite on voit le détail des deux pièces. La partie rouge rentre dans la fente de serrage du support de broche. Elle permet un ajustement de quelques mm de l&#039;index dans l&#039;axe des Y. La pièce verte et la rouge seront collées à la cyano.&lt;br /&gt;
&lt;br /&gt;
l&#039;ajustement se fait toujours grâce à une vise M2 et a un taraudage dans le porte broche.&lt;br /&gt;
&lt;br /&gt;
=== Molette de déplacement manuelle ===&lt;br /&gt;
A faire&lt;br /&gt;
&lt;br /&gt;
== Liens utiles ==&lt;br /&gt;
Dans certains cas je n&#039;ai pas encore eu le temps d&#039;écrire &amp;quot;à ma façon&amp;quot; une page sur un sujet alors je donne des liens.&lt;br /&gt;
&lt;br /&gt;
* Comment utiliser une CNC 3018 avec un [[Raspberry PI]] https://lebearcnc.com/preparation-dun-rapsberry-pi-4-pour-piloter-sa-cnc-avec-bcnc-et-ou-cncjs-on-vous-montre-tout/&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Node-red_file_repository&amp;diff=2076</id>
		<title>Node-red file repository</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Node-red_file_repository&amp;diff=2076"/>
		<updated>2026-07-11T16:22:16Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MegaUpload personnel avec Node-RED =&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Mettre en place un petit service de partage de fichiers :&lt;br /&gt;
&lt;br /&gt;
* Upload protégé par login/mot de passe.&lt;br /&gt;
* Téléchargement public via une URL.&lt;br /&gt;
* Noms des fichiers pseudonymisés.&lt;br /&gt;
* Fichiers servis directement par Node-RED.&lt;br /&gt;
&lt;br /&gt;
Architecture :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Internet&lt;br /&gt;
    |&lt;br /&gt;
    v&lt;br /&gt;
Reverse Proxy&lt;br /&gt;
    |&lt;br /&gt;
    v&lt;br /&gt;
Node-RED (main-host)&lt;br /&gt;
    |&lt;br /&gt;
    +--- Upload via flow Node-RED&lt;br /&gt;
    |&lt;br /&gt;
    +--- Fichiers statiques (/var/www/static-files)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation des modules ==&lt;br /&gt;
&lt;br /&gt;
Copilot m&#039;avait proposer d&#039;Installer &amp;quot;à ma main&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;node-red-contrib-http-multipart&lt;br /&gt;
@alexandrainst/node-red-http-basic-auth&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le premier permet de recevoir des formulaires HTML multipart/form-data.&lt;br /&gt;
&lt;br /&gt;
Le second ajoute une authentification HTTP Basic.&lt;br /&gt;
&lt;br /&gt;
Pour le coup l&#039;interface graphique de node-red le permet tout aussi bien.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Node-red-update-palette.png|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
Dans le menu en haut a droite on a l&#039;option &amp;quot;Gérer la palette&amp;quot;. On a l&#039;impression que c&#039;est juste de la GUI mais non on passe par là pour ajouter des modules.&lt;br /&gt;
&lt;br /&gt;
On clique sur &amp;quot;Gérer la palette&amp;quot; et on a une fenêtre de sélection.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Nodered-add-node-red-contrib-http-multipart.png|sans_cadre|547x547px]]&lt;br /&gt;
&lt;br /&gt;
On choisit l&#039;onglet &amp;quot;Installer&amp;quot; et on recherche node-red-contrib-http-multipart.&lt;br /&gt;
&lt;br /&gt;
Dans le screenshot ci-dessus le bouton &amp;quot;Installé&amp;quot; est grisé mais si le module n&#039;était pas installé on aurait un bouton installer. Il suffit de cliquer dessus et c&#039;est fait.&lt;br /&gt;
&lt;br /&gt;
== Répertoire de stockage ==&lt;br /&gt;
&lt;br /&gt;
Créer un répertoire destiné à contenir les fichiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/www/static-files/&lt;br /&gt;
sudo mkdir -p /var/www/static-files/assets&lt;br /&gt;
sudo chown nodered:nodered /var/www/static-files/assets&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapter l&#039;utilisateur si nécessaire.&lt;br /&gt;
&lt;br /&gt;
== Activation du serveur statique Node-RED ==&lt;br /&gt;
&lt;br /&gt;
Modifier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.node-red/settings.js&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Décommenter et adapter :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
httpStatic: [&lt;br /&gt;
    {&lt;br /&gt;
        path: &amp;quot;/var/www/static-files/assets&amp;quot;,&lt;br /&gt;
        root: &amp;quot;/files/&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Redémarrer Node-RED :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart nodered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo hello &amp;gt; /var/www/static-files/test.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis ouvrir :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/files/test.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si le texte &amp;quot;hello&amp;quot; apparaît, le serveur statique fonctionne.&lt;br /&gt;
&lt;br /&gt;
== Page d&#039;upload ==&lt;br /&gt;
&lt;br /&gt;
URL :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/megaupload/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;MegaUpload&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
body {&lt;br /&gt;
    font-family: Arial, Helvetica, sans-serif;&lt;br /&gt;
    background: #f4f7fb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.container {&lt;br /&gt;
    max-width: 700px;&lt;br /&gt;
    margin: 80px auto;&lt;br /&gt;
    background: white;&lt;br /&gt;
    padding: 40px;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    box-shadow: 0 10px 30px rgba(0,0,0,0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.upload-box {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button {&lt;br /&gt;
    background: #2563eb;&lt;br /&gt;
    color: white;&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 12px 30px;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;📤 MegaUpload&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;upload-box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pload/upload&amp;quot;&lt;br /&gt;
      method=&amp;quot;post&amp;quot;&lt;br /&gt;
      enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;input type=&amp;quot;file&amp;quot;&lt;br /&gt;
           name=&amp;quot;fichier&amp;quot;&lt;br /&gt;
           required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;&lt;br /&gt;
        Envoyer le fichier&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Que l&#039;on rangera dans &amp;lt;code&amp;gt;/var/www/static-files/upload.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protection par mot de passe ==&lt;br /&gt;
&lt;br /&gt;
Ajouter un noeud :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http basic auth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
devant :&lt;br /&gt;
&lt;br /&gt;
* GET /megaupload/&lt;br /&gt;
* POST /megaupload/upload&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http in]&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
[http basic auth]&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
[template]&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
[http response]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Utilisateur unique ===&lt;br /&gt;
&lt;br /&gt;
Configurer directement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Utilisateur : upload&lt;br /&gt;
Mot de passe : xxxx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fichier d&#039;utilisateurs ===&lt;br /&gt;
Je penses que c&#039;est la seule solution acceptable car les mots de passes ne sont pas &amp;quot;en clair&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Format :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jean:motdepasse&lt;br /&gt;
alice:motdepasse&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou mieux, avec mots de passe bcrypt.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jean:$2y$10$...&lt;br /&gt;
alice:$2y$10$...&lt;br /&gt;
&amp;lt;/pre&amp;gt;J&#039;ai donc crée la chaine de noeuds:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Node-red-upload-page.png|sans_cadre|921x921px]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est tres simple : &lt;br /&gt;
&lt;br /&gt;
* Ou expose l&#039;url /megaupload (noeud index)&lt;br /&gt;
* au authentifie l&#039;utilisateur &lt;br /&gt;
* on lit le fichier /var/www/static-files/upload.html&lt;br /&gt;
* On le renvoie au client&lt;br /&gt;
&lt;br /&gt;
== Réception du fichier ==&lt;br /&gt;
&lt;br /&gt;
Flow :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[httpInMultipart]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[http basic auth]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[function]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[exec]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[template]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[http response]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configuration HTTP Multipart :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;fichier&amp;quot;,&lt;br /&gt;
    &amp;quot;maxCount&amp;quot;: 1&lt;br /&gt;
  }&lt;br /&gt;
]&amp;lt;/pre&amp;gt;En effet, dans la page d&#039;upload on ne propose qu&#039;un seul fichier. SI on veut en envoyer plusieurs, soit on refait l&#039;opération soit un fait un zip ou un tgz.&lt;br /&gt;
&lt;br /&gt;
== Pseudonymisation du nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
Function :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const f = msg.req.files.fichier[0];&lt;br /&gt;
&lt;br /&gt;
// Extension&lt;br /&gt;
const pos = f.originalname.lastIndexOf(&amp;quot;.&amp;quot;);&lt;br /&gt;
const ext = (pos &amp;gt;= 0)&lt;br /&gt;
    ? f.originalname.substring(pos).toLowerCase()&lt;br /&gt;
    : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Identifiant unique&lt;br /&gt;
const id =&lt;br /&gt;
    Date.now().toString(36) +&lt;br /&gt;
    &amp;quot;-&amp;quot; +&lt;br /&gt;
    Math.random().toString(36).substring(2, 10);&lt;br /&gt;
&lt;br /&gt;
// Nom stocké&lt;br /&gt;
msg.safeName = id + ext;&lt;br /&gt;
&lt;br /&gt;
// Nom affiché&lt;br /&gt;
msg.nomFichier =&lt;br /&gt;
    f.originalname.replace(/[&amp;lt;&amp;gt;]/g, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// URL publique&lt;br /&gt;
msg.urlFichier =&lt;br /&gt;
    &amp;quot;https://node-red.mon-domaine.fr/files/&amp;quot; +&lt;br /&gt;
    encodeURIComponent(msg.safeName);&lt;br /&gt;
&lt;br /&gt;
// Déplacement du fichier&lt;br /&gt;
msg.payload =&lt;br /&gt;
    &#039;-c \&#039;mv &amp;quot;&#039; + f.path +&lt;br /&gt;
    &#039;&amp;quot; &amp;quot;/var/www/static-files/&#039; +&lt;br /&gt;
    msg.safeName + &#039;&amp;quot;\&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
return msg;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PhotoVacances.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
devient, par exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mrggesvw-hwdhacrc.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déplacement du fichier ==&lt;br /&gt;
&lt;br /&gt;
Noeud Exec :&lt;br /&gt;
&lt;br /&gt;
On lance l&#039;exécution du msg.payload construit au dessus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Command : bash&lt;br /&gt;
Append : msg.payload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier temporaire créé par Multipart est déplacé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/tmp/abc123&lt;br /&gt;
        -&amp;gt;&lt;br /&gt;
/var/www/static-files/mrggesvw-hwdhacrc.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Page de succès ==&lt;br /&gt;
&lt;br /&gt;
Template :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Fichier enregistré&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
body {&lt;br /&gt;
    font-family: Arial, Helvetica, sans-serif;&lt;br /&gt;
    background: #f4f7fb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.container {&lt;br /&gt;
    max-width: 800px;&lt;br /&gt;
    margin: 80px auto;&lt;br /&gt;
    background: white;&lt;br /&gt;
    padding: 40px;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    box-shadow: 0 10px 30px rgba(0,0,0,0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.linkbox {&lt;br /&gt;
    padding: 15px;&lt;br /&gt;
    background: #f8fafc;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button {&lt;br /&gt;
    background: #2563eb;&lt;br /&gt;
    color: white;&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 10px 20px;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function copyLink() {&lt;br /&gt;
    const text =&lt;br /&gt;
        document.getElementById(&amp;quot;downloadLink&amp;quot;).value;&lt;br /&gt;
&lt;br /&gt;
    navigator.clipboard.writeText(text);&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;status&amp;quot;).innerText =&lt;br /&gt;
        &amp;quot;Lien copié ✓&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;✅ Fichier enregistré&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Nom du fichier :&lt;br /&gt;
&amp;lt;b&amp;gt;{{nomFichier}}&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;linkbox&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input id=&amp;quot;downloadLink&amp;quot;&lt;br /&gt;
           type=&amp;quot;text&amp;quot;&lt;br /&gt;
           value=&amp;quot;{{urlFichier}}&amp;quot;&lt;br /&gt;
           readonly&lt;br /&gt;
           style=&amp;quot;width:100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;copyLink()&amp;quot;&amp;gt;&lt;br /&gt;
    Copier le lien&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;status&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Chaine de upload.png|sans_cadre|852x852px]]&lt;br /&gt;
&lt;br /&gt;
Récapitulatifs des actions ci-dessus.&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
&lt;br /&gt;
=== Upload ===&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisateur authentifié ouvre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/megaupload/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sélectionne un fichier puis clique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Envoyer le fichier&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement ===&lt;br /&gt;
&lt;br /&gt;
Le destinataire reçoit un lien :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/files/mrggesvw-hwdhacrc.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aucune authentification n&#039;est nécessaire.&lt;br /&gt;
&lt;br /&gt;
== Améliorations possibles ==&lt;br /&gt;
&lt;br /&gt;
* Limiter la taille maximale des fichiers.&lt;br /&gt;
* Limiter les extensions autorisées.&lt;br /&gt;
* Suppression automatique après X jours.&lt;br /&gt;
* Historique des uploads dans MariaDB.&lt;br /&gt;
* Génération de liens à durée de vie limitée.&lt;br /&gt;
* Statistiques de téléchargement.&lt;br /&gt;
* QR-Code du lien de téléchargement.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
On obtient un mini &amp;quot;WeTransfer&amp;quot; personnel :&lt;br /&gt;
&lt;br /&gt;
* HTTPS via le reverse proxy.&lt;br /&gt;
* Upload privé.&lt;br /&gt;
* Download public.&lt;br /&gt;
* Noms de fichiers non prévisibles.&lt;br /&gt;
* Aucun serveur web supplémentaire requis.&lt;br /&gt;
* Entièrement réalisé avec Node-RED.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Chaine_de_upload.png&amp;diff=2075</id>
		<title>Fichier:Chaine de upload.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Chaine_de_upload.png&amp;diff=2075"/>
		<updated>2026-07-11T16:20:37Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;chaine de upload&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Node-red-upload-page.png&amp;diff=2074</id>
		<title>Fichier:Node-red-upload-page.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Node-red-upload-page.png&amp;diff=2074"/>
		<updated>2026-07-11T16:12:36Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La page d&#039;upload dans nodered&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Nodered-add-node-red-contrib-http-multipart.png&amp;diff=2073</id>
		<title>Fichier:Nodered-add-node-red-contrib-http-multipart.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Nodered-add-node-red-contrib-http-multipart.png&amp;diff=2073"/>
		<updated>2026-07-11T16:06:44Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ajouter node-red-contrib-http-multipart&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Node-red-update-palette.png&amp;diff=2072</id>
		<title>Fichier:Node-red-update-palette.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Node-red-update-palette.png&amp;diff=2072"/>
		<updated>2026-07-11T16:03:28Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Comment ajouter des modules&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Node-red_file_repository&amp;diff=2071</id>
		<title>Node-red file repository</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Node-red_file_repository&amp;diff=2071"/>
		<updated>2026-07-11T16:00:13Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Page créée avec « = MegaUpload personnel avec Node-RED = == Objectif ==  Mettre en place un petit service de partage de fichiers :  * Upload protégé par login/mot de passe. * Téléchargement public via une URL. * Noms des fichiers pseudonymisés. * Fichiers servis directement par Node-RED. * Reverse proxy HTTPS assuré par Caddy.  Architecture :  &amp;lt;pre&amp;gt; Internet     |     v Front-Router (Caddy)     |     v Node-RED (main-host)     |     +--- Upload via flow Node-RED     |     +-... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MegaUpload personnel avec Node-RED =&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Mettre en place un petit service de partage de fichiers :&lt;br /&gt;
&lt;br /&gt;
* Upload protégé par login/mot de passe.&lt;br /&gt;
* Téléchargement public via une URL.&lt;br /&gt;
* Noms des fichiers pseudonymisés.&lt;br /&gt;
* Fichiers servis directement par Node-RED.&lt;br /&gt;
* Reverse proxy HTTPS assuré par Caddy.&lt;br /&gt;
&lt;br /&gt;
Architecture :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Internet&lt;br /&gt;
    |&lt;br /&gt;
    v&lt;br /&gt;
Front-Router (Caddy)&lt;br /&gt;
    |&lt;br /&gt;
    v&lt;br /&gt;
Node-RED (main-host)&lt;br /&gt;
    |&lt;br /&gt;
    +--- Upload via flow Node-RED&lt;br /&gt;
    |&lt;br /&gt;
    +--- Fichiers statiques (/var/www/static-files)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation des modules ==&lt;br /&gt;
&lt;br /&gt;
Installer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
node-red-contrib-http-multipart&lt;br /&gt;
@alexandrainst/node-red-http-basic-auth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le premier permet de recevoir des formulaires HTML multipart/form-data.&lt;br /&gt;
&lt;br /&gt;
Le second ajoute une authentification HTTP Basic.&lt;br /&gt;
&lt;br /&gt;
== Répertoire de stockage ==&lt;br /&gt;
&lt;br /&gt;
Créer un répertoire destiné à contenir les fichiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/www/static-files&lt;br /&gt;
sudo chown nodered:nodered /var/www/static-files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adapter l&#039;utilisateur si nécessaire.&lt;br /&gt;
&lt;br /&gt;
== Activation du serveur statique Node-RED ==&lt;br /&gt;
&lt;br /&gt;
Modifier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.node-red/settings.js&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Décommenter et adapter :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
httpStatic: [&lt;br /&gt;
    {&lt;br /&gt;
        path: &amp;quot;/var/www/static-files&amp;quot;,&lt;br /&gt;
        root: &amp;quot;/files/&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Redémarrer Node-RED :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl --user restart nodered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou selon l&#039;installation :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart nodered&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo hello &amp;gt; /var/www/static-files/test.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis ouvrir :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/files/test.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si le texte &amp;quot;hello&amp;quot; apparaît, le serveur statique fonctionne.&lt;br /&gt;
&lt;br /&gt;
== Page d&#039;upload ==&lt;br /&gt;
&lt;br /&gt;
URL :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/megaupload/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
HTML :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;MegaUpload&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
body {&lt;br /&gt;
    font-family: Arial, Helvetica, sans-serif;&lt;br /&gt;
    background: #f4f7fb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.container {&lt;br /&gt;
    max-width: 700px;&lt;br /&gt;
    margin: 80px auto;&lt;br /&gt;
    background: white;&lt;br /&gt;
    padding: 40px;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    box-shadow: 0 10px 30px rgba(0,0,0,0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1 {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.upload-box {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button {&lt;br /&gt;
    background: #2563eb;&lt;br /&gt;
    color: white;&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 12px 30px;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;📤 MegaUpload&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;upload-box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pload/upload&amp;quot;&lt;br /&gt;
      method=&amp;quot;post&amp;quot;&lt;br /&gt;
      enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;input type=&amp;quot;file&amp;quot;&lt;br /&gt;
           name=&amp;quot;fichier&amp;quot;&lt;br /&gt;
           required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;&lt;br /&gt;
        Envoyer le fichier&lt;br /&gt;
    &amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protection par mot de passe ==&lt;br /&gt;
&lt;br /&gt;
Ajouter un noeud :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http basic auth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
devant :&lt;br /&gt;
&lt;br /&gt;
* GET /megaupload/&lt;br /&gt;
* POST /megaupload/upload&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[http in]&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
[http basic auth]&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
[template]&lt;br /&gt;
      |&lt;br /&gt;
      v&lt;br /&gt;
[http response]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Utilisateur unique ===&lt;br /&gt;
&lt;br /&gt;
Configurer directement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Utilisateur : upload&lt;br /&gt;
Mot de passe : xxxx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fichier d&#039;utilisateurs ===&lt;br /&gt;
&lt;br /&gt;
Format :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jean:motdepasse&lt;br /&gt;
alice:motdepasse&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou mieux, avec mots de passe bcrypt.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jean:$2y$10$...&lt;br /&gt;
alice:$2y$10$...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Réception du fichier ==&lt;br /&gt;
&lt;br /&gt;
Flow :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[httpInMultipart]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[http basic auth]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[function]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[exec]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[template]&lt;br /&gt;
        |&lt;br /&gt;
        v&lt;br /&gt;
[http response]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configuration HTTP Multipart :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;fichier&amp;quot;,&lt;br /&gt;
    &amp;quot;maxCount&amp;quot;: 1&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pseudonymisation du nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
Function :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const f = msg.req.files.fichier[0];&lt;br /&gt;
&lt;br /&gt;
// Extension&lt;br /&gt;
const pos = f.originalname.lastIndexOf(&amp;quot;.&amp;quot;);&lt;br /&gt;
const ext = (pos &amp;gt;= 0)&lt;br /&gt;
    ? f.originalname.substring(pos).toLowerCase()&lt;br /&gt;
    : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Identifiant unique&lt;br /&gt;
const id =&lt;br /&gt;
    Date.now().toString(36) +&lt;br /&gt;
    &amp;quot;-&amp;quot; +&lt;br /&gt;
    Math.random().toString(36).substring(2, 10);&lt;br /&gt;
&lt;br /&gt;
// Nom stocké&lt;br /&gt;
msg.safeName = id + ext;&lt;br /&gt;
&lt;br /&gt;
// Nom affiché&lt;br /&gt;
msg.nomFichier =&lt;br /&gt;
    f.originalname.replace(/[&amp;lt;&amp;gt;]/g, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// URL publique&lt;br /&gt;
msg.urlFichier =&lt;br /&gt;
    &amp;quot;https://node-red.mon-domaine.fr/files/&amp;quot; +&lt;br /&gt;
    encodeURIComponent(msg.safeName);&lt;br /&gt;
&lt;br /&gt;
// Déplacement du fichier&lt;br /&gt;
msg.payload =&lt;br /&gt;
    &#039;-c \&#039;mv &amp;quot;&#039; + f.path +&lt;br /&gt;
    &#039;&amp;quot; &amp;quot;/var/www/static-files/&#039; +&lt;br /&gt;
    msg.safeName + &#039;&amp;quot;\&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
return msg;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PhotoVacances.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
devient :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mrggesvw-hwdhacrc.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déplacement du fichier ==&lt;br /&gt;
&lt;br /&gt;
Noeud Exec :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Command : bash&lt;br /&gt;
Append : msg.payload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier temporaire créé par Multipart est déplacé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/tmp/abc123&lt;br /&gt;
        -&amp;gt;&lt;br /&gt;
/var/www/static-files/mrggesvw-hwdhacrc.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Page de succès ==&lt;br /&gt;
&lt;br /&gt;
Template :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Fichier enregistré&amp;lt;/title&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
body {&lt;br /&gt;
    font-family: Arial, Helvetica, sans-serif;&lt;br /&gt;
    background: #f4f7fb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.container {&lt;br /&gt;
    max-width: 800px;&lt;br /&gt;
    margin: 80px auto;&lt;br /&gt;
    background: white;&lt;br /&gt;
    padding: 40px;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    box-shadow: 0 10px 30px rgba(0,0,0,0.1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.linkbox {&lt;br /&gt;
    padding: 15px;&lt;br /&gt;
    background: #f8fafc;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
button {&lt;br /&gt;
    background: #2563eb;&lt;br /&gt;
    color: white;&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 10px 20px;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function copyLink() {&lt;br /&gt;
    const text =&lt;br /&gt;
        document.getElementById(&amp;quot;downloadLink&amp;quot;).value;&lt;br /&gt;
&lt;br /&gt;
    navigator.clipboard.writeText(text);&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;status&amp;quot;).innerText =&lt;br /&gt;
        &amp;quot;Lien copié ✓&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;✅ Fichier enregistré&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Nom du fichier :&lt;br /&gt;
&amp;lt;b&amp;gt;{{nomFichier}}&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;linkbox&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input id=&amp;quot;downloadLink&amp;quot;&lt;br /&gt;
           type=&amp;quot;text&amp;quot;&lt;br /&gt;
           value=&amp;quot;{{urlFichier}}&amp;quot;&lt;br /&gt;
           readonly&lt;br /&gt;
           style=&amp;quot;width:100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;copyLink()&amp;quot;&amp;gt;&lt;br /&gt;
    Copier le lien&lt;br /&gt;
&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;status&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
&lt;br /&gt;
=== Upload ===&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisateur authentifié ouvre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/megaupload/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sélectionne un fichier puis clique :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Envoyer le fichier&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement ===&lt;br /&gt;
&lt;br /&gt;
Le destinataire reçoit un lien :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://node-red.mon-domaine.fr/files/mrggesvw-hwdhacrc.jpg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aucune authentification n&#039;est nécessaire.&lt;br /&gt;
&lt;br /&gt;
== Améliorations possibles ==&lt;br /&gt;
&lt;br /&gt;
* Limiter la taille maximale des fichiers.&lt;br /&gt;
* Limiter les extensions autorisées.&lt;br /&gt;
* Suppression automatique après X jours.&lt;br /&gt;
* Historique des uploads dans MariaDB.&lt;br /&gt;
* Génération de liens à durée de vie limitée.&lt;br /&gt;
* Statistiques de téléchargement.&lt;br /&gt;
* QR-Code du lien de téléchargement.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
On obtient un mini &amp;quot;WeTransfer&amp;quot; personnel :&lt;br /&gt;
&lt;br /&gt;
* HTTPS via Caddy.&lt;br /&gt;
* Upload privé.&lt;br /&gt;
* Download public.&lt;br /&gt;
* Noms de fichiers non prévisibles.&lt;br /&gt;
* Aucun serveur web supplémentaire requis.&lt;br /&gt;
* Entièrement réalisé avec Node-RED.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Applications_node-red&amp;diff=2070</id>
		<title>Applications node-red</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Applications_node-red&amp;diff=2070"/>
		<updated>2026-07-11T15:58:52Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Page créée avec « Dans cette page je vais ranger les différentes applications que j&amp;#039;ai réalisé dans node-red et que je trouve assez intéressantes pour les partager.  == Un &amp;quot;Mega Upoload&amp;quot; personnel (c&amp;#039;est beaucoup dire) == Ne serait-ce que pour ce wiki j&amp;#039;ai besoin de pouvoir partager un fichier par son URL. Par défaut MediaWiki ne sait gérer que des images en tant que fichiers. Il y a des extensions pour élargir cela mais je trouves plus intéressant de l&amp;#039;extarnaliser.  J&amp;#039;ai... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dans cette page je vais ranger les différentes applications que j&#039;ai réalisé dans node-red et que je trouve assez intéressantes pour les partager.&lt;br /&gt;
&lt;br /&gt;
== Un &amp;quot;Mega Upoload&amp;quot; personnel (c&#039;est beaucoup dire) ==&lt;br /&gt;
Ne serait-ce que pour ce wiki j&#039;ai besoin de pouvoir partager un fichier par son URL. Par défaut MediaWiki ne sait gérer que des images en tant que fichiers. Il y a des extensions pour élargir cela mais je trouves plus intéressant de l&#039;extarnaliser.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai dont crée une [[Node-red file repository|mini application avec Nodered]].&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2069</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2069"/>
		<updated>2026-07-11T15:54:44Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : nodered dans middlware&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenu sur ma nouvelle &amp;quot;Knowledge base&amp;quot; [[Spécial:Version|Version]] autohébergée.&lt;br /&gt;
&lt;br /&gt;
Une page temporaire pour la mise à jour de ce wiki-ci: [[MAJ WIKI]] (a faire)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Développement &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Logo C++.png|sans_cadre|61x61px]] C/C++ : C&#039;est[[Fichier:Le.png|sans_cadre|44x44px]] langage de programmation.&lt;br /&gt;
|Les [[sockets C]]&lt;br /&gt;
Gérer l&#039;écran &amp;quot;à la vi&amp;quot; avec [[Curses en C|curses]]&lt;br /&gt;
&lt;br /&gt;
Gérer le [[Temps à la milliseconde en C|temps à la milliseconde]].&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Perl logo.png|sans_cadre|48x48px]]Perl : Le meilleur langage de script. &lt;br /&gt;
|Quelques [[Quelques modules Perl|modules Perl]] utiles.&lt;br /&gt;
Petits [[hacks en perl]]. &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Python Logo.png|alt=Python|sans_cadre|74x74px]]Python : Pas mon préféré mais il est tellement utilisé!&lt;br /&gt;
|Syntaxe [[Les bases de Python|de base]],&lt;br /&gt;
Gestion des [[Exceptions en Python|exceptions]].&lt;br /&gt;
&lt;br /&gt;
Python et ses [[Environnements virtuels Python|environnements virtuels]].&lt;br /&gt;
&lt;br /&gt;
Les [[Modules et outils de développement Python|modules et les outils de développement]]. &lt;br /&gt;
&lt;br /&gt;
[[Gestion des documents PDF en Python|Gestion des documents PDF]]. &lt;br /&gt;
&lt;br /&gt;
[[Petits exemples de code Python|Petits exemples de code]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outils&lt;br /&gt;
|[[Fichier:Git logo.png|sans_cadre|67x67px]]Git&lt;br /&gt;
|[[GIT Utilisation simple|Utilisation simple]] &lt;br /&gt;
[[GIT-HUB]]&lt;br /&gt;
|-&lt;br /&gt;
|Shell&lt;br /&gt;
|sh/bash&lt;br /&gt;
|Syntaxe du [[If en bash|if]].&lt;br /&gt;
Syntaxe de [[For in bash|for]].&lt;br /&gt;
&lt;br /&gt;
Traiter des [[CSV bash|fichiers csv]]&lt;br /&gt;
Traitement de phrases [[Encodage d&#039;objets complexes#Usage en shell (commande jq)|JSON avec jq]]&lt;br /&gt;
&lt;br /&gt;
[[Bash random|Générer de hasard]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;8&amp;quot; |Système&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Global&lt;br /&gt;
|[[Encodage]] de caractères&lt;br /&gt;
|Le [[code morse]], le [[code baudot]], les codes [[ASCII]], les séquences [[ANSI]] le code [[Code Gray|Gray]] et un OVNI, le code [[Extended Binary Coded Decimal Interchange Code|EBCEDIC]]&lt;br /&gt;
les code [[UNICODE]].&lt;br /&gt;
|-&lt;br /&gt;
|Encodage d&#039;objets&lt;br /&gt;
|Les [[entiers]]&lt;br /&gt;
le [[temps]]&lt;br /&gt;
&lt;br /&gt;
Les [[nombres flottants]]&lt;br /&gt;
&lt;br /&gt;
[[Encodage d&#039;objets complexes|Les objets complexes]]&lt;br /&gt;
&lt;br /&gt;
Encodage de binaire en [[base64]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Linux [[Fichier:Linux-logo.png|sans_cadre|93x93px]]&lt;br /&gt;
|Général&lt;br /&gt;
|[[Généralités Linux|Généralités]] quel que soient les distributions de linux (ou UNIX).&lt;br /&gt;
Lancer un [[deamon avec systemd]].&lt;br /&gt;
&lt;br /&gt;
Configurer une client [[Connexion SSH|ssh]].&lt;br /&gt;
&lt;br /&gt;
Installer [[web-ssh]]&lt;br /&gt;
|-&lt;br /&gt;
|Debian (Ubuntu...)&lt;br /&gt;
|[[Gestion des services Debian/Ubuntu|Gestion des services]]&lt;br /&gt;
&lt;br /&gt;
[[Nettoyage APT]]&lt;br /&gt;
&lt;br /&gt;
Informations sur une [[Info distribution DEBIAN|distribution]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Windows Subsystem for Linux logo.png|gauche|sans_cadre|64x64px]]WSL &lt;br /&gt;
|Utiliser et personnaliser [[WSL /etc/hosts|/etc/hosts]]&lt;br /&gt;
[[Relancer WSL]]&lt;br /&gt;
&lt;br /&gt;
[[Monter un disque externe dans wsl]]&lt;br /&gt;
&lt;br /&gt;
[[Utiliser un port USB dans WSL]]&lt;br /&gt;
|-&lt;br /&gt;
|Windows [[Fichier:Microsoft Windows Logo.png|sans_cadre|96x96px]]&lt;br /&gt;
|..., 10, 11&lt;br /&gt;
|[[Wireshark]] &amp;lt;sub&amp;gt;(images manquantes)&amp;lt;/sub&amp;gt;&lt;br /&gt;
CYGWIN&lt;br /&gt;
&lt;br /&gt;
[[MINGW32]]&lt;br /&gt;
&lt;br /&gt;
[[Scoop]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Open WRT]]&lt;br /&gt;
[[Fichier:Open WRT LOGO.png|sans_cadre|135x135px]]&lt;br /&gt;
|Global&lt;br /&gt;
[[GL Inet]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gl-inet-router.png|sans_cadre|147x147px]]&lt;br /&gt;
|[[GL Inet Reset|Reset]] sortie d&#039;usine.&lt;br /&gt;
Réglage du serveur [[Open WRT DHCP|DHCP]]&lt;br /&gt;
&lt;br /&gt;
Ajouter un [[OpenWRTpackages|package]].&lt;br /&gt;
&lt;br /&gt;
[[Open WRT Commandes de base pour le réseau|Commandes de base pour le réseau]].&lt;br /&gt;
&lt;br /&gt;
[[tcpdump]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le ssh depuis le côté WAN.]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le WEB depuis le coté WAN]]&lt;br /&gt;
&lt;br /&gt;
Gérer des ampoules [[Wiz et OpenWRT|Phillips Wiz]].&lt;br /&gt;
&lt;br /&gt;
Installer un outil de [[Test de la bande passante Open WRT|test de la bande passante]] de la patte &amp;quot;wan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Auto hébergement&lt;br /&gt;
[[Fichier:AnarchySymbol.png|sans_cadre|107x107px]]&lt;br /&gt;
|[[Fichier:Raspberry.png|sans_cadre|40x40px]]  [[Raspberry PI]]&lt;br /&gt;
|L&#039;auto hébergement est assez facile à réaliser chez sois. Une solution est d&#039;utiliser un ou plusieurs raspberry PI.&lt;br /&gt;
[[Auto Hebergement|La base]] explique l&#039;installation de base d&#039;un PI comme serveur solitaire.&lt;br /&gt;
&lt;br /&gt;
En revanche on donne ci-dessous un exemple d&#039;architecture complète avec un cluster de 5 Raspberry PI :&lt;br /&gt;
&lt;br /&gt;
# [[Infrastructure basée PI|Architecture]]&lt;br /&gt;
# &amp;lt;code&amp;gt;front-router&amp;lt;/code&amp;gt;[[Le routeur en tête réseau PI|Le routeur en tête]] &lt;br /&gt;
# &amp;lt;code&amp;gt;main-host&amp;lt;/code&amp;gt; un [[Node-red dans le LAN|serveur IoT avec note-red]]. &lt;br /&gt;
#&amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;[[PI GitLab|Un serveur Git]]&lt;br /&gt;
#&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;[[PI MariaDB|Un serveur de base de données]]&lt;br /&gt;
#&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; [[PI MediaWiki|Un serveur mediawiki]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |APIs&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Géolocalisation et cartographie&lt;br /&gt;
|IP API&lt;br /&gt;
|[[Abstract API]] Donne une localisation a partir d&#039;une IP&lt;br /&gt;
[[IPinfo]] Une autre bibliotheque de localisation d&#039;IP&lt;br /&gt;
|-&lt;br /&gt;
|Ephemérides&lt;br /&gt;
|[[Sunset and sunrise times API]] va nous dire quand le soleil se lève quand il se couche, la lune…&lt;br /&gt;
|-&lt;br /&gt;
|Trafic Aérien&lt;br /&gt;
|[[FlightRadar24]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;6&amp;quot; |Logiciels&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Middleware&lt;br /&gt;
|Bases de données relationelles&lt;br /&gt;
|Le langage [[SQL]] &lt;br /&gt;
Les &amp;quot;minimales&amp;quot;: [[MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Les encore plus minimales: [[SQLite]] &lt;br /&gt;
&lt;br /&gt;
Les maximales: [[Oracle]], [[PostgeSQL]]&lt;br /&gt;
|-&lt;br /&gt;
|Bases de données NoSQL&lt;br /&gt;
|[[mongodb]]&lt;br /&gt;
|-&lt;br /&gt;
|Messages&lt;br /&gt;
|[[MQTT]]&lt;br /&gt;
|-&lt;br /&gt;
|Serveur applicatifs/web&lt;br /&gt;
|[[Apache]]&lt;br /&gt;
&lt;br /&gt;
[[Weblogic]]&lt;br /&gt;
&lt;br /&gt;
[[RPi-NodeRed|Nodered]] (exemple avec Raspberry PI) et certaines [[Applications node-red|applications]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Bureautique&lt;br /&gt;
|Excel&lt;br /&gt;
|[[Gestion des dates sous Excel|Gestion des dates]]&amp;lt;nowiki/&amp;gt; &lt;br /&gt;
[[EXCEL Gestion des chaines de caractères|Gest]][[EXCEL Gestion des chaines de caractères|io]][[EXCEL Gestion des chaines de caractères|n d]][[EXCEL Gestion des chaines de caractères|es cha]][[EXCEL Gestion des chaines de caractères|în]][[EXCEL Gestion des chaines de caractères|es de c]][[EXCEL Gestion des chaines de caractères|ar]][[EXCEL Gestion des chaines de caractères|actère]][[EXCEL Gestion des chaines de caractères|s]]&lt;br /&gt;
&lt;br /&gt;
[[Identifier si la clé d&#039;une ligne est présente dans un autre tableau]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outlook&lt;br /&gt;
|[[Outlook - Gestion des archives|Gestion des archives]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot; |Sécurite&lt;br /&gt;
|Chiffrement / déchiffrage&lt;br /&gt;
|OpenSSL&lt;br /&gt;
|[[Les bases de Open SSL|La base]]&lt;br /&gt;
[[OpenSSL et AES]] (symetrique)&lt;br /&gt;
&lt;br /&gt;
[[OpenSSL_et_RSA]] (asymetrique)&lt;br /&gt;
&lt;br /&gt;
Avec [[SMIME et Certificats x509|x509 et SMIME]] on marie les deux&lt;br /&gt;
&lt;br /&gt;
Comment [[OpenSSL extraire un certificat|extraire un certificat]] d&#039;un serveur en production.&lt;br /&gt;
&lt;br /&gt;
PGP et [[GPG]] (chiffrer de documents)&lt;br /&gt;
&lt;br /&gt;
Générer un [[mode de passe sécurisé]]&lt;br /&gt;
&lt;br /&gt;
Les autres commandes [[openssl]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Certificats&lt;br /&gt;
|Generalités&lt;br /&gt;
|[[Les certificats X.509|Un certificat c&#039;est quoi?]]&lt;br /&gt;
|-&lt;br /&gt;
|PKI&lt;br /&gt;
|[[PKI familiale|Faire une PKI &amp;quot;familiale&amp;quot;]]&lt;br /&gt;
|-&lt;br /&gt;
|https&lt;br /&gt;
|[[Certificats Serveur https|Certificats Serveur]]&lt;br /&gt;
[[Certificats Client https|Certificats Client]]&lt;br /&gt;
&lt;br /&gt;
[[Let&#039;s encrypt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Embarqué&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Microcontroleurs&lt;br /&gt;
|[[Fichier:Arduino Logo.png|sans_cadre|40x40px]][[Arduino]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[ESP8266]]&lt;br /&gt;
|Le module [[SON/OFF Smart Switch|Smart Switch]] de SONOFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Espessif logo.png|gauche|sans_cadre|40x40px]][[ESP32]]&lt;br /&gt;
|Environnement de dev [[ESP-IDF]], Utiliser [[mkspiffs]].&lt;br /&gt;
La carte &amp;quot;breakout&amp;quot; [[ESP32_DEVKITV1]]&lt;br /&gt;
La carte &amp;quot;AZ delivery&amp;quot; [[ESP32_DEVKITV2]]&lt;br /&gt;
&lt;br /&gt;
Faire des [[ESP32 Requetês HTTPs|requetês HTTPs]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Firmware Update|Firmware Update]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Matrice de led|Exemple d&#039;utilisation de matrice de LED]] (circuit MAX 72xx)&lt;br /&gt;
&lt;br /&gt;
Programmation module [[ESP32C3 avec écran spotear]].&lt;br /&gt;
|-&lt;br /&gt;
!Fusion&lt;br /&gt;
|Dev ESP 32 sur Raspberry PI&lt;br /&gt;
|Ici un article qui touche aux deux sujets. [[Poste de DEV ESP32 sur PI|Comment programmes les  microcontrôleurs ESP32 à partir d&#039;un raspberry PI]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |SBC (single board computers)&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Logo PI.png|sans_cadre|36x36px]][[Raspberry PI]]&lt;br /&gt;
|[[Les modèles de Raspberry PI]]&lt;br /&gt;
La configuration réseau [[DHCP ou IP fixe]] &lt;br /&gt;
&lt;br /&gt;
Ecran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]]&#039;et [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|Cohabitation des écrans]]. &lt;br /&gt;
&lt;br /&gt;
Utiliser le [[frame-buffer]]&lt;br /&gt;
&lt;br /&gt;
[[Demarrer PI4 en USB|Gérer un PI4 dont le lecteur de carte SD est HS]].&lt;br /&gt;
&lt;br /&gt;
Utiliser la [[camera PI]]&lt;br /&gt;
&lt;br /&gt;
Créer un [[Nouveau Menu Raspberry PI|nouveau sous menu dans le &amp;quot;main menu&amp;quot;]] du bureau.&lt;br /&gt;
|-&lt;br /&gt;
|Installer :&lt;br /&gt;
[[RPi-NodeRed|NodeRed]], [[Mosquitto]], [[MariaDB sur Raspberry PI|MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Le service graphique de gestion des mises à jour [[PackageKit]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Bpi.png|sans_cadre|48x48px]]Banana PI&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Objets connectés&lt;br /&gt;
|[[Fichier:PHILLIPS HUE LOGO.png|sans_cadre|87x87px]]&lt;br /&gt;
|Description [[PHILLIPS HUE|API]] de base&lt;br /&gt;
Le site de Phillips : https://developers.meethue.com/develop/hue-api-v2/getting-started/&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:X-sense logo.png|sans_cadre|52x52px]]x-sense&lt;br /&gt;
|[[X-sense|Description générale]]&lt;br /&gt;
Utilisation avec le module [[python-xsense]]&lt;br /&gt;
|-&lt;br /&gt;
|Phillips Wiz&lt;br /&gt;
|Les limites de ces [[Securite PHILLIPS WIZ|ampoules au niveau sécurité]].&lt;br /&gt;
Utilisation avec un [[Wiz et OpenWRT|routeur OpenWrt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;9&amp;quot; |Electronique&lt;br /&gt;
|Composants&lt;br /&gt;
|Composants actifs&lt;br /&gt;
|[[Le transistor bipolaire]]&lt;br /&gt;
|-&lt;br /&gt;
|Circuits&lt;br /&gt;
|Filtres&lt;br /&gt;
|Filtre de rejection : https://poujouly.net/2015/10/25/filtre-notch-50hz/ (oui un lien externe pour le moment)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Le labo&lt;br /&gt;
|Le protocoles&lt;br /&gt;
|[[UART/RS323]]&lt;br /&gt;
&lt;br /&gt;
[[SCPI uart]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Les outils de mesures connectables&lt;br /&gt;
|[[Multimètre]] modèle : &lt;br /&gt;
&lt;br /&gt;
* [[Multicomp PRO MP730027]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Générateur de fonctions arbitraire]] modèles : &lt;br /&gt;
&lt;br /&gt;
* [[GwINSTEK AFG-2012]]&lt;br /&gt;
* [[Multicomp MP75511]]&lt;br /&gt;
* [[FeelTech FY6600]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Osciloscope]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Alimantation]]&lt;br /&gt;
&lt;br /&gt;
[[Alimentation USB C]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Conception&lt;br /&gt;
|[[Fichier:Autodesk Eagle logo.png|sans_cadre|123x123px]]&lt;br /&gt;
|Logiciel de conception de circuits et de modélisation de circuit imprimés.&lt;br /&gt;
[[EAGLE - Plans de masse|Plans de masse]]&lt;br /&gt;
&lt;br /&gt;
[[Les unités dans EAGLE]]&lt;br /&gt;
|-&lt;br /&gt;
|LTspice&lt;br /&gt;
|Logiciel de simulation électronique&lt;br /&gt;
[[LTspice fichier de simulation|Utiliser un signal numérisé en entré d&#039;une simulation]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;7&amp;quot; |CAO FAO&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Mécanique&lt;br /&gt;
|Visserie&lt;br /&gt;
|[[Fichier:Logo-iso.png|sans_cadre|105x105px]][[Dimensions visserie ISO]]&lt;br /&gt;
|-&lt;br /&gt;
|Usinage&lt;br /&gt;
|Dimensions des [[fraises en unités Imériales/US]]&lt;br /&gt;
|-&lt;br /&gt;
|Fabrication additive&lt;br /&gt;
|Imprimantes 3D FDM&lt;br /&gt;
|[[Fichier:Ultimaker logo.png|sans_cadre|37x37px]] [[Ultimaker 2]]&lt;br /&gt;
|-&lt;br /&gt;
|CNC&lt;br /&gt;
|Fraiseuses&lt;br /&gt;
|La base… la [[CNC 3018|3018]].&lt;br /&gt;
Faire des perçages avec un [[CNC Percages gcode|programme python]].&lt;br /&gt;
&lt;br /&gt;
Graver des [[PCB avec CNC|PCB]]&lt;br /&gt;
&lt;br /&gt;
[[Changer la broche CNC3018|Changer la broche]]&lt;br /&gt;
|-&lt;br /&gt;
|Découpeuse (Vinyle ou autre)&lt;br /&gt;
|Silhouette&lt;br /&gt;
|[[SILHOUETTE Paramètres de base|Paramètres de base]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciels de CAO&lt;br /&gt;
|[[Fichier:Freecad logo.png|alt=FREE CAD|sans_cadre|47x47px]]FreeCad&lt;br /&gt;
|[[FreeCad]]&lt;br /&gt;
|-&lt;br /&gt;
|Outillage&lt;br /&gt;
|Metrologie&lt;br /&gt;
|[[Comparateur Numérique]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Projets complets&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Création/Configuration de serveur&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Exemple chez GANDI&lt;br /&gt;
|[[Serveur mediawiki basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur nodered basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur Owncloud]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur DNS GANDI|Serveur DNS]]&lt;br /&gt;
|-&lt;br /&gt;
|Objets connectés&lt;br /&gt;
|ESP32&lt;br /&gt;
|[[ESP32 Horloge à LED|Une Horloge à LED]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Photos&lt;br /&gt;
|Matériel&lt;br /&gt;
|D90&lt;br /&gt;
[[Fichier:D90.png|sans_cadre|58x58px]]&lt;br /&gt;
|[[Connectique D90|Connectique]]&lt;br /&gt;
|-&lt;br /&gt;
|Théorie&lt;br /&gt;
|&lt;br /&gt;
|Les [[bases en optique pour la photo]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciel&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2068</id>
		<title>Le transistor bipolaire</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2068"/>
		<updated>2026-06-25T07:03:22Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La base de l&#039;électronique!&lt;br /&gt;
&lt;br /&gt;
La page [https://fr.wikipedia.org/wiki/Transistor_bipolaire WIkipedia] est excellente, il y a tout! Peut être un peu trop tout. Je vais seulement mettre ici ce qui a été nécessaire à la conception de mes circuits.&lt;br /&gt;
&lt;br /&gt;
== En mode saturé/bloqué ==&lt;br /&gt;
Si, comme moi, vous vous intéressez essentiellement à l&#039;électronique logique c&#039;est ce qui nous intéressera. Plusieurs exemples d&#039;utilisations :&lt;br /&gt;
&lt;br /&gt;
* On à un signal issue d&#039;un microcontrôleur trop faible (en intensité) pour l&#039;utilisation désirée (Un relai, une LED haute luminosité etc..)&lt;br /&gt;
* On a un signal logique de très bas niveau (0-1V par exemple) que l&#039;ou souhaite lire avec le même microcontrôleur dont les seuils sont aux alentours de 3V.&lt;br /&gt;
&lt;br /&gt;
Il y a deux types de transistors NPN et PNP. La page Wikipédia nous explique tout cela. Je me limiterais au NPN et en particulier le BC547 qui est un grand classique (avec le 2N2222).&lt;br /&gt;
&lt;br /&gt;
Un transistor ça ressemble à ça :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo transistor bipolaire .png|sans_cadre|125x125px]]&lt;br /&gt;
&lt;br /&gt;
ET c&#039;est schématisé par :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema NPN.png|sans_cadre|105x105px]] ou bien [[Fichier:Schema BC547.png|sans_cadre|136x136px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;idée du composant est d&#039;amplifier un courant. Le courant de C (Collecteur) à E (Emetteur) est β fois plus grand que le courant passant entre B (Base) et E.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Amplification transistor.png|sans_cadre|390x390px]]&lt;br /&gt;
&lt;br /&gt;
On constate que le gain en courant est a peu près constant entre 0 et 100mA qui entre sur le collecteur.   &lt;br /&gt;
&lt;br /&gt;
Nous allons prendre un exemple avec un Microcontrôleur de type [[ESP32]]. Les sorties numériques sont au maximum capables de délivrer 40mA mais on voudrait allumer une belle LED AMS OSRAM GROUP KW DSLP31.CC-GXHX-4J8K-Z444. Elle s&#039;allume avec un courant de 40mA.  &lt;br /&gt;
&lt;br /&gt;
Les 40 mA de l&#039;ESP32 sont donc limites surtout si on utilise plusieurs. &lt;br /&gt;
&lt;br /&gt;
D&#039;autant plus que les 40mA c&#039;est le max sur TOUS les GPIO pas sur chacun. Bref il faut amplifier. &lt;br /&gt;
&lt;br /&gt;
=== Allumer une LED haute luminosité ===&lt;br /&gt;
On va décider d&#039;utiliser la LED aux 2/3 de sa luminosité, 66mA car le datasheet du transistor BC547 nous dit &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039;ce ne doit pas dépasser 100mA&lt;br /&gt;
&lt;br /&gt;
Le schéma ressemble à ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema LED.png|alt=schema NPN 1|sans_cadre|260x260px]]&lt;br /&gt;
&lt;br /&gt;
Il faut donc que 40 mA passent dans D1.&lt;br /&gt;
&lt;br /&gt;
* La tension aux bornes E-C du transistor = 0.6 V (datasheet)&lt;br /&gt;
* La tension entre Vcc et le Collecteur est de 3.3 - 0.6 V soit 2.7 V&lt;br /&gt;
&lt;br /&gt;
Grâce à la loi d&#039;ohm U=R I on calcule R = U/I&lt;br /&gt;
&lt;br /&gt;
R1=2.7/0.04 = 67 Ω.&lt;br /&gt;
&lt;br /&gt;
L&#039;amplification de courant est donnée par le paramètre β du transistor ou [[Fichier:HFE.png|sans_cadre|39x39px]]comme on trouve dans les datasheets. Dans notre cas on a [[Fichier:HFE.png|sans_cadre|39x39px]]=110&lt;br /&gt;
&lt;br /&gt;
Donc Ice=β·Ibe.&lt;br /&gt;
&lt;br /&gt;
Ibe=Ice/β&lt;br /&gt;
&lt;br /&gt;
Ibe=0.04/110 soit 0.36 mA&lt;br /&gt;
&lt;br /&gt;
Vbe=0.7 V&lt;br /&gt;
&lt;br /&gt;
R2=(3.3-0.7)/0.000036=7.1 K&lt;br /&gt;
&lt;br /&gt;
=== Adapter le signal de sortie du comparateur ===&lt;br /&gt;
Lors de l&#039;utilisation du [[Comparateur Numérique|comparateur numérique]] nous faisions face à un problème: la tension de sortie est de 1.6 V. Ce n&#039;est pas assez pour faire commuter une entrée d&#039;un l&#039;ESP32 et encore mois d&#039;un Arduino.&lt;br /&gt;
&lt;br /&gt;
Avec LTSpice &lt;br /&gt;
[[Fichier:Adaptateur comparateur.png|sans_cadre|450x450px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_LED.png&amp;diff=2067</id>
		<title>Fichier:Schema LED.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_LED.png&amp;diff=2067"/>
		<updated>2026-06-25T07:01:11Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Schema LED.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;schéma LED&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:HFE.png&amp;diff=2066</id>
		<title>Fichier:HFE.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:HFE.png&amp;diff=2066"/>
		<updated>2026-06-24T15:51:07Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:HFE.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:HFE.png&amp;diff=2065</id>
		<title>Fichier:HFE.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:HFE.png&amp;diff=2065"/>
		<updated>2026-06-24T15:49:29Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2064</id>
		<title>Le transistor bipolaire</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2064"/>
		<updated>2026-06-24T15:46:40Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Allumer une LED haute luminosité */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La base de l&#039;électronique!&lt;br /&gt;
&lt;br /&gt;
La page [https://fr.wikipedia.org/wiki/Transistor_bipolaire WIkipedia] est excellente, il y a tout! Peut être un peu trop tout. Je seulement mettre ici ce qui a été nécessaire à la conception de mes circuits.&lt;br /&gt;
&lt;br /&gt;
== En mode saturé/bloqué ==&lt;br /&gt;
Si, comme moi, vous vous intéressez essentiellement à l&#039;électronique logique c&#039;est ce qui nous intéressera. Plusieurs exemples d&#039;utilisations :&lt;br /&gt;
&lt;br /&gt;
* On à un signal issue d&#039;un microcontrôleur trop faible (en intensité) pour l&#039;utilisation désirée (Un relai, une LED haute luminosité etc..)&lt;br /&gt;
* On a un signal logique de très bas niveau (0-1V par exemple) que l&#039;ou souhaite lire avec le même microcontrôleur dont les seuils sont aux alentours de 3V.&lt;br /&gt;
&lt;br /&gt;
Il y a deux types de transistors NPN et PNP. La page Wikipédia nous explique tout cela. Je me limiterais au NPN et en particulier le BC547 qui est un grand classique (avec le 2N2222).&lt;br /&gt;
&lt;br /&gt;
Un transistor ça ressemble à ça :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo transistor bipolaire .png|sans_cadre|125x125px]]&lt;br /&gt;
&lt;br /&gt;
ET c&#039;est schématisé par :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema NPN.png|sans_cadre|105x105px]] ou bien [[Fichier:Schema BC547.png|sans_cadre|136x136px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;idée du composant est d&#039;amplifier un courant. Le courant de C (Collecteur) à E (Emetteur) est β fois plus grand que le courant passant entre B (Base) et E.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Amplification transistor.png|sans_cadre|390x390px]]&lt;br /&gt;
&lt;br /&gt;
On constate que le gain en courant est a peu près constant entre 0 et 100mA qui entre sur le collecteur.   &lt;br /&gt;
&lt;br /&gt;
Nous allons prendre un exemple avec un Microcontrôleur de type [[ESP32]]. Les sorties numériques sont au maximum capables de délivrer 40mA mais on voudrait allumer une belle LED AMS OSRAM GROUP KW DSLP31.CC-GXHX-4J8K-Z444. Elle s&#039;allume avec un courant de 40mA.  &lt;br /&gt;
&lt;br /&gt;
Les 40 mA de l&#039;ESP32 sont donc limites surtout si on utilise plusieurs. &lt;br /&gt;
&lt;br /&gt;
D&#039;autant plus que les 40mA c&#039;est le max sur TOUS les GPIO pas sur chacun. Bref il faut amplifier. &lt;br /&gt;
&lt;br /&gt;
=== Allumer une LED haute luminosité ===&lt;br /&gt;
On va décider d&#039;utiliser la LED aux 2/3 de sa luminosité, 66mA car le datasheet du transistor BC547 nous dit &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039;ce ne doit pas dépasser 100mA&lt;br /&gt;
&lt;br /&gt;
Le schéma ressemble à ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema LED.png|alt=schema NPN 1|sans_cadre|260x260px]]&lt;br /&gt;
&lt;br /&gt;
Il faut donc que 40 mA passent dans D1.&lt;br /&gt;
&lt;br /&gt;
* La tension aux bornes E-C du transistor = 0.6 V (datasheet)&lt;br /&gt;
* La tension entre Vcc et le Collecteur est de 3.3 - 0.6 V soit 2.7 V&lt;br /&gt;
&lt;br /&gt;
Grâce à la loi d&#039;ohm U=R I on calcule R = U/I&lt;br /&gt;
&lt;br /&gt;
R1=2.7/0.04 = 67 Ω.&lt;br /&gt;
&lt;br /&gt;
L&#039;amplification de courant est donnée par le paramètre β du transistor ou [[Fichier:HFE.png|sans_cadre|39x39px]]comme on trouve dans les datasheets. Dans notre cas on a [[Fichier:HFE.png|sans_cadre|39x39px]]=110&lt;br /&gt;
&lt;br /&gt;
Donc Ice=β·Ibe.&lt;br /&gt;
&lt;br /&gt;
Ibe=Ice/β&lt;br /&gt;
&lt;br /&gt;
Ibe=0.04/110 soit 0.36 mA&lt;br /&gt;
&lt;br /&gt;
Vbe=0.7 V&lt;br /&gt;
&lt;br /&gt;
R2=(3.3-0.7)/0.000036=7.1 K&lt;br /&gt;
&lt;br /&gt;
=== Adapter le signal de sortie du comparateur ===&lt;br /&gt;
Lors de l&#039;utilisation du [[Comparateur Numérique|comparateur numérique]] nous faisions face à un problème: la tension de sortie est de 1.6 V. Ce n&#039;est pas assez pour faire commuter une entrée d&#039;un l&#039;ESP32 et encore mois d&#039;un Arduino.&lt;br /&gt;
&lt;br /&gt;
Avec LTSpice &lt;br /&gt;
[[Fichier:Adaptateur comparateur.png|sans_cadre|450x450px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_LED.png&amp;diff=2063</id>
		<title>Fichier:Schema LED.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_LED.png&amp;diff=2063"/>
		<updated>2026-06-24T15:44:33Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Schema LED.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;schéma LED&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2062</id>
		<title>Le transistor bipolaire</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2062"/>
		<updated>2026-06-24T15:43:58Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* En mode saturé/bloqué */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La base de l&#039;électronique!&lt;br /&gt;
&lt;br /&gt;
La page [https://fr.wikipedia.org/wiki/Transistor_bipolaire WIkipedia] est excellente, il y a tout! Peut être un peu trop tout. Je seulement mettre ici ce qui a été nécessaire à la conception de mes circuits.&lt;br /&gt;
&lt;br /&gt;
== En mode saturé/bloqué ==&lt;br /&gt;
Si, comme moi, vous vous intéressez essentiellement à l&#039;électronique logique c&#039;est ce qui nous intéressera. Plusieurs exemples d&#039;utilisations :&lt;br /&gt;
&lt;br /&gt;
* On à un signal issue d&#039;un microcontrôleur trop faible (en intensité) pour l&#039;utilisation désirée (Un relai, une LED haute luminosité etc..)&lt;br /&gt;
* On a un signal logique de très bas niveau (0-1V par exemple) que l&#039;ou souhaite lire avec le même microcontrôleur dont les seuils sont aux alentours de 3V.&lt;br /&gt;
&lt;br /&gt;
Il y a deux types de transistors NPN et PNP. La page Wikipédia nous explique tout cela. Je me limiterais au NPN et en particulier le BC547 qui est un grand classique (avec le 2N2222).&lt;br /&gt;
&lt;br /&gt;
Un transistor ça ressemble à ça :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo transistor bipolaire .png|sans_cadre|125x125px]]&lt;br /&gt;
&lt;br /&gt;
ET c&#039;est schématisé par :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema NPN.png|sans_cadre|105x105px]] ou bien [[Fichier:Schema BC547.png|sans_cadre|136x136px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;idée du composant est d&#039;amplifier un courant. Le courant de C (Collecteur) à E (Emetteur) est β fois plus grand que le courant passant entre B (Base) et E.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Amplification transistor.png|sans_cadre|390x390px]]&lt;br /&gt;
&lt;br /&gt;
On constate que le gain en courant est a peu près constant entre 0 et 100mA qui entre sur le collecteur.   &lt;br /&gt;
&lt;br /&gt;
Nous allons prendre un exemple avec un Microcontrôleur de type [[ESP32]]. Les sorties numériques sont au maximum capables de délivrer 40mA mais on voudrait allumer une belle LED AMS OSRAM GROUP KW DSLP31.CC-GXHX-4J8K-Z444. Elle s&#039;allume avec un courant de 40mA.  &lt;br /&gt;
&lt;br /&gt;
Les 40 mA de l&#039;ESP32 sont donc limites surtout si on utilise plusieurs. &lt;br /&gt;
&lt;br /&gt;
D&#039;autant plus que les 40mA c&#039;est le max sur TOUS les GPIO pas sur chacun. Bref il faut amplifier. &lt;br /&gt;
&lt;br /&gt;
=== Allumer une LED haute luminosité ===&lt;br /&gt;
On va décider d&#039;utiliser la LED aux 2/3 de sa luminosité, 66mA car le datasheet du transistor BC547 nous dit &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039;ce ne doit pas dépasser 100mA&lt;br /&gt;
&lt;br /&gt;
Le schéma ressemble à ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema LED.png|alt=schema NPN 1|sans_cadre|468x468px]]&lt;br /&gt;
&lt;br /&gt;
Il faut donc que 40 mA passent dans D1.&lt;br /&gt;
&lt;br /&gt;
* La tension aux bornes E-C du transistor = 0.6 V (datasheet)&lt;br /&gt;
* La tension entre Vcc et le Collecteur est de 3.3 - 0.6 V soit 2.7 V&lt;br /&gt;
&lt;br /&gt;
Grâce à la loi d&#039;ohm U=R I on calcule R = U/I&lt;br /&gt;
&lt;br /&gt;
R1=2.7/0.04 = 67 Ω.&lt;br /&gt;
&lt;br /&gt;
L&#039;amplification de courant est donnée par le paramètre β du transistor ou [[Fichier:HFE.png|sans_cadre|39x39px]]comme on trouve dans les datasheets. Dans notre cas on a [[Fichier:HFE.png|sans_cadre|39x39px]]=110&lt;br /&gt;
&lt;br /&gt;
Donc Ice=β·Ibe.&lt;br /&gt;
&lt;br /&gt;
Ibe=Ice/β&lt;br /&gt;
&lt;br /&gt;
Ibe=0.04/110 soit 0.36 mA&lt;br /&gt;
&lt;br /&gt;
Vbe=0.7 V&lt;br /&gt;
&lt;br /&gt;
R2=(3.3-0.7)/0.000036=7.1 K&lt;br /&gt;
&lt;br /&gt;
=== Adapter le signal de sortie du comparateur ===&lt;br /&gt;
Lors de l&#039;utilisation du [[Comparateur Numérique|comparateur numérique]] nous faisions face à un problème: la tension de sortie est de 1.6 V. Ce n&#039;est pas assez pour faire commuter une entrée d&#039;un l&#039;ESP32 et encore mois d&#039;un Arduino.&lt;br /&gt;
&lt;br /&gt;
Avec LTSpice &lt;br /&gt;
[[Fichier:Adaptateur comparateur.png|sans_cadre|450x450px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Amplification_transistor.png&amp;diff=2061</id>
		<title>Fichier:Amplification transistor.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Amplification_transistor.png&amp;diff=2061"/>
		<updated>2026-06-24T15:28:01Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Amplification transistor.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;amplification transistor&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2060</id>
		<title>Le transistor bipolaire</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2060"/>
		<updated>2026-06-24T15:27:46Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* En mode saturé/bloqué */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La base de l&#039;électronique!&lt;br /&gt;
&lt;br /&gt;
La page [https://fr.wikipedia.org/wiki/Transistor_bipolaire WIkipedia] est excellente, il y a tout! Peut être un peu trop tout. Je seulement mettre ici ce qui a été nécessaire à la conception de mes circuits.&lt;br /&gt;
&lt;br /&gt;
== En mode saturé/bloqué ==&lt;br /&gt;
Si, comme moi, vous vous intéressez essentiellement à l&#039;électronique logique c&#039;est ce qui nous intéressera. Plusieurs exemples d&#039;utilisations :&lt;br /&gt;
&lt;br /&gt;
* On à un signal issue d&#039;un microcontrôleur trop faible (en intensité) pour l&#039;utilisation désirée (Un relai, une LED haute luminosité etc..)&lt;br /&gt;
* On a un signal logique de très bas niveau (0-1V par exemple) que l&#039;ou souhaite lire avec le même microcontrôleur dont les seuils sont aux alentours de 3V.&lt;br /&gt;
&lt;br /&gt;
Il y a deux types de transistors NPN et PNP. La page Wikipédia nous explique tout cela. Je me limiterais au NPN et en particulier le BC547 qui est un grand classique (avec le 2N2222).&lt;br /&gt;
&lt;br /&gt;
Un transistor ça ressemble à ça :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo transistor bipolaire .png|sans_cadre|125x125px]]&lt;br /&gt;
&lt;br /&gt;
ET c&#039;est schématisé par :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema NPN.png|sans_cadre|105x105px]] ou bien [[Fichier:Schema BC547.png|sans_cadre|136x136px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;idée du composant est d&#039;amplifier un courant. Le courant de C (Collecteur) à E (Emetteur) est β fois plus grand que le courant passant entre B (Base) et E.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Amplification transistor.png|sans_cadre|390x390px]]&lt;br /&gt;
&lt;br /&gt;
On voit que pour un courant de 50 µA on a un courant de collecteur de 10 mA  &lt;br /&gt;
&lt;br /&gt;
Nous allons prendre un exemple avec un Microcontrôleur de type [[ESP32]]. Les sorties numériques sont au maximum capables de délivrer 40mA mais on voudrait allumer une belle LED AMS OSRAM GROUP KW DSLP31.CC-GXHX-4J8K-Z444. Elle s&#039;allume avec un courant de 40mA.  &lt;br /&gt;
&lt;br /&gt;
Les 40 mA de l&#039;ESP32 sont donc limites surtout si on utilise plusieurs. &lt;br /&gt;
&lt;br /&gt;
D&#039;autant plus que les 40mA c&#039;est le max sur TOUS les GPIO pas sur chacun. Bref il faut amplifier. &lt;br /&gt;
&lt;br /&gt;
=== Allumer une LED haute luminosité ===&lt;br /&gt;
On va décider d&#039;utiliser la LED aux 2/3 de sa luminosité, 66mA car le datasheet du transistor BC547 nous dit &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039;ce ne doit pas dépasser 100mA&lt;br /&gt;
&lt;br /&gt;
Le schéma ressemble à ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema LED.png|alt=schema NPN 1|sans_cadre|468x468px]]&lt;br /&gt;
&lt;br /&gt;
Il faut donc que 40 mA passent dans D1.&lt;br /&gt;
&lt;br /&gt;
* La tension aux bornes E-C du transistor = 0.6 V (datasheet)&lt;br /&gt;
* La tension entre Vcc et le Collecteur est de 3.3 - 0.6 V soit 2.7 V&lt;br /&gt;
&lt;br /&gt;
Grâce à la loi d&#039;ohm U=R I on calcule R = U/I&lt;br /&gt;
&lt;br /&gt;
R1=2.7/0.04 = 67 Ω.&lt;br /&gt;
&lt;br /&gt;
L&#039;amplification de courant est donnée par le paramètre β du transistor ou [[Fichier:HFE.png|sans_cadre|39x39px]]comme on trouve dans les datasheets. Dans notre cas on a [[Fichier:HFE.png|sans_cadre|39x39px]]=110&lt;br /&gt;
&lt;br /&gt;
Donc Ice=β·Ibe.&lt;br /&gt;
&lt;br /&gt;
Ibe=Ice/β&lt;br /&gt;
&lt;br /&gt;
Ibe=0.04/110 soit 0.36 mA&lt;br /&gt;
&lt;br /&gt;
Vbe=0.7 V&lt;br /&gt;
&lt;br /&gt;
R2=(3.3-0.7)/0.000036=7.1 K&lt;br /&gt;
&lt;br /&gt;
=== Adapter le signal de sortie du comparateur ===&lt;br /&gt;
Lors de l&#039;utilisation du [[Comparateur Numérique|comparateur numérique]] nous faisions face à un problème: la tension de sortie est de 1.6 V. Ce n&#039;est pas assez pour faire commuter une entrée d&#039;un l&#039;ESP32 et encore mois d&#039;un Arduino.&lt;br /&gt;
&lt;br /&gt;
Avec LTSpice &lt;br /&gt;
[[Fichier:Adaptateur comparateur.png|sans_cadre|450x450px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2059</id>
		<title>Le transistor bipolaire</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2059"/>
		<updated>2026-06-24T15:15:42Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* En mode saturé/bloqué */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La base de l&#039;électronique!&lt;br /&gt;
&lt;br /&gt;
La page [https://fr.wikipedia.org/wiki/Transistor_bipolaire WIkipedia] est excellente, il y a tout! Peut être un peu trop tout. Je seulement mettre ici ce qui a été nécessaire à la conception de mes circuits.&lt;br /&gt;
&lt;br /&gt;
== En mode saturé/bloqué ==&lt;br /&gt;
Si, comme moi, vous vous intéressez essentiellement à l&#039;électronique logique c&#039;est ce qui nous intéressera. Plusieurs exemples d&#039;utilisations :&lt;br /&gt;
&lt;br /&gt;
* On à un signal issue d&#039;un microcontrôleur trop faible (en intensité) pour l&#039;utilisation désirée (Un relai, une LED haute luminosité etc..)&lt;br /&gt;
* On a un signal logique de très bas niveau (0-1V par exemple) que l&#039;ou souhaite lire avec le même microcontrôleur dont les seuils sont aux alentours de 3V.&lt;br /&gt;
&lt;br /&gt;
Il y a deux types de transistors NPN et PNP. La page Wikipédia nous explique tout cela. Je me limiterais au NPN et en particulier le BC547 qui est un grand classique (avec le 2N2222).&lt;br /&gt;
&lt;br /&gt;
Un transistor ça ressemble à ça :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo transistor bipolaire .png|sans_cadre|125x125px]]&lt;br /&gt;
&lt;br /&gt;
ET c&#039;est schématisé par :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema NPN.png|sans_cadre|105x105px]] ou bien [[Fichier:Schema BC547.png|sans_cadre|136x136px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;idée du composant est d&#039;amplifier un courant. Le courant de C (Collecteur) à E (Emetteur) est β fois plus grand que le courant passant entre B (Base) et E.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Amplification transistor.png|sans_cadre|390x390px]]&lt;br /&gt;
&lt;br /&gt;
Nous allons prendre un exemple avec un Microcontrôleur de type [[ESP32]]. Les sorties numériques sont au maximum capables de délivrer 40mA mais on voudrait allumer une belle LED AMS OSRAM GROUP KW DSLP31.CC-GXHX-4J8K-Z444. Elle s&#039;allume avec un courant de 40mA. Les 40 mA de l&#039;ESP32 sont donc limites surtout si on utilise plusieurs. &lt;br /&gt;
&lt;br /&gt;
=== Allumer une LED haute luminosité ===&lt;br /&gt;
On va décider d&#039;utiliser la LED aux 2/3 de sa luminosité, 66mA car le datasheet du transistor BC547 nous dit &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039;ce ne doit pas dépasser 100mA&lt;br /&gt;
&lt;br /&gt;
Le schéma ressemble à ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema LED.png|alt=schema NPN 1|sans_cadre|468x468px]]&lt;br /&gt;
&lt;br /&gt;
Il faut donc que 40 mA passent dans D1.&lt;br /&gt;
&lt;br /&gt;
* La tension aux bornes E-C du transistor = 0.6 V (datasheet)&lt;br /&gt;
* La tension entre Vcc et le Collecteur est de 3.3 - 0.6 V soit 2.7 V&lt;br /&gt;
&lt;br /&gt;
Grâce à la loi d&#039;ohm U=R I on calcule R = U/I&lt;br /&gt;
&lt;br /&gt;
R1=2.7/0.04 = 67 Ω.&lt;br /&gt;
&lt;br /&gt;
L&#039;amplification de courant est donnée par le paramètre β du transistor ou [[Fichier:HFE.png|sans_cadre|39x39px]]comme on trouve dans les datasheets. Dans notre cas on a [[Fichier:HFE.png|sans_cadre|39x39px]]=110&lt;br /&gt;
&lt;br /&gt;
Donc Ice=β·Ibe.&lt;br /&gt;
&lt;br /&gt;
Ibe=Ice/β&lt;br /&gt;
&lt;br /&gt;
Ibe=0.04/110 soit 0.36 mA&lt;br /&gt;
&lt;br /&gt;
Vbe=0.7 V&lt;br /&gt;
&lt;br /&gt;
R2=(3.3-0.7)/0.000036=7.1 K&lt;br /&gt;
&lt;br /&gt;
=== Adapter le signal de sortie du comparateur ===&lt;br /&gt;
Lors de l&#039;utilisation du [[Comparateur Numérique|comparateur numérique]] nous faisions face à un problème: la tension de sortie est de 1.6 V. Ce n&#039;est pas assez pour faire commuter une entrée d&#039;un l&#039;ESP32 et encore mois d&#039;un Arduino.&lt;br /&gt;
&lt;br /&gt;
Avec LTSpice &lt;br /&gt;
[[Fichier:Adaptateur comparateur.png|sans_cadre|450x450px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Amplification_transistor.png&amp;diff=2058</id>
		<title>Fichier:Amplification transistor.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Amplification_transistor.png&amp;diff=2058"/>
		<updated>2026-06-24T15:15:18Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Amplification transistor.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;amplification transistor&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_BC547.png&amp;diff=2057</id>
		<title>Fichier:Schema BC547.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_BC547.png&amp;diff=2057"/>
		<updated>2026-06-24T15:11:39Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Schema BC547.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schema BC547&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_NPN.png&amp;diff=2056</id>
		<title>Fichier:Schema NPN.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Schema_NPN.png&amp;diff=2056"/>
		<updated>2026-06-24T15:10:27Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Schema NPN.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;schema NPN&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2055</id>
		<title>Le transistor bipolaire</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Le_transistor_bipolaire&amp;diff=2055"/>
		<updated>2026-06-24T15:09:25Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La base de l&#039;électronique!&lt;br /&gt;
&lt;br /&gt;
La page [https://fr.wikipedia.org/wiki/Transistor_bipolaire WIkipedia] est excellente, il y a tout! Peut être un peu trop tout. Je seulement mettre ici ce qui a été nécessaire à la conception de mes circuits.&lt;br /&gt;
&lt;br /&gt;
== En mode saturé/bloqué ==&lt;br /&gt;
Si, comme moi, vous vous intéressez essentiellement à l&#039;électronique logique c&#039;est ce qui nous intéressera. Plusieurs exemples d&#039;utilisations :&lt;br /&gt;
&lt;br /&gt;
* On à un signal issue d&#039;un microcontrôleur trop faible (en intensité) pour l&#039;utilisation désirée (Un relai, une LED haute luminosité etc..)&lt;br /&gt;
* On a un signal logique de très bas niveau (0-1V par exemple) que l&#039;ou souhaite lire avec le même microcontrôleur dont les seuils sont aux alentours de 3V.&lt;br /&gt;
&lt;br /&gt;
Il y a deux types de transistors NPN et PNP. La page Wikipédia nous explique tout cela. Je me limiterais au NPN et en particulier le BC547 qui est un grand classique (avec le 2N2222).&lt;br /&gt;
&lt;br /&gt;
Un transistor ça ressemble à ça :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo transistor bipolaire .png|sans_cadre|125x125px]]&lt;br /&gt;
&lt;br /&gt;
ET c&#039;est schématisé par :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema NPN.png|sans_cadre|105x105px]] ou bien [[Fichier:Schema BC547.png|sans_cadre|136x136px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;idée du composant est d&#039;amplifier un courant. Le courant de C (Collecteur) à E (Emetteur) est β fois plus grand que le courant passant entre B (Base) et E.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Amplification transistor.png|sans_cadre|190x190px]]&lt;br /&gt;
&lt;br /&gt;
Nous allons prendre un exemple avec un Microcontrôleur de type [[ESP32]]. Les sorties numériques sont au maximum capables de délivrer 40mA mais on voudrait allumer une belle LED AMS OSRAM GROUP KW DSLP31.CC-GXHX-4J8K-Z444. Elle s&#039;allume avec un courant de 40mA. Les 40 mA de l&#039;ESP32 sont donc limites surtout si on utilise plusieurs. &lt;br /&gt;
&lt;br /&gt;
=== Allumer une LED haute luminosité ===&lt;br /&gt;
On va décider d&#039;utiliser la LED aux 2/3 de sa luminosité, 66mA car le datasheet du transistor BC547 nous dit &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039;ce ne doit pas dépasser 100mA&lt;br /&gt;
&lt;br /&gt;
Le schéma ressemble à ça:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schema LED.png|alt=schema NPN 1|sans_cadre|468x468px]]&lt;br /&gt;
&lt;br /&gt;
Il faut donc que 40 mA passent dans D1.&lt;br /&gt;
&lt;br /&gt;
* La tension aux bornes E-C du transistor = 0.6 V (datasheet)&lt;br /&gt;
* La tension entre Vcc et le Collecteur est de 3.3 - 0.6 V soit 2.7 V&lt;br /&gt;
&lt;br /&gt;
Grâce à la loi d&#039;ohm U=R I on calcule R = U/I&lt;br /&gt;
&lt;br /&gt;
R1=2.7/0.04 = 67 Ω.&lt;br /&gt;
&lt;br /&gt;
L&#039;amplification de courant est donnée par le paramètre β du transistor ou [[Fichier:HFE.png|sans_cadre|39x39px]]comme on trouve dans les datasheets. Dans notre cas on a [[Fichier:HFE.png|sans_cadre|39x39px]]=110&lt;br /&gt;
&lt;br /&gt;
Donc Ice=β·Ibe.&lt;br /&gt;
&lt;br /&gt;
Ibe=Ice/β&lt;br /&gt;
&lt;br /&gt;
Ibe=0.04/110 soit 0.36 mA&lt;br /&gt;
&lt;br /&gt;
Vbe=0.7 V&lt;br /&gt;
&lt;br /&gt;
R2=(3.3-0.7)/0.000036=7.1 K&lt;br /&gt;
&lt;br /&gt;
=== Adapter le signal de sortie du comparateur ===&lt;br /&gt;
Lors de l&#039;utilisation du [[Comparateur Numérique|comparateur numérique]] nous faisions face à un problème: la tension de sortie est de 1.6 V. Ce n&#039;est pas assez pour faire commuter une entrée d&#039;un l&#039;ESP32 et encore mois d&#039;un Arduino.&lt;br /&gt;
&lt;br /&gt;
Avec LTSpice &lt;br /&gt;
[[Fichier:Adaptateur comparateur.png|sans_cadre|450x450px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Photo_transistor_bipolaire_.png&amp;diff=2054</id>
		<title>Fichier:Photo transistor bipolaire .png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Photo_transistor_bipolaire_.png&amp;diff=2054"/>
		<updated>2026-06-24T15:08:49Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Photo transistor bipolaire .png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;photo transistor bipolaire&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:HUE-BRIDGE-MAC.png&amp;diff=2053</id>
		<title>Fichier:HUE-BRIDGE-MAC.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:HUE-BRIDGE-MAC.png&amp;diff=2053"/>
		<updated>2026-06-24T15:02:45Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:HUE-BRIDGE-MAC.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etiquette HUE bridge&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=WSL_/etc/hosts&amp;diff=2052</id>
		<title>WSL /etc/hosts</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=WSL_/etc/hosts&amp;diff=2052"/>
		<updated>2026-06-20T22:36:11Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Page créée avec « WSL etant un linux comme les autres il a son fichier &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;.  On peut l&amp;#039;éditer avec... vi.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; sudo vi /etc/hosts &amp;lt;/syntaxhighlight&amp;gt;Pour info le mot de passe pour sudo c&amp;#039;est le mot de passe windows du compte connecté.  Mais on a un problème. A chaque reboot de la VM de WSL le fichier est effacé et remplacé par celui de Windows.   Par défaut :&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt; C:\Windows\System32\drivers\etc &amp;lt;/syntaxhighli... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WSL etant un linux comme les autres il a son fichier &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;éditer avec... vi.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour info le mot de passe pour sudo c&#039;est le mot de passe windows du compte connecté.&lt;br /&gt;
&lt;br /&gt;
Mais on a un problème. A chaque reboot de la VM de WSL le fichier est effacé et remplacé par celui de Windows. &lt;br /&gt;
&lt;br /&gt;
Par défaut :&amp;lt;syntaxhighlight lang=&amp;quot;bat&amp;quot;&amp;gt;&lt;br /&gt;
C:\Windows\System32\drivers\etc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ce chemin m&#039;a toujours laissé rêveur. Pourquoi drivers!&lt;br /&gt;
&lt;br /&gt;
Pour éviter cette remise a zéro on doit éditer le fichier &amp;lt;code&amp;gt;/etc/wsl.conf&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/wsl.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et on ajoute à la fin :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[network]&lt;br /&gt;
generateHosts = false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et ça suffit.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2051</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2051"/>
		<updated>2026-06-20T22:27:03Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenu sur ma nouvelle &amp;quot;Knowledge base&amp;quot; [[Spécial:Version|Version]] autohébergée.&lt;br /&gt;
&lt;br /&gt;
Une page temporaire pour la mise à jour de ce wiki-ci: [[MAJ WIKI]] (a faire)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Développement &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Logo C++.png|sans_cadre|61x61px]] C/C++ : C&#039;est[[Fichier:Le.png|sans_cadre|44x44px]] langage de programmation.&lt;br /&gt;
|Les [[sockets C]]&lt;br /&gt;
Gérer l&#039;écran &amp;quot;à la vi&amp;quot; avec [[Curses en C|curses]]&lt;br /&gt;
&lt;br /&gt;
Gérer le [[Temps à la milliseconde en C|temps à la milliseconde]].&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Perl logo.png|sans_cadre|48x48px]]Perl : Le meilleur langage de script. &lt;br /&gt;
|Quelques [[Quelques modules Perl|modules Perl]] utiles.&lt;br /&gt;
Petits [[hacks en perl]]. &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Python Logo.png|alt=Python|sans_cadre|74x74px]]Python : Pas mon préféré mais il est tellement utilisé!&lt;br /&gt;
|Syntaxe [[Les bases de Python|de base]],&lt;br /&gt;
Gestion des [[Exceptions en Python|exceptions]].&lt;br /&gt;
&lt;br /&gt;
Python et ses [[Environnements virtuels Python|environnements virtuels]].&lt;br /&gt;
&lt;br /&gt;
Les [[Modules et outils de développement Python|modules et les outils de développement]]. &lt;br /&gt;
&lt;br /&gt;
[[Gestion des documents PDF en Python|Gestion des documents PDF]]. &lt;br /&gt;
&lt;br /&gt;
[[Petits exemples de code Python|Petits exemples de code]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outils&lt;br /&gt;
|[[Fichier:Git logo.png|sans_cadre|67x67px]]Git&lt;br /&gt;
|[[GIT Utilisation simple|Utilisation simple]] &lt;br /&gt;
[[GIT-HUB]]&lt;br /&gt;
|-&lt;br /&gt;
|Shell&lt;br /&gt;
|sh/bash&lt;br /&gt;
|Syntaxe du [[If en bash|if]].&lt;br /&gt;
Syntaxe de [[For in bash|for]].&lt;br /&gt;
&lt;br /&gt;
Traiter des [[CSV bash|fichiers csv]]&lt;br /&gt;
Traitement de phrases [[Encodage d&#039;objets complexes#Usage en shell (commande jq)|JSON avec jq]]&lt;br /&gt;
&lt;br /&gt;
[[Bash random|Générer de hasard]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;8&amp;quot; |Système&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Global&lt;br /&gt;
|[[Encodage]] de caractères&lt;br /&gt;
|Le [[code morse]], le [[code baudot]], les codes [[ASCII]], les séquences [[ANSI]] le code [[Code Gray|Gray]] et un OVNI, le code [[Extended Binary Coded Decimal Interchange Code|EBCEDIC]]&lt;br /&gt;
les code [[UNICODE]].&lt;br /&gt;
|-&lt;br /&gt;
|Encodage d&#039;objets&lt;br /&gt;
|Les [[entiers]]&lt;br /&gt;
le [[temps]]&lt;br /&gt;
&lt;br /&gt;
Les [[nombres flottants]]&lt;br /&gt;
&lt;br /&gt;
[[Encodage d&#039;objets complexes|Les objets complexes]]&lt;br /&gt;
&lt;br /&gt;
Encodage de binaire en [[base64]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Linux [[Fichier:Linux-logo.png|sans_cadre|93x93px]]&lt;br /&gt;
|Général&lt;br /&gt;
|[[Généralités Linux|Généralités]] quel que soient les distributions de linux (ou UNIX).&lt;br /&gt;
Lancer un [[deamon avec systemd]].&lt;br /&gt;
&lt;br /&gt;
Configurer une client [[Connexion SSH|ssh]].&lt;br /&gt;
&lt;br /&gt;
Installer [[web-ssh]]&lt;br /&gt;
|-&lt;br /&gt;
|Debian (Ubuntu...)&lt;br /&gt;
|[[Gestion des services Debian/Ubuntu|Gestion des services]]&lt;br /&gt;
&lt;br /&gt;
[[Nettoyage APT]]&lt;br /&gt;
&lt;br /&gt;
Informations sur une [[Info distribution DEBIAN|distribution]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Windows Subsystem for Linux logo.png|gauche|sans_cadre|64x64px]]WSL &lt;br /&gt;
|Utiliser et personnaliser [[WSL /etc/hosts|/etc/hosts]]&lt;br /&gt;
[[Relancer WSL]]&lt;br /&gt;
&lt;br /&gt;
[[Monter un disque externe dans wsl]]&lt;br /&gt;
&lt;br /&gt;
[[Utiliser un port USB dans WSL]]&lt;br /&gt;
|-&lt;br /&gt;
|Windows [[Fichier:Microsoft Windows Logo.png|sans_cadre|96x96px]]&lt;br /&gt;
|..., 10, 11&lt;br /&gt;
|[[Wireshark]] &amp;lt;sub&amp;gt;(images manquantes)&amp;lt;/sub&amp;gt;&lt;br /&gt;
CYGWIN&lt;br /&gt;
&lt;br /&gt;
[[MINGW32]]&lt;br /&gt;
&lt;br /&gt;
[[Scoop]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Open WRT]]&lt;br /&gt;
[[Fichier:Open WRT LOGO.png|sans_cadre|135x135px]]&lt;br /&gt;
|Global&lt;br /&gt;
[[GL Inet]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gl-inet-router.png|sans_cadre|147x147px]]&lt;br /&gt;
|[[GL Inet Reset|Reset]] sortie d&#039;usine.&lt;br /&gt;
Réglage du serveur [[Open WRT DHCP|DHCP]]&lt;br /&gt;
&lt;br /&gt;
Ajouter un [[OpenWRTpackages|package]].&lt;br /&gt;
&lt;br /&gt;
[[Open WRT Commandes de base pour le réseau|Commandes de base pour le réseau]].&lt;br /&gt;
&lt;br /&gt;
[[tcpdump]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le ssh depuis le côté WAN.]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le WEB depuis le coté WAN]]&lt;br /&gt;
&lt;br /&gt;
Gérer des ampoules [[Wiz et OpenWRT|Phillips Wiz]].&lt;br /&gt;
&lt;br /&gt;
Installer un outil de [[Test de la bande passante Open WRT|test de la bande passante]] de la patte &amp;quot;wan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Auto hébergement&lt;br /&gt;
[[Fichier:AnarchySymbol.png|sans_cadre|107x107px]]&lt;br /&gt;
|[[Fichier:Raspberry.png|sans_cadre|40x40px]]  [[Raspberry PI]]&lt;br /&gt;
|L&#039;auto hébergement est assez facile à réaliser chez sois. Une solution est d&#039;utiliser un ou plusieurs raspberry PI.&lt;br /&gt;
[[Auto Hebergement|La base]] explique l&#039;installation de base d&#039;un PI comme serveur solitaire.&lt;br /&gt;
&lt;br /&gt;
En revanche on donne ci-dessous un exemple d&#039;architecture complète avec un cluster de 5 Raspberry PI :&lt;br /&gt;
&lt;br /&gt;
# [[Infrastructure basée PI|Architecture]]&lt;br /&gt;
# &amp;lt;code&amp;gt;front-router&amp;lt;/code&amp;gt;[[Le routeur en tête réseau PI|Le routeur en tête]] &lt;br /&gt;
# &amp;lt;code&amp;gt;main-host&amp;lt;/code&amp;gt; un [[Node-red dans le LAN|serveur IoT avec note-red]]. &lt;br /&gt;
#&amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;[[PI GitLab|Un serveur Git]]&lt;br /&gt;
#&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;[[PI MariaDB|Un serveur de base de données]]&lt;br /&gt;
#&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; [[PI MediaWiki|Un serveur mediawiki]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |APIs&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Géolocalisation et cartographie&lt;br /&gt;
|IP API&lt;br /&gt;
|[[Abstract API]] Donne une localisation a partir d&#039;une IP&lt;br /&gt;
[[IPinfo]] Une autre bibliotheque de localisation d&#039;IP&lt;br /&gt;
|-&lt;br /&gt;
|Ephemérides&lt;br /&gt;
|[[Sunset and sunrise times API]] va nous dire quand le soleil se lève quand il se couche, la lune…&lt;br /&gt;
|-&lt;br /&gt;
|Trafic Aérien&lt;br /&gt;
|[[FlightRadar24]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;6&amp;quot; |Logiciels&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Middleware&lt;br /&gt;
|Bases de données relationelles&lt;br /&gt;
|Le langage [[SQL]] &lt;br /&gt;
Les &amp;quot;minimales&amp;quot;: [[MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Les encore plus minimales: [[SQLite]] &lt;br /&gt;
&lt;br /&gt;
Les maximales: [[Oracle]], [[PostgeSQL]]&lt;br /&gt;
|-&lt;br /&gt;
|Bases de données NoSQL&lt;br /&gt;
|[[mongodb]]&lt;br /&gt;
|-&lt;br /&gt;
|Messages&lt;br /&gt;
|[[MQTT]]&lt;br /&gt;
|-&lt;br /&gt;
|Serveur applicatifs/web&lt;br /&gt;
|[[Apache]]&lt;br /&gt;
&lt;br /&gt;
[[Weblogic]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Bureautique&lt;br /&gt;
|Excel&lt;br /&gt;
|[[Gestion des dates sous Excel|Gestion des dates]]&amp;lt;nowiki/&amp;gt; &lt;br /&gt;
[[EXCEL Gestion des chaines de caractères|Gest]][[EXCEL Gestion des chaines de caractères|io]][[EXCEL Gestion des chaines de caractères|n d]][[EXCEL Gestion des chaines de caractères|es cha]][[EXCEL Gestion des chaines de caractères|în]][[EXCEL Gestion des chaines de caractères|es de c]][[EXCEL Gestion des chaines de caractères|ar]][[EXCEL Gestion des chaines de caractères|actère]][[EXCEL Gestion des chaines de caractères|s]]&lt;br /&gt;
&lt;br /&gt;
[[Identifier si la clé d&#039;une ligne est présente dans un autre tableau]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outlook&lt;br /&gt;
|[[Outlook - Gestion des archives|Gestion des archives]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot; |Sécurite&lt;br /&gt;
|Chiffrement / déchiffrage&lt;br /&gt;
|OpenSSL&lt;br /&gt;
|[[Les bases de Open SSL|La base]]&lt;br /&gt;
[[OpenSSL et AES]] (symetrique)&lt;br /&gt;
&lt;br /&gt;
[[OpenSSL_et_RSA]] (asymetrique)&lt;br /&gt;
&lt;br /&gt;
Avec [[SMIME et Certificats x509|x509 et SMIME]] on marie les deux&lt;br /&gt;
&lt;br /&gt;
Comment [[OpenSSL extraire un certificat|extraire un certificat]] d&#039;un serveur en production.&lt;br /&gt;
&lt;br /&gt;
PGP et [[GPG]] (chiffrer de documents)&lt;br /&gt;
&lt;br /&gt;
Générer un [[mode de passe sécurisé]]&lt;br /&gt;
&lt;br /&gt;
Les autres commandes [[openssl]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Certificats&lt;br /&gt;
|Generalités&lt;br /&gt;
|[[Les certificats X.509|Un certificat c&#039;est quoi?]]&lt;br /&gt;
|-&lt;br /&gt;
|PKI&lt;br /&gt;
|[[PKI familiale|Faire une PKI &amp;quot;familiale&amp;quot;]]&lt;br /&gt;
|-&lt;br /&gt;
|https&lt;br /&gt;
|[[Certificats Serveur https|Certificats Serveur]]&lt;br /&gt;
[[Certificats Client https|Certificats Client]]&lt;br /&gt;
&lt;br /&gt;
[[Let&#039;s encrypt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Embarqué&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Microcontroleurs&lt;br /&gt;
|[[Fichier:Arduino Logo.png|sans_cadre|40x40px]][[Arduino]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[ESP8266]]&lt;br /&gt;
|Le module [[SON/OFF Smart Switch|Smart Switch]] de SONOFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Espessif logo.png|gauche|sans_cadre|40x40px]][[ESP32]]&lt;br /&gt;
|Environnement de dev [[ESP-IDF]], Utiliser [[mkspiffs]].&lt;br /&gt;
La carte &amp;quot;breakout&amp;quot; [[ESP32_DEVKITV1]]&lt;br /&gt;
La carte &amp;quot;AZ delivery&amp;quot; [[ESP32_DEVKITV2]]&lt;br /&gt;
&lt;br /&gt;
Faire des [[ESP32 Requetês HTTPs|requetês HTTPs]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Firmware Update|Firmware Update]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Matrice de led|Exemple d&#039;utilisation de matrice de LED]] (circuit MAX 72xx)&lt;br /&gt;
&lt;br /&gt;
Programmation module [[ESP32C3 avec écran spotear]].&lt;br /&gt;
|-&lt;br /&gt;
!Fusion&lt;br /&gt;
|Dev ESP 32 sur Raspberry PI&lt;br /&gt;
|Ici un article qui touche aux deux sujets. [[Poste de DEV ESP32 sur PI|Comment programmes les  microcontrôleurs ESP32 à partir d&#039;un raspberry PI]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |SBC (single board computers)&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Logo PI.png|sans_cadre|36x36px]][[Raspberry PI]]&lt;br /&gt;
|[[Les modèles de Raspberry PI]]&lt;br /&gt;
La configuration réseau [[DHCP ou IP fixe]] &lt;br /&gt;
&lt;br /&gt;
Ecran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]]&#039;et [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|Cohabitation des écrans]]. &lt;br /&gt;
&lt;br /&gt;
Utiliser le [[frame-buffer]]&lt;br /&gt;
&lt;br /&gt;
[[Demarrer PI4 en USB|Gérer un PI4 dont le lecteur de carte SD est HS]].&lt;br /&gt;
&lt;br /&gt;
Utiliser la [[camera PI]]&lt;br /&gt;
&lt;br /&gt;
Créer un [[Nouveau Menu Raspberry PI|nouveau sous menu dans le &amp;quot;main menu&amp;quot;]] du bureau.&lt;br /&gt;
|-&lt;br /&gt;
|Installer :&lt;br /&gt;
[[RPi-NodeRed|NodeRed]], [[Mosquitto]], [[MariaDB sur Raspberry PI|MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Le service graphique de gestion des mises à jour [[PackageKit]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Bpi.png|sans_cadre|48x48px]]Banana PI&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Objets connectés&lt;br /&gt;
|[[Fichier:PHILLIPS HUE LOGO.png|sans_cadre|87x87px]]&lt;br /&gt;
|Description [[PHILLIPS HUE|API]] de base&lt;br /&gt;
Le site de Phillips : https://developers.meethue.com/develop/hue-api-v2/getting-started/&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:X-sense logo.png|sans_cadre|52x52px]]x-sense&lt;br /&gt;
|[[X-sense|Description générale]]&lt;br /&gt;
Utilisation avec le module [[python-xsense]]&lt;br /&gt;
|-&lt;br /&gt;
|Phillips Wiz&lt;br /&gt;
|Les limites de ces [[Securite PHILLIPS WIZ|ampoules au niveau sécurité]].&lt;br /&gt;
Utilisation avec un [[Wiz et OpenWRT|routeur OpenWrt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;9&amp;quot; |Electronique&lt;br /&gt;
|Composants&lt;br /&gt;
|Composants actifs&lt;br /&gt;
|[[Le transistor bipolaire]]&lt;br /&gt;
|-&lt;br /&gt;
|Circuits&lt;br /&gt;
|Filtres&lt;br /&gt;
|Filtre de rejection : https://poujouly.net/2015/10/25/filtre-notch-50hz/ (oui un lien externe pour le moment)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Le labo&lt;br /&gt;
|Le protocoles&lt;br /&gt;
|[[UART/RS323]]&lt;br /&gt;
&lt;br /&gt;
[[SCPI uart]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Les outils de mesures connectables&lt;br /&gt;
|[[Multimètre]] modèle : &lt;br /&gt;
&lt;br /&gt;
* [[Multicomp PRO MP730027]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Générateur de fonctions arbitraire]] modèles : &lt;br /&gt;
&lt;br /&gt;
* [[GwINSTEK AFG-2012]]&lt;br /&gt;
* [[Multicomp MP75511]]&lt;br /&gt;
* [[FeelTech FY6600]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Osciloscope]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Alimantation]]&lt;br /&gt;
&lt;br /&gt;
[[Alimentation USB C]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Conception&lt;br /&gt;
|[[Fichier:Autodesk Eagle logo.png|sans_cadre|123x123px]]&lt;br /&gt;
|Logiciel de conception de circuits et de modélisation de circuit imprimés.&lt;br /&gt;
[[EAGLE - Plans de masse|Plans de masse]]&lt;br /&gt;
&lt;br /&gt;
[[Les unités dans EAGLE]]&lt;br /&gt;
|-&lt;br /&gt;
|LTspice&lt;br /&gt;
|Logiciel de simulation électronique&lt;br /&gt;
[[LTspice fichier de simulation|Utiliser un signal numérisé en entré d&#039;une simulation]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;7&amp;quot; |CAO FAO&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Mécanique&lt;br /&gt;
|Visserie&lt;br /&gt;
|[[Fichier:Logo-iso.png|sans_cadre|105x105px]][[Dimensions visserie ISO]]&lt;br /&gt;
|-&lt;br /&gt;
|Usinage&lt;br /&gt;
|Dimensions des [[fraises en unités Imériales/US]]&lt;br /&gt;
|-&lt;br /&gt;
|Fabrication additive&lt;br /&gt;
|Imprimantes 3D FDM&lt;br /&gt;
|[[Fichier:Ultimaker logo.png|sans_cadre|37x37px]] [[Ultimaker 2]]&lt;br /&gt;
|-&lt;br /&gt;
|CNC&lt;br /&gt;
|Fraiseuses&lt;br /&gt;
|La base… la [[CNC 3018|3018]].&lt;br /&gt;
Faire des perçages avec un [[CNC Percages gcode|programme python]].&lt;br /&gt;
&lt;br /&gt;
Graver des [[PCB avec CNC|PCB]]&lt;br /&gt;
&lt;br /&gt;
[[Changer la broche CNC3018|Changer la broche]]&lt;br /&gt;
|-&lt;br /&gt;
|Découpeuse (Vinyle ou autre)&lt;br /&gt;
|Silhouette&lt;br /&gt;
|[[SILHOUETTE Paramètres de base|Paramètres de base]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciels de CAO&lt;br /&gt;
|[[Fichier:Freecad logo.png|alt=FREE CAD|sans_cadre|47x47px]]FreeCad&lt;br /&gt;
|[[FreeCad]]&lt;br /&gt;
|-&lt;br /&gt;
|Outillage&lt;br /&gt;
|Metrologie&lt;br /&gt;
|[[Comparateur Numérique]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Projets complets&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Création/Configuration de serveur&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Exemple chez GANDI&lt;br /&gt;
|[[Serveur mediawiki basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur nodered basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur Owncloud]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur DNS GANDI|Serveur DNS]]&lt;br /&gt;
|-&lt;br /&gt;
|Objets connectés&lt;br /&gt;
|ESP32&lt;br /&gt;
|[[ESP32 Horloge à LED|Une Horloge à LED]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Photos&lt;br /&gt;
|Matériel&lt;br /&gt;
|D90&lt;br /&gt;
[[Fichier:D90.png|sans_cadre|58x58px]]&lt;br /&gt;
|[[Connectique D90|Connectique]]&lt;br /&gt;
|-&lt;br /&gt;
|Théorie&lt;br /&gt;
|&lt;br /&gt;
|Les [[bases en optique pour la photo]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciel&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2050</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2050"/>
		<updated>2026-06-20T22:25:52Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : add logo wsl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenu sur ma nouvelle &amp;quot;Knowledge base&amp;quot; [[Spécial:Version|Version]] autohébergée.&lt;br /&gt;
&lt;br /&gt;
Une page temporaire pour la mise à jour de ce wiki-ci: [[MAJ WIKI]] (a faire)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Développement &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Logo C++.png|sans_cadre|61x61px]] C/C++ : C&#039;est[[Fichier:Le.png|sans_cadre|44x44px]] langage de programmation.&lt;br /&gt;
|Les [[sockets C]]&lt;br /&gt;
Gérer l&#039;écran &amp;quot;à la vi&amp;quot; avec [[Curses en C|curses]]&lt;br /&gt;
&lt;br /&gt;
Gérer le [[Temps à la milliseconde en C|temps à la milliseconde]].&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Perl logo.png|sans_cadre|48x48px]]Perl : Le meilleur langage de script. &lt;br /&gt;
|Quelques [[Quelques modules Perl|modules Perl]] utiles.&lt;br /&gt;
Petits [[hacks en perl]]. &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Python Logo.png|alt=Python|sans_cadre|74x74px]]Python : Pas mon préféré mais il est tellement utilisé!&lt;br /&gt;
|Syntaxe [[Les bases de Python|de base]],&lt;br /&gt;
Gestion des [[Exceptions en Python|exceptions]].&lt;br /&gt;
&lt;br /&gt;
Python et ses [[Environnements virtuels Python|environnements virtuels]].&lt;br /&gt;
&lt;br /&gt;
Les [[Modules et outils de développement Python|modules et les outils de développement]]. &lt;br /&gt;
&lt;br /&gt;
[[Gestion des documents PDF en Python|Gestion des documents PDF]]. &lt;br /&gt;
&lt;br /&gt;
[[Petits exemples de code Python|Petits exemples de code]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outils&lt;br /&gt;
|[[Fichier:Git logo.png|sans_cadre|67x67px]]Git&lt;br /&gt;
|[[GIT Utilisation simple|Utilisation simple]] &lt;br /&gt;
[[GIT-HUB]]&lt;br /&gt;
|-&lt;br /&gt;
|Shell&lt;br /&gt;
|sh/bash&lt;br /&gt;
|Syntaxe du [[If en bash|if]].&lt;br /&gt;
Syntaxe de [[For in bash|for]].&lt;br /&gt;
&lt;br /&gt;
Traiter des [[CSV bash|fichiers csv]]&lt;br /&gt;
Traitement de phrases [[Encodage d&#039;objets complexes#Usage en shell (commande jq)|JSON avec jq]]&lt;br /&gt;
&lt;br /&gt;
[[Bash random|Générer de hasard]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;8&amp;quot; |Système&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Global&lt;br /&gt;
|[[Encodage]] de caractères&lt;br /&gt;
|Le [[code morse]], le [[code baudot]], les codes [[ASCII]], les séquences [[ANSI]] le code [[Code Gray|Gray]] et un OVNI, le code [[Extended Binary Coded Decimal Interchange Code|EBCEDIC]]&lt;br /&gt;
les code [[UNICODE]].&lt;br /&gt;
|-&lt;br /&gt;
|Encodage d&#039;objets&lt;br /&gt;
|Les [[entiers]]&lt;br /&gt;
le [[temps]]&lt;br /&gt;
&lt;br /&gt;
Les [[nombres flottants]]&lt;br /&gt;
&lt;br /&gt;
[[Encodage d&#039;objets complexes|Les objets complexes]]&lt;br /&gt;
&lt;br /&gt;
Encodage de binaire en [[base64]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Linux [[Fichier:Linux-logo.png|sans_cadre|93x93px]]&lt;br /&gt;
|Général&lt;br /&gt;
|[[Généralités Linux|Généralités]] quel que soient les distributions de linux (ou UNIX).&lt;br /&gt;
Lancer un [[deamon avec systemd]].&lt;br /&gt;
&lt;br /&gt;
Configurer une client [[Connexion SSH|ssh]].&lt;br /&gt;
&lt;br /&gt;
Installer [[web-ssh]]&lt;br /&gt;
|-&lt;br /&gt;
|Debian (Ubuntu...)&lt;br /&gt;
|[[Gestion des services Debian/Ubuntu|Gestion des services]]&lt;br /&gt;
&lt;br /&gt;
[[Nettoyage APT]]&lt;br /&gt;
&lt;br /&gt;
Informations sur une [[Info distribution DEBIAN|distribution]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Windows Subsystem for Linux logo.png|gauche|sans_cadre|64x64px]]WSL &lt;br /&gt;
|[[Relancer WSL]]&lt;br /&gt;
&lt;br /&gt;
[[Monter un disque externe dans wsl]]&lt;br /&gt;
&lt;br /&gt;
[[Utiliser un port USB dans WSL]]&lt;br /&gt;
|-&lt;br /&gt;
|Windows [[Fichier:Microsoft Windows Logo.png|sans_cadre|96x96px]]&lt;br /&gt;
|..., 10, 11&lt;br /&gt;
|[[Wireshark]] &amp;lt;sub&amp;gt;(images manquantes)&amp;lt;/sub&amp;gt;&lt;br /&gt;
CYGWIN&lt;br /&gt;
&lt;br /&gt;
[[MINGW32]]&lt;br /&gt;
&lt;br /&gt;
[[Scoop]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Open WRT]]&lt;br /&gt;
[[Fichier:Open WRT LOGO.png|sans_cadre|135x135px]]&lt;br /&gt;
|Global&lt;br /&gt;
[[GL Inet]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gl-inet-router.png|sans_cadre|147x147px]]&lt;br /&gt;
|[[GL Inet Reset|Reset]] sortie d&#039;usine.&lt;br /&gt;
Réglage du serveur [[Open WRT DHCP|DHCP]]&lt;br /&gt;
&lt;br /&gt;
Ajouter un [[OpenWRTpackages|package]].&lt;br /&gt;
&lt;br /&gt;
[[Open WRT Commandes de base pour le réseau|Commandes de base pour le réseau]].&lt;br /&gt;
&lt;br /&gt;
[[tcpdump]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le ssh depuis le côté WAN.]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le WEB depuis le coté WAN]]&lt;br /&gt;
&lt;br /&gt;
Gérer des ampoules [[Wiz et OpenWRT|Phillips Wiz]].&lt;br /&gt;
&lt;br /&gt;
Installer un outil de [[Test de la bande passante Open WRT|test de la bande passante]] de la patte &amp;quot;wan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Auto hébergement&lt;br /&gt;
[[Fichier:AnarchySymbol.png|sans_cadre|107x107px]]&lt;br /&gt;
|[[Fichier:Raspberry.png|sans_cadre|40x40px]]  [[Raspberry PI]]&lt;br /&gt;
|L&#039;auto hébergement est assez facile à réaliser chez sois. Une solution est d&#039;utiliser un ou plusieurs raspberry PI.&lt;br /&gt;
[[Auto Hebergement|La base]] explique l&#039;installation de base d&#039;un PI comme serveur solitaire.&lt;br /&gt;
&lt;br /&gt;
En revanche on donne ci-dessous un exemple d&#039;architecture complète avec un cluster de 5 Raspberry PI :&lt;br /&gt;
&lt;br /&gt;
# [[Infrastructure basée PI|Architecture]]&lt;br /&gt;
# &amp;lt;code&amp;gt;front-router&amp;lt;/code&amp;gt;[[Le routeur en tête réseau PI|Le routeur en tête]] &lt;br /&gt;
# &amp;lt;code&amp;gt;main-host&amp;lt;/code&amp;gt; un [[Node-red dans le LAN|serveur IoT avec note-red]]. &lt;br /&gt;
#&amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;[[PI GitLab|Un serveur Git]]&lt;br /&gt;
#&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;[[PI MariaDB|Un serveur de base de données]]&lt;br /&gt;
#&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; [[PI MediaWiki|Un serveur mediawiki]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |APIs&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Géolocalisation et cartographie&lt;br /&gt;
|IP API&lt;br /&gt;
|[[Abstract API]] Donne une localisation a partir d&#039;une IP&lt;br /&gt;
[[IPinfo]] Une autre bibliotheque de localisation d&#039;IP&lt;br /&gt;
|-&lt;br /&gt;
|Ephemérides&lt;br /&gt;
|[[Sunset and sunrise times API]] va nous dire quand le soleil se lève quand il se couche, la lune…&lt;br /&gt;
|-&lt;br /&gt;
|Trafic Aérien&lt;br /&gt;
|[[FlightRadar24]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;6&amp;quot; |Logiciels&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Middleware&lt;br /&gt;
|Bases de données relationelles&lt;br /&gt;
|Le langage [[SQL]] &lt;br /&gt;
Les &amp;quot;minimales&amp;quot;: [[MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Les encore plus minimales: [[SQLite]] &lt;br /&gt;
&lt;br /&gt;
Les maximales: [[Oracle]], [[PostgeSQL]]&lt;br /&gt;
|-&lt;br /&gt;
|Bases de données NoSQL&lt;br /&gt;
|[[mongodb]]&lt;br /&gt;
|-&lt;br /&gt;
|Messages&lt;br /&gt;
|[[MQTT]]&lt;br /&gt;
|-&lt;br /&gt;
|Serveur applicatifs/web&lt;br /&gt;
|[[Apache]]&lt;br /&gt;
&lt;br /&gt;
[[Weblogic]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Bureautique&lt;br /&gt;
|Excel&lt;br /&gt;
|[[Gestion des dates sous Excel|Gestion des dates]]&amp;lt;nowiki/&amp;gt; &lt;br /&gt;
[[EXCEL Gestion des chaines de caractères|Gest]][[EXCEL Gestion des chaines de caractères|io]][[EXCEL Gestion des chaines de caractères|n d]][[EXCEL Gestion des chaines de caractères|es cha]][[EXCEL Gestion des chaines de caractères|în]][[EXCEL Gestion des chaines de caractères|es de c]][[EXCEL Gestion des chaines de caractères|ar]][[EXCEL Gestion des chaines de caractères|actère]][[EXCEL Gestion des chaines de caractères|s]]&lt;br /&gt;
&lt;br /&gt;
[[Identifier si la clé d&#039;une ligne est présente dans un autre tableau]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outlook&lt;br /&gt;
|[[Outlook - Gestion des archives|Gestion des archives]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot; |Sécurite&lt;br /&gt;
|Chiffrement / déchiffrage&lt;br /&gt;
|OpenSSL&lt;br /&gt;
|[[Les bases de Open SSL|La base]]&lt;br /&gt;
[[OpenSSL et AES]] (symetrique)&lt;br /&gt;
&lt;br /&gt;
[[OpenSSL_et_RSA]] (asymetrique)&lt;br /&gt;
&lt;br /&gt;
Avec [[SMIME et Certificats x509|x509 et SMIME]] on marie les deux&lt;br /&gt;
&lt;br /&gt;
Comment [[OpenSSL extraire un certificat|extraire un certificat]] d&#039;un serveur en production.&lt;br /&gt;
&lt;br /&gt;
PGP et [[GPG]] (chiffrer de documents)&lt;br /&gt;
&lt;br /&gt;
Générer un [[mode de passe sécurisé]]&lt;br /&gt;
&lt;br /&gt;
Les autres commandes [[openssl]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Certificats&lt;br /&gt;
|Generalités&lt;br /&gt;
|[[Les certificats X.509|Un certificat c&#039;est quoi?]]&lt;br /&gt;
|-&lt;br /&gt;
|PKI&lt;br /&gt;
|[[PKI familiale|Faire une PKI &amp;quot;familiale&amp;quot;]]&lt;br /&gt;
|-&lt;br /&gt;
|https&lt;br /&gt;
|[[Certificats Serveur https|Certificats Serveur]]&lt;br /&gt;
[[Certificats Client https|Certificats Client]]&lt;br /&gt;
&lt;br /&gt;
[[Let&#039;s encrypt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Embarqué&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Microcontroleurs&lt;br /&gt;
|[[Fichier:Arduino Logo.png|sans_cadre|40x40px]][[Arduino]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[ESP8266]]&lt;br /&gt;
|Le module [[SON/OFF Smart Switch|Smart Switch]] de SONOFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Espessif logo.png|gauche|sans_cadre|40x40px]][[ESP32]]&lt;br /&gt;
|Environnement de dev [[ESP-IDF]], Utiliser [[mkspiffs]].&lt;br /&gt;
La carte &amp;quot;breakout&amp;quot; [[ESP32_DEVKITV1]]&lt;br /&gt;
La carte &amp;quot;AZ delivery&amp;quot; [[ESP32_DEVKITV2]]&lt;br /&gt;
&lt;br /&gt;
Faire des [[ESP32 Requetês HTTPs|requetês HTTPs]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Firmware Update|Firmware Update]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Matrice de led|Exemple d&#039;utilisation de matrice de LED]] (circuit MAX 72xx)&lt;br /&gt;
&lt;br /&gt;
Programmation module [[ESP32C3 avec écran spotear]].&lt;br /&gt;
|-&lt;br /&gt;
!Fusion&lt;br /&gt;
|Dev ESP 32 sur Raspberry PI&lt;br /&gt;
|Ici un article qui touche aux deux sujets. [[Poste de DEV ESP32 sur PI|Comment programmes les  microcontrôleurs ESP32 à partir d&#039;un raspberry PI]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |SBC (single board computers)&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Logo PI.png|sans_cadre|36x36px]][[Raspberry PI]]&lt;br /&gt;
|[[Les modèles de Raspberry PI]]&lt;br /&gt;
La configuration réseau [[DHCP ou IP fixe]] &lt;br /&gt;
&lt;br /&gt;
Ecran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]]&#039;et [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|Cohabitation des écrans]]. &lt;br /&gt;
&lt;br /&gt;
Utiliser le [[frame-buffer]]&lt;br /&gt;
&lt;br /&gt;
[[Demarrer PI4 en USB|Gérer un PI4 dont le lecteur de carte SD est HS]].&lt;br /&gt;
&lt;br /&gt;
Utiliser la [[camera PI]]&lt;br /&gt;
&lt;br /&gt;
Créer un [[Nouveau Menu Raspberry PI|nouveau sous menu dans le &amp;quot;main menu&amp;quot;]] du bureau.&lt;br /&gt;
|-&lt;br /&gt;
|Installer :&lt;br /&gt;
[[RPi-NodeRed|NodeRed]], [[Mosquitto]], [[MariaDB sur Raspberry PI|MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Le service graphique de gestion des mises à jour [[PackageKit]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Bpi.png|sans_cadre|48x48px]]Banana PI&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Objets connectés&lt;br /&gt;
|[[Fichier:PHILLIPS HUE LOGO.png|sans_cadre|87x87px]]&lt;br /&gt;
|Description [[PHILLIPS HUE|API]] de base&lt;br /&gt;
Le site de Phillips : https://developers.meethue.com/develop/hue-api-v2/getting-started/&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:X-sense logo.png|sans_cadre|52x52px]]x-sense&lt;br /&gt;
|[[X-sense|Description générale]]&lt;br /&gt;
Utilisation avec le module [[python-xsense]]&lt;br /&gt;
|-&lt;br /&gt;
|Phillips Wiz&lt;br /&gt;
|Les limites de ces [[Securite PHILLIPS WIZ|ampoules au niveau sécurité]].&lt;br /&gt;
Utilisation avec un [[Wiz et OpenWRT|routeur OpenWrt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;9&amp;quot; |Electronique&lt;br /&gt;
|Composants&lt;br /&gt;
|Composants actifs&lt;br /&gt;
|[[Le transistor bipolaire]]&lt;br /&gt;
|-&lt;br /&gt;
|Circuits&lt;br /&gt;
|Filtres&lt;br /&gt;
|Filtre de rejection : https://poujouly.net/2015/10/25/filtre-notch-50hz/ (oui un lien externe pour le moment)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Le labo&lt;br /&gt;
|Le protocoles&lt;br /&gt;
|[[UART/RS323]]&lt;br /&gt;
&lt;br /&gt;
[[SCPI uart]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Les outils de mesures connectables&lt;br /&gt;
|[[Multimètre]] modèle : &lt;br /&gt;
&lt;br /&gt;
* [[Multicomp PRO MP730027]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Générateur de fonctions arbitraire]] modèles : &lt;br /&gt;
&lt;br /&gt;
* [[GwINSTEK AFG-2012]]&lt;br /&gt;
* [[Multicomp MP75511]]&lt;br /&gt;
* [[FeelTech FY6600]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Osciloscope]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Alimantation]]&lt;br /&gt;
&lt;br /&gt;
[[Alimentation USB C]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Conception&lt;br /&gt;
|[[Fichier:Autodesk Eagle logo.png|sans_cadre|123x123px]]&lt;br /&gt;
|Logiciel de conception de circuits et de modélisation de circuit imprimés.&lt;br /&gt;
[[EAGLE - Plans de masse|Plans de masse]]&lt;br /&gt;
&lt;br /&gt;
[[Les unités dans EAGLE]]&lt;br /&gt;
|-&lt;br /&gt;
|LTspice&lt;br /&gt;
|Logiciel de simulation électronique&lt;br /&gt;
[[LTspice fichier de simulation|Utiliser un signal numérisé en entré d&#039;une simulation]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;7&amp;quot; |CAO FAO&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Mécanique&lt;br /&gt;
|Visserie&lt;br /&gt;
|[[Fichier:Logo-iso.png|sans_cadre|105x105px]][[Dimensions visserie ISO]]&lt;br /&gt;
|-&lt;br /&gt;
|Usinage&lt;br /&gt;
|Dimensions des [[fraises en unités Imériales/US]]&lt;br /&gt;
|-&lt;br /&gt;
|Fabrication additive&lt;br /&gt;
|Imprimantes 3D FDM&lt;br /&gt;
|[[Fichier:Ultimaker logo.png|sans_cadre|37x37px]] [[Ultimaker 2]]&lt;br /&gt;
|-&lt;br /&gt;
|CNC&lt;br /&gt;
|Fraiseuses&lt;br /&gt;
|La base… la [[CNC 3018|3018]].&lt;br /&gt;
Faire des perçages avec un [[CNC Percages gcode|programme python]].&lt;br /&gt;
&lt;br /&gt;
Graver des [[PCB avec CNC|PCB]]&lt;br /&gt;
&lt;br /&gt;
[[Changer la broche CNC3018|Changer la broche]]&lt;br /&gt;
|-&lt;br /&gt;
|Découpeuse (Vinyle ou autre)&lt;br /&gt;
|Silhouette&lt;br /&gt;
|[[SILHOUETTE Paramètres de base|Paramètres de base]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciels de CAO&lt;br /&gt;
|[[Fichier:Freecad logo.png|alt=FREE CAD|sans_cadre|47x47px]]FreeCad&lt;br /&gt;
|[[FreeCad]]&lt;br /&gt;
|-&lt;br /&gt;
|Outillage&lt;br /&gt;
|Metrologie&lt;br /&gt;
|[[Comparateur Numérique]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Projets complets&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Création/Configuration de serveur&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Exemple chez GANDI&lt;br /&gt;
|[[Serveur mediawiki basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur nodered basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur Owncloud]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur DNS GANDI|Serveur DNS]]&lt;br /&gt;
|-&lt;br /&gt;
|Objets connectés&lt;br /&gt;
|ESP32&lt;br /&gt;
|[[ESP32 Horloge à LED|Une Horloge à LED]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Photos&lt;br /&gt;
|Matériel&lt;br /&gt;
|D90&lt;br /&gt;
[[Fichier:D90.png|sans_cadre|58x58px]]&lt;br /&gt;
|[[Connectique D90|Connectique]]&lt;br /&gt;
|-&lt;br /&gt;
|Théorie&lt;br /&gt;
|&lt;br /&gt;
|Les [[bases en optique pour la photo]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciel&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Windows_Subsystem_for_Linux_logo.png&amp;diff=2049</id>
		<title>Fichier:Windows Subsystem for Linux logo.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Windows_Subsystem_for_Linux_logo.png&amp;diff=2049"/>
		<updated>2026-06-20T22:25:25Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WSL logo&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Ultimaker_2&amp;diff=2048</id>
		<title>Ultimaker 2</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Ultimaker_2&amp;diff=2048"/>
		<updated>2026-06-20T18:49:47Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Ultimaker2.png|vignette|Ultimaker 2|203x203px]]&lt;br /&gt;
Il s&#039;agit d&#039;un ancien modèle mais qui me donne toujours, bientôt 10 ans après son acquisition, parfaitement satisfaction.&lt;br /&gt;
&lt;br /&gt;
On trouvera ici une série de conseils et de solutions à des problèmes que j&#039;ai rencontré.&lt;br /&gt;
&lt;br /&gt;
== Calibration ==&lt;br /&gt;
La machine est fournie avec une petite carte en carton nécessaire à la calibration.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ultimaker-Calibration card.png|sans_cadre|207x207px]]&lt;br /&gt;
&lt;br /&gt;
Cette carte s&#039;abîme. Au bout de 10 ans je ne l&#039;ai pas perdue, ce qui est assez miraculeux, mais elle tombe quasiment en poussière. De plus, j&#039;ai toujours trouvé que cette méthode était assez aléatoire. Ne peut-on pas faire mieux?&lt;br /&gt;
&lt;br /&gt;
=== Jeu de jauges d&#039;épaisseur ===&lt;br /&gt;
[[Fichier:Jauges-depaisseurs.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Ce sont des lames de métal d&#039;épaisseur très précise. Le but est, avant que la carte Ultimaker soit perdue ou détruite, de mesurer son épaisseur!&lt;br /&gt;
&lt;br /&gt;
Et bien je l&#039;ai fait et c&#039;est 0.2 mm !&lt;br /&gt;
&lt;br /&gt;
On refait la calibration avec cette jauge et résultat est beaucoup plus précis.&lt;br /&gt;
&lt;br /&gt;
=== Avec un comparateur ===&lt;br /&gt;
[[Fichier:Comparateur.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Une méthode est disponible [https://community.ultimaker.com/topic/14396-calibration-plus-pr%C3%A9cise-um2-et-um2/ sur ce site] de la communauté Ultimaker.&lt;br /&gt;
&lt;br /&gt;
Je tenterais un jour de réaliser cela. Pour le moment j&#039;ai écris une page sur exploitation d&#039;un [[Comparateur Numérique|comparateur numérique]].&lt;br /&gt;
&lt;br /&gt;
== Précision ==&lt;br /&gt;
Si la précision de l&#039;imprimante est assez merveilleuse il y a une chose qui pose un problème c&#039;est le comportement des &amp;quot;torons&amp;quot; issue de la buse une fois refroidie. Il doit y avoir des méthodes de calcul en prenant en compte la dilatation rétractation des matériaux (PLA, ABS, CPE,...) et de combien on écrase le toron. Je suis infichus de résoudre cette équation. A priori ca doit être difficile car cura ne sait pas bien faire.&lt;br /&gt;
&lt;br /&gt;
En revanche tous ceux qui ont utilisé une Ultimaker savent que, si on fait un orifice dans une pièce, ce que l&#039;on demande à l&#039;imprimante n&#039;est pas ce qui vas réellement obtenir. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai essayé de procéder par l&#039;expérience.&lt;br /&gt;
&lt;br /&gt;
=== Etalonnage par gabarits de perçages ===&lt;br /&gt;
Le but est de créer un gabarit avec l&#039;imprimante et de comparer avec des objets de tailles connues. &lt;br /&gt;
&lt;br /&gt;
L&#039;imprécision de la machine est inférieure au mm donc je vais essayer de calibrer pour des perçages entre 1 et 6 mm &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gabaris-ultimaker.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Je conçois avec [[FreeCad]] des petits gabarits de de perçages. Chaque gabarit concerne une dimension de référence (2mm, 3mm, 4mm...). Pour chacune de ces dimensions je réalise 10 trous allant de la taille nominale à cette taille +0,9mm. &lt;br /&gt;
&lt;br /&gt;
Pour que cela soit plus pratique j&#039;ai prévu un marquage et [[Impression pseudo couleur avec Ultimaker 2|j&#039;imprime en bicolore]]. (oui c&#039;est possible avec une vielle Ultimaker 2)&lt;br /&gt;
&lt;br /&gt;
J&#039;imprime ces pièces (exemple ci dessus).&lt;br /&gt;
&lt;br /&gt;
Ensuite il me faut des pièces étalon pour &amp;quot;tester mes trous&amp;quot;!&lt;br /&gt;
&lt;br /&gt;
Pour cela j&#039;utilise un set de perçage Tivoli contenant 13 forets à métal de taille croissante: Ø 1.5, 2, 2.5, 3, 3.3, 3.5, 4, 4.2, 4.5, 5, 5.5, 6, 6.5 mm.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tivoly-set.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
La manip consiste à prendre les forets un par un et tester dans quels trous ils passent. Pour chaque valeur je donne la taille du trou en ajustement séré et en ajustement &amp;quot;avec jeu minimum&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Les chiffres ===&lt;br /&gt;
J&#039;ai réalisé les tests avec des gabarits réalisés en ABS Blanc. (sauf la première couche en bleu)&lt;br /&gt;
&lt;br /&gt;
* Résolution 0,15 mm&lt;br /&gt;
* Densité a 80%&lt;br /&gt;
* Pattern de remplissage &amp;quot;Tri hexagon&amp;quot;&lt;br /&gt;
* Shell Thickness de 0,8 et 0,75 mm&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!&lt;br /&gt;
!Ø&lt;br /&gt;
!Serré&lt;br /&gt;
!Jeu min.&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
!1&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |1,5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |N/A&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |2,2&lt;br /&gt;
|on est à la limite des &amp;quot;trous&amp;quot; que soit papable de faire la machine.&lt;br /&gt;
|-&lt;br /&gt;
!2&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |2,0&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |N/A&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |2,8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!3&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |2,5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |N/A&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |3,3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!4&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |3,0&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |3,6&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |3,7&lt;br /&gt;
|Le sens d&#039;ajustement serré commence à avoir du sens.&lt;br /&gt;
|-&lt;br /&gt;
!5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |3,3&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |3,9&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!6&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |3,5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,2&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!7&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,0&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,6&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!8&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,2&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,8&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,9&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!9&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |4,5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |5,0&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |5,2&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!10&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |5,0&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |5,5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |5.7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!11&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |5,5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |6,1&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |6,3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!12&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |6,0&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |6,6&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |6,7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
!13&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |6,5&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |7,0&lt;br /&gt;
| style=&amp;quot;text-align:right;&amp;quot; |7.2&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:Graphexy-ultimaker.png|sans_cadre|660x660px]]&lt;br /&gt;
&lt;br /&gt;
On peut considérer les deux droites parallèles 0,99 ≈ 0,97 ≈ 1.&lt;br /&gt;
&lt;br /&gt;
Donc pour avoir un trou avec un jeu serré on ajoute 0,70 mm et un jeu lâche 0,76. &lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
L&#039;utilisation de ce travail de calibration peut être vu sous deux angles.&lt;br /&gt;
&lt;br /&gt;
=== Théorique ===&lt;br /&gt;
On a trouvé ci dessus une équation permettant de calculer la côte a demander pour avoir la côte voulue.&lt;br /&gt;
&lt;br /&gt;
Pour faire un trou dans lequel rentrera une tige de taille donnée, je mesure le diamètre avec un pied à coulisse et j&#039;applique l&#039;équation.&lt;br /&gt;
&lt;br /&gt;
C&#039;est très bien, on se garde la formule dans un coin et on l&#039;appliquera lors de la conception.&lt;br /&gt;
&lt;br /&gt;
En pratique:&lt;br /&gt;
&lt;br /&gt;
* On mesure 3,48 mm avec un pied a coulisse à 0,02 mm (20 µm) de précision.&lt;br /&gt;
* POur un ajustement &amp;quot;lache&amp;quot; d= 0,9916 x 3,48 + 0,764 = 4,21&lt;br /&gt;
&lt;br /&gt;
=== Expériantale ===&lt;br /&gt;
C&#039;est une approche plus pratique. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai a disposition mes gabarits lorsque je fais ma conception.  &lt;br /&gt;
&lt;br /&gt;
Si je veux, par exemple faire un support pour ma clé CHC de 3mm:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20260620 151704.jpg|sans_cadre|290x290px]]&lt;br /&gt;
&lt;br /&gt;
Je vais lâ tester dans mes gabarits et trouver le trou qui lui corresponds le mieux (avec le jeu qui me va)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20260620 152028.jpg|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Voila la queue de 3,5 rentre très bien dans le trou côté à 4,3mm.&lt;br /&gt;
&lt;br /&gt;
Les deux solutions se valent 4,21 = 4,23 on est a 20 µm d&#039;écart (la résolution de l&#039;imprimante est de 50µm).&lt;br /&gt;
&lt;br /&gt;
== Autres formes ==&lt;br /&gt;
Dans l&#039;exemple ci dessus on a fait les mesures pour un trou rond. On peut reprendre ces équations pour les appliquer a d&#039;autres formes ou bien on peut se faire des gabarits de toute forme.&lt;br /&gt;
&lt;br /&gt;
J&amp;lt;nowiki&amp;gt;&#039;ai eu besoin de me faire une poignée de tournevis pour des embouts standards. La taille de ces embouts est de 1/4&#039;&#039; (un quart de pouce) soit 6,35mm. Finalement, pour une fois, les mesures impériales sont intéressantes. On ne peut pas confondre une taille ISO avec cette emprunte standard d&#039;&amp;lt;/nowiki&amp;gt;outillage.&lt;br /&gt;
&lt;br /&gt;
En revanche comment faire pour faire un outil avec un &amp;quot;trou&amp;quot; hexagonal de 6,35 mm.&lt;br /&gt;
&lt;br /&gt;
Et bien on se fait un nouveau gabarit:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20260620 202725.jpg|sans_cadre|675x675px]]&lt;br /&gt;
&lt;br /&gt;
Et puis on essaye! J&#039;ai un ajustement serré avec 6,42 mm et un ajustement serré avec 6,42 mm.&lt;br /&gt;
&lt;br /&gt;
Si on avait fait le calcul : 0.9728 x 6,35 + 0.7037 = 6,8 mm.&lt;br /&gt;
&lt;br /&gt;
On voit que l&#039;assimilation de l&amp;amp; formule des alésages à des trous hexagonaux donne des résultats moyens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VIVE LES GABARITS !!!&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
</feed>