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

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

  1. Alex19

    Alex19 Гуру

    Увы, не как не могу вырваться с работы, хотя в теперешнее время, это плюс.

    Моих знаний в работе на Rpi не много, тем более OpenCV, но если будут вопросы по Ардуино/AVR, спрашивайте, чем смогу, помогу.

    Удачи в проекте!
     
  2. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Вопросы по Ардуино/AVR будут... уж точно! Сам на работе... и там тоже завал.
    Спасибо!
     
  3. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Вот получилось пока только автоидентификация (номера) клиентов (собственно со стороны элементов кластера):
    darkbot.zip
    Еще и стороны ПК... но если только в QtCreator:
    qdarkbot.zip
    Вообще-то при изменении конфигурации и некотором изменении заработает и управление с видеокамерой. Основной набросок протокола уже работает. Сейчас работа над автопоиском функционала по функциональной идентификации. Построение таким образом, что основные файлы проекта что в darkbot и что в qdarkbot. Работа с автоопределением для "пути" обмена с конечными точками по фунциональности пока не готов. Возможно надо как-то по иному определять идентификацию (в файле tdef.h).
    Предполагается, что и ПК вольётся в кластер.
     

    Вложения:

    • darkbot.zip
      Размер файла:
      134,8 КБ
      Просмотров:
      493
    • qdarkbot.zip
      Размер файла:
      72,2 КБ
      Просмотров:
      499
    Alex19 нравится это.
  4. Igor68

    Igor68 Гуру

    Вот пока не дома... и увесилительных рессурсов нет... но есть Raspberry Pi3 под рукой, который подготовил как инструмент и есть выход в инет. Пробую доделывать скрипт конфигурации:
    Код (Bash):
    #!/bin/bash

    date="28.01.2017"
    vers="01.01"
    echo ""
    echo "----- configuration project($vers) $date ------"

    inpath="src"
    outpath="work"
    omake="work/Makefile"
    ih="src/*.h"
    ic="src/*.c"
    icpp="src/*.cpp"
    oh="work"
    oc="work"
    ocpp="work"
    p1=$1


    function _help()
    {
    echo ""
    echo "--help    - current screen info"
    echo ""
    echo "-ic       - interactive config"
    echo ""
    }

    #interactive config
    function _ic()
    {
      #cp $ih $oh
      #cp $ic $oc
      #cp $icpp $ocpp
      #копирование обязательных файлов
      cp $inpath/tdef.h $outpath/tdef.h
      cp $inpath/config.h $outpath/config.h
      cp $inpath/id.h $outpath/id.h
      cp $inpath/id.cpp $outpath/id.cpp
      cp $inpath/vcsocket.h $outpath/vcsocket.h
      cp $inpath/vcsocket.cpp $outpath/vcsocket.cpp
      #main
      echo "use main function (1/0)"
      read p1
      if(($p1 > 0))
       then
        cp $inpath/main.h $outpath/main.h
        cp $inpath/main.cpp $outpath/main.cpp
        FMAIN="1"
      else
        FMAIN="0"
      fi
      #веб kamepa
      echo "use wem cam (1/0)"
      read p1
      if(($p1 > 0))
       then
        FCAM="1"
        cp $inpath/wcam.h $outpath/wcam.h
        cp $inpath/wcam.cpp $outpath/wcam.cpp
      else
       FCAM="1"
      fi
      #Motors
      echo "use Motors (1/0)"
      read p1
      if(($p1 > 0))
       then
        FMOTORS="1"
        cp $inpath/motors.h $outpath/motors.h
        cp $inpath/motors.cpp $outpath/motors.cpp
      else
        FMOTORS="0"
      fi
      #ModbusRTU
      echo "use Modbus RTU (1/0)"
      read p1
      if(($p1 > 0))
       then
        FMRTU="1"
        cp $inpath/mrtu.h $outpath/mrtu.h
        cp $inpath/mrtu.cpp $outpath/mrtu.cpp
      else
        FMRTU="0"
      fi
      #режим отладки
      echo "debug mode (use debug to console) (1/0)"
      read p1
      if(($p1 > 0))
       then
        FDBG="1"
      else
        FDBG="0"
      fi
      #режми клиента
      echo "client or server (1-client/0-server)"
      read p1
      if(($p1 > 0))
       then
        FCLIENT="1"
      else
        FCLIENT="0"
      fi
      #коррекция конфигурации в файле config.h
      #вывод в консоль отладки
      if( ((FDBG == 1)) )
       then
        str=$(cat $outpath/config.h | grep "define _mode_dbg")
        str2=$(echo $str | sed "s/0/1/")
        sed -i "s/$str/$str2/" $outpath/config.h
        echo "$str"
        echo "$str2"
      fi
      #режим клиента
      if( ((FCLIENT == 1)) )
       then
        str=$(cat $outpath/config.h | grep "define _mode_client")
        str2=$(echo $str | sed "s/0/1/")
        sed -i "s/$str/$str2/" $outpath/config.h
        echo "$str"
        echo "$str2"
      fi
      ############
      if(($FMAIN < 1))
       then
        return
      fi
      # Шаблон Makefile
      echo "############################################" > $omake
      echo "# Makefile Version: $vers   Date: $date" >> $omake
      echo "############################################" >> $omake
      echo "" >> $omake
      echo "#compilators" >> $omake
      echo "CPP        := g++" >> $omake
      echo "CC        := gcc" >> $omake
      echo "#" >> $omake
      echo "CFLAGS          := -c -Wall" >> $omake
      # Запросы
      echo "interactive config:"
      echo "Name Project:"
      read p1
      echo "NAME        := $p1" >> $omake
      echo "Using OpenCV:(1/0)"
      read p1
      if(($p1 > 0))
       then
        echo "INCL        := -I/usr/local/include/opencv" >> $omake
        echo "LIB        := -L/usr/local/lib" >> $omake
        echo "CPPLIBRARIES    := -lopencv_core -lopencv_imgproc -lopencv_highgui -lpthread" >> $omake
       else
        echo "INCL        :=" >> $omake
        echo "LIB        :=" >> $omake
        echo "CPPLIBRARIES    := -lpthread" >> $omake
      fi
      #Правила
      echo "SRC        := \$(shell ls *.cpp)" >> $omake
      echo "OBJ        := \$(SRC: .cpp=.o)" >> $omake
      echo "all:    \$(NAME)" >> $omake
      echo "" >> $omake
      echo "\$(NAME):    \$(OBJ)" >> $omake
      echo "    \$(CPP) \$(LIB) \$(CPPLIBRARIES) \$(OBJ) -o \$(NAME)" >> $omake
      echo "" >> $omake
      echo "\$(OBJ):    \$(SRC)" >> $omake
      echo "    \$(CPP) -c \$(SRC)" >> $omake
      echo "" >> $omake
      echo "clean:" >> $omake
      echo "    rm -f *.o \$(NAME)" >> $omake
    }


    case $p1 in
      -ic)
       _ic
       ;;
      --help)
       _help
       ;;
      *)
       echo "\"--help\" for info"
       ;;
    esac
    Основная задача интерактивно изменять файл config.h, а точнее параметры в определениях #define. Этот скрипт изначально копирует из src в work файлы по списку, а затем модифицирует (после запросов). В наличии Малина 3 с выходом в интернет, установленным браузером и ssh (по ConnectBot) соединением по wifi. В качестве клиента по ssh выступает смартфон с клавиатурой по bluetooth к нему. Конечно геморрой, но других ресурсов нет. Браузер тоже на смартфоне с выходом по wifi через малину. Все действия (редактирование и тест по ssh сессии на малине).
     
    Последнее редактирование: 29 янв 2017
    Alex19 нравится это.
  5. Igor68

    Igor68 Гуру

    Ура! Я дома... попил водки и... комметирую (не ругайте вед флуд - но пригодиться) В вышеуказанном посте отрывок:
    Код (Bash):
     #вывод в консоль отладки
      if( ((FDBG == 1)) )
       then
        str=$(cat $outpath/config.h | grep "define _mode_dbg")
        str2=$(echo $str | sed "s/0/1/")
        sed -i "s/$str/$str2/" $outpath/config.h
        echo "$str"
        echo "$str2"
      fi
    что все означает... и для чего:
    имеется файл config.h... который является конфигурацией проекта (вырезка):
    Код (C++):
    /*
    ****************
    * конфигурация *
    ****************
    */

    /* задаём - указываем */
    // == сообщения для отладки ==
    //определяет, что в консоли вудут выводиться сообщения
    #define _mode_dbg            0
    // == мы клиент ==
    //мы кодключаемся к серверу в начале работы
    #define _mode_client            0
    // == номер идентификации ==
    //наш номер идентификации по умолчанию (Номер)
    #define _main_id_num            0
    // == функциональное назначение ==
    //камера OpenCV
    #define _func_cam            0
    //поворот камеры
    #define _func_cam_move            0
    скриптом на BASH модифицируется значение в нашем шаблонном config.h (он будет применён при компиляции):
    Пример:
    Изначальное значение вывода отладки на консоль:
    Код (C++):
    //определяет, что в консоли вудут выводиться сообщения
    #define _mode_dbg            0
    При запросе после запуска скрипта:
    Код (C++):
    igor@raspberrypi:~/ramdisk/darkbot $ ./config.sh -ic

    ----- configuration project(01.01) 28.01.2017 ------
    use main function (1/0)
    1
    use wem cam (1/0)
    1
    use Motors (1/0)
    1
    use Modbus RTU (1/0)
    1
    debug mode (use debug to console) (1/0)
    1
    client or server (1-client/0-server)
    .....
    .....
     
    После запроса об использовании debug mode (use debug to console) (1/0) произойдёт изменение в файле config.h
    Код (C++):
    //определяет, что в консоли вудут выводиться сообщения
    #define _mode_dbg 1
     
    Как видите скрипт изменил "щаблон" config.h, который изначально был скопирован (как заготовка) из src в work. В work так же создаётся Makefile для сборки. Это не готовый вариант, но весь проект идёт по этой схеме.
    Для информации про замену значений в строке файла на BASH:
    http://www.opennet.ru/docs/RUS/bash_scripting_guide/a14586.html
     
    Последнее редактирование: 29 янв 2017
    ИгорьК и Alex19 нравится это.
  6. Igor68

    Igor68 Гуру

    Вот настал момент, когда продолжение без постановки подвижного устройства на колёса становится бессмысленным. Машинка с камерой и т.д. должна ездить... одним словом автономное питание. Сейчас применяю стационарно преобразователь UNI-REG для питания всех приводов... 5 Вольт. Питание малины и ардуино от блока питания для планшета. Кататься не может! Из Китая едет ещё одна малина (для будущего стационарного кластера), "слоёный" корпус с радиаторами - хочу уменьшить вероятность попадания мусора. И датчик (измеритель) расстояния с доступом по I2C. Хотелось ещё питание сделать раздельным... но такая крокодилья площадь 75х45 мм. только для одного канала - жирно очень. И так два шилда - хотя их реально упаковать в один. Буду делать свой. Вот по аналогии UNI-REG решил более чем на один канал... и в габаритах вписать в форму шилда с посадочными местами. Пока для начала импульсный стабилизатор на LM2576S с функцией включения:
    snapshot28.png
    Диод D1 по току как элемент LM2576. Делитель R1 и R2 либо срисую с готовой под 5 вольт (с готового устройства, которым пользуюсь). Сигнал "ON" вывод 5 через ключ на корпус - это включение низким уровнем. Условие выключения - завершение выключения малины (система остановлена). Возможно применить управление через AVR по I2C. Хотя если разобраться и сделать в факторе ардуино и применять как шилд... то можно управлять той ардуиной, что используется для приводов (через свободные порты)... подумаешь бутерброд потолще станет. Но вот с контролем зарядки аккумуляторов надо подумать. Размер индуктивности L1 сносный. Размер батареи конденсаторов "Cout" надо посмотреть.
     
  7. Igor68

    Igor68 Гуру

    Предположительно так:
    Перед командой "halt" от root (должен выполнять некий скрипт) посылается команда по ModbusRTU от малины в ардуино (в зарезервированный адрес регистра). Ардуино начинает отчет времени до выключения питания с малины (остановке). После чего ардуино портами выключает питание на все устройства, кроме себя. Сама ардуина выключается только разрывом цепи питания (тумблер, кнопка). При новой подаче питания ардуино активирует питание для всех... до получения команды выключения. Кроме того можно задействовать АЦП для контроля напряжения и т.п. Само устройство "садится" в посадочное место ардуины в виде бутерброда (третий шилд).
    У кого есть опыт в заказе плат на изготовление... где-нибудь не далеко. Как долго... и как дорого?
    Спасибо!
     
    Последнее редактирование: 15 фев 2017
  8. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Собственно вопрос про плату. Вот найдены мной размеры для изготовления задуманного:
    arduino_uno_dims_lg.png
    arduino-uno-board-dimensions-l-35ea677f695a1250.png
    Arduino-Dimensions.jpg
    Собственно ищу размеры для изготовления. Шилд контроля питания будет не сверху, а по середине... потому как самой верхней останется Multiservo с большим количеством разъёмов.
    Очень интересует тип разъёма... чтобы воткнуть в нижний шилд... и в него втыкался верхний. Одним словом для плат требуются размеры и типы розеток для покупки.
    Однако как видно данные разных источников... мягко сказать... противоречат друг другу.
     
    Последнее редактирование: 18 фев 2017
  9. ИгорьК

    ИгорьК Гуру

  10. Igor68

    Igor68 Гуру

    Благодарю за ссылку! Но только про контактную колодку. Макетная плата точно не пригодится... на ней не смогу разместить 3 импульсных стабилизатора на рассматриваемой LM2576 в корпусе DPAK. Плату придётся изготовить... то есть травить а если точнее заказать на изготовление... где-нибудь в рядом с Москвой. Ранее мои знакомые (с ними связь потеряна) заказывали и было не дорого.
     
  11. Igor68

    Igor68 Гуру

    Вот (Шаблон в PCB пикада - снимок):
    Снимок1.jpg

    Поправьте меня с размерами
     
  12. Igor68

    Igor68 Гуру

    Что-то в размеры не могу попасть... исходя из источников (выше приведены).
    Вот пытаюсь разметить (хорошо, что колодку как элемент в библиотеку PCad не стал делать, а разместил некоторые пады):
    Снимок2.JPG

    Может шаг не 2.54 мм, а 1.27 мм. Удаление от "верхнего" края до "низа проавой-верхней" колодки в 48.8 мм не вписывается.
    Прошу помощи!
     
  13. ZAZ-965

    ZAZ-965 Гуру

  14. Igor68

    Igor68 Гуру

    К сожалению специально для этого Eagle ставить желания нет. Много лет в PCad, да и библиотека уже солидная собралась. В состоянии открыть ещё CAM файлы, и Proteus. Ещё Multisim 10.1 установлен (давно и не удалил пока)
     
  15. Igor68

    Igor68 Гуру

    Тут возникает вопрос про "капризы" цепей питания Arduino. Если питать от шилда и вход питания самой Arduino не использовать? Предполагается использовать вот этот преобразователь:
    Снимок3.JPG
    Да и вообще эту схему без управления... одним словом если напряжение на аккумуляторе или внешнее есть то питание на цепи 5 вольт и шилдов и ардуино есть. Само управление только от выбранных портов через ключи. Интересный вообще стабилизатор (вариант с фиксированным выходом 4 вольт):
    https://www.chipdip.ru/product/lm2576s-5.0
    Но есть он же с широким диапазоном выхода (вариант исполнения):
    https://www.chipdip.ru/product/lm2576s-adj-nopb
    Для питания Raspberry будет тот же на 5 вольт за исключением того, что ножка 5 будет подключена через сток-исток на корпус. Ключ в свою очередь (затвор)на выход порта ардуино. Как быть с питанием для силовых цепей? Стандарт для приводов 5 вольт... или всё же 6? Необходимо выбрать... по ходу тот же на фиксированные 5 вольт с добавочным резистором исходя из:
    snapshot29.png
    Как раз исходя из этого увеличить величину R2 входного делителя. Как раз приведено для фиксированного напряжения. В самом низу сказано, что вариант ADJ - требует внешних резисторов. Ну и соответственно можно по вкусу выбрать напряжение выхода.
    Для желающих сделать регулируемы источник до 3 А - самое то!
    Вот вроде и подобрал геометрию платы сейчас тема по зарядке для двух аккумуляторов (на этой же плате). Разумеется аккумуляторы не на ней. Один для приводов, другой для контроллеров и т.п.
    Так какое напряжение в большинстве случаев для моторов и сервомашин? Детали надо заказывать! Плату тоже разводить и заказывать! Время идёт, а все это надо ещё на обсуждение!
    Заранее Спасибо!
     
  16. Igor68

    Igor68 Гуру

    Доброго времени суток! Честно сказать повторяюсь... но:
    Снимок4.jpg
    Так выглядит стабилизатор для питания Raspberry Pi 3. Включение (подачача питания поступает от Arduino при подачи высокого уровня дискретного порта вывода. Напряжение на стабилизатор поступает, как от внешнего питания, так и аккумуляторов... как специального для контроллеров, так и для питания сервомашин и моторов. Специально приоритет от возможной "просадки" напряжения питания контроллеров.

    Для подачи питания на сервомашины и моторы используется только внешний источник и аккумулятор для силовых цепей. Данная схема имеет низший приоритет по питанию... целостность работы систем управления важнее (следует пересчитать резисор R3 - добавочный к R2 внутри микросхемы для получения 6 вольт для питания приводов):
    Снимок5.JPG

    Неуправляемый стабилизатор для питания самой Arduino и логических (не силовых) цепей шилдов. Питается пока есть хотя бы одно напряжение с источников. Отключено только при разрыве цепей питания:
    Снимок6.JPG
    Собственно сложность (рассматривается возможность) только в размещении контроллеров зарядки аккумуляторов при наличии внешнего питания. Разместив три канала на этой плате... следует учесть и разъёмы... становится невозможным разместив зарядку тут же на плате. Следует рассмотреть стыковку этой платы с внешним контроллером зарядки, который по всей вероятности будет отдельным. Все три канала с нагрузочной способностью до 3 А каждый. По описанию в документации (на LM2576S) КПД от 75% и выше. Собственно сейчас вопрос опять таки с размерами (набросок платы):
    Снимок7.JPG
    У меня есть печальный опыт в "выбрасывании" плат после получения заказа... в основном из-за размера в том или ином месте. Потому и причиняю Вам неудобства по сему вопросу. Сама плата потихоньку разводится.
    Заранее Спасибо!!!
    С наступающим Праздником Служивые!!!
     
    ИгорьК нравится это.
  17. Igor68

    Igor68 Гуру

    И так крутил... и сяк вертел... Но не выходит что бы разместить на такой площади для шилда три импульсных стабилизатора. Только два, а включение Raspberry получается только через транзистор. Думаю на малину и ардуино одного источника достаточно.
    Снимок10.JPG

    Общая разводка подачи питания:
    Снимок9.JPG

    Сами посудите... вот элементы... а именно индуктивность и ёмкость:
    20170319_080132.jpg

    Уж больно большие по размеру индуктивности получаются. Да и ёмкости (электролиты) обязательно не танталовые в тех цепях сглаживания
     
    Последнее редактирование: 19 мар 2017
  18. Alex19

    Alex19 Гуру

    День добрый.
    Рад, что у Вас продвигается проект.
    Меня немого поглотила работа, потихоньку выбираюсь из этого омута:). И продолжаю воевать со своим проектом.

    Бегло глянул и не понял почему Ваш выбор пал на LM2576, а не к примеру на один из самых распространенных LM2596. У меня LM2596 показал не плохие результаты стабильности, к примеру с тем же ADS1115.

    Кстати, LM2576 (размер 4.3cm*3.0cm*1.2cm) как и LM2596 есть уже в виде готовых модулей.
    [​IMG]
    Обычно использую отдельный источник питания для силовых цепей. Но не электронщик, увы, делаю как рекомендовали.

    Все зависит от моделей.

    Зачастую в хоббийные моторчики используют 3В/6В/9В/12В, 6В без проблем запустится на 5В. Другой вопрос эффективности. В большинстве хоббийных сервомашинок, указывается момент и скорость для 4,8В и 6В. Всегда питал от отдельного источника в 5В, ни каких проблем не было, кроме "дрожи" некоторых экземпляров, но это легко решается.
     
  19. Igor68

    Igor68 Гуру

    Доброго времени суток!!!
    У меня на руках готовый модуль уже в наличии! Несколько большего размера... только не с резистором, а с фиксированным переключением (5;4;3,3;2,7;1,8 В). Правда перемычка (для внешнего резистора) для 1,8 В не пропаяна вообще... наверное для того чтобы он мог выдавать максимально возможное напряжение выхода и я спалил бы, то, что подключил:) для 1,8 В. Микросхема варианта ADJ. Собственно остановился на размещении делителей для АЦП (измерение нескольких точек)... хотя в основном по причине перегруженности на работе. Ещё с подключением не понятно. Всего 2 канала... один для сервоприводов и моторов (управляемый - включение), другой для питания ардуино(не управляемый) и через ключ (управляемый) питание малины. Предполагал питать малину через USB разъём - на преобразователе... но пока не понятно как "развязать" питание для малины и ардуино.... предполагается по USB-SERIAL производить обмен по Modbus... и через него будет "питаться" малина от ардуино. Что не правильно т.к. малина выключаема... но не ардуино.
    ----- при подачи (аапаратной) питания на ардуино через порты ввода-вывода ардуино подаёт питание на малину и сервоприводы и моторы.
    ----- при необходимости малина через ардуино подаёт/снимает питание с сервоприводов и моторов через Modbus.
    ----- при остановке системы (отключении малины) малина передаёт команду по Modbus команду на отключение себя. Ардуино через время (время остановки ОС на малине) снимает питание с малины.
    ----- малина по Modbus кроме управления приводами и питанием контролирует значение напряжение в ряде точек (входное напряжение на каждом преобразователе, выходное напряжение на выходе каждого преобразователя, внешнее питание и т.д)
    Схема изменяется по причине размещения (места не хватает) на площади стандартного шилда. Особенно много мета занимают клеммники:
    ---- подача внешнего питания (2 клеммы)
    ---- подключение аккумулятора для сервоприводов (3 клеммы - напряжение на аккумулятор(1), напряжение на преобразователь(2), общий(3)
    ---- подключение аккумулятора для контроллеров(3 клеммы)... аналогично как и для сервоприводов и моторов.
    ---- подключение нагрузки(силовое для моторов и сервоприводов) 2 клеммы. Правда дублируется на клеммы шилда (стандартно V+)... но и внешнее конечно.
    Напряжение питания 5 В на ардуино и цепи управления (контроллеры) шилдов тоже через разъём шилда(стандартный). К сожалению платы для аккумуляторов надо отдельно делать и размещать с аккумуляторами. На этой площади не выходит. Слишком большие выходят ёмкости и индуктивности. Это если не считать диоды, особенно на входе и для аккумуляторов:
    ---- питание на контроллеры (преобразователь) поступает от любого источника
    ---- питание на сервоприводы поступает только от внешнего питания и аккумулятора для сервоприводов и моторов.
    Контроллер зарядки АБ должен быть "умным" и сам решает что "делать" при любых условиях.
    Плату пока не заказал на изготовление.
    ... кстати сонар с обменом по I2C на прошлой неделе приехал. Жаль времени нет... на больничном было легче... и работа кипела.
     
    Alex19 нравится это.
  20. Igor68

    Igor68 Гуру

    Доброго времени суток!!!
    ...Может и зря Вас беспокою, но есть некоторые сомнения в управлении микросхемой LM2576-(5V). Именно включением и выключением... точнее для чего это (роде понятно, но сомнения есть):
    snapshot30.png
    И это:
    snapshot31.png
    Ну тут всё ясно задержка включения:
    snapshot32.png
    Вот и возникает вопрос по первым двум картинкам... если без ограничения (стабилизации) напряжения на выводе 5???. Понятно, что подача на базу (управление) приведёт к включению LM2576... но вот выходит нельзя оставлять этот вывод в "воздухе", а надо подпирать? и тут другого нет, как формировать уровень из входного напряжения - но не превышать какого-то значения (первые две картинки).
    Хорошо, что заказ не делал... и возможно ли "подпирать" через резистор с выхода другой LM2576 которая без управления и при наличии питания на входе постоянно в работе?
    Заранее Спасибо!!!
    Добавлено позже: Есть предположение что данная цепь для запрета включения если входное напряжение ниже какой -то заданной величины:
    snapshot33.png
     
    Последнее редактирование: 9 апр 2017