Projet de robot Wifi – Torture d’un routeur TPLink MR3020

J’ai en projet un robot piloté en wifi depuis un smartphone ou un PC. La base de ce robot est un routeur très économique le TP-Link MR3020.

MR3020

 

Seulement voilà, j’ai à brancher sur ce routeur:

  • Un arduino sur lequel seront connectés moteurs ( des servos modifiés ) et capteurs.
  • Une webcam basique ( Logitech CZ110 ).

 

Au départ j’avais en tête d’ajouter une connectique USB surement présente sur le microprocesseur du routeur, comme j’avais fait il y a quelque temps sur un routeur Netgear. Seulement voilà, le datasheet du microprocesseur n’est pas public et son « form factor » le rend très difficile à bidouiller.

Vous me direz, un usb, ça suffit pour la webcam. Sauf que le routeur n’a que 4Mo de mémoire flash ce qui rend impossible l’ajout de logiciels comme python et mjpeg-streamer. Il faut donc ajouter de la mémoire supplémentaire. Pour cet ajout 2 possibilités: 1 MMC utilisée avec des lignes GPIO ou 1 SD / clef en USB. Les lignes GPIO étant peu nombreuses ( sauf à retirer interrupteurs et LED ) j’ai opté pour l’USB ainsi qu’un lecteur de µSD. Je vais aussi utiliser 2 lignes GPIO en I2C pour communiquer avec l’arduino.

Je me suis procuré un hub USB STOREX à 3€ pour le démonter et récupérer son PCB. Malheureusement le hub n’est pas autoalimenté mais la consommation de la caméra + SD étant très limitée on va y remédier en branchant l’alimentation du hub sur l’USB.

Allez, hop on démonte la boîte qui est collée. Seule la carte nous intéresse. L’alimentation est inutile dans ce projet, on va la mettre de côté pour plus tard.

Le hub USB

 

La prise d’alimentation doit être retirée ainsi que les connecteurs USB afin de gagner de la place et du poids.

Hub usb / Alimentation

 

Le lecteur de µSD à 3 € est aussi démonté afin d’accéder facilement aux pistes USB. Il est démonté « proprement » pour être ensuite ré-assemblé, la carcasse de la prise USB étant indispensable au maintient de la carte µSD.

µSD reader

 

Le lecteur peut alors être directement soudé sur le hub USB toujours dans l’idée de gagner de la place.

Le hub usb

 

Ensuite, on peut ré-assembler le lecteur et le coller sur le hub.

Le hub et le lecteur de µSD

J’ai abîmé quelques pistes en dessoudant le connecteurs USB. Il faut dire qu’à 3€, le PCB ne vaut pas grand chose… mais bon c’est quand même de l’epoxy et non de la bakélite.

 

Retournons maintenant sur le routeur. Afin d’augmenter sa portée assez réduite, nous allons lui ajouter une antenne externe. Il suffit pour cela de supprimer le shunt en J4 et de venir souder l’âme du câble d’antenne sur la piste à côté de l’inscription J4 (1) et la masse sur le pad à côté (2).

 

Antenne externe en J4

 

C’est tout petit et en zoomant ont voit bien mes gros pâtés !

 

Connexion de l’antenne externe

 

voilà le résultat avec le routeur dans son coffret d’origine.

Antenne externe et console série

 

Pour ne pas abîmer le routeur, je n’ai pas dessoudé son port USB. J’ai juste soudé directement des fils sous le PCB pour les relier au hub. Un coup de fer et l’on peut rendre au routeur sa fonction d’origine. De plus, à cet endroit, la place occupée par le connecteur ne me gène pas.

 

La caméra est installée avec une nouvelle connectique à base de barette sécable en 2.54.

Le MR3020, son hub usb et la webcam

 

Voilà c’est tout pour les modifications matérielles. La suite concernera la recherche de GPIOs libres et la partie soft.

 

GPIO sur l’interrupteur de sélection du mode

 

Voilà par exemple une piste. Plutôt que de retirer les LEDS qui ont leur utilité, on peut retirer l’interrupteur de sélection du mode qui ne nous sert pas. Ça nous donnera nos 2 GPIO  (1: GND, 2: GPIO 18 & 20) pour l’i2c. Mais avant de faire ça, je vais voir s’il n’y a pas d’autres GPIO peu utiles voire inutiles comme sur son cousin le WR703N

 

Modifier des servos MG995 pour une rotation continue

Afin de motoriser un véhicule télécommandé je vais utiliser des servos modifiés pour autoriser une rotation continue.

 

Normalement les servos classiques sont prévus pour des rotation de 120 ou 180° mais pas 360. Cela est du à la présence d’un potentiomètre pour l’asservissement du moteur et d’une butée sur les engrenages. En retirant ces deux éléments, on peut autoriser la rotation continue du servo.

La victime

On démonte l’arrière du servo en retirant les 4 vis.

On démonte

Le potentiomètre est dessoudé de la carte du servo. Une vis est à retirer pour enlever le potentiomètre du boitier. Nous n’en avons plus besoin, il peut être mis de côté pour un autre projet ( potentiomètre de 5K ).

On retire le potentiomètre

Le potentiomètre est remplacé par 2 résistances de 2.2K permettant de bloquer le point « milieu du servo »

Résistance

Pour la partie mécanique, il faut retirer la butée d’un coup de dremel.

La butée

 

Pignons

 

Sans la butée

Encore 3 à modifier…

Encore 3 à modifier

 

Des roues de voiture radiocommandée 1/10 vont être montées sur les servos. Pour celà, il est nécessaire de disposer d’un adaptateur qui n’existe pas… On va donc l’imprimer 😉

Ressortons openscad.

// Hex hub for RC wheel

hex_thickness=5;
hex_dia=13;
arm_dia=11;
arm_length=13;
bolt_dia=3;
servo_head_dia=5.5;
servo_head_thickness=3;
difference()
{
  union()
  {
    cylinder(r=hex_dia/2,h=hex_thickness,$fn=6);
    translate([0,0,hex_thickness]) cylinder(r=arm_dia/2,h=arm_length,$fn=50);
  }
  cylinder(r=(bolt_dia+0.2)/2,h=arm_length+hex_thickness,$fn=50);
  translate([0,0,arm_length+hex_thickness-servo_head_thickness]) cylinder(r=servo_head_dia/2,h=servo_head_thickness,$fn=50);
}

 

Adaptateur

 

Et hop des adaptateurs !

L’adaptateur

 

L’objet est disponible sur thingiverse

 

La suite bientôt avec la modification d’un routeur TP-LINK MR3020 pour piloter le robot.

Réparation et bidouillages, 3 hacks « quick and dirty »

Réparation d’un poste de radio / CD

Aujourd’hui, réparation d’un poste CD / Radio qui ne marche plus. Le poste s’allume mais le son est très faible, à peine audible. Soit c’est l’ampli soit le dispositif de réglage du son.

Je démonte la bête et inspecte visuellement la carte.

La bête

 

Rien a signaler, aucun composant à l’aspect dégradé. Le potentiomètre du volume ne me semble pas très « doux » à l’utilisation, peut-être que la panne vient de lui. Ayant assisté à un « cours » de circuit bending lors de Vivacités à Rennes, j’ai vu comment hacker les circuits audio en passant ses doigts sur la carte électronique ( ne faites pas ça avec des tensions > 12v… ). Du coup je promène mes doigts sur les pattes du potentiomètre de volume et le son revient nettement plus fort malgré une grande distorsion. Ça confirme mes doutes, le potentiomètre est fichu. Je le dessoude rapidement mais voilà, il a 7 pattes et les potentiomètres de volume que j’ai récupéré dans d’autres appareils n’en ont que 6.

Le fautif

 

Quelques minutes de reverse engineering et quelques shunts plus tard, le poste marche !

La modif

Je colle au pistolet à colle le nouveau potentiomètre au dos de la carte et remonte l’ensemble.

Un hack « quick and dirty » mais qui a le mérite de marcher et d’avoir sauvé de la poubelle ce malheureux poste de radio.

 

Modification d’une caméra Drift HD170

Sur ce genre de caméras embarquées, comme sur les célèbres Gopro, l’image est très belle mais la prise de son est nulle. Du coup, pourquoi ne pas remplacer le micro d’origine par une prise jack permettant de brancher tout type de micro ?

 

La modification ne nécessite que quelques minutes:

  • démontage de la caméra
  • découpe du joint
  • dessoudage du  micro (1)
  • soudage de la prise jack à la place (2)
  • Collage à la colle à chaud du jack
  • Remontage
Caméra

 

La prise jack

 

Le micro

 

La jack est soudée à la place du micro

 

Ce petit hack de rien du tout permet de placer le micro au bout d’une rallonge, dans son casque, sur le vélo… ou d’utiliser une autre source audio de meilleure qualité comme un micro Zoom H1.

 

 LabFab et BristleBot

Aujoud’hui, je suis passé au LabFab de Rennes. @Aristofor était en train de tester des « bristlebot » pour animer des ateliers avec les enfants. J’avais déjà vu ces bricolages de brosses à dents sur le net, mais je n’avais jamais essayé. C’est maintenant chose faite, j’ai fait mon prototype 🙂

J’ai juste abaissé le centre de gravité en plaçant le vibreur entre les poils de la brosse et non sur le dessus. J’ai aussi ajouté des antennes qui le stabilisent et qui en vibrant aident à le guider le long des obstacles.

Bref, inutile mais amusant à faire avec les enfants !

BristleBot

 

Hack d’un caisson de basse « JBL Creature » et ajout d’une télécommande

A la suite de mon déménagement, j’ai modifié la configuration des mes équipements TV / DVD… la TV est maintenant reliée par sa sortie audio RCA à un caisson de basse JBL créature. Seulement voilà, pour régler le son sur le caisson de basse, il faut se lever pour atteindre les 2 boutons de réglages présents sur l’un des satellites. En plus il faut allumer le caisson via un interrupteur situé sur la face arrière. Bref, pas pratique tout ça d’autant que la TV ne pilote pas le volume sur sa sortie RCA…

 

2 possibilités:

  •  Racheter un nouveau caisson / ampli.
  • Ajouter une fonction télécommande IR sur le caisson existant.

 

Vous vous doutez bien que j’ai opté pour la deuxième solution 😉

Aller, c’est parti, sortons les tournevis et voyons ce que l’on peut tirer de la bestiole.

 

Le caisson et ses 2 satellites

 

Tout d’abord, explorons le satellite de droite qui contient le contrôle du volume.

Satellite de droite

 

Les vis sont standard et facilement accessibles.

Humm, des touches sensitives…

 

Nous avons affaire à des touches sensitives. Ça me semble compliqué de venir se greffer à cet endroit d’autant que la place est très limitée.

On va refermer cette partie et passer au caisson de basse.

 

Vue sur les connexions des interrupteurs sensitifs

 

Vous remarquerez par ailleurs la construction très propre du caisson. PCB de bonne qualité, soudures très propres, joints en mousse… Bravo JBL !

 

Pour démonter le caisson, il faut retirer les bouchons des potentiomètres de réglage des basses/aiguës.

Attention, il sont collés avec une sorte de colle néoprène. Ça adhère plutôt bien, il faut forcer doucement mais fermement jusqu’à ce que le bouchon se décolle.

Les bouchons à retirer

 

La suite est très classique. Il faut dévisser l’écrou de fixation du potentiomètre.

Potentiomètre

 

Ensuite les vis dessous.

Les vis

 

Une belle carte, des composants traversants, pas de CMS, voilà qui sera plus facile pour bidouiller 🙂

L’intérieur de la bête

 

Ensuite vient un long travail d’inventaire, il faut noter toutes les références des CI et chercher sur le net les datasheet des constructeurs à la recherche d’un composant de réglage du volume.

Bingo ! un PT2256 de chez PTC est présent dans un coin de la carte.

PT2256

 

Voyons en détails le datasheet du constructeur.

 

Datasheet – 1

Un potentiomètre numérique de réglage du volume, voilà qui semble bien prometteur.  Regardons son câblage et un circuit type.

 

Pinout

 

2 pins UP et DOWN ? Cool 😉

Sample

 

Alors là encore mieux, il suffit de mettre les PINS UP ou DWN à la masse pour contrôler le volume. Simple !

Il est temps de sortir un Arduino et 2 optocoupleurs pour tester le pilotage de ces 2 broches.

Test in progress…

Tout marche parfaitement. Il va donc falloir passer à autre chose que la carte de type « breadboard ».

Je vais intégrer tout ça sur une plaque à bandes, ça sera vite fait et relativement propre.

Question alimentation, nous avons du 18v alternatif. Pas courant…

L’alimentation

 

Je voudrais aussi piloter l’alimentation à l’aide d’un relais. Chose étrange, l’arrivée de courant passe par le connecteur de droite et l’inter par celui de gauche. Le boitier est en réalité en « veille » permanente.

Autre chose, le caisson est éteint lorsque l’interrupteur est fermé, et allumé lorsqu’il est ouvert. Il faudra faire attention lors du branchement du relais en utilisant les bons contacts.

L’interrupteur d’alimentation

Le circuit de redressage est sur la carte à l’intérieur du caisson. On a 26v DC en sortie.

 

La carte des connecteurs

Ma carte est prête seulement je me trouve confronté à un problème de surchauffe du LM7805 qui régule la tension de mon montage. Logique, il est alimenté en 26v et il est traversé par un courant d’environ 100mA. Il va falloir trouver une autre astuce.

Nouveaux tests

 

La carte avec son ATMEGA 168, 2 optocoupleurs, et un relais.

La carte de commande

Revenons à l’alimentation. J’ai trouvé un régulateur DC/DC 24v -> 10v qui devrait soulager mon 7805. Je sais c’est tordu d’avoir 2 régulateurs mais je n’ai rien d’autre sous la main… Celui là provient d’un chargeur de téléphone pour voiture.

Convertisseur DC/DC 12,24V / 10V

 

Les branchement sont faits directement sur la carte du caisson.

Les branchements

 

  • Masse utilisée pour le réglage du volume
  • Volume +
  • Volume –
  • Masse
  • +26v

Devant on retrouve les branchements du relais en parallèle sur l’interrupteur.

Pilotage de l’alimentation

Le capteur IR (1) est glissé puis collé sous le potentiomètre des basses (2).

Récepteur IR

 

Une fente est réalisée à la DREMEL dans la face avant.

Face avant

 

Voilà tout est installé. Sauf que… le convertisseur DC/DC génère des parasites… il est trop près de la carte.

Mauvaise idée

 

Monté différemment, les parasites disparaissent.

C’est mieux
  •  Le régulateur DC/DC
  • La carte de commande
  • Le capteur IR

 

Schéma

 

  • J1,J2: Réglage du volume.
  • J3; alimentation.
  • La LED n’est pas importante, elle a été utile pour les tests.

 

Voilà le code correspondant. Pour le moment les codes RC5 sont temporaires, le temps que je fasse quelques réglages avec ma télécommande universelle.

J’ai utilisé la librairie IRremote qui m’a grandement facilité la vie 🙂

#include 

#define RECV_PIN 8
#define VOLUP_PIN 10
#define VOLDWN_PIN 9
#define PWR_PIN 6

IRrecv irrecv(RECV_PIN);

decode_results results;
bool power_state=0;

void setup()
{
  //Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(VOLUP_PIN,OUTPUT);
  pinMode(VOLDWN_PIN,OUTPUT);
  pinMode(PWR_PIN,OUTPUT);
  digitalWrite(VOLUP_PIN,LOW);
  digitalWrite(VOLDWN_PIN,LOW);
  digitalWrite(PWR_PIN,LOW);

}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value, HEX);
    switch (results.value)
    {
      case 0x80263D11:
        for (int i=0;i<3;i++)
        {
          digitalWrite(VOLUP_PIN,HIGH);
          delay(300);
          digitalWrite(VOLUP_PIN,LOW);
        }
        break;
      case 0x80263D10:
        for (int i=0;i<3;i++)
        {
          digitalWrite(VOLDWN_PIN,HIGH);
          delay(300);
          digitalWrite(VOLDWN_PIN,LOW);
        }
        break;
      case 0x8026BD59:
      {
        if (power_state)
          {
          digitalWrite(PWR_PIN,LOW);
          delay(2000);
          power_state=0;
          }
          else
           {
          digitalWrite(PWR_PIN,HIGH);
          delay(1000);
          power_state=1;
           }
        }
        break;

    }
    irrecv.resume(); // Receive the next value
  }
}

Les puristes excuseront le code vide fait et surtout le fait d'utiliser un arduino pour une application aussi simple. J'ai fait avec ce que j'avais sous la main et prendre un autre AVR m'aurait demandé beaucoup de temps d'apprentissage / développement. Mais c'est sur qu'un ATTINY serait plus adapté 😉

Ça marche parfaitement, plus besoin de me lever pour changer le volume 😉
Je rajouterai surement une temporisation pour éteindre automatiquement le caisson au bout d'un certain temps pour éviter de l'oublier allumé.