Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Сыграйте в классический пасьянс и попробуйте разложить по порядку колоду из 52 карт, начиная с короля и заканчивая тузом. Игра имеет четыре варианта: с 1, 2, 3 и 4 мастями. Выиграйте как можно больше в каждом варианте и улучшите свои показатели.

Пасьянс Паук «Классический»

Карточные, Логическая, Мобильная

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Stm32 + Микроконтроллеры

С этим тегом используют

Электроника Arduino Программирование Своими руками Самоделки Радиолюбители Все
33 поста сначала свежее
71
nagibator2505
5 лет назад
Лига Радиолюбителей

ИК паяльная станция, ПИД регулятор, фазовое управление, stm32⁠⁠

Захотелось мне как то сделать инфракрасную паяльную станцию. Начал я смотреть разные сайты с готовыми схемами и решил сделать по-своему. Так же среди этих сайтов был и Пикабу, человек очень хорошо описал фазовое управление и алгоритм Брейзенхейма (тут ссылка на статью )Ардуино и управление мощной нагрузкой переменного тока или самогонный аппарат 2. но мне не понравилась идея использовать 2 контроллера.
Задание для себя было таким:
• Два ПИД регулятора для верхнего и нижнего нагревателей;
• Соответственно 2 датчика температуры (для каждого регулятора свой);
• Управление с энкодера и встроенной в него кнопки;
• Отображение на дисплей SSD1306 (128x64 т.к. был)
• Отсылка данных в ПК через USB-CDC;
• Фазовое регулирование (алгоритм Брейзенхейма)
• Малошумящее управление тиристорами (MOC3063)

Мозгом паяльника стал STM32f103 или в народе BluePill. Сконфигурировал его в CubeMX и понеслось.

ИК паяльная станция, ПИД регулятор, фазовое управление, stm32 Электроника, Электричество, Своими руками, Длиннопост, Паяльная станция, Stm32, Микроконтроллеры

Измерение температуры сделал на термопарах с усилением их сигнала на отдельной плате-усилителе (в моем случае я калибровал для каждого канала отдельно каждую термопару). Если будете повторять, лучше сделать на модуле max31855, но придется немного изменить код и схему (там не много просто я занял оба SPI, но место еще есть, луче использовать SPI2) .
В основном меню устанавливаем температуру, поворотом энкодера, значения сохраняются во флеш. Если вам не нужен верх, то можно установить 0 в задании температуры.

ИК паяльная станция, ПИД регулятор, фазовое управление, stm32 Электроника, Электричество, Своими руками, Длиннопост, Паяльная станция, Stm32, Микроконтроллеры

Так же есть подменю с настройками ПИД регуляторов, тут перемещение нажатием кнопки на энкодере а поворот устанавливает значение.

ИК паяльная станция, ПИД регулятор, фазовое управление, stm32 Электроника, Электричество, Своими руками, Длиннопост, Паяльная станция, Stm32, Микроконтроллеры

ПИД регулятор получился не такой как все =). Его интегральная часть это единица времени, а не просто безразмерный коэффициент как в других цифровых регуляторах. Все цифровые регуляторы дискретны (мои срабатывают каждые 500мс(можно сделать быстрее если нужно)), за это время интегральная часть закидывает в буфер текущее значение ошибки регулирования. Дальше берется сумма этого буфера и вот мы получаем интеграл. Вот тут то и отличие, те регуляторы, что я видел, берут сумму всего буфера и умножают на безразмерный коэффициент. У моего регулятора интегратор это и есть число выборок, которое нужно взять. Допустим, время интегрирования установлено 10 т.к. частота дискретизации регулятора 0,5 с 10*0,5=5 секунд. Следовательно, регулятор будет использовать интеграл изменения ошибки за последние 5 секунд. Максимум 256 выборок. Хотел сделать, что то похожее с дифференциальным звеном, но чет забил. Там можно было бы уменьшать время для следующего отчета ошибки для диф. звена, но тогда придется слишком часто дергать АЦП, а нам еще данные по ЮСБ отправлять и на экран.
Чтобы получать данные по USB нужно установить драйвер от STM usb-cdc. Потом у Вас появится ком порт, куда каждые 500мс будут отправляться данные. Можно не использовать эту функцию, ну а если решите написать ГУИ, то в коде вся строка отправления лежит за sprintf. Так же можно отправлять команды на управление. Например, чтобы установить температуру верха нужно закинуть строковые “Ch5”+ 2 байта значение температуры (0x01ff-511 градусов).
Использован широко известный экран i2c на контроллере ssd1306 (128x64), я использую свою библиотеку к нему (урезанный adafruit).
В силовой части использовал тиристоры BTA41-600. Они на 40А, но т.к. китайские, для нагрузки в 2кВт поставил 2 штуки параллельно (говорят так нельзя делать, но я надеюсь, Вы никому не скажете). Чтобы ими управлять и использую внешние прерывания при переходе синуса сети через 0. Сделано на самой обычной оптопаре, диодном мосте и паре резисторов (на схеме d1-4, u5). На печатной плате разделил силовую часть от слаботочной. Предохранителей никаких не ставил, потому что думаю запитать от автомата.

ИК паяльная станция, ПИД регулятор, фазовое управление, stm32 Электроника, Электричество, Своими руками, Длиннопост, Паяльная станция, Stm32, Микроконтроллеры
ИК паяльная станция, ПИД регулятор, фазовое управление, stm32 Электроника, Электричество, Своими руками, Длиннопост, Паяльная станция, Stm32, Микроконтроллеры

С силовой частью все. Вот такое получилось устройство в сборе (пока без радиаторов). Нагружал силовую часть лампочками по 100Вт, все работает.

ИК паяльная станция, ПИД регулятор, фазовое управление, stm32 Электроника, Электричество, Своими руками, Длиннопост, Паяльная станция, Stm32, Микроконтроллеры
ИК паяльная станция, ПИД регулятор, фазовое управление, stm32 Электроника, Электричество, Своими руками, Длиннопост, Паяльная станция, Stm32, Микроконтроллеры

Остается сделать корпус, пока на это нет времени. Нагреватели уже куплены и лежат в коробочках. Нагреватели заказывал у компании Электронагрев, обошлись в 6 тысяч с доставкой в Уфу, но при получении у Деловых линии, возникли проблемы с тем, что у них висел какой то долг)). Через пару дней они закрыли долг и я смог получить свои нагреватели.
Что я бы изменил, если делал заново:
• Использовал max31855
• Не забыл включить вачдог)))
• Использовал freertos
• Дописал ГУЙ))
Схемы и ссылку на код прилагаю:
https://drive.google.com/open?id=1TT0NNhkICT5_5t9u4LS_0rpkKu...
https://easyeda.com/aminovilshat/Payalnik_ultra
З.Ы. я не занимаюсь профессионально программированием STM32, это всего лишь хобби. Но судите строго) кроме советов отказаться от HAL и СubeMX.

Показать полностью 7
[моё] Электроника Электричество Своими руками Длиннопост Паяльная станция Stm32 Микроконтроллеры
40
81
MechanicalMimic
MechanicalMimic
5 лет назад
Лига Ролевиков

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon⁠⁠

Введение


Есть у меня одно хобби: игра в Dungeon and Dragon.

Справка из википедии про игру:

В игре участвуют ведущий (так называемый «мастер») и несколько игроков, число которых варьируется в зависимости от редакции и пожеланий участников. Обычно один игрок руководит в игровом мире действиями одного персонажа. Мастер действует от лица всех неигровых персонажей, описывает окружающую среду и происходящие в ней события. В течение игры каждый игрок задаёт действия для своего персонажа, а результаты действий определяются мастером в соответствии с правилами. Случайные события моделируются броском кубика. Иногда решения мастера могут не соответствовать правилам. Это является Золотым правилом игры: «ГМ всегда прав», так называемым «мастерским произволом». Традиционно руководство игры или свод правил включает в себя три книги: «Player’s Handbook», «Dungeon Master’s Guide» и «Monster Manual». Также существуют различные дополнения, которые мастер может использовать по своему усмотрению. Иногда для игры используются различные карты, чтобы визуально изобразить ситуации в игре, также могут использоваться фигурки персонажей и их противников. Но основным, а иногда и единственным требованием для игры является наличие листов персонажей и набора кубиков — дайсов — игральных костей с заданным числом сторон (d4, d6, d8, d10, d12, d20, d100(процентовый кубик)).

Недавно мне, как ведущему, захотелось для своих постоянных игроков выдумать что-нибудь этакое. Интересные квесты, загадки, ловушки, миниатюры и красивые карты — это все хорошо, однако хотелось что-то совсем-совсем особенное, не характерное для моих игр и к чему игроки еще не успели привыкнуть. Тут стоит отметить, что помимо D&D есть у меня и другое хобби — радиолюбительство, которым я увлекся вскоре после поступления в университет. Собственно, появилась мысль совместить два моих увлечения в одном и сконструировать шкатулку-головоломку, которую персонажи игроков найдут в игре, а вот разгадывать и получать неприятности от скрытых в ней ловушек придется уже игрокам в реальной жизни.


Шкатулка-головоломка

Из мешка убитого вами упыря вываливается странная и явно необычная шкатулка… ваши действия?
Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

Шкатулка представляет собой собранную из цельного листа толстого картона прямоугольную коробку с несколькими секциями. Спереди можно увидеть три запертых дверцы, а на крышке три рычага, которые могут принимать две возможных позиции, а так же соответствующие им три картинки: фонарь, ключ, меч.

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

С правой боковой стенки написан текст загадки и изображен дракон.

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

Получишь желаемое, если сможешь усыпить дракона в темноте и найдешь сочетание фонаря, что душу жжёт, меча, что рассекает миры, ключа, что откроет дверь.
Очевидная мысль, которая может сразу появиться при осмотре шкатулки проста: «Хэй, тут всего три рычага с двумя возможными позициями. Это всего-лишь девять комбинаций, которые можно подобрать поочередно и найти нужную!». То есть всё сводится к простому перебору… казалось бы, однако давайте перебирать комбинации.

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

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

Однако внутри оказывается лишь небольшой отдел с чашей внутри, которая заполнена до краев кислотной слизью (игрушечный лизун). Неаккуратный игрок, захотевший осмотреть находку, может запачкаться и его персонаж соответственно получит кислотный урон. В общем, эта комбинация — ошибочная и является ловушкой.

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

Что же, хорошо, подбираем комбинации рычагов дальше и свет загорается над дверцей посередине. Однако открывшего её ждет неприятный сюрприз.

Человека, который откроет дверь тут же обрызгает кислотной водицей (ладно, простой водицей) и если игрока заденет, урон получит соответственно его персонаж. Стоит отметить, что с левой боковой стенки находится еще одна запертая дверца, которая в такт брызгам будет открываться и закрываться, поддразнивая игроков. За ней видно сокровище — кольцо (на видео кольцо отсутствует). Однако о нем позже, продолжаем подбирать комбинации.

Дергая рычаги подбираем третью возможную комбинацию и дверца подсвечивается, сигнализируя, что она готова к открытию. За дверь мы видим одинокую желтую кнопку…

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

Нажимаем и слышим пронзительный писк — мощная звуковая волна исходит из шкатулки, нанося урон всем трём героям. Что же, третья дверь и последняя испробованная комбинация и все являются ошибочными! В чем секрет? Подсказка кроется в тексте загадке:

Получишь желаемое, если сможешь усыпить дракона в темноте
На боковой стенке у нас имеется дракон, давайте же попробуем усыпить его… выключив свет! На задней стенке расположен фоторезистор, реагирующий на степень освещенности. Как только свет выключается, светодиоды на крыльях дракона загораются, сообщая о том, что тот уснул и игроки двигаются в решении загадки в правильном направлении.

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

Дальше на ум приходят различные варианты: перепробовать комбинации рычагов еще раз, попробовать найти связь между изображениями на дверях с изображениями ключа, меча и фонаря на крышке шкатулки и многое другое, что может прийти на ум находчивым игрокам. К сожалению все варианты неверные. Однако при переборе вариантов хоть один игрок, да коснется определенного участка крышки и пронаблюдает интересное явление. Если коснуться пальцем или ладонью изображения фонаря, зажжется светодиод, который будет плавно менять свой цвет с красного на зеленый.

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

По аналогии игроки коснутся всех трех артефактов и обретут желаемое сокровище.

Заключение


Вот такая получилась шкатулка-головоломка, которая смогла разнообразить наш игровой процесс в игре Dungeon and Dragon и над разгадкой которой игроки бились около двадцати минут. Поделкой остался в целом доволен, однако картон хотелось бы заменить на дерево, а отделку сделать более аккуратной. В планах есть идеи других подобных вещиц для игры в Dungeon and Dragons. Если у кого-то был похожий опыт или имеются идеи для реализации - круто было бы почитать в комментариях, возможно использую в будущем.

В конце приведу некоторую информацию по тому как именно реализовывалась конструкция. Ниже приведена общая структурная схема, которая рисовалась для меня самого, чтобы легче было собирать конструкцию:

Шкатулка-головоломка на STM32 для игры Dungeon and Dragon Dungeons & Dragons, Stm32, Микроконтроллеры, Головоломка, Видео, Длиннопост

Рисовалась структурная схема второпях, могут присутствовать небольшие ошибки. Микроконтроллер использовался довольно популярный — stm32f103c8t6, расположенный на отладочной плате. При написании программы использовал стандартную библиотеку от производителя Standard Peripherals Library и среду разработки Keil uvision. Для управления светодиодами и тумблерами использовались выводы интерфейса GPIO, настроенные на выходы и входы. Водяной насос для обрызгивания игроков подключается через ключ на MOSFET транзисторе в smd корпусе, пачка которых у меня имелась при себе. Для звуковой ловушки использовался зуммер, который подключался через собранный мною простенький усилитель, опять же на MOSFET транзисторе. Сервоприводы управляются с помощью ШИМ, генерируемого одним из таймеров МК. Фоторезистор через делитель напряжения подключен к АЦП микроконтроллера, что позволяло регистрировать смену освещенности вокруг. Наконец, всё устройство имеет автономное питание от литий-полимерного аккумулятора и модуль заряда с защитой, выведенного на заднею стенку конструкции. Очень понравились емкостные сенсорные датчики TTP223, которые расположил под изображениями меча, фонаря и ключа — срабатывают при прикосновении даже через слой картона.

Показать полностью 9 2
[моё] Dungeons & Dragons Stm32 Микроконтроллеры Головоломка Видео Длиннопост
15
123
AfterBefore
6 лет назад

Вторая жизнь старому стрелочному мультиметру⁠⁠

Бывает, что у радиолюбителей есть старый стрелочный мультиметр советских времен, лежит где-то далеко на полке. По прямому назначению его уже использовать не хочется, а выкинуть жалко. Так и лежит. В этой статье мы сделаем его модернизацию, а именно – добавим USB, для возможности анализа данных и построения графиков.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Из курса школьной физики вспоминаем принцип работы такого измерительного прибора – ток течет по обмотке, находящейся в магнитном поле, пытается покрутиться и отклоняет стрелку. Первым делом вскрываем мультиметр и смотрим на подключение стрелки.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

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

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Выбираем провод с более резким наклоном прямой. В моем случае получилось что при максимальном отклонении стрелки напряжение равно 96,4 мВ. Для оцифровки микроконтроллером мало, но ничего страшного, это напряжение можно усилить операционным усилителем. Подойдет любой ОУ, я взял LM2904, просто потому что у меня такой был. Смотрим документ на микросхему – два ОУ в одном корпусе, максимальное выходное напряжение Vcc-1.5v. Запитывать будем от 3.3 вольт, значит надо подобрать коэффициенты усиления так, чтобы при зашкаливающей стрелке ОУ выдавал максимально возможное напряжение.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Готово. Первый каскад усиливает напряжение со стрелки мультиметра в 10 раз, второй каскад усиливает выход первого в зависимости от настройки потенциометра. Для тестов я собрал все на старом кусочке текстолита.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Проверяем напряжение на выходе усилителя при разных положениях стрелки. Нужно настроить так, чтобы когда стрелка зашкаливает, напряжение продолжало увеличиваться пока она не упрется в ограничитель хода. Теперь это напряжение надо оцифровать. Я взял китайскую платку с STM, купленную на Али.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

На борту у нее микроконтроллер STM32F103C8T6. Есть АЦП и USB. Подходит. Для первоначальной настройки предлагаю воспользоваться STM32CubeMX. Включаем тактирование, настраиваем кварцевые резонаторы.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Включаем и настраиваем АЦП, не забываем про прерывание по готовности.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

АЦП будет запускаться по событию таймера, настраиваем таймер.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Таймер тактируется частотой 48 МГц, с предделителем 24 и периодом 2000 получится, что он будет запускать АЦП каждую 1 мс. В принципе так часто нет смысла, но мы будем использовать усреднение значений, поэтому пусть будет. Включаем USB, выбираем Custom HID.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Генерируем проект и переходим к написанию кода. Я использовал System Workbench for STM32. Добавляем в «main.c» запуск таймера и АЦП, и несколько глобальных переменных.


/* USER CODE BEGIN PV */

//uint16_t adc_arr[ADC_MAX_CONVERSATIONS];

uint16_t adc_to_send;

uint32_t adc_sum;

uint8_t adc_counter;

uint8_t send_flag;

volatile uint16_t x;

/* USER CODE END PV */

/* USER CODE BEGIN 2 */

HAL_ADC_Start(&hadc1);

HAL_ADC_Start_IT(&hadc1);

HAL_TIM_Base_Start(&htim3);

/* USER CODE END 2 */


В прерывании прибавляем к переменной значение с АЦП и увеличиваем счетчик. Когда счетчик достигнет 200, усредняем значение и перекладываем в буфер для отправки по USB. Поднимем флаг, что пора отправлять.


/* USER CODE BEGIN 4 */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){

adc_sum+=HAL_ADC_GetValue(hadc);

adc_counter++;

if(adc_counter==ADC_MAX_CONVERSATIONS){

HAL_GPIO_TogglePin(LD_1_GPIO_Port,LD_1_Pin);

adc_to_send=adc_sum/ADC_MAX_CONVERSATIONS;

adc_counter=0;

adc_sum=0;

send_flag=1;

}

}

/* USER CODE END 4 */


В основном цикле все время проверяем флаг, если поднят опускаем и отправляем буфер. Получится что мы будем отправлять значения каждые 200 мс.


/* USER CODE BEGIN WHILE */

while (1)

{

// HAL_GPIO_TogglePin(LD_1_GPIO_Port,LD_1_Pin);

if(send_flag){

send_flag=0;

..USB_Send_report(adc_to_send);

}

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}


Дескриптор USB устройства уже создался стм кубом, его трогать не будем, только проверим интервал опроса, должно быть не больше наших 200 мс.


/* 34 */

0x07, /* bLength: Endpoint Descriptor size */

USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */

CUSTOM_HID_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/

0x03, /* bmAttributes: Interrupt endpoint */

CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */

0x00,

0x20, /* bInterval: Polling Interval (20 ms) */

/* 41 */


Далее составим «HID Report» дескриптор в программке HID Descriptor Tool.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Тут мы говорим, что наше устройство сообщает температуру в комнате (Usage). Report Size=8 и Report Count=4 означают, что 32 бита посылается от устройства к компьютеру (Input) и столько же от компьютера к устройству (Output). Нам из этого всего понадобится только 2 байта, остальное на будущее. Сохраняем как заголовочный файл, и копируем в наш код (куб там оставил место в файле usbd_custom_hid_if.c). Так же надо проверить соответствие размеров репорт дескриптора 35 байт и размер буфера под отправку (тут должно быть 5 байт, потому что мы еще указали Report ID – это еще 1 байт в самом начале). Прошьем и проверим, что устройство правильно определилось в системе.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Раскомментируем функцию отправки в файле «usbd_custom_hid_if.c» и заполняем, указав первым байтом Report ID, дальше наше значение АЦП.


/* USER CODE BEGIN 7 */

/**

* @brief Send the report to the Host

* @Param report: The report to be sent

* @Param len: The report length

* @retval USBD_OK if all operations are OK else USBD_FAIL

*/

static uint8_t USBD_CUSTOM_HID_SendReport_FS(uint8_t *report, uint16_t len)

{

return USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, report, len);

}

uint8_t USB_Send_report(uint16_t data){

Rep_buffer[0]=0x01;//report id

Rep_buffer[1]=data>>8;

Rep_buffer[2]=data;

Rep_buffer[3]=0xFF;

Rep_buffer[4]=0xFF;

return USBD_CUSTOM_HID_SendReport_FS(Rep_buffer,5);

}

/* USER CODE END 7 */


Проверяем в какой-нибудь утилитке что пакеты действительно идут.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Осталось написать программку под Windows, которая бы все это обрабатывала. Берем любимую среду программирования и библиотеку для работы с HID устройствами. Я взял старенькую Delphi 7 и библиотеку компонентов JEDI VCL. Из нее нужны «TJvHidDeviceController» и «TJvHidDevice». Добавляем обработчик «OnEnumerate» у девайс контроллера, в него по очереди прилетают все HID устройства при вызове энумерации. Остается отфильтровать наше устройство по VID и PID, затем связать с компонентом «TJvHidDevice».


function TUSBMeter.HidControllerEnumerate(HidDev: TJvHidDevice; const Idx: Integer): Boolean;

begin

if (IntToHex(HidDev.Attributes.VendorID,4)=VID)and

(IntToHex(HidDev.Attributes.ProductID,4)=PID) then

begin

if (HidDev.Caps.OutputReportByteLength=OUT_REPORT_COUNT_AMPERAGE) then

HidController.CheckOutByIndex(HidAmperage,Idx);

usb_ready:=true;

end;

Result := True;

end;


Данные будут приходить в обработчик «OnDeviceData». В нем вычисляем из посылки значение АЦП и выводим куда-нибудь для проверки.


procedure TUSBMeter.HidControllerDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word);


var

buf:^byte;

begin

if (IntToHex(HidDev.Attributes.VendorID,4)<>VID)or((IntToHex(HidDev.Attributes.ProductID,4)<>PID)) then exit;

buf:=Data; // rep

adc_abs:=buf^;

adc_abs:= adc_abs shl 8;

inc(buf);

adc_abs:=adc_abs+(buf^);

inc(buf);

callback;

end;


Теперь надо сделать пересчет, добавим на форму RadioGroup и настроим как на переключателе мультиметра. Я не стал добавлять шкалу сопротивлений, не нужна.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Заведем так же масштабирующий массив для пересчета и массив с единицами измерений.


const

scale_arr: array[1..18] of real = (600,300,150,60,30,15,6,3,0.75,1500,300,60,15,3,0.6,0.12,0.000012,1);

scale_arr_symb: array[1..18] of string[2] = ('V','V','V','V','V','V','V','V','V','mA','mA','mA','mA','mA','mA','mA','uA','');


Для пересчета еще понадобятся два граничных значения acd_min и adc_max. Подключаем потенциометр к мультиметру, выставляем стрелку на 0 и смотрим, что присылается в программу. Если тоже 0 – хорошо, если нет – не беда, подкорректируем. Потом выставляем стрелку на максимум и так же смотрим. Важно чтобы когда стрелка «зашкаливала» значение продолжало увеличиваться, так будет запас. Если этого нет, надо подкрутить потенциометр ОУ. У меня получилось 0 и 2365. Пересчитываем и выводим уже на основное табло.


procedure TMainForm.HID_Callback;

var

s:string;

buf:string;

rec_s:string;

begin

s:=floattostr(((meter.ADC-adc_min)/(adc_max-adc_min))*scale_arr[RadioGroup1.ItemIndex+1]);

buf:=copy(s,1,5);

buf[pos(',',buf)]:='.';

Label2.Caption:=buf;

end;

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Большая часть готова, теперь надо прикрутить запись в файл, страницу настроек с сохранением и красивый GUI. Формат файла я взял CSV, так как из него будет легко строить графики в Экселе.

Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост
Вторая жизнь старому стрелочному мультиметру Мультиметр, Новая жизнь старых вещей, Схемотехника, Микроконтроллеры, Arduino, Stm32, Delphi, Программирование, Видео, Длиннопост

Все, готово. Осталось собрать все в корпус мультиметра, свободного места там полно. Прорезать отверстие под USB шнурок и убрать обратно на самую дальнюю полку до тех пор, пока не понадобится снять долгий график разряда аккумулятора или график потребления тока каким-нибудь устройством.


Надеюсь, кому-нибудь будет полезно.

Показать полностью 23 1
[моё] Мультиметр Новая жизнь старых вещей Схемотехника Микроконтроллеры Arduino Stm32 Delphi Программирование Видео Длиннопост
45
77
shuran958
7 лет назад
TECHNO BROTHER

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы⁠⁠

И снова здравствуйте. Сегодня я хотел бы рассказать о не очень сложной, но достаточно полезной штуке - АЦП (Analog to Digital Converter) в stm32.


В тексте будут встречаться отсылки на мою первую статью, которую вы можете найти тут: https://pikabu.ru/story/dlya_nachinayushchikh_stm32f103c8t6_...


Итак, АЦП можно представить, как вольтметр, выдающий различные цифровые значения в зависимости от входного напряжения. В STM32 АЦП 12 разрядный, а входное напряжение на его входе колеблется от 0 до 3.3v (напряжение питания контроллера). Конструируя собственные поделки на камнях STM32 необходимо понимать, как работает АЦП.


На вход его подается 2 напряжения - напряжение питания и напряжение входное (котоорое мы хотим отобразить в числовом эквиваленте). Исходя из их сравнения АЦП и выдает результат. Из этого следует, что мы должны иметь очень стабильное напряжение питания самого АЦП, иначе значения будут сильно плавать. К счастью на нашей тестовой плате все уже реализовано и ничего изменить не удастся.


Давайте перейдем к наглядным примерам. Имеется 4 светодиода, каждый из которых подключен к выходам контроллера PB12(красный) PB13(желтый) PB14(зеленый) и PB15 (синий). Давайте подключим так же потенциометр, который будет работать делителем напряжения, а выходное значение будет обрабатываться нашим АЦП. Так же параллельно потенциометру подключим вольтметр, который будет помогать нам определить, что в данный момент на выходе делителя и соответственно на входе АЦП (в нашем случае это будет PA0).

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры
Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры
Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры
Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры

В программной части реализации разделим возможный диапазон на 4 части, которые будут начинаться со следующих значений (комментарий - из значение в вольтах):

#define ADC_0V_VALUE 0 //0V

#define ADC_1V_VALUE 1024 //0.825V

#define ADC_2V_VALUE 2048 //1.65V

#define ADC_3V_VALUE 3072 //2.475V


Итак, программа написана следующим образом. В зависимости от значения на выходе потенциометра будет устанавливаться высокий уровень (загораться светодиод) на выходах PB12-PB15.


Теперь перейем к созданию проекта. В CubeMX выберем нашу плату STM32F103C8Tx. Активируем ADC для IN0. Отметим порты PB12-PB15 как выходные. Включим дебаг через Serial Wire и подключим внешний кварц HSE (опционально).

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры

Вкладка Clock Configuration не имеет никаких изменений по сравнению с предыдущей статьей:

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры

А теперь зайдем в настройки AЦП:

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры

Вполне возможно, вы читали какие то гайды и как правило во всех них, при использовании куба с этой отладочной платой имеется аналогичный скрин, где видна возможность настройки разрядности АЦП (вроде этого):

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры

Но реальность увы не иная, возможно, ранее разрядность АЦП и можно было настроить для этого камня, но теперь куб такой возможности не предоставляет и окно конфига выглядит так:

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры

Возможно, это обусловлено тем, что камень f103 один из самых старых, и stm просто уделяет ему меньше внимания, но это не так критично, ведь по умолчанию, хоть разрядность ацп и не указана, но она выставлена как максимальное значение 12 бит. Все что нам необходимо, это включить Continious Conversion Mode, как на скрине выше. Зачем? Давайте останоовимся немного на режимах работы АЦП их 3:


1. Scan Conversion Mode (Многоканальный) - этот режим используется в том случае, если у нас будет несколько входных каналов преобразователя. Т.к. в данном случае мы используем только один вход A0, то этот режим оставляем отключенным. Если же вы используете несколько входных каналов, то АЦП можно будет сконфигурировать для их опроса в заданной последовательности.


2. Continious Conversion Mode (Циклический) - если этот режим отключен, то опрос канала/каналов произойдет лишь однажды, результат запишется в выходной регистр АЦП и данные всегда будут неизменны. В случае активацции, опрос каналов будет происходить непрерывно, и данные в выходном регистре будут обновляться.


3. Discontinuous Conversion Mode (Непоследовательный) - этот режим позволяет настроить АЦП сканирующее несколько каналов так, что бы опрос происходил не по всем каналам, а по заранее заданным группам каналов, причем если групп несколько, то за раз будет опрашиваться толко одна, затем следующая и т.д.


Следующий раздел ADC_Regular_ConversionMode предоставляет возможность сконфигурировать работу нескольких АЦП. Его мы рассмотрим в следующих статьях в более сложных примерах, а сейчас просто оставим все заданные значения по умолчанию.


На этом конфигурацию проэкта в CoubMX можно считать законченной. Завершим создание проекта для Atollic по аналогии с прошлой статьей.

Stm32f103C8T6 ADC (АЦП - аналого-цифровой преобразователь) основы Stm32f103, Гайд, Stm32, Длиннопост, Микроконтроллеры

Вся программная релизация заключается в объявлении переменной, хранящей значение adcResult и объявлении выше описанных #define значений. После этого в цикле читаем значение с АЦП в переменную adcResult и останавливаем АЦП до следующей итерации цикла:


HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 100);

adcResult = HAL_ADC_GetValue(&hadc1);

HAL_ADC_Stop(&hadc1);


Затем сравниваем полученное значение с объявленными выше и в зависимости от результата включаем заданный выход контроллера (загорается светодиод) и отключаем остальные.


Код приложения доступен для скачивания по ссылке: https://bitbucket.org/shurankain/adc_leds_f103/downloads/


Стоит заметить, что камень STM32F103C8 имеет встроенных 2 АЦП, каждый из которых может обрабатывать до 18 каналов. Каналами могут служить не только данные извне, но и от внутренних источников. На используемой нами плате доступны 10 внешних каналов (ADC1_IN0-ADC1_IN9 или ADC2_IN0-ADC2-IN9), а так же внутренний термометр встроенный в чип и опорное напряжение (1.20V но может меняться от температуры).


P.S. Дабы избежать ненужных вопросов в стиле: "а чем отличается от Адруино?", - отвечу сразу. Рарядностью. В ардуино 10и разрядный АЦП в stm32 12и разрядный. Что это значит? Ардуино может дискретизировать входной сигнал с точностью 1/1024 (1024 = 2 в 10й степени), в случае с stm32 это 1/4096 (2 в 12й степени). Соответственно, благодаря двум дополнительным разрядам, АЦП в stm32 выдает результат в 4 раза точнее.


P.S. Я обязательно расскажу об использовании нескольких АЦП в будущих статьях. Но в ближайших планируется рассказать о работе с i2c, подключении дисплеев и датчиков. Хочу поблагодарить своих подписчиков, которые у меня появились за интерес к данной теме! Буду рад отвтетить на ваши вопросы и услышать ценные советы с вашей стороны. Спасибо.

Показать полностью 10
[моё] Stm32f103 Гайд Stm32 Длиннопост Микроконтроллеры
25
2
Mi1ka
Mi1ka
7 лет назад

Простой стабилизатор напряжения на основе LM317T⁠⁠

Привет, Друзья! У меня есть парочка контроллеров Arduino Pro Mini, которые были куплены на Aliexpress по цене пару баксов за штуку. И естественно захотелось заюзать контролер в своих проектах. Я давай искать как Pro Mini питать током и каким именно. В интернетах пишут, что в Pro Mini встоенный стабилизатор тока и котроллер можно запитать током до 12 вольт и 1-1,5 Ампер, по аналогии с Arduino Nano. Подав такое напряжение на плату, с удивлением наблюдал всем известный сизый дымок. Понял, что напряжение и ток нужно снизить до значений как у USB в ПК. Для своего проекта заложил блок питания на 12 вольт и 2 ампера и понятно, что проще будет использовать понижающее устройство, для питания контроллера. Как раз в наличии имеется парочка линейных стабилизаторов LM317T, вот я и решил их использовать в деле. Раньше я делал лабораторный блок питания на основе этой же микросхемы, поэтому проблем быть не должно. Тем более нашел в сети конструкцию стабилизатора всего из 4-х деталек, что есть жирный плюс в пользу миниатюрности.


Первая стандартная схема подключения была взята из даташита и она управляет только напряжением:

Простой стабилизатор напряжения на основе LM317T Ремонт техники, Arduino, Сообщество arduino, Радиолюбители, Stm32, Длиннопост, Микроконтроллеры, Своими руками

Есть там схемы и для управления током в паре с напряжением, но мне они показались сложны из-за дополнительных деталек в виде транзисторов, резисторов и диодов.


Чуть углубившись в сеть, нашел схему по проще где она предлагает регулировку как напряжения, так и тока.

Простой стабилизатор напряжения на основе LM317T Ремонт техники, Arduino, Сообщество arduino, Радиолюбители, Stm32, Длиннопост, Микроконтроллеры, Своими руками

И эта схема оказалась самым верным решением. Просчитал схему и появилась нужда в резисторе на 2 ома, которого у меня нет и наверно не бывает (может и есть, но я не видел). В итоге сопротивление сделал сам в популярном корпусе “намотал на картонку”.

Простой стабилизатор напряжения на основе LM317T Ремонт техники, Arduino, Сообщество arduino, Радиолюбители, Stm32, Длиннопост, Микроконтроллеры, Своими руками

Схема на 5вольт и 0.5 ампер получилась следующей:

Простой стабилизатор напряжения на основе LM317T Ремонт техники, Arduino, Сообщество arduino, Радиолюбители, Stm32, Длиннопост, Микроконтроллеры, Своими руками

С помощью R1 можно настроить ограничение по току. А R2 и R3 определяют ограничение напряжения.


Вот больше инфографики:

Простой стабилизатор напряжения на основе LM317T Ремонт техники, Arduino, Сообщество arduino, Радиолюбители, Stm32, Длиннопост, Микроконтроллеры, Своими руками

И вот как получилось в проекте:

Простой стабилизатор напряжения на основе LM317T Ремонт техники, Arduino, Сообщество arduino, Радиолюбители, Stm32, Длиннопост, Микроконтроллеры, Своими руками

Нужных мне резисторов под рукой не оказалось, так я решил использовать переменные.

Схема получилась на удивление простая, работоспособная и живучая. Уверен, что буду использовать дальше такой метод.


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


Какие еще аналогичные средства можно использовать? Какие недостатки у этой схемы? Варианты?


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


Спасибо за внимание, всем пока!

Показать полностью 6
[моё] Ремонт техники Arduino Сообщество arduino Радиолюбители Stm32 Длиннопост Микроконтроллеры Своими руками
66
126
ComradeBulkin
ComradeBulkin
7 лет назад
Сообщество Ремонтёров

Темы будущих уроков по STM32⁠⁠

На волне вчерашнего поста https://pikabu.ru/story/18_podrobneyshikh_urokov_po_programm...


Есть идеи по написанию уроков по различным темам в разрезе STM32. Приглашаю @DmitryAR, @witiliar, @XanderEVG, @Arimf, @Alexey9, @slonofil, и @AlexGyver к обсуждению. Сам я занимаюсь разработкой и проектированием автоматики для отопительных систем на биотопливе, готов говорить в этом разрезе.


Собственно не вижу смысла говорить об основах языка, вроде типов данных. @AlexGyver это уже осветил. Но может стоит это преподнести в разрезе C99, а не C++?


Вот темы, которые я бы мог осветить, по разделам:


Основы программирования в разрезе C99 и STM32:

- #define: хитрости и приёмы

- SWITCH/CASE или IF/ELSE: когда и где применять

- Битовые операции: хитрости и приёмы


Фишки в разрезе STM32:

- FreeRTOS: планировщик, семафоры, стэки

- CubeMX и HAL: как сохранить переносимость кода, как искать нужные функции, где искать примеры и прочее

- Настройка таймеров, их различия, где искать информацию в документации по их параметрам

- RTC

- ADC и DAC

- Обработчик ошибок с задержками с использованием FreeRTOS (собственная библиотека)

- Простая Round Robin База данных (собственная библиотека)



Среда программирования и аппаратная отладка:

- Настройка собственной среды под Linux и Windows

- Настройка Sublime Text, System Workbench for STM32, KEIL

- Отдельно по KEIL: стилизация под Monokai, дебагинг, трэйсинг, настройка компилятора

- Логический анализатор (могу рассказать про Saleae Logic)


Модули:

- Принципы работы шин I2C, SPI. Их достоинства и недостатки. Различные режимы: Polling, Interrupt, DMA

- Watchdog: IWDG и WWDG - назначение, настройка

- Использование 7-сегментных дисплеев: подключение напрямую к МК и с помощью драйвера MAXIM MAX6950/MAX6951 (собственная библиотека)

- SPI EEPROM STM M95xxx (собственная библиотека)

- I2C расширители портов NXP PCA9671 и PCF8574  (собственная библиотека)


Проектирование схем и хитрости:

- Как правильно разводить резонаторы

- Дребезг кнопок: триггеры Шмитта и RS-триггер

- Защита портов (в разрезе дискретных и аналоговых для токовых петель)

- Импульсные и линейные регуляторы напряжения:  подбор элементной базы, разводка

- Реле: электромагнитные и твердотельные. Схемы подключения и различия использования

- В разрезе твердотельных реле особенно хочу остановиться на снабберных цепях

- Энкодеры

- Токовая петля

- Onewrire

- RS485 и Modbus (может имеет смысл рассмотреть их отдельно). По Modbus могу преподнести материал по адаптации FreeModbus Slave и собственную реализацию Modbus Master с использованием DMA и FreeRTOS

- Подключение датчика температуры PT100 напрямую (без звезды) с использованием ОУ в схеме стабилизации тока

- Фазовое регулирование напряжения: датчик нуля, табличные расчёты, таймеры


Проектирование готовых изделий:

- Проектирование плат в KiCAD: принципы работы, создание деталей, 3D-моделей и прочее

- Проектирование готового изделия в FreeCAD: сборочный чертёж, 3D-модель и т.д.


Отдельно могу поговорить об учёте и хранении радиодеталей, тем более, что использую самописную программу для этого.


Ну и на закуску, вот несколько готовых изделий:

Темы будущих уроков по STM32 Arduino, Программирование, Микроконтроллеры, Stm32, Длиннопост, Ремонт техники
Темы будущих уроков по STM32 Arduino, Программирование, Микроконтроллеры, Stm32, Длиннопост, Ремонт техники
Темы будущих уроков по STM32 Arduino, Программирование, Микроконтроллеры, Stm32, Длиннопост, Ремонт техники
Темы будущих уроков по STM32 Arduino, Программирование, Микроконтроллеры, Stm32, Длиннопост, Ремонт техники
Темы будущих уроков по STM32 Arduino, Программирование, Микроконтроллеры, Stm32, Длиннопост, Ремонт техники
Показать полностью 5
[моё] Arduino Программирование Микроконтроллеры Stm32 Длиннопост Ремонт техники
102
284
lirzman
lirzman
8 лет назад

Проект BladeRunner. Часть 3(заключительная).⁠⁠

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Всем снова привет.

Сегодня я расскажу о превратностях разработки электроники. И полагаю что эта часть моего рассказа, окажется наиболее полезна читателям(даже тем кто с электроникой и программированием на ВЫ).

!!!СРАЗУ ПРЕДУПРЕЖДАЮ - МНОГО ИНТЕРЕСНОГО ТЕКСТА!!!


Для начала 4 совета:

1)Первое что следует уяснить новичкам при разработке нового устройства : если не знаешь как воплотить ту или иную задумку, или не уверен будет ли она работать, - посмотри в интернете как сделали другие и скопируй. Серьёзно, такой подход сэкономит много денег а главное - времени, иначе первая ревизия вашей платы процентов на 20 будет состоять из таких костылей:

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

А если ничего найти не получается - читайте мануал(даташит или аппноут). Прочитали? Прочитайте ещё раз. Потом ещё и ещё... И так до тех пор пока не наступит просветление.

По себе скажу, выражение "Глядишь в книгу видишь - фигу"  отнюдь не фигуральное, если под вечер голова уже не варит - ложись спать, завтра тот-же текст или схема откроются  с новой стороны.


2)Отрабатывайте все программные и схемные решения на отладочной плате, и только потом заказывайте плату на производстве, самонадеянность тут ни к чему.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

3)Если вы не приняли во внимание 2 предыдущих совета, и микроконтроллер(регулятор, драйвер, или всё вместе) на вашей новенькой плате испустил дымок и перестал работать - это не повод опускать руки. Чудес не бывает, если всё сломалось - значит тому есть причина. Стоит тщательно проанализировать условия предшествующие поломке, возможно даже на бумажке по пунктам записать последовательность ваших действий(пока всё не забыли).

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

4) Если вы алкоголик, электроника - это не ваше)))

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

________________________________________________________________________________

Ну хватит лирики, перейдём к рассказу.

Проектируя стол, я изначально планировал делать кастомный контроллер подсветки и охлажнения. Готовые варианты даже не рассматривал. При этом я в полной мере осознавал сложность всего предприятия, опыт в электронике у меня был, но на производстве я ещё ничего не заказывал(вернее заказывал но неудачно). Срок на разработку я сам себе установил в месяц(наивный).


Техзадание было таким:

1)ШИМ управление 4-мя 120-мм кулерами и сбор данных со встроенного датчика холла(для тахометра).

2)Управление лентой из светодиодов WS2812B(тоже посредством ШИМ).

3)Управление ЖК экранчиком МЭЛТ MT-12864J и его подсветкой.

4)Сбор данных с 4-х аналоговых датчиков температуры LM335.

5)Сбор данных о напряжении на линиях питания 12В(для вентиляторов), 5В(для светодиодной ленты), 5В(USB) и 3.3В(питание МК и ЖК-экрана).

6)Передача и приём данных через интерфейс USB.

7)(Опционально)Определение нажатия кнопки включения стола, а так-же управление её подсветкой.

8)(Опционально) включение компьютера по расписанию с помощью пина PWR_ON на материнской плате.


Под это дело нужно было выбрать микроконтроллер. Вариантов было всего 4:

1)Atmel AVR(используется в Arduino): Проще найти людей которые о нём не знают, детище 90-х годов и повод для приятных ностальгических воспоминаний. Помню как я в радиомагазине на Петроградке, зелёный 11-классник, в окружении бородатых 40-летних дядек, трясущимися руками пытался купить AT90S1200, боже, это было страшнее покупки первой пачки презервативов.

Лет 10 назад этот 8-битный МК был бы почти безальтернативным вариантом в бюджетном сегменте, сейчас же его повсеместно вытеснили 32х-битные микроконтроллеры. Использовать его имеет смысл только для совсем простых проектов или для обучения.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

2)ST Microelectronics Stm32: Современный 32-х битный микроконтроллер на ядре ARM Cortex-M(R). Младший брат процессоров, стоящих в 95% всех смартфонов и планшетов на планете земля, этакий швейцарский нож с целым ворохом возможностей. Для примера: если AVR ATMEGA32 работает на частоте максимум 16МГц, то STM32F103 выжимают 72МГц, конечно из-за разности архитектур, напрямую частоты сравнивать нельзя, это скорее отражает более современный техпроцесс а соответственно меньшее энергопотребление.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

3)К1986ВЕ1Т от отечественной компании Миландр, отладочная плата под который у меня уже была. Микроконтроллер с "лицензированным" у ARM ядром Cortex-M1, по старой русской традиции используется в изделиях для военных, в частности в авиационных применениях. Мало того что является прямым аналогом некоторых контроллеров STM32 и имеет документацию на Русском языке, так ещё оборудован интерфейсами ГОСТ 18977-79(ARINC 429) и ГОСТ Р 52070-2003(MIL-STD-1553) что позволяет создать например гирокомпас, подключающийся к бортовой сети практически любого гражданского самолёта. Ну или ракету с GPS/ГЛОНАСС наведением для СУ-27 или F-16))

Так вот, изначально я хотел выбрать именно отечественный МК, проблема возникла в том что отпускная цена производителя выросла с ~250р в 2013, до 750р в 2016(У дистрибьютора LDM-Systems стоимость вообще за гранью добра и зла - 1800р за микросхему + доставка). Учитывая что тот-же STM32, можно купить в соседнем магазе за 250-500р, в этот раз я вынужден был поступиться своим патриотизмом(хотя кому я нужен со своей мелочью, в керамике с 5-й приёмкой этот МК стоит больше 10к).

(На картинке установлен модуль от Мультиклета, но вы просто включите воображение))

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

4)Плис Cyclone III или IV от Altera(плата тоже была).

Плис(Программируемые Логические Интегральные Схемы) или по буржуйски FPGA - изделия совершенно особенные, это своего рода программируемые микросхемы. То есть когда вы программируете это чудо - вы описываете логику работы всей микросхемы на аппаратном уровне, и это позволяет достигать невиданных, для обычных микроконтроллеров, уровней быстродействия и параллелизма. Например: если вы захотите на условном STM32, даже на максимальной частоте в 168МГц, заняться обработкой видео - у вас ничего не выйдет, внутренняя 32-битная шина - усрётся но не сможет прогнать такой объём данных между памятью и ядром, а если сможет(в разрешении 100х100) то на другие задачи его уже не хватит. Плис-же сделает это даже не почесавшись + в ней хватит ещё места под 2 ядра микроконтроллера со всей обвязкой.

Вы наверно спросите, а почему их тогда везде не используют? А я отвечу, потому что программисты под это хозяйство требуются очень высокой квалификации, и я бы сказал другого склада ума. По уровню абстракции, это работа уже с логическими элементами, ниже только само железо. Зато на ПЛИС можно вытворять такие вещи, которые не снились никаким x86 процессорам и видеокартам со всякими CUDA. За это их очень любят вояки, потому что можно сделать компактное устройство под конкретную задачу(типа технического зрения или расшифровки данных), но с чудовищной производительностью(и чудовищной стоимостью).

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Исходя из техзадания AVR отвалился сразу т.к у него нет DMA(для светодиодной ленты).

К1986ВЕ1Т выбыл потому-что стоит как чугунный мост и его не везде можно купить.

Плис  - штука весьма забористая, но для первого раза перебор. Так что оставим на потом.


В итоге я выбрал STM32 а если точнее - STM32F103RBT6 в корпусе lqfp64. Больше ножек я решил не делать т.к заранее знал что будут проблемы с запайкой.


Тут я, видимо, должен сделать развёрнутое пояснение по неизвестным терминам типа ШИМ, DMA и прочее. Но не буду, т.к большинству это будет нифига не интересно + это не просветительская статья.(Любопытным - гугл и википедия в помощь)


Проектировал всё в Altium Designer 16.0, решил попробовать новый для себя инструмент, на вид он страшный но добрый внутри. Освоить можно буквально по ходу проектирования, иногда поглядывая на обучающие ролики на ютубе и глядя в мануал. Прошивку писал в Keil uVision 5.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

По большому счёту накидать схему и по быстрому развести плату можно буквально за 2 дня. Но вся проблема такого подхода заключается в том, что плата делается 2 недели(в Зеленограде) и при внесении изменений в схему - придётся заказывать новую партию. А учитывая что первый мой проект(GPS-трекер, года 3 назад), который я решил воплотить в железе, так и не заработал(платы валяются до сих пор), у меня неплохо так играло очко. Поэтому я решил взять проект измором и вылизывал схему почти 2 месяца. На удивление такой параноидальный подход сработал, некоторые части схемы я переделывал по 3-4 раза.

Например управление вентиляторами сначала хотел делать на ULN2003(пара Дарлингтона), но поняв что он перегревается при большом кол-ве каналов(спасибо отладочной плате) решил делать на полевом транзисторе и с 2-х кратным запасом мощности.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Отдельная песня это подбор комплектующих, конденсаторы,резисторы,полевики,индуктивности,разъёмы. Было перелопачено адское количество документации на различные компоненты от разных прозводителей, возможно для профессионального разработчика электроники это и выглядит смешным, но для меня это была ещё та заморочка. В итоге некоторые компоненты я купил в ЧипиДипе, некоторые ехали с DigiKey, а мелочёвка вроде мелких транзисторов и пассивных компонентов с АлиЭкспресса(рекорд - 68 дней!).

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Сама плата толщиной 1.5мм с фольгой 35мкм, имеет 2 слоя и размеры 100мм х 100мм(1дм^2), для последующей лёгкости заказа у китайцев, т.к они любят фиксированные размеры. Крепится к столу с помощью 4-х латунных стоек, скрепляющих экран и контроллер в единое целое.

Короче заказал я плату в Резоните, отвалил 4 тысячи деревянных(это с золочением контактов, электро-контролем и доставкой до двери), подождал 2 недели, и получил свою плату. К тому моменту уже все компоненты были у меня, и мне осталось только всё собрать.

Стоит упомянуть что изделие я делал с расчётом на поверхностный монтаж, рассчитывая с помощью паяльной пасты и термофена всё запаять.

Но не тут-то было!

Вот для примера микроконтроллер в корпусе lqfp64 на миллиметровке:

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Я пробовал запаять его с помощью увеличительного стекла на 1.5х в течении целого дня, запорол 2 контроллера. Причём при выполнении какой-либо мелкой работы, у меня начинаются трястись руки и жутко болеть голова, и хотя я человек достаточно уравновешенный, состояние моё к концу дня было такое:

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Делать нечего - придётся покупать микроскоп.

Мой выбор пал на китайский монокулярный микроскоп  YA XUN YX-AK06 на 20 крат.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Покупал я его в известном всем магазине ПРОФИ(он-же siriust.ru) за 3900р, т.к в Питере его не было, пришлось ждать его с Воронежа, при этом они напортачили в накладной(отправителем и получателем значилось одно лицо - продавец магазина), поэтому прежде чем получить заветный микроскоп пришлось раз 20 позвонить в Воронеж и вынести всем мозг, к счастью на другом конце трубки ребята оказались адекватные, и получение заняло всего 2 часа. По сравнению с 2-х недельным ожиданием доставки до Питера(видимо он через Гонконг на ишаках ехал), это было сущей мелочью.

К тому моменту я был уже как дзен-буддист, любую проблему или задержку в неделю-другую воспринимал - философски.


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

Проблема оказалась в том, что при перемещении разъёма кулера на противоположный слой платы, я забыл отразить его в вертикальной плоскости.

Поясню:Вот 3-х пиновый разъём кулера и его распиновка.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Чёрный - земля, красный - +12 вольт, желтый - сигнал с датчика холла который нужно через резистор подтянуть на линию питания 3.3В, и подать на ножку МК.

Разъём сделан так что его можно вставить только одним образом, этакая защита от дурака. Но не от умного дурака.

Сейчас включу пэинт-мастера: как видите при запайке разъёма с обратной стороны платы(не по проекту) контакты GND и TACH(тот что идёт напрямую в микроконтроллер) меняются местами. Поэтому при проектировании, если ты переносишь разъём на другую сторону платы, так-же необходимо отзеркалить контакты в вертикальной плоскости, иначе микроконтроллер станет цепью питания кулера, и через него потечёт техилый такой ток прямо на вентилятор. Зато таким варварским способом я узнал что STM32 в пике может проглотить до 100мА х 6В индуктивной нагрузки(прежде чем испустить дух), что для меня стало настоящим открытием.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Второй затык который съел очередные 2 недели(этот временной период уже стал для меня этакой константой, по прошествии которой проблемы чудесным образом решаются или приходит озарение), это экран.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Стандартный отечественный экран, разрешением 128 на 64 точки. Это единственный компонент который я не проверял на отладочной плате перед отправкой в производство.

Выделенные контакты(V0 и VEE) на схеме необходимы для подстройки контрастности экрана.

Соединяются между собой через переменный резистор на 10 килоом(крутилка отвёрткой). В крайних положениях экран, либо полностью заливается пикселями либо наоборот ничего не видно. Так вот, V0 у меня был посажен на линию питания, а VEE на землю через резистор. Экран фактически работал но я этого не видел(думая что проблема в софте).

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Прозвонив осциллографом все контакты(шину данных и управления) и раскодировав весь обмен(поочерёдно сводя стриншоты с двухканального осциллографа в один файл), через неделю наконец понял что проблема в чём-то другом, и выпаял эти контакты и навесным монтажом повесил резистор как надо(на фото видно, 3-й и 18-й контакты).

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Третья проблема которую в должной мере, мне пока так и не удалось решить это -светодиодная лента. Построена она на таких малышах(фото не моё, взял в интернете):

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Это китайские RGB светодиоды, со встроенным контроллером WS2812B. Их фишкой является то что управляются они всего по одному проводу + 2 контакта питания, и в ленте им можно индивидуально устанавливать цвета(при этом количество светодиодов в ленте не ограничено). Например на их базе делают фоновую подсветку для телеков аля Ambilight - https://www.youtube.com/watch?v=Ykc7_BnUcRs

Их главный косяк в том, что питаются они от 5 вольт, и управляться должны тоже от 5 вольт. А у меня STM32 который работает от 3.3В. Как быть? В интернете советуют собирать преобразователь уровней на двух транзисторах, или специальных буферах. При этом везде делая пометки что светодиоды фурычат и от 3-х вольт. Я решил не плодить сущностей и пошел по самому простому пути - подключить напрямую. Самое смешное, что на отладочной плате лента отлично управлялась от 3х вольт. При этом в готовом изделии всё работает ровно до того момента пока не начинаешь тянуть провода(для двухметрового стола нужна подсветка в разных местах). Лента начинает моргать и мигать всеми цветами радуги, иногда выдавая цвета в духе FarCry Blood Dragon.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео
Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Хоть на данный момент, подсветка стола работает без сбоев, пускать на самотёк такую важную вещь нельзя. Поэтому я уже переделываю плату, и следующая версия будет работать как надо.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

Не хочется повторения геммеройного марафона, когда несколько дней подряд приходилось спать в соседней комнате на диванчике(потому что 31-кг стекло лежит на кровати), а стол выглядит вот так.

Проект BladeRunner. Часть 3(заключительная). Arduino, Stm32, Длиннопост, Стол, Печатная плата, Микроконтроллеры, Бегущий по лезвию, Pcb, Видео

________________________________________________________________________________

ИТОГ: Основная часть работ выполнена, проект закончен на 90%, ПО находится в процессе допиливания.


На данный момент работает:

1)Мониторинг температуры с 4х выносных термодатчиков.


2)Управление 5-ю кулерами на левой половине стола(плавный запуск при росте температуры видеокарты, и остановка в простое)


3)Плавная смена подсветки двух надписей BLADE RUNNER при росте температуры видеокарты, от тёмно синего при 40 градусах до красного при 80(синий,голубой,салатовый,зелёный,желтый,оранжевый,розовый,красный)

Автоматическое выставление желаемого цвета при выключении компьютера(функция ночник).


4)Отображение основных параметров системы на ЖК экранчике MT-12864J.


5)Мониторинг напряжений и уведомление пользователя при просадках по линиям питания 12В, 5В, и 3.3В.

________________________________________________________________________________

ПЛАНЫ:

Что планируется сделать в следующей ревизии контроллера:

1)Доведение количества индивидуально управляемых кулеров до 10-ти.


2)(Опционально) Возможность подключения 2-х ЖК экранчиков к одному контроллеру(для снижения цены)


3)Отдельная плата со светодиодами под каждую надпись и логотип(лента это не дело).


4)Возможность прямого подключения к шине SmBus на материнской плате, для считывания показаний термодатчиков видеокарты, процессора и т.д, без необходимости городить огород с ПО под каждую платформу, и танцев с бубном и нулевым кольцом.


5)Возможность управления помпой, жидкостного охлаждения компьютера.


6)С радостью выслушаю ваши предложения, потому-что у меня фантазия закончилась)

________________________________________________________________________________

Моя система:

ЦП: AMD FX-8320

Видеокарта: AMD Radeon R9 390

RAM: DDR3-1600 24ГБ

SSD: Kingston 240ГБ

HDD1: Toshiba 1TB

HDD2: Seagate 1TB

________________________________________________________________________________

Что касается многочисленных просьб выложить всё в открытый доступ и сколько денег ушло на всё-про-всё:


1)OpenSource: Смысла выкладывать полные чертежи именно на стол, - я особо не вижу.

OpenSource ведь изначально придумали для коллективного написания, а главное - развития ПО, потому-что это быстро, просто и удобно: 1)скачал исходники 2)что-то исправил 3)сделал коммит - внёс свою лепту в общее дело. 4)Все рады, всем польза.


Уже с OpenHardware проектами это работает с адским скрипом, потому что надо поднимать задницу с кресла - заказывать платы - платить деньги за компоненты - паять их и т.д.

К тому-же, если кто-то продаёт твою открытую разработку как свой коммерческий продукт - ты хрен что докажешь. Помнится как я одно время увлекался квадрокоптерами и попросил прислать схему контроллера OpenPilot Revolution(в Россию он не продавался), так меня послали нахрен с аргументацией типа - Русские всё воруют(как китайцы), поэтому хоть это и заявляется как открытый проект но вам я исходники не вышлю.


С чертежами же это не будет работать вовсе, т.к потребуется большой объём сопутствующей физической работы, и никто не будет заморачиваться тем что-бы улучшить то, во что ещё потребуется вбухать кучу денег, времени и сил.


К тому-же мне будет очень обидно, если через несколько недель он окажется на каком-нибудь AliExpress по 2000 юаней за штуку(китайцы п*здят всё что не приколочено).


Вот выложить в открытый доступ исходники платы, прошивки и управляющего ПО - вполне здравая идея. Но для начала нужно выпустить вторую версию платы, отполировать код, и перевести проект на какой-нибудь OpenSource CAD.


2)Сколько всё стоило: До рубля я расходы не подбивал, но учитывая что проекту уже полтора года, могу с уверенностью сказать - больше 100к точно.


ЗЫ: С радостью выслушаю ваши замечания и пожелания по развитию проекта. Обновления в проекте я буду выкладывать под этим аккаунтом, так что следите за новостями.


За сим позвольте откланяться, до новых встреч!

Показать полностью 24 1
[моё] Arduino Stm32 Длиннопост Стол Печатная плата Микроконтроллеры Бегущий по лезвию Pcb Видео
63
Партнёрский материал Реклама
specials
specials

Сколько нужно времени, чтобы уложить теплый пол?⁠⁠

Точно не скажем, но в нашем проекте с этим можно справиться буквально за минуту одной левой!

Попробовать

Ремонт Теплый пол Текст
33
techn0man1ac
techn0man1ac
8 лет назад
TECHNO BROTHER

Почему нужно изучать микроконтроллеры, мотивации пост⁠⁠

Почему нужно изучать микроконтроллеры, мотивации пост Терминатор, Радиолюбители, Микроконтроллеры, Мотивация, Mrподелкинц, Stm32

Оптимисты изучают английский. Пессимисты изучают китайский. Реалисты изучают микроконтроллеры ;)

By MrПоделкинЦ

[моё] Терминатор Радиолюбители Микроконтроллеры Мотивация Mrподелкинц Stm32
22
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии