Оглавление:

Переключатели Arduino и колесико: 9 шагов
Переключатели Arduino и колесико: 9 шагов

Видео: Переключатели Arduino и колесико: 9 шагов

Видео: Переключатели Arduino и колесико: 9 шагов
Видео: Учим Arduino за 1 час! #Профессионально 2024, Июль
Anonim
Arduino и переключатели с колесиком
Arduino и переключатели с колесиком

В этой статье мы исследуем использование переключателей с колесиком / диском в наших системах Arduino. Вот несколько примеров из PMD Way.

Шаг 1:

Изображение
Изображение

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

До появления модных пользовательских интерфейсов эти переключатели были довольно популярными методами для настройки ввода числовых данных. Однако они все еще доступны сегодня, поэтому давайте посмотрим, как они работают и как мы можем их использовать. Значение переключателя доступно через двоичное десятичное или прямое десятичное число. Рассмотрим заднюю часть переключателя в форме BCD.

Шаг 2:

Изображение
Изображение

У нас есть общий слева, затем контакты для 1, 2, 4 и 8. Если вы подаете небольшое напряжение (скажем, 5 В) на общий, значение переключателя можно измерить, сложив значения контактов, которые находятся в ВЫСОКОЕ состояние. Например, если вы выберете 3 - контакты 1 и 2 будут под общим напряжением. Значения от нуля до девяти могут быть представлены как таковые в таблице.

Шаг 3:

Изображение
Изображение

К настоящему времени вы должны понимать, что значение переключателя будет легко прочитать - и вы правы, это так. Мы можем подключить 5 В к общему, выходы к цифровым входным контактам наших плат Arduino, а затем использовать digitalRead () для определения значения каждого выхода. В скетче мы используем базовую математику для преобразования значения BCD в десятичное число. Итак, давайте сделаем это сейчас.

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

Шаг 4:

Теперь просто подключить выходы с маркировкой 1, 2, 4 и 8 к (например) цифровым контактам 8, 9, 10 и 11. Подключите 5 В к точке «C» переключателя, а GND к… GND. Затем нам нужен скетч, который может считывать входные данные и преобразовывать вывод BCD в десятичный формат. Рассмотрим следующий эскиз:

/ * Использует экран цифрового дисплея SAA1064 https://www.gravitech.us/7segmentshield.html Использует последовательный монитор, если у вас нет экрана SAA1064 * / #include "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // подключаемся к шине i2c (для ведущего адрес необязателен) delay (500); pinMode (q1, ВХОД); // колесико '1' pinMode (q2, INPUT); // колесико '2' pinMode (q4, INPUT); // колесико '4' pinMode (q8, INPUT); // колесико '8'} void dispSAA1064 (int Count) // отправляет целое число 'Count' в Gravitech SAA1064 shield {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Тысячи, Сотни, Десятки, База; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Тысячи = Счетчик / 1000; Сотни = (Счетчик- (Тысячи * 1000)) / 100; Десятки = (Счетчик - ((Тысячи * 1000) + (Сотни * 100))) / 10; База = Счетчик - ((Тысячи * 1000) + (Сотни * 100) + (Десятки * 10)); Wire.write (поиск [База]); Wire.write (поиск [Десятки]); Wire.write (поиск [Сотни]); Wire.write (поиск [Тысячи]); Wire.endTransmission (); задержка (10); } int readSwitch () {общее число = 0; if (digitalRead (q1) == HIGH) {всего + = 1; } if (digitalRead (q2) == HIGH) {total + = 2; } if (digitalRead (q4) == HIGH) {всего + = 4; } if (digitalRead (q8) == HIGH) {всего + = 8; } вернуть итог; } недействительный цикл () {dispSAA1064 (readSwitch ()); // отправляет значение переключателя на экран дисплея Serial.println (readSwitch ()); // отправляет значение переключателя в окно последовательного монитора}

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

Шаг 5:

Image
Image

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

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

Шаг 6:

Ладно, это не так уж и много, но если вам нужен числовой ввод, он экономит много физического места и предлагает точный метод ввода.

Вот и все. Вы бы действительно использовали их в проекте? По одной цифре - да. Для четырех? Наверное, нет - возможно, проще было бы использовать 12-значную клавиатуру. Есть идея…

Шаг 7: несколько переключателей

Изображение
Изображение

Теперь мы рассмотрим, как читать четыре цифры - и не тратить впустую все эти цифровые контакты в процессе. Вместо этого мы будем использовать микросхему 16-битного расширителя портов Microchip MCP23017, которая обменивается данными через шину I2C. Он имеет шестнадцать цифровых входов / выходов, которые мы можем использовать для чтения состояния каждого переключателя.

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

Когда переключатель был напрямую подключен к Arduino, мы считываем состояние каждого вывода, чтобы определить значение переключателя. Мы сделаем это снова, в большем масштабе, используя MCP23017. Рассмотрим распиновку:

Шаг 8:

У нас есть 16 контактов, что позволяет подключить четыре переключателя. Общие для каждого переключателя по-прежнему подключаются к 5 В, и каждый контакт переключателя по-прежнему имеет понижающий резистор 10 кОм на GND. Затем мы подключаем 1, 2, 4, 8 контактов цифры один к GPBA0 ~ 3; цифры два от 1, 2, 4, 8 до GPA4 ~ 7; цифры три - 1, 2, 4, 8 - для GPB0 ~ 3, а цифры четыре - 1, 2, 4, 8 - для GPB4 ~ 7.

Как мы читаем переключатели? Все эти провода могут заставить вас подумать, что это сложно, но набросок довольно прост. Когда мы читаем значение GPBA и B, для каждого банка возвращается один байт, причем первым идет самый старший бит. Каждые четыре бита будут соответствовать настройке переключателя, подключенного к соответствующим контактам ввода / вывода. Например, если мы запрашиваем данные для обоих банков ввода-вывода и переключатели установлены на 1 2 3 4 - банк A вернет 0010 0001, а банк B вернет 0100 0011.

Мы используем несколько операций битового сдвига, чтобы разделить каждые четыре бита в отдельную переменную, что оставляет нам значение каждой цифры. Например, чтобы разделить значение четвертого переключателя, мы сдвигаем биты из банка B >> 4. Это выталкивает значение третьего переключателя, и пустые биты слева становятся нулевыми.

Чтобы разделить значение третьего переключателя, мы используем составное побитовое & -, которое оставляет значение третьего переключателя. На изображении показана разбивка значений двоичного переключателя - на нем показаны необработанные значения байтов GPIOA и B, затем двоичное значение каждой цифры и десятичное значение.

Шаг 9:

Итак, давайте посмотрим на демонстрационный эскиз:

/ * Пример 40a - Чтение четырех кнопочных переключателей BCD через MCP23017, отображение на SAA1064 / 4-разрядный 7-сегментный светодиодный дисплей * / // Выводы MCP23017 с 15 по 17 на GND, адрес шины I2C - 0x20 // Адрес шины I2C SAA1064 0x38 # include "Wire.h" // для определения цифр светодиодов int digits [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; байт GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064 () {// настройка 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // Выход 12 мА, без гашения цифр Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // запускаем шину I2C initSAA1064 (); } void loop () {// считываем входные данные банка A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // этот байт содержит данные переключателя для цифр 1 и 2 // считываем входы банка B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // этот байт содержит данные переключателя для цифр 3 и 4 // извлекаем значение для каждого переключателя // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // отправляем все данные GPIO и отдельных переключателей на монитор последовательного порта // для отладки и интереса Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("цифра 1 ="); Serial.println (dig1, BIN); Serial.print ("цифра 2 ="); Serial.println (dig2, BIN); Serial.print ("цифра 3 ="); Serial.println (dig3, BIN); Serial.print ("цифра 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("цифра 1 ="); Serial.println (dig1, DEC); Serial.print ("цифра 2 ="); Serial.println (dig2, DEC); Serial.print ("цифра 3 ="); Serial.println (dig3, DEC); Serial.print ("цифра 4 ="); Serial.println (dig4, DEC); Serial.println (); // отправляем значение переключателя на светодиодный дисплей через SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (цифры [dig4]); Wire.write (цифры [dig3]); Wire.write (цифры [цифра2]); Wire.write (цифры [цифра1]); Wire.endTransmission (); задержка (10); задержка (1000); }

А для неверующих… демонстрация видео.

Вот и все. Четыре цифры вместо одной и по шине I2C с сохранением цифровых контактов ввода / вывода Arduino. Используя восемь MCP23017, вы можете прочитать сразу 32 цифры. Получайте удовольствие от этого!

Вы можете заказать в PMD Way как двоично-десятичные, так и десятичные переключатели различных размеров с бесплатной доставкой по всему миру.

Этот пост предоставлен pmdway.com - все для производителей и любителей электроники с бесплатной доставкой по всему миру.

Рекомендуемые: