roboforum.ru

Технический форум по робототехнике.

Робот на базе роутера D Link DIR-320

Робот на базе роутера D Link DIR-320

esprit » 14 фев 2011, 07:33

==================================================================================================================
Вставка от =DeaD=

ВНИМАНИЕ!!! На рынке сейчас часто вместо DIR-320 продаётся DIR-320NRU - это совершенно другой по железу роутер и всё что тут описано к нему не имеет отношения. Будьте бдительны!

На текущий момент задача проброски видео и уарта на роутере D-Link DIR-320 решена полностью, при этом в рамках флеш-памяти роутера, т.е. для работы подключение каких-то флешек или usb-хабов не требуется.

Порядок модификации роутера для этой задачи подробно описан в вики на странице [[DIR-320]].

Кроме того от пользователя d3xr есть описание установки прошивки OpenWrt на DIR-320, оно находится на странице [[OpenWrt]]
==================================================================================================================


Вдохновленный темой http://roboforum.ru/forum40/topic5222.html, задумался над созданием робота на базе этого роутера. Первоначальный функционал - управляемый с компьютера робот по каналу Wi-Fi. Робот прошит (так скажем, не без усилий) прошивкой от http://vampik.ru/. На нем завелась Linux-подобная операционка, можно подключиться Телнетом. Задача первая научиться рулить роботом посредством операционной системы. На борту есть USB порт, говорят есть UART. Вот его лицо
face.jpg
, а это спина
back.jpg
.

Re: Робот на базе роутера D Link DIR-320

boez » 01 мар 2011, 12:42

Во блин, чукча не читатель :) Я ж вчера это видел и уже забыл. вернее забыл, что видел именно здесь.
А в целом - затея интересная, роутеры как платформа для робота - интересная идея, попадает в нишу между аврками и Mini-ITX и по стоимости, и по производительности. Буду следить.

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 01 мар 2011, 12:46

Главное - оно видео пробрасывает в нужном количестве! То есть в отличие от китайской радиокамеры тут хоть 10 роботов в одном помещении запускай - если конечно HD-видео не гнать :)

Re: Робот на базе роутера D Link DIR-320

Myp » 01 мар 2011, 13:09

рутер не стартует после замыкания RxTx потому что туда выводится лог загрузки, а так же читается то что вводится.
соответсно рутер читает свой собственный длиннющий лог и виснет в момент когда ожидается ввод символов )

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 01 мар 2011, 13:14

Да, я уже примерно так и понял :)

Буду сегодня пробовать отключить отладочный вывод на этом UART'е

Re: Робот на базе роутера D Link DIR-320

nsk-racer » 01 мар 2011, 14:46

Я же уже начинал такую же тему :) У меня с камерой не получилось, увидел у вас, что есть готовая прошивка, теперь буду пробовать эту прошивку использовать :)

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 01 мар 2011, 21:47

Успешно отцепил UART от отладочной консоли командами:
nvram set kernel_args="root=/dev/mtdblock2 rootfstype=squashfs,ext3 noinitrd init=/linuxrc console=null"
nvram commit


теперь роутер спокойно перегружается даже с перемычкой между RX/TX, проверил обмен - при наличии перемычки получаю эхом всё что нужно с UART'а обратно в сокет. Осталось подцепить на роутер наш реальный контроллер OR-AVR-M128-DS и попробовать им порулить через роутер.

Re: Робот на базе роутера D Link DIR-320

Myp » 01 мар 2011, 21:56

интересно а как бы это всё провернуть но в обычном рутере?
у которого файловая система ридонли :)

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 01 мар 2011, 21:57

Купи себе DIR-320, у него цена какие-то жалкие 1.5тр.
Поверь, это удовольствие того стоит! :wink:

Я кстати сейчас в инете через него сижу :)

Re: Робот на базе роутера D Link DIR-320

Myp » 01 мар 2011, 22:27

да, он бушный от 300 до 500 рублей стоит.
но совесть не позволяет =)

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 02 мар 2011, 01:36

Хорошая новость и плохая :)

Хорошая - уже в сторону контроллера OR-AVR-M128-DS пробросился UART, т.е. сервами уже рулю, отправляя с ПК в сокет роутера команду, а моя софтина на роутере пересылает её на UART и контроллер выполняет.

Плохая - с контроллера какая-то фигня приходит вместо инфы :) т.е. какие-то заморочки с обратной связью, хотя с перемычкой всё окей было.

Добавлено спустя 15 минут 10 секунд:
При этом команда возвращающая 1 символ проходит на ура, Q возвращает . или + в зависимости от того - завершилась ли предыдущая команда.

Добавлено спустя 40 минут 55 секунд:
Полная победа над созданием своего приложения. В настройках порта исходников espirit'а стояло использование бита четности :) убрал и всё заработало на 100%

Актуальная версия:
Код: Выделить всёРазвернуть
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

int main(int argc, char *argv[])
{
    int sock_fd, listener;
    struct sockaddr_in addr;
    char buf[100];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
      perror("Can't create  socket");
      return -1;
    }
   
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3000);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
     perror("Can't bind port");
     close(sock_fd);
     return -1;
    }

    listen(listener, 1);
   
//    printf("Listening port   :%s\n",prt);


int tty_fd; /* File descriptor for the port */
int n;
struct termios options;

tty_fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (tty_fd == -1) perror("open_port: Unable to open /dev/ttyS0 - ");
else
{
fcntl(tty_fd, F_SETFL, 0);

tcgetattr(tty_fd, &options);
cfmakeraw(&options);

/************************************************************************/
// c_cflag
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag |= CREAD; // Enable Receiver
options.c_cflag |= CLOCAL; // Ignore modem control lines.

cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);

tcsetattr(tty_fd, TCSAFLUSH, &options);
tcflush(tty_fd, TCIOFLUSH); /**/
}


    while(1)
    {
        sock_fd = accept(listener, NULL, NULL);
        if(sock_fd < 0)
        {
         perror("Can't bind port");
         close(sock_fd);
         return -1;
        }
        printf("Connect accepted\n");
        while(1)
        {

          fd_set rfds;
          struct timeval tv;
          int retval;
          int nfds=tty_fd+1;
          if(sock_fd>tty_fd) nfds=sock_fd+1;

          FD_ZERO(&rfds);
          FD_SET(tty_fd, &rfds);
          FD_SET(sock_fd, &rfds);

          tv.tv_sec = 10;
          tv.tv_usec = 0;
          retval = select(nfds, &rfds, NULL, NULL, &tv);

          /* Не полагаемся на значение tv! */
          if (retval)
          {
            printf("Some data available.\n");
            if (FD_ISSET(tty_fd, &rfds))
            {
              bytes_read = read(tty_fd, buf, 50);
              send(sock_fd, buf, bytes_read, 0);
              buf[bytes_read]=0;
              printf("=>Socket: %s\n",buf);
            };
            if (FD_ISSET(sock_fd, &rfds))
            {
              bytes_read = recv(sock_fd, buf, 50, 0);
              if(bytes_read <= 0) break;
              write(tty_fd, buf, bytes_read);
              buf[bytes_read]=0;
              printf("Socket=>: %s\n",buf);
            };
          }
          else
            printf("No data in 10 seconds.\n");

        }
   
        close(sock_fd);
    }
   
    return 0;
}


Добавлено спустя 41 секунду:
Осталось поместить эту программу во флеш роутера, поставить в автозагрузку и собрать из этого готовую прошивку

Добавлено спустя 2 часа 2 минуты 30 секунд:
Трындец подкрался незаметно :)

То ли в линухе тоже есть динамические библиотеки, то ли что-то еще, но в общем "suart" свой я скопировал во флеш роутера в /usr/local, но он, зараза, не запускается, пока я не подмонтирую флешку :(

При этом если флешка подмонтирована в /opt, то запускается из каталога /usr/local без вопросов, а если нет - пишет:
-sh: ./suart: not found


Пробовал запускать явно с путём - та же ерунда, если подмонтирована флешка - запускается, иначе пишет:
-sh: /usr/local/suart: not found


Кто нибудь в курсе как это лечится?

Re: Робот на базе роутера D Link DIR-320

dccharacter » 02 мар 2011, 01:47

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

а, может это у тебя хардлинк какой-нить лежит в /usr/local ????

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 02 мар 2011, 02:05

По ходу начинаю разбираться, вытащил через "ldd /opt/suart" какие библиотеки нужны полученной программе.
И ужаснулся. Одна в 700Кб, вторая в 27Кб, а еще сама программа в 40Кб.

Наверное ведь есть способ собрать программку в более компактном варианте?

Добавлено спустя 11 минут 15 секунд:
dccharacter писал(а):а, может это у тебя хардлинк какой-нить лежит в /usr/local ????

Хм, да вроде я через "cp /opt/suart /usr/local/suart" копировал. Оно же не хардлинк создаёт?

Добавлено спустя 4 минуты 5 секунд:
Точно не хардлинк, через "cat /usr/local/suart" выводится содержимое.

Нашел что в /lib/ лежат файлы аналогичные нужным, но размером 444Кб и 23Кб.

Интересно, можно ли как-то заставить свою программу пользоваться уже имеющимися на роутере библиотеками?

Re: Робот на базе роутера D Link DIR-320

dccharacter » 02 мар 2011, 02:16

=DeaD= писал(а):Добавлено спустя 4 минуты 5 секунд:
Точно не хардлинк, через "cat /usr/local/suart" выводится содержимое.

При отмонтированной флешке?

Добавлено спустя 4 минуты 45 секунд:
=DeaD= писал(а):Интересно, можно ли как-то заставить свою программу пользоваться уже имеющимися на роутере библиотеками?

Попробуй создать линки, гы г ыгы

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 02 мар 2011, 02:25

dccharacter писал(а):При отмонтированной флешке?

Да.

dccharacter писал(а):Попробуй создать линки, гы г ыгы

Откуда? Этой ветки файловой системы не существует при отмонтированной флешке.

К тому же я подозреваю, что это при компиляции надо как-то указывать, чтобы программа использовала библиотеки из системного /lib, а не /opt/lib набора.

Re: Робот на базе роутера D Link DIR-320

Vooon » 02 мар 2011, 09:25

Блин, ДеаД, программы нужно класть в ./bin/ !
Положи в /usr/bin.
Потом нужно будет запустить ld-config или что-то вроде того.


Rambler\'s Top100 Mail.ru counter