Разработка робота удалённого присутствия.

Using Kolibri in embedded systems
  • KolibriOS - это раз.
    Работать с сокетами просто - это два.
    Успехов!
  • Аааа! Да что ж ты будешь делать... Исправил, спасибо)
  • lonely_warrior
    Для Колибри есть fmpeg, но только декодеры. Скомпилировать нужный кодек тоже не проблема. Есть даже шанс подключить гпу под это дело.
  • 1. Мостовые переключатели надо делать на полевиках:
    а) они лучше держат индуктивную нагрузку,
    б) у них лучше проводимость и время переключения,
    в) у биполярников самое слабое место - положительный температурный коэффициент проводимости канала. Он легко приводит к локальному пробою на больших токах.

    2. СОМ-порт слишком медленный для управления мостами, и ему десериализатор нужен.
    Лучше работай через LPT: 8 бит как раз хватит на 4 ведущих движка (вперед/назад и вкл/выкл), и еще 4бита на руку и голову.

    3. А слабо рукой в розетку попадать для подзарядки? :D

    4. У вебкамеры два недостатка: CCD и USB.
    На бегу CCD размазывает картинку, а USB вносит серьезную задержку при передаче.
  • Без обид, но уж очень напоминает:
    Spoiler:
    shelbottexaiscreengraboct2010.jpg
    shelbottexaiscreengraboct2010.jpg (58.56 KiB)
    Viewed 12943 times
    На вскидку - не знаю как электрическая часть (схема принципиальная электрическая отсутствует), но механика на вскидку не очень хороша - низкая устойчивость, высокий центр тяжести. Также не понятно где размещается элементы питания для электроники и двигателей.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Итак, повозился кое с чем.
    В плане программирования немного побаловался с FASM и TinyC. Пытался ещё сделать бинарник на GCC, G++ но как-то не получилось. Может и вернусь к этому, но вероятно хватит того, что есть. А ещё извращался - запускал старый добрый TP7 под DosBox. С тормозами но работает.

    Так же сделал запись с веб-камеры встроенной в голову робота, во время его передвижения по комнате. На мой взгляд вполне сносное качество, достаточное для того, чтобы оператор мог ориентироваться в пространстве. art_zh, как показывали мои прошлые эксперименты передача видео по интернету даёт гораздо большую задержку - около 800 миллисекунд, при максимально возможном сжатии и подходящей фазе луны. Управлять не так удобно как хотелось бы, но других вариантов нет, и размениваться на те копейки, которые вносит задержка по usb смысла не вижу. Ну серьёзно.
    Видюха вот - http://www.youtube.com/watch?v=yqL8auvib0E

    Mario_r4, а что не так с Шелботом? :lol: Ну да, есть схожесть в построении, но вот я прикрепил к посту пару фото более приятного на вид экземпляра. А суть то та же.
    С высоким центром тяжести я мало что могу сделать - мне нужен выской робот, он должен иметь элемент зрительного контакта с человеком. Нужно это для дела. Я бы рад поменьше да пониже смастерить, да не то будет.
    Сегодня попробовал кстати его уронить пару раз, посмотреть что будет. Целый остаётся, только ось из переднего колеса вылетает и крутилка головы. Но они не закреплены пока вообще, так что ничего страшного. Он у меня не раз врезался в препятствия на полном ходу - не падал. В целом по ощущениям - если специально его не толкать - падать он не будет.
    На платформе внизу забронированно место для двух 14В аккумуляторов литио-ионных. В общем это мелочёвка, не о том сейчас голова болит =)
    Attachments
    Снимок-2.png
    Снимок-2.png (398.8 KiB)
    Viewed 12864 times
    Снимок-1.png
    Снимок-1.png (385.67 KiB)
    Viewed 12864 times
  • lonely_warrior wrote:С высоким центром тяжести я мало что могу сделать - мне нужен выской робот, он должен иметь элемент зрительного контакта с человеком. Нужно это для дела. Я бы рад поменьше да пониже смастерить, да не то будет.
    Я подразумевал, что в таких роботах специально выносят все тяжелые элементы пониже, а все выступающие верх делают более легкими - это и обеспечивает устойчивость. Вообще стоит приглядеться к марсоходам.
    lonely_warrior wrote:Сегодня попробовал кстати его уронить пару раз, посмотреть что будет. Целый остаётся, только ось из переднего колеса вылетает и крутилка головы. Но они не закреплены пока вообще, так что ничего страшного. Он у меня не раз врезался в препятствия на полном ходу - не падал. В целом по ощущениям - если специально его не толкать - падать он не будет.
    На платформе внизу забронированно место для двух 14В аккумуляторов литио-ионных. В общем это мелочёвка, не о том сейчас голова болит =)
    Испытания на прочность нужно проводить для законченной конструкции. ;-)
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Доброго, всем, кто следит за темой.
    Я тут кой чего поднавоял. Где-то успешно, где-то нет.
    Во-первых сделал один H-мост. На биполярниках. Да да, не спорю - остальные буду паять на полевиках. Просто детали уже купил, и там моторчик слабый - много мощности ему не нужно. Голову крутит.
    Схема внешне напоминает куру гриль. Использовались транзисторы 2xVT837, 2xVT819, 4xKT315. Резисторы 10к и 1к расставлялись методом научного тыка.
    В целом работает стабильно чотко, в отличие от прошлой более простой версии, которая сгорела да. Правда пока не получается пробросить инвертируемое соединение с одного плеча моста на другое дабы при одновременном включении не было замыкания, ну да ладно - поэкспериментирую ещё.
    Пробовал писать на асме.
    Суть в следующем. Сделав мост, мне захотелось его зажечь. К большому сожалению блок питания от бортового компьютера робота так же пал смертью храбрых в ходе одного эксперимента. Да да - я пытался запитать компьютер от аккумулятора. Оказалось это не так просто.
    В общем LPT порта в наличии нет, купить новый БП смогу только со следующей зарплаты. А руки чешутся. Поэтому решил зажигать мост через RTS usb-2-com который валялся у меня с давних времён.
    Удалось пробросить COM порт внутрь virtual-box. Если кто будет делать: нужно в диспетчере устройств винды обозвать порт вместо автоматически данного имени (COM14 у меня) в COM1 например. Затем в свойствах виртуальной машины просто отметить галочкой "Включить последовательный порт", номер порта: COM1, режим порта - Хост-устройство, путь к порту - COM1.
    Написал сначала простую программку под винду, на FASM, которая зажигала мне этот RTS. Всё замечательно - пашет, в том числе изнутри виртуальной машины с winxp.
    Программа:

    Code: Select all

    org 100h
    
    mov AL, 80h
    out DX, AL
    mov DX, 3F8h
    mov AL, 00h
    out DX, AL
    mov AL, 0Ch
    mov DX, 3F9h
    out DX, AL
    
    mov ah, 9h
    mov dx, hello
    int 21h
    mov ah, 8h
    int 21h
    int 20h
    
    hello db 13, 10, "Hello, World!$"
    
    Потом попробовал сделать тот же фокус для Kolibri. Взял готовый исходник Example.asm из самого дистрибутива. Это тот который звуки должен проигрывать на нажатие клавиш. Модифицировал его соответствующим образом.

    Code: Select all

    key:
    		mov AL, 80h
    		out DX, AL
    
    		mov DX, 3F8h
    		mov AL, 00h
    		out DX, AL
    		mov AL, 0Ch
    		mov DX, 3F9h
    		out DX, AL
    
    Больше ничего в нём не менял. Доска отладки стала писать мне, что я ничего не понимаю в этой жизни, и всё такое. Текст был таким:
    K : Process - forced terminate PID: 0000003E [Example]
    K : General protection fault
    K : EAX : 00000080 EBX : 00000002 ECX : 00000000
    K : EDX : 00000088 ESI : 00000018 EDI : 000000D0
    K : EBP : 00000000 EIP : 00000041 ESP : 00001000
    K : Flags : 00011246 CS : 0000001B (application)
    Вкладка "User" в доске молчала.
    У меня есть стойкое ощущение что я делаю что-то не так. Подозреваю что это что-то с этими, как их... кольцами. Моя прелесть, блин.
    В общем такие дела.
    В ближайшее время планирую:
    1. Допилить малость то что уже сделал
    2. Поделать ещё мостов, уже на полевиках.
    3. Поделаю какие-нибудь студенческие лабораторки по асму (а то ничо не помню)
    4. Ну и попробую замахнуться на Шекспира передачу данных по сети. Вероятно попробую переделать какие-нибудь исходники сетевых программ, которые уже есть в Kolibri.
    Буду признателен за намёк что я не так делаю с COM портом, ибо думаю с LPT будет такой же "успех". Ну и это, какие полевики порекомендуете? В среду пойду затариваться. Я правильно понимаю что принцип работы с полевиком будет несколько иной: по-умолчанию он включен? То есть в выключенном состоянии мотора полевик нужно будет держать под закрывающим напряжением, а чтобы включить двигатель, то напряжение убираем, так?
    Attachments
    хрень напаянная.png
    хрень напаянная.png (872.15 KiB)
    Viewed 12751 times
    кура гриль.png
    кура гриль.png (13.5 KiB)
    Viewed 12751 times
  • lonely_warrior wrote:У меня есть стойкое ощущение что я делаю что-то не так. Подозреваю что это что-то с этими, как их... кольцами. Моя прелесть, блин.
    ....
    Буду признателен за намёк что я не так делаю с COM портом, ибо думаю с LPT будет такой же "успех".
    Spoiler:
    сделал-сам-песочница-нельзя-так-просто-Боромир-240289.jpeg
    сделал-сам-песочница-нельзя-так-просто-Боромир-240289.jpeg (91.27 KiB)
    Viewed 12748 times
    Ты прав - колечко то волшебное. :lol:
    Нельзя просто так взять и читать/писать в порт из Ring3.

    В КолибриОС реализована защита для некоторых вещей, чтобы программа не творила чего ей вздумается и без очереди.
    1) Нужно либо пользоваться соответсвующими функциями ядра:
    Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
    Функция 43 - ввод/вывод в порт.
    2) Либо использовать Функция 62 - пользовательский доступ к PCI. и поиметь головную боль.
    3) Либо перекомпилировать ядро со снятой защитой. viewtopic.php?f=25&t=897&start=139
    И вот тогда:
    Spoiler:
    Боромир-мост-Владивосток-песочница-158315.jpeg
    Боромир-мост-Владивосток-песочница-158315.jpeg (277.93 KiB)
    Viewed 12746 times
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Попробовал запилить обращение к порту через функцию ядра. Для начала естественно через 46. Использовал компилятор TinyC.
    Ошибка выдаваяемая доской оказалась аналогично прошлой K : General protection fault
    Выглядело деяние примерно так (http://ru.wikipedia.org/wiki/AT%26T-синтаксис):

    Code: Select all

    void test_function()
    {
       //asm("movl $0x46, %eax");
       asm("movl $0x0, %ebx");
       asm("movl $0x3f8, %ecx");
       asm("movl $0x3f9, %edx");
       asm("int 0x46");
    }
    
    Наверное полную ересь пишу, да? Всё таки c#.net расслабляет.
    А где кстати можно скачать KolibriA? Готовый к запуску образ, что-то я ссылки на это чудо не обнаружил.

    Кстати, правильно ли я понимаю, что в данном случае IRQ4 (com1?) это по мою душу?
    пробовал юзать _ksys_reserve_irq(4); из kolibrisys.h для ktcc. Выдаёт всё то же.
  • А где кстати можно скачать KolibriA?
    ftp://ftp.kolibrios.org/users/art_zh/-A/
    только ни на чем, кроме AMD Fusion она летать не будет.
  • lonely_warrior wrote:Попробовал запилить обращение к порту через функцию ядра. Для начала естественно через 46. Использовал компилятор TinyC.
    Ошибка выдаваяемая доской оказалась аналогично прошлой K : General protection fault
    Выглядело деяние примерно так (http://ru.wikipedia.org/wiki/AT%26T-синтаксис):

    Code: Select all

    void test_function()
    {
       //asm("movl $0x46, %eax");
       asm("movl $0x0, %ebx");
       asm("movl $0x3f8, %ecx");
       asm("movl $0x3f9, %edx");
       asm("int 0x46");
    }
    
    Наверное полную ересь пишу, да? Всё таки c#.net расслабляет.
    А где кстати можно скачать KolibriA? Готовый к запуску образ, что-то я ссылки на это чудо не обнаружил.

    Кстати, правильно ли я понимаю, что в данном случае IRQ4 (com1?) это по мою душу?
    пробовал юзать _ksys_reserve_irq(4); из kolibrisys.h для ktcc. Выдаёт всё то же.
    int 0x46
    int 0x40
  • А не подскажите с сетью? Новый этот api пытаюсь вкурить 75 функции, не выходит что-то.
    Есть функция http_request, работает примерно таким макаром:
    Spoiler:

    Code: Select all

    
    int32 global_socket_number = 0;
    
    void write_socket(int32 handle, int32 sender_lenght, char* sender_data)
    {
        int32 result;
        asm("movl $75, %%eax;
        movl $6, %%ebx;
        movl 8(%%esp), %%ecx;
        movl 12(%%esp), %%esi;
        movl 16(%%esp), %%edx;
        movl $1, %%edi;
        int $0x40;\n": "=&a"(result));
        //test_str = int32_to_str(result);
        return result;
    }
    
    void socket_thread()
    {
        char* sender_data = "GET /index.php HTTP/1.1\r\nhost: synxronica.com\r\n\r\n";
        write_socket(global_socket_number, strlen(sender_data), sender_data);
    }
    
    typedef struct
    {
        //word fm;
        word port;
        dword ip;
        //byte buffer[10];
    } ServerAddress;
    void http_request(char* server_ip, word server_port)
    {
        asm("movl $75, %%eax;
        movl $0, %%ebx;
        movl $2, %%ecx;
        movl $1, %%edx;
        movl $0, %%esi;
        int $0x40;\n": "=&a"(global_socket_number));
    
        ServerAddress localAddress;
        localAddress.port = server_port;
        localAddress.ip = ip_to_dword(server_ip);
    
        //test_str = int32_to_str(global_socket_number);
    
        //12,16
        dword result_connect;
        asm("movl $75, %%eax;
        movl $4, %%ebx;
        movl $6, %%esi;
        int $0x40;\n"
        : "=&a"(result_connect)
        : "c"(global_socket_number), "d"(localAddress));
    
        test_str = int32_to_str(result_connect);
    
        /*
    
        asm("movl $40, %eax");
        asm("movl $7, %ebx");
        asm("int $0x40;");
    
    
        asm("movl $18, %eax");
        asm("movl $7, %ebx");
        asm("int $0x40;");
        asm("push %eax;");
    
        int thread_pid=-1;
        _ksys_start_thread(socket_thread, 2048, &thread_pid);
    
        asm("pop %ecx;");
    
        asm("movl $18, %eax");
        asm("movl $3, %ebx");
        asm("int $0x40;");
        */
    }
    
    
    Сокет вроде как создаётся, global_socket_number получает значение. А вот коннект к сокету не выходит, в eax засовывается -1. Мож кто окинет взглядом сие, да поймёт в чём дело?
    Вообще я посмотрел, приложения связанные с сетью как-то не очень работают. Телнетился к серваку, продключение проходит. А вот пишу ему туда, и хоть бы чего. Потом отваливается по таймауту. Или вылетал. Пинг зависает на 3ей итерации.
    Ещё из-за обращения к сокетам бывает зависание всего. То есть окна какбы отвечают, но ничего не делают. Не закрываются даже.
    Я свои потуги, которые предствил в данном топике списывал с исходников телнета.
    Соответственно возникает соблазн: вполне нормально пашет текстовый браузер. Но исходников "htmlv" я ни в одной ветке svn-на не нашёл. А где он лежит?
  • http://websvn.kolibrios.org/listing.php ... edc540f510
    Сеть еще в стадии ранней разработки. Поскольку старый сетевой стек работал чуть лучше, чем совсем хреново - все решили, что хуже не будет, если автор нового стека зальет его в транк и таким образом это немного подстегнет разработку.
  • Who is online

    Users browsing this forum: Ahrefs [Bot] and 0 guests