Je cherche depuis un moment une batterie USB (PowerBank) qui permette de faire un mini UPS (Uninterruptible Power Supply) pour un Raspberry Pi. L'idée est de brancher la batterie sur le secteur (pour la charger) et en même temps d'alimenter le rPi. Ainsi s’il y a une coupure de courant le rPi est toujours alimenté par la batterie.
Il y a deux problèmes potentiels avec cette solution : il faut que la batterie puisse être chargé en même temps qu'elle fournit de l'énergie (au rPi) et surtout il faut qu'elle ne coupe pas la sortie lorsque l'alimentation secteur disparait ou réapparait. En effet, j'ai pu tester plusieurs batteries qui coupent un court instant la sortie lorsqu'on les branche ou débranche du secteur... Cela provoque un redémarrage brutal du rPi. Pas génial.
Après pas mal de recherche sur différents forums, je suis tombé sur ces petits routeurs dits "3G" (cf image). Ce sont des mini routeurs avec une batterie intégrée. L'usage de base est de brancher dessus une clé 3G, le routeur se charge ensuite de partager la connexion en WiFi ou en Ethernet. Ce qui m'intéressait au début était donc surtout la batterie : plusieurs personnes indiquaient qu'il n'y avait pas de coupures en cas de plug/unplug du secteur. Donc ça peut fonctionner comme UPS pour rPi. En bonus on a une carte avec un SoC RT5350F avec du WiFi, de l'Ethernet et une prise USB... Et on va le voir ici, il est possible d'installer OpenWRT dessus !
Point galère : il existe des tas de clones (sur ebay, amazon, et autres) de ces cartes. Certains n'ont que 16M de RAM (ce qui limite pas mal l'usage avec OpenWRT). Toutes n'ont pas câblé de la même manière les GPIO et le port Ethrenet... Tout cela fait que ça reste un peu loterie.
Je décris ci-dessous ce que j'ai pu faire pour le modèle que j'ai trouvé sur Amazon. Il ne semble plus dispo chez ce vendeur aujourd'hui. Visiblement c'est exactement le même modele que celui decrit ici, c'est semble t'il un des multiple clones existant du Hame MPR-A1.
Build d'une image OpenWRT sur mesure
Il faut d'abord télécharger l'image builder de openWRT (pour ramips/rt305x), pour la version Chaos Calmer (15.05) (attention ca fait ~1.5go):
$ wget https://downloads.openwrt.org/chaos_calmer/15.05/ramips/rt305x/OpenWrt-ImageBuilder-15.05-ramips-rt305x.Linux-x86_64.tar.bz2
Ou https://downloads.openwrt.org/snapshots/trunk/ramips/rt305x/OpenWrt-ImageBuilder-ramips-rt305x.Linux-x86_64.tar.bz2
pour la version "trunk".
On extrait ensuite l'archive :
$ tar xvf OpenWrt-ImageBuilder-15.05-ramips-rt305x.Linux-x86_64.tar.bz2
Enfin il suffit de lancer la compilation pour le profile "MPR-A1" :
$ cd OpenWrt-ImageBuilder-15.05-ramips-rt305x.Linux-x86_64/
$ make image PROFILE="MPRA1"
L'image générée doit être : bin/ramips/openwrt-ramips-rt305x-mpr-a1-squashfs-sysupgrade.bin
Modification pour le modèle spécifique
Sur ma version, il faut apporter quelques modifications dans le fichier target/linux/ramips/dts/MPRA1.dts
. Ces modifications sont décrites par @tman sur ce post. Je n'ai pas repris tout les modifs qu'il propose, voici mon diff et le fichier modifié. Ces modifications concernent le mapping des GPIO et surtout le mapping du port Ethernet.
Attention : il faut bien faire le make image PROFILE="MPRA1"
apres avoir modifier le fichier dts
et pas l'inverse.
Choix des paquets
Comme je vise un usage très particulier, cad uniquement le partage de la connexion WiFi au rPi, j'ai viré quelques paquets :
$ make image PROFILE="MPRA1" PACKAGES="iwinfo -luci -uhttpd -dnsmasq -ppp -ppp-mod-pppoe"
Note: il est encore possible de virer des paquets si on ne veut pas d’USB, et de possibilité de brancher en usb une clé 3G.
Configuraton "d'usine"
Il est possible préciser la configuration (tout ce qui est dans /etc/config/
) de OpenWRT au moment de la construction de l'image. C'est surtout pratique si vous avez un lot de routeur a flasher, pour éviter de devoir changer la config sur chacun à la main... Voir le wiki OpenWRT.
Flash de l'image OpenWRT
Voici ici résumé les deux méthodes de flash de firmware. La première méthode (par telnet) permet de flasher sans avoir besoin de souder le port série. En cas de fail il faut se rabatre sur la seconde méthode (tftp) en soudant un port série (voir plus bas).
Une autre méthode, plus simple, en passant par l'interface web d'origine ne marche pas sur mon modèle. Peut-être cela peut fonctionner sur d'autres versions...
Pour info, au démarage un 1er système est executé : le bootloader (sorte de bios, il est stocké dans la partition mtd "Bootloader") ensuite ce bootloader lance le système en lui même (socké dans la partition mtd "Kernel"). Le bootloader d'origine permet de flasher "lui-même" et le kernel (on discute avec lui par la liaison série, voir plus bas). Dans la suite on ne va flasher que le Kernel, on garde le bootloader d'usine. Sur certaines versions, il est possible que le bootloader d'origne ne veuille pas booter un autre Kernel. Dans ce cas il faut le remplacer... pour ca voir et en particulier ce binaire fait l'affaire (attention si votre routeur a 16M de ram et non 32, il faut une autre version).
Flash en telnet (sans port série)
Avec le firmware d'origine, il est possible de ce connecter en telnet sur le routeur, ce qui permet de sauvegarder et de flasher le firmware (et bootloader).
Pour ca il suffit de le brancher et de ce connecter sur le réseaux wifi qu'il propose. Ensuite (attention l'ip peux changer sur d'autre variante) :
$ telnet 192.168.169.1
Sur ma version le login c'est EDMWIFI et FNLINK le mot de passe (possible de trouver ces infos dans l'export de la config via l'interface web).
Pour lister toutes les partitions mtd presentes :
# cat /proc/mtd
dev: size erasesize name
mtd0: 00400000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Factory"
mtd4: 003b0000 00010000 "Kernel"
On peut aussi vérifier la quantité de ram dispo sur la bête :
# free
total used free shared buffers
Mem: 28180 21408 6772 0 0
Swap: 0 0 0
Total: 28180 21408 6772
Pour récupérer un nouveau firmware et sauvegarder le firmware existant il est possible de monter une clé USB. Normalement il suffit de brancher la clé celle-ci se monte toute seule sur /media/sda1
, sinon :
# mkdir /media/sda1
# mount /dev/sda1 /media/sda1
Attention : il est fortement conseiller de faire une sauvegarde des partitions MTD présentes avant de les écraser. Pour cela, avec une clé USB brnaché sur /media/sda1/
:
# for i in 1 2 3 4; do cp /dev/mtd${i}ro /media/sda1/mtd${i}.img; done
Ensuite on peut flasher le firmware openWRT:
# mtd_write write /media/sda1/my_openwrt_kernel.bin Kernel
Il peut etre plus prudent de flasher aussi une version clean du bootloader (attention c'est la version 32M de ram):
# mtd_write write /media/sda1/uboot256.img Bootloader
avec TFTP (et la liaison Serie)
En cas de pépin du flash par telnet... On branche la console série et on flash avec un serveur TFTP !
Donc il faut avoir câblé la liaison série (voir plus bas). Ensuite installer et faire tourner un serveur tftp, pour ubuntu :
$ sudo apt-get install tftpd-hpa tftp
Il faut que ce serveur serve bien notre image openWRT fraichement générée (attention aux chemins) :
$ sudo cp bin/ramips/openwrt-ramips-rt305x-mpr-a1-squashfs-sysupgrade.bin /var/lib/tftpboot/openwrt.bin
Ensuite :
- le routeur connecter PC avec la liaison série
- ouvrir la console série :
$ screen /dev/ttyUSB0 57600
- rebooter le routeur, on doit voir défiler les messages bootloader uboot (voir exemple plus bas)
- dans le menu du bootloader, choisir le flash en TFTP avec les bonnes IP et le bon nom de kernel
Voila ce que ça donne sur le moniteur série :
Please choose the operation:
1: Load system code to SDRAM via TFTP.
2: Load system code then write to Flash via TFTP.
3: Boot system code via Flash (default).
4: Entr boot command line interface.
7: Load Boot Loader code then write to Flash via Serial.
9: Load Boot Loader code then write to Flash via TFTP. 4
You choosed 2
0
raspi_read: from:40028 len:6
.
2: System Load Linux Kernel then write to Flash via TFTP.
Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)
Please Input new ones /or Ctrl-C to discard
Input device IP (192.168.16.1) ==:192.168.100.28
Input server IP (192.168.16.244) ==:192.168.100.104
Input Linux Kernel filename (openwrt_web.bin) ==:openwrt.bin
Le nouveau firmware doit etre mis en place, et le routeur reboot dessus. Laissez la liaison série de brancher pour voir ce qu'il se passe.
Démontage
Note : Si le flash par telnet se passe bien, le démontage n'est pas nécéssaire (sauf si ca vous amuse)
L'intéret de démonter le routeur est surtout de souder le port série. A noter : sur mon model, il semble possible de souder un second port éthernet. Je n'ai pas testé.
Rare pour ce genre de boitier : il est assez facile a démonter ! Il sufit de glisser son doigt entre les parties plastique blanche et bleu. La partie blanche "haute" avec les leds et le label "3G Wi-Fi Router" semble plus facile à retirer que l'autre. Il suffit de démonter cette partie.
Une fois démonter on trouve, sous la batterie (facile à décoler), les pads pour souder le port série. Tout est indiqué très clairement !
Soudure et branchement du port série
On voit assez bien sur la dernière photo les 4 petits pads pour souder le port serie. Il y a d'indiqué GND
, RX
, TX
, 3.3V
. Il suffit donc de souder trois petit fils (le 3.3v n'est pas indispensable) et de connecter ca à un adaptateur série USB 3.3v. (Au passage une astuce pour avoir des adaptateurs USBtoSerial 3.3v a bon prix : il suffit de réutiliser des cables data de certains téléphone nokia)
Attention, pour pouvoir rebooter le routeur en ayant le port série branché sur un adapteur USB, il faut mettre en série une résistance de ~600 Ohms sur Rx
de la carte.
Conclusion et autres pistes
Une fois OpenWRT flashé il est facile de le configurer pour partager le wifi. Si votre AP est compatible, le plus simple pour cela est d'utiliser une config avec du WDS.
Petite liste d'idées en vrac, peut-être de prochains posts :
- Utiliser le mini routeur en client VPN pour le rPy...
- Lire le niveau de la batterie depuis le rPy (avec un convertisseur analogique numérique, ADS1015... ou un petit arduino).
- utiliser l'usb pour amener du reseau a un raspberry Pi A+ (voir doc (reverse tethering)[http://wiki.openwrt.org/doc/howto/usb.reverse.tethering])
- configurer les leds (en particulier la led bleu pour le WiFi)
- brancher/utiliser le btn reset
- etc.