Исследование Wi-Fi-роутера TP-LINK TL-MR3020


Электроника стремительно развивается и по доступной цене появляются замечательные девайсы, которые отлично подходят для использования в роли мозгов для роботов.
А учитывая, что вычислительные мощности устройств так же растут, то скоро на встраиваемых сиситемах можно будет запускать свои программы ИИ 🙂
Малину (Raspberry Pi) мне всё никак не доставят, поэтому рассмотрим Wi-Fi роутер TP-LINK TL-MR3020.

Wi-Fi роутеры с USB-портом — отличная штука для создания простого и доступного робота с трансляцией видеопотока и пробросом команд для управления шасси.
Т.о., получится создать дешёвого телеуправляемого робота, благодаря использованию сторонних прошивок типа OpenWrt.
Не так давно, для этого во всю использовались D-link DIR-320, а теперь его нишу прочно занял крохотный китайский роутер TP-LINK TL-MR3020.

похоже, следующим «мозговитым роутером» будет XXX-link 30020 🙂

Преимущества TP-LINK TL-MR3020 перед D-link DIR-320 очевидны — более малый размер, более мощный процессор и меньшая цена 🙂
Отличным плюсом к популярности TP-LINK TL-MR3020 можно добавить, что нам не придётся самостоятельно пилить прошивку, так всё уже сделано коллегами с робофорума, за что им огромное спасибо!

Поэтому, нам остаётся только прошить роутер прошивкой OR-WRT и подстроить его под свои требования.

Характеристики TP-LINK TL-MR3020

CPU - Atheros AR7240@400MHz (SoC: Atheros AR9330 rev 1)
Ram - 32MiB
Flash - 4MiB
Network - 1 x 100MBit (RJ45)
Wi-Fi - 802.11 b/g/n 150Mbps
USB - 1 x 2.0 (A)
Serial - 1
JTag - 0
Power - 5V (через mini-USB)
размеры:
корпус - 6.7cm x 7.4cm x 2.2cm
плата - 5.7cm x 5.7cm

TP-LINK TL-MR3020 — схож с TP-Link TL-WR703N. И хотя 703-й дешевле, но у него не выведены светодиоды, а разъем UART придётся снимать с двух мелких площадок.

Разбираем


Разобрать роутер не сложно. На цветной крышке, всего две пластиковых защёлки — одна над разъёмом mini-USB, а вторая на противоположной стороне, напротив разъёма RJ45. Аккуратно пропихиваем в щель отвёртку и отклоняем стенку корпуса. У меня так же, оказалось, что ободок крышки вклеен в корпус, так что пришлось приложить усилия.

Распиновка UART-а

последовательный порт выведен на плате (четыре отверстия под PLS-вилку со стандартным шагом 2.54)

разъём обозначен P1 / SJ1:
1 — TX
2 — RX
3 — GND
4 — VCC (3.3)

(первый пин указан на плате (квадратный))

Припаиваем 4 пина PLS и получаем UART.

Из макетки можно вырезать подходящий кусок, припаять ответные пины и надевать на плату роутера словно шилды Arduino.

Установка новой прошивки

Идём на страничку прошивки
http://roboforum.ru/wiki/OR-WRT
читаем и скачиваем бинарник прошивки.

Заходим на свежекупленный роутер TP-LINK TL-MR3020:
http://192.168.0.254
admin / admin

и заливаем прошивку OR-WRT (0.70)
после установки заходим на роутер телнетом: telnet 192.168.217.1
и настраивает пароль root-а: passwd
перезагружаем роутер и подключаемся к нему через ssh

подробности об установке — http://roboforum.ru/wiki/OR-WRT_install

Исследование

# uname -a
Linux OpenWrt 3.3.8 #1 Tue Aug 21 12:04:20 UTC 2012 mips GNU/Linux
# cat /proc/cpuinfo
system type             : Atheros AR9330 rev 1
machine                 : TP-LINK TL-MR3020
processor               : 0
cpu model               : MIPS 24Kc V7.4
BogoMIPS                : 265.42
wait instruction        : yes
microsecond timers      : yes
tlb_entries             : 16
extra interrupt vector  : yes
hardware watchpoint     : yes, count: 4, address/irw mask: [0x0000, 0x0ff8, 0x0f
f8, 0x0ff8]
ASEs implemented        : mips16
shadow register sets    : 1
kscratch registers      : 0
core                    : 0
VCED exceptions         : not available
VCEI exceptions         : not available
# cat /proc/meminfo
MemTotal:          29160 kB
MemFree:            9580 kB
Buffers:            2020 kB
Cached:             6428 kB
SwapCached:            0 kB
Active:             4708 kB
Inactive:           5608 kB
Active(anon):       1952 kB
Inactive(anon):       48 kB
Active(file):       2756 kB
Inactive(file):     5560 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:          1884 kB
Mapped:             1208 kB
Shmem:               132 kB
Slab:               5180 kB
SReclaimable:        860 kB
SUnreclaim:         4320 kB
KernelStack:         336 kB
PageTables:          300 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       14580 kB
Committed_AS:       5620 kB
VmallocTotal:    1048372 kB
VmallocUsed:        1216 kB
VmallocChunk:    1043944 kB
# cat /proc/cmdline
 board=TL-MR3020 console=null quiet rootfstype=squashfs,jffs2 noinitrd
# cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   tmpfs
nodev   debugfs
nodev   sockfs
nodev   pipefs
nodev   anon_inodefs
nodev   configfs
nodev   devpts
        squashfs
nodev   ramfs
nodev   jffs2
nodev   overlayfs
nodev   mtd_inodefs
nodev   usbfs
        ext3
        ext2
        ext4
# ps
  PID USER       VSZ STAT COMMAND
    1 root      1504 S    init
    2 root         0 SW   [kthreadd]
    3 root         0 SW   [ksoftirqd/0]
    4 root         0 SW   [kworker/0:0]
    5 root         0 SW   [kworker/u:0]
    6 root         0 SW<  [khelper]
    7 root         0 SW   [kworker/u:1]
   63 root         0 SW   [sync_supers]
   65 root         0 SW   [bdi-default]
   67 root         0 SW<  [kblockd]
   96 root         0 SW   [kswapd0]
  144 root         0 SW   [fsnotify_mark]
  173 root         0 SW<  [ath79-spi]
  184 root         0 SW   [mtdblock0]
  189 root         0 SW   [mtdblock1]
  194 root         0 SW   [mtdblock2]
  199 root         0 SW   [mtdblock3]
  204 root         0 SW   [mtdblock4]
  209 root         0 SW   [mtdblock5]
  250 root         0 SW   [kworker/0:1]
  481 root      1532 S    {rcS} /bin/sh /etc/init.d/rcS S boot
  483 root      1496 S    logger -s -p 6 -t sysinit
  528 root         0 SW<  [cfg80211]
  541 root         0 SW   [khubd]
  626 root      1508 S    /sbin/syslogd -C16
  628 root      1488 S    /sbin/klogd
  630 root       852 S    /sbin/hotplug2 --override --persistent --set-rules-f
  636 root       860 S    /sbin/ubusd
  657 root      1512 S    /sbin/netifd
  896 root      1496 S    /usr/sbin/telnetd -l /bin/login.sh
 1096 root      1500 S    /sbin/watchdog -t 5 /dev/watchdog
 1103 root      1876 S    /usr/sbin/uhttpd -f -h /www -r OpenWrt -x /cgi-bin -
 1134 nobody     940 S    /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf
 1143 root       924 S    /usr/sbin/rinetd -c /var/etc/rinetd.conf
 1161 root         0 SWN  [jffs2_gcd_mtd3]
 1197 root      1496 S    sh /etc/rc.local
 1204 root       848 S    ser2net
 1221 root      1500 S    /usr/sbin/ntpd -n -p 0.openwrt.pool.ntp.org -p 1.ope
 1247 root      1152 S    /usr/sbin/dropbear -P /var/run/dropbear.1.pid -p 22
 1275 root      1508 S    /bin/ash --login
 1375 root      1488 S    sleep 10
 1377 root      1496 R    ps
# busybox
BusyBox v1.19.4 (2012-08-21 01:06:25 UTC) multi-call binary.
Copyright (C) 1998-2011 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]...
   or: busybox --list[-full]
   or: function [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use and BusyBox
        will act like whatever it was invoked as.

Currently defined functions:
        [, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, cat, chgrp,
        chmod, chown, chroot, clear, cmp, cp, crond, crontab, cut, date, dd,
        df, dirname, dmesg, du, echo, egrep, env, expr, false, fgrep, find,
        free, fsync, grep, gunzip, gzip, halt, head, hexdump, hostid, hwclock,
        id, ifconfig, init, insmod, kill, killall, klogd, less, ln, lock,
        logger, logread, ls, lsmod, md5sum, mkdir, mkfifo, mknod, mktemp,
        mount, mv, nc, netmsg, netstat, nice, nslookup, ntpd, passwd, pgrep,
        pidof, ping, ping6, pivot_root, pkill, poweroff, printf, ps, pwd,
        reboot, reset, rm, rmdir, rmmod, route, sed, seq, sh, sleep, sort,
        start-stop-daemon, strings, switch_root, sync, sysctl, syslogd, tail,
        tar, tee, telnet, telnetd, test, time, top, touch, tr, traceroute,
        true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc,
        wget, which, xargs, yes, zcat
# free
             total         used         free       shared      buffers
Mem:         29160        19596         9564            0         2020
-/+ buffers:              17576        11584
Swap:            0            0            0
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                     640       212       428  33% /
/dev/root                 2304      2304         0 100% /rom
tmpfs                    14580        72     14508   0% /tmp
tmpfs                      512         0       512   0% /dev
root                     14580        44     14536   0% /tmp/root
overlayfs:/tmp/root      14580        44     14536   0% /tmp/root
/dev/mtdblock3             640       212       428  33% /overlay
overlayfs:/overlay         640       212       428  33% /
# cat /www/cgi-bin/serial.cgi
#!/usr/bin/awk -f
function unescape(s)
{
        gsub(/\+/," ",s)
        res = ""
        do {
          p = match(s,/%[0-9a-fA-F]{2}/)
          if(p>0) {
                res = res substr(s,0,p-1) sprintf("%c",0+("0x" substr(s,p+1,2)))
                s = substr(s,p+3)
          }
        } while(p>0)
        return res s
}

BEGIN {
        RS = "&"
        FS = "="
}
{
        if($1 == "SERIAL_DATA" ) print unescape($2) > "/dev/ttyUSB0"
}
END
{
        print "202"
}
# ls /dev
bus        mtd1       mtd5       null       ttyS0      ttyS2      urandom
console    mtd1ro     mtd5ro     port       ttyS1      ttyS3      watchdog
full       mtd2       mtdblock0  ptmx       ttyS10     ttyS4      zero
kmsg       mtd2ro     mtdblock1  pts        ttyS11     ttyS5
log        mtd3       mtdblock2  random     ttyS12     ttyS6
mem        mtd3ro     mtdblock3  shm        ttyS13     ttyS7
mtd0       mtd4       mtdblock4  tty        ttyS14     ttyS8
mtd0ro     mtd4ro     mtdblock5  ttyATH0    ttyS15     ttyS9
# stty -F /dev/ttyATH0
speed 115200 baud; line = 0;
-brkint -imaxbel
/etc# ls -asl
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:09 .
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:00 ..
     0 lrwxrwxrwx    1 root     root             7 Sep  1  2012 TZ -> /tmp/TZ
     1 -rw-r--r--    1 root     root           671 Jan  1  1970 banner
     0 drwxrwxr-x    1 root     root             0 Jan  1 00:00 config
     0 drwxr-xr-x    2 root     root             3 Aug 21  2012 crontabs
     0 drwxrwxr-x    5 root     root            86 Aug 30  2012 defconfig
     3 -rwx------    1 root     root          3228 Aug  2  2012 diag.sh
     1 -rw-r--r--    1 root     root          1368 Aug 21  2012 dnsmasq.conf
     0 drwx------    1 root     root             0 Jan  1 00:00 dropbear
     0 -rw-r--r--    1 root     root             0 Jan  1 00:00 ethers
     0 lrwxrwxrwx    1 root     root            10 Sep  1  2012 fstab -> /tmp/fstab
     0 lrwxrwxrwx    1 root     root            19 Sep  1  2012 functions.sh -> ../lib/functions.sh
     0 -rw-------    1 root     root           123 Jun 17  2012 group
     0 -rw-------    1 root     root            20 Jun 17  2012 hosts
     0 drwxr-xr-x    7 root     root            84 Aug 21  2012 hotplug.d
     1 -rw-------    1 root     root           833 Jul 23  2012 hotplug2-common.rules
     0 -rw-------    1 root     root            80 Jun 17  2012 hotplug2-init.rules
     0 -rw-r--r--    1 root     root           242 Aug 21  2012 hotplug2.rules
     0 -rw-r--r--    1 root     root            15 Sep  1  2012 httpd.conf
     0 -rw-r--r--    1 root     root            50 Nov 28  2011 httpd.weak.conf
     0 drwxr-xr-x    2 root     root           307 Jan  6  2012 init.d
     0 -rw-r--r--    1 root     root            99 Jan  1 00:09 inittab
     0 drwxr-xr-x    2 root     root           228 Sep  1  2012 modules-boot.d
     0 drwxr-xr-x    2 root     root           720 Sep  1  2012 modules.d
     0 lrwxrwxrwx    1 root     root            12 Sep  1  2012 mtab -> /proc/mounts
     0 -rw-------    1 root     root           207 Aug 21  2012 openwrt_release
     0 -rw-------    1 root     root             7 Aug 21  2012 openwrt_version
     0 -rw-r--r--    1 root     root           179 Sep  1  2012 opkg.conf
     0 -rw-------    1 root     root           190 Jan  1 00:09 passwd
     0 -rw-------    1 root     root           190 Jan  1 00:03 passwd-
     1 -rwx------    1 root     root           896 Aug 30  2012 preinit
     0 -rw-------    1 root     root           480 Aug 11  2012 profile
     2 -rw-------    1 root     root          2478 Jun 17  2012 protocols
     2 -rwx------    1 root     root          1555 Jun 17  2012 rc.common
     0 drwxr-xr-x    2 root     root           408 Sep  1  2012 rc.d
     0 -rw-r--r--    1 root     root           495 Sep  1  2012 rc.local
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 resolv.conf -> /tmp/resolv.conf
     5 -rw-------    1 root     root          5217 Sep  1  2012 ser2net.conf
     3 -rw-------    1 root     root          3017 Jun 17  2012 services
     0 -rw-------    1 root     root           149 Jan  1 00:09 shadow
     0 -rw-------    1 root     root           149 Jan  1 00:03 shadow-
     0 -rw-------    1 root     root             9 Jun 17  2012 shells
     1 -rw-------    1 root     root          1051 Jul  3  2012 sysctl.conf
     0 -rw-------    1 root     root           128 Jun 17  2012 sysupgrade.conf
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:00 uci-defaults
     0 -rw-r--r--    1 root     root           509 Jan  1 00:00 uhttpd.crt
     1 -rw-r--r--    1 root     root           607 Jan  1 00:00 uhttpd.key
root@OpenWrt:/etc# cd rc.d/
root@OpenWrt:/etc/rc.d# ls
K50dropbear       S02nvram          S20fstab          S50dropbear       S60dnsmasq        S97watchdog
K90network        S05defconfig      S20network        S50mjpg-streamer  S80rinetd         S98sysntpd
K98boot           S10boot           S39usb            S50telnet         S95done           S99sysctl
K99umount         S11ubus           S50cron           S50uhttpd         S96led
root@OpenWrt:/etc/rc.d# ls -asl
     0 drwxr-xr-x    2 root     root           408 Sep  1  2012 .
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:09 ..
     0 lrwxrwxrwx    1 root     root            18 Sep  1  2012 K50dropbear -> ../init.d/dropbear
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 K90network -> ../init.d/network
     0 lrwxrwxrwx    1 root     root            14 Sep  1  2012 K98boot -> ../init.d/boot
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 K99umount -> ../init.d/umount
     0 lrwxrwxrwx    1 root     root            15 Sep  1  2012 S02nvram -> ../init.d/nvram
     0 lrwxrwxrwx    1 root     root            19 Sep  1  2012 S05defconfig -> ../init.d/defconfig
     0 lrwxrwxrwx    1 root     root            14 Sep  1  2012 S10boot -> ../init.d/boot
     0 lrwxrwxrwx    1 root     root            14 Sep  1  2012 S11ubus -> ../init.d/ubus
     0 lrwxrwxrwx    1 root     root            15 Sep  1  2012 S20fstab -> ../init.d/fstab
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 S20network -> ../init.d/network
     0 lrwxrwxrwx    1 root     root            13 Sep  1  2012 S39usb -> ../init.d/usb
     0 lrwxrwxrwx    1 root     root            14 Sep  1  2012 S50cron -> ../init.d/cron
     0 lrwxrwxrwx    1 root     root            18 Sep  1  2012 S50dropbear -> ../init.d/dropbear
     0 lrwxrwxrwx    1 root     root            23 Sep  1  2012 S50mjpg-streamer -> ../init.d/mjpg-streamer
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 S50telnet -> ../init.d/telnet
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 S50uhttpd -> ../init.d/uhttpd
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 S60dnsmasq -> ../init.d/dnsmasq
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 S80rinetd -> ../init.d/rinetd
     0 lrwxrwxrwx    1 root     root            14 Sep  1  2012 S95done -> ../init.d/done
     0 lrwxrwxrwx    1 root     root            13 Sep  1  2012 S96led -> ../init.d/led
     0 lrwxrwxrwx    1 root     root            18 Sep  1  2012 S97watchdog -> ../init.d/watchdog
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 S98sysntpd -> ../init.d/sysntpd
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 S99sysctl -> ../init.d/sysctl
root@OpenWrt:/etc/rc.d# cd /etc/
root@OpenWrt:/etc# ls -asl
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:09 .
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:00 ..
     0 lrwxrwxrwx    1 root     root             7 Sep  1  2012 TZ -> /tmp/TZ
     1 -rw-r--r--    1 root     root           671 Jan  1  1970 banner
     0 drwxrwxr-x    1 root     root             0 Jan  1 00:00 config
     0 drwxr-xr-x    2 root     root             3 Aug 21  2012 crontabs
     0 drwxrwxr-x    5 root     root            86 Aug 30  2012 defconfig
     3 -rwx------    1 root     root          3228 Aug  2  2012 diag.sh
     1 -rw-r--r--    1 root     root          1368 Aug 21  2012 dnsmasq.conf
     0 drwx------    1 root     root             0 Jan  1 00:00 dropbear
     0 -rw-r--r--    1 root     root             0 Jan  1 00:00 ethers
     0 lrwxrwxrwx    1 root     root            10 Sep  1  2012 fstab -> /tmp/fstab
     0 lrwxrwxrwx    1 root     root            19 Sep  1  2012 functions.sh -> ../lib/functions.sh
     0 -rw-------    1 root     root           123 Jun 17  2012 group
     0 -rw-------    1 root     root            20 Jun 17  2012 hosts
     0 drwxr-xr-x    7 root     root            84 Aug 21  2012 hotplug.d
     1 -rw-------    1 root     root           833 Jul 23  2012 hotplug2-common.rules
     0 -rw-------    1 root     root            80 Jun 17  2012 hotplug2-init.rules
     0 -rw-r--r--    1 root     root           242 Aug 21  2012 hotplug2.rules
     0 -rw-r--r--    1 root     root            15 Sep  1  2012 httpd.conf
     0 -rw-r--r--    1 root     root            50 Nov 28  2011 httpd.weak.conf
     0 drwxr-xr-x    2 root     root           307 Jan  6  2012 init.d
     0 -rw-r--r--    1 root     root            99 Jan  1 00:09 inittab
     0 drwxr-xr-x    2 root     root           228 Sep  1  2012 modules-boot.d
     0 drwxr-xr-x    2 root     root           720 Sep  1  2012 modules.d
     0 lrwxrwxrwx    1 root     root            12 Sep  1  2012 mtab -> /proc/mounts
     0 -rw-------    1 root     root           207 Aug 21  2012 openwrt_release
     0 -rw-------    1 root     root             7 Aug 21  2012 openwrt_version
     0 -rw-r--r--    1 root     root           179 Sep  1  2012 opkg.conf
     0 -rw-------    1 root     root           190 Jan  1 00:09 passwd
     0 -rw-------    1 root     root           190 Jan  1 00:03 passwd-
     1 -rwx------    1 root     root           896 Aug 30  2012 preinit
     0 -rw-------    1 root     root           480 Aug 11  2012 profile
     2 -rw-------    1 root     root          2478 Jun 17  2012 protocols
     2 -rwx------    1 root     root          1555 Jun 17  2012 rc.common
     0 drwxr-xr-x    2 root     root           408 Sep  1  2012 rc.d
     0 -rw-r--r--    1 root     root           495 Sep  1  2012 rc.local
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 resolv.conf -> /tmp/resolv.conf
     5 -rw-------    1 root     root          5217 Sep  1  2012 ser2net.conf
     3 -rw-------    1 root     root          3017 Jun 17  2012 services
     0 -rw-------    1 root     root           149 Jan  1 00:09 shadow
     0 -rw-------    1 root     root           149 Jan  1 00:03 shadow-
     0 -rw-------    1 root     root             9 Jun 17  2012 shells
     1 -rw-------    1 root     root          1051 Jul  3  2012 sysctl.conf
     0 -rw-------    1 root     root           128 Jun 17  2012 sysupgrade.conf
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:00 uci-defaults
     0 -rw-r--r--    1 root     root           509 Jan  1 00:00 uhttpd.crt
     1 -rw-r--r--    1 root     root           607 Jan  1 00:00 uhttpd.key
# ls -asl /lib
     0 drwxr-xr-x   13 root     root           680 Aug 21  2012 .
     0 drwxr-xr-x    1 root     root             0 Jan  1 00:00 ..
     6 -rwx------    1 root     root          6530 Aug  2  2012 ar71xx.sh
     0 drwx------    2 root     root            29 Sep  1  2012 config
     0 drwxr-xr-x    2 root     root             3 Aug 21  2012 firmware
     0 drwx------    2 root     root           405 Sep  1  2012 firstboot
     0 drwxr-xr-x    3 root     root           167 Sep  1  2012 functions
     7 -rwx------    1 root     root          7065 Jun 17  2012 functions.sh
    28 -rwxr-xr-x    1 root     root         28968 Aug 21  2012 ld-uClibc-0.9.33.2.so
     0 lrwxrwxrwx    1 root     root            21 Sep  1  2012 ld-uClibc.so.0 -> ld-uClibc-0.9.33.2.so
     6 -rw-r--r--    1 root     root          6340 Aug 21  2012 libblobmsg_json.so
     0 lrwxrwxrwx    1 root     root            21 Sep  1  2012 libc.so.0 -> libuClibc-0.9.33.2.so
    22 -rwxr-xr-x    1 root     root         22852 Aug 21  2012 libcrypt-0.9.33.2.so
     0 lrwxrwxrwx    1 root     root            20 Sep  1  2012 libcrypt.so.0 -> libcrypt-0.9.33.2.so
    12 -rwxr-xr-x    1 root     root         12504 Aug 21  2012 libdl-0.9.33.2.so
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 libdl.so.0 -> libdl-0.9.33.2.so
    75 -rw-r--r--    1 root     root         76936 Aug 21  2012 libgcc_s.so.1
    83 -rwxr-xr-x    1 root     root         85244 Aug 21  2012 libm-0.9.33.2.so
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 libm.so.0 -> libm-0.9.33.2.so
    77 -rwxr-xr-x    1 root     root         78652 Aug 21  2012 libpthread-0.9.33.2.so
     0 lrwxrwxrwx    1 root     root            22 Sep  1  2012 libpthread.so.0 -> libpthread-0.9.33.2.so
   347 -rwxr-xr-x    1 root     root        355503 Aug 21  2012 libuClibc-0.9.33.2.so
    15 -rw-r--r--    1 root     root         15800 Aug 21  2012 libubox.so
    13 -rw-r--r--    1 root     root         13456 Aug 21  2012 libubus.so
    33 -rwxr-xr-x    1 root     root         33608 Aug 21  2012 libuci.so
     4 -rwxr-xr-x    1 root     root          4036 Aug 21  2012 libutil-0.9.33.2.so
     0 lrwxrwxrwx    1 root     root            19 Sep  1  2012 libutil.so.0 -> libutil-0.9.33.2.so
     0 drwxr-xr-x    2 root     root            30 Sep  1  2012 lua
     0 drwxr-xr-x    3 root     root            28 Aug 21  2012 modules
     0 drwx------    3 root     root            70 Sep  1  2012 netifd
     0 drwxr-xr-x    2 root     root            49 Sep  1  2012 network
     0 drwxr-xr-x    2 root     root           949 Sep  1  2012 preinit
     1 -rw-r--r--    1 root     root           771 Aug 21  2012 uboot-envtools.sh
     0 drwxr-xr-x    3 root     root            99 Aug 21  2012 upgrade
     0 drwxr-xr-x    2 root     root            77 Sep  1  2012 wifi
# ls -asl /usr/lib/
     0 drwxr-xr-x    4 root     root           906 Sep  1  2012 .
     0 drwxr-xr-x    6 root     root            74 Aug 21  2012 ..
     0 drwxr-xr-x    2 root     root            37 Sep  1  2012 crda
     9 -rwxr-xr-x    1 root     root          8848 Aug 21  2012 input_file.so
    26 -rwxr-xr-x    1 root     root         26664 Aug 21  2012 input_uvc.so
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 libblkid.so.1 -> libblkid.so.1.1.0
   147 -rwxr-xr-x    1 root     root        150540 Aug 21  2012 libblkid.so.1.1.0
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 libcurses.so -> libncurses.so.5.7
     0 lrwxrwxrwx    1 root     root            18 Sep  1  2012 libcyassl.so -> libcyassl.so.0.0.0
     0 lrwxrwxrwx    1 root     root            18 Sep  1  2012 libcyassl.so.0 -> libcyassl.so.0.0.0
   133 -rwxr-xr-x    1 root     root        136168 Aug 21  2012 libcyassl.so.0.0.0
     0 lrwxrwxrwx    1 root     root            12 Sep  1  2012 libform.so -> libform.so.5
     0 lrwxrwxrwx    1 root     root            14 Sep  1  2012 libform.so.5 -> libform.so.5.7
    47 -rwxr-xr-x    1 root     root         48088 Aug 21  2012 libform.so.5.7
     0 lrwxrwxrwx    1 root     root            15 Sep  1  2012 libhistory.so -> libhistory.so.5
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 libhistory.so.5 -> libhistory.so.5.2
    33 -r-xr-xr-x    1 root     root         33911 Aug 21  2012 libhistory.so.5.2
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 libjpeg.so.62 -> libjpeg.so.62.0.0
   121 -rwxr-xr-x    1 root     root        124312 Aug 21  2012 libjpeg.so.62.0.0
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 libjson.so.0 -> libjson.so.0.0.1
    21 -rwxr-xr-x    1 root     root         21584 Aug 21  2012 libjson.so.0.0.1
   171 -rw-r--r--    1 root     root        175504 Aug 21  2012 liblua.so.5.1.4
     0 lrwxrwxrwx    1 root     root            12 Sep  1  2012 libmenu.so -> libmenu.so.5
     0 lrwxrwxrwx    1 root     root            14 Sep  1  2012 libmenu.so.5 -> libmenu.so.5.7
    21 -rwxr-xr-x    1 root     root         21988 Aug 21  2012 libmenu.so.5.7
     0 lrwxrwxrwx    1 root     root            15 Sep  1  2012 libncurses.so -> libncurses.so.5
     0 lrwxrwxrwx    1 root     root            17 Sep  1  2012 libncurses.so.5 -> libncurses.so.5.7
   173 -rwxr-xr-x    1 root     root        177104 Aug 21  2012 libncurses.so.5.7
    28 -rwxr-xr-x    1 root     root         28228 Aug 21  2012 libnl-tiny.so
     9 -rwxr-xr-x    1 root     root          9016 Aug 21  2012 libnvram.so.0.1
     0 lrwxrwxrwx    1 root     root            13 Sep  1  2012 libpanel.so -> libpanel.so.5
     0 lrwxrwxrwx    1 root     root            15 Sep  1  2012 libpanel.so.5 -> libpanel.so.5.7
     8 -rwxr-xr-x    1 root     root          8628 Aug 21  2012 libpanel.so.5.7
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 libreadline.so -> libreadline.so.5
     0 lrwxrwxrwx    1 root     root            18 Sep  1  2012 libreadline.so.5 -> libreadline.so.5.2
   239 -r-xr-xr-x    1 root     root        244749 Aug 21  2012 libreadline.so.5.2
     0 lrwxrwxrwx    1 root     root            16 Sep  1  2012 libuuid.so.1 -> libuuid.so.1.3.0
    11 -rwxr-xr-x    1 root     root         11020 Aug 21  2012 libuuid.so.1.3.0
     0 drwxr-xr-x    4 root     root            54 Aug 21  2012 opkg
    11 -rwxr-xr-x    1 root     root         11084 Aug 21  2012 output_file.so
    29 -rwxr-xr-x    1 root     root         29344 Aug 21  2012 output_http.so
    11 -rwxr-xr-x    1 root     root         11376 Aug 21  2012 uhttpd_lua.so
     4 -rwxr-xr-x    1 root     root          4248 Aug 21  2012 uhttpd_tls.so
# cat /etc/init.d/mjpg-streamer
#!/bin/sh /etc/rc.common
# Copyright (C) 2009 OpenWrt.org
START=50

SSD=start-stop-daemon
NAME=mjpg_streamer
PIDF=/var/run/$NAME.pid
PROG=/usr/bin/$NAME

start() {
        config_load mjpg-streamer
        config_get device core device
        config_get resolution core resolution
        config_get fps core fps
        config_get port core port
        config_get yuv core yuv
        config_get_bool enabled core enabled
        [ $enabled -gt 0 -a -c $device ] && sleep 3 && $SSD -S -m -p $PIDF -q -x $PROG -- --input "input_uvc.so --device $device --fps $fps --resolution $resolution $yuv" --output "output_http.so --port $port" >/dev/null 2>/dev/null &
}

stop() {
        $SSD -K -s SIGINT -p $PIDF; sleep 10
}
# ifconfig
eth0      Link encap:Ethernet  HWaddr 90:F6:52:B5:ED:DE
          inet addr:192.168.217.1  Bcast:192.168.217.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44652 errors:0 dropped:1582 overruns:0 frame:0
          TX packets:2740 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26120672 (24.9 MiB)  TX bytes:363121 (354.6 KiB)
          Interrupt:4

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:7410 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7410 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:504051 (492.2 KiB)  TX bytes:504051 (492.2 KiB)
# lsmod
Module                  Size  Used by    Tainted: G
uvcvideo               57784  0
videobuf2_vmalloc       1585  1 uvcvideo
videobuf2_memops        1491  1 videobuf2_vmalloc
videobuf2_core         16456  1 uvcvideo
pl2303                  9872  0
ftdi_sio               27968  0
cp210x                 10144  0
v4l2_common             4947  0
videodev               70150  2 uvcvideo,v4l2_common
usbserial              25274  3 pl2303,ftdi_sio,cp210x
i2c_dev                 4032  0
ath79_wdt               2320  1
ledtrig_netdev          3264  0
ath9k                  87507  0
ath9k_common            1513  1 ath9k
ath9k_hw              322186  2 ath9k,ath9k_common
ath                    14873  3 ath9k,ath9k_common,ath9k_hw
mac80211              264710  1 ath9k
cfg80211              159652  3 ath9k,ath,mac80211
compat                  3525  5 ath9k,ath9k_common,ath9k_hw,mac80211,cfg80211
input_core             21430  2 uvcvideo
arc4                     848  2
aes_generic            29961  0
usb_storage            34472  0
uhci_hcd               18208  0
ohci_hcd               16240  0
ehci_hcd               33008  0
sd_mod                 22320  0
ext4                  243518  0
jbd2                   40917  1 ext4
mbcache                 3949  1 ext4
usbcore               104514 10 uvcvideo,pl2303,ftdi_sio,cp210x,usbserial,usb_storage,uhci_hcd,ohci_hcd,ehci_hcd
usb_common               562  1 usbcore
scsi_mod               75784  2 usb_storage,sd_mod
nls_base                4958  1 usbcore
crc16                   1015  1 ext4
crypto_algapi          10668  2 arc4,aes_generic
ledtrig_timer           1152  0
ledtrig_default_on       496  0
leds_gpio               1632  0
gpio_button_hotplug     3264  0
# ls -asl /lib/modules/3.3.8/
aes_generic.ko          ftdi_sio.ko             scsi_mod.ko
arc4.ko                 gpio-button-hotplug.ko  sd_mod.ko
ath.ko                  i2c-dev.ko              uhci-hcd.ko
ath79_wdt.ko            input-core.ko           usb-common.ko
ath9k.ko                jbd2.ko                 usb-storage.ko
ath9k_common.ko         leds-gpio.ko            usbcore.ko
ath9k_hw.ko             ledtrig-default-on.ko   usbserial.ko
cfg80211.ko             ledtrig-netdev.ko       uvcvideo.ko
compat.ko               ledtrig-timer.ko        v4l2-common.ko
cp210x.ko               mac80211.ko             videobuf2-core.ko
crc16.ko                mbcache.ko              videobuf2-memops.ko
crypto_algapi.ko        nls_base.ko             videobuf2-vmalloc.ko
ehci-hcd.ko             ohci-hcd.ko             videodev.ko
ext4.ko                 pl2303.ko

Подключение web-камеры

К сожалению, к роутеру не получится подключить первую попавшуюся камеру.
Самый главный критерий выбора - камера должна поддерживать UVC (USB Video Class)
Список моделей камер:
http://ideasonboard.org/uvc/
Так же, было бы здорово, чтобы камера сама сжимала поток и отдавала его в виде mjpg.
Пример: Logitech Webcam C100

Определившись с камерой, просто подключаем её к USB роутера.
После подключения веб-камеры, поддерживающей UVC, появится видео-устройство /dev/video0, данные с которого можно считать и отдавать через сокет в сжатом виде.
Для этого используется утилита mjpg_streamer, которая сжимает каждый кадр в JPEG (если камера отдаёт кадры в формате YUYV).

Ручной запуск mjpg_streamer

/usr/bin# mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 320x240 -f 10" -o "output_http.so -p 8080"
MJPG Streamer Version: svn rev: exported
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 320 x 240
 i: Frames Per Second.: 10
 i: Format............: MJPEG
Unable to set format: 1196444237 res: 320x240
 Init v4L2 failed !! exit fatal
 i: init_VideoIn failed

укажем, что камера выдаёт данные в формате YUYV, указав параметр -y и всё заработает.

# mjpg_streamer -i "input_uvc.so -d /dev/video0 -y -r 320x240 -f 10" -o "output_http.so -p 8080"

при таком режиме работы, нагрузка на проц будет составлять более 90%

Подключение к веб-интерфейсу

Заходим на http://192.168.217.1 и видим интерфейс для управления роботом:

Доступ к светодиодам через GPIO

# ls -asl /sys/devices/platform/leds-gpio/leds/
     0 drwxr-xr-x    6 root     root             0 Jan  1 00:00 .
     0 drwxr-xr-x    3 root     root             0 Jan  1 00:00 ..
     0 drwxr-xr-x    2 root     root             0 Jan  1 00:00 tp-link:green:3g
     0 drwxr-xr-x    2 root     root             0 Jan  1 00:00 tp-link:green:lan
     0 drwxr-xr-x    2 root     root             0 Jan  1 00:00 tp-link:green:wlan
     0 drwxr-xr-x    2 root     root             0 Jan  1 00:00 tp-link:green:wps

гасим и зажигаем светодиод:

echo 0 > /sys/devices/platform/leds-gpio/leds/tp-link\:green\:3g/brightness
echo 1 > /sys/devices/platform/leds-gpio/leds/tp-link\:green\:3g/brightness
echo 0 > /sys/devices/platform/leds-gpio/leds/tp-link\:green\:wlan/brightness
echo 1 > /sys/devices/platform/leds-gpio/leds/tp-link\:green\:wlan/brightness

А у нас ведь есть Lua!

# lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio (double int32)
# lua -e "a=os.time(); print(a);"

попробуем написать скрипт для изменения состояния светодиода

--[[ write to led ]]--
led=io.open("/sys/devices/platform/leds-gpio/leds/tp-link\:green\:3g/brightness", "w");
if led==nil then
	print("Error open file!");
	os.exit(-1);
end
led:write(0);

изменим его, чтобы умещался в одну строчку и скормим lua:

lua -e "led=io.open(\"/sys/devices/platform/leds-gpio/leds/tp-link\:green\:3g/brightness\", \"w\"); if led==nil then print(\"Error open file!\"); os.exit(-1); end led:write(0);"

работает 🙂 теперь напишем blink

--[[ blink ]]--
led=io.open("/sys/devices/platform/leds-gpio/leds/tp-link:green:3g/brightness", "w");
if led==nil then
	print("Error open file!");
	os.exit(-1);
end
val = 0;
t0 = os.time();
t1 = 0;
while 1 do
	t1 = os.time();
	led:seek(beg, 0);
	if t1 > t0 then
		t0 = t1;
		print(val);
		led:write(val);
		if val == 0 then
			val = 1;
		else
		val = 0;
		end
	end
end

переводим в одну строчку:

lua -e "led=io.open(\"/sys/devices/platform/leds-gpio/leds/tp-link:green:3g/brightness\", \"w\"); if led==nil then print(\"Error open file!\"); os.exit(-1); end val = 0; t0 = os.time(); t1 = 0; while 1 do t1 = os.time(); led:seek(beg, 0); if t1 > t0 then t0 = t1; print(val); led:write(val); if val == 0 then  val = 1; else val = 0; end end end"

мигает 🙂 хотя и грузит проц на 99% так как постоянно крутится в бесконечном цикле.

Написание программ на C

Идём на OpenWrt
http://downloads.openwrt.org/backfire/10.03.1/ar71xx/
и скачиваем toolchain
OpenWrt-Toolchain-ar71xx-for-mips_r2-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2 (15.2MB)

распаковываем его в домашний каталог /home/user/dev/toolchains/tplink/, бинарники при этом лежат здесь:

/home/user/dev/toolchains/tplink/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin

экспортируем путь до бинарников в переменную окружения PATH

export PATH="$HOME/dev/toolchains/tplink/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin:$PATH"

пишем тестовую программу:

//
// test
//
// mips-openwrt-linux-gcc -static -s -o test test.c
// mips-openwrt-linux-gcc -o test test.c
//

#include <stdio.h>

int main(int argc, char *argv[])
{
	printf("[i] Start...\n");

	printf("[i] End.\n");
	return 0;
}

сборка тестовой программы:

mips-openwrt-linux-gcc -o test test.c
$ file test
test: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1, statically linked, with unknown capability 0x41000000 = 0xf676e75, with unknown capability 0x10000 = 0x70403, stripped

проверим, скопируем файл на роутер, командой:

scp test [email protected]:/root/

запускаем:

root@OpenWrt:~# ./test
[i] Start...
[i] End.

та-да! получилось!

Подключение переходника USB-RS232

OR-WRT уже поддерживает следующие USB-UART интерфейсы:
* Silicon Labs CP210x, включая OR-USB-UART-v1
* Prolific PL-2303
* FTDI
* Pololu Orangutan SVP-1284
а значит, что Arduino/CraftDuino и большинство переходников сразу заработают.

У меня при первом подключении, переходник USB-RS232 (на базе PL2303) определился как /dev/ttyUSB0, но доступ к себе не давал, но после переподключения всё заработало как нужно.

Для проброса последовательного порта в сеть (сокет), в прошивке уже установлена утилита ser2net.

Вывод

Т.о., мы получаем в свои руки отличный одноплатник с Wi-Fi, Ethernet, USB и UART-ом на борту.
На базе этого роутера можно, например, собрать простого робота телеприсутствия.
Для этого, просто подключаем к роутеру камеру и Arduino, к ардуино лепим мотор-шилд и громоздим это всё на свою робо-тележку или старую детскую машинку.
Теперь к роутеру можно подключиться через Wi-Fi и управлять его движением, посылая команды для контроллера Arduino напрямую через сокет или CGI.

Примечание
у встроенного UART большая ошибка тайминга на скорости 115200, поэтому лучше брать 57600.

Далее: Использование Lua в робототехнике
Кросс-компиляция Lua для TP-LINK TL-MR3020
Lua - модуль для работы с последовательным портом
Запуск своих CGI на Wi-Fi-роутере TP-LINK TL-MR3020
Компьютерное зрение на Wi-Fi роутере TP-LINK TL-MR3020 при помощи tinycv

Ссылки
http://roboforum.ru/wiki/OR-WRT
http://roboforum.ru/wiki/OR-WRT_install
http://ideasonboard.org/uvc/
http://wiki.openwrt.org/toh/tp-link/tl-mr3020
http://wiki.openwrt.org/toh/tp-link/tl-wr703n/ar9331_pinout
http://downloads.openwrt.org/backfire/10.03.1/ar71xx/

Использование TP-Link MR3020:
Простой wifi бот для мониторинга помещений или «кухонное» роботостроение
Включение чего угодно по HTTP без заморочек c OpenWRT
TP-Link MR3020: миниатюрный linux-сервер

По теме
Мозги для робота
Новогоднее исследование ADSL-роутера на базе Linux


43 комментария на «“Исследование Wi-Fi-роутера TP-LINK TL-MR3020”»

  1. Быстрый старт!
    Купил — сделал, все получилось. Хочется продолжения темы, появились вопросы:
    — как переделать страницу веб интерфейса с камерой, добавить свои показометры. SVG?
    — добавить скрипты- для индикаторов, кнопок, приёма отправки строк в UART
    — добавить программы для обмена по i2c spi 1-wire…

    вообщем теперь хочется большего, как в repsberry pi.
    Есть идеи?

    • Кстати, в стандартном репозитарии пакетов OpenWrt () есть пакеты i2c-tools и kmod-i2c-*. i2c-tools содержит утилиты для работы с итуси, а пакеты kmod-i2c-* содержат модули ядра для итуси. Их можно распаковать, переправить на дИвайс и использовать по назначению.

      З.Ы. в этом репозитарии ещё куча интересных пакетов есть. я некоторые протестировал на TL-MR3020, всё работает!

    • ссылка запоролась, вот она: downloads.openwrt.org/snapshots/trunk/ar71xx/packages/.

    • Это да! Вчера смотрел в гугле что за пакеты такие. Только команды линукса я только-то начал изучать, еще пакеты ставить пока не умею. И еще не понятно где находятся SDA SCL (общий нашел :))), в pinoute на MR3020 не обозначено.

      А вообще план такой:
      + расширить флешку FL032 || Fl128 параллельно с переключением (получается save mode)
      + разъем UART Tx Rx Gnd +3v3
      — родной блок питания свистит
      с неродным блоком 5В 500мА не запускается, мигает
      -добавить DC/DC на вход 5В, чтоб питать от любого источника

      + OR-WRT Open Robot WRT
      + telnet — ssh
      — TFTP
      — mc

      + WeServer static — html cgi скачать с роутера файлы
      нужно только разобраться
      — VideoStreaming с вебкамеры
      — WebIDE, как для — Python Lua sh — Simplisity
      http://www.adafruit.com/blog/2012/10/05/the-adafruit-learning-system-raspberry-pi-webide-is-ready-for-testing-piday-raspberrypi-raspberry_pi/

      Осваиваю команды консоли.
      Еще интересна Lua — именно как язык, очень красиво сделано на мой взгляд. Просто изучать, мозг не выносит… вообщем зацепило!

    • Да, меня вот тоже, именно так, «зацепило».
      Кстати, извините за любопытство, зачем вам TFTP? ИМХО, scp гораздо удобнее и понятнее.

      еще пакеты ставить пока не умею.

      их как раз поставить много не получится, на внутренней флэшке всего 400 КБ свободно. По-моему, удобнее их распаковывать на компьютере (архиватором) и закидывать на устройство через флэшку.

      Я, например, сделал так:
      *отформатировал флэшку в ext4 (из-под линукса, через mke2fs)
      *записал на нёё бинарники, извлечённые из пакетов на компе
      *вставил в роутер
      *примонтировал её на роутере
      *построил свою вольницу с викодином и медсёстрами использую флэшку для перекидывания и хранения файлов между девайсом и компом

      Осваиваю команды консоли.

      у издательства O`Reilly была очень удобная и полезная книжица по командам консоли линукса, погуглите — очень помогает при осваивании консоли

    • Есть.

      — как переделать страницу веб интерфейса с камерой, добавить свои показометры. SVG?

      а волшебная папочка /www вам на что? туда можно кидать что угодно, и uhttpd (вебсервер) будет это что угодно хостить.

      — добавить скрипты- для индикаторов, кнопок, приёма отправки строк в UART

      #!/bin/sh
      echo "blablabla" > /dev/ttySX 

      -уарт

      #!/bin/sh
      echo "1" > /sys/devices/platform/leds-gpio/leds/tp-link:green:3g/brightness 

      -управление светодиодом

      — добавить программы для обмена по i2c spi 1-wire…

      в том тулчейне, на который дана ссылка в статье, есть заголовочные файлы C для приложений Linux. Наверняка там будет и заголовочный файл для работы с i2c, тем более что в ядре этот модуль есть:

      # lsmod
      Module                  Size  Used by    Tainted: G
      ***
      i2c_dev                 4032  0
      ***

      Так что дерзайте и да пребудет с Вами Сила!

  2. 1. Правильно ли я понял, что в папку www можно записывать файлы и после перезагрузки они не исчезнут? или всё-таки нужно подключать флешку?

    2. На обратной стороне платы есть микросхемка FL032PIF — SPI-флэш на 4 мегабайта — можно ли «проапгрейдить» до, например, 8-ми

    3. То же самое с ОЗУ — если взять с какой-либо старой планки DDR, а может «напаять» сверху такую-же (и развести канал Chip select)?

    4. Т.к. место есть, возможно ли вставить USB-хаб? Прошивка это поймёт?

    • а) конечно, можно. к / примонтирована на чтение-запись энергонезависимая флэш-память, правда свободно всего 400 кб.
      бе) можно, но придётся пересобирать ядро и файловую систему.
      це) тут проблемнее. вам придётся очень долго мучаться с поисками подходящей микросхемы памяти. насчёт развода CS — не знаю, никто до вас не пробовал.
      де) можно. поймёт и примет. (по крайней мере, должна)

    • дополнение к це: правда, если вы мазохист и умеете держать в лапах паяльник (до уровня гуру СМД монтажа), можно попробовать припаять какую-нибудь «неподходящую» микруху параллельной памяти. принцип работы ведь у них один и тот же. в любом случае, если будете пробовать, обязательно отпишитесь о результатах!

  3. Очень интересное железо. Спасибо.

    Не смог разобраться как заставить устройство разговаривать по встроенному uart. Помогите, пожалуйста…

    • допусим, я хочу попросить его через ssh, отправить мне по юарту «hello world»…
      тТипо того, как светодиодами мигали…

    • а… вижу. Кажется этот вопрлс уже был…

  4. Можно посоветовать какую-нибудь литературу…

    Для понимания процесса.
    По линуксу, командной строке, OpenWRT…
    Чтобы вообще понимать, что происходит…

    • по командной строке выше какую-то книжку рекомендовали, а по линуксу… Его нужно ставить — хотя бы на виртуалку и изучать. если интересует применительно к встраиваемым системам, то на форуме есть подборка книг и ресурсов.

  5. Камера uvcvideo: Found UVC 1.00 device CNF7129 (04f2:b071) — из Asus EEE-PC 900ю
    Пытаюсь сделать видеопоток 640×480 так (камера позволяет):
    mjpg_streamer -i «input_uvc.so -d /dev/video0 -y -r 640ч480 -f 10» -o «output_http.so -p 8080»
    но на веб-страничке всё равно маленькое окно и изображение полосами.

    Куда копнуть?

    • внимательнее перечитать статью-описание прошивки.
      Там есть раздел Мусор или артефакты на видео, в котором чётко указано, что

      В частности, YUV более 320*240*15 наверняка будет «полосить» и «квадратить»

      ничего удивительного в этом нет — процессор всё же довольно слабый — его и 320×240 грузят почти под завязку — что уж говорить про 640×480 )

    • Так же, было бы здорово, чтобы камера сама сжимала поток и отдавала его в виде mjpg.
      Пример: Logitech Webcam C100

      А если такую камеру поставить? Ведь роутеру нужно просто будет гнать байты с девайса в сокет?

    • Нужно использовать камеру logitech c 270 (может и еще какие, но тестил на ней) она вещает в mjpeg, у меня стабильно работает в разрешении 640 на 480 при 25 кадрах при аптайме более месяца (использовал роутер как айпи-камеру), загрузка процессора всего на 5%, еще эта камера очень хорошо показывает при плохом освещении, специально купил для своих проектов, например на роутере asus n10 с этой камерой можно смело ставить разрещения вплоть до 1024 на 1280. В www\res\main.css ставим width: 640px; height: 480px; и наслаждаемся большой картинкой там же убираем черно-желтую рамку.

  6. Решил повторить проект.Всё хорошо, только когда захожу на 192.168.217.1 то камера сделала одно фото и всё.Теперь картинка просто стоит там, и не меняется при повторном входе.Может кто нибудь сталкивался с данной проблемой?

  7. Народ хелп.
    немогу зайти на роутер после прошивки, телнетом соеденяюсь по 21 порту.
    чего не ввожу в ответ одно и тоже, заранее спасибо за помошь, вот что телнет пишет
    —== Подключение к 192.168.217.1:21 [25.06.2013 10:57:01] ==—
    220 (vsFTPd 3.0.2)
    >> wifi ip
    530 Please login with USER and PASS.
    >> Login root
    530 Please login with USER and PASS.
    >> passwd
    530 Please login with USER and PASS.
    —== Соединение ЗАКРЫТО Пользователем [10:59:40] ==—

    —== Подключение к 192.168.217.1:1 [25.06.2013 10:59:47] ==—
    —== Сервер 192.168.217.1:1 — не найден! ==—
    —== Подключение к 192.168.217.1:0 [25.06.2013 11:00:06] ==—
    —== Сервер 192.168.217.1:0 — не найден! ==—
    —== Подключение к 192.168.217.1:21 [25.06.2013 11:00:14] ==—
    220 (vsFTPd 3.0.2)
    —== Соединение ЗАКРЫТО Пользователем [11:02:33] ==—

    —== Подключение к 192.168.217.1:21 [25.06.2013 11:08:49] ==—
    —== Сервер 192.168.217.1:21 — не найден! ==—
    —== Подключение к 192.168.217.1:21 [25.06.2013 11:09:10] ==—
    —== Сервер 192.168.217.1:21 — не найден! ==—
    —== Подключение к 192.168.217.1:21 [25.06.2013 11:09:15] ==—
    —== Сервер 192.168.217.1:21 — не найден! ==—
    —== Подключение к 192.168.217.1:21 [25.06.2013 11:09:42] ==—
    220 (vsFTPd 3.0.2)
    >> orwrt_init
    530 Please login with USER and PASS.
    >> # cat /proc/meminfo
    530 Please login with USER and PASS.
    >> root
    530 Please login with USER and PASS.
    >> login root pass admin
    530 Please login with USER and PASS.
    >> passwd
    530 Please login with USER and PASS.
    >> admin admin
    530 Please login with USER and PASS.
    —== Соединение ЗАКРЫТО Пользователем [11:15:03] ==—

    • 21-й порт — это FTP, а telnet обычно на 23-й делают О_о

  8. все роутер прошил, разобрался вроди что с ним да как, остался последний вопрос:
    Как подключить его к ардуино мега 2560??? блин помогите люди добрые. уже кучу форумов перелопатил. Напишите как для дауна младшего дошкольного возраста.без разницы по usb или по юарту. только поточнее. главное напишите как настроить соединение и какими командами послать в дуину данные и получить.

  9. Застрял на изменении файла main.css. Никогда с Linux не сталкивался. Не могу отредактировать этот файл (хочу изменить разрешение на камеру) Делаю следующее:
    sed ‘s/width: 320px;/width: 640px;/g’ res/main.css и аналогично с height(находясь в папке WWW). Как я понимаю дело в разрешении.Помогите. Спасибо.

    • так ведь не обязательно редактировать файл прямо на роутере (хотя там вместо sed можно использовать vi) — просто скопируйте файл себе на компьютер, отредактируйте в любимом текстовом редакторе (желательно чтобы он сохранял unix-овый перенос строк — например notepad++), а потом залейте файл обратно при помощи scp или WinSCP.

  10. Пытаюсь написать самопальную программу на windows по управлению устройствами подключенными к USB. Какого вида должен быть запрос к сервису ser2net по ethernet для выдачи своих данных. (echo «A» > /dev/ttyUSB0 работает).

    • ser2net просто пересылает все полученные байты из сокета в последовательный порт (и обратно). Т.о., просто пишите в сокет свои данные (байт, пакет и т.п.).

    • в списке запущенных процессов нет ser2net, ввожу ser2net, процесс появляется но связи нет. Ввожу ser2net -c /etc/ser2net.conf связи все равно нет. Ввожу ser2net -p 3000 — связь устанавливается, но на любую строку приходит ответ Unknown command:… Опишите пожалуйста пошагово как надо.

    • Но вводя ser2net -C «3000:raw:600:/dev/ttyUSB0:57600 NONE 1STOPBIT 8DATABITS -XONXOFF -LOCAL -RTSCTS», все работает, Ура!!!
      Научите как прописать в автозагрузку ser2net?

    • Здравствуйте! У меня при сборке возникло пару проблем. Если у вас есть время, дайте мне пожалуйста ваш скайп, попробую вам объяснить что не получается. Буду очень благодарен за помощь.

  11. А как научить TP-link с прошивкой OR-WRT цепляться по Wi-fi к другому роутеру как клиенту?

    Через веб-форму как в инструкции не получается — отображается 3 строки, 2 радиокнопки и все…
    Прошивка эта garr.dl.sourceforge.net/project/orwrt/0.77/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin

    В лучших традициях линя хочу настроить через ssh руками прописывая настройки в конфигурационные файлы. Помочь никто не может?:)

    • у меня на этой прошивке все с веб морды настраивается

    • Ну хз, у меня на лисе под линем веб-форма работала косо, я не стал запариваться и просто собрал дистрибутив сам по инструкции wiki.openwrt.org/doc/howto/buildroot.exigence. Там же нашел инструкцию по тому как в /etc/config/wireless настроить wi-fi. Буду теперь впилиливать дистрибутив на внешнюю флешку и работать с нее.

  12. Подскажите пожалуйста!
    Случайно отключил HTTP сервер через WEB панель, поставив галочку на disable, через браузер зайти больше не возможно.

    Какой командой через SSH теперь можно включить http сервер обратно?

  13. Привет всем!
    У меня возникла проблема. Хотел собрать на базе этого девайса роутер которой может немного больше чем просто вафлю раздавать.
    Решил сделать сам павербанк, из за чего испортил устройство.
    Подал через мини юсб 7.4 вольта.
    Случилось из за того что случайно подключил один из четырёх аккумуляторов последовательно.
    Использовал UltraFire 18650. 3.7 вольта.
    Когда подключал один аккумулятор всё работало нормально кроме светодиодов, только один нормально горел.
    Если кто то может помочь с починкой или хотябы видел материалы по этой тематике ответьте пожалуйста!

  14. Купил, прошил, всё как будто заработало, но есть две проблемы:
    а) при попытке примонтировать флэшку, подключённую через USB:

    root@OpenWrt:/mnt# dmesg
    *********
    [ 1481.380000] usb 1-1: new high-speed USB device number 2 using ehci-platform
    [ 1481.530000] scsi0 : usb-storage 1-1:1.0
    [ 1482.530000] scsi 0:0:0:0: Direct-Access     JetFlash TS4GJFV60        8.07 PQ: 0 ANSI: 2
    [ 1482.530000] sd 0:0:0:0: [sda] 7938048 512-byte logical blocks: (4.06 GB/3.78 GiB)
    [ 1482.530000] sd 0:0:0:0: [sda] Write Protect is off
    [ 1482.530000] sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00
    [ 1482.540000] sd 0:0:0:0: [sda] No Caching mode page present
    [ 1482.540000] sd 0:0:0:0: [sda] Assuming drive cache: write through
    [ 1482.540000] sd 0:0:0:0: [sda] No Caching mode page present
    [ 1482.540000] sd 0:0:0:0: [sda] Assuming drive cache: write through
    [ 1482.830000]  sda: sda1
    [ 1482.840000] sd 0:0:0:0: [sda] No Caching mode page present
    [ 1482.840000] sd 0:0:0:0: [sda] Assuming drive cache: write through
    [ 1482.840000] sd 0:0:0:0: [sda] Attached SCSI removable disk
    root@OpenWrt:/mnt# mkdir /flash
    root@OpenWrt:/mnt# mount -t vfat /dev/sda1 /flash
    mount: mounting /dev/sda1 on /flash failed: No such device
    

    ну вот почему?
    б) почему-то не могу зайти на веб-интерфейс девайса: сайт требует аутентификации, перепробовал все варианты логинов/паролей, но всё равно не пускает.
    Вообщем хелп ми плиз.

    • думаю, поддержка файловой системы FAT просто не включена в ядро 😉 а пароль тот, который вы задали для root-а при первом подключении через telnet.

    • Я пробовал логиниться с логином root и паролем рута (тем самым, который я задавал при первом подключении). Не пускает 🙁

    • Все, баг пофиксен — оказалось, что это мой локальный глюк, после битья головой об стену нескольких перезагрузок все стало нормально.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение