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

=DeaD= » 27 фев 2011, 23:24

В прошивках vampik нету поддержки UVC-вебкамер, поэтому сразу нет :)

Добавлено спустя 27 минут 7 секунд:
Всё, buildroot поставил, сейчас буду пробовать написать и скомпилировать "Hello World!" :)

Добавлено спустя 13 минут 29 секунд:
Ура! "Hello world!" успешно собрался и запустился! :Yahoo!:

Завтра продолжим изыскания :oops:

Протокол телодвижений записан в [[DIR-320]], желающие присоединиться - приветствуются!
Кстати, никто не знает более разумного способа ввода текста программы в файл, чем "echo ... >> файл" ?

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

esprit » 28 фев 2011, 07:58

Настройте ssh и можно писать прямо с компа. В приложении клиент.
Вложения
winscp310.rar
(701.3 КиБ) Скачиваний: 0

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

=DeaD= » 28 фев 2011, 10:08

В каком смысле "писать прямо с компа" ? Там текстовый редактор что-ли будет или возможность кинуть файл с компа? Я так думаю должна быть какая-то простая возможность кинуть файл с компа или закачать его с роутера запросом, чтобы без этих наворотов с SSH, или я ошибаюсь?

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

boez » 28 фев 2011, 11:49

SCP (Secure Copy Protocol) и SFTP - протоколы передачи файлов через ssh. WinSCP поддерживает их оба. Т.е. да, можно будет переливать файлики туда-сюда между роутером и ПК. Но это только в том случае, если dropbear, который живет в dd-wrt, эти протоколы поддерживает.

Судя по вот этому https://www.dd-wrt.com/wiki/index.php/SFTP_with_DD-WRT - для поддержки sftp нужно родного демона менять на неродного. А вот scp может поддерживаться и "из коробки" - пробовать надо.

Пы.Сы Если надо просто залить мелкий скрыпт - я набираю его в блокноте, а потом Ctrl-A Ctrl-C и в PuTTY набираю 'cat >/etc/super-puper.conf', потом правой кнопкой вставляю и по Ctrl-D завершаю создание файла.

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

=DeaD= » 28 фев 2011, 11:57

Я видимо тоже пока через Ctrl+C, Ctrl+V буду работать :)

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

Myp » 28 фев 2011, 12:37

а для пущей красоты через SSH нужно пробросить компорт роутера :)
дабы на компе программы могли напрямую общаться с железным компортом роутера )

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

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

esprit » 28 фев 2011, 12:41

Откуда взяли, что в прошивке от vampik нету поддержки UVC-веб камер?

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

=DeaD= » 28 фев 2011, 13:52

Вот тут: http://wl500g.info/showthread.php?t=17641
Только в 1.в. сказано, что есть поддержка UVC-камер.

А что, у vampik'овской тоже есть поддержка?

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

esprit » 28 фев 2011, 14:42

Я полагаю нужно добавить "Автоматическое монтирование флешки

echo “#!/bin/sh” > /usr/local/sbin/post-mount
echo “mount /dev/scsi/host0/bus0/target0/lun0/part1 /opt” >> /usr/local/sbin/post-mount
chmod +x /usr/local/sbin/post-mount
flashfs save
flashfs commit
flashfs enable

Файл «post-mount» выполняется системой на автомате после монтирования дисков, а последние три строки сохраняют изменения во встроенной памяти роутера. Не забывай выполнять их, иначе рискуешь потерять данные после перезагрузки!"

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

=DeaD= » 28 фев 2011, 14:58

Потерять данные или монтирование? По идее подмонтировал снова и данные снова на месте, или я что-то забываю?

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

=DeaD= » 28 фев 2011, 22:57

esprit писал(а):Во вложении исходники сервера и клиента.

Я так понимаю там простое эхо? Весь реальный обмен с UART портом закомментирован до лучших времен? :)
Я думаю можно уже начать отлаживать UART обмен тупо замкнув через резистор RX и TX на разъеме роутера :)

Добавлено спустя 27 минут 32 секунды:
Основной цикл, который надо переделать на уарт с обычного эха сокета:
Код: Выделить всёРазвернуть
    while(1)
    {
        sock = accept(listener, NULL, NULL);
        if(sock < 0)
        {
         perror("Can't bind port");
         close(sock);
         return -1;
        }
        printf("Connect accepted\n");
        while(1)
        {
            bytes_read = recv(sock, buf, 1, 0);
           if(bytes_read <= 0) break;
//            write(fd, buf, 4);
//            if (n < 0)
//                 printf("write() of 4 bytes failed!\n", stderr);
          printf("Data accepted\n:%s",buf);
//              printf(buf);
            send(sock, buf, bytes_read, 0);
        }
   
        close(sock);
    }


Добавлено спустя 1 час 5 минут 45 секунд:
Я что-то окончательно чумею, а есть какой-то метод проверить ждёт ли меня в буфере последовательного порта символ или нет? А то read() завешивает программу пока что-нибудь не поступит.

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

noonv » 28 фев 2011, 23:42

есть :)
тэээкс... сейчас загляну в закрома кода :)

вот так можно узнать, есть ли данные для считывания:
Код: Выделить всёРазвернуть
int bytes;
ioctl(port_fd, FIONREAD, &bytes);
return bytes;

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

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

Я еще пытаюсь правильней сделать - через select
Но пока не очень получается :(

Добавлено спустя 6 минут 9 секунд:
А, всё, нашел свой косяк, первый параметр в select кривой передаю :)

Добавлено спустя 20 минут 47 секунд:
esprit писал(а):http://dipcore.com/wp-content/uploads/2010/05/dir320_UART_pinout.jpg

А это проверенная распиновка? А то когда я на ней Rx и Tx замыкаю через 6.8кОм резистор - у меня роутер умирает и не возвращается в чувство, пока перемычку не уберу....

Добавлено спустя 1 минуту 9 секунд:
Актуальный исходник программы suart.c для проброса сокета в уарт и обратно с использованием select:
Код: Выделить всёРазвернуть
#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[1];
    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, 100);
              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, 1, 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;
}


Добавлено спустя 20 минут 56 секунд:
Похоже проблема не в распиновке, только не знаю как подступиться, завтра будут осциллографом тыкать в контакты.

В общем при старте видимо нельзя замыкать RX/TX, потому как там консоль отладочная похоже, а при работе очень оно к статике чувствительно, перезагружает на раз-два видимо.

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

boez » 01 мар 2011, 12:08

Цитата откуда-то с инета:

Если необходимо использовать этот uart порт для других целей (наиболее часто используют для шаринга с ресиверами без lan порта, подключения GPS, можно также подключить микроконтроллер и взаимодействовать с ним через uart) необходимо отключить отладочную консоль от /dev/ttyS0. Необходимо ввести команды:
Код: Выделить всёРазвернуть
nvram set kernel_args="root=/dev/mtdblock2 rootfstype=squashfs,ext3 noinitrd init=/linuxrc console=null"
nvram commit


И перезагрузиться. Вернуть все назад можно командой:

Код: Выделить всёРазвернуть
nvram set kernel_args="root=/dev/mtdblock2 rootfstype=squashfs,ext3 noinitrd init=/linuxrc console=/dev/ttyS0"
nvram commit

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

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

2boez: Да, это я уже записал себе в заметки на предыдущей странице post198262.html#p198262

Сегодня вечером буду двигаться дальше.


Rambler\'s Top100 Mail.ru counter