Задать вопрос
Контакты

Наибольший вклад в теги

Все теги (10)

Лучшие ответы пользователя

Все ответы (7)
  • Как подключить HDMI к stm32?

    @Catethysis
    Как подключить схемотехникчески? Проводами, я думаю.

    Вы задачу нормально опишите, что нужно получать, как обрабатывать. Думается мне, что даже если завести сигнал HDMI в STM32 - ну, сигнал разрешением 320*240 у вас может быть и получится принять, но на даже самую слабую обработку ресурсов не хватит. Налицо неверный выбор инструмента и/или задачи. По вашему вопросу непохоже что у вас получится каким-то образом решить все задачи ввода и обработки. Тем более ещё тег Ардуино, ну постеснялись бы уж, право слово :)

    Окей, я закончил плеваться ядом. Теперь по сути. Очевидно что это только ПЛИС и ничего больше.
    Во-первых, ввод сигнала. Как известно, в HDMI применяется LVDS сигнал, чтобы из него получить TTL-уровни, вам потребуется приёмник LVDS. Более того, стандарт последовательный и высокоскоростной, значит потребуется как-то распараллелить обработку. Всё это делают специальные микросхемы-десериализаторы, первое что приходит в голову - микросхема TMDS341. У максимки тоже есть несколько таких микросхем, например MAX9264. Из них выходит достаточно удобный интерфейс: от 18 до 24 бит цвета плюс несколько клоков (пиксельный клок и вертикальная/горизонтальная синхронизация). Это уже можно напрямую втыкать в ПЛИС, но кстати можно найти и ПЛИС с LVDS-входами, правда это выйдет дороже в сумме. Если нужно после обработки снова сделать HDMI - берёте похожую микросхему-сериализатор, вроде MAX9263.

    Как раз похожая задача, приём видео с HDMI и выделение в нём цветов на границах картинки для создания Ambilight: tqfp.org/Perfer/fonovaya-podsvetka-hdmi-fpga-led-c... Похоже, проект ещё не закончен, но думаю что с этого можно начать.

    Во-вторых, обработка. Честно, не знаю что сказать. Если вам нужно как-то по локти ковыряться в принятом видео, типа сжимать его или что-нибудь там распознавать - бросьте это всё, и возьмите просто компьютер с платой видеоввода. Вручную вы это всё не сделаете.
    В принципе, можно поискать компьютеры-на-плате вроде https://www.toradex.com/ru/products/colibri-arm-co... но вам потребуется как-то запихнуть в неё этот сигнал (понятно что не через GPIO, так как требуется прямой доступ к шине памяти), и написать драйвер для обработки этого дела.
    Кажется, на выставках я видел подобный комп с входом HDMI, но надо понимать что это крайне невостребованная фича, и найти такое будет огромной удачей.
    Если же вам нужно, к примеру, просто наложить на видео текст (это называется OSD, on-screen display), то в принципе всё решается прям внутри ПЛИС - вы закрашиваете в нужный момент пиксель белым цветом, и всё. Это чуть ли не единственная задача в железной обработке видео, которая решается более-менее просто.

    Готовых схем не найдёте, слишком уж специфичная задача. Инженеры, самостоятельно сделавшие такое, предпочтут продавать это решение, чем делиться им.

    Ну и всегда остаётся простой путь, сконвертировать hdmi в композит/компонент, а их уже легче ввести в любой компьютер или компьютерный модуль.
    Ответ написан
    4 комментария
  • Как нужно изменить схему управления лампой через Arduino, чтобы транзистор открывался?

    @Catethysis
    IRFZ44N — хороший транзистор, но может быть ему недостаточно вашего напряжения, а 3.3 вольта уж точно мало. Возьмите какой-нибудь из серии IRL, я раньше часто использовал IRL2703 или IRL2705.
    Не забывайте смотреть на график №3 в даташитах, да и вообще на сам даташит.

    У вас сейчас много точек отказа, их нужно по отдельности проверить. Попробуйте включить/выключить транзистор сами, подавая на затвор 0 или 10 вольт. Затвор при этом должен быть замкнут на землю через резистор больше 10кОм, чтобы накопленный заряд рассасывался.
    Проверить транзистор нужно обязательно, потому что они довольно чувствительны к статике, и обижаются когда их трогают мокрыми руками.

    Я не использую ардуино (более того, я ардуинохейтер), но "тривиальная смена analogWrite(pinNumber, HIGH) и analogWrite(pinNumber, LOW) с частотой в 1000 мс" — разве это правильно? По-моему, в этом варианте нужно использовать digitalWrite.

    Дурацкая какая-то схема, что значит "0-60V+" и "0-60V-"? Это явно от недомыслия автора схемы. Вы не могли из-за этого случайно перепутать + и -?

    P.S. почитал сайт ergoz.ru, это просто насилие над мозгом. Нельзя обучаться по таким руководствам, разве что если себя не уважать, весь текст — дословный перевод с английского:
    * изобретение самодельных терминов, например "стягивающий резистор" или "ворота";
    * сплошные кальки с английского (например, "Arduino действительно пульсирует от 0 до 5V");
    * неверные объяснения процессов. "обязательно убедитесь, что подключаете диод правильно <...> иначе толку от него будет ноль, и может сделать даже хуже." Человек вообще не понимает о чём пишет.

    Найдите нормальный обучающий сайт, а лучше выбросьте эту ардуину в мусорное ведро.
    Ответ написан
    3 комментария
  • Что почитать про магнитные поля и магнитные взаимодействия?

    @Catethysis
    Когда-то давно я занимался решением подобной задачи: хотел построить график зависимости силы притяжения от расстояния между двумя магнитами, магниты смоделировал просто как кольца с током.
    1. Для вычисления силы использовал известную формулу, сила равна градиенту потенциальной энергии. Тут я сделал небольшое упрощение, рассматривал только силу, приложенную к центру магнитов - и не рассматривал то, что магниты могут пытаться повернуть друг друга. Но это тоже легко вычисляется.
    2. Энергия магнитного поля, в свою очередь, это пространственный интеграл произведения B*H = mu*B*B по dV. Пространство ограничиваем какими-то разумными пределами, я использовал ~200-1000 диаметров кольца.
    3. Магнитная индукция аддитивна, то есть B в "точке" dV складывается из B1 и B2 - полей одного и другого кольца. Кольца одинаковые, поэтому достаточно предварительно вычислить поле вокруг одного кольца, а потом для взятия интеграла складывать уже заранее вычисленные поля.
    4. Магнитное поле кольца осесимметрично, поэтому достаточно вычислить поле всего лишь на одной четверти плоскости, построенной на радиусе кольца и его оси.
    5. Для вычисления этого поля - формула Био-Савара-Лапласа, и циркулярный интеграл по контуру кольца. Тут уже наверное никак особо не соптимизируешь, разве что считать только половину кольца.

    Таким образом, по сути задача сводится к: циркулярный интеграл Био-Савара-Лапласа по половине кольца, посчитанный в каждой точке четвертьплоскости, и интегрирование этого поля по объёму с нужными смещениями и поворотами.

    В трёх местах есть проблемы:
    1. Поле вблизи кольца. Есть хороший метод в учебниках физики (к сожалению, не помню где) - рассматривать не бесконечно тонкое кольцо, тогда эта проблема легко решается.
    2. Грануляция сетки для более быстрого и точного расчёта. Стандартный способ - около кольца бьём плоскость на много сегментов, а дальше от кольца - сегменты всё больше и больше.
    3. Несовпадение сеток двух колец, если кольца повёрнуты друг относительно друга - я бы попробовал алгоритм Брезенхема для поиска ближайшего сегмента или даже интерполяции. Повторюсь, повороты я не реализовывал.

    Это было сделано лет пять назад на ноутбуке с Core2Duo 8500, на Delphi с применением SSE2, в 5 потоков. В зависимости от грануляции расчёт занимал до суток. В итоге была получена обратно-кубическая зависимость, как и ожидалось.

    Если требуется определить поведение системы - устремляете систему к минимуму энергии вариацией положений/поворотов магнитов, я бы действовал методом Ньютона. Благо, пересчёт системы с новыми положениями не требует перерасчёта магнитного поля кольца, а лишь требует расчёта пространственного интеграла.

    Что бы я сделал сейчас:
    1. перенёс векторные вычисления (циркулярный интеграл) на CUDA, пространственный интеграл - наверное, тоже.
    2. проверил, правомерна ли аппроксимация магнита кольцом с током - просто разместил бы много маленьких колец внутри объёма магнита (и конечно, в одном направлении, как домены), и сравнил поле такой имитации с полем одного кольца.
    3. сделал полноценные графики градиентов энергии по всем степеням свободы. Думаю, нашлось бы много интересного.
    Ответ написан
    3 комментария
  • Как создать NFC метку используя Arduino Nano?

    @Catethysis
    Слушайте, оно вам реально надо именно в таком виде? Ни в коем случае не хочу вас обидеть, но создание собственной nfc-метки на низком уровне - непростая задача, и я честно говоря не уверен что вы её решите.
    Сделайте гораздо проще - возьмите готовое решение от ST: www.st.com/web/en/catalog/mmc/FM76/CL1766/SC1412/SS851 они даже называются "dynamic RFID tags". Суть проста, эта микросхема - обычная EEPROM с I2C-интерфейсом, только у неё ещё есть выход на антенну. Получается, с этой микрой памяти можно общаться как по I2C, так и по RFID. Всё что остаётся сделать - записать в неё ардуиной нужные данные по I2C, и они станут доступны по RFID (и наоборот тоже).
    Ответ написан
    Комментировать
  • Как реализоать экономный delay на микроконтроллере?

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

    // Включаем тактирование таймера
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); 
    
    // Настраиваем прескалер. При тактовой частоте 24МГц частота
    // таймера будет равна 24МГц/24000 = 1кГц
    TIM6->PSC = 24000;
    
    // Настраиваем период таймера = 1000 циклов - полный цикл таймера
    // будет равен 1/1кГц*1000 = 1 секунда.
    TIM6->ARR = 1000;
    
    // Разрешаем прерывание по окончанию счёта
    TIM6->DIER |= TIM_DIER_UIE;  
    
    // Включаем обработку всех прерываний от таймера TIM6
    NVIC_EnableIRQ(TIM6_DAC_IRQn);
    
    // Включаем таймер
    TIM6->CR1 |= TIM_CR1_CEN;

    после срабатывания таймера будет вызван обработчик прерывания
    void TIM6_DAC_IRQHandler(void)
    {
      if (TIM6->SR & TIM_SR_UIF) {
        // Сбрасываем флаг прерывания
        TIM6->SR &= ~TIM_SR_UIF;
    
        /* ваш код после задержки*/
      }
    }


    Это не функция delay(100), это скорее демонстрация асинхронного алгоритма - но нужно понимать, что в сложных программах, особенно связанных с передачей и приёмом данных снаружи, практически всё нужно делать на прерываниях.
    Во время работы таймера процессор полностью свободен, и может рассчитывать какую-то математику или обслуживать другие прерывания.
    Довольно часто в моих программах для STM32 void main выглядит просто как while(1) {}, а вся логика работы находится именно в прерываниях. Кстати, здесь уже рукой подать до конечных автоматов.
    Ответ написан
    Комментировать