This is an old revision of the document!
The MP2.0 when available will have 16MB FLASH and 64MB RAM, 11 GPIO lines, and a USB port, making it ideal for prototyping the mesh helper.
But it isn't available yet …
In the meantime, we have some TP-LINK TL-WR703Ns (version 1.2 models according to their labels), which use the same Atheros 9331 chipset, but have only 4MB FLASH and 32MB RAM, a USB port and no 12v in capability – but still better than the Dragino.
The concept is to connect an Arduino-UNO or compatible board to the USB port, and connect the radio to that. We will then use the usual serial port interface on the Arduino to talk to it.
The TL-WR703N is well supported by OpenWRT: http://wiki.openwrt.org/toh/tp-link/tl-wr703n
WARNING: The following can brick newer WR703Ns (Firmware 1.7, Ver:1.6 or Ver:1.7 etc on the bottom of the unit. Ver:1.2 is known to be safe). This is an issue with the OpenWRT firmware listed below. You can safely use these instruction with your own built OpenWRT distro, provided it is new enough. We will do that later.
Some more info on getting OpenWRT onto the WR703n can be found here:
This more or less boils down to:
You should now have OpenWRT on your WR703N.
The WR703N only has 4MB of flash, which is too small for a Serval or Commotion build. We use the USB port to solve this problem by connecting a USB memory stick. We are using 16GB ones.
You will need to install the following OpenWRT packages:
Because of the small flash size, you will need to scp them into /tmp/ which is a RAMfs. Note that there are some interdependencies here, so the order of installation will be different.
Install these packages, and if required reboot the 703. Then plug a USB memory stick in. Typing
dmesg should show that it has been recognised, e.g., as
45503.970000] USB Mass Storage support registered. [45504.960000] scsi 0:0:0:0: Direct-Access SanDisk Cruzer Switch 1.26 PQ: 0 ANSI: 5 [45504.970000] sd 0:0:0:0: [sda] 31266816 512-byte logical blocks: (16.0 GB/14.9 GiB) [45504.970000] sd 0:0:0:0: [sda] Write Protect is off [45504.980000] sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00 [45504.980000] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [45505.000000] sda: sda1 [45505.010000] sd 0:0:0:0: [sda] Attached SCSI removable disk''
fdisk to partition the USB memory stick. Note that fsck requires about 1MB of RAM for every 1GB of partition size, so I recommend making a 1GB partition that will be used to replace /overlay on the router, and dividing the remaining space into partitions of a few GB each.
On our 16GB sticks I used 1GiB+7GiB+7GiB, the other GiB being missing due to the “marketing GB” differing from the binary GB. You might also like to make a partition for swap and/or /tmp
Then use mkfs.ext4 to create the file system(s), e.g.
Then uninstall the following packages to make space for the ext4 kernel module (yes, the space is that tight, but don't worry, we can put it back later):
opkg remove e2fsprogs
Now that you have enough space, install the following packages:
You should now be able to mount your 1GB partition that we will use for /overlay:
''mount /dev/sda1 /mnt'
Now run the following commands on the router (taken from http://blog.night-shade.org.uk/2013/01/more-storage-on-openwrt/):
tar -C /overlay -cvf - . | tar -C /mnt -xf - uci add fstab mount uci set fstab.@mount[-1].device=/dev/sda1 uci set fstab.@mount[-1].options=$options uci set fstab.@mount[-1].enabled_fsck=0 uci set fstab.@mount[-1].enabled=1 uci set fstab.@mount[-1].target=/overlay uci set fstab.@mount[-1].fstype=$fstype mkdir /home uci add fstab mount uci set fstab.@mount[-1].device=/dev/sda2 uci set fstab.@mount[-1].options=$options uci set fstab.@mount[-1].enabled_fsck=0 uci set fstab.@mount[-1].enabled=1 uci set fstab.@mount[-1].target=/home uci set fstab.@mount[-1].fstype=$fstype mkdir /serval uci add fstab mount uci set fstab.@mount[-1].device=/dev/sda3 uci set fstab.@mount[-1].options=$options uci set fstab.@mount[-1].enabled_fsck=0 uci set fstab.@mount[-1].enabled=1 uci set fstab.@mount[-1].target=/serval uci set fstab.@mount[-1].fstype=$fstype uci commit fstab /etc/init.d/fstab enable
Reboot and you should have 1GB in /overlay, mounted from USB
CP2012 datasheet is at http://www.silabs.com/products/interface/usbtouart/Pages/usb-to-uart-bridge.aspx
Follow that, and install the CP210x USB serial adapter drivers from http://downloads.openwrt.org/attitude_adjustment/12.09-beta2/ar71xx/generic/packages/
You will need kmod-usb-serial-cp210x_3.3.8-1_ar71xx.ipk and kmod-usb-serial_3.3.8-1_ar71xx.ipk or similar. Use scp to copy these onto your 703, and then use:
opkg install kmod-usb-serial_3.3.8-1_ar71xx.ipk opkg install kmod-usb-serial-cp210x_3.3.8-1_ar71xx.ipk
Yet to be explored.
On OSX to use the SiLabs CP2012 USB adapters on mac, you need to install the drivers from http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
Install those, and the USB to serial adapter works on the mac.
Drivers from http://www.ftdichip.com/Drivers/VCP.htm
Whether using the TL-WR703N, we should use a better voltage regulator to tolerate the 12v - 15v we can expect to see on the LiFePO4 batteries. Jaycar sell such a kit for AUD$7.95 that can provide 5V @ 1A, which should be enough, and is quite easy to build: http://www.jaycar.com.au/productView.asp?ID=KA1797
The TL-WR703N itself uses <1W with nothing connected to the USB port, leaving 4W for the radio and USB memory stick for Rhizome mass storage, which should be enough. Once we get the MP2.0's, they will power themselves and the USB mass storage, leaving all 1A for the Arduino and radio.
The RFD900 radio can use 4W on its' own, so a separate 5v 1A supply is probably a good idea. Our solution for now is to use two of the KA1797 kits.
For the Arduino, we want one that can plug in the USB port, because that is easiest. However, the availability of radio hardware that supports TTL serial with nice firmware, we can skip the Arduino for now. See below for discussion of the radio hardware.
Talking with Tridge @ #LCA2013, there is a nice radio that he has already written point-to-point firmware for, that could be easily integrated with the TL-WR703N via a USB to TTL serial adapter.
The radio units are the http://rfdesign.com.au/index.php/rfd900
At Make.Hack.Void in Canberra started testing this with some of Tridge's gear.
We now have a convenient way to test the radios on both Mac and on the WR703N itself, which will allow fairly easy development and integration with servald.
Have ordered an RFD900 bundle from rfdesign.com.au, with a couple of the FTDI brand USB/TTL converters that they supply, just to get things started smoothly. Then once the CP2012s arrive (probably in 3 - 5 weeks), we can use those on future units.
For ease of development, we will plug the RFD900 into a USB port on a mac, where it will appear as a serial port. On my mac, my first RFD900 shows up as /dev/tty.usbserial-A1011UQN
We can talk to the radio module using something like:
sudo cu -l /dev/tty.usbserial-A1011UQN -s 57600
And then entering +++ to drop to the AT command prompt of the modem. AT commands are the same as listed at http://code.google.com/p/ardupilot-mega/wiki/3DRadio
After plugging both radios in, they synchonised in a few seconds, and I was able to use the AT&T=RSSI to get a running report on the RSSI output from the radio.
With the radio TX power set to +20dbm and +2.1db stub antennae RSSI results were 217 for both left and right antennae, and the noise floor was usually in the range 50 – 60 in my house in suburban Adelaide.
These units are are approximately 0.5dB, where 25 probably somewhere around -121dBm. In my case, the link budget is about 157 RSSI. Using the more accurate formula from the 3Dradio, the RSSI corresponds to -12.8dBm, and the noise floor to -95.4dBm, for a link budget of 82.6dBm.
As the radios are about 30cm apart on my desk, and each 6.02dB allows a doubling of range, this suggests a maximum range of about 30cm x 2^13.7 = 30cm x 13300, or about 4km. The antenna gain is only +2.1dB, so we could increase TX power by another 7dB, which should double the range to around 8km, assuming clear line of sight – which is pretty good for a 1W radio in a suburban area. A lower noise floor could easily increase range to a few tens of kilometres. This is pretty exciting for enabling long-range mesh communications, especially when compared with WiFi's suburban range of <160m.
So the next step is to modify servald to be able to use the radios as a link, and then get it working on the 703N.
For servald, it will be fairly easy to patch the dummynet driver that already reads and writes to an ordinary file. We will just need to implement flow control/throttling, and packet encapsulation in case of communications errors.