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 0x50

 

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

Bientôt la suite avec l’Arduino…

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