Réparations du jour: un jouet et un chargeur

Allez hop, aujourd’hui j’ai a réparer un petit hélicoptère d’intérieur: un mosquito V2. Un appareil bien sympa pour les enfants mais qui à force de chuter ne fonctionne plus.L’autre réparation concerne un chargeur rapide Varta qui fait un bruit d’avion dès qu’il se met en marche.

  • Pour le petit hélicoptère, le rotor de queue ne tourne plus, du coup impossible d’avancer ou de reculer.

DSC01571

DSC01573

  • A priori la panne vient soit de la télécommande ( potentiomètre HS ) ou de l’appareil lui-même. Etant donné que c’est l’hélico qui tombe plus que la télécommande, j’ai parié sur lui. Là encore plusieurs hypothèses:
  1. Le PCB est fendu à cause des chutes
  2. Un fil s’est coupé
  3. Le moteur du rotor est H.S
  4. Les transistors de contrôle (H-bridge) du moteur sont morts

Pour le savoir, il faut ouvrir la bête. Quelques vis plus loin, on accède à la carte et à la batterie.

DSC01567


Sous celle-ci, deux fils qui vont au moteur de queue. L’un d’eux est coupé au ras de la soudure côté PCB. Au moins une panne facile à trouver sans équipements de test. Juste de bon yeux 😉

DSC01568

Un coup de fer à souder plus loin, on peut tester. Ça marche, et hop un jouet qui ne finira pas à la poubelle (enfin pas tout de suite…).

  • Deuxième objet de la journée, le chargeur. Un bruit épouvantable dès que l’on charge des piles. Facile à identifier, c’est le ventilateur de refroidissement des piles qui vibre.

DSC01569

DSC01570

Allez hop, on démonte la bête. La réparation est toute simple:

  1. Le ventilateur est nettoyé de toutes les poussières qui déséquilibrent les pales
  2. Le ventilateur est calé dans son logement à l’aide de colle à chaud. Ça lui évitera de vibrer.

Le tout en vidéo: [bliptv]AYG0iGYA[/bliptv]

BusPirate, mise à jour sous MacOSX

side.450

BusPirate, sous ce drôle de nom ce cache une petite « carte » électronique (opensource / openhardware valant moins de 30$ ) permettant de communiquer sur les lignes de données d’un grand nombre de composants, c’est d’une grande aide pour tester, débugger et apprendre… Les protocoles suivants sont supportés actuellement par le firmware 2.8:

  • 1-Wire
  • I2C
  • SPI
  • JTAG
  • Asynchronous serial
  • MIDI
  • PC keyboard
  • HD44780 LCD
  • 2- and 3-wire libraries with bitwise pin control
  • Scriptable binary bitbang, 1-Wire, I2C, SPI, and UART modes

Comme toujours avec les produits « open », les mise à jour sont  très fréquentes pour le plus grand bonheur de l’utilisateur.

Voici un petit screencast rapide qui vous montrera comment mettre à jour votre carte Buspirate depuis MacOSX.

Vous devez normalement disposer de python sur votre Mac. Une connaissance du « terminal » est aussi requise.

[bliptv]AYGq9Q4A[/bliptv]

http://blip.tv/file/2780303

A voir en plein écran, sinon c’est illisible…

Arduino PhotoLab – Schéma

Comme promis, voici le schéma de la carte principale du montage Arduino PhotoLab

Je débute avec Eagle alors mon schéma n’est pas forcément très clair, mais bon…

photolab

Le voici au format Eagle

  • Prise SENSORS: branchement des capteurs
  • Prise TTL: Branchement d’un convertisseur USB/TTL pour reprogrammer l’arduino.
  • Prise STROBE: Sortie pour la prise de commande du flash ou de l’appareil photo suivant l’usage.
  • Prise POWER: Alimentation 5V par transfo ou pack de piles.

Les 4 boutons permettent de se ballader dans les menus pour choisir les capteurs et changer les valeurs.

Il reste quelques ports dispo sur l’arduino pour un usage futur…

Je n’ai pas mis le schéma des capteurs. Vous pouvez en trouver plein sur le playground arduino ici. Il suffit d’utiliser une prise jack 3.5mm male et de la brancher sur la prise SENSORS. Vous avez alors VCC,  GND, DATA. Où DATA est un voltage entre 0 et 5 v.

Je ne suis pas sûr que mon système soit utilisable tel quel chez vous, mais vous pouvez vous en inspirer pour créer le votre. En tout cas, chez moi ça marche très bien 🙂

Pour ce qui est du code, le voici:

[code]

#include <LCD4Bit.h>

//BUG ?
#undef int()
// END BUG
#include <stdio.h>

LCD4Bit lcd = LCD4Bit(2);

//#define DEBUG 1

// global defs
#define shootPin  11
#define sensorPin 4
#define bt1Pin 3
#define bt2Pin 4
#define bt3Pin 5
#define bt4Pin 6
#define ledPin 13 //digital

#define MAXMENU 4

#define MENUSENSOR 1
#define MENUSTROBEDELAY 2
#define MENURUN 3

#define MODESENSOR 1

#define NO 0
#define YES 1
#define TEST 2

#define SOUNDSENSOR 0
#define IRSENSOR 1
#define CONTACTSENSOR 2
#define LIGHTSENSOR 3

volatile unsigned int menu0Pos = MENUSENSOR;
volatile unsigned int debounce = 0;
volatile unsigned int modeSensor = 0;
volatile unsigned int modeDrop= 0;
volatile unsigned int modeApp = MODESENSOR;
volatile unsigned int sensorType = IRSENSOR;
volatile unsigned int firstPass = 0;
volatile unsigned int sndLevel = 0;

volatile int strobeDelay = 10;

void setup() {
pinMode(ledPin,OUTPUT);
pinMode(shootPin,OUTPUT);
pinMode(bt1Pin,INPUT);
pinMode(bt2Pin,INPUT);
pinMode(bt3Pin,INPUT);
pinMode(bt4Pin,INPUT);
setLed(1);
lcd.init();

/*lcd.commandWrite(0x0F);//cursor on, display on, blink on.  (nasty!)
*/
lcd.clear();
lcd.printIn(« equinoxefr.org »);
lcd.cursorTo(2, 0);  //line=2, x=0.
lcd.printIn(« Photo lab v0.3″);
delay(2000);
fillLine(2, »FW Trigger »);
delay(2000);
lcd.clear();
setLed(0);
#ifdef DEBUG
Serial.begin (9600);
Serial.println(« start »);                // a personal quirk
#endif
}

void loop() {
int val=0;
int keyFactor=1;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  SENSOR SECTION
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (modeSensor)
{
while (1)
{
val=analogRead(sensorPin);
switch (sensorType)
{
case LIGHTSENSOR:

if (val > 500)
{
shoot();
}
//      char buffer[50];
//      strobeDelay=getValue(strobeDelay,-1,9999);
//      itoa(strobeDelay,buffer,DEC);
//      fillLine(2,buffer);
break;

case IRSENSOR:

if (val < 900)
{
shoot();
}
//      char buffer[50];
//      strobeDelay=getValue(strobeDelay,-1,9999);
//      itoa(strobeDelay,buffer,DEC);
//      fillLine(2,buffer);
break;

case SOUNDSENSOR:
if (firstPass)
{
fillLine(2, »Getting snd level »);
sndLevel=soundLevel();
clearLcdLine(2);
firstPass=0;
}
val = analogRead(sensorPin);

if ((val > (sndLevel + 40)) && (val < 1024))
{
shoot();
}

break;

case CONTACTSENSOR:
if ( val < 500)
{
shoot();
}
break;
}
}
}

/*
#ifdef DEBUG
Serial.println(menu0Pos,DEC);
#endif
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  MENU SECTION
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

switch (menu0Pos)
{
case MENUSTROBEDELAY:
fillLine(1, »Strobe delay ms »);
modeSensor=0;
strobeDelay=getValue(strobeDelay,-1,9999);
if (strobeDelay==-1)
{
fillLine(2, »not used »);
}
else
{
char buffer[50];
itoa(strobeDelay,buffer,DEC);
fillLine(2,buffer);
}
break;
case MENUSENSOR:
fillLine(1, »Select sensor »);
sensorType=getValue(sensorType,0,3);
switch(sensorType)
{
case SOUNDSENSOR:
fillLine(2, »SOUND »);
firstPass=1;
break;
case IRSENSOR:
fillLine(2, »IR BARRIER »);
break;
case CONTACTSENSOR:
fillLine(2, »CONTACT »);
break;
case LIGHTSENSOR:
fillLine(2, »IR LIGHT »);
break;
}
//digitalWrite(ledPin, HIGH);
modeSensor=0;
break;

case MENURUN:
if (!modeSensor)
{
fillLine(1, »***SHOOT MODE*** »);
}
modeSensor=1;
break;
}
getMenu();
}

//
//  soundLevel()
//
int soundLevel()
{
int value=analogRead(sensorPin);

Serial.println(« Getting sound level… »);
for(int i=0; i < 50 && !modeSensor; i++)
{
value = ( value + analogRead(sensorPin) ) / 2;
delay(50);
}
Serial.println(« Done! »);

return value;

}

void clearLcdLine(int line)
{
lcd.cursorTo(line, 0);
lcd.printIn( »                     « );
}

void fillLine(int line,char* str)
{
char buffer[21];
int len=strlen(str);
for (int i=0;i<20;i++)
{
if (i < len)
{
buffer[i]=str[i];
}
else
{
buffer[i]=’ ‘;
}
}
lcd.cursorTo(line,0);
lcd.printIn(buffer);
}

void shoot()
{
if (strobeDelay > 0 )
{
delay(strobeDelay);
}
digitalWrite(shootPin,HIGH);
delay(10);
digitalWrite(shootPin,LOW);
fillLine(2, »Shoot ! »);
digitalWrite(ledPin,HIGH);
delay(3000);
digitalWrite(ledPin,LOW);
clearLcdLine(2);

}

void getMenu()
{
int bt1=digitalRead(bt3Pin);
int bt2=digitalRead(bt4Pin);

if (!bt1 && !bt2)
{
return;
}

if (bt1 && menu0Pos < MAXMENU)
{
menu0Pos++;
}
if (bt2 && menu0Pos > 0)
{
menu0Pos–;
}

}

int getValue(int value, int mini, int maxi)
{
unsigned int keyFactor=1;
int bt1=digitalRead(bt1Pin);
int bt2=digitalRead(bt2Pin);

if  (value < 50 )
{
keyFactor=1;
}
else
{
if (value >= 50 )
{
keyFactor=10;
}
}
if  ( bt1 )
{
value+=keyFactor;
}
if  ( bt2 )
{
value-=keyFactor;
}

if ( value <= mini)
{
value=mini;
}
else
{
if (value >= maxi)
{
value=maxi;
}
}
/*
if ( bt1 && bt2 )
{
modeSensor=0;
fillLine(2, »switch off »);
}
*/
return value;

}

void setLed(int value)
{
if (value)
{
digitalWrite(ledPin,HIGH);
}
else
{
digitalWrite(ledPin,LOW);
}
}
[/code]

Modifier un pied à coulisse digital

Aujourd’hui, j’avais besoin de mon pied à coulisse, seulement voilà, comme d’habitude, plus de pile. Une satanée pile au lithium, chère, polluante… Pourquoi ne pas la remplacer par une pile standard, ce qui me permettra d’utiliser une pile rechargeable ? Allez hop, un tour dans la « boite à récup » à la recherche d’un porte pile. J’ai trouvé mon bonheur sur une vieille carte mère d’imprimante. Par chance, mon pied à coulisse dispose sur le coté d’un petit connecteur. Après quelques tests, il s’avère qu’il y a dessus une ligne d’alimentation 1.5V et une ligne série pour communiquer avec un PC ou un µC par exemple.

Cinq minutes plus tard, me voici avec mon nouveau jouet, certes un peu plus encombrant mais oh combien plus pratique.