Raspberry PI 3 + OpenCV + Arduino UNO + ......(поледнее решение и вопрос в последнем сообщении)

Тема в разделе "Флудилка", создана пользователем Igor68, 21 ноя 2016.

  1. Unixon

    Unixon Оракул Модератор

    Хранение данных на хостовой ФС, проброшенной в виртуалку (каталог на хосте через самбу как сетевой диск в виртуалке) и автоматические бэкапы спасли бы вас и в этой ситуации.
     
    Igor68 нравится это.
  2. Igor68

    Igor68 Гуру

    Не спорю. Моя лажа. Схема на месте плата не разведённая на месте. Только элементы в библиотеку снова вводить.:(
     
  3. Igor68

    Igor68 Гуру

    А мой опыт подсказывает, что виндовс это не операционная система, а только головная боль с геморроем в придачу... так, чтоб не скучно было.
     
  4. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Вот довелось продолжить... Понятно, что теперь без QtCreator... а вместо него отображение в браузере с применением websock. Ну тут понятно... поставил малину 3 на конструкцию, сверху ардуино с шилдами... ну старая схема. Решено довести до ума скетч на ардуине. Ну как и ранее по wifi через ssh с ключом -X... запускаем ардуино иде и... упс. Тормоза... просто стон. Посмотрел а при установке (ведь малина новая) установилась по apt-get версия 2:1.0.5. А до этого на старом образе wheezy была 1.0.1 вполне устраивала и нормально работала. Не спорю, что надо что-то доустановить(мать её так эту яву). Но есть более радикальное решение сделать скрипт для компиляции и заливки в ардуину. Ведь всё равно пользуюсь внешним редактором gedit. Конечно залить удаётся но курить бамбук пока всплывают эти менюшки... жесть!
    Есть ли у кого опыт компилить и заливать в консоли. Надеюсь там нормальный компилятор а не извращение типа java с чем-то.
    Заранее спасибо!
     
  5. ZAZ-965

    ZAZ-965 Гуру

    В Debian есть пакет arduino-mk зависит только от arduino-core и питона.
     
  6. Igor68

    Igor68 Гуру

    Попробую эту идею... жаль что питон надо, а не bash... пока не знаю.
     
  7. AlexU

    AlexU Гуру

    Может всё-таки простым Makefile'ом можно обойтись?
    И ещё вопрос: обязательно ли компилировать прошивки именно на Малине? Может проще это сделать на рабочем компе, а через Малину уже готовую прошивку заливать на Ардуино.
     
  8. Igor68

    Igor68 Гуру

    Это самое то... но как это "вырвать" из Arduino IDE и заливку то же... Предполагаю всё уже есть где-то внутри IDE надо только найти. Если бы хотел ардуину в принципе вообще... наверное давно знал бы. А тут ардуина как второстепенное в дополнение к малине и средУ изучать (именно средУ) не планировал. Одно только радует то что надо сделать и чем на малине есть на самой малине. И то что конструкцией прикручено к малине... и для этого то же на самой малине.
     
  9. Igor68

    Igor68 Гуру

    Про заливку... надо будет тренировку сделать с avrdude. Может только hex передавать и надо, а компилировать на самом столе... но его по непонятному имени всё время искать в /tmp надоело. А Arduino IDE (внутренности) пока не знаю... да и avrdude подзабыл
     
  10. AlexU

    AlexU Гуру

    Вроде как в Arduino IDE должны быть заветные команды "Скетч -> Экспорт бинарного файла" и "Скетч -> Показать папку скетча". Первая создаёт HEX-файлы и кладёт их рядом со скетчем, а вторая открывает проводник с каталогом скетча, где и будут лежать два HEX-файла (один с бутлоадером, второй без).
    В настройках Arduino IDE поставьте галочку "Показать подробный вывод -> загрузка" и попробуйте влить скетч. В консоли IDE появится команда, которая используется для загрузки прошивки. Копируете её и немного подправляете под свои нужды.
     
    Igor68 нравится это.
  11. Igor68

    Igor68 Гуру

    Да спасибо:
    Вот это: (пустые setup и loop) компилю... для теста и смотрю вывод:
    Код (Text):

    /usr/share/arduino/hardware/tools/avr/bin/avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=105 -D__PROG_TYPES_COMPAT__ -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/eightanaloginputs /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp -o /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp.o
      Using previously compiled: /tmp/build8029453850403973706.tmp/wiring.c.o
      Using previously compiled: /tmp/build8029453850403973706.tmp/wiring_pulse.c.o
      Using previously compiled: /tmp/build8029453850403973706.tmp/wiring_shift.c.o
    ...
    ...
    /usr/share/arduino/hardware/tools/avr/bin/avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp.elf /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp.o /tmp/build8029453850403973706.tmp/core.a -L/tmp/build8029453850403973706.tmp -lm
    /usr/share/arduino/hardware/tools/avr/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp.elf /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp.eep
    /usr/share/arduino/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp.elf /tmp/build8029453850403973706.tmp/sketch_sep04a.cpp.hex
    Размер скетча в двоичном коде: 444 байт (из 30 720 байт максимум)
     
    ну и думаю сделаю скрипт... но только по приходу домой. Ну уж больно хлама с собой тащит эта IDE... что надо и что не надо... но бинутилиты он свои показал.
     
  12. Igor68

    Igor68 Гуру

    Начал делать скрипт... и бросил... потому как нажать только на одну кнопку для компиляции и заливки работает нормально. А вот открытие IDE решил потерпеть...
    Зато успел добавить кое что в работе программы:
    1) Передавать 8 регистров(16бит) по команде 16 Modbus RTU от малины в ардуино;
    2) Принимать 8 регистров(16бит) по команде 3 Modbus RTU от ардуины в малину.
    Конечно как и говорилось ранее не RS485, а USB-SERIAL от малины к ардуине.
    Выглядит так, что можно изменять/заливать проект Arduino IDE(он установлен на малине)... Редактировать проект GCC на малине. Работать сразу без лишних телодвижений по wifi.
     
  13. Igor68

    Igor68 Гуру

    Доброго времени суток!
    ...продолжение с большой... и даже очень большой... задержкой.
    Первое это управление приводами на основе Arduino UNO R3 <-- I2C --> Multiservo(поворот камеры и сонара) + ComMonion For 4 motors(4 колеса для движения):
    sketchbook.zip
    И соответственно управление из консоли малины по SSH. Связь Raspberry Pi 3 <-- USB-SERIAL --> Arduino UNO R3. Реализован псевдопротокол (по образу и подобию) Modbus RTU:

    Код (Text):
    www-data@pi02:~/ramdisk/mainwork/work$ ./servoANDmotor --help

    >>>>>>>> servoANDmotor <<<<<<<<<

    --help             - эта подсказка
    --version          - дата последнего изменения и версия
    --test             - интерактивный тест
    --onetest          - одиночный тест приводов
    --movetest         - тест управления

    www-data@pi02:~/ramdisk/mainwork/work$ ./servoANDmotor --movetest
    Скорость и направление(знак) левых приводов(-255...255):255
    Время разгона/торможения левых приводов(0...65535):10
    Скорость и направление(знак) правых приводов(-255...255):255
    Время разгона/торможения правых приводов(0...65535):10
    Позиция по горизонтали сервомашины1(влево 45...вправо -45):45
    Время позиционирования по горизонтали сервомашины1(0...65535):100
    Позиция по вертикали сервомашины2(вниз -30...вверх 30):-10
    Время позиционирования по вертикали сервомашины2(0...65535):100
    send res:0
    send 00255 00255 00010 00010 00045 -0010 00100 00100
    recv res:0
    recv 00013 00013 00010 00010 00002 -0002 00100 00100
    Скорость и направление(знак) левых приводов(-255...255):0
    Время разгона/торможения левых приводов(0...65535):0
    Скорость и направление(знак) правых приводов(-255...255):0
    Время разгона/торможения правых приводов(0...65535):0
    Позиция по горизонтали сервомашины1(влево 45...вправо -45):0
    Время позиционирования по горизонтали сервомашины1(0...65535):0
    Позиция по вертикали сервомашины2(вниз -30...вверх 30):0
    Время позиционирования по вертикали сервомашины2(0...65535):0
    send res:0
    send 00000 00000 00000 00000 00000 00000 00000 00000
    recv res:0
    recv 00186 00186 00000 00000 00000 00000 00000 00000
    Скорость и направление(знак) левых приводов(-255...255):255
    Время разгона/торможения левых приводов(0...65535):10
    Скорость и направление(знак) правых приводов(-255...255):255
    Время разгона/торможения правых приводов(0...65535):10
    Позиция по горизонтали сервомашины1(влево 45...вправо -45):30
    Время позиционирования по горизонтали сервомашины1(0...65535):100
    Позиция по вертикали сервомашины2(вниз -30...вверх 30):-10
    Время позиционирования по вертикали сервомашины2(0...65535):100
    send res:0
    send 00255 00255 00010 00010 00030 -0010 00100 00100
    recv res:0
    recv 00012 00012 00010 00010 00002 -0002 00100 00100
    Скорость и направление(знак) левых приводов(-255...255):255
    Время разгона/торможения левых приводов(0...65535):100
    Скорость и направление(знак) правых приводов(-255...255):255
    Время разгона/торможения правых приводов(0...65535):100
    Позиция по горизонтали сервомашины1(влево 45...вправо -45):30
    Время позиционирования по горизонтали сервомашины1(0...65535):100
    Позиция по вертикали сервомашины2(вниз -30...вверх 30):-10
    Время позиционирования по вертикали сервомашины2(0...65535):100
    send res:0
    send 00255 00255 00100 00100 00030 -0010 00100 00100
    recv res:0
    recv 00255 00255 00100 00100 00030 -0010 00100 00100
    Скорость и направление(знак) левых приводов(-255...255):0
    Время разгона/торможения левых приводов(0...65535):0
    Скорость и направление(знак) правых приводов(-255...255):0
    Время разгона/торможения правых приводов(0...65535):0
    Позиция по горизонтали сервомашины1(влево 45...вправо -45):0
    Время позиционирования по горизонтали сервомашины1(0...65535):0
    Позиция по вертикали сервомашины2(вниз -30...вверх 30):0
    Время позиционирования по вертикали сервомашины2(0...65535):0
    send res:0
    send 00000 00000 00000 00000 00000 00000 00000 00000
    0recv res:0
    recv 00244 00244 00000 00000 00016 00000 00000 00000
    Скорость и направление(знак) левых приводов(-255...255):
    То есть тут задаются скорость и время достижения этой скорости от текущей. Для позиционирования сервормашин задаётся угол и время достижения позиций:
    servoANDmotor.zip
    Ну и сонар, который подключен напрямую по I2C к малине:

    Код (Text):
    www-data@pi02:~/ramdisk/mainwork/work$ ./sonar
    MB1242 - Testing...
    Input mode for 5V:
    1 = diagremm A
    2 = diagremm B
    3 = diagremm C
    4 = diagremm D
    ?2
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 39 radius 15 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 43 radius 16 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 50 radius 19 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 57 radius 23 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 60 radius 25 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 65 radius 27 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 68 radius 29 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 73 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 75 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 81 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 80 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 84 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 92 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 102 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 102 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 102 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 116 radius 30 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    -- diagramm 4   distance 218 radius 0 ------ "Cnrl+c" for exit
    Для теста подносилась рука а дистанция 218 см это до стены... :
    sonar.zip
    Вопрос только в том, что точно не знаю диаграммы направленности сонара. Построил график зависимости для нескольких вариантов согласно документации.
    Вроде новое начало положено...
     

    Вложения:

    • sketchbook.zip
      Размер файла:
      29,3 КБ
      Просмотров:
      543
    • servoANDmotor.zip
      Размер файла:
      18,2 КБ
      Просмотров:
      490
    • sonar.zip
      Размер файла:
      10,7 КБ
      Просмотров:
      582
  14. Igor68

    Igor68 Гуру

    Доброго времени суток!
    ...вот губу раскатал... захотелось продолжить. Как говорил ранее всё делается(редактирование, компиляция, запуск и т.п.) в RAM диске и опа... при копировании в RAM диск (у меня он примонтирован в /home/httpd/ramdisk) нет места для проекта. Был основан в RAM0 по скрипту(/etc/init.d/ramdisk):
    Код (Text):
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: A ramdisk to save intermittent data
    # Required-Start:
    # Required-Stop:
    # X-Start-Before:
    # X-Stop-After:
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: create a ramdisk
    # Description: create a ramdisk with 64MB and mount it to /mnt/ram0
    ### END INIT INFO
    #
    case "$1" in
            start)
                    if [ ! -e /mnt/ram0 ]; then
                            mkdir /mnt/ram0
                    fi
                    /sbin/mke2fs -m 0 /dev/ram0
                    /bin/mount /dev/ram0 /mnt/ram0
                    chmod 777 /mnt/ram0
            ;;
            stop)
                    /bin/umount -v /mnt/ram0
            ;;
            restart)
                    /bin/umount -v /mnt/ram0
                    if [ ! -e /mnt/ram0 ]; then
                            mkdir /mnt/ram0
                    fi
                    /sbin/mke2fs -m 0 /dev/ram0
                    /bin/mount /dev/ram0 /mnt/ram0
                    chmod 777 /mnt/ram0
            ;;
            *)
                    echo $"Usage: $0 {start|stop|restart}"
            exit 1
    esac
    exit 0
    и в /etc/rc.local:
    Код (Text):
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
      printf "My IP address is %s\n" "$_IP"
    fi

    #
    chmod 777 /dev/i2c-1
    chmod 777 /dev/ttyUSB0
    #
    #/etc/init.d/ramdisk restart
    #
    mount --bind /mnt/ram0/http /home/httpd/ramdisk
    #
    su www-data -c /home/httpd/bash/wwstart &
    #
    /etc/init.d/ssh restart

    exit 0
    Ух ты!!!
    и почему-то, что не наблюдалось на обычном PC... спокойно видится по fdisk -l (то, что касается ram0):
    Код (Text):
    Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
     
    И всего-то, где только шаблонный файл work.bmp 1 Мб.:(
    Ну надо посмотреть... смотрел:
    https://www.hellojona.com/2017/06/create-a-ram-disk-tmpfs-in-raspberry-pi-3/
    https://www.raspberrypi.org/forums/viewtopic.php?t=167250
    и др.
    И тогда в /etc/fstab соответственно добавил(40М):
    Код (Text):
    proc            /proc           proc    defaults                0       0
    /dev/mmcblk0p1  /boot           vfat    defaults                0       2
    /dev/mmcblk0p2  /               ext4    defaults,noatime        0       1
    tmpfs           /var/tmp        tmpfs   nodev,nosuid,size=40M   0       0
    Ну и для порядка ранее был /mnt/ram0 и что бы без больших изменений было соответственно /etc/rc.local:
    Код (C++):
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
      printf "My IP address is %s\n" "$_IP"
    fi

    #
    chmod 777 /dev/i2c-1
    chmod 777 /dev/ttyUSB0
    #
    #/etc/init.d/ramdisk restart
    #
    mount --bind /var/tmp /mnt/ram0
    mkdir /mnt/ram0/http
    chmod 777 /mnt/ram0/http
    mount --bind /mnt/ram0/http /home/httpd/ramdisk
    #
    su www-data -c /home/httpd/bash/wwstart &
    #
    /etc/init.d/ssh restart

    exit 0
    и теперь df -h:
    Код (Text):
    root@pi02:/home/httpd# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        30G   13G   16G  45% /
    devtmpfs        458M     0  458M   0% /dev
    tmpfs           462M   68K  462M   1% /dev/shm
    tmpfs           462M  6.4M  456M   2% /run
    tmpfs           5.0M  4.0K  5.0M   1% /run/lock
    tmpfs           462M     0  462M   0% /sys/fs/cgroup
    tmpfs            40M   28K   40M   1% /var/tmp
    /dev/mmcblk0p1   63M   21M   42M  34% /boot
    tmpfs            93M     0   93M   0% /run/user/1001
    tmpfs            93M  4.0K   93M   1% /run/user/1000
    root@pi02:/home/httpd#
    и mount:
    Код (Text):
    ...
    tmpfs on /mnt/ram0 type tmpfs (rw,nosuid,nodev,relatime,size=40960k)
    tmpfs on /home/httpd/ramdisk type tmpfs (rw,nosuid,nodev,relatime,size=40960k)
    ...
    Теперь можно работать...
     
  15. Igor68

    Igor68 Гуру

    ...и вот начало создания интерфейса (фрагмент отображения в браузере в реальном времени - сервер на малине):
    snapshot8.png
    Верхняя часть управление положением камеры и сонаром... рядом кнопка ">0<" означает исходное положение. Тут всё понятно. Но вот управление движением наверное от кнопок надо отказаться. И то же заменить слайдерами. Думаю кнопку полный стоп надо только и оставить.
    Всё взято из темы про websocket.
    Когда слайдер поворота в 0, то движение только вперёд и назад... исходя из положения -255...255. А положение поворот(допустим влево) это вычитание задание из левых моторов и сложение с заданием в правые моторы. Думаю если скорость(задание) движения(вперёд/назад) будет на нуле... то значение поворота это разворот на месте.
    Так ли это будет... исходя из Вашего опыта.
    Заранее спасибо!
    Чёрный фон будет заменён на изображение с камеры... и про сонар не надо забывать.
    Всё разделено на несколько автономных программ на одной малине, обмен данными меду которыми по механизму разделяемой памяти(рассматривалось так же на форуме)
    И ещё один недостаток - тормоза в пределах одного интерфейса wlan0. Это пока победить не могу.
    Про отображение в браузере... с PC всё нормально, а на мобильнике по wifi в браузере изображение не очень... правда у меня экран маленький(специально для кармана, а не сумки samsung s4 mini). И двигать слайдер нельзя... можно нажимать в разные его места для смены задания. Если двигать, то движется изображение... так уж работают браузеры.
    Кружочки с градусами это индикация положения камеры и сонара(сервомашины). Пока это работает только так. И пока не введен в строй механизм защиты от столкновения в момент когда сонар расположен вперёд по горизонтали. Слеледует ли блокировать движение если сонар в каком-нибудь ином положении?
    Заранее спасибо за подсказку!
     
    Mitrandir нравится это.
  16. Mitrandir

    Mitrandir Гуру

    я бы оставил и то и то. слайдеры для грубой установки, а кнопками до точной подгонки.
    слайдер управление мощностью двигателей и слайдер баланса, в какой пропорции распределять лево-право.

    если скорость на 0, то слайд побокам на одну сорону + скорость на другу минус в зависимости от положения.

    и кнопки лучше сделать биндами на клавиатуру мышкой замучаешься
     
    Последнее редактирование: 13 сен 2018
  17. Igor68

    Igor68 Гуру

    Да, но шаг приращения/убывания в 1 совсем не заметен. Платформа без датчиков(фотоэнкодеров), как предусмотрено в ComMotion... даже перешивал, т.к. работал один мотор не корректно без этого датчика. Благо код прилагался. Но спасибо... попробую.
     
  18. Mitrandir

    Mitrandir Гуру

    так как пульт управления может быть телефоном/планшетом и компом, то подход к контролам будет разным.

    по хедерам определяем вид клиента:
    1) телефон/планшет
    два слайдера, подумать как расположить чтоб удобно было
    горизонтальный, который баланс указывает с автоцентровкой. т.е отпустил палец - сам вернулся в нейтраль
    слайдер газа - фиксированный. выставил - стоит пока не поменяешь, держать не надо
    2) ПК
    слайдеры увеличивают или уменьшают положения по каждому нажатию на стрелки клавы, а если шифт+стрпелка то в удвоенном темпе наращивают/сбрасывают показания

    экранные кнопки в принципе и не нужны мышкой в них тыкать нереально
     
  19. Mitrandir

    Mitrandir Гуру

    не думал для мобильных устройств на приложение выйти вместо браузера?
     
  20. Igor68

    Igor68 Гуру

    Как то не подумал... и наверное зря реализовал время достижения задания по каждой позиции. Допустим время разгона... или смена движения с максимума на максимум в реверс. Хотя честно уже раз спалил две мостовые схемы MOSFET на ComMotion... на смене движения в реверс.
    Идея с аналогом джойстика конечно интересна... как то не додумался сразу... Только "держать палец" наверное не смогу со стороны web страницы в браузере. Вот исходный "код" на странице:
    HTML:
    <!DOCTYPE html>
    <html><head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type">
    <meta http-equiv='cache-control' content='no-cache'>
    <meta http-equiv='expires' content='0'>
    <meta http-equiv='pragma' content='no-cache'>

    <title>test4</title></head><body style="color: white; background-color: black;" alink="#000099" link="#000099" vlink="#990099">
    <div style="text-align: center;"><img id="work" style="width: 640px; height: 480px;" onclick=mouseclick() alt="" src=""></div>

    <script type="text/javascript">
    ns4 = (document.layers)? true:false
    ie4 = (document.all)? true:false

    var X;
    var Y;
    var wx;
    var wY;
    var WX;
    var WY;
    //параметры лдля отправки
    var msend;    //строка для отправки
    var Wx = 0;    //координата X курсора
    var Wy = 0;    //координата Y курсора
    var Wk = 0;    //флаг клика

    function init() {
        if (ns4) {document.captureEvents(Event.MOUSEMOVE);}
        document.onmousemove=mousemove;
    }

    function mousemove(event) {
        var mouse_x = y = 0;
        if (document.attachEvent != null) {
            mouse_x = window.event.clientX;
            mouse_y = window.event.clientY;
        } else if (!document.attachEvent && document.addEventListener) {
           mouse_x = event.clientX;
            mouse_y = event.clientY;
        }
        var we = document.getElementById("work");
        X = we.clientWidth;
        Y = we.clientHeight;
        status="x = " + mouse_x + ", y = " + mouse_y;
        wx = mouse_x - we.getBoundingClientRect().left;
        wy = we.getBoundingClientRect().top - mouse_y + Y;
        if((wx > 0) && (wx < X) &&  
       (wy > 0) && (wy < Y)) {
           WX = wx.toFixed(0);
            WY = wy.toFixed(0);
        }
    }

    var wsApp = (function()
    {
        var wsApp = {};
        var wsUri = "ws://" + window.location.hostname + ":4321/";
        var outputEl;
        var wscreen;
        var websocket;
        //
        var ta;
        var blob;

        wsApp.init = function() {
                outputEl = document.getElementById("output");
            wscreen = document.getElementById("work");
                testWebSocket();
            ta = document.querySelector("#work");
            blob = new Blob([evt.data], {type: "image/bmp"});
        };

        function testWebSocket(){
                websocket = new WebSocket(wsUri);
                websocket.onopen = onOpen;
                websocket.onclose = onClose;
                websocket.onmessage = onMessage;
                websocket.onerror = onError;
        }
        function onOpen(evt){
            writeToScreen("CONNECTED");
            doSend("WebSocket rocks");
        }

        function onClose(evt){
            writeToScreen("DISCONNECTED");
        }

        function onMessage(evt){
            ta.src = window.URL.createObjectURL(evt.data);
            window.URL.revokeObjectURL(ta.src);
            cache.delete('work.bmp');
            cache.clear();
        }

        function onError(evt){
            writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
        }

        function doSend(message){
            writeToScreen("SENT: " + message);
            websocket.send(message);
        }

        wsApp.send = function(message) {
            websocket.send(message);
        }

        function writeToScreen(message){
            var pre = document.createElement("p");
            pre.style.wordWrap = "break-word";
            pre.innerHTML = message;
            outputEl.appendChild(pre);
        }

        return wsApp;
    })();

    //клик
    function mouseclick()
    {
        if((WX > 0) && (WX < X) &&
       (WY > 0) && (WY < Y)) {
           Wx = WX;
            Wy = WY;
            Wk = 1;
        }
        msend = "mouse_X: " + Wx + "\nmouse_Y: " + Wy + "\n";
        wsApp.send(msend);
    }

    init();
    window.addEventListener("load", wsApp.init, false);

    </script>
    </body></html>


     
    Тут я довольно не очень... было бы на Си - другое дело. Но хотелось клиента платформнезависимым.