Monorailcat

Liquide lave-glace

icon 2023-12-04 - No comments

Le liquide utilisé pour nettoyer les pare-brises de voiture a besoin de rester liquide même quand il fait froid, et ne pas contenir de minéraux qui pourraient boucher les tuyaux.

Des petits malins pourraient-être tentés de mettre de l'eau salée ou du vinaigre pour abaisser le point de fusion de l'eau, mais ça laisse un dépôt au fond des tuyaux/gicleurs, risque de faire rouiller le mécanisme d'essuie-glaces, et l'eau salée est assez peu transparente.

Température de fusion
Les alcools présents dans le liquide lave-glace s'évaporent plus facilement que l'eau, et le réservoir présent dans les voitures n'est pas hermétique et est souvent soumis à la chaleur rayonnée par le moteur. Un autre problème est le fait de sprayer du liquide sur du givre va mélanger ce liquide au givre fondu, et diluer les alcools présents.
Dans les deux cas, la concentration en alcools dans l'eau diminue, et le point de fusion va augmenter.
Avec un climat tempéré en Europe, -5°C est fréquent, -10°C est occasionnel et <-15°C rare. On peut estimer -20°C comme une cible réaliste en ayant de la marge avec l'évaporation et la dilution.

Composition
Regardons ce que contient du liquide lave-glace du commerce :
  • Sonax 03326020 (-20°C après dilution à 50%) :
- Ethanol : 50~75%
- Ethylene-glycol (Ethanediol) : 5~10%
- Agents de surface anioniques : <5%
- Parfums : traces
  • Aral Klaresicht Winter (-20°C après dilution à 33%) :
- Ethanol : 25~50%
- Ethylene-glycol (Ethanediol) : 5~10%
  • SMB-Auto 071180100 (-20°C pur) :
- Ethanol : 20~30%
- Ethylene-glycol : <5%
- Agent de surface anionique (Dipropylene glycol n-butyl-ether) : <0.5%

Ça veut dire qu'il y a globalement de l'eau avec beaucoup d'éthanol, un peu d'éthylène-glycol et de quoi donner une "tension de surface" au mélange.
L'ajout d'éthylène glycol est intéressant pour augmenter la viscosité du mélange, pour lubrifier les balais d'essuie-glaces et les rendre silencieux, mais a le défaut d'être polluant quand on le rejette tel-quel dans la nature.

Par curiosité, voyons-voir ce que contient du liquide vaisselle :
- Agents de surface anioniques : 5~15%
- Agents de surface régulateurs de pH : 5~15%
- Autres agents de surface : <5%
- Parfums : Traces

Mélange théorique
Si on dilue 1% de liquide vaisselle dans notre mélange, on aura entre 0.1~0.35% d'agents de surface pour espérer accrocher la poussière et faire glisser les essuie-glaces sans avoir trop de mousse.

Les propriétés du mélange eau-éthanol sont bien documentées, une température de fusion de -20°C correspond à une concentration de volume de 35 à 40%, ce qui approche les données des produits du commerce.
Ethanol-Water mix freezing point

Mais où peut-on trouver de l'éthanol en grande quantité ? Le carburant E85 trouvable en France contient environ 85% d'éthanol, et le reste d'essence.

Mélange pratique
Une astuce, c'est que l'eau est miscible avec l'éthanol mais pas avec l'essence, formant une phase qui surnage quand on mélange du E85 avec de l'eau, et que l'on peut séparer.
À noter que l'éthanol est dilué dans l'eau et que la densité du mélange est inférieure à celle de l'eau. Ça fait qu'il faut environ 5.7L de mélange pour obtenir 5.5L de produit.

Comme je n'ai pas d'instruments précis pour mesurer de grands volumes de liquide, je vais utiliser une balance pour graduer mon récipient avec de l'eau, et ensuite, viser une densité de 0.95 qui correspond à une concentration en volume de 35% d'éthanol.

Jug partially filled with E85
On commence par mettre 2.75L de E85 dans le bidon, puis on ajoute environ 1L d'eau, on remue et on laisse décanter.
Gasoline from E85 floating on water-ethanol mix

Ensuite, on va retirer la phase de 0.45L d'essence qui s'est formée. Pour une raison pratique, il plus simple de commencer à siphonner, puis de terminer précisément à la seringue. L'essence n'est pas contaminée et peut-être réutilisée dans un réservoir de voiture.

On va compléter en rajoutant de l'eau jusqu'au volume voulu, 5.7L ici, et on ajoute 50mL de liquide vaisselle.
Dish soap + water + ethanol mix -> Washer-fluid
Le mélange est directement utilisable une fois mélangé.


Oseille
Comme c'est censé être une "astuce de pauvre", venons-en au coût pour 5.5L de liquide lave-glace -20°C :
  • 3L de E85 : 1.89EUR (0.5 L d'essence valant 0.89 EUR ont été récupérés)
  • 3.2L d'eau distillée : 0 EUR (récupérée en dégivrant un congélateur)
  • 50mL de liquide vaisselle : 0.18 EUR
Total : 2.17 EUR
C'est amusant quand on a du temps et ce n'est pas forcément rentable, mais la comparaison est facile contre les produits du commerce comparables vendus entre 5 et 8 EUR, et parfois beaucoup plus.
Expensive washer-fluid at highway stop

Autres astuces
  • Un mélange éthanol-eau autour de 80%, sans restes d'essence fait un bon dégraissant volatile sans résidus.
  • Ajouter de l'eau à un volume connu de E85 et mesurer le volume de la phase d'essence permet de mesurer la concentration d'essence dans l'E85 (théoriquement 15% d'essence et 85% d'éthanol en été). Dans mon cas, j'ai mesuré 16.7% d'essence ±1%, dans l'intervalle de la SDS (15~40%).

Sécurité
  • Attention aux risques d'incendies avec l'éthanol (même mélangé à l'eau) et l'essence (surtout les vapeurs), manipulez dans un lieu ventilé sans source de chaleur ou d'étincelle/flamme à proximité.
  • Attention en pipetant ou en siphonant à la bouche, l'essence est toxique. Il vaut mieux utiliser un tuyau transparent pour aspirer, ou idéalement amorcer le siphon en soufflant avec un second tuyau et un bouchon étanche.
  • Ne pas utiliser de récipient pouvant-être confondus avec des récipients alimentaires.
  • Lisez bien les MSDS en lien dans cet article avant de manipuler.
  • Les seringues et récipients avec des joints butyle se dégradent au contact de l'essence, les seringues prévues pour purger les freins de vélo ont des joints compatibles

Références

icon Tags de l'article : ,

WhatsApp statistics (1)

icon 2023-11-19 - No comments

Some people requested this specific article to be written in English.

Back a few years ago, I got bored during Covid and realized it could be entertaining to get statistics out of a WhatsApp group. So things started with a bash script using sed, grep and wc, to count messages and occurrences of some words.
It looked like some people in that group had habits of texting during long meetings at work or just before lunch, and that some others seem to swear a lot. Running the log through a script can't lie.

After that, someone else mentioned the Pandas library for Python, that it can be handy to manipulate big amounts of data without iterating through like it's usually done with arrays and dictionaries. They also mentioned a couple of killer-features like loading/saving CSV files in one line, being able to manipulate timestamps, or being able to plot its dataframes in a single-line using Matplotlib. So why not rewrite that script from scratch using Pandas?

Reading log files
First, we need to look at the file saved by Whatsapp. It's 8845 lines long, humans can't process that easily, but the first lines give a good idea of the syntax and pattern:

01/02/2018, 12:34 - Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them. Tap to learn more.
01/02/2018, 12:34 - ABC created group "XYZ"
01/02/2018, 12:34 - ABC added you
01/02/2018, 12:34 - ABC: <Media omitted>
01/02/2018, 12:34 - ABC: First blood!
01/02/2018, 12:35 - ABC: I dont have DEF's number

How convenient, the 6 first lines show all we need in order to understand the syntax:
DD/MM/YYYY, HH:MM - Name: Message content

We can ignore any line not following this pattern since people being added, leaving, or changing phone numbers don't bring any relevant information.
It seems that the way timestamps are recorded in the logs differ depending on the locales used by the phone. In this case, they are set to English/Germany.

Now we roughly understand how messages are sorted, we can read the file and format it in an usable way.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pandas as pd
import re
FILE = './WhatsApp Chat with XYZ.txt'

def read_file(filename):
	# basic text file read
	f = open(filename, 'r')
	text = f.read()
	f.close()

	# Regex to account for messages taking up multiple lines and multiple posts
	pattern = re.compile(r'^(\d\d\/\d\d\/\d\d\d\d.*?)(?=^^\d\d\/\d\d\/\d\d\d\d|\Z)', re.S | re.M)
	
	# Sort everything by timestamp, sender and message
	timestamp = []
	sender = []
	message = []
	data = [m.group(1).strip().replace('\n', ' ') for m in pattern.finditer(text)]
	# replace image string to make it easier to sort
	data = [line.replace('<Media omitted>', '<Media_omitted>') for line in data]
	# replace multiple ? or ! to make them easier to count
	data = [re.sub(r'[\?\.\!]+(?=[\?\.\!])', '', line) for line in data]

	for row in data:
		# timestamp is before the first dash
		timestamp.append(row.split(' - ')[0])
		# sender is between dash and colon
		try:
			s = re.search('\ - (.*?):', row).group(1)
			sender.append(s)
		except:
			sender.append('')
		# message content is after the first colon
		try:
			message.append(row.split(': ', 1)[1])
		except:
			message.append('')
	# concatenating all three string arrays into a Pandas DataFrame
	df = pd.DataFrame(zip(timestamp, sender, message), columns=['timestamp', 'sender', 'message'])
	# converts timestamp string into a timestamp object
	df['timestamp'] = pd.to_datetime(df.timestamp, format='%d/%m/%Y, %H:%M')

	# removes events not associated with a sender
	df = df[df.sender != ''].reset_index(drop=True)
	return df
	
if __name__ == "__main__":
	df = read_file(FILE)
	print df

The result matches exactly the beginning of the file we fed to the script:
    timestamp              sender    message
0   2018-02-01 12:34:00    ABC       <Media_omitted>
1   2018-02-01 12:34:00    ABC       First blood!
2   2018-02-01 12:35:00    ABC       I dont have DEF's number
[8325 rows x 3 columns]
The first thing to see is that the number of rows doesn't match the number of lines of the text file, since lines corresponding to events rather than messages have been dropped.
Now we have our data in an usable format, so let's continue playing by extracting data.

Basic data extraction
What data can be useful at this stage?
  • date and time
  • Number of messages, but this can be misleading since message length seems to vary
  • Number of words, seems to be a more realistic index
  • Number of messages containing question marks, exclamation marks, links or images, to give a rough idea of the content of the messages
  • Number of words by message, to check if the number of messages and number of words correlate

Here's how the corresponding code looks like:
def expand_frame(df):
	# number of messages vs time (absolute date)
	df['date'] = pd.to_datetime(df['timestamp']).dt.strftime('%Y-%m-%d')
	# number of messages vs day of the week
	df['DoW'] = pd.to_datetime(df['timestamp']).dt.day_name()
	# number of messages vs time of the day, hh:mm and hour
	df['time'] = pd.to_datetime(df['timestamp']).dt.time
	df['timeh'] = pd.to_datetime(df['timestamp']).dt.hour
	# flag a message that contains images, exclamation/question marks or links
	df['q'] = df['message'].str.count('\?')
	df['x'] = df['message'].str.count('!')
	df['link'] = df['message'].str.contains('http')
	df['img'] = df['message'] == '<Media_omitted>'
	# count words for each message
	df['wordcount'] = df.message.apply(lambda x: len(x.split()))
	
	return df

It seems to be doing the things we want:
               timestamp  sender                        message
0    2018-02-01 12:34:00    ABC                         <Media_omitted>
1    2018-02-01 12:34:00    ABC                         First blood!
2    2018-02-01 12:35:00    ABC                         I dont have DEF's number
[8325 rows x 12 columns]

timestamp sender message date DoW time timeh q x link img wordcount
0 2018-02-01 12:34:00 ABC 2018-02-01 Friday 12:34:00 12 0 0 0 1 1
1 2018-02-01 12:34:00 ABC First blood! 2018-02-01 Friday 12:34:00 12 0 1 0 0 2
2 2018-02-01 12:35:00 ABC I dont have DEF's number 2018-02-01 Friday 12:34:00 12 0 0 0 0 5
[8325 rows x 12 columns]
[/code] We'll come back to it later when we need more data to process.

Sorting data
The next step is to analyze the data and put it into human-readable formats.
We'll start to group this data by sender and by day of the week
DOW = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
DOW2 = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
def sort_frames(df):
	# data by sender
	dfsender = pd.DataFrame(zip(
		sorted(df.groupby(['sender'])['sender'].indices.keys()), # list of senders (groupby sorts by alphabetic order)
		df.groupby(['sender'])['message'].count(), # counts number of messages by sender
		df.groupby(['sender'])['img'].sum(), # counts number of images by sender
		df.groupby(['sender'])['q'].sum(),
		df.groupby(['sender'])['x'].sum(),
		df.groupby(['sender'])['link'].sum(),
		df.groupby(['sender'])['wordcount'].sum() # number of words by sender
		),
		columns = ['sender', 'messagecount', 'img', 'q', 'x', 'link', 'wordcount']
	)
	# computes average message length
	dfsender['length'] = dfsender['wordcount'] / dfsender['messagecount']
	
	# data vs timestamp
	dfdate = pd.DataFrame(zip(
		sorted(df.groupby(['date'])['date'].indices.keys()),
		df.groupby(['date'])['message'].count(),
		df.groupby(['date'])['img'].sum(),
		df.groupby(['date'])['q'].sum(),
		df.groupby(['date'])['x'].sum(),
		df.groupby(['date'])['link'].sum(),
		df.groupby(['date'])['wordcount'].sum()
		),
		columns=['date', 'messagecount', 'img', 'q', 'x', 'link', 'wordcount'],
	)
	dfdate['length'] = dfdate['wordcount'] / dfdate['messagecount']

	# filling gaps in index
	dfdate['date'] = pd.to_datetime(dfdate['date'])
	dfdate.set_index('date', inplace=True)
	dfdate = dfdate.resample('1D').mean()
	dfdate.reset_index(inplace=True)
	dfdate.fillna(0, inplace=True)
	
	return dfsender, dfdate
This way we can display the results:
   sender  messagecount    img    q   x   link  wordcount    length
0   AAAAA           681   20.0   45   3   24.0       4401  6.462555
1    BBBB           194   40.0   19  35    2.0        937  4.829897
2    CCCC          1489  297.0  224  86   78.0       7240  4.862324
3    DDDD           179    3.0   22   3    0.0        658  3.675978
4  EEEEEE           512   38.0  139  21    8.0       3119  6.091797
5    FFFF           803  121.0  146  33   88.0       4472  5.569116
6   GGGGG          2491  119.0  365  39   83.0      14876  5.971899
7  HHHHHH           131   12.0   25   4    2.0        720  5.496183
8  IIIIII          1845  300.0  341  74  106.0      11975  6.490515

            messagecount  img     q    x  link  wordcount    length
date                                                               
2018-02-01           4.0  1.0   0.0  1.0   0.0       26.0  6.500000
2018-02-02          10.0  0.0   3.0  0.0   0.0       80.0  8.000000
2018-02-03           5.0  2.0   1.0  0.0   0.0       25.0  5.000000
2018-02-04           0.0  0.0   0.0  0.0   0.0        0.0  0.000000

Plotting data
This is not very convenient to read, we can plot it instead.
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [10.24, 6] # sets plots resolution to 1024*600px

def subplotr(df, axes, index=0):
	if(len(df) < 30): # avoids too dense bar plots
		plkind='bar'
	else:
		plkind='line'
	if(index == 0):
		pass
	else:  #selects X axis
		df.set_index(index, inplace=True)
	df['messagecount'].plot(ax=axes[0, 0], kind=plkind, label='messages')
	df['wordcount'].plot(ax=axes[0, 1], kind=plkind, label='words')
	df[['img', 'q', 'x', 'link']].plot(ax=axes[1, 0], kind=plkind)
	df['length'].plot(ax=axes[1, 1], kind=plkind, label='length')
	axes[0, 0].set_ylabel('Messages')
	axes[0, 1].set_ylabel('Words')
	axes[1, 0].set_ylabel('Counts')
	axes[1, 1].set_ylabel('Length')
	for i in range(2):
		for j in range(2):
			axes[i, j].margins(0)

def generate_plots():
	#fig1 - everything by sender
	fig1, axes1 = plt.subplots(2, 2)
	fig1.suptitle('Data by sender')
	subplotr(dfsender, axes1, 'sender')
	# ...
	#fig3 - everything vs time
	fig3, axes3 = plt.subplots(2, 2)
	fig3.suptitle('Data vs time')
	subplotr(dfdate, axes3, 'date')
	
plt.show()

Data by sender
Data vs time
It looks usable, but we can still do better.

Basic statstics
We can actually extract the peaks and plot them:
def top(dfdate):
	## top 10
	dfdate.set_index('date', inplace=True)
	dftop = pd.concat( # normalized data
		[dfdate.sort_values('messagecount', ascending=False).groupby('date')['messagecount'].head()[:10] / dfdate.sort_values('messagecount', ascending=False).groupby('date')['messagecount'].head()[0],
		dfdate.sort_values('wordcount', ascending=False).groupby('date')['wordcount'].head()[:10] / dfdate.sort_values('wordcount', ascending=False).groupby('date')['wordcount'].head()[0],
		dfdate.sort_values('img', ascending=False).groupby('date')['img'].head()[:10] / dfdate.sort_values('img', ascending=False).groupby('date')['img'].head()[0],
		dfdate.sort_values('link', ascending=False).groupby('date')['link'].head()[:10] / dfdate.sort_values('link', ascending=False).groupby('date')['link'].head()[0],
		dfdate.sort_values('length', ascending=False).groupby('date')['length'].head()[:10] / dfdate.sort_values('length', ascending=False).groupby('date')['length'].head()[0],
		], sort=True, axis=1)
	dfdate.reset_index(inplace=True)
	dftop.fillna(0, inplace=True)
	return dftop
	
def generate_plots():
	# ...
	#fig 10 - Top 10 plots
	fig10, axes10 = plt.subplots()
	axes10.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
	axes10.bar(dftop.index, dftop['messagecount'], label='message', width=10, alpha=0.5)
	axes10.bar(dftop.index, dftop['wordcount'], label='words', width=10, alpha=0.5)
	axes10.bar(dftop.index, dftop['img'], label='images', width=10, alpha=0.5)
	axes10.bar(dftop.index, dftop['link'], label='links', width=10, alpha=0.5)
	axes10.bar(dftop.index, dftop['length'], label='length', width=10, alpha=0.5)
	axes10.legend()
	fig10.suptitle('Top 10 dates (normalized)')

We generate a DataFrame containing all the top ten values from each field, divided by its maximum value to make them readable on the same Y-axis. An alternative would be to use a log scale on the Y-axis.

At this point, we start to have a lots of plots to display, and plt.show() starts making a mess by opening too many windows.
We can comment plt.show() and replace it by the following line, duplicated for each figure we want:
fig10.savefig('Figure_10.png')
This way plots are silently exported to files.

Top dates

Understanding data
The interesting thing about the plots showing data over time is to look at the log around the dates showing-up to see what happened.
  • November 2018, peak number of images, discussing and exchanging memes
  • Februrary 2019, unofficial ski event, log also shows lots of questions similar to: "I'm here, where are you guys?"
  • 2020, Covid and lockdowns, low activity
  • February 2021, something major happened to the company
  • May 2022, someone mentioned he might leave the team
Peaks in message length are jokes or copy/pasted text

Going further
The code took roughly one rainy weekend to get to the state where things were working well enough to get usable data, and a few weeks to improve the code based on Pandas' learning curve.
It's a good start to play with Pandas, but we can do more.

Notes and references

icon Tags de l'article : , ,

Outils de calage moteurs Renault K et F

icon 2023-10-28 - No comments

J'ai une voiture avec un moteur Renault K4M, et il faut des outils spécifiques pour changer la courroie de distribution.

Outils de calage pour Renault K4M

Calage arbres-à-cames MOT. 1496
L'outil de calage des arbres à cames est le même sur tous les moteurs F et K à 16 soupapes (K4J, K4M, F5R, F4P, F4R, F4RT), entre 1998 et 2020.

Méthode
Deux bouchons (1) sont cachés derrière un tuyau/résonateur d'air à démonter. Il faut les casser avec un tournevis plat pour les enlever, et les remplacer par des neufs au remontage.

Bouchons d'arbres 7700106271 et 7700274026

On tourne le moteur par la poulie de vilebrequin jusqu'à ce que les rainures en bout d'arbres soient horizontales et désaxées vers le bas.
Le moteur ne sera pas calé exactement si la courroie est usée et s'est légèrement détendue.

Alignement des arbres

Au remontage, avant de tendre la courroie et de serrer les poulies, on peut insérer partiellement l'outil et tourner légèrement les arbres pour que le calage soit exact, avant d'insérer l'outil à fond et de bloquer les deux arbres.

Outil MOT. 1496

Remarques
  • Cet outil n'est pas fait pour forcer (serrage des poulies sur les arbres ou desserrage de vis de vilebrequin), les arbres sont creux et fragiles
  • Ne pas faire levier entre les bouchons en bout d'arbre et la culasse, on risque de marquer la surface de joint de la culasse et le joint des bouchons ne survivra pas à un remontage.

Usinage
La pièce est usinée dans une plaque d'acier de 5mm. On peut aussi la fabriquer dans un profilé en L pour qu'elle soit plus rigide.
Mon premier dessin a une erreur et touche le boitier de thermostat. J'ai rajouté une encoche manuellement sur la pièce puis sur le second dessin.

Dessin outil MOT. 1496

Les deux trous proches de l'axe de symétrie de la pièce sont percés en 3.3mm puis taraudés en M4 pour fixer une équerre avec une pièce (MOT. 1750) qui tient l'outil sur la culasse. C'est facultatif, mais pratique pour être sûr que l'outil de calage ne bouge pas pendant la tension de la courroie.
Un seul trou aurait suffit, mais la symétrie rend l'utilisation de l'outil plus pratique.

Les deux trous proches des extrémités de la pièce sont percés en 4mm et servent à un éventuel renfort pour rigidifier la pièce. La plaque de 5mm d'acier a été suffisante dans mon cas.

Calage vilebrequin MOT. 1489
L'outil et la méthode de calage du vilebrequin sont les mêmes pour tous les moteurs Renault K (K7J 1.4L, K7M 1.6L, K4J 1.4L 16V, K4M 1.6L 16V, K9K 1.5L DCI), entre 1995 et 2020.

Dessin outil MOT. 1489

Méthode
On retire un bouchon à l'avant gauche du bloc-moteur, proche du capteur de pression d'huile (serré assez fort avec une vis Torx mâle).

Idéalement, on approche le moteur de sa position, on insère la pige et on tourne de quelques degrés jusqu'au blocage contre la pige.

Remarques
  • Le vilebrequin a des trous d'équilibrage proches du point de calage. On risque de se tromper et de décaler le vilebrequin.
  • Le méplat du vilebrequin côté distribution est dirigé vers le haut quand le moteur est au point de calage.
  • En cas de doute, on peut vérifier le calage du vilebrequin en insérant une tige dans le puit de bougie du cylindre 1 ou 4 pour vérifier qu'il soit bien au point-mort-haut.
  • La poulie de distribution n'est pas toujours clavetée sur les moteurs à essence. Attention à bien nettoyer et à bien serrer au remontage (la vis est à usage unique)
  • On ne peut pas utiliser la pige pour dévisser la poulie de vilebrequin, il faut un second outil ou une personne qui tient un tournevis dans les dents du volant-moteur. Certains engagent la 5ème vitesse et bloquent les freins pour dévisser la poulie de vilebrequin. C'est une idée discutable vu le couple transmis dans l'embrayage et les jeux de la transmission.

Usinage
La pièce est assez simple et se trouve dans le commerce, et on peut l'usiner facilement ou la fabriquer à partir d'une tige filetée et d'écrous/contre-écrous.
La longueur entre l'extrémité de la tige et la bague de serrage sert au calage, elle doit mesurer 69.50±0.50mm.
Outil MOT. 1489

Bloque-Poulies MOT. 1490
L'outil pour bloquer les poulies est spécifique aux moteurs K4J et K4M mais doit s'adapter pour d'autres moteurs avec des modifications.
Outil MOT. 1490

Méthode
On peut s'en passer en forçant sur la courroie neuve ou sur les arbres, mais ce n'est pas recommandé.

Si les poulies n'ont pas été alignées correctement au montage précédent, on peut commencer à les débloquer individuellement en forçant sur l'ancienne courroie encore tendue.

Ensuite, au remontage, on nettoie les surfaces de contacts entre les arbres et les poulies, on monte les poulies appoximativement, la courroie, on monte l'outil de blocage pour tendre la courroie et serrer les poulies.

Usinage
L'outil a été découpé au laser dans une plaque d'acier de 5mm.
Outil MOT. 1490
J'avais ajouté un second point pour bloquer la poulie de l'arbre d'échappement, c'est une erreur, la partie colorée en rouge est a supprimer.

Dessin outil MOT. 1490

La découpe en arc de cercle autour de la poulie de l'arbre d'admission est nécessaire pour les moteurs K4M avec poulie VVT (versions >115ch). Il faut vérifier que le jeu de l'outil est suffisant pour le passage de la poulie VVT et agrandir la découpe de droite au besoin.

Les 3 perçages ont un diamètre de 6.5mm et sont taraudés en M8 pour insérer les vis qui entrent dans les trous des poulies.
On peut souder des tuyaux ou placer des cales autour des deux perçages de 16mm (29mm en haut, 9mm en bas) pour que l'outil soit coplanaire avec les poulies.

Clé spécifique MOT. 1368
Il n'y a pas assez de place pour serrer le galet de courroie (2) avec une clé à douilles.
Outil MOT. 1368

On peut se passer de l'outil de Renault en utilisant une clé plate ou à pipe de 8mm et une douille Torx 50 7/16". On peut mettre du papier pour compenser l'écart entre 7/16" et 8mm.
Remplacement de l'outil MOT.1368

Références de pièces
  • Outil de calage vilebrequin : MOT. 1489
  • Outil de calage d'arbres : MOT. 1496
  • Outil de blocage de poulies : MOT. 1490
  • Clé spécifique : MOT. 1368
  • Outil de blocage de volant-moteur
  • Bouchon de pige vilebrequin : 77 03 075 340
  • Bouchons de calage arbres à cames : 77 00 106 271 et 77 00 274 026
  • Vis de poulie de vilebrequin : 82 00 557 644

Références

Note: DXF files and PDF files (drawn to scale) are available upon request.

icon Tags de l'article : , ,

Sachs Torpedo/Pentasport

icon 2023-07-23 - 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 2022-10-09 - 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 2021-10-30 - 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 2021-03-21 - 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 2020-01-15 - 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 2019-10-05 - 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 2019-04-21 - 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 : ,