Monorailcat

Sachs Torpedo/Pentasport

icon 23/07/2023 - No comments

Mon vélo de tous les jours a une transmission dans le moyeu. La maintenance est moins fréquente qu'avec un dérailleur habituel mais est légèrement plus complexe.

Description
Il y a plusieurs versions avec 3 à 7 vitesses, avec ou sans frein, avec une ou deux tiges de sélection de vitesses qui fonctionnent de façon similaire depuis les années 20 et ont été reprises par SRAM ensuite. On recommande de les entretenir tous les 5 ans ou tous les 5'000km.

Ici, c'est un Sachs Pentasport à 5 vitesses avec frein à tambour et deux sélecteurs de vitesses.

On commence par démonter du côté gauche (côté frein), et on peut retirer la transmission de son logement :
Sachs Torpedo out of its housing

On voit que la graisse a "cuit" en changeant de couleur et en devenant pâteuse au niveau du frein et du roulement gauche :
Sachs Torpedo cooked grease

Voici toutes les pièces qui composent la transmission Sachs Pentasport, après nettoyage :
Sachs Torpedo taken apart

Liste d'astuces
  • La documentation recommande de serrer le cône de roulement droit à 40Nm. Ce couple de serrage est important et on peut utiliser du frein-filet en plus, sinon le roulement se dérègle avec les vibrations.
  • Les sélecteurs en forme de demi-lune risquent de bouger pendant le montage. Ils sont plus faciles à installer avec beaucoup de graisse qui les "colle" dans leur logement.
  • Il est utile de contrôler que l'axe ne soit pas tordu suite à un choc, les contraintes risquent d'user les roulements et d'abimer le train d'engrenages.
  • Certaines pièces (satellites, planétaire central) ont été usinées ensembles et leur montage nécessite d'être indenté, en alignant des marques. Ce n'est pas critique mais conseillé pour des raisons de bruit et d'usure.
  • La maintenance est indispensable si la transmission a été été exposée à l'eau ou à roulé avec des roulements déréglés.
  • Le fait que les palliers de train planétaire soient usés et aient du jeu n'est pas critique.
  • Le réglage du jeu des roulements doit se faire du côté gauche avec le frein desserré et le sélecteur de vitesse au repos (4ème vitesse).

Lubrifiants

Les lubrifiants de Sachs sont difficiles à trouver, et on lit des recommandations plus ou moins valables.
Huile "multifonction" pour palliers et engrenages
Le train planétaire doit tourner librement et sans jeu autour de l'axe.
  • Huile de moteur : on la recommande souvent, mais elle est trop visqueuse par temps froid et ses additifs sont inutiles dans une transmission (Testé : 10W40 ACEA B4 neuve, puis 5W40 ACEA A3/B4 usée).
  • Huile de transmission de voiture : fonctionne correctement (Testé : 75W80 API GL5 usée).
  • Autres : on lit parfois que l'ATF et l'huile hydraulique (CHF, LHM, HLP) fonctionnenent correctement mais je n'ai pas essayé.
  • Huiles fines : les huiles trop fines (chaîne, dégrippant, huile de coupe, diesel, tronçonneuse, silicone ou PTFE) ne sont pas assez visqueuses pour lubrifier correctement et risquent de contaminer les lubrifiants des autres parties.
  • Huiles visqueuses : ces huiles risquent de ne pas pénétrer dans les jeux trop faibles et de ne pas lubrifier correctement (huiles pour tondeuses, huiles pour différentiel).
Graisse à roulements
N'importe quelle graisse usuelle convient (Testé : graisses MoS2, graphite et lithium marine).
Graisse sur le cône/tambour de frein
Il est important qu'elle supporte bien les températures élevées et soit un peu plus visqueuse que la graisse à roulement sans être pâteuse comme de a graisse anti-seize.
On peut aussi l'utiliser pour le roulement de gauche exposé à la température du frein.
  • Graisse spécifique de Sachs : plus fabriquée ni distribuée, alternative recommandée : Hanseline Bremsmantelfett 300945, peu distribuée et relativement chère
  • Graisse à roulements : ne fonctionne pas correctement, trop visqueuse et "cuit" à chaud, ou devient trop fluide et se centrifuge (Testé : graisses MoS2 et graphite).
  • Graisse cuivrée/aluminium : Supporte bien la température mais doit-être plus fluide que de l'anti-seize (Testé : graisse cuivrée).

Références
On peut se débrouiller sans documentation, mais elle permet d'éviter de tomber dans des pièges grossiers.

icon Tags de l'article : ,

Horloge CSS Javascript

icon 09/10/2022 - No comments

Horloge CSS Javascript
J'ai voulu faire un projet simple faisable en une après-midi pluvieuse.
Ça fait quelques temps que je me disais que je ne savais pas vraiment faire de design web, et que je me contentais de chercher dans Stackoverflow pour des choses assez simples.

Partons sur une copie de la célèbre horloge des SBB-CFF avec les caractéristiques suivantes :
  • Cadran blanc avec 12 graduations épaisses pour les heures et 48 graduations fines pour les minutes
  • Aiguille des heures qui tourne de 0.5° par minute, de façon discrète
  • Aiguille des minutes qui tourne de 6° par minute, de façon discrète
  • Aiguille des secondes qui tourne de 6° par seconde, de façon discrète
  • Bulbe ajouté à l'extrémité de l'aiguille des secondes, pour la distinguer facilement
Horloge d'un quai de la gare de Genève-Cornavin
Les vraies horloges fonctionnent différemment avec l'aiguille des secondes entrainée par un moteur synchrone, qui fait un tour en 58.5s, puis s'arrête 1.5s sur la graduation 0, avant qu'une impulsion venant d'une horloge maître fasse avancer l'aiguille des minutes de 6°, l'aiguille des heures de 0.5°, et fasse continuer l'aiguille des secondes. Cette fonctionnalité n'a pas été reprise.
Ici, tout est fait de façon vectorielle, sans utiliser d'image.
Horloge SBB finale
Structure
Commençons par la structure de la page en séparant le code CSS, HTML et Javascript :
<style>
	/* Code CSS permettant la mise en page des blocs définis plus bas */
</style>

<body>
	<div class="clock">
		<!-- Code HTML définissant tous les blocs utilisés pour afficher une horloge -->
	</div>
</body>

<script>
	// Code Javascript permettant d'animer les aiguilles de l'horloge
</script>

Hiérarchie
On va devoir définir tous les éléments de façon hiérarchique, par classe :
Clock |- Circle - Quarter*4 - Hour*3 - Minute*4
       |- Hands
Ce qui nous donne 4 quartiers, 12 heures et 48 minutes. Les 12 minutes manquantes sont multiples de 5 et confondues avec les graduations des heures.

Code HTML
C'est assez simple, on va définir les éléments choisis dans la hiérarchie, avec pas mal de copier-coller.
<div class="clock">
<div class="circle">
	<div class="quarter1">
		<div class="hour12">
			<div class="minute1"></div>
			<div class="minute2"></div>
			<div class="minute3"></div>
			<div class="minute4"></div>
		</div>
		<div class="hour1">
			<div class="minute1"></div>
			<div class="minute2"></div>
			<div class="minute3"></div>
			<div class="minute4"></div>
		</div>
		<div class="hour2">
			<!-- ... -->
		</div>
	</div>
	<div class="quarter2">
		<!-- ... -->
	</div>
	<div class="quarter3">
		<!-- ... -->
	</div>
	<div class="quarter4">
		<!-- ... -->
	</div>
	<div class="hourshand"></div>
	<div class="minuteshand"></div>
	<div class="secondshand"></div>
	<div class="secondsbulb"></div>
</div>
Le code a été tronqué pour le rendre lisible.
Ce code seul n'affiche rien. les balises "div" définissent un bloc vide, mais permettent de lui assigner une classe ou un identifiant. On utilise des classes, mais on pourrait utiliser des identifiants si les blocs étaient uniques.

Code CSS
On va tenter de rendre les choses paramétriques en utilisant des variables dans le code CSS:
	:root {
		--size: 256px;							/* circle diameter */
		--hwidth: calc(var(--size) / 25);		/* hours marks 10px*/
		--hheight: calc(var(--size) / 8);		/* hours marks 32px*/
		--mwidth: calc(var(--size) / 85);		/* minutes marks 3px*/
		--mheight: calc(var(--size) / 32);		/* minutes marks 8px */
		--hhwidth: calc(var(--size) / 16);		/* hours hand 16px */
		--hmwidth: calc(3 * var(--size) / 64);	/* minutes hand 12px */
		--hswidth: calc(var(--size) / 64);		/* seconds hand 4px */
		--bradius: calc(3 * var(--size) / 32);	/* bulb radius 24px */
	}
Cadran
Puis on va coommencer par définir un disque blanc sur lequel on va afficher tous les éléments du cadran et les aiguilles :
	.circle {
		display: block;
		margin-left: auto;
		margin-right: auto;
		/*position: absolute;*/
		top: 0%;
		left: 0%;
		background-color: white;
		width: var(--size);
		height: var(--size);
		border-radius: 50%;
	}
Graduations
L'intérêt des classes est de pouvoir appliquer les mêmes paramètres à plusieurs éléments en fonction de leur hiérarchie.
.hour1,
	.hour2,
	.hour12 {
		position: absolute;
		top: calc(var(--hwidth) / 2);
		left: calc(50% - var(--hwidth) / 2);
		background-color: black;
		width: var(--hwidth);
		height: var(--hheight);
		transform-origin: calc(var(--hwidth) / 2) calc( (var(--size) - var(--hwidth) ) / 2);
	}
Horloge SBB heures
Ça donne 3 blocs noirs superposés en haut et au centre du disque. Rien d'impressionnant, sauf qu'on peut faire mieux :
.hour1 {transform: rotate(30deg);}
.hour2 {transform: rotate(60deg);}
Ce qui va laisser un bloc à 12h, et en bouger un à 1h et l'autre à 2h.
L'attribu "transform-origin" permet de spécifier que la transformation se fait à partir du centre de l'horloge, en prenant en compte la largeur des figures.
Horloge SBB heures

On fait exactement pareil avec les minutes :
	.minute1,
	.minute2,
	.minute3,
	.minute4 {
		position: absolute;
		top: 0;
		left: 0;
		background-color: black;
		width: var(--mwidth);
		height: var(--mheight);
		transform-origin: calc(var(--mwidth)) calc( var(--size) / 2 - 2 * var(--mwidth)) 122px;
	}
	.minute1 {transform: rotate(8deg);}
	.minute2 {transform: rotate(14deg);}
	.minute3 {transform: rotate(20deg);}
	.minute4 {transform: rotate(26deg);}
Et comme chaque bloc de 4 graduations de minutes est inclu dans une graduation d'heures, il est aussi dupliqué.
Horloge SBB minutes

Une fois qu'on a un quartier, on le copie :
	.quarter1,
	.quarter2,
	.quarter3,
	.quarter4 {transform-origin: 50% calc(var(--size) / 2);}
	.quarter1 {transform: rotate(360deg);}
	.quarter2 {transform: rotate(90deg);}
	.quarter3 {transform: rotate(180deg);}
	.quarter4 {transform: rotate(270deg);}

À partir de là, on a un cadran complet affichable.

Aiguilles
On va faire des blocs similaires aux graduations. On va aussi les faire tourner autour du centre, mais on va aussi les placer au centre :
	.hourshand {
		display: block;
		position: absolute;
		top: calc(3 * var(--size) / 16);
		left: calc(50% - var(--hhwidth) / 2);
		width: var(--hhwidth);
		height: calc(var(--size) / 2 - var(--hhwidth));
		background-color: black;
		transform-origin: calc(var(--hhwidth) / 2) calc(var(--size) / 2 - 3 * var(--size) / 16);
	}
	.minuteshand {
		display: block;
		position: absolute;
		top: var(--hmwidth);
		left: calc(50% - var(--hmwidth) / 2);
		width: var(--hmwidth);
		height: calc( (9/16) * var(--size));
		background-color: black;
		transform-origin: calc(var(--hmwidth) / 2) calc(var(--size) / 2 - var(--hmwidth));
	}
	.secondshand {
		display: block;
		position: absolute;
		top: calc(var(--size) / 8);
		left: calc(50% - var(--hswidth) / 2);
		width: var(--hswidth);
		height: calc(var(--size) / 2);
		background-color: #eb0000;
		transform-origin: calc(var(--hswidth) / 2) calc(var(--size) / 2 - var(--size) / 8);
	}
	.secondsbulb {
		display: block;
		position: absolute;
		top: var(--bradius);
		left: calc(50% - var(--bradius) / 2);
		width: var(--bradius);
		height: var(--bradius);
		background-color: #eb0000;
		border-radius: 50%;
		transform-origin: calc(var(--bradius) / 2) calc(var(--size) / 2 - var(--bradius));
	}
À cette étape-ici, on a une horloge complète, mais immobile.
Horloge SBB nojs

Code Javascript
On commence par définir une fonction qu'on va appeller à chaque seconde :
clock()

function clock() {
	// todo
}
setInterval(clock, 1000);
Ensuite, on va remplir cette fonction pour obtenir les valeurs correspondant à l'heure, minute et seconde actuelle :
  const date = new Date();
  const seconds = date.getSeconds();
  const minutes = date.getMinutes();
  //const hours = ((date.getHours() + 11) % 12 + 1); // use integers
  const hours = ((date.getHours() + 11) % 12 + 1) + minutes / 60.0; // use floats

L'heure est convertie de 24 à 12 heures, mais c'est facultatif, 11h et 23h ont le même angle à 360° près.
Il est aussi possible de choisir entre des heures discrètes, s'incrémentant par pas de 30 degrés toutes les heures, ou par pas de 0.5°, à chaque minute.

On va ensuite convertir ces valeurs en angles :
  const second = seconds * 6;
  const minute = minutes * 6;
  const hour = hours * 30;
Puis faire tourner les aiguilles d'un angle correspondant à la date :
  document.querySelector('.secondshand').style.transform = `rotate(${second}deg)`
  document.querySelector('.secondsbulb').style.transform = `rotate(${second}deg)`
  document.querySelector('.minuteshand').style.transform = `rotate(${minute}deg)`
  document.querySelector('.hourshand').style.transform = `rotate(${hour}deg)`

Toutes ces étapes nous donnent une horloge fonctionnelle.
Horloge SBB finale

icon Tags de l'article : , ,

Smartphone Nokia 4.2

icon 30/10/2021 - No comments

J'ai dû changer de téléphone quand la partie RF de mon Moto G5 (XT1676 "cedric") est devenue défectueuse.
Il a fallu trouver un téléphone équivalent et si-possible mieux, sauf que j'ai eu du mal à trouver des téléphones moyens et qu'on arrive vite à des téléphones haut-de-gamme encombrants et des téléphones bas-de-gamme de qualité douteuse.

Hardware

J'ai utilisé la page Phone Finder de GSM Arena qui liste les smartphones correspondant aux critères renseignés.
Puis ensuite la page de comparaison pour être sûr de ne pas avoir oublié une caractéristique qui pourrait manquer.

Il y avait des critères incontournables :
  • Jack audio 3.5mm
  • Slot microSD
  • Wifi g/n
  • Bluetooth LE

J'ai pu avoir aussi bien ou mieux que le Moto G5 :
  • 3GiB RAM > 2GiB RAM
  • 32GiB flash > 16GiB flash
  • SoC Qualcomm 8-core ("little-big") 12nm < 28nm
  • Beidou en plus du GPS et Glonass

Et quelques critères manquants, ou moins bien :
  • Hauteur : 149mm > 144.3mm
  • Batterie non-amovible, à priori accessible
  • Écran 720*1520 < 1080*1920, peu dérangeant
  • Gyroscope manquant, pas de boussole

Le Nokia 4.2 (TA-1157, "PAN_sprout"/"Panther") est assemblé par Foxconn et à l'air de bonne qualité.

Software
Je trouve que les versions récentes d'Android sont devenues moins personalisables et l'environnement de Google est un peu intrusif.
Trouver un smartphone avec des ROMs alternatives, un bootloader débloquable et un minimum de support était aussi un critère important.

Le forum XDA-Developpers est un bon point de départ pour trouver des ROMs alternatives et s'assurer que le flash est possible.

Lineage OS
Lineage OS n'est pas disponible officiellement pour le Nokia 4.2, mais il existe un portage non-officiel.

  • Activation du "Developer mode" (About phone -> 7 taps sur "Build info")
  • Activation de ADB
  • Reboot au bootloader puis recovery (selection avec les boutons de volume)
  • Sideload d'une ancienne mise-à-jour qui permet de flasher
  • Débloquage du bootloader avec fastboot
  • Flash de l'image de boot/recovery de Lineage avec fastboot
  • Reboot en recovery
  • Sideload de l'ancienne mise-à-jour (slots a/b)
  • Sideload de Lineage OS
  • Sideload des Gapps (MindTheGapps ou OpenGapps)
  • Reboot et configuration

En cas d'erreur, il est toujours possible de faire quelque chose tant que le bootloader est accessible et débloqué, ou qu'une image de recovery est disponible.

Root
L'application Magisk permet de modifier la ROM de boot, puis on peut ensuite réutiliser le procédé précédent pour avoir un OS utilisable.

L'application Titanium Backup nécessite d'être root, mais permet de transférer les données beaucoup plus facilement qu'à la main avec ADB (qui nécessite aussi d'être root). La carte microSD permet de transférer le reste des données assez facilement.

Note: Le programme de recovert TWRP semble exister mais n'a pas l'air fonctionnel sur ce smartphone.

Références

icon Tags de l'article :

Fail

icon 21/03/2021 - No comments

Ce site et quelques autres services personnels étaient hébergés chez OVH, spécialement dans le datacenter SBG. Ce datacenter a connu un "incident" le 10 Mars 2021 vers 0:40.
OVH's SBG Datacenter

J'ai pu restaurer des sauvegardes un peu anciennes et reconstruire le reste à partir de sauvegardes partielles, mais je profiterais sûrement de cet évênement pour faire quelques modifications à ce site.

icon Tags de l'article : ,

Clé dynamométrique (2)

icon 15/01/2020 - No comments

J'ai déjà une clé dynamométrique dont j'arrivais aux limites de son utilisation.
  • Gamme d'utilisation de 28Nm à 210Nm
  • Bras de 400mm
  • Carré d'entraînement de 1/2"
C'est très bien pour des pièces de voiture accessibles (roues, freins, suspension), mais le couple de serrage minimum est beaucoup trop élevé pour les pièces de vélo délicates en aluminium, et la clé est trop encombrante pour certaines pièces inaccessibles dans une baie moteur de voiture.

Astuce
J'ai acheté une balance pèse-bagages, testé son étalonnage avec des bouteilles d'eau entre 1kg et 22.5kg. Je n'ai pas pu tester précisément au dela, mais le capteur fonctionne bien jusqu'à 50kg comme spécifié.
Je dispose de clés à douille et plates adaptées aux pièces que je dois visser. Comme il faut un levier et une force pour avoir un couple, il n'y a besoin de rien de plus.

On va devoir mesurer la longueur entre le pivot et le point où on applique la force, puis calculer la force à appliquer en fonction du couple donné :
diy torque wrench schematic
Il est important que la sangle soit perpendiculaire au levier, que la longueur utile du levier (bleu-clair sur le schéma) soit connue et ne change pas, et que la totalité de la force soit appliquée sur le pèse-bagages.

$$C = F \times L$$
$$F = \frac{C}{L}$$
$$F_{kg} = \frac{C}{L \times g}$$
Avec \(F_{kg}\) en kg-f, \(F\) en N, \(C\) en Nm, \(L\) en m et \(g\) = 9.81N/kg

Parfaitement fonctionnel là où la place est limitée:
diy torque wrench working

Dans ce cas, il s'agit d'un embout 5/16" pour lequel même un cliquet 1/4" et un adaptateur 5/16" ne passeraient pas.
Par chance, 5/16" donnent environ 7.9mm, ce qui fait que l'embout recouvert de scotch rentre sans jeu dans une clé à pipe de 8mm (elle-même enfoncée dans une clé plus grande pour avoir un plus grand levier).

Par exemple ici, on mesure une longueur entre le centre de l'embout et la sangle de la clé L = 225mm, et on doit appliquer un couple C = 50Nm. Ce qui donne : $$F_{kg} = \frac{50Nm}{0.225m \times 9.81N/kg}$$
$$F_{kg} = 22.65 kg \cdot f$$
On doit ainsi serrer jusqu'à ce que le pèse-bagage affiche 22.65kg.

Note: La sangle du pèse-bagage n'est pas placée correctement vu que la photo a été prise avec une seule main.

icon Tags de l'article : , ,

Lampe à LEDs : Teardown

icon 05/10/2019 - No comments

Éclairage d'origine
J'ai un luminaire avec 4 lampes G9, qui permettait pas mal de redondance. Il a fallu se résoudre à acheter de nouvelles lampes en arrivant au seuil critique de 3 lampes non-fonctionnelles.

Je suis tombé sur des lampes à LEDs avec la description suivante : LED-Lampe MÜLLER-LICHT, G9, EEK: A++, 3 W, 300 lm, 2700 K, c'est typiquement de la Chinoiserie importée avec un nom Allemand pour faire vendre, mais c'est à un prix correct sans avoir l'air d'un feu d'artifice.

Ça remplace bien les lampes G9 de 20W sur le papier. C'est équivalent en pratique aussi : c'est aussi lumineux sans tirer vers le jaune ni le bleu, mais il y a un très léger effet stroboscopique à ~100Hz.

Par chance, une des lampes ne fonctionnait pas, ce qui m'a permis de la démonter pour voir ce qu'il y avait dedans.

Datasheet
Le marchand indique plein de données plus ou moins utiles :
DonnéeValeurTraduction non-bullshit
Classe d'énergieAA+Bullshit
Consommation d'énergie3 kWh/1'000h3W en unités débiles
Tension de service230V ACExactement ce qu'on cherche
Puissance3W
DimmableNonCapacité probablement directement derrière le redresseur
Équivalence lampe à incandescence29WDélicat à définir sans bullshit
SocketG9Plug & Play
Facteur de Puissance>0.48Montage avec une capacité et des diodes
Température de couleur2'700K"Blanc chaud"
Intensité du faisceau300 lm
CRI>80Typique de LEDs de moyenne qualité mais mieux qu'une lampe à vapeur de sodium
Angle de rayonnement200°
Durée de vie moyenne25'000hLes LEDs chauffent relativement peu avec ce package, mais ça peut tirer sur le jaune après vieillissement
Nombre de cycles de démarrage>100'000fort probable que le pont de diode casse le premier
Performances à la fin de la durée de vie typique>70%
Durée de démarrage0.5~1stemps de montée à 60%, négligeable pour les LEDs et limité par la charge de la capa d'entrée

Extérieur et ouverture
Le boitier a une coque transparente qui ressemble à du polycarbonate, enfoncée et collée dans un corps hexagonal en céramique sur lequel les LEDs sont fixées (8 LEDs par côté et 3 en haut, 51 LEDs au total).
Picture from the manufacturer

Je n'ai pas réussi à décoller la coque du corps, et j'ai évité de couper le corps pour ne pas risquer d'abimer les LEDs ou le PCB dessous, mais ça doit-être une solution. Il est aussi sûrement possible de chauffer pour ramollir la colle.

La solution barbare est de tenir la coque dans un étau et de fissurer le corps, puis une fois qu'il est cassé, on peut utiliser un tournevis plat comme levier et casser un peu plus le corps en céramique.

Une fois la coque retirée, on va déplier les pattes, décoller le PCB qui est une sorte de mylar collé sur le corps en céramique, et ensuite on peut pousser sur les pattes et le PCB avec "l'alim" vient avec les LEDs.

Teardown
On identifie tout de suite le problème qui est une mauvaise soudure entre le PCB inséré dans le corps et le PCB flexible qui contient les LEDs.
flex pcb bad solder joint

Le schéma de la pseudo-alimentation est tout simple à identifier à l'ohm-mètre :
rectifier pcb
rectifier schematic
R2 sert décharger les capa C1 et C2 en l'absence d'alimentation. Le couple R3 et C1//C2 sert à limiter le courant de façon astucieuse en formant en diviseur de tension capacitif (C1//C2 vaut environ 3.5kOhm et je suppose la capa d'être fortement deratée à 230V), tout en évitant de devoir surdimensionner le redresseur. L'effet stroboscopique vient de l'absence de capacité (ou d'inductance) après le pont de diodes. Mais le montage fonctionne probablement bien avec un gradateur à triac malgré la note "non-dimmable".

ComposantValeur
R1, R21MΩ
R375Ω
C1, C2470nF

Le routage du PCB flexible est un peu plus astucieux, mais reste simple à comprendre avec son PCB simple-face translucide :
LED strip flexible pcb
LED strip flexible pcb lighted
LED strip schematic

Liens
Site marchand

icon Tags de l'article : , ,

Billets d'avion

icon 21/04/2019 - No comments

Boarding pass British Airways
Ce billet a été imprimé sur un automate dans l'aéroport, simplement à partir d'un numéro de réservation.
M1Bxxxx/XAVIER MR EU4ABCD LHRMUCBA 0956 040M009F0087
13C>

M: Type d'encodage du billet
1: Une seule correspondance enregistrée sur ce billet
Bxxxx/XAVIER MR : Nom/Prénom, titre
E: Billet électronique
U4ABCD: Code de réservation du billet
LHR: Code IATA de l'aéroport de départ (London Heathrow)
MUC: Code IATA de l'aéroport de destination (Munich)
BA: Code IATA de l'opérateur (British Airways)
0956: Numéro du vol
040: Date du vol (9 Février, 40ème jour de l'année)
M: Type de compartiment et code de tarif propre au transporteur (classe économique non-remboursable)
009F: Numéro de place
0087: Sequence d'embarquement, 87ème personne à imprimer le boarding pass
1: Statut du passager?
3C: ?
>: Début de la section de sécurité (102 caractères)

E-Billet Lufthansa
Ce billet a été envoyé par e-mail par le transpoxxxxr après avoir chocodela place.
M1Bxxxx/XAVIER ES9ABC LYSMUCLH 2253 330Mcode0045
35D>

M: Type d'encodage du billet
1: Une seule correspondance enregistrée sur ce billet
Bxxxx/XAVIER : Nom/Prénom, titre
E: Billet électronique
ES9ABC: Code de réservation du billet
LYS: Code IATA de l'aéroport de départ (Lyon Saint-Exupéry)
MUC: Code IATA de l'aéroport de destination (Munich)
LH: Code IATA de l'opérateur (Lufthansa)
2253: Numéro du vol
330: Date du vol (26 Novembre, 330ème jour de l'année)
M: Type de compartiment et code de tarif propre au transporteur (classe économique non-remboursable)
012F: Numéro de place
0045: Sequence d'embarquement, 45ème personne à imprimer le boarding pass
3: Statut du passager?
5D: ?
>: Début de la section de sécurité (102 caractères)

Références

icon Tags de l'article : ,

Éclairage à LEDs

icon 02/12/2018 - No comments

Éclairage d'origine
Un pièce de mon appartement est éclairé avec des spots GU-4 12V, chacun avec une lampe à incandescence autour de 5W, avec un affreux câblage 4 spots sur une alim, puis 5 spots sur une autre alim identique. Ça fonctionne, sauf que les deux alims ont cramé à deux semaine d'intervalle.

Rafistolage 1
J'ai enlevé les alimentations cramées, puis je les ai remplacées par une seule alimentation ATX 12V. Ça fonctionne parfaitement, sauf que c'est un peu overkill, et surtout, j'ai besoin de l'alimentation ATX.

Fail 2
J'ai remplacé l'alimentation par un transfo 12V qui trainait, et je l'ai proprement emballé dans un boitier DIN.
cheap 12V transformer DIN enclosure
Ça fonctionne, sauf qu'un transfo 36VA n'est clairement pas suffisant pour alimenter 9 lampes de 5W chacunes (45W) et a commencé à sentir le cramé.

Réparation 3
J'ai acheté 10 LEDs en Chinoisium, vendues pour fonctionner directement en 12V AC, du coup avec un pont de diode et une capa.
new Pollin DAYLITE  G4-90-S LEDs

Fiabilisation 4
Après plusieurs mois, il y a eu des soucis de faux contacts, avec des soudures qui ont séchées et partiellement fondues, et toutes les capas fuyaient.
Peut-être que le transfo qui sort 14V AC à vide (soit 19.5V aux bornes de la capa) est un peu trop pour le dimensionnement (thermique) des LEDs et de leurs résistances de limitation.
used Pollin DAYLITE  G4-90-S LEDs
La majorité des LEDs ont été réparées (soudures refaites, capas supprimées), mais il a aussi fallu s'attaquer à l'origine du problème.
fixed Pollin DAYLITE  G4-90-S LEDs

Note: La résistance de saignée en parallèle de la capa a été supprimée, vu qu'elle ne sert plus à rien sans la capa

On remet le transfo d'où il vient, et on va réutiliser une alim d'imprimante Canon dont il aura suffit de changer la valeur de deux résistances pour sortir 12V DC.
Canon Pixma PSU

Les LEDs sont un peu moins lumineuses avec 12V DC qu'avec potentiellement 14V AC, mais on peut espérer que ce soit plus fiable.
fixed Pollin DAYLITE  G4-90-S LEDs

Références

icon Tags de l'article : , ,

Autoradio Tuner List (4) : Écran LCD

icon 17/03/2018 - 3 comments

J'ai toujours voulu afficher n'importe quoi sur l'afficheur au centre du tableau de bord, qui affiche normalement la station de radio et l'heure, et il se trouve que c'est tout à fait possible.
displaying funny words

Hardware
Ici, on a un autoradio Renault/VDO Tuner List (modèle 22DC259/62T, 77 00 434 422) et un afficheur Renault (82 00 028 364), avec un connecteur gris connecté au tableau de bord et à la radio, et un connecteur rouge connecté aux commandes situées sous le volant.

Je n'ai pas eu confiance dans les documentations que j'ai pu trouver, avec des couleurs de fils incorrectes, des brochages de connecteurs parfois à l'envers, différentes version de l'afficheur ou de l'autoradio.
pin identification
Mais ce n'est pas un problème, il suffit de démonter pour vérifier qu'on ne va rien faire de dangereux. On peut rapidement identifier les pins à la masse, ceux des alimentations, et certains signaux de puissance.

Connecteur Gris :
  1. NTC
  2. GND
  3. NC
  4. NC
  5. GND
  6. Éclairage feux? (in)
  7. Éclairage backlight? (in)
  8. +12V (contact?, in)
  9. +12V (permanent?, in)
  10. NC
  11. GND
  12. LCD_ENABLE (12V, in)
  13. SDA (TTL, io)
  14. SCL (TTL, io)
  15.  !MRQ (TTL, io, active-low)

Connecteur Rouge (TTL) :
  1. NC
  2. NC
  3. NC
  4. NC
  5. NC
  6. NC
  7. NC
  8. NC
  9. Commun 1
  10. Retour A
  11. Commun 2
  12. Retour B
  13. Commun 3
  14. Retour C
  15. NC

Ça permet de comprendre la majorité du câblage :
lcd + stalk + head unit connections

Et on peut aussi reverse-engineerer la matrice des boutons utilisés pour les commandes au volant:
FonctionPin communPin retour
OKA1
VOL-A2
VOL+A3
Source LB1
Source RB2
PauseB3
Molette 1C1
Molette 2C2
Molette 3C3
Curieusement, la molette n'est qu'un interrupteur rotatif à 3 positions, ça suffit à détecter le sens de rotation ça donne l'impression de bien plus de positions (6 par tour).

Câble
Dans ce cas, la solution la plus pratique est de prendre une rallonge avec des câbles mini-ISO branchés sur l'autoradio, de couper chaque fils et de les brancher sur un connecteur à 0.1", pour y mettre des cavaliers pour une connection directe, des fils en Y pour espionner le bus ou bien des fils vers un MCU ou un analyseur logique.
man in the middle cable

Connecteur jaune C1 :
  1. SDA (TTL 5V)
  2. SCL (TTL 5V)
  3.  !MRQ (TTL 5V)
  4. LCD_ENABLE (+12V)
  5. GND
On peut se contenter de n'utiliser que ce connecteur pour afficher ce que l'on veut, et reverse-engineerer une partie du protocole.
tuner list i2c bus reverse engineering in-situ
Comme je ne voulais pas décharger la batterie ni passer plusieurs heures dans le froid, j'ai préféré démonter l'afficheur et l'autoradio pour les utiliser à l'intérieur.
tuner list i2c bus reverse engineering on a bench


Protocole
Ça nous avance bien de connaître le matériel, mais il faut encore comprendre comment l'autoradio communique avec l'écran LCD.
Pour ça, on va utiliser un analyseur logique (Cypress FX2 et sigrok/pulseview) et regarder tout ce qui passe sur le bus i2c.
cheap logic analyzer

On peut voir que le bus i2c fonctionne à 7.14kHz et que le signal !MRQ est constamment tiré à 0 avant que quelque chose ne soit transféré sur le bus.

En débranchant le signal MRQ de chaque côté, on peut voir que l'afficheur le force à 0 en attendant une trame de l'autoradio, mais que l'autoradio le force aussi à 0 avant d'envoyer une tram à l'autoradio. On peut aussi voir que l'autoradio est maître sur le bus i2c, et identifier l'adresse de l'écran LCD (0x23).

On peut voir plusieurs messages de 2 octets de long [0x01, 0x10] ou [0x01, 0x11], demandés au moins toutes les 500ms par l'autoradio (initié par l'afficheur qui tire le signal MRQ à 0, puis répond lorsque l'autoradio envoie une requête).
i2c line on idle

Commandes au volant
Il y a aussi une trame répondue par l'afficheur lorsqu'on appuie sur un bouton des commandes au volant, et qui permet de déduire le code de chacune des commandes au volant. L'afficheur tire le signal MRQ à 0, l'autoradio envoie une requête, puis l'afficheur envoie la trame correspondant aux boutons pressés.
i2c line button
Boutonoctet 0octet 1octet 2octet 3octet 4action
OK0x040x820x910x000x00press
OK0x040x820x910x000x40hold
Source R0x040x820x910x000x01press
Source R0x040x820x910x000x81hold
Source L0x040x820x910x000x02press
Source L0x040x820x910x000x82hold
Volume +0x040x820x910x000x03press
Volume +0x040x820x910x000x43hold
Volume -0x040x820x910x000x04press
Volume -0x040x820x910x000x44hold
Pause0x040x820x910x000x05press
Wheel up0x040x820x910x010x41
Wheel down0x040x820x910x010x01
Les valeurs 0x41 et 0x42 pour le dernier octet sont aussi interprétées par l'autoradio comme les boutons Source R et Source L maintenus appuyés, et il n'y a pas de code lorsqu'on maintient appuyé le bouton Pause ou pour la molette.

Affichage
L'afficheur est rafraichi uniquement en cas de besoin, on peut l'observer en appuyant sur un bouton de l'autoradio, qui va forcer le signal MRQ à 0, puis va envoyer une trame entre 13 et 16 octets avec les caractères à afficher.
i2c line display
Affichage12345678910111213141516
98.50x0f0x900x7f0x290xff0x3f0x350x810x200x200x200x200x390x380x350x20
CASS [=]0x0f0x900x7f0x550xff0xff0x600x010x430x410x530x530x200x040x050x06
BAYERN 30x0f0x900x7f0x550xff0x3f0x750x010x420x410x590x450x520x4E0x200x33
Bingo ! Les trames à partir de l'octet 9 ressemblent à de l'ASCII (les caractères clignotent si le MSB est à 1), l'octet 7 permet d'afficher le point décimal et le digit de mémoire/piste, et l'octet 6 permet d'afficher les pictogrammes Tuner Preset, Tuner Manu, Dolby et MSS.

Programme
On va remplacer l'autoradio par un Arduino Mega (n'importe quel micro-contrôleur avec un périphérique i2c et des IO TTL suffit), pour pouvoir écrire sur l'afficheur et lire l'état des boutons.

Avec un Atmel AVR, il faut forcer le bitrate/prescaler à environ 7kHz avec les lignes suivantes:
void conf() {
TWBR = 0xff;
TWSR = 0x01;
}


Comme c'est un programme de test qui n'a qu'une seule fonction et un MCU surpuissant pour son utilisation, il est possible d'écrire un code peu optimisé (polling au lieu d'interruptions, copy/paste).

On va initialiser l'écran en envoyant quelques trames [0x01, 0x10] et [0x01, 0x11], puis on peut écrire un peu ce qu'on veut :
void writerandom(byte *data, int len) {
while(digitalRead(2)); // polling the MRQ line
Wire.beginTransmission(0x23);
conf(); // overwrites the bitrate/prescaler after the Wire lib configures the i2c
Wire.write(data, len);
Wire.endTransmission();
}

Dans ce cas, on peut commencer par copier/coller des trames récupérées en sniffant celles envoyées par l'autoradio, puis on va reverse-engineerer le protocole complet en bouclant sur tous les caractères entre 0x00 et 0xFF, et en testant les pictogrammes.

On va aussi pouvoir lire l'état des boutons, qui sont des trames de 5 octets :
void read01() {
while(digitalRead(2)); // polling the MRQ line, pulling the MRQ line low and waiting 500us also works
conf(); // overwrites the bitrate/prescaler after the Wire lib configures the i2c
Wire.requestFrom(0x23, 5);
TWBR = 0xff;
TWSR = 0x01; // 0x00 appears to work as well
for(i = 0; i < 5; i++) {
READDATA[i] = Wire.read();
}
}


Références

icon Tags de l'article : , , , , ,

Perceuse Black & Decker

icon 20/01/2018 - No comments

J'ai récupéré une perceuse qui semblait assez ancienne, fonctionnelle, mais avec un bruit de roulements usés
Au prix où je l'ai eu (0EUR), je n'ai rien à perdre à la démonter pour voir ce qui ne va pas.
D'habitude, les outils Black & Decker ne valent pas mieux que les Chinoiseries, mais celui-ci est nettement plus lourd que d'habitude.
Black & Decker drill

Démontage de la coque
Il y a des vis à tête Philips ou plate de partout, et accessibles, du coup c'est très intuitif.
Contrairement aux perceuses bas de gamme actuelles, la coque est en nylon (renforcé, PA6-GF) monobloc, avec une cloche métallique autour du réducteur et en plastique à l'arrière du moteur, au lieu d'être en deux parties moulées (nettement plus rapide et cheap à mouler).
De façon intéressante, la date de fabrication est marquée sur les pièces moulées (1973).

On commence par le dos du moteur, qui donne accès aux palliers du moteur (le bronze est sec et poussiéreux, mais sans jeu ni traces de chauffe), et les balais ont l'air en bon état.
bushings + brushes cover
brushes

Le démontage de la partie autour de l'interrupteur et du cordon secteur est amusante. L'ensemble devrait être protégé de la poussière extérieure, mais est plein de poussière noire, comme si quelque chose avec explosé.
switch

La coupable est une capa "Fribourg condensateurs", de capacité inconnue, mais comme elle ne sert qu'à redresser le PF et limiter le bruit des balais, on peut s'en passer temporairement.


On peut ensuite retirer la cloche du réducteur avec le rotor (attention, j'ai abimé des pales de ventilation, et le moteur n'est plus très bien équilibré). On voit aussi des marques d'équilibrage sur le rotor.
rotor shaft and fan

On peut aussi démonter le stator pour le nettoyer. Vu le volume du core magnétique et le diamètre du fil de cuivre, ça semble dimensionné "à la louche" pour 500W continus et 1.5kW pic.

Réducteur
Sans surprise, vu le bruit qui venait du réducteur, on pouvait s'attendre à des choses intéressantes.
La graisse est complètement collée avec une consistance de chewing-gum, et les roulements/palliers et les engrenages tournent quasiment à sec.
old cooked grease

En démontant progressivement, on peut dégager les restes de graisse à la spatule, et nettoyer la cloche, puis les palliers/roulements et les engrenages avec plusieurs bains d'essence successifs.

On va faire attention aux palliers (le jeu est correct), et les tremper une heure dans de l'huile chauffée (le bronze fritté est une sorte "d'éponge à huile", et l'huile est plus fluide à chaud).

Ensuite, on pré-graisse les engrenages et les roulements, puis on rajoute des gros tas de graisse autour de chaque train d'engrenages.

Nettoyage et remontage
La coque est nettoyée à l'eau savonneuse, ça suffit largement à enlever toute la sciure et les saletés. La partie électrique (collecteur) est nettoyée à l'essence (n'importe quel solvant pas trop agressif pour l'émail et assez volatil devrait aller), pour éviter de l'oxyder.
Ensuite le remontage est assez intuitif.
new grease
grease, brake cleaner and oil

icon Tags de l'article : ,