Как собрать контроллер своими руками

Содержание
  1. МозгоЧины
  2. Как сделать контроллер мотора на основе МОП-транзистора
  3. Как сделать контроллер мотора на основе МОП-транзистора
  4. Шаг 1: Инструменты и материалы
  5. Шаг 2: Компоновка деталей
  6. Шаг 3: Пайка
  7. Шаг 4:Обрезка платы
  8. Шаг 5: Доработка
  9. Шаг 6: Контроллер готов, используем его!
  10. Создаём собственный игровой контроллер
  11. Источник вдохновения
  12. Основные компоненты
  13. Рекомендуемые инструменты
  14. Программное обеспечение
  15. Предупреждение
  16. Часть 1. Собираем контроллер!
  17. Работаем с переключателями без документации.
  18. Простая двухконтактная кнопка/переключатель
  19. Подключаем переключатель к Arduino
  20. Другие переключатели почти без документации.
  21. Светодиодный переключатель с тремя контактами
  22. Подключаем переключатель к Arduino
  23. Проблемы этого решения
  24. Подключаем этот переключатель к Arduino правильно
  25. Подсказки по сборке
  26. Часть 2. Превращаем устройство в игровой контроллер!
  27. Часть 3. Интегрируем устройство с собственной игрой!
  28. Настраиваем Arduino
  29. Настраиваем игру
  30. Часть 4. Что если я хочу части 2 и 3 одновременно?
  31. Часть 5. Завершение

Сайт про изобретения своими руками

МозгоЧины

Сайт про изобретения своими руками

Как сделать контроллер мотора на основе МОП-транзистора

Как сделать контроллер мотора на основе МОП-транзистора

Приветствую, мозгоизобретатели! Сегодня собираем своими руками полезную вещь — контроллер мотора, который может пригодиться при создании множества самоделок, использующих двигатель под управлением микроконтроллера.

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

Поделка-контроллер состоит из минимума деталей и миниатюрна по размерам, что дает ей возможность легко помещаться в ваши мозгопроекты. Схема контроллера основана на схеме «управления большими нагрузками» из моих предыдущих проектов и содержит только один МОП-транзистор и диод. Это позволяет микроконтроллеру управлять скоростью мотора. А для возможности обратного управления я добавил DPDT реле, еще один МОП-транзистор и диодную пару для контроля смены полярности.

Думаю, что это мозгоруководство будет вам интересно!

Шаг 1: Инструменты и материалы

Как говорилось, эта поделка проста и использует минимум деталей:

  • макетная плата — используйте любую вам доступную
  • тонкий провод — я взял одиночный 24 калибра
  • МОП-ранзистор — 2шт.- я использовал IRF510, но сгодится и любой эквивалентный, например, NTE2382
  • DPDT реле 30В — на фото показана не та реле
  • выпрямляющий диод — 2шт.
  • штырьковые разъемы — лучше взять те, которые можно «отломать» на нужное количество штырьков.

А еще понадобятся некоторые инструменты:

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

Шаг 2: Компоновка деталей

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

Шаг 3: Пайка

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

Шаг 4:Обрезка платы

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

Шаг 5: Доработка

Осталось добавить несколько штрихов и «защитить» мозгоподелку. Изоляционными кусачками обрезаем торчащие концы проводков, при этом не повреждая целостность схемы. Можно использовать для этих целей и плоскогубцы, раскачивая в стороны проводки пока они не обломятся. Затем зигзагообразными покрываем плату горячим клеем, тем самым защищаем ее от возможного замыкания и повреждений, получится должно примерно как на фото.

Шаг 6: Контроллер готов, используем его!

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

Подключение к микроконтроллеру:

  • Подключаем мотор к контроллеру мотора через соответствующий разъем.
  • Вставляем контроллер мотора в макетную плату.
  • С помощью разноцветных проводов соединяем Vin поделки с Vin микроконтроллера, GND с GND микроконтроллера.
  • Используя еще два провода соединяем контакты «speed» и «reverse» контроллера мотора с двумя контактами микроконтроллера по вашему усмотрению.
  • Запрограммируйте микроконтроллер.
  • Не превышайте напряжение 30В на Vin.
  • Не путайте контакты.
  • Если вы используете напряжение выше 15В на Vin, то подключите Vin и GND непосредственно к источнику питания, и заземлите микроконтроллер, соединив его GND и GND источника питания.
  • При работе с большими мощностями на МОП-транзистор установите радиатор.
  • Применяйте только двухконтактые моторы постоянного тока.На этом все, благодарю за мозговнимание!
Читайте также:  Комбики для электрогитар ламповые своими руками

( Специально для МозгоЧинов #DIY-MOSFET-Motor-Controller

Источник

Создаём собственный игровой контроллер

Источник вдохновения

На игровых выставках разработчики Objects in Space показывали демо своей игры с контроллером на кокпите огромного космического корабля. Он был дополнен загорающимися кнопками, аналоговыми приборами, световыми индикаторами состояния, переключателями и т.д… Это сильно влияет на погружение в игру:

На сайте игры выложен туториал по Arduino с описанием коммуникационного протокола для подобных контроллеров.

Я хочу создать то же самое для своей игры

В этом примере я потрачу примерно 40 долларов, чтобы добавить красивые, большие и тяжёлые переключатели на кокпит симулятора гонок. Основные затраты связаны с этими самыми переключателями — если бы я использовал простые переключатели/кнопки, то цена была в два раза ниже! Это настоящее оборудование, способное выдерживать 240 Вт мощности, а я буду пускать по ним только примерно 0,03 Вт.

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

Основные компоненты

Рекомендуемые инструменты

Программное обеспечение

Предупреждение

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

Для меня это был обучающий проект, поэтому в нём могут быть плохие советы или ошибки!

Часть 1. Собираем контроллер!

Работаем с переключателями без документации.

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

Простая двухконтактная кнопка/переключатель

С кнопкой всё просто — в ней нет светодиодов и всего два контакта. Переключаем мультиметр в режим непрерывности/прозвонки () и касаемся щупами разных контактов — на экране будет отображаться OL (open loop, разомкнутая цепь): это означает, что между двумя щупами нет соединения. Затем нажимаем на кнопку, по-прежнему касаясь щупами контактов — на экране теперь должно отобразиться что-то типа 0.1Ω и мультиметр начнёт пищать (сообщая о том, что между щупами присутствует очень низкое сопротивление — замкнутая цепь).

Теперь мы знаем, что при нажатии кнопки цепь замыкается, а при отжатии — размыкается. На схеме это можно обозначить как простой выключатель:

Подключаем переключатель к Arduino

Найдите на плате Arduino два контакта: помеченный GND и помеченный «2» (или любым другим произвольным числом — это контакты ввода-вывода общего назначения, которыми мы можем управлять через ПО).

Если мы подключим переключатель таким образом, а потом прикажем Arduino сконфигурировать контакт «2» как контакт INPUT, то получим цепь, показанную слева (на рисунке ниже). При нажатии кнопки контакт 2 будет напрямую соединяться с землёй / 0V, а при отжатии контакт 2 не будет соединён ни с чем. Это состояние (ни с чем не соединён) называется «floating» (состояние с высоким импедансом) и, к сожалению, это не очень хорошее состояние для наших целей. Когда мы считываем данные с контакта в ПО (с помощью digitalRead(2)), получаем LOW, если контакт заземлён, и непредсказуемый результат (LOW или HIGH), если контакт находится в состоянии floating!

Чтобы исправить это, мы можем сконфигурировать контакт так, чтобы он находился в режиме INPUT_PULLUP, который соединяется с резистором внутри процессора и создаёт схему, показанную справа. В этой цепи при разомкнутом переключателе контакт 2 имеет путь к +5V, поэтому при его считывании результатом всегда будет HIGH. При замыкании переключателя у контакта по-прежнему будет путь с высоким сопротивлением к +5V, а также путь без сопротивления к земле / 0V, который «побеждает», благодаря чему при считывании контакта мы получаем LOW.

Разработчикам ПО порядок может показаться обратным — при нажатии кнопки мы считываем false / LOW, а при отжатии — true / HIGH.

Можно сделать и наоборот, но у процессора есть только встроенные подтягивающие резисторы и нет утягивающих вниз резисторов, поэтому мы будем придерживаться этой модели.

Простейшая программа для Arduino, которая считывает состояние переключателя и сообщает PC о его состоянии, выглядит примерно так, как показано ниже. Вы можете нажать кнопку загрузки в Arduino IDE, а затем открыть Serial Monitor (в меню Tools), чтобы увидеть результаты.

Другие переключатели почти без документации.

Светодиодный переключатель с тремя контактами

К счастью, на основных переключателях моей панели есть пометки трёх контактов:

Я не полностью уверен, как он работает, поэтому мы снова переключим мультиметр в режим непрерывности и коснёмся всех пар контактов при включенном и отключенном переключателе… однако на этот раз мультиметр вообще не пищит, когда мы касаемся щупами [GND] и [+] при «включенном» переключателе! Единственная конфигурация, при которой мультиметр пищит (обнаруживает соединение) — когда переключатель «включен», а щупы находятся на [+] и [lamp].

Читайте также:  Маска своими руками с бисера

Светодиод внутри переключателя блокирует измерения непрерывности, поэтому из проведённых выше проверок мы можем предположить, что LED подключен непосредственно к контакту [GND], а не к контактам [+] и [lamp]. Далее мы переключим мультиметр в режим проверки диодов (символ ) и снова проверим пары контактов, но на этот раз важна полярность (красный и чёрный щуп). Теперь если мы соединим красный щуп с [lamp], а чёрный — с [GND], то светодиод загорится, а на мультиметре отобразится 2.25V. Это прямое напряжение диода, или минимальное напряжение, необходимое для его включения. Вне зависимости от положения переключателя, 2.25V от [lamp] к [GND] заставляет LED загореться. Если мы соединим красный щуп с [+], а чёрный — с [GND], то светодиод загорится только при включённом переключателе.

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

  1. [+] и [lamp] замыкаются накоротко, когда переключатель включен/замкнут.
  2. Положительное напряжение от [lamp] к [GND] всегда зажигает светодиод.
  3. Положительное напряжение от [+] к [GND] зажигает светодиод только при включенном/замкнутом переключателе.

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

Подключаем переключатель к Arduino

Проще всего использовать переключатель с Arduino, проигнорировав контакт [lamp]: подключить [GND] к GND в Arduino и соединить [+] с одним из пронумерованных контактов Arduino, например 3.

Если мы сконфигурируем контакт 3 как INPUT_PULLUP (так же, как и для предыдущей кнопки), то придём к показанному ниже результату. Слева вверху показано значение, которое мы будем получать, выполнив «digitalRead(3)» в коде Arduino.

Когда переключатель включен/замкнут, мы считываем LOW и светодиод загорается! Для использования такого переключателя в данной конфигурации мы можем использовать тот же код Arduino, что и в примере с кнопкой.

Проблемы этого решения

После подключения к Arduino полная цепь выглядит так:

Однако здесь мы можем увидеть, что при замыкании переключателя кроме небольшого ограничивающего ток резистора перед LED (я предполагаю, что его сопротивление 100 Ом) есть и ещё и подтягивающий резистор на 20 кОм, который ещё больше снижает величину тока, текущего через светодиод. Это означает, что хотя цепь и работает, светодиод будет не очень ярким.

Ещё один недостаток этой схемы в том, что у нас нет программного контроля над LED — он включён, когда включён переключатель, и отключен в противоположном случае.

Можно посмотреть, что случится, если мы подключим контакт [lamp] или к 0V, или к +5V.

Если [lamp] подключен к 0V, то светодиод постоянно отключен (вне зависимости от позиции переключателя), а распознавание позиции Arduino всё равно выполняется. Это позволяет нам при желании программно отключать LED!

Если [lamp] подключен к +5V, то светодиод постоянно включен (вне зависимости от позиции переключателя), однако распознавание позиции Arduino поломано — с контакта всегда будет считываться HIGH.

Подключаем этот переключатель к Arduino правильно

Мы можем преодолеть описанные выше ограничения (низкий ток/яркость светодиода и отсутствие программного контроля над светодиодом), написав больше кода! Чтобы разрешить конфликт между возможностью управления светодиодом и сломанным из-за него распознаванием позиции, мы можем разделить две задачи по времени, то есть временно отключать LED при считывании контакта датчика (3).

Сначала подключим контакт [lamp] к ещё одному контакту Arduino общего назначения, например, к 4, чтобы можно было управлять lamp.

Чтобы создать программу, которая будет правильно считывать позицию переключателя и управлять светодиодом (мы заставим его мигать), нам достаточно просто отключать светодиод перед считыванием состояния переключателя. Светодиод будет отключаться всего на доли миллисекунд, поэтому мерцание не должно быть заметно:

В Arduino Mega контакты 2-13 и 44-46 могут использовать функцию analogWrite, которая на самом деле не создаёт напряжения от 0V до +5V, а аппроксимирует его при помощи прямоугольной волны. При желании можно использовать её для управления яркостью светодиода! Этот код заставит свет пульсировать, а не просто мерцать:

Подсказки по сборке

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

Однако приведу самые базовые советы:

  • При соединении проводов с большими металлическим контактами сначала убедитесь, что паяльник нагрелся и какое-то время нагревайте и металлический контакт. Смысл пайки заключается в образовании постоянного соединения созданием сплава, но если горячей является только одна часть соединения, то у вас запросто может получиться «холодное соединение», которое выглядит как соединение, но на самом деле не соединено.
  • При соединении двух проводов наденьте сначала на один из них кусок термоусадочной трубки — после соединения трубку надеть будет нельзя. Это кажется очевидным, но я постоянно это забываю и мне приходится использовать вместо трубки изоленту… Протяните термоусадочную трубку подальше от соединения, чтобы она не нагрелась раньше времени. Проверив паянное соединение сдвиньте на него трубку и нагрейте её.
  • Тонкие маленькие соединительные провода, которые я упоминал в начале, хорошо подходят для соединений без пайки (например, при подключении к Arduino!), но довольно хрупкие. После пайки используйте для их закрепления клеевой пистолет и устраните из самого соединения все напряжения. Например, красные провода на показанном ниже снимке при работе можно случайно потянуть, поэтому после пайки я зафиксировал их каплей горячего клея:

Часть 2. Превращаем устройство в игровой контроллер!

Чтобы ОС распознала устройство как игровой USB-контроллер, нужен достаточно простой код, но, к сожалению, также необходимо заменить firmware USB-чипа Arduino другим, которое можно взять здесь: https://github.com/harlequin-tech/arduino-usb.

Но после заливки этого firmware в Arduino устройство становится USB-джойстиком и перестаёт быть Arduino. Поэтому чтобы перепрограммировать его, нужно заново перепрошить исходную firmware Arduino. Эти итерации довольно мучительны — загружаем код Arduino, прошиваем firmware джойстика, тестируем, прошиваем firmware arduino, повторяем…

Пример программы для Arduino, которую можно использовать с этим firmware, показан ниже — он конфигурирует три кнопки в качестве вводов, считывает их значения, копирует значения в структуру данных, ожидаемую этим firmware, а затем отправляет данные. Смыть, намылить, повторить.

Часть 3. Интегрируем устройство с собственной игрой!

Если у вас есть контроль над игрой, с которой должно взаимодействовать устройство, то в качестве альтернативы можно общаться с контроллером напрямую — нет необходимости делать его видимым для ОС как джойстик! В начале поста я упомянул Objects In Space; именно такой подход использовали её разработчики. Они создали простой коммуникационный ASCII-протокол, позволяющий контроллеру и игре общаться друг с другом. Достаточно просто перечислить последовательные порты системы (они же COM-порты в Windows; кстати, посмотрите, как ужасно это выглядит на C), найти порт, к которому подключено устройство с названием «Arduino», и начать считывать/записывать ASCII по этой ссылке.

На стороне Arduino мы просто используем функции Serial.print, которые применялись в показанных выше примерах.

В начале этого поста я также упоминал мою библиотеку для решения этой задачи: https://github.com/hodgman/ois_protocol.

Она содержит код на C++, который можно интегрировать в игру и использовать её в качестве «сервера», и код Arduino, который можно выполнять в контроллере, чтобы использовать его в качестве «клиента».

Настраиваем Arduino

В example_hardware.h я создал классы, чтобы абстрагировать отдельные кнопки/переключатели; например, «Switch» — это простая кнопка из первого примера., а «LedSwitch2Pin» — переключатель с управляемым светодиодом из второго примера.

Код примера для моей панели кнопок находится в example.ino.

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

Настраиваем игру

Код игры написан в стиле «single header». Для импорта библиотеки включим в игру oisdevice.h.

В едином файле CPP, прежде чем выполнять #include заголовка, напишем #define OIS_DEVICE_IMPL и #define OIS_SERIALPORT_IMPL — это добавит в файл CPP исходный код классов. Если у вас есть собственные утверждения, логгинг, строки или векторы, то существует несколько других макросов OIS_*, которые можно определить перед импортом заголовка, чтобы воспользоваться возможностями движка.

Для перечисления COM-портов и создания соединения с конкретным устройством можно использовать такой код:

Получив экземпляр OisDevice, нужно регулярно вызывать его функцию-член Poll (например, в каждом кадре), можно получать текущее состояние вывода контроллера с помощью DeviceOutputs(), использовать события устройства с помощью PopEvents() и отправлять устройству значения с помощью SetInput().

Пример приложения, делающего всё это, можно найти здесь: example_ois2vjoy/main.cpp.

Часть 4. Что если я хочу части 2 и 3 одновременно?

Чтобы контроллер мог работать в других играх (часть 2), нужно установить собственное firmware и одну программу Arduino, но чтобы контроллер полностью программировался игрой, мы использовали стандартное firmware Arduino и другую программу Arduino. Но что если мы хотим иметь обе возможности одновременно?

Пример приложения, на который я давал ссылку выше (ois2vjoy), решает эту проблему.

Это приложение общается с OIS-устройством (программа из части 3), а затем на PC преобразует эти данные в обычные данные контроллера/джойстика, которые потом передаются в виртуальное устройство контроллера/джойстика. Это означает, что можно позволить своему контроллеру постоянно использовать библиотеку OIS (другое firmware не требуется), а если мы захотим использовать его как обычный контроллер/джойстик, то просто запустим на PC приложение ois2vjoy, выполняющее преобразование.

Часть 5. Завершение

Надеюсь, кому-то эта статья показалась полезной или интересной. Спасибо, что дочитали до конца!

Если вам стало любопытно, то я приглашаю вас поучаствовать в развитии библиотеки ois_protocol! Думаю, будет здорово разработать единый протокол для поддержки всевозможных самодельных контроллеров в играх и стимулировать игры к прямой поддержке самодельных контроллеров!

Источник

Читайте также:  Пригласительные своими руками материалы
Оцените статью
Своими руками