Mot-clé - Electronique

Fil des billets - Fil des commentaires

Samedi, avril 13 2013

Premiers pas avec le pcDuino

Si vous êtes un peu au courant de tout ce qui se passe dans le monde du DIY, vous avez peut-être entendu parler du pcDuino, concurrent direct du RaspberryPi. Certes, il n’a pas bénéficié du même effet d’annonce, mais pourtant il le mérite au moins autant. En effet, c’est une incroyable petite bestiole qui pousse le concept de mini-ordinateur hackable à souhait bien plus loin encore que le RasPi…

Trêve de bla-bla, voyons un peu à quoi ressemble l’engin:

featured-image

Au programme:

  • CPU: Cortex A8 cadencé à 1GHz
  • GPU: OpenGL ES2.0, OpenVG 1.1 Mali 400 core
  • 1Go de RAM
  • Ports: HDMI, Ethernet, 3 ports USB
  • Slot micro-SD (pour le stockage)

Déjà là, on sent bien que le Raspberry Pi a du souci à se faire! CPU beaucoup plus puissant, 1Go de RAM contre 256/512Mo…Mais attendez, ce n’est que le début!

La carte embarque une mémoire flash NAND de 2Go. Ca semble con comme ça, mais l’intérêt est avant tout d’y loger le système d’exploitation. Et oui, là où le Raspi charge l’OS en RAM à partir d’une carte SD, le pdDuino utilise une mémoire flash. Et là, croyez-moi, ça dépote. A titre d’info, le pcDuino effectue un reboot complet en 45 secondes. D’ailleurs, parlons-en de l’OS…

Le pcDuino est livré avec Ubuntu 12.10, mais il est possible d’y installer un Android Ice Cream Sandwich. Oui, vous avez bien lu. Ubuntu et Android. Je vous laisse imaginer la suite!

Bon, on est pas mal là quand même! Et si je vous dit que ce n’est pas fini? Si je vous dis en plus que le pcDuino est compatible avec la plupart des shields Arduino?

Elle est pas belle la vie?

Le pcDuino dispose en effet des quatres séries de pins d’un Arduino standard: les analog, les PWM, les TX/RX…et ça, c’est vraiment cool.

Maintenant, passons au travaux pratiques!

Première prise en main

Pour lancer la bestiole, rien de plus simple: clavier, souris, écran sur le HDMI, Ethernet, alimentation. Quelques secondes plus tard, tadaaaaa:

2013-04-05-180149_1280x720_scrot

Petit test de Chrome:

2013-04-05-180809_1280x720_scrot

Bon, visiblement ça fonctionne! Maintenant, il s’agit de configurer tout ce petit monde!

Configurer le clavier

Parce que le QWERTY ça va 5 minutes:

sudo dpkg-reconfigure keyboard-configuration

Si nécessaire, rebootez:

sudo reboot

Configurer SSH

Oui, ça peut aider, non? Cette partie est un basée sur cet article.

Tout d’abord, on se créé un utilisateur qu’on ajoute de suite au groupe admin, histoire d’avoir les droits qui vont bien et de pouvoir faire du sudo avec ce compte:

sudo su
adduser deabdird

puis:

adduser deadbird admin

Ensuite, récupérez votre adresse IP:

ifconfig

Installez le package SSH:

apt-get install ssh

Puis nano, un éditeur de texte en ligne de commande:

apt-get install nano

Le but est d’éditer un peu la conf de SSH pour le sécuriser un tout petit peu plus. Modifiez la ligne suivante:

PermitRootLogin yes

en

PermitRootLogin no

et ajoutez celle-ci:

AllowUsers deadbird

Ces changements permettent de n’autoriser que l’user que vous avez créé à se logger en SSH. Maintenant, rebootez et testez avec une autre machine.

Changer la résolution

Si comme moi vous brancher votre pcDuino sur un écran d’ordi avec un adapteur HDMI vers VGA, vous devriez avoir une résolution moisie. Mon but: avoir du 1280*1024. Changer la résolution d’affichage n’est pas une partie de plaisir, mais voici la manip, tirée du site the greathouses:

Tout d’abord, installez git, libusb et pkg-config:

sudo apt-get install git libusb-1.0.0-dev pkg-config

Ensuite, nous allons récupérer et compiler les sources de sunxi-tools, un programme permettant d’éditer le fichier evb.bin, où se trouve la configuration de l’affichage.

git clone https://github.com/linux-sunxi/sunxi-tools

cd sunxi-tools

make

Maintenant, il va nous falloir accéder à evb.bin, qui est stocké dans la partition de boot, plus précisément dans la mémoire flash de la carte:

sudo mount /dev/nanda /boot

Maintenant, vous avez accès à evb.bin:

ls /boot

Avant de modifier le fichier, faites-en une copie:

sudo cp /boot/evb.bin /boot/evb.bin.bak

Ensuite, décompilez le fichier evb.bin et faites-en un fichier:

./bin2fex /boot/evb.bin >evb.conf

Ouvrez-le avec nano.

Attention à ce que vous touchez dans ce fichier, il y a là de quoi cramer votre pcDuino!

A ce propos, di vous voulez vraiment mettre les mains dans le cambouis, allez donc voir le FEX Guide ici, vous y trouverez de quoi charcuter l’evb.bin. Mais encore une fois, attention…

Cherchez une section nommée “disp_init” (utilisez Ctrl+W pour chercher avec nano). Elle devrait ressembler à ceci:

[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 3
screen0_output_mode = 5
screen1_output_type = 3
screen1_output_mode = 9
fb0_framebuffer_num = 2
fb0_format = 10
fb0_pixel_sequence = 0
fb0_scaler_mode_enable = 1
fb1_framebuffer_num = 2
fb1_format = 10
fb1_pixel_sequence = 0
fb1_scaler_mode_enable = 0

Modifiez la valeur de la variable “screen0_output_mode”:

HDMI Mode Resolution
0 480i
1 576i
2 480p
3 576p
4 720p50
5 720p60 (default)
6 1080i50
7 1080i60
8 1080p24
9 1080p50
10 1080p60
11 PAL
12 PAL_SVIDEO
14 NTSC
15 NTSC_SVIDEO
17 PAL_M
18 PAL_M_SVIDEO
19 PAL_NC
21 PAL_NC_SVIDEO
23 1080p24-3D
24 720p50-3D
25 720p60-3D
26 1360×768-60
27 1280×1024-60

Une fois les modifs enregistrées, transformez le fichier en un nouvel evb.bin:

sudo ./fex2bin evb.conf /boot/evb.bin

puis démontez la partition:

umount /boot

et redémarrez:

sudo reboot

Et là…croisez les doigts. Si ca ne fonctionne pas, recommencez la manip inverse ou restaurez l’evb.bin que vouz avez sauvegardé. Essayez d’autres résolutions jusqu’à tomber sur quelque chose de bien.

Dimanche, mars 3 2013

Réparation de la carte vidéo d’un portable Samsung Q45

Après avoir rendu de bon et loyaux services pendant quelques années, j’ai un portable Q45 qui a une panne d’affichage vidéo des plus ennuyeuse: Pas de vidéo du tout ou alors un affichage rayé de lignes violettes.

Symptômes

Symptômes

 

Souvent dans ce cas, il s’agit d’une ou plusieurs soudures défectueuses sur le chipset vidéo. Malheureusement, ce sont des composants BGA dont les soudures sont sous le corps et non sur les côtés.

BGA Chipset

BGA Chipset

 

Elles sont donc inaccessibles aux fers à souder classiques ! Il faut utiliser des technique à air chaud pour arriver à réparer ce type de problème.

Ce type de composant contrairement à ce que l’on pourrait penser résiste bien aux hautes températures (250°C) à condition de bien respecter le cycle de chauffe.

Il faut comme indiqué sur wikipédia,   suivre une montée en température progressive avec un préchauffage autour de 150°C.

 

Cycle de chauffe

Cycle de chauffe

 

Dans la vidéo qui suit, j’ai utilisé une station de soudure aoyue 906+ ( Du matériel chinois mais suffisant pour l’amateur à un prix dérisoire… )

Station de soudure

Station de soudure

 

Pour le reste, du bon DIY avec un cache en papier d’aluminium pour protéger de la chaleur et du souffle de la buse les composants avoisinant. Un multimètre avec sonde de T° est aussi utilisé pour contrôler la montée en température.

Cache

Cache

 

L’opération #screensaver en vidéo

Et le résultat, pas si mal :-)

Bingo !

Bingo !

Elle n'est pas belle ma Debian ?

Elle n’est pas belle ma Debian ?

 

L’opération qui au premier abord peut paraître compliquée est en réalité assez simple ! Et un portable qui va éviter la benne…

 

 

 

Dimanche, février 24 2013

Pédale égaliseur graphique à base d’arduino et de MSGEQ7



Le projet d’aujourd’hui consiste, comme le  titre de l’article l’indique, en la réalisation d’une pédale égaliseur graphique à base d’Arduino. Dans ce qui va suivre, je vais vous expliquer comment utiliser le MSGEQ7 (un égaliseur 7 bandes), afficher le résultat sur un écran LCD et, cerise sur le gâteau, comment faire votre propre shield Arduino maison.

Etape 1: le MSGEQ7.

Je rentre direct dans le vif du sujet, je vais vous montrer comment fonctionne ce merveilleux petit circuit. Tout d’abord, où le trouver. Si vous résidez en France, je vous conseille hobbyelectro de l’ami Furrtek. Rapide et pas cher. Sinon, le MSGEQ7 est aussi dispo chez Sparkfun (trois fois plus cher, mais bon…).

Une fois que vous avez votre puce en main, il suffit de chercher la datasheet pour trouver le pinout:Screen Shot 2013-02-24 at 6.06.08 PM

mais aussi et surtout le schéma de câblage:

Screen Shot 2013-02-24 at 6.07.40 PMBon, ça fait peur comme ça, mais en cherchant un peu sur le net j’ai trouvé une version plus facile à comprendre:

schem1-450x600

J’ai utilisé ce schéma que j’ai câblé sur une breadboard, et ça donne ça:

IMG_2585

Les plus tâtillons d’entre vous aurons remarqué que j’ai utilisé 3 condos de 100pf en série pour faire un condo de 33pf, de même que deux résistances de 100kohms pour faire une de 200. J’ai beau avoir des milliers de résistances, j’en ai pas une seule de 200kohms…

Maintenant, la partie logicielle…

Etape 2: le code

Nous avons 3 pins à utiliser:

  • STROBE, connectée à la pin Digital 2 sur l’arduino,
  • RESET, connectée à la pin Digital 3,
  • OUT, connectée à la pin Analog 0.

Vous pouvez utiliser les pins que vous voulez, le MSGEQ7 n’utilise pas d’interrupt, pas d’I2C, pas de SPI, rien de spécial. Chaque patte a une utilisation particulière, comme l’explique le chronogramme de la datasheet:

Screen Shot 2013-02-24 at 9.28.00 PM

Là vous vous dites: “ohlàlà, mais qu’est-ce qu’il nous gonfle avec tous ces détails?”…le MSGEQ7 est une puce relativement simple à comprendre, autant se pencher un peu sur la théorie!

Ce que nous dit ce chronogramme:

  1. la puce crache les valeurs de chaque fréquence (il y en a 7 différentes, d’où le “7″ de “MSGEQ7″) sur OUT.
  2. pour cela, il faut effectuer un reset de la puce avant chaque lecture. pour cela, il faut passer la patte RESET à haut puis à bas.
  3. ensuite, il faut passer la pin STROBE à bas
  4. attendre 36 microsecondes, que la puce crache la valeur sur OUT
  5. passer STROBE à haut.
  6. recommencer à l’étape 3

En termes d’arduino, voici ce que cela donne:

const int ANALOG = 0;
const int STROBE = 4;
const int RESET = 5;
int outputValues[7];

void setup(void) {
  //setup MSGEQ7
  pinMode(ANALOG, INPUT);
  pinMode(STROBE, OUTPUT);
  pinMode(RESET, OUTPUT);

  analogReference(DEFAULT);

  digitalWrite(RESET, LOW);
  digitalWrite(STROBE, HIGH);

}

void loop(void) {
  //reset chip
  digitalWrite(RESET, HIGH);
  digitalWrite(RESET, LOW);

  for (int i = 0; i < 7; i++) {
    digitalWrite(STROBE, LOW);
    delayMicroseconds(30);
    outputValues[i] = analogRead(ANALOG);
    digitalWrite(STROBE, HIGH);
  }
}

Ok, c’est bien tout ça, mais comme savoir si ça fonctionne? Simple: ajoutez un Serial.begin(9600) dans le setup et quelques Serial.print dans le loop pour afficher les valeurs sur le serial monitor et hop, c’est gagné! Et là vous vous rendrez certainement compte que le MSGEQ7 est une véritable perle: donnez lui du son et il fera le reste! Je l’ai utilisé avec une basse possédant un gros niveau de sortie et avec la carte son de mon iMac, il réagit aussi bien avec l’un qu’avec l’autre. Bon maintenant, il s’agirait peut-être d’afficher les valeurs autrement, non?

Etape 3: l’écran LCD

Les écrans LCD pour arduino, c’est pas ce qu’il y a de plus difficile à trouver. On en trouve une tétrachiée chez Sparkfun par exemple…mais si on veut quelque chose de sympa et pas cher, il faut creuser un peu plus. En ce qui me concerne, eBay m’a encore une fois sauvé la vie.

Petit aparté.

Je tiens à remercier du fond du coeur nos amis les chinois sans qui ce qui va suivre aurait couté un bras, un oeil et un rein. Merci à tous les chinois qui vendent des trucs complètement dingues sur eBay à des prix ahurissants, le tout avec frais de ports offerts. Je vous aime les mecs, sincèrement.

Voilà, tout ça pour dire que j’ai déniché sur eBay cette petite perle:

IMG_2618

Les specs: 128*64 pixels bleus, rétro éclairé, le tout pour 7€, alors qu’un modèle équivalent peut valoir jusqu’à 30$ chez adafruit ou sparkfun.  Mais le top, c’est qu’il est utilisable en mode parallèle et en série! Là tout de suite, c’est beaucoup plus intéressant! En parallèle on a facilement besoin de 15 pins, et donc d’un arduino Mega…En mode série, 8 pins suffisent!

Le câblage est le suivant pour un arduino uno ou équivalent:

  • pin 10 (SS) vers RS
  • pin 11 (MOSI) vers R/W
  • pin 12 (MISO) vers E
  • +5V vers VDD et BLA (BLA c’est l’anode du rétro éclairage)
  • GND vers VSS, PSB (PSB à 0 = mode série) et BLK (cathode du rétro éclairage).

Simple, non? Ben non, parce que la partie logicielle se corse un peu. Pour afficher quoi que ce soit sur ce LCD, vous aurez besoin d’une librairie, dispo ici: http://code.google.com/p/u8glib/ . Autre astuce: pour cet écran, le constructeur à utiliser est “U8GLIB_ST7920_128X64 u8g(12, 11, 10, U8G_PIN_NONE);”. Pour le reste, à savoir comment dessiner sur l’écran, regardez la doc de la librairie. En attendant, voici le code de l’égaliseur:

#include "U8glib.h"

U8GLIB_ST7920_128X64 u8g(12, 11, 10, U8G_PIN_NONE);

const int ANALOG = 0;
const int STROBE = 4;
const int RESET = 5;
const int outputValues[7];

void drawMediumBars(void) {
  for (int i = 0; i < 7; i++) {
    u8g.drawBox(5+18*i, 64-(outputValues[i]/16), 10, outputValues[i]/16);
  }
}

void setup(void) {
  //setup MSGEQ7
  pinMode(ANALOG, INPUT);
  pinMode(STROBE, OUTPUT);
  pinMode(RESET, OUTPUT);
  analogReference(DEFAULT);
  digitalWrite(RESET, LOW);
  digitalWrite(STROBE, HIGH);
}

void loop(void) {
  u8g.firstPage();  
  do {
    //reset chip
    digitalWrite(RESET, HIGH);
    digitalWrite(RESET, LOW);

    for (int i = 0; i < 7; i++) {
      digitalWrite(STROBE, LOW);
      delayMicroseconds(30); // to allow the output to settle
      outputValues[i] = analogRead(ANALOG);
      digitalWrite(STROBE, HIGH);
    }

    //draw values
    drawMediumBars();
  } while(u8g.nextPage());
}

Avec ça, vous devriez afficher de jolies barres sur l’écran, quelque chose de ce style:

IMG_2597

Sympa, non? Mais bon, un seul design, ca craint, si seulement on pouvait en changer à la volée…

Etape 4: les boutons et les interruptions

Tout d’abord, kesséssé une interruption? C’est tout simplement un bout de code qui est lié à une évènement matériel: le passage d’une pin de l’état haut à l’état bas par exemple. Quand l’évènement se déclenche, le code est exécuté. Le but de ce qui va suivre est de modifier la routine qui dessine les barres grâce à une interruption.

Voici le code avec les modifications:

#include "U8glib.h"

U8GLIB_ST7920_128X64 u8g(12, 11, 10, U8G_PIN_NONE);

const int ANALOG = 0;
const int STROBE = 4;
const int RESET = 5;
int outputValues[7];

const int BT1 = 0;
const int DEBOUNCE_DELAY = 200;

uint8_t mode = 0;
uint8_t nModes = 3;

void drawJointFatBars(void) {
  for (int i = 0; i < 7; i++) {
    u8g.drawBox(1+18*i, 64-(outputValues[i]/16), 18, outputValues[i]/16);
  }
}

void drawMediumBars(void) {
  for (int i = 0; i < 7; i++) {
    u8g.drawBox(5+18*i, 64-(outputValues[i]/16), 10, outputValues[i]/16);
  }
}

void drawTopLine(void) {
  for (int i = 0; i < 6; i++) {
    u8g.drawLine(10+18*i, 64-(outputValues[i]/16), 10+18*(i+1), 64-(outputValues[i+1]/16));
  }
}

void setup(void) {
  //setup MSGEQ7
  pinMode(ANALOG, INPUT);
  pinMode(STROBE, OUTPUT);
  pinMode(RESET, OUTPUT);
  analogReference(DEFAULT);
  digitalWrite(RESET, LOW);
  digitalWrite(STROBE, HIGH);

  //change mode button
  attachInterrupt(BT1, button1, FALLING);
}

void loop(void) {
  u8g.firstPage();  
  do {
    //reset chip
    digitalWrite(RESET, HIGH);
    digitalWrite(RESET, LOW);

    for (int i = 0; i < 7; i++) {
      digitalWrite(STROBE, LOW);
      delayMicroseconds(30); // to allow the output to settle
      outputValues[i] = analogRead(ANALOG);
      digitalWrite(STROBE, HIGH);
    }

    //draw values
    if (mode == 0) drawJointFatBars();
    else if (mode == 1) drawMediumBars();
    else if (mode == 2) drawTopLine();

  } while(u8g.nextPage());
}

void button1() {
  static unsigned long last_interrupt_time = 0;
  unsigned long interrupt_time = millis();
  // If interrupts come faster than 200ms, assume it's a bounce and ignore
  if (interrupt_time - last_interrupt_time > DEBOUNCE_DELAY) {
    last_interrupt_time = interrupt_time;

    //interrupt code
    if (mode == (nModes-1)) mode = 0;
    else mode++;

  }
}

La fonction “attachInterupt” relie une fonction (ici button1) à  un évènement (FALLING = passage de l’état haut à l’état bas) sur une interruption donnée (ici l’interruption 0, laquelle correspond à la pin DIGITAL 2).

En ce qui concerne le corps de la fonction button1, j’utilise une variable pour mesurer le temps entre deux appels à la fonction. Pourquoi? Parce que les boutons poussoirs ne sont pas parfaits et peuvent déclencher deux fois l’interruption lors d’un seul appui, faute à la mécanique. En ce qui me concerne, le délai minimum entre deux appuis est de 200ms.

Pour câbler l’interruption, voici le schéma:

IMG_2619

Simple, non?

Au final, vous devez obtenir ceci:

IMG_2599

Etape 5: transformer un prototype en shield

Quelle satisfaction de transformer un projet qui fonctionne en un produit fini! Et là, on a un montage qui ne demande qu’à être transformé en shield arduino. Pour les shields vierges, allez donc faire un tour chez l’ami semageek.

Un seul conseil: placez vos composants, soudez une fois que vous êtes sûrs. Voici à quoi ressemble le mien:

IMG_2603

IMG_2607

IMG_2606

Etape 6: la mise en boîte.

Pour mettre ma pédale en boite, je voulais un boîtier petit, super costaud, transparent. J’ai donc utilisé une otterbox que j’avais chopé dans un PX sur une base militaire US. Ces boîtiers sont géniaux. Vous en trouverez chez adafruit.

Pour la découpe en rectangle dans le boitier, voici ma méthode pour faire un rectangle bien propre. C’est aussi valable pour du métal ou du bois:

  • faites le tracé de votre découpe.
  • réalisez une découpe grossière. tous les moyens sont bons: dremel, scie à métaux…le tout c’est de ne pas trop s’approcher du contour final.
  • finissez les bords à la lime fine et plate.

De cette façon vous pourrez faires des découpes très propres et très droites à travers à peu près n’importe quel matériau:

IMG_2621

Par exemple, mon boitier:

IMG_2613

IMG_2612

Pour attacher l’arduino au fond du boîtier, j’ai utilisé un pistolet à colle:

IMG_2620

Une bande de velcro plus tard, et hop:

IMG_2617

Mardi, février 12 2013

Réparation d’un écran LCD Samtron 94v – Mode non optimal

Certains écrans LCD SAMSUNG / SAMTRON sont connus pour avoir des problèmes après quelques années de fonctionnement. J’ai récupéré un écran SAMTRON 94 H.S qui a des symptômes plutôt étranges. Pour une fois, nous n’avons pas affaire aux classiques condensateurs secs. L’écran s’allume mais ne veut rien afficher d’autre que le message « Mode non optimal ».

Mode non optimal

Mode non optimal

A priori, il devrait donc s’agir non pas de la carte d’alimentation mais plutôt de la carte logique. Quelques recherches à coup d’oscillo et de multimètre ne donnent rien de bon.  Sans disposer du datasheet du microcontroleur NT68F63LG ni du manuel de service de l’écran, difficile d’aller plus loin avec mes connaissances.

L'électronique

Je me rabat donc sur Internet :) J’ai trouvé au fin fond d’un forum une personne qui discutait d’une panne sur un modèle similaire. Le pin 6 du NT68F63LG doit être alimenté entre 3.3v et 5v hors lorsque le problème se produit, il ne reçoit plus que 2v. Placer une résistance d’environ 50 ohms entre les pins 5 et 6 permettent de « remonter » le voltage à 4v et de régler le problème !

Fix

Voilà un fix qui coûte quelques centimes et qui prend une trentaine de minutes. Pensez-y si vous avez un écran Samsung  / Samtron qui présente les mêmes symptômes. Moi je viens de sauver un 19″ pour quelques centimes :)

Sauvé !

Mercredi, décembre 19 2012

Support DIY pour caméra USB de chez Adafruit

Adafruit vend une petite webcam USB à utiliser comme outil d’inspection pour vérifier ses soudures, lire les inscriptions sur les composants, ou s’amuser avec les enfants… C’est une sorte de microscope USB low cost mais qui donne néanmoins de très bon résultats, pour peu que l’on arrive à faire la mise au point correctement. En effet, celle-ci est manuelle et dépend de la distance lentille / objet et du niveau de grossissement. Une fois le grossissement choisit, il faut approcher / éloigner le microscope pour avoir une image nette. Avec le support de base, c’est quasiment impossible de maintenir une image stable.

Microscope

Microscope

 

D’où l’idée de construire un support réglable !

Les pièces sont modélisées avec openscad puis imprimées sur mon imprimante 3D.

Support modélisé

Support modélisé

 

Fixation basse

Fixation basse

Plaque de contreplaqué 3mm

Plaque de contreplaqué 3mm

Coulisseau réglable

Coulisseau réglable

Coulisseau réglable

Coulisseau réglable

Bras de support

Bras de support

Vis de réglage

Vis de réglage

Fixation sur le support en bois

Fixation sur le support en bois

Réglage de hauteur

Réglage de hauteur

Support

Support

Molette de réglage

Molette de réglage

Molette de réglage

Molette de réglage

 

Les supports hauts et bas sont collés à l’epoxy ( JB weld, quel produit miracle :)

Tests :)

Tests :)

 

L’ensemble des fichiers pour reproduire les pièce est disponible sur Thingiverse.

 

et voici pour finir ce bref article des images à divers niveaux de grossissement.

 

Capteur d'humidité x200

Capteur d’humidité x200

Capteur d'humidité x10

Capteur d’humidité x10

 

Pour l’électronique, le grossissement x10 à x20 est largement suffisant. Au delà, c’est plus pour explorer l’infiniment petit ;)

 

P.S: vous avez vu, mes impressions sont quand même meilleurs qu’avant ! J’ai augmenté la température de l’extrusion de 185° à 220° ! Depuis fini les buses bouchées ou les bulles en cours d’impression.

 

Lundi, novembre 26 2012

Conversion de signaux i2c 3.3v 5v

Dans mon post précédent, j’ai ajouté un bus I2C sur mon routeur MR3020. Ce bus est prévu pour fonctionner en 3.3v. Le chipset du MR3020 n’est probablement pas compatible avec des signaux 5v. Étant donné que je souhaite relier en I2C un arduino en 5V avec mon MR3020, il faut convertir les signaux 3.3v en 5v et réciproquement, la communication i2c étant bidirectionnelle.

Il existe plusieurs méthodes:

  • la première, proposée par NXP est basée sur des BSS138, des petits mosfets rapides.
  • La deuxième est basée sur un chipset spécialisé le PCA9306.

 

La première méthode est assez simple, il suffit d’utiliser 1 BSS138 par ligne de signal et 4 résistances de pullup. Le principe est décrit dans cette note.

 

NXP app note

 

La réalisation peut se faire sur un morceau de perfboard malgré le fait que les BSS138 soient des CMS. Mon circuit n’est pas très propre, mais il fonctionne ;-)

 

i2c level shifter with BSS138

 

Il n’y a plus qu’à câbler les lignes L1 et L2 côté 3.3v sur les lignes SCL et SDA sur MR3020 et les lignes L1 et L2 côté 5V sur l’Arduino ou autre composant i2c 5v.

On peut retrouver ce circuit chez adafruit pour environ 4$ avec 4 lignes de signal.

Logic level converter

 

Passons maintenant au circuit à base de PCA9306. C’est le circuit que j’ai décidé d’utiliser sur le MR3020 pour la bonne raison que j’avais commandé des BSS138 et des PCA9306 donc je préfère utiliser le circuit spécialisé pour la conversion de niveaux sur bus i2c.

PCA9306 pinout

 

La lecture du datasheet nous indique le schéma pour mettre en oeuvre le convertisseur.

Schéma d’utilisation du PCA9306

Un petit tour chez Sparkfun nous confirme le schéma d’utilisation de ce composant.

Breakout board

Schéma Sparkfun

Attention toutefois, je n’ai pas le même « form factor » que le PCA9306 de sparkfun et la masse n’est pas au même endroit comme le confirme le datasheet. Suivant le boîtier, la masse est en 1 ou 4…

 

Pinning

 

Le circuit est réalisé sur une perfboard. J’ai mal coupé la perfboard et elle s’est cassée… quel c… mais bon le circuit marche quand même !

 

Pour souder le PCA9306, il faut un peu de patience et de bons yeux. Voilà une petite vidéo résumant la mise en place du PCA9306 sur une perfboard.

 

PCA9306

 

Convertisseur

 

Comme la dernière fois, nous allons tester l’I2C mais cette fois avec un composant i2c 5V, une horloge DS1307.

DS1307

 

On câble 5v, GND, SDA, SLC

Tests en cours

 

On lance « i2cdetect » sur le MR3020.

i2c-detect

 

Parfait, le convertisseur fonctionne, notre DS1307 est en 0×68.

 

La suite avec le branchement de l’arduino ;-)

Lundi, novembre 12 2012

MR3020 et I2C avec les GPIO

La torture du MR3020 continue ! Comme je l’avais mentionné dans le post précédent, il me faut un bus i2c pour communiquer avec le contrôleur de mon robot qui sera basé sur un Arduino. Il existe de nombreuses GPIO sur le MR3020 mais certaines sont indisponibles car utilisées par le processeur ( initialisation de la flash par ex ). D’autres sont disponibles, comme les LED ou les interrupteurs. Je pourrais utiliser ces GPIO mais c’est dommage de supprimer des fonctionnalités du routeur…

Le routeur MR3020 a un cousin qui dispose de 2 GPIO non utilisées sur sa carte: les GPIO 7 et 29. Nous allons donc rechercher si sur notre routeur elles existent aussi. La page openwrt du MR3020 ne mentionne pas l’utilité de ces 2 GPIO mais qui sait… elles existent peut-être aussi sur ce routeur !

Pour les retrouver, on va d’abord décharger le module de gestion des LEDS pour être sûr de ne pas utiliser ces GPIO.

rmmod leds_gpio

Ensuite, on exporte ces 2 GPIO et on les place en mode OUTPUT.

cd /sys/class/gpio/
echo 7 > export
echo 29 > export
echo out > gpio7/direction
echo out > gpio29/direction

Les GPIO sont prêtes pour être utilisées. Afin de les repérer facilement sur la carte à l’aide de l’oscilloscope, on va générer un signal d’horloge bidon avec une fréquence peu élevée à l’aide d’un script « quick and dirty » en python.

import sys
import time
 
while True:
        value = open("/sys/class/gpio/gpio7/value","w")
        value.write(str(0))
        time.sleep(.0005)
        value.write(str(1))
        value.close()
        time.sleep(.0005)

Après quelques minutes de recherche, le signal carré est localisé sur les les pattes des résistance 15 et 17, comme sur son cousin le WR703N. Les autres pattes de ces résistances sont à la masse. Ce sont donc des resistances de pulldown mais à quoi servent-elles ? mystère … En tout cas, elles vont me servir ;-)

 

Le signal carré

 

R15 et R17 donnent accès aux GPIO 7 et 29

 

Reste maintenant une opération relativement délicate: dessouder ces 2 minuscules résistances et souder des fils sur

  • R15
  • R17
  • GND
  • +3.3v
  • +5v

 

Résistances supprimées et fils soudés.

 

Oui, oui, c’est minuscule ! La preuve si vous comparez avec une résistance classique:

Les CMS font mal aux yeux :-)

 

Ensuite passons à la masse. Elle sera prise sur les pattes de l’interrupteur de sélection du mode.

Masse

 

Le 3.3v que l’on prendra sur les pattes de ce que je pense être un régulateur.

3.3v

 

Et pour finir le 5V. Il est optionnel mais je pourrais en avoir besoin plus tard. Autant le câbler tout de suite.

5V

 

Pour résumer les positions des différentes lignes, rien ne vaut une petite photo d’ensemble.

le bus i2c prend forme

L’i2c étant un bus à collecteur ouvert, il faut placer des résistances de pullup sur les lignes SDA et CLK. Des résistances de 10k sont adaptées pour ça.

Un petit connecteur est réalisé sur un bout de protoboard.

Connecteur

 

Voilà, c’est presque terminé. Pour tester, je vais utiliser une eeprom i2c venant de chez HobbyElectro, le magasin en ligne créé il y a quelques temps par Furrtek.

 

Il faut configurer et charger le noyau i2c-gpio-custom en créant un fichier /etc/modules.d/99-i2c contenant la ligne

i2c-gpio-custom bus0=0,7,29

c’est tout ;-)

Linux est maintenant capable de dialoguer en i2c sur les GPIO 7/29. Elle n’est pas belle la vie ?

 

Il suffit alors de câbler notre petite eeprom en suivant le datasheet.

Eeprom 24AA256

 

On ne branchera que VSS ( masse ) , Vcc, SCL et SDA.

 

Montage rapide

L’utilitaire i2c-detect permet de scanner le bus à la recherche d’une adresse i2c.

Trouvé ! l’adresse est 0×50

 

Tout marche, l’eeprom est trouvée en 0×50. Parfait !

Bientôt la suite avec l’Arduino…

Dimanche, novembre 11 2012

WebPlug: la domotique en utilisant un arduino


Bonjour à tous.

Aujourd’hui, je vais vous montrer un des trucs les plus cools que l’on puisse faire avec un arduino: contrôler des appareils. Quand je dis “appareils”, je parle de vos lampes, de votre grille-pain…

Voici de quoi vous aurez besoin:

  • Tout d’abord, un Arduino. N’importe quel modèle conviendra. J’utilise un vieux Mega 1280 parce qu’il a beaucoup d’I/O, mais même le petit Mini Pro de chez sparkfun ferait l’affaire.

  • Ensuite, il nous faut un Shield Ethernet. J’utilise l’officiel, mais là encore il existe de nombreux modèles qui feraient l’affaire.
  • Des cartes à relais. J’ai trouvé des cartes opto-isolées à 4 relais chez YourDuino . Ils vendent des trucs dingues à de super prix, je vous les recommande fortement. 8 dollars pour une carte à 4 relais, c’est une super affaire. Ils vendent aussi des cartes à 1 et 8 relais.
  • Il vous faudra aussi quelques câbles.

Il nous faudra quelques autres trucs pour terminer le projet, mais en attendant c’est déjà pas mal.

Etape 1: le module ethernet.

La première chose à faire c’est de faire fonctionner le module ethernet. Assemblez les deux et branchez-les:

Ensuite, uploadez l’exemple “WebServer” de l’IDE arduino. Ensuite, utilisez votre navigateur pour aller à l’adresse IP spécifiée au tout début du code (et qui devrait être 192.168.1.177):

Cool, l’arduino répond! On peut passer à l’étape suivante!

Etape 2: contrôler les I/O sur commande

Maintenant, nous avons besoin de contrôler les entrées/sorties digitales en utilisant des URL. J’ai trouvé un tuto super sympa à ce propos sur le site de bildr. Le but est d’allumer et d’éteindre des LEDs, je l’ai donc un peu modifié pour qu’il corresponde à mes besoins:

//ARDUINO 1.0+ ONLY
//ARDUINO 1.0+ ONLY

#include <Ethernet.h>
#include <SPI.h>
boolean reading = false;

const int DLY = 100;
const int RLY1 = 30;
const int RLY2 = 31;
const int RLY3 = 32;
const int RLY4 = 33;

byte ip[] = { 192, 168, 0, 177 };   //Manual setup only
byte gateway[] = { 192, 168, 0, 1 }; //Manual setup only
byte subnet[] = { 255, 255, 255, 0 }; //Manual setup only

// if need to change the MAC address (Very Rare)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

EthernetServer server = EthernetServer(80); //port 80

void setup(){
  Serial.begin(9600);

  pinMode(RLY1, OUTPUT);
  pinMode(RLY2, OUTPUT);
  pinMode(RLY3, OUTPUT);
  pinMode(RLY4, OUTPUT);

  Serial.println("Testing relays...");

  for (int i=RLY1; i<=RLY4; i++) {
    digitalWrite(i, LOW);
    delay(DLY);
    digitalWrite(i, HIGH);
    delay(DLY);
    digitalWrite(i, LOW);
    delay(DLY);
  }

  Ethernet.begin(mac);
  //Ethernet.begin(mac, ip, gateway, subnet); //for manual setup

  server.begin();
  Serial.println(Ethernet.localIP());
}

void loop() {
  checkForClient();
}

void checkForClient(){

  EthernetClient client = server.available();

  if (client) {

    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;

    while (client.connected()) {
      if (client.available()) {

        if(!sentHeader){
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          sentHeader = true;
        }

        char c = client.read();

        if(reading && c == ' ') reading = false;
        if(c == '?') reading = true; //found the ?, begin reading the info

        if(reading){
           switch (c) {
            case '1':
              Serial.println("RLY1 ON");
              triggerPin(RLY1, true, client);
              break;

            case '2':
              Serial.println("RLY2 ON");
              triggerPin(RLY2, true, client);
              break;

            case '3':
              Serial.println("RLY3 ON");
              triggerPin(RLY3, true, client);
              break;

            case '4':
              Serial.println("RLY4 ON");
              triggerPin(RLY4, true, client);
              break;

            case '5':
              Serial.println("RLY1 OFF");
              triggerPin(RLY1, false, client);
              break;

            case '6':
              Serial.println("RLY2 OFF");
              triggerPin(RLY2, false, client);
              break;

            case '7':
              Serial.println("RLY3 OFF");
              triggerPin(RLY3, false, client);
              break;

            case '8':
              Serial.println("RLY4 OFF");
              triggerPin(RLY4, false, client);
              break;
          }
        }

        if (c == '\n' && currentLineIsBlank)  break;

        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }

    delay(1); // give the web browser time to receive the data
    client.stop(); // close the connection:
  }
}

void triggerPin(int pin, boolean on, EthernetClient client){
  if (on == false) {
    digitalWrite(pin, HIGH);

    client.print("Turning off relay ");
    client.println(pin);
    client.print("<br>");
  } else {
    digitalWrite(pin, LOW);

    client.print("Turning on relay ");
    client.println(pin);
    client.print("<br>");
  }
  delay(DLY);
}

Maintenant, branchez la carte à relais: (I/O 30 -> relais 1, 1/0 31 -> relais 2 et ainsi de suite):

Ulploadez le code et ouvrez le Serial Monitor. Vous devriez entendre les relais cliqueter. Voici une vidéo que j’ai faite avec un délai un peu plus court (CLY=10) et deux carte de quatre relais:

Click here to view the embedded video.

En voici une autre. Cette fois ci j’utilise mon iPhone pour accéder à distance aux relais. Pour y parvenir, il vous faudra paramétrer votre box pour rediriger le port voulu vers l’arduino.

Click here to view the embedded video.

Voici la première partie du projet terminée, maintenant il nous faut une boite pour y mettre notre projet.

- page 1 de 10