Monorailcat

Ventilation silencieuse pour serveurs

icon 01/07/2016 - No comments

Dans la majorité des cas, le refroidissement des serveurs est conçu pour un fonctionnement 24h/24 dans un environnement défavorable, typiquement, avec 10 à 40 serveurs empilés dans une baie, avec une température ambiante de 50°C.
Dans ce cas-là, il est nécessaire d'avoir une ventilation performante pour que la température de tous les composants reste acceptable (typiquement, <70°C pour les gros circuits intégrés, <85°C pour les composants de puissance et <55°C pour les disques durs).

Mais pour utiliser un serveur seul, dans une maison, ou bien pour le réutiliser en tant que workstation, la ventilation est inutilement performante, et reste très bruyante.

HP Proliant ML-350 G1
J'ai eu ce serveur dans ma chambre en 2010, du coup j'ai rapidement changé sa ventilation.
Sur ce serveur, il y a un ventilateur de 120mm qui extrait l'air du boitier, un ventilateur de 90mm qui refroidit le processeur et les disques durs, et un ventilateur de 80mm dans l'alimentation.

L'alimentation est proche de la norme ATX (avec un connecteur propriétaire de plus). Il est possible de remplacer le ventilateur simplement en recâblant le connecteur, en sachant que le fil du tachymètre n'est pas câblé.

Dans mon cas, j'ai décidé de me passer du ventilateur de 120mm (rouge) et de remplacer celui de 90mm (vert).
HP ML350 replaced fans

Sauf que si la majorité des ventilateurs ont un connecteur à 3 pins, les HP Proliant ont un câble propriétaire :
  1.  GND
  2. GND (sense)
  3. 12V
  4. NC (détrompeur)
  5. Tach

Ce câble a plusieurs ruses : le pin 2 est court-circuité par le câble du ventilateur, ce qui permet de remarquer si un ventilateur n'est pas branché et Le pin 3 est utilisé par le tachymètre du ventilateur.
Dans les deux cas, la carte-mère renvoie une erreur si un ventilateur n'est pas branché, ou bien s'il tourne trop lentement.

Si c'est clairement utile pour prévenir les erreurs dans un serveur en production, ça force à utiliser un ventilateur d'origine HP, ou bien à copier le câble et à avoir un ventilateur rapide.

Modification
Pour se passer de la première erreur, les pins 1 et 2 de chaque ventilateur sont reliés par un jumper pour leurrer la détection de ventilateur.
La seconde erreur va être contournée en leurrant la carte-mère en lui faisant croire qu'il y a un ventilateur tournant au moins à 3000rpm (vitesse du plus lent des ventilateurs originaux).

Les ventilateurs de PC ont un moteur brushless à deux phases, et du coup le signal du tachymètre renvoie deux impulsions par tour, avec un transistor monté en collecteur ouvert, qui vient se fermer pendant quelques ms.

Les circuits intégrés NE555 peuvent se monter en oscillateur astable pour générer un signal avec un rapport cyclique d'environ 1/2, et une fréquence de 150Hz (4500rpm).
555 fake fan tach signal

On utilise deux transistors, un pour chaque ventilateur. Il aurait été possible de relier les deux signaux sur cette carte-mère, mais il est possible que le signal du tachymètre n'ait pas le même niveau logique partout (typiquement le cas de ventilateurs branchés sur des cartes différentes dans un même PC).

555 fake fan tach signal on stripboard
Sur le montage réel, je pense que j'avais oublié de relier le point entre les R1 et R2 au pin 6 (Threshold), du coup le réseau de résistances (internes au 555) chargait C1 et la fréquence et le rapport cyclique devaient être incorrects. J'avais aussi oublié C2 et C3 pour découpler le pin 5 (CV) et l'alimentation.

Le montage final est emballé dans un sachet antistatique et collé à la carte SCSI.
fake fan tach signal HP ML350

Références

icon Tags de l'article : , ,

Chaîne audio Lo-Fi

icon 14/06/2016 - No comments

J'utilise un système audio avec des éléments récupérés ou faits maison, en évolution depuis environ 2004, avec quelques tests qui ont été abandonnés entre temps.

Sources
  • Tuner : Silver SU-1010 (Marque Japonaise bas de gamme, mais de qualité correcte) des années 80, tuner AM 3-bandes, FM stéréo, entièrement analogique (PLL), peu utilisé,
  • Lecteur CD : Kenwood DP-2010 de 1989, DACs Burr-Brown PCM56P (16bits série, 96dB de dynamique, SnR : 100dB)
  • PC : sortie ligne, utilisée la majorité du temps.

Ampli - Préampli
Sony TA-FE370 (2001) :
Kenwood DE-2010 cd player & Sony TA FE-370 amplifier
  • 4 entrées lignes (CD, Tuner, Aux et Tape),
  • une sortie ligne (mixée et reliée au 2nd ampli),
  • Ampli intégré STK4211-2 (2x70W, probablement un peu optimiste),
  • Alimentation 2x42V + 2x12V + 5V
  • Potentiomètre motorisé, entrées télécommandées (SNR théorique : 105dB, audible en pratique)

Ampli
Silver SA-1010 (198x, modifié entre 2007 et 2010) :

  • Entrée ligne,
  • Ampli intégré STK???? (2x30W, probablement un peu optimiste),
  • Alimentation 1x63V, capacité low-ESR 2200µF,
  • Préampli supprimé, (SNR théorique : 65dB, amélioré en supprimant le préampli)

Enceintes large-bande
Construites en 2008 :
Fostex FE-127E wideband enclosure
  • Haut-parleurs : Fostex FE-127E (120mm),
  • Enceinte : 12L clos, MDF 22mm + laine de verre,
  • Bande passante : 150Hz-19kHz à 91dB/1W ±3dB, fréquence de résonnance à 130~150Hz,
  • Puissance admissible : 15W (en filtrant les graves) en 8Ω

Caisson de basses
Construit en 2009 :
JBL GT-120.2 subwoofer enclosure & Fostex FE-127E wideband enclosure
  • Haut-parleur : JBL GT-120.2 (300mm),
  • Enceinte : 200L clos, MDF 22mm + renforts,
  • Bande passante : 27Hz-300Hz à 92dB/1W ±3dB (20Hz à -10dB),
  • Puissance admissible : 250W en 4Ω

Anciens éléments
  • Lecteur de cassettes Silver SD-1010, démonté vers 2005 à cause de son inutilité et d'une courroie cassée,
  • Ampli à base de STK4141-V, chip cramé à cause d'une erreur de câblage en 2010,
  • Subwoofer en ligne de transmission (U-Frame), testé en 2008, très performant (capable de faire trembler une maison avec 3W), mais avec une distorsion importante et un caisson encombrant.

Todo
  • Le préampli intégré à l'ampli Sony est de mauvaise qualité, un autre préampli est en cours de fabrication,
  • L'ampli utilisé pour le caisson de basses est légèrement usé (buzz du transformateur audible) et la capacité de sortie limite la réponse dans les graves, il sera probablement changé ou amélioré,
  • Les enceintes devaient être peintes, mais ça n'a jamais été fait...

Références

icon Tags de l'article : ,

Eurobot 2016

icon 13/06/2016 - No comments

Cette année, l'équipe Galiléo a été sélectionnée pour participer à la coupe d'Europe de Robotique (Eurobot) qui s'est déroulée le weekend du 10 au 12 juin 2016 au Kremelin-Bicêtre (sud de Paris).

Le robot a été légèrement amélioré après la coupe de France de robotique (mai 2016) pour le fiabiliser.

Mécanique
Bloc de propulsion :
Déplacements à 1m/s, accélérations à >1.5m/s²
  • palliers en aluminium, flancs en PVC,
  • moteurs Maxon RE35 (90W), réducteurs Dunker PLG52 (~1:20),
  • poulies/courroies XL5 9.5mm,
  • roulements 608Z (rollerblade), tiges rectifiées en inox (8mm),
  • roues alu/joints toriques SES Lynxmotion
bloc moteurs

Odométrie :
Précision à 0.25% (1cm de décalage sur un carré de 1m de côté)
  • tige rectifiée en inox (8 ou 12mm),
  • roulements de têtes de lecture de disques durs,
  • supports de codeurs en aluminium usiné,
  • encodeurs en quadrature Nemicon OEZ-1024 (4096 PPR en quadrature),
base roulante

Base :
Assemblage de plaques de PVC/Polycarbonate de 10mm usinées à la main (scie sauteuse, meuleuse et perceuse à colonne, précision ~2mm) et plaques d'aluminium de 5mm découpées/fraisées (précision 0.15mm), profilés d'aluminium de 25mm, 4 caster-balls suspendus

Actionneurs :
  • Lame ramasse-cubes actionnée par deux servomoteurs (TowerPro MG995 à pignons métalliques, 1.1Nm),
  • Pousse-cubes actionné par un motoréducteur ~15W + endstops (ouverture en <1s),
  • Ramasse-poissons (aimants de disque-durs + plaques de mylar/polycarbonate) actionné par un servo sans butée (multitours) + endstop,
  • Parasol actionné par un servomoteur,
326

Évitement :
Détection d'une balise cylindrique (ø 80mm * 80mm) retro-réflechissante à une distance réglable entre 150 et 1200mm.
  • Tourelle à arbre creux actionnée par un moteur DC + réducteur à poulie (~100rpm)
  • Fourche optique (1 PPR),
  • Volant d'inertie en PVC,
  • Capteur IR industriel (Dinel BA 9xx) alimenté par des piles 9V (alim + contrepoids)
  • Transmission optique (LED, phototransistor à travers un arbre creux),
tourelle d'évitement


Électronique

Software :

Stratégie :
Comme depuis au moins 2011, le programme gérant la stratégie est une machine d'états avec une liste de positions à atteindre (position, angle, vitesse, état des actionneurs, timeout).
La différence cette année vient d'une visualisation codée avec processing, qui permet d'enregistrer les positions en déplaçant le robot sur la table.

Asservissement :
Pour la première fois, l'asservissement en PID et la génération de trajectoires ont été remplacés par une gestion en logique floue en angle et position qui s'est montrée très fiable.

Résultats :
Les robots ont été homologués après 4h de travail (réglages de l'évitement), mais beaucoup de travail a été nécessaire sur la stratégie, tout au long de la coupe.
  • Match 1 : 49 points, 25ème place, défaite contre reSET (Russie)
  • Match 2 : 81 points, 20ème place, victoire contre UXSC1 (Espagne)
  • Match 3 : 0 points, 28ème place, match nul contre Green Birds (Allemagne)
  • Match 4 : 37 points, 28ème place, défaite contre Team 007 (Roumanie)
  • Match 5 : 56 points, 29ème place, défaite contre A-Robot (Russie)

Participation de Galiléo à Eurobot 2016

Le 3ème match a montré une erreur sur la stratégie (un point a été défini légèrement en dehors du terrain), qui a fait déraper le robot, et déjanter une roue. Une fois le timeout dépassé, le robot s'est dirigé vers une autre position (à 1m/s), en déviant contre un obstacle du terrain (l'asservissement n'est pas capable de compenser lorsqu'une roue codeuse a dérapé). Il a été nécessaire d'actionner le bouton d'arrêt d'urgence pour protéger le robot et le terrain, d'où une annulation de tous nos points (le robot adverse n'avait pas démarré à cause d'un Schrödingbug).

Le côté du terrain où les robots jouent est déterminé aléatoirement, et est tombé du côté violet pour nos 5 matchs (homologuation côté vert), ce qui a ralenti notre action (l'actionneur utilisé pour les pêcher les poissons est du côté gauche du robot, ce qui oblige à rouler en marche arrière pour pêcher du côté violet).

Une chose est assez évidente, l'équipe Galiléo a un robot performant, mais qui a été prêt beaucoup trop tard. Il n'a pas été possible de faire assez de tests pour fiabiliser les actionneurs et la stratégie.

icon Tags de l'article : ,

Xilence Icebox

icon 02/06/2016 - No comments

Le feu forum Nokytech m'avait donné un boitier prévu pour absorber les vibrations des disques durs en ayant un refroidissement amélioré.

Montage original
Le montage est simple, on a deux plaques d'alu vissées sur les côtés d'un disque dur, et une autre plaque avec des ailettes posée sur le haut du disque dur. L'assemblage du disque et des plaques d'alu est monté dans une baie 5.25" par des shock mounts en caoutchouc.
Original Xilence Icebox

En pratique, le disque dur est isolé mécaniquement du boîtier. Du coup ça permet d'éviter que le boitier entre en résonnance lorsque le disque gratte. Par contre l'isolation est aussi thermique (le boîtier participe partiellement au refroidissement du disque), et donc les dissipateurs en aluminium sont indispensables.

Solution temporaire
Après plusieurs démontages et à peine 4 ans d'utilisation, les pièces en caoutchouc sont dégradées et tombent en poussière.
Xilence Icebox with broken mounts

Le montage rapide était pour poser le disque à la place d'une cage disque d'un serveur HP Proliant.
Il avait suffit de poser le disque et les dissipateurs sur un bloc de mousse, tenu par des ficelles pour éviter les mouvements.

Amélioration
Comme tous les PC n'ont pas forcément autant de place qu'un HP Proliant (27kg sans disque), il a fallu l'adapter à mon serveur (ancien Desktop IBM).
J'avais prévu de réutiliser des adaptateurs de disques 3.5" dans des baies 5.25" viennant de serveurs HP Proliant. Ils ne sont pas conçus pour limiter les vibrations, mais rentrent parfaitement dans le boitier de mon serveur.

Xilence Icebox mod (bottom)
On va commencer par couper la tôle qui maintient le disque au niveau d'un pliage à 90° (On peut casser l'acier par fatigue avec des pliures répétées).
On va ensuite arracher les heatpipes (assez inutiles avec la base du disque du en aluminium), puis utiliser leurs supports pour fixer les plaques latérales dans la base en tôle (On peut percer/tarauder 4 trous en M4).

Xilence Icebox mod (side)
Ensuite, c'est du LEGO, on visse les plaques latérales sur le disque, on visse les plaques latérales sur la tôle avec un sandwich de bouts de silicone (absorbeurs de chocs de lecteurs CD) et de ressorts (supports de têtes d'imprimante coupés à la bonne taille).

Xilence Icebox mod (top)
Il reste le dissipateur du dessus qui doit être limé sur 3mm pour permettre aux vis/ressorts de passer, et c'est utilisable.


Résultats
Objectivement, le disque passe de 44~45°C à 42°C (température de pièce à 23°C), sans aucun ventilateur. Il ne faut pas oublier que les vis et le dissipateir dépassent et empêchent d'installer un second disque dans la baie supérieure.

Subjectivement, mon disque Hitachi 7K3000 était déjà assez silencieux en activité, les bruits de grattement sont quasiment inaudibles. Par contre le bruit du moteur/roulement n'est pas absorbé (une plaque de mousse posée devant le serveur fait l'affaire).

Références
* Xilence HDD Icebox - Technic3d [DE]
* Xilence Icebox review - Techware Labs
(Sources images)

icon Tags de l'article : , ,

Nexx WT3020

icon 25/05/2016 - No comments

Mon routeur (WRT54G) et point d'accès wifi avait quelques problèmes de fiabilité (freezes, coupures de réseau...), j'ai essayé de voir si on pouvait trouver un remplaçant vallable.

Le Nexx WT3020 est une Chinoiserie avec deux interfaces ethernet, une interface wifi, un port usb host et un SoC compatible avec OpenWRT.

Software
Le firmware d'origine à l'air utilisable avec un noyau Linux contrôlable par telnet et une interface web en Anglais (ou en Chinois).
  • Adresse IP : 192.168.8.1
  • Login (http) : admin
  • Mot de passe (http) : admin
  • Login (telnet) : nexxadmin
  • Mot de passe (telnet) : y1n2inc.com0755

On peut changer le firmware directement depuis l'interface web ou bien par telnet.

OpenWRT
Il faut d'abord connaître la quantité de mémoire flash embarquée. Comme la puce est difficile à lire, il semble que les modèles dont l'adresse MAC commence par 20:28:18 ont 8Mio de flash.
On peut ensuite télécharger l'image d'OpenWRT adaptée au routeur et utiliser l'interface web d'origine pour flasher le firmware.

Au reboot, l'adresse IP change et devient 192.168.1.1, et une fois un mot de passe choisi, on peut utiliser ssh.

Hardware
En ouvrant le boitier (quasiment impossible sans casser de clip), on voir un SoC Mediatek MT7620N, une mémoire flash SPI (8Mio), deux transformateurs d'impulsion (ethernet), de la SDRAM (64Mio), et quelques régulateurs de tension.
Nexx WT3020 board top (OpenWRT Wiki)
Nexx WT3020 board bottom (OpenWRT Wiki)

On voit directement que la capacité d'entrée est trop faible (400 à 900mV de ripple mesurés, en fonction de la charge). Par contre le ripple est faible après le régulateur LDO qui alimente le SoC.
J'ai préféré rajouter une capacité chimique de 220µF (16V, ESR <1Ω), ce qui limite le ripple à <20mV.
Nexx WT3020 added capacitor

Les pads qui sont accessibles entre les deux ports ethernet et le SoC servent pour une liaison série, utile pour avoir un accès direct à u-boot en cas de problème.
Par contre il n'y a pas de JTAG, du coup en cas de brickage, il faudra dessouder la mémoire flash (SPI) pour la re-flasher.

Performances
J'ai essayé de mesurer la vitesse de transfert en copiant des fichiers par NFS et en utilisant le benchmark réseau iperf :
  • Routeur -> PC : 24.9Mbit/s
  • PC -> Routeur : 22.6Mbit/s

En vérifiant, le routeur fonctionne en mode 802.11g, et est théoriquement limité à 54Mbit/s (~30 en pratique). Il y a peut-être une configuration spécifique pour OpenWRT (le hardware est censé supporter la norme 802.11n à 300Mbit/s et le MIMO).

802.11n (update 06.2016)
Avec un peu de recherches, on voit que le mode 802.11n, qui suppose une bande passante de 300Mbit/s ne peut être actif que si le mode WMM (Wi-Fi Multimedia) est activé et si les données sont encryptées en WPA (j'utilisais le mode WEP depuis mon premier routeur).
Avec quelques tests :
  • Routeur -> PC : 70.8Mbit/s
  • PC -> Routeur : 21.6Mbit/s
On a aucune différence en upload, mais le débit en download devient intéressant.

Références

icon Tags de l'article : , , , ,

Préampli : Affichage et contrôle (bas-niveau)

icon 14/05/2016 - No comments

J'avais récupéré un KVM qui avait quelques défauts (image bruitée sur certains canaux, clavier non-fonctionnel avec certains PC) et ne m'était pas utile. De ce fait, je n'ai gardé que le boîtier en acier et la face avant pour l'utiliser dans un projet de préampli.

reverse engineered KVM switch

Face avant
Il y a un PCB avec 2 latches 74HC273 et un latch 74HC374, 9 boutons poussoirs, 16 LEDs et un buzzer. Chaque groupe de boutons et de LEDs est relié à un latch, relié à un bus 8 bits.
Le second bus sert au contrôle des latches, du buzzer et du switch de droite.

Pinouts
Control_bus :
  • BUZ: 0
  • SWI: 1 (input)
  •  !CLR: 2 (active low)
  • CLKG: 3 (green)
  • CLKR: 4 (red)
  •  !OE: 5 (active low)
  • CLKS: 6 (switches)
  • NC: 7
  • Vdd: 8 (+5V)
  • Vdd: 9 (+5V)
  • Vdd: 10 (+5V)

Data_bus :
  • DATA: [0..7] (TTL in/out)
  • Vss: 8 (GND)
  • Vss: 9 (GND)
  • Vss: 10 (GND)

Interface bas-niveau
Pour commencer, j'ai utilisé un Arduino Mega en reliant le bus de données sur le port F ([A0..A7]), et le bus de contrôle au port K ([A8..A15]).

La fonction ledOut() permet d'allumer les LEDs vertes et rouges en fonction des variables ledG et ledR (uint8_t).
void ledOut(void) {
  //set bus out
  DDRF = 0xFF;
  // clear latches
  PORTK &= ~_CLR;
  ndelay();
  PORTK |= _CLR;
  // reset bus
  PORTF = 0x00;
  //write bit
  PORTF |= ledG;
  ndelay();
  //write CLK up
  PORTK |= CLKG; //1st row
  ndelay();
  //write CLK down
  PORTK &= ~CLKG;
  //reset bus
  PORTF &= ~ledG;

  //write bus
  PORTF |= ledR;
  ndelay();
  //write CLK up
  PORTK |= CLKR; //2nd row
  ndelay();
  //write CLK down
  PORTK &= ~CLKR;
  //reset bus
  PORTF &= ~ledR;
}
La fonction swIn() écrit l'état des interrupteurs dans les variables swstatus et oldswstatus.
void swIn(void) {
  // save old value
  oldswstatus = swstatus;
  //set bus in
  DDRF = 0x00;
  //write CLK (up)
  PORTK |= CLKS;
  ndelay();
  PORTK &= ~CLKS;
  ndelay();
  //write !OE
  PORTK &= ~_OE;
  ndelay();
  ndelay();
  ndelay();
  //read bus
  swstatus = ~PINF;
  //write OE
  PORTK |= _OE;
  //set bus out
  //DDRF = 0xFF;
  //Serial.print(swstatus);
}
Ici, la macro ndelay() est équivalente à un NOP, soit 1 cycle à 16MHz (62.5ns). Le latch 74HC374 est donné pour supporter un temps de transition de 45ns, en pratique, la transition entre !OE et les sorties donne quelques glitches lorsqu'on attend que 125ns, et le fonctionnement est correct avec une pause de 187.5ns (3 NOPs à la suite).

Références

icon Tags de l'article : , , ,

Oregon Scientific RM822

icon 29/04/2016 - No comments

J'utilise un réveil Oregon Scientific RM-822 depuis plus de 10 ans. Le mécanisme de la base est assez fragile, et une fois cassé, le rétro-éclairage n'est plus activable, et l'horloge n'est plus synchronisée par radio.

Réparation DCF77
Le démontage est délicat, les fils du buzzer sont trop courts et cassent facilement :
Snapped wires
On identifie rapidement les fils et leur emplacement sur le PCB :
  • L'antenne, à gauche de l'interrupteur S7
  • Le buzzer, en haut à gauche du PCB, noté BZ

replaced wires

Le montage mécanique est astucieux, il faut arriver à faire passer les fils dans la charnière à gauche du réveil (face).
fixing antenna
Un peu de colle permet de tenir le noyau et les deux parties du boitier.

En testant, le symbole de l'antenne (0, 2 ou 3 arcs) clignote et indique que le réveil reçoit bien des données.
test
Après une dizaine de minutes, le réveil est bien à l'heure.

Réparation Buzzer
En réparant l'antenne DCF77, j'ai abimé la cellule piezo du buzzer (probablement en tirant sur les câbles en démontant le boitier). Comme la cellule ne fonctionne quasiment plus (bruit très faible et résistance parallèle de quelques Ohms), je l'ai remplacé par une cellule "heavy duty", nettement plus bruyante.
Piezo fix

Références

icon Tags de l'article : ,

Flux RSS/Atom : Traitement, mise-en-page

icon 13/04/2016 - No comments

J'utilise beaucoup de flux RSS, et j'aime bien que tout le contenu soit disponible, par exemple un article complet sans commentaires dans le cas d'un blog.

Le principe est de pouvoir l'utiliser offline, par exemple en chargeant la page. Ça permet aussi d'éviter quelques clics (dont les pubs et une mise en page non neutre) et d'avoir tout le contenu directement dans le lecteur RSS.

Bons Exemples
  • Hackaday
  • Linuxfr
  • Blogotext

Mauvais Exemples
  • EDN
  • Feedburner
  • La majorité des blogs Wordpress

EDN
Comme on peut remarquer, le flux : http://www.edn.com/rss/design/analog ne contient que des liens vers les pages des articles et une description un peu vide.

Une première étape est de changer le lien vers la version imprimable de l'article. Les deux URL ont l'identifiant de l'article en commun :
http://edn.com/design/analog/$ID_ARTICLE/TITRE_ARTICLE
http://www.edn.com/Home/PrintView?contentItemId=ID_ARTICLE

Une ligne de bash suffit à faire le travail de base :
wget -qO- http://www.edn.com/rss/design/analog |sed -e 's#<link><!\[CDATA\[http://edn.com/design/analog/#<link><!\[CDATA\[http://www.edn.com/Home/PrintView?contentItemId=#' |sed -e 's#/[^/]*\]\]></link>#\]\]></link>#'
L'étape suivant est d'utiliser ce lien pour remplir le flux.

Comme mon niveau en PHP tient plus du bricolage qu'autre chose, il est sûrement possible de faire beaucoup mieux et plus efficace.

On va utiliser un algo simple :
function do_process(temp_file) {
    articles[0][] = get_article_ids(temp_file);
    articles[1][] = get_article_titles(temp_file);
    articles[2][] = get_articles_dates(temp_file);
    
    rss = fopen("new_rss", 'w');
    fputs(rss, header);
    iter = 0;
    foreach(articles[0] as id) {
        article = download(article_url + "id");
        fputs(rss, article);
        fputs(rss, articles[1][iter]);
        fputs(rss, articles[2][iter]);
        iter++;
    }
    fputs(rss, footer);
    fclose(rss);
}

oldsum = md5sum(temp_file);
if((date() - date(temp_file)) > timestep {
    download(url, temp_file);
    if(md5sum(temp_file) != oldsum) {
        do_process(temp_file);
    }
}

Le script commence par tester si le flux RSS a été mis à jour récemment et s'il a changé, pour économiser la bande passante et les ressources du site distant comme ceux de la machine executant le script.
Ensuite, le flux RSS est analysé, les identifiants, date et titre de chaque article sont stockés dans un tableau qui est utilisé pour construire le flux RSS final.
La librairie simple_html_dom permet de manipuler facilement les balises XML.

Bugs
La date est incorrecte dans certains articles du flux RSS d'EDN (Nov 01 2016 pour un article écrit le 11 Jan 2016), mais la majorité fonctionne.

Références

icon Tags de l'article : , ,

Préampli : Alimentation

icon 06/04/2016 - No comments

Design
Pour ce préampli, j'ai besoin d'une alimentation avec deux rails symétriques pour alimenter la partie analogique (AOPs, DACs, ADCs, potentiomètres numériques), et d'un rail pour alimenter la partie numérique (Microcontrôleur, DACs, ADCs, potentiomètres numériques).

Dans mon cas, tous les composants numériques que j'utilise fonctionnent avec des signaux TTL, et certains de mes composants analogiques n'acceptent qu'entre ±3V et ±7V.

Dans tous les cas, ils est préférable de limiter le bruit conduit et émis par l'alimentation, et comme il s'agit de faibles puissances, on peut se contenter de régulateurs linéaires.

On a ainsi trois rails :
  • Rail Logique : +5V
  • Rail Analogique : +5V
  • Rail Analogique : -5V

Les trois rails sont régulés par des régulateurs 7805 et 7905, réputés pour leur fiabilité, et relativement peu bruyants lorsqu'ils sont bien filtrés/découplés.

Le transformateur est récupéré et fournit 2×15V 1.5VA (21V une fois redressé, 27V en pratique), ce qui est bien trop élevé... En pratique, le courant maximum consommé sur chaque rail est de l'ordre de 100mA, ce qui donne environ 2W dissipés par régulateur, qui nécessiteront un radiateur.

Schéma
Le schéma est simple, chaque régulateur a des capacités de découplage (chimiques pour les basses fréquences et céramiques pour le reste).
power supply schematics

Les diodes de "backfeed" de chaque régulateur sont rarement placées, mais cela semble intéressant dans le cas de grosses capacités de sortie ou de plusieurs sources d'alimentation (+5V fourni par le debugger du microcontrôleur).

Le routage à cette forme-là :
PCB routing

Fabrication
Le PCB a été réalisé avec la méthode du transfert de toner, pour laquelle j'ai encore des progrès à faire (l'épaisseur de la couche de cuivre n'est pas uniforme).
toner transfer etched PCB

À cause d'une légère erreur remarquée tardivement, le typon a été imprimé à l'envers, j'ai dû adapter le pont de diodes côté cuivre, et monter les régulateurs de tension à l'envers. Par chance, il y a peu de composants ont plus de 3 pattes et ne sont pas symétriques.

Les capacités chimiques de sortie sont placées un peu trop près des régulateurs de tension, et risquent de s'user à long terme. Pour limiter les risques, un radiateur a été placé sur les régulateurs de tension (attention, la base du 7905 est à isoler de la masse).
whole power supply assembled

Tous les composants sont de de récupération, mais les composants passifs ont été testés et mesurés, surtout pour l'ESR des capacités chimiques. Les capacités céramiques sont des AVX X7R 50V, plutôt "bulletproof" pour leur utilisation.

Références

icon Tags de l'article : , ,

Préampli : Projet

icon 06/04/2016 - No comments

Depuis plusieurs années, je voulais construire un préampli sur-mesure, qui convient à mes besoins.

Il est courant que j'utilise un PC ou un lecteur CD pour écouter de la musique, mais que je veux toujours avoir le son provenant d'un autre PC (notifications, bruitages de jeux), d'où l'intérêt du mixage entre plusieurs canaux, qu'aucun système grand-public ne propose.

Cahier des charges
Le but est d'avoir un système "tout en un", avec plusieurs sous-systèmes :
  • Mixeur 4 entrées stéréo
  • Sortie casque/enregistrement stéréo
  • Mixeur stéréo -> 2.1
  • Filtres ajustable
  • Contrôle par boutons poussoirs ou par roue codeuse (pas de potentiomètres)

Par contre il y a quelques contraintes à ajouter pour un système "fait maison" :
  • PCB simple face (ou avec peu de pistes sur la face top)
  • Boitiers de composants >0805 et >SOIC
  • Composants disponibles et abordables
  • Peu de câbles entre les modules
  • Boitier 455×350×44.5mm³ (rack 19")

Modules
Le préampli va être fait avec plusieurs cartes :
  • Alimentation
  • Préampli stéréo
  • Contrôle de volume stéréo
  • Préampli mono
  • Mixer 2.1
  • Filtre Sallen-Key mono
  • Contrôle I²C (micro-contrôleur)
  • Interface utilisateur, boutons/LEDs
Les cartes notées en bleu ont déjà été fabriquées et testées, celles en vertes sont en cours de montage, celles en orange ont été conçues et sont en attente de montage, et celles en rouge sont remplacées temporairement par un kit de développement de micro-contrôleur.

Fabrication
Certains modules (préampli stéréo, préampli mono, filtre, contrôle de volume) sont utilisés en plusieurs exemplaires, et donc il devient pertinent de faire graver un circuit imprimé de qualité professionelle.

Update : 05.2016
bare PCBs
cut PCBs

icon Tags de l'article : , , ,