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 😉
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
Oui, oui, c’est minuscule ! La preuve si vous comparez avec une résistance classique:
Ensuite passons à la masse. Elle sera prise sur les pattes de l’interrupteur de sélection du mode.
Le 3.3v que l’on prendra sur les pattes de ce que je pense être un régulateur.
Et pour finir le 5V. Il est optionnel mais je pourrais en avoir besoin plus tard. Autant le câbler tout de suite.
Pour résumer les positions des différentes lignes, rien ne vaut une petite photo d’ensemble.
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.
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.
On ne branchera que VSS ( masse ) , Vcc, SCL et SDA.
L’utilitaire i2c-detect permet de scanner le bus à la recherche d’une adresse i2c.
Tout marche, l’eeprom est trouvée en 0x50. Parfait !
Bientôt la suite avec l’Arduino…
pas mal l’utilisation des gpio pour la création de l’i2c, pour la même problématique j’étaiat parti vers ça http://www.harbaum.org/till/i2c_tiny_usb/index.shtml sans savoir si le driver était porté dans openwrt.
Astucieux !
J’aurais bien aimer faire la même chose pour recycler mon ebook oyo dont l’écran est cassé, mais je n’ai ni le matériel ni les compétences, snif ;-(
pxa_cfcam implémente des fonctions équivalentes à celles de V4L (avec une API plus légère). Il pourrait être utile de le transformer en un device compatible V4L.
I install python on my Dlink DIR615 C2, My Dlink have 6 free gpio. I follow your python program, when router run program value on gpio always 0, i set time.sleep(10), but value not change to 1. My router install python, python-mini package.