Mercredi, mai 22 2013

BleuettePi : Une carte fille pour RaspberryPi

Introduction

Comme je l'annonçais dans un précédent article, Bleuette va pouvoir être piloté par un Raspberry Pi grâce à une carte fille dédiée dont je vais décrire les caractéristiques ici même.

Le choix du Raspberry Pi s'est porté grâce à 2 de ses atouts : le coût et la puissance, en effet, pour moins de 40€, on dispose d'un système embarqué sous Gnu/Linux avec 512Mio de RAM, un processeur pouvant monté à 1Ghz, à côté des 2.5Kio de RAM et des 16Mhz de l'Arduino Leonardo, ça fait une sacré différence et ça laisse entrevoir plein de nouvelles possibilités...

Notez que ça ne signifie pas l'abandon du développement de Bleuette sur Arduino, il s'agit juste de donner le choix du système.

Caractéristiques

Les avantages d'utiliser un tel ordinateur embarqué sont nombreux, comme par exemple, la facilité pour embarquer / supporter des périphériques comme une clef WiFi pour programmer Bleuette à distance ou encore brancher une webcam (notamment le module caméra officiel), etc... Mais il n'y a pas que des avantages, on se retrouve aussi avec quelques soucis comme par exemple l'alimentation, le Raspberry Pi consomme plus qu'une petite carte Arduino et ses entrées / sorties ne sont absolument pas compatible avec le 5V utilisé sur la précédente carte fille, il faudra donc faire avec...

BleuettePi est conçue à la base pour faire fonctionner Bleuette mais j'ai fait en sorte que cette carte soit suffisamment généraliste pour être utilisée dans d'autre application.

Voici les caractérisitiques de cette carte :

  • Gestion de 14 servos (toujours de manière synchrone)
  • Mesure du courant consommé par les servos
  • Mesure de la tension de la batterie
  • Connexion pour une carte GY-27 contenant un accéléromètre et un compas (via I2C)
  • 16 entrées / sorties compatible 5V avec 2 lignes d'interruption, le tout commandé en I2C
  • 6 entrées analogiques
  • Amplificateur audio pour ajouter le son à votre Raspberry Pi (à base de LM386)
  • 5 entrées / sorties généralistes compatible 5V direct Raspberry + 5 autres entrées / sorties disponible si le bus SPI n'est pas utilisé
  • Toutes les broches du SPI (MOSI, MISO, SCLK, CE0, CE1) sont disponibles sur un connecteur et compatible 5V
  • Un module horloge temps réel (RTC) pour garder votre Raspberry Pi à l'heure !
  • 4 lignes d'interruptions physiques (INTA et INTB pour les IO, INTC en provenance de l'horloge temps réel, INTD)

Schéma de principe

Voici le schéma de principe complet :
Schéma de principe de la carte d'extension de Bleuette

Détails

Les détails bloc par bloc du schéma de principe :

Liaison au RaspberryPi

La liaison au RaspberryPi se fait via P1 :

BleuettePi : Liaison RaspberryPi

L'alimentation

Pour fonctionner, le RaspberryPi à besoin d'une tension d'alimentation de 5V avec une intensité d'environ 1A.

La carte fille reçoit 2 tensions en entrée :

  • Le 5V pour le Raspberry et pour la carte fille
  • Une tension pour alimenter les servos (de 5V à 6V selon les servos).

Une autre entrée (BATT et BATT1) optionnelle permet de recevoir la tension brute de la batterie à des fins de mesure via le pont diviseur R1 / R2.

Note: Si la tension d'alimentation des servos est directement celle de la batterie, le jumper (J_BATT0 ou J_BATT1) permette d'injecter la tension directement sur R1 / R2.

BleuettePi : Alimentation

Gestion des servos

BleuettePi : Pilotage des servos

Pour le pilotage des servos, un PIC18F4520 programmé avec une version dérivée du projet Pic24Servos est utilisé de la même façon qu'avec la Bleuette Shield Arduino.

Mais comme mentionné plus haut, les entrées / sorties du Raspberry Pi fonctionnent uniquement avec une tension de 3.3V, le PIC18F4520 aussi mais rien ne permet d'affirmer que les servos vont « voir » les impulsions de 3.3V comme des niveaux hauts, donc, j'ai choisi d'alimenter le PIC en 5V et d'adapter la liaison série avec le Raspberry Pi.

Pour la transmission de donnée du RaspberryPi vers le Pic, le signal passe par l'adaptateur de niveau 3V / 5V, pour la communication inverse, du Pic vers le RaspberryPi, un simple diviseur de tension (R9 / R10) ramène la tension à 3.3V max.

Le découplage de la ligne d'alimentation des servos est effectué par plusieurs condensateurs de bonne capacité (C1 et C9).

Les entrées / sorties

L'adaptateur de niveau 3V / 5V bidirectionnel pour les entrées sorties généralistes est un TXB0108PWR :

BleuettePi : Adaptateur de niveau

Une partie des entrées / sorties sont disponibles via les connecteurs OPTION0 et OPTION1 :

BleuettePi : Input / Output

Horloge temps réel (RTC)

Une horloge temps réel est disponible via le bus I2C afin de garder le RaspberryPi à l'heure, même sans alimentation grâce à la pile bouton de sauvegarde (CR1220).

BleuettePi : RTC, Horloge Temps Réel

C'est le DS1337 qui joue le rôle d'horloge, ce dernier est équipé d'une sortie (SQW/OUT) cablée sur INTC (INTterruption Clock) permettant au choix d'obtenir un signal carré à une fréquence précise ou d'utiliser cette broche comme réveil, cette dernière est disponible sur le connecteur OPTION0, ainsi, on peut imaginer un dispositif qui sortirait le RaspberryPi d'un sommeil très profond puisque dans cet état, il ne consommerait absolument rien...

Le son

Le Raspberry Pi disposant d'une sortie son, il est intéressant d'en profiter via l'utilisation d'un amplificateur et d'un haut parleur externe.

BleuettePi : Son

Rien de particulier à dire, à part un potentiomètre permettant d'atténuer le niveau d'entrée.

Mesure du courant et tension LiPo

Un pont diviseur de tension pour la mesure de la tension de la batterie et l'utilisation d'un MAX4173 pour la mesure du courant.

BleuettePi : Mesure du courant

Sur la version à base d'Arduino, c'est ce dernier qui s'occupait de la conversion analogique, or, le Raspberry Pi ne contient pas de convertisseur analogique / numérique (CAN), du coup, il aurait fallu embarquer un circuit intégré spécialisé pour cette fonction mais il n'y a plus de place sur la carte et il y a une meilleure solution, en effet, le PIC18F452 utilisé pour la gestion des servos possède un CAN et justement, ces broches sont libres...

La mesure du courant (SERVO_CURRENT) se fait via l'entrée AN5 et la tension (LIPO_VOLTAGE) via l'entrée AN4.

Carte accéléromètre et magnétomètre

Vu le format de ce type de composant (très difficile à souder avec du matériel amateur), j'ai opté pour un module GY-27 intégrant les 2 composants, le magnétomètre (HMC5883L) et l'accéléromètre (ADXL345) dialoguant tous les 2 en I2C, ils sont donc branchés sur la liaison I2C hardware du Raspberry Pi.

La carte sera donc directement branchée sur la carte fille BleuettePi permettant en plus un gain de place non négligeable.

BleuettePi : Capteur GY-27

Pour ceux ne voulant pas utiliser cette carte, il est tout à fait possible de l'utiliser pour autre chose, ça reste de l'I2C...

Liaison SPI

Un autre convertisseur de niveau 3V / 5V (TXB0108PWR) est présent pour assurer la conversion de niveau de tension du bus SPI :

BleuettePi : Liaison SPI

Guirlande de led RGB

Pour le pilotage de la guirlande de led RGB à base de LPD8806 depuis le Raspberry Pi, la librairie Boblight sera utilisée.

Au niveau électronique, rien de particulier, le pilotage se fait via le bus SPI hardware du Raspberry (ligne MOSI et SCLK).

Informations supplémentaires

Un premier batch de 5 PCB est en cours de fabrication chez Seeedstudio à l'heure ou j'écris ces lignes.

Les fichiers sources sont disponibles au format Eagle sur GitHub :

La pages dédiées sur le wiki : BleuettePi sur GitHub.

Dimanche, avril 7 2013

Nouveau VTT – Montage perso à base d’un cadre MBK R-Force XC1 Carbone

Mon nouveau vélo, acheté en pièces détachées d'occasion ou neuves pour certaine.

J'ai pas mal galéré sur certaine partie du montage, notamment sur la fourche et le réglage de la transmission, mais je suis finalement très content du résultat !

Il fait environ 11.6Kg, pour à peu près 1600€ sans les outils.

 

Cadre : MBK Carbon tout suspendu taille M

Armotisseur : Fox float RP 23 (100mm)

Fourche  : RockShox Reba RL (100mm)

Roues : Crossmax ST 2009

Pneus : Maxxis (Tubeless)

Transmission et pédalier : Deore XT

 

Il reste à régler la fourche et l’amortisseur en fonction de mon poids (à l'aide d'une pompe haute pression que je n'ai pas)

DSC_7538 DSC_7539 DSC_7540 DSC_7541 DSC_7542 DSC_7543 DSC_7544 DSC_7545

Lundi, mars 25 2013

Des nouvelles de Bleuette

Point presse

Tout d'abord, un point people, l'information du développement de Bleuette à plutôt bien circulée et Bleuette s'est retrouvée sur plusieurs sites importants :

La vidéo sur Vimeo à été vue plus de 6000 fois.

Plutôt plaisant de voir que ça intéresse du monde mais j'attends avec grande impatience le moment ou un autre Bleuette pointera le bout de son nez en PLA... ;)

Évolutions

Nouvelle carte fille

La shield Bleuette permet le pilotage des servos et le contrôle de la tension / courant consommé par les servos, pour pouvoir ajouter des capteurs multiples, il est tout à fait possible d'utiliser les broches libres des ports de l'Arduino mais il n'y en a pas assez pour tous les capteurs voulus sur Bleuette, du coup, le besoin d'une nouvelle carte d'extension s'est fait sentir et voici ce qu'elle permet :

  • 8 entrées supplémentaires multiplexées utilisant que 4 entrées / sorties (3 d'adressage et une sortie)
  • Connection pour une carte GY-27 contenant un accéléromètre et un compas
  • Un module Bluetooth JY-MCU
  • Une connection pour une guirlande de led RGB à base de LPD8806
  • Un mosfet pour pouvoir piloter un élément de puissance (je ne sais pas vraiment quoi pour le moment...)

Voici le schéma de principe et le PCB associé (cliquez dessus pour agrandir) :
Schéma de principe de la carte d'extension de Bleuette PCB de la carte d'extension de Bleuette

Le schéma de principe au format est Eagle se trouve par ici : sensor.sch et le PCB : sensor.brd

Comme vous pouvez le voir, le PCB n'est pas dense du tout, du coup, il est simple à réaliser avec des moyens modestes.

Mécanique

Pas de grande nouveauté pour la partie mécanique sauf pour les pieds, ces derniers ont été imprimés en PLA Flex permettant d'avoir un peu de souplesse et trempé dans du PlastiDip afin d'avoir un meilleur grip en plus d'un super rendu !

Avant trempage dans le PlastiDip et après :
Les pieds de Bleuette

Tous les éléments d'un pied de Bleuette, on aperçoit l'interrupteur poussoir, le piston et le cylindre et le pied recouvert de PlastiDip :
L'ensemble des pièces constituant un pied de Bleuette

Le tout assemblé :
Vue d'un pied

Le fichier source au format OpenSCAD des pieds de Bleuette est disponible, comme tout le reste de Bleuette sur GitHub / Bleuette.

Le cerveau

J'ai subi beaucoup de soucis avec la carte Arduino, notamment des problèmes de programmation, m'obligeant à recommencer la phase 3-4 fois de suite des fois...
Tous ces ennuis m'ont conduit à radicalement changer ma manière de développer avec Arduino, notamment en utilisant Ino, un outils en ligne de commande pour compiler, programmer, etc, bref, un remplaçant du mal aimé environnement par défaut d'Arduino.

Les problèmes de liaison avec la carte Leonardo m'ont également conduit à une solution radicale, j'ai embarqué un Raspberry Pi dans Bleuette auquel est relié la carte Leonardo, ainsi, c'est le Raspberry Pi qui programme la carte Arduino, ça complique un peu mais au moins, je suis moins gêné...

À force d'utiliser ce système, ce qui devait arriver arriva et j'ai donc décidé de créer une carte fille pour le Raspberry Pi qui permettra de piloter Bleuette directement avec cette dernière.
Bien entendu, je ne laisse pas tomber pour autant le dèveloppement sur Arduino, disons que celui ci sera la version simplifiée.

Bleuette embarquant un Raspberry Pi :
Bleuette embarquant un Raspberry Pi

D'ici peu, je publierai un article expliquant toutes les caractéristiques de la carte d'extension pour Raspberry Pi.

Dimanche, mars 10 2013

[DIY] Dév-board pour CPU Propeller de Parallax

Bonjour tout le monde !

Il y a de cela quelques temps j’ai acheté pour quelque chose comme 8€ un micro-contrôleur "Propeller" de Parallax : le P8X32A.

P1060235

Le P8X32A est un micro-contrôleur 32 bits multi-cœurs (8 cœurs au total !) pouvant tourner à un maximum de 80MHz.
Comme il est vendu en version CMS et DIP (utilisable sur une breadboard comme sur la photo) je me suis permis une petite folie et j’en ai pris un au détour d’une commande de composants.

Les informations détaillées sur le micro-contrôleur sont disponible ici :
http://www.parallax.com/tabid/768/ProductID/334/Default.aspx

Les cartes de démo et autre "starter kit" pour le P8X32A coutent entre 25€ et 75€ … c’est bien cher pour un morceau de pcb, un P8X32A et une EEPROM I2C !
J’ai donc décidé de faire ma propre "mini dév board" DIY histoire de tester un peu les possibilités du CPU propeller.

Le schéma :

propollerDIY_schematic

J’ai bêtement suivi la documentation du fabricant.

Le schéma se résume à 5 grandes parties :
- une alimentation 3v3 régulée
- un bouton de reset
- un quartz
- une EEPROM I2C
- un P8X32A et des connecteurs

Remarque : la broche 3v3 du connecteur J2 est volontairement laissé non-câblé.
Je me suis rendu compte après coup que cela poserait des problèmes d’avoir une broche d’alim juste à coté d’une sortie …

Voici le typon avec les différentes pistes :

propollerDIY_typon

Remarque : j’étais parti pour monter un régulateur 3v3 avec le même brochage qu’un LM7805, pas de bol le régulateur que j’avais n’avait pas tout à fait le même brochage.
Du coup j’ai dû faire un peu de bricolage pour inverser deux broches de celui ci.

Le résultat final :

P1060227

Sur la droite la partie alimentation, sur la gauche la partie mémoire + port série, au centre le P8X32A en boitier DIP.

P1060233

J’ai caché en dessous du micro-contrôleur les résistances de tirage du bus I2C de l’EEPROM et le quartz.

A noter que le quartz est remplaçable !
J’ai préféré faire cela car je n’ai pas de quartz de 5MHz (valeur "idéal" pour pouvoir tirer profit des 80MHz maximum du CPU) et je n’avais pas envie de souder / dessouder le quartz "temporaire" de 4MHz (qui ne me permet que d’aller à un maximum de 64MHz).

P1060230

Comme vous pouvez le voir il y a un joli fil vert pour réparer mon erreur de brochage du régulateur et plein de coups de cutter entre les pistes pour éviter les court-circuits.
Je n’ai pas eu de chance sur ce pcb, j’ai eu plein de petit morceaux de cuivre qui sont restés entre les pistes …

Le logiciel :

Parallax fourni un éditeur graphique pour son langage de programmation nommé "spin".
On peut coder avec deux langages sur le micro-contrôleur : en "spin" (une sorte de mix entre BASIC et indentation "à la Python") et en assembleur.
Note: depuis peu il existe aussi un portage de GCC pour le P8X32A mais je n’ai pas essayé pour le moment.

Pour la syntaxe du langage "Spin" (qui est un langage semi-compilé) wikipedia donne les grandes lignes :
http://en.wikipedia.org/wiki/Spin_(programming_language)#Built_in_SPIN_byte_code_interpreter

spintool

Avec un peu de mal (ce n’est pas très intuitif comme syntaxe) et beaucoup de recherche sur le net j’ai pu faire un exemple "blink" fonctionnel :

CON
  ledpin = 0

PUB main
dira[ledpin] := 1
repeat
  outa[ledpin] := 1
  waitcnt(clkfreq + cnt)
  outa[ledpin] := 0
  waitcnt(clkfreq + cnt)

(ne me demandez pas d’expliquer comment marche la fonction d’attente j’ai moi même pas vraiment compris …)

Le truc vachement sympa avec le micro-contrôleur Propeller c’est qu’il exécute tout depuis la RAM et uniquement depuis la RAM.
Du coup on peut envoyer son code "pour test" dans la RAM et s’il marche on peut ensuite l’écrire en dure dans l’EEPROM.

load

Mais cela a un gros, très gros désavantage !
Lors du boot le CPU lit l’EEPROM (s’il y en a une) et copie son contenu en RAM.
Du coup TOUT les programmes quels qu’ils soit ont une limite de taille : 32 Ko, la taille de la RAM dédiée à l’exécution du programme.

C’est pour moi un peu bête d’avoir un cpu surpuissant capable de mettre à genoux n’importe quel ARM mono-cœur et d’avoir une limite aussi contraignante …

Pire on se retrouve à devoir faire un choix dés plus surprenant !
Le code spin compilé est bien plus compact que le code assembleur compilé, se pose donc le dilemme suivant :
- coder en spin en sachant que c’est une langage semi-compilé (donc lent) mais en sachant qu’on disposera de plus de place pour le programme
- coder en pure assembleur qui tourne à la vitesse du CPU mais qui prend plus de place …

A tester absolument :

Si j’ai pris un P8X32A (j’aurai pu prendre autre chose, voire même rien du tout) c’est parce que j’avais une idée derrière la tête ;)

Je vous présente le projet "SIDcog", un émulateur (quasi) complet de chipset SID comme celui du Commodore 64 !
http://forums.parallax.com/showthread.php/118285-SIDcog-The-sound-of-the-Commodore-64-!-(Now-in-the-OBEX)

P1060238

Pour le moment je n’ai testé que la démo "minimaliste" mais dés que j’aurai un lecteur de carte SD je testerai le lecteur de chiptune complet :)

Bon WE et bon bidouillage à tous !

EDIT: commentaires désactivés pour cause de spam massif sur cet article, désolé.


Classé dans:Autre, Corrigé, programmation, projet Tagged: diy, madeinfr

Jeudi, février 28 2013

[DIY + arduino] Alimentation d’atelier DIY – partie 2

Bonjour tout le monde !

Aujourd’hui j’ai le plaisir de publier la seconde partie de mon projet d’alimentation d’atelier DIY.
Pour ceux qui n’auraient pas suivi la première partie est disponible ici :
http://skyduino.wordpress.com/2012/09/04/bricolage-partie-1-alimentation-datelier-diy-a-partir/

Certains points ont évolué depuis la rédaction de cette première partie, en particulier concernant le schéma du montage que j’ai du entièrement revoir.
Trêve de bavardages, voici venu l’heure du DIY :)

Le matériel :

P1060038

Pour la réalisation de la carte mère j’ai utilisé :
1x carte arduino pro mini
1x écran LCD compatible HD44780
3x capteurs de courant ACS712
2x protoboards 3x7cm
3x prises banane (rouge)
3x prises banane (noir)
3x leds rouge 5mm
2x leds verte 5mm
1x buzzer
1x résistance de 100 ohms
3x résistance de 10K
5x résistances de 330 ohms
1x condensateur de 100µF
1x potentiomètre de 47K
1x capteur LM35 (optionnel)
+ des connecteurs tulipes mâles et femelles
+ des fils de câblages

Remarque : sur la photo vous pouvez voir un écran "POWERTIP PC1602-H", j’ai du changer d’écran après coup suite à un problème technique (j’en parlerai plus tard).

Le câblage :

Le montage est constitué de plusieurs parties qui une fois assemblées forment le montage final.

Les capteurs de tension :

diy_alim_voltage

Une des fonctionnalités de base d’une alimentation c’est de fournir un retour sur la tension réel en sortie.

Pour ceux faire j’ai utilisé 3 ponts diviseurs de tension, abaissant les 3 tensions de sortie de l’alimentation à un maximum de 5V pouvant être mesuré par la suite par l’arduino.
Les sorties +3v3 et +5v de l’alimentation sont mesurées au travers d’un pont diviseurs 1/2 pouvant donc accepter 10v maximum en entrée (j’ai vu large "au cas où").
La sortie +12v est mesuré au travers d’un pont diviseur 1/4 pouvant donc accepter 20v en entrée.

Les capteurs de courant :

diy_alim_current

Une autre fonctionnalité bien pratique pour une alimentation c’est de fournir une mesure du courant consommé sur chaque sortie.
Dans mon cas j’ai utilisé trois capteurs de courant intégrés du fabricant Alegro facilement disponible en breakout sur ebay ou dealExtreme : le ACS712.
Comme je ne sait pas encore très bien dans quelle fourchette de courant je vais me situer j’ai choisi de taper haut, j’ai donc pris une version x30A avec un maximum mesurable de 30A.
(autant dire qu’avec 30A j’ai de la marge)

Datasheet du ACS712-30A : http://www.allegromicro.com/~/Media/Files/Datasheets/ACS712-Datasheet.ashx

Les signaux de contrôle de l’alimentation :

diy_alim_signals

Pour pouvoir fonctionner correctement mon système à besoin de deux signaux reliés à l’alimentation d’ordinateur qui me sert de source de tension.

Un PSU d’ordinateur (= une alimentation à haut rendement) ce contrôle via deux signaux :
- PSU_ON (entrant, actif à l’état bas)
- POWER_OK (sortant, actif à l’état haut)
Ce sont tout les deux des signaux TTL, si PSU_ON est mis à GND l’alimentation démarre, de même quand POWER_OK passe à 5v cela signifie que la tension de sortie est stabilisé.

Vous remarquerez que j’ai mis la led du signal PSU_ON à l’envers (actuellement elle s’allume quand l’alimentation est arrêté).
Une fois le montage fini et testé je ferai une petite modification afin qu’elle s’allume quand PSU_ON = 0v, mais pour le moment je garde la configuration du schéma.

L’écran LCD :

diy_alim_lcd

Pour l’affichage j’ai pris un écran LCD 16×2 compatible HD44780, du classique disponible dans n’importe quelle boutique d’électronique.

J’ai cependant fait les frais d’une petite erreur d’inattention lors de ma commande !
J’avais commandé à l’origine un écran de la marque POWERTIP de référence : "PC1602-H".
Grosse boulette !

Le suffixe "-H" dans la référence signifie qu’il s’agit d’un écran pour une utilisation assujetti à de fortes températures (plein soleil, fours, …).
En dessous de 60° l’écran est totalement vierge, au dessus, miracle il est parfaitement lisible …
Pour pouvoir l’utiliser dans des applications "classique" (à 20-25°) il faut envoyer une tension négative dans la broche VO (contraste).
Dans mon cas cela n’était absolument pas envisageable …
J’ai donc du changer d’écran, au final j’ai pris un écran lcd 16×2 qui traînait dans un tiroir.

Les leds de statut :

diy_alim_leds

Mon alimentation DIY a une petite fonctionnalité bonus : chaque sortie est géré indépendamment.
Ainsi j’ai prévu 3 leds rouges qui s’allumeront pour prévenir d’une surcharge imminente sur une sortie.
Cela me permettra de savoir quelle sortie pose problème si l’alimentation se coupe par sécurité.

Le bouton start / stop / restart :

diy_alim_button

Pour l’allumage / arrêt / redémarrage de l’alimentation j’ai prévu un unique bouton.
Ainsi pour démarrer l’alimentation il suffira de presser le bouton, de même pour l’éteindre.
Et dans le cas où l’alimentation se couperait par sécurité il suffirait de presser ce même bouton pour redémarrer l’alimentation.

Afin d’éviter tout problème côté arduino j’ai inclus un anti-rebond matériel au niveau du bouton.
L’anti-rebond se résume à un condensateur de 100µF en parallèle de l’interrupteur, soit un anti-rebond de ~100ms (T = RxC, R = 10000, C = 10E-6 soit T = 0.1).

Le buzzer :

diy_alim_buzzer

Une bonne alimentation (surtout DIY !) se doit d’avoir un buzzer :)
C’est pourquoi j’ai prévu dans mon montage un buzzer avec une résistance de limitation de courant de 100 ohms.

Ce buzzer aura pour but d’alerter d’une coupure de l’alimentation, d’une surcharge ou de la stabilisation des tensions de sortie.
Ce sera aussi une bonne occasion d’inclure un "easter eggs" dans le code arduino :)

Le capteur de température :

diy_alim_temp

Après avoir fini mon montage je me suis rendu compte qu’il me restait une entrée analogique de libre …
Cela aurait été dommage de la laisser tel quelle, c’est pourquoi j’ai ajouté un capteur de température analogique LM35 au montage.
Celui ci permettra de surveiller la température des capteurs de courant qui risque de chauffer avec de fortes charges sur les sorties.

Montage sans câbles :

Voici quelques photos prisent durant le montage avant la mise en place des différents câbles.

La "carte mère", vue côté buzzer :

P1060041

(le potentiomètre sur la gauche est celui de l’écran lcd)

La "carte mère", vue côté capteurs de courant :

P1060043

Les différents morceaux constituant la "carte mère" :

P1060044

La base de la "carte mère" :

P1060046

Le support déporté pour l’écran lcd et les leds :

P1060049

(il s’agit de la première version, avant que je découvre le problème de l’écran lcd)

Petite parenthèse concernant l’écran lcd :

P1060051

Comme je vous le disait l’écran d’origine posait problème de part son alimentation négative pour le contraste.
Dans la première version de mon montage l’écran venait s’enficher dans un connecteur dédié comme vous pouvez le voir sur la photo.

C’était propre, mais bon … tant pis.
Refaire une commande pour prendre le même écran en version standard m’aurait coûté trop chère (surtout en frais de port), j’ai donc sacrifié mon montage "propre" au profit d’un montage fonctionnel.

Montage fini avec les câbles :

P1060080

Ça fait tout de suite beaucoup moins propre je vous l’accorde.

P1060083

Vous remarquerez que les broches A6 et A7 (disponibles uniquement dans la version CMS de l’ATmega328p) sont derrière le bouton reset, de même que A4 / A5 sont situés juste à coté du régulateur.
J’ai du jouer du cutter pour couper une piste reliée sur A5, cette version chinoise de l’arduino pro mini intégrant des résistances de pull-up pour l’I2C qui venaient fausser mes mesures analogiques.

P1060085

P1060087

(la colle chaude c’est la vie !)

P1060089

Astuce : les capteurs de courants que j’ai utilisé avaient déjà des borniers de base.
J’ai donc juste mis un câble pour "piquer" la tension au niveau du capteur de courant et l’injecter dans les ponts diviseurs mesurant la tension des sorties.

P1060092

Voici un exemple très parlant de l’expression : "cacher la merde sous le tapis" :)

P1060094

Annexe, le capteur de température :

P1060126

Comme je l’ai déjà dit j’ai ajouté un capteur de température LM35 au circuit.
Celui ci sera monté à terme sur une petite lame de métal qui recouvrira les trois capteurs de courant (avec de la patte thermique pour faire la liaison).
Cela permettra de dissiper la chaleur émise par les capteurs tout en la mesurant.

Premier essai du hardware :

Histoire de tester sommairement mon montage j’ai réalisé un petit code de test :

#include <LiquidCrystal.h>

/* Pin mapping */
static const byte LED_PIN[3] = {
  11, 12, 13
};
static const byte VOLTAGE_SENSOR_PIN[3] = {
  A0, A1, A2
};
static const byte CURRENT_SENSOR_PIN[3] = {
  A3, A6, A7
};
static const byte BUTTON_PIN = 2;
static const byte POWER_OK_PIN = 3;
static const byte PSU_ON_PIN = 4;
static const byte BUZZER_PIN = A4;
static const byte TEMP_PIN = A5;

/* LCD mapping */
LiquidCrystal lcd(10, 9, 8, 7, 6, 5);

/* PSU state */
static byte PSU_state;

void setup() {

  /* Setup pins */
  for(byte i = 0; i < 3; ++i) {
    pinMode(LED_PIN[i], OUTPUT);
    pinMode(VOLTAGE_SENSOR_PIN[i], INPUT);
    pinMode(CURRENT_SENSOR_PIN[i], INPUT);
  }
  pinMode(BUTTON_PIN, INPUT);
  pinMode(POWER_OK_PIN, INPUT);
  pinMode(PSU_ON_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  /* PSU_ON and button signals interrupt setup */
  attachInterrupt(0, buttonPressCallback, FALLING);
  attachInterrupt(1, powerOkCallback, CHANGE);

  /* Serial setup */
  Serial.begin(115200);

  /* LCD setup */
  lcd.begin(16, 2);

  /* Get current PSU state */
  PSU_state = digitalRead(POWER_OK_PIN);

  /* Test code */
  lcd.print("Hello World !");
  digitalWrite(LED_PIN[0], HIGH);
  digitalWrite(LED_PIN[1], HIGH);
  digitalWrite(LED_PIN[2], HIGH);
  tone(BUZZER_PIN, 440, 500);
}

void loop() {

  /* Test code */
  for(byte i = 0; i < 3; ++i) {
    Serial.print(i);
    Serial.print(": ");
    Serial.print(analogRead(VOLTAGE_SENSOR_PIN[i]));
    Serial.print(" , ");
    Serial.println(analogRead(CURRENT_SENSOR_PIN[i]));
  }

  static byte s = LOW;
  digitalWrite(PSU_ON_PIN, (s = !s));
  
  delay(500);
}

void buttonPressCallback() {

  /* Test code */
  tone(BUZZER_PIN, 440, 500);
}

void powerOkCallback() {

}

Il est vraiment basique mais il m’as permis de tester grossièrement chaque partie du montage et de concevoir un squelette de code pour la suite.

Test de la carte arduino :

P1060096

Test des leds :

P1060101

Test de l’écran lcd :

P1060102

Test des capteurs de courant :

P1060107

La suite ?

Il me reste encore à réaliser un boitier pour le montage, de même qu’une jolie façade (sérigraphié ça serait top).
Ensuite il me faudra faire le code est finir le câblage des prises banane et des sorties de l’alimentation.
J’ai encore du boulot pour un petit moment :)

Bon bidouillage et bon WE à tous ;)


Classé dans:arduino, Corrigé, programmation, projet Tagged: diy, hack, madeinfr

Vendredi, février 15 2013

[DIY] Dock micro USB OTG

Bonjour tout le monde !

Pour notre projet tutoré à l’IUT nous avions besoin d’un dock micro usb OTG (je ne rentre pas dans les détails du projet en lui même ce serait trop long à expliquer).
On trouve plein de câble micro usb OTG dans le commerce, souvent en import direct de chine, le tout pour moins de 10$ voir moins.

Un câble "du commerce" c’est bien mais le problème c’est que ça prend de la place, qu’il soit coudé à 90° ou non !
Pour notre projet nous avions plutôt besoin d’un dock "low profil" avec un connecteur micro usb câblé en OTG qu’un simple câble coudé.
Après des heures de recherche sur ebay, dealExtreme & co le constat est sans appel, ça n’existe pas en "tout fait" …

Du coup, ni une ni deux, une commande de connecteur chez farnell, un petit typon sous Ares et voila ce que cela donne en image ;)

Le connecteur :

P1060128

J’ai choisi d’utiliser des connecteurs micro usb traversant miniature SANS "bouclier" de métal autour du connecteur afin d’éviter que le dock ne soit trop dur à brancher / débrancher.
Pour ceux qui veulent la référence ce sont des ZX20-B-5S disponibles chez farnell pour un prix dérisoire.

P1060133

Aussi par miniature, j’entends "vraiment" miniature, le bout de pince que vous pouvez apercevoir sur la photo fait en réalité 2mm, ça vous donne une idée de la taille globale du connecteur.

Mon "environnement de travail" :

P1060136

Bon j’avoue c’est pas très "pro" comme environnement de travail ;)

1er étape : le pré-câblage du connecteur :

P1060137

Comme les broches du connecteur ne font qu’un millimètre de long je ne pouvais pas les souder directement sur un morceau de pcb.
L’astuce des câbles OTG "du commerce" utilisant ce genre de connecteur est d’insérer un pcb très fin entre les deux rangées de broches et de souder le connecteur directement dessus.

Le problème c’est qu’ils nous faillaient un dock, soit un connecteur perpendiculaire au câble.
J’ai résolu le problème en soudant des fils de cuivre émaillés très fin à chaque broche du connecteur, fils qui seront soudés par la suite sur le pcb.

P1060140

Gros plan sur les soudures, ça m’a pris une bonne demi-heure pour tout souder et vérifier que les soudures étaient bonnes.

2iéme étape : le pcb :

P1060147

Ce que vous voyez là c’est ma cuisine … on a vu mieux comme atelier gravure …

Le typon a été réalisé sous Ares, puis transféré sur la plaque de cuivre au moyen d’une imprimante laser et de la célèbre méthode du "transfert de toner".
Pour la gravure en elle même je suis resté sur la solution "classique" du perchlorure de fer.

P1060148

Le pcb âpres 8 minutes de gravure à ~38°C, à ce stade il est prêt à être rincé.

P1060152

Le pcb rincé avec le toner encore présent sur les pistes de cuivre.

3iéme étape : l’assemblage :

P1060153

Vous remarquerez le magnifique effet miroir … c’est pas grave pour ce typon mais la prochaine fois je ferais plus attention.

P1060145

Petite particularité de mon câble USB OTG, celui ci est destiné à être "pluggé" dans une carte arduino !
Les cartes arduino possédant un connecteur USB-B mâle (ou femelle je me rappelle jamais …) j’ai donc massacré deux câbles usb-a / usb-b pour faire mon câblage.

P1060156

Voila ce que ça donne une fois le câble (la partie usb-b) soudé sur le pcb, avec en plus un petit strap pour tenir le câble solidement en place.

Les câbles OTG, trucs et astuces :

Quand j’ai voulu tester mon câble OTG pour la première fois rien ne c’est passé … rien de chez rien, quedal, niét, nada !

P1060157

J’avais pourtant fait le test avec une clef usb (formaté en FAT) et l’application "usb otg helper" pour android, censée fonctionner parfaitement … mais sans succès.

L’astuce est vraiment conne, mais une fois qu’on la connait tout marche tout de suite beaucoup mieux !

difference_circuit_271738111300

Vous voyez la broche "sense" (aussi appelait "ID") ?
Si elle est flottante c’est un câble normal, si elle est reliée à GND c’est un câble OTG.

La différence est mince mais le résultat totalement différent !

P1060159

On voit clairement les deux fils GND et ID reliés ensemble sur cette photo.

Et bien sûr une fois les deux broches reliées tout marche parfaitement :

P1060162

Pour les curieux ceci est ma clef usb "d’installation linux", avec mon wallpaper, mon script d’installation apt-get, un log u-boot (qui sort de je ne sais où) et une image openWRT que je garde de côté pour mon eeepc.

À noter aussi que le galaxy S3 n’est pas à moi mais à l’IUT … je n’ai pas le budget pour m’acheter un téléphone à +450€ (j’ai un HTC HD2 flashé sous android 4.1 ça me suffit largement :) ).

Fabrication du dock :

P1060164

Histoire de faire un truc "solide" j’ai collé le connecteur avec de la résine epoxy (tube avec deux composants à mélanger).
Mes essais avec de la colle cyanoacrylate n’ont pas été concluant, c’était trop cassant.

P1060167

Vous remarquerez le fait que le strap qui maintient le câble usb est volontairement fondu sur la gaine du câble pour éviter que celui ci ne bouge dans le futur.

4iéme étape : soudure des fils :

Tous d’abord les fils ont été coupés à la bonne longueur :

P1060168

Puis avec une bonne "lampe loupe" et un fer à souder bien chaud ça donne ça :

P1060170

Remarque : oui j’ai complétement raté le centrage de mon perçage sur la 1er plaque …
Remarque 2 : les fils sont émaillés donc aucun risque de court-circuit ;)

Fignolages :

La colle chaude c’est la vie ! Je le répéterai jamais assez : bénis soit l’inventeur de la colle chaude !

P1060172

P1060175

Résultat final :

P1060176

(le deuxième câble est identique au premier ;) )

Je peux vous garantir que vous trouverez jamais un connecteur micro USB OTG aussi DIY que celui là :)
Le cout total s’élève à 3.5€ (pcb et colle exclut) par dock, soit pas grand chose au final.

Bon bidouillage et bon WE à tous ;)


Classé dans:arduino, programmation, projet Tagged: diy, madeinfr

Jeudi, février 14 2013

Carte de suicide pour Reprap

Jusqu'à maintenant, j'utilisais une alimentation séparée de celle d'origine pour fournir la puissance nécessaire au lit chauffant, du coup, c'étatt pas vraiment pratique car ça faisait pas mal de bordel, je voulais une solution simple et propre.

J'ai trouvé une alimentation pas chère comparée à sa puissance qui devrait faire l'affaire : 400W, oui, un lit chauffant, ça consomme énormément...

Une grosse alimentation, c'est bien mais quand elle ne sert pas, c'est bien qu'elle ne consomme pas...et justement, les firmwares des repraps disposent d'une fonction particulièrement intéressante : le suicide (G-Code M81)

Au démarrage de l'imprimante, la carte de commande de l'Ultimaker (ou n'importe quel Reprap supportant la fonctionnalité) place un port à l'état haut, une fois le travail d'impression terminé, l'état du port passe à 0, il est alors assez simple de venir commuter un relais pour couper définitivement l'arrivée de courant dans l'alimentation, l'empêchant alors de gaspiller du courant et l'isolant du secteur...

J'ai développé une carte de commande basée sur celle de Daid avec quelques fonctions en plus :

  • La fonction de suicide est débrayable à l'aide d'un interrupteur
  • Le pilotage de ventilateur supplémentaire (ex: pour les moteurs pas à pas)
  • Le pilotage de barrette de led avec fusible de protection
  • Un fonction d'arrêt d'urgence / extinction qui coupe le courant immédiatement
  • La génération du 12V utilisé pour le ventilateur de l'Ultimaker est ... naze, un pauvre 7812 qui passe son temps à chauffer, impossible d'imaginer alimenter les barettes de led et les ventilateurs des moteurs avec ça...
  • Des fusibles de protection pour chacun des éléments

Voici le schéma de principe :
Ultimaker suicide schéma

Et le PCB avec les explications :
Ultimaker suicide pcb

Suicide board pcb

Explications du fonctionnement

Pilotage de la tension du secteur

ATTENTION: Ce montage est relié directement au secteur, c'est donc potentiellement dangereux, prenez toutes les précautions d'usage...

La tension du secteur arrive directement sur le bornier P_IN et ressort par P_OUT en passant par le relais K1 ou K3 (j'ai prévu l'utilisation d'un relais standard ou statique, à votre convenance...).
Sur le couple START_0 / START_1 est relié un interrupteur poussoir (minimum 220V / 3A) qui permet de faire passer le courant dans l'alimentation 24V, alimentant alors la carte de commande de l'Ultimaker, cette dernière force alors un état haut sur la broche A1 qui arrive via le connecteur SV1 sur notre carte de suicide, forçant le relais à coller via T1 et laisser passer le courant du secteur dans l'alimentation par le relais, en relâchant le bouton poussoir, le relais reste collé...

Vous remarquerez que même si l'interrupteur de débrayage SUICIDE est ouvert, l'état haut est forcé par R2 sur la base de T1 lui permettant d'être passant et de faire coller le relais.

  • Il faut impérativement utiliser pour D3 une diode de type schottky
  • D1 est une diode de roue libre obligatoire si vous ne voulez pas voir le transistor T1 faire des signaux de fumée.
  • Vous pouvez utiliser un relais 5 ou 12V au choix simplement en positionnant un cavalier au bon endroit sur SELECT.
  • Un fusible est prévu pour la tension du secteur, je vous conseille d'en mettre un de 3A (pour une tension secteur de 220V, pour du 110V, prévoyez le double), c'est largement suffisant pour protéger une alimentation de 400W.
  • Pour le bouton poussoir d'allumage, prenez-en un suffisamment costaud de 3A (voir point plus haut relatif à la tension secteur) pour encaisser le courant à l'allumage et n'oubliez pas qu'il est relié à la tension du secteur donc pensez à isoler sa connectique.
  • À cause de la tension du secteur, le montage doit être isolé dans un boitier en plastique, n'hésitez pas à apposer un avertissement dessus afin de rappeler le risque

Pilotage des ventilateurs / leds et protection

Via les interrupteurs branchés SWITCH_0 et SWITCH_1, vous pouvez piloter des ventilateurs pour les moteurs pas à pas et des barettes de leds branchées respectivement sur FAN_1 / FAN_2 et LIGHT_1 / LIGHT_2, j'ai aussi mis une protection sous forme de fusible pour ces éléments, dimensionnez les fusibles en fonction de votre installation.

Pour piloter les ventilateurs et les leds, j'ai besoin d'une tension de 12V, or, comme dit plus haut, la carte de l'Ultimaker génère du 12V mais ce n'est pas vraiment une bonne solution de l'utiliser car il chauffe énormément, j'ai prévu l'utilisation d'une carte fille utilisant un régulateur à découpage permettant de générer 12V@3A directement via le 24V de l'alimentation.
Pour ne pas compliquer le montage, j'ai utilisé une carte abaisseur de tension à découpage générant le 12V depuis les 24V de l'alimentation trouvé sur DealExtreme, elle possède un excellent rendement et est plutôt de bonne qualité (hormis la diode schottky qui n'a pas faite long feu).

Pour la brancher sur le PCB, voici les codes couleurs des pattes (référez-vous à la vue du PCB plus haut) :
DC 4~40V to DC 1.5~35V Voltage Step Down Transformer

Note: vous n'êtes pas obligé d'utiliser la carte fille, j'ai prévu la place pour ajouter un 7812 uniquement si l'intensité demandée n'est pas trop forte...

Toutes les valeurs des composants sont spécifiées, ils sont tous traversant donc pas vraiment de difficulté pour réaliser cette carte... Les fichiers au format Eagle sont joint avec cet article.

L'arrêt d'urgence

Le fonctionnement de l'arrêt d'urgence est simple, l'appui sur le bouton force un état bas sur la base de T1, ce dernier arrête alors d'être passant, le relais se décolle, le courant n'arrive plus et tout s'éteint, ça y est, c'est fini, on en parle plus...Et non, malheuresement, ce n'est pas si simple à cause de l'inertie de l'alimentation dû à ses condensateurs et ses selfs surgonflés, un bref appuie sur l'arrêt d'urgence ne suffit donc pas à stopper net l'ensemble et j'ai dû modifier mon circuit d'arrêt d'urgence.

En fait, mon bouton d'arrêt d'urgence n'est pas relié à la carte ci-dessus mais à la commande d'un relais monté en série avec le courant issue de la sortie de l'alimentation de 24V et une grosse résistance de puissance de 1W, il laisse passer le courant au repos, un appui sur le bouton, va faire coller le relais qui va alors s'autoalimenter. Le courant résiduel de l'alimentation est alors dérivé dans ce relais et déchargé très rapidement dans la résistance de puissance, ainsi, un bref appui suffit à couper l'arrivée de courant immédiatement.

Selon votre alimentation, il est possible que vous n'ayez pas à ajouter ce montage supplémentaire.

Une boite

Voici une boite dans laquelle vous pourrez ranger cette carte, imprimez la de préférence en PLA car en ABS, vous aurez de gros soucis de rétractation.

Suicide case

Le source au format OpenSCAD est disponible sur GitHub : OpenSCAD_Things / Ultimaker / Suicide Case

Dans un prochain article, j'expliquerai comment j'ai intégré cette boite et tout le reste dans l'Ultimaker.

Conclusion

La carte est intégrée depuis quelques temps maintenant et aucun souci, c'est vraiment pratique, surtout avec une alimentation aussi puissante, ça à un côté plutôt rassurant...

Concernant l'intégration dans l'imprimante de tout ce joli monde, ce sera l'occasion d'un prochain article...

Lundi, février 11 2013

[DIY] Un port série … audio

Bonjour tout le monde !

Fut un temps je cherchais un moyen de programmer un ATmega de la façon la plus tordu possible (oui j’ai que ça à foutre).
Dans le genre bien tordu j’avais trouvé ce programmateur d’AVR à base de clavier usb :
http://hackaday.com/2012/11/26/usb-keyboard-becomes-an-avr-programmer/

J’ai eu beau chercher je n’ai pas pu trouver d’idée encore plus tordue …
Du coup je suis parti sur une autre idée, émuler un port série au moyen d’une carte son !

Le montage :

audiogpio

Pour ce montage j’ai piqué le schéma ici :
http://robots-everywhere.com/re_wiki/index.php?title=Serial_on_Android_using_the_audio_port

En réalité c’est un bête montage avec un amplificateur opérationnel (en saturation), monté en inverseur.

Quand l’entrée dépasse le seuil fixé par le potentiomètre la sortie bascule.
Cela permet d’avoir un signal TTL 0v/5v "propre" à partir d’un signal audio de +/- 1v d’amplitude.

Comme une carte son possède (dans 99.9% des cas) une sortie stéréo il est possible d’avoir deux sorties.
Du coup on peut imaginer émuler autre chose qu’un port série, voire même faire des sorties TTL tout ce qui à de plus classique.

Remarque : dans mon montage physique (pas sur le schéma) j’ai inversé par erreur les entrées V+ et V-, du coup j’ai un montage non inverseur.
Ne vous faites pas avoir, il faut bien un montage inverseur, vous comprendrez par la suite pourquoi ;)

Le prototype :

P1060053

Sur la gauche les deux sorties et les alimentations +5v et GND.
Et juste à côté l’entrée audio (gauche, droite, masse).

P1060056

Pour l’amplificateur opérationnel j’utilise un LM393 qui a l’avantage de fonctionner sans problème en +5V, contrairement à un TL082 par exemple qui a besoin d’une alimentation symétrique.

P1060057

Oui je sais c’est dégueulasse …
(ne pas vous fier à mon câblage, rappel : j’ai inversé V+ et V-)

Découpage d’une trame série :

Pour pouvoir vous expliquer rapidement la composition d’une trame série j’avais besoin d’une trame.
L’image ci dessous provient donc de batsocks.co.uk et est disponible dans son contexte d’origine ici :
http://www.batsocks.co.uk/products/Other/SweeperMeter_Technical.htm

SerialFormat

Une trame série se décompose en plusieurs parties :
- un bit de start
- 8 (ou 7) bits de données
- 1 (ou 2) bit de stop

Le bit de start correspond à un niveau bas (0v), un bit de stop correspond à un niveau haut (5v).
Au repos le signal doit être à l’état haut (historiquement cela permettait de détecter une coupure sur la ligne).

Concernant la durée des temps haut / temps bas c’est très simple à calculer.
Imaginons que l’on souhaite une vitesse de communication de 9600 bauds par seconde.
9600 bauds/s = 9600 bits/s -> durée d’une période = 1 / fréquence = 1 / 9600 = 0.104 millisecondes

De même pour connaître la durée d’une trame complète il suffit de multiplier le tout par le nombre de bits par octet.
Ici avec 8 bits de données et 1 bits de stop :
1 bit de start + 8 bits de données + 1 bits de stop = 10 bits
10 bits = 10 x (1 / 9600) = 1.04 millisecondes

Un niveau haut de plus d’une fois la durée d’un octet s’appelle un "break", si un récepteur série reçoit un "break" il est obligé de se recaler sur le bit de start qui suit, cela permet de ne pas perdre la synchronisation avec le signal série.

Remarque : on peut aussi déduire la vitesse réelle de transmission en octets par seconde :
9600 bits/s / 10 bits = 960 octets par seconde

Le logiciel :

Comprendre le fonctionnement d’une communication série asynchrone c’est une chose, émuler un signal série en est une autre.
Et émuler un signal série avec une carte son d’ordinateur est encore une autre histoire.

Pour me simplifier la tache j’ai conçue un script python prenant un fichier (texte ou binaire) en entrée et générant un fichier wave en sortie.
Pour lire le fichier il suffit d’ouvrir un éditeur comme audacity par exemple ou n’importe quel lecteur de musique supportant la lecture des .wav.

Voici un exemple de fichier audio généré et ouvert sous audacity :

audacity_lorem

Note : le signal présenté ci dessus est volontairement non-inversé, il ne devrait pas être dans le même sens que sur le schéma vu plus haut.
L’amplificateur inversant le signal audio celui ci doit être lui inversé pour au final avoir un signal série avec des niveaux logiques corrects.

Vous vous demandez sûrement pourquoi inverser le signal ?
Réfléchissons une petite seconde.
Le signal série doit être à l’état haut au repos, la carte son elle ne sort aucun signal au repos.
En utilisant un montage inverseur le signal est de base au niveau haut et passe au niveau bas lorsque la carte son envoie un signal.
il faut donc inverser le signal audio pour que le montage inverse de nouveau le signal et que celui ci finisse par être dans "le bon sens".
L’avantage de cette méthode est que si l’on débranche l’entrée audio le récepteur série ne se retrouvera pas avec un signal corrompu mais avec un "break" constant.
Cela évite aussi d’avoir à générer un signal haut avec la carte son au repos.

Le code du script (avec des commentaires pour expliquer chaque sous-parties) :

# -- Imports --
# sys: for argv / argc
# wave: for wave file generation
# struct: for pack
import sys, wave, struct

# Vitesse de communication série
SERIAL_RATE = 2400

# Fréquence d'échantillonnage (min 4000 ~ max 48000)
SAMPLE_RATE = 48000

# Vérification des arguments CLI
if len(sys.argv) < 3:
    print "USAGE: data2wav.py <input file> <output file>"
    exit(1)

# Nom de fichier source / sortie
i_filename = sys.argv[1]
o_filename = sys.argv[2]

# Ajoute l'extension .wav au fichier de sortie si nécessaire
if o_filename[-4:] != '.wav':
    o_filename += '.wav'

# Ouvre le fichier source (en mode binaire)
fi = open(i_filename, 'rb')
if not fi:
    print "Cannot open input file: %s" % i_filename
    exit(1)

# Ouvre le fichier de sortie (en mode binaire)
fo = wave.open(o_filename, 'wb')
if not fo:
    print "Cannot open output file: %s" % o_filename
    exit(1)

# Configure l'entête du fichier Wave
fo.setnchannels(1) # Mono
fo.setsampwidth(1) # 8 bits
fo.setframerate(SAMPLE_RATE)

# Calcul le nombre d'échantillons audio par bit
# Plus il y a d'échantillons par bit plus la qualité du signal audio sera grande
# Une fréquence d'échantillonnage élevé donnera donc les meilleurs résultats
NB_SAMPLES_PER_BIT = SAMPLE_RATE / SERIAL_RATE

# Buffer audio
audio_output = []

# Ajoute un bit dans le buffer audio
def appendBit(bit):
    for i in range(0, NB_SAMPLES_PER_BIT):
        if bit: # Inversion du signal : 0 -> 1, 1 -> 0
            audio_output.append(struct.pack('B', 0))
        else:
            audio_output.append(struct.pack('B', 255))

# Ajoute un "break" dans le buffer audio
def serialBreak():
    for i in range(0, 20):
        appendBit(True)

# Début du processus de conversion
b = fi.read(1)
serialBreak()
serialBreak()
while b != '':

    # Converti la valeur d'un octet du fichier source en décimal
    b = ord(b)
    
    # Ajoute un bit de start au buffer audio
    appendBit(False)

    # Ajoute 8 bits de données au buffer audio
    for i in range(0, 8):
        appendBit(b & (1 << i))

    # Ajoute un bit de stop au buffer audio
    appendBit(True)

    # Lit l'octet suivant du fichier source
    b = fi.read(1)

# Écrit le contenu du buffer audio dans le fichier de sortie
fo.writeframes(''.join(audio_output))

# Fermeture du fichier source et du fichier de sortie
fi.close()
fo.close()

Test IRL :

Le montage finit :

P1060060

Sur la photo :
- une carte son usb
- un dongle usb/série
- un câble audio jack bricolé
- quelques fils
- et le montage

Il suffit ensuite de lancer la lecture du fichier wave :

terminal_lorem

Et voila, un joli "Lorem ipsum" transmit au moyen d’un "vrai faux" port série émulé par une carte son !
Peut être qu’un jour on programmera nos arduino au moyen d’un simple lecteur de musique ;)


Classé dans:Corrigé, projet Tagged: diy, madeinfr

- page 1 de 14