- Необходимый материал
- Понимание модуля джойстика:
- Принципиальная электрическая схема:
- Программирование для взаимодействия с джойстиком:
- Просмотр моделирования:
- Оборудование и работа:
Устройства ввода играют жизненно важную роль в любых электронных проектах. Эти устройства ввода помогают пользователю взаимодействовать с цифровым миром. Устройство ввода может быть простым, как кнопка, или сложным, как сенсорный экран; он варьируется в зависимости от требований проекта. В этом уроке мы узнаем, как соединить джойстик с нашим микроконтроллером PIC, джойстик - это отличный способ взаимодействия с цифровым миром, и почти каждый использовал бы его для игр в видеоигры в подростковом возрасте.
Джойстик может показаться сложным устройством, но на самом деле это просто комбинация двух потенциометров и кнопки. Следовательно, также очень легко взаимодействовать с любым MCU, если мы знаем, как использовать функцию ADC этого MCU. Мы уже узнали, как использовать ADC с PIC, поэтому это будет просто обходной путь для взаимодействия с джойстиком. Людям, которые не знакомы с выбором, рекомендуется изучить вышеупомянутый проект ADC, а также проект последовательности мигания светодиода, чтобы облегчить понимание проекта.
Необходимый материал
- PicKit 3 для программирования
- Модуль Joy Stick
- PIC16F877A IC
- 40 - Пин-держатель IC
- Перфорированная доска
- Кварцевый генератор 20 МГц
- Булавки Bergstik
- 220 Ом резистор
- 5 светодиодов любого цвета
- 1 комплект для пайки
- IC 7805
- Адаптер 12 В
- Соединительные провода
- Макетная плата
Понимание модуля джойстика:
Джойстики бывают разных форм и размеров. Типичный модуль джойстика показан на рисунке ниже. Джойстик - это не что иное, как пара потенциометров и кнопки, установленных на умном механическом устройстве. Потенциометр используется для отслеживания перемещения джойстика по осям X и Y, а кнопка используется для определения нажатия на джойстик. Оба потенциометра выдают аналоговое напряжение, которое зависит от положения джойстика. И мы можем узнать направление движения, интерпретируя эти изменения напряжения с помощью микроконтроллера. Ранее мы связали джойстик с AVR, джойстик с Arduino и Raspberry Pi.
Перед подключением любого датчика или модуля к микроконтроллеру важно знать, как они работают. Здесь наш джойстик имеет 5 выходных контактов, два из которых предназначены для питания, а три - для данных. Модуль должен быть запитан от + 5В. Контакты данных обозначены как VRX, VRY и SW.
Термин «VRX» означает переменное напряжение по оси X, термин «VRY» означает переменное напряжение по оси Y, а «SW» означает переключатель.
Поэтому, когда мы перемещаем джойстик влево или вправо, значение напряжения на VRX будет изменяться, а когда мы его увеличиваем или уменьшаем, VRY будет меняться. Точно так же, когда мы перемещаем его по диагонали, мы изменяем и VRX, и VRY. Когда мы нажимаем переключатель, вывод SW будет подключен к земле. Рисунок ниже поможет вам лучше понять выходные значения.
Принципиальная электрическая схема:
Теперь, когда мы знаем, как работает джойстик, мы можем прийти к выводу, что нам понадобятся два вывода АЦП и один вывод цифрового входа для чтения всех трех выводов данных модуля джойстика. Полная принципиальная схема представлена на картинке ниже.
Как вы можете видеть на принципиальной схеме, вместо джойстика мы использовали два потенциометра RV1 и RV3 в качестве аналоговых входов напряжения и логический вход для переключателя. Вы можете следовать этикеткам, написанным фиолетовым цветом, чтобы соответствовать названиям контактов и соответствующим образом выполнять соединения.
Обратите внимание, что аналоговые контакты подключены к каналам A0 и A1, а цифровой переключатель подключен к RB0. У нас также будет 5 светодиодных индикаторов, подключенных в качестве выходных, так что мы можем светить один в зависимости от направления движения джойстика. Таким образом, эти выходные контакты подключены к ПОРТУ C от RC0 до RC4. После панорамирования нашей принципиальной схемы мы можем приступить к программированию, затем смоделировать программу на этой схеме, затем построить схему на макете и затем загрузить программу на оборудование. Чтобы дать вам представление о моем оборудовании после выполнения вышеуказанных подключений, показано ниже.
Программирование для взаимодействия с джойстиком:
Программа для взаимодействия джойстика с PIC является простым и прямым. Мы уже знаем, к каким контактам подключен джойстик и каковы их функции, поэтому нам просто нужно считывать аналоговое напряжение с контактов и соответственно управлять выходными светодиодами.
Полная программа для этого дана в конце этого документа, но для пояснения я разбил код на небольшие значимые фрагменты ниже.
Как всегда, программа запускается с установки битов конфигурации, мы не собираемся много обсуждать установку битов конфигурации, потому что мы уже узнали об этом в проекте LED Blinking, и это то же самое для этого проекта. После того, как биты конфигурации установлены, мы должны определить функции АЦП для использования модуля АЦП в нашей PIC. Эти функции также были изучены в учебном пособии по использованию ADC с PIC. После этого мы должны объявить, какие контакты являются входами, а какие - выходными. Здесь светодиод подключен к PORTC, поэтому они являются выходными контактами, а контакт переключателя джойстика является контактом цифрового входа. Итак, мы используем следующие строки, чтобы объявить то же самое:
// ***** Конфигурация ввода / вывода **** // TRISC = 0X00; // ПОРТ C используется как выходные порты PORTC = 0X00; // Делаем все выводы низкими TRISB0 = 1; // RB0 используется как вход // *** Конец конфигурации ввода / вывода ** ///
В АЦП выводы не должны быть определены в качестве входных штырьков, так как они при использовании функции АЦП он будет назначен в качестве входного контакта. Как только контакты определены, мы можем вызвать функцию ADC_initialize, которую мы определили ранее. Эта функция установит необходимые регистры АЦП и подготовит модуль АЦП.
ADC_Initialize (); // Настраиваем модуль АЦП
Теперь мы делаем шаг в нашу бесконечность в то время как цикл. Внутри этого цикла мы должны отслеживать значения VRX, VRY и SW и на основе этих значений контролировать выход светодиода. Мы можем начать процесс мониторинга со считывания аналогового напряжения VRX и VRY, используя следующие строки
int joy_X = (ADC_Read (0)); // Считываем ось X джойстика int joy_Y = (ADC_Read (1)); // Считываем ось Y джойстика
Эта строка сохранит значение VRX и VRY в переменной joy_X и joy_Y соответственно. Функция ADC_Read (0) означает, что мы читаем значение АЦП из канала 0, который является выводом A0. Мы подключили VRX и VRY к контактам A0 и A1, поэтому мы читаем с 0 и 1.
Если вы можете вспомнить из нашего руководства по АЦП, мы знаем, что мы читаем аналоговое напряжение, PIC, будучи цифровым устройством, будет читать его от 0 до 1023. Это значение зависит от положения модуля джойстика. Вы можете использовать приведенную выше схему меток, чтобы узнать, какое значение вы можете ожидать для каждого положения джойстика.
Здесь я использовал предельное значение 200 как нижний предел и значение 800 как верхний предел. Вы можете использовать все, что захотите. Итак, давайте воспользуемся этими значениями и начнем соответственно светить светодиодами. Для этого мы должны сравнить значение joy_X с предопределенными значениями, используя цикл IF, и сделать выводы светодиода высокими или низкими, как показано ниже. Строки комментариев помогут вам лучше понять
if (joy_X <200) // Радость поднялась {RC0 = 0; RC1 = 1;} // Загорается верхний светодиод else if (joy_X> 800) // Радость спустилась вниз {RC0 = 1; RC1 = 0;} // Загорается нижний светодиод else // Если не перемещался {RC0 = 0; RC1 = 0;} // Выключаем оба светодиода
Аналогичным образом мы можем сделать то же самое для значения оси Y. Нам просто нужно заменить переменную joy_X на joy_Y, а также управлять следующими двумя выводами светодиода, как показано ниже. Обратите внимание, что когда джойстик не перемещается, мы выключаем оба светодиода.
if (joy_Y <200) // Радость переместилась влево {RC2 = 0; RC3 = 1;} // Светится левый светодиод else if (joy_Y> 800) // Радость перемещается вправо {RC2 = 1; RC3 = 0;} // Светится правый светодиод else // Если не перемещен {RC2 = 0; RC3 = 0;} // Выключаем оба светодиода
Теперь у нас есть еще одна последняя вещь, которую нужно сделать, мы должны проверить, нажата ли кнопка. Вывод переключателя подключен к RB0, поэтому мы можем снова использовать цикл if и проверить, включен ли он. Если он будет нажат, мы выключим светодиод, чтобы указать, что переключатель был нажат.
if (RB0 == 1) // Если нажата Joy RC4 = 1; // Свечение среднего светодиода else RC4 = 0; // ВЫКЛ средний светодиод
Просмотр моделирования:
Полный проект можно смоделировать с помощью программного обеспечения Proteus. После того, как вы написали программу, скомпилируйте код и свяжите шестнадцатеричный код моделирования со схемой. Затем вы должны заметить, что светодиоды светятся в соответствии с положением потенциометров. Моделирование показано ниже:
Оборудование и работа:
После проверки кода с помощью моделирования мы можем построить схему на макетной плате. Если вы следовали инструкциям по PIC, вы бы заметили, что мы используем ту же перфокарту, к которой припаяны PIC и схема 7805. Если вы также заинтересованы в создании одного из них, чтобы использовать его во всех ваших проектах PIC, припаяйте схему на перфорированной плате. Или вы также можете построить полную схему на макете. Как только оборудование будет готово, это будет примерно так, как показано ниже.
Теперь загрузите код в микроконтроллер PIC, используя PICkit3. Вы можете обратиться к проекту LED Blink за руководством. Вы должны заметить, что желтый свет загорится, как только программа будет загружена. Теперь используйте джойстик и вращайте ручку, для каждого направления джойстика вы заметите, что соответствующий светодиод загорается. Когда переключатель посередине нажат, он выключает светодиод посередине.
Эта работа - всего лишь пример, на ней можно построить много интересных проектов. Полную работу проекта также можно найти в видео, приведенном в конце этой страницы.
Надеюсь, вы поняли проект и получили удовольствие от его создания. Если у вас возникнут какие-либо проблемы, не стесняйтесь размещать их в разделе комментариев ниже или писать на форумах для получения помощи.