Подключение тачпада к ардуино

Обновлено: 03.07.2024

Ознакомиться с процессом получения координат касания через контроллеры функций TouchScreen можно в разделе Wiki - работа с TouchScreen по последовательной шине данных .

Некоторые дисплеи оснащены сенсорным экраном (TouchScreen - дословно переводится как трогать экран), который позволяет получать координаты точки прикосновения. Используя эти координаты, можно рисовать кривые или использовать их для имитации клавиатуры.

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

Общие сведения:

Резистивный TouchScreen состоит из двух прозрачных панелей. Одна панель - стеклянная (находится со стороны дисплея), вторая панель - из эластичного пластика (находится с внешней стороны, именно на неё мы и нажимаем), она выполняет роль мембраны. На внутренние поверхности обеих панелей (которые «смотрят» друг на друга) нанесён тонкий токопроводящий слой, имеющий однородное сопротивление. С противоположных сторон панелей присутствуют выводы, по два на каждую панель (см. рисунок ниже). Между панелями существует небольшой зазор заполненный микро-изоляторами (диэлектрическими микро-шариками), гарантирующими, что панели электрически не соединены. При касании мембраны, токопроводящие слои на мембране и на стекле соприкасаются друг с другом, электрически соединяясь. Сопротивление между выводами обеих панелей зависит от координат точки их соприкосновения.



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

Получение координат касания:

Для получения координат, нужно сконфигурировать два вывода Arduino подключённые к одной панели в режим входа, а два вывода Arduino подключённые к другой панели, в режим выхода. На выходы, подать разные логические уровни (на один LOW на другой HIGH), а с одного из входов, считать уровень напряжения.

Получение координаты по оси X:

  • Выводы Arduino к которым подключены выводы X+ и X- (с напыления на стекле) переводятся в режим выхода.
  • На вывод X+ (XP) подаётся уровень HIGH, а на вывод X- (XM) подаётся уровень LOW.
  • Выводы Arduino к которым подключены выводы Y+ и Y- (с напыления на мембране) переводятся в режим входа.
  • Данные полученные функцией analogRead, со входа Y+ (YP) будут обратно пропорциональны координате касания по оси X.
  • Вывод Y- (YM) находится в состоянии высокого импеданса, так как мы перевели его в режим входа, но данные с него читать не будем.

Получение координаты по оси Y:

  • Выводы Arduino к которым подключены выводы Y+ и Y- (с напыления на мембране) переводятся в режим выхода.
  • На вывод Y+ (YP) подаётся уровень HIGH, а на вывод Y- (YM) подаётся уровень LOW.
  • Выводы Arduino к которым подключены выводы X+ и X- (с напыления на стекле) переводятся в режим входа.
  • Данные полученные функцией analogRead, со входа X- (XM) будут обратно пропорциональны координате касания по оси Y.
  • Вывод X+ (XP) находится в состоянии высокого импеданса, так как мы перевели его в режим входа, но данные с него читать не будем.

Если на выводы пластины, к которой подаётся напряжение, вместо LOW подать HIGH, а вместо HIGH подать LOW (поменять местами уровни выводов), то считанное значение будет не обратно, а прямо пропорционально координате касания.

Читать данные можно с любого вывода той пластины, на которую не подавалось напряжение (уровни LOW и HIGH), но так как обычно один из выводов соединён с аналоговым выводом Arduino, а другой с цифровым, то и читать данные приходится только с того вывода, который подключён к аналоговому выводу Arduino.

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

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

Пример:

Калибровка:

Для калибровки в скетче предусмотрены 4 константы: tsMinX, tsMinY, tsMaxX и tsMaxY, хранящие экстремумы (крайние значения) читаемых уровней с аналоговых входов для осей X и Y.

Дело в том, что библиотека TouchScreen возвращает прочитанные уровни, а не значения координат. Для того чтоб они стали координатами, их нужно преобразовать от диапазона уровней к диапазону координат, что и происходит в скетче в разделе «Преобразуем значения полученные с TouchScreen в координаты дисплея». Диапазон координат нам известен: для оси X от 0 до ширины дисплея, для оси Y от 0 до высоты дисплея, в пикселях. А диапазон читаемых уровней зависит от типа TouchScreen . Для того чтоб узнать этот диапазон, нужно разкомментировать строку в разделе « Выводим «сырые» показания TouchScreen», загрузить скетч и открыть монитор последовательного порта.

Грубая калибровка:

При каждом нажатии на экран, в мониторе будут отображаться координаты нажатия X и Y. Понажимайте возле каждого края экрана, при этом запомните или запишите как самое максимальное, так и самое минимальное значение для каждой оси. После чего присвойте эти значения, в разделе «Определяем экстремумы» (в начале скетча), для каждой константы: tsMinX, tsMinY, tsMaxX и tsMaxY. И загрузите скетч заново.

Точная калибровка:

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

Расположите экран так, как это показано на самом первом рисунке данной статьи (начало координат обеих осей слева сверху).

  • Плавно проведите линию по экрану от центра влево.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMinX нужно уменьшить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMinX нужно увеличить.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMaxX нужно увеличить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMaxX нужно уменьшить.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMinY нужно уменьшить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMinY нужно увеличить.
    • Если выводимая на дисплее линия опережает точку нажатия, то значение tsMaxY нужно увеличить.
    • Если Выводимая на дисплее линия отстаёт от точки нажатия, то значение tsMaxY нужно уменьшить.

    Описание функций библиотеки:

    Подключение библиотеки:

    Функция getPoint();

    • Назначение: получение «сырых» данных о точке нажатия
    • Синтаксис: getPoint();
    • Параметры: Нет
    • Возвращаемые значения: Структура из трёх переменных типа int16_t
      • x - значение с аналогового входа, прямопропорциональное координате нажатия по оси X
      • y - значение с аналогового входа, прямопропорциональное координате нажатия по оси X
      • z - значение соответствующее степени нажатия на TouchScreen

      Функция readTouchX();

      • Назначение: получение «сырого» значения соответствующего точке нажатия по оси X
      • Синтаксис: readTouchX();
      • Параметры: Нет
      • Возвращаемые значения: число типа int
      • Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону ширины экрана
      • Пример:

      Функция readTouchY();

      • Назначение: получение «сырого» значения соответствующего точке нажатия по оси Y
      • Синтаксис: readTouchY();
      • Параметры: Нет
      • Возвращаемые значения: число типа int
      • Примечание: Полученное значение требуется преобразовать от диапазона «сырых» значений к диапазону высоты экрана
      • Пример:

      Функция pressure();

      • Назначение: получение значения соответствующего степени нажатия на TouchScreen
      • Синтаксис: pressure();
      • Параметры: Нет
      • Возвращаемые значения: число типа int
      • Пример:

      Примечание:

      Координаты сенсора должны совпадать с координатами дисплея. Если Вы будете выводить данные на дисплей библиотекой не UTFT, то возможно Вам придется изменить название осей, поменяв местами номера выводов X и Y при создании объекта библиотеки.

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

      Совсем недавно у нас был урок про то как сделать собственный ноутбук на Raspberry и Arduino. Одна из главных сложностей при создании ноутбука - найти хороший трекпад, который будет им управлять. Можно, в целом, купить готовый, но мы сегодня попробуем создать свой трекпад управляемый Arduino Micro. На самом деле даже готовый работающий трекпад найти очень сложно, так что мы будем спасать трекпад от старого сломанного ноутбука и преобразовывать его в USB-устройство, используя нашу Ардуину.


      Шаг 1: Комплектующие

      Комплектующий, необходимые для этого проекта, очень просты, нам понадобится трекпад от старого ноутбука, Arduino Micro и провода.



      К сожалению, есть только несколько типов Ардуино, которые мы можем использовать, это Arduino micro, pro micro и Leonardo, поскольку они могут быть запрограммированы на отображение HID (устройств интерфейса пользователя). Это означает, что они могут отображаться на компьютере как мыши или клавиатуры. Собственно, это то, что Arduino Uno сделать не может.

      Шаг 2: Почему это работает?

      Причина, по которой мы можем связать трекпад с Arduino, состоит в том, что большинство старых трекпадов от ноутбуков, связаны с компьютером через интерфейс PS/2. Т.е. трекпады имеют выходы PS/2, которые передают данные. Эти данные затем считываются Arduino и преобразуются в другие данные, которые могут быть отправлены на компьютер через интерфейс USB.


      Теперь я должен отметить, что не все портативные трекпады одинаковы, почти все старые ноутбуки используют интерфейс PS / 2, но некоторые более новые используют интерфейс USB вместо интерфейса PS / 2.

      Если вам удастся найти один из этих трекпадов USB вместо PS / 2, вы можете просто указать название трекпада и найти USB-пин-код и подключить его к USB-компьютеру, и он будет работать. Однако для этого проекта мы будем использовать более распространенный трекпад PS / 2 и использовать Arduino, чтобы превратить его в USB-мышь.

      Шаг 3: Подключение

      Соединения для этого проекта довольно просты. Все, что нам нужно сделать, это найти 4 вывода (припои) на нашем трекпаде. Их довольно легко найти, поскольку они обозначены как T10 (данные), T11 (часы) и T20, а заземление - просто большая открытая металлическая плоскость. Нам нужно тщательно припаять провода к каждому из этих выводов, а затем подключить их к соответствующим цифровым выводам Arduino.

      • T10 соединяем с выводом 10 Arduino micro
      • T11 соединяем с выводом 9 Arduino micro
      • T20 соединяем с питанием 5В Arduino micro
      • Земля соединяется с землей (GND) Arduino micro

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

      Шаг 4: Установка некоторых библиотек

      Нам понадобится установить две библиотеки в среду разработки Arduino:

      • библиотека "Мышка" - скачать здесь
      • библиотека PS/2 - скачать здесь

      Скачайте их, откройте Arduino IDE и загрузите файлы библиотек в неё. Библиотека PS/2 используется для получения данных с трекпада, а библиотека "Мышка" позволяет нам принимать эти данные и превращать их в команды для мыши, которые компьютер может читать через порт USB.

      Шаг 5: Код

      Теперь, когда у нас есть установленные библиотеки, мы можем загрузить наш код в Arduino. Код можно найти ниже, но нужно отметить, что код не будет загружаться или компилироваться, пока не будет выбрана плата Arduino micro или Leonardo. Вспомните об этом если вы получите ошибку при компиляции кода. После загрузки кода Arduino должен перезагрузиться как HID-устройство и на компьютере отобразиться как мышь.

      Шаг 6: Завершение и устранение неисправностей

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

      Если вы не хотите проходить весь процесс программирования и подключения Arduino, вы можете просто купить переходник PS/2 в USB. Но мы бы не рекомендовали это, поскольку это создает беспорядок с данными, поступающими с трекпада и может сделать его непригодным. Плюс, используя Arduino, мы можем полностью настроить все, что касается мыши и так как нам хочется - скорость мыши и всякие действия, такие как двойное нажатие и прокрутка. Это всё можно настроить под себя. Больше информации можно найти на сайте Arduino.

      Напоминаем, что данный трекпад отлично дополнит наш проект по созданию ноутбука на базе Raspberry и Arduino.


      Плата Arduino Rich Uno проявляет свои сильные стороны том, что содержит на борту различные датчики и модули. Это позволяет опционально подключать/отключать их по мере необходимости. В этот раз, наш тест будет задействовать тач панель из 4-х сенсорных контактных площадок(далее падов). Эти четыре пада, в дальнейшем можно использовать в качестве элементов управления, которыми можно настраивать, вводить, корректировать различные уставки и параметры в выполняемой контроллером программе.

      Итак, чтобы освоить и понять как работает тач панель нужно провести два теста. В первом тесте, события нажатий(касаний) падов будут выводиться в монитор порта, это будет стандартный базовый тест, так сказать основа для построения будущих алгоритмов, использующих данные элементы управления. Второй тест, это усложненная версия первого теста, в нём события нажатий(касаний) падов будут уже выводиться на дисплей TM1637, входящий в состав оборудования, установленного на плате Arduino Rich Uno. Ну и конечно же, задействуя нужные модули, нужно не забывать про установку DIP переключателей. Это позволит избежать лишней траты времени на поиски возможных ошибок при тестировании. Что же, можно начинать, для начала установим DIP переключатели подключения всех 4-х контактных площадок тач панели в положение ON, вот так это выглядит:


      В первом тестовом скетче, как уже было сказано выводим касания падов в монитор порта. Этот тест удобен тем, что, вся его работа проходит как бы в отладочном режиме. Скетч можно просто скопировать из окна браузера, в окно среды разработки Arduino IDE.

      /*Создаем объект Pad класса TouchSensor, указываем пины*/

      /*к которым привязаны контактные площадки тач модуля*/

      TouchSensor Pad(TOUCH_PAD1, TOUCH_PAD2, TOUCH_PAD3, TOUCH_PAD4);

      void setup ()
      <
      Serial . begin (9600);
      >

      void loop ()
      <
      /*Проверяем нажатие 1-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD1)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD1)
      Serial . println ( "Нажатие контактной площадки 1" );
      while (Pad. get () == TOUCH_PAD1);
      >
      /*Проверяем нажатие 2-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD2)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD2)
      Serial . println ( "Нажатие контактной площадки 2" );
      while (Pad. get () == TOUCH_PAD2);
      >
      /*Проверяем нажатие 3-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD3)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD3)
      Serial . println ( "Нажатие контактной площадки 3" );
      while (Pad. get () == TOUCH_PAD3);
      >
      /*Проверяем нажатие 4-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD4)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD4)
      Serial . println ( "Нажатие контактной площадки 4" );
      while (Pad. get () == TOUCH_PAD4);
      >
      >

      Перед тем как начинать второй тест, нужно подключить модуль дисплея TM1637 при помощи той же группы DIP переключателей, как это выглядит, смотрите фото ниже:


      Второй тестовый скетч выводит события касаний на дисплей TM1637, причем нумерация падов тач панели напрямую взаимосвязана с нумерацией знакомест дисплея. То есть нажав на первый пад, на дисплее можно увидеть отрисовку цифры 1 в первом знакоместе(если считать слева). Нажав на второй пад, соответственно видим отрисовку цифры 2 во втором знакоместе дисплея и так далее. В скетче активно задействуется библиотека TimerOne.h, и это не просто так. После касания, первый таймер контроллера Atmega328 отсчиывает две секунды, прежде чем очистить и погасить дисплей. Получается первый таймер тактирует событие гашения и очистки дисплея, так, чтобы при тестировании дисплей постоянно обновлялся, делая тест наглядным. Использованию первого таймера(TimerOne) контроллера Atmega328 посвящена отдельная статья на нашем сайте. Ну и в конце статьи есть обзорное видео, в нём показано как работают эти два тестовых скетча. Ну а пока, тестовый скетч №2:

      TM1637 Display(CLK, DIO);

      TouchSensor Pad(TOUCH_PAD1, TOUCH_PAD2, TOUCH_PAD3, TOUCH_PAD4);

      /*Массив для вывода на дисплей*/
      int8_t ListDisplay[4] = ;

      /*Переменные для работы первого таймера*/
      unsigned char halfsecond = 0;
      unsigned char ClockPoint = 1;
      unsigned char Update;

      void setup ()
      <
      /*Инициализация дисплея*/
      Display. init ();

      /*Запускаем тактирование первого таймера*/
      Timer1 . initialize (500000);
      Timer1 . attachInterrupt (TimingISR);
      >

      void loop ()
      <
      /*Каждые полсекунды обновляем дисплей*/
      if (Update == ON)
      DispUpdate();
      /*Проверяем нажатие 1-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD1)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD1)
      <
      ListDisplay[0] = 1;
      halfsecond = 0;
      >
      while (Pad. get () == TOUCH_PAD1);
      >
      /*Проверяем нажатие 2-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD2)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD2)
      <
      ListDisplay[1] = 2;
      halfsecond = 0;
      >
      while (Pad. get () == TOUCH_PAD2);
      >
      /*Проверяем нажатие 3-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD3)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD3)
      <
      ListDisplay[2] = 3;
      halfsecond = 0;
      >
      while (Pad. get () == TOUCH_PAD3);
      >
      /*Проверяем нажатие 4-й контактной площадки*/
      if (Pad. get () == TOUCH_PAD4)
      <
      delay (10);
      if (Pad. get () == TOUCH_PAD4)
      <
      ListDisplay[3] = 4;
      halfsecond = 0;
      >
      while (Pad. get () == TOUCH_PAD4);
      >
      >

      void DispUpdate()
      <
      Display. display (ListDisplay);
      Update = OFF;
      >

      void TimingISR()
      <
      halfsecond ++;
      Update = ON;
      if (halfsecond == 4)
      <
      halfsecond = 0;
      /*Если прошло две секунды - очищаем массив выводимый на дисплей*/
      for ( int j = 0; j < 4; j ++)
      ListDisplay[j] = 0x7E;
      >
      ClockPoint = !ClockPoint;
      >

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

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


      Измерения по оси Y
      Для простоты объяснения предположим, что нижний слой представляет собой ось Y, а выводы оси Y подключены к источнику постоянного тока 5 Вольт.
      Резистивная пленка действует как делитель напряжения.
      Напряжение внизу будет равно 0 вольт,
      напряжение в центре будет 2,5 вольта,
      а напряжение вверху будет 5 вольт
      Чтобы измерить это напряжение, мы подключаем провод от верхней пленки к аналоговому входу, например A0, затем нажимаем на верхний слой стилусом, чтобы выполнить соединение [1].
      Когда соединение установлено, аналого-цифровой (A / D) преобразователь Arduino выдаст число от 0 до 1023.
      0 вольт означает отключение 0
      5 вольт соответствует показанию 1023
      2,5 В соответствует показанию 2,5 / 5 * 1023 = 512 (округлено)
      Эти числа можно преобразовать в координаты Y, используя следующий код Arduino:
      Ypos = map (y, 61, 958, 0, 800); . . (1)
      Где
      61 = фактическое значение при касании нижней части экрана [2]
      958 = фактическое значение при касании верхней части экрана [2]
      0 = нижняя координата экрана.
      800 = координата верхнего экрана.

      Измерения по оси X
      Точно так же координаты X можно найти, приложив 5 вольт к проводам оси X (верхний слой) и измерив значения A / D с одним из проводов оси Y.
      В этом случае координаты X могут быть найдены с помощью следующего кода Arduino:

      Xpos = map(x, 95, 912, 0, 600); . . (2)
      Где
      95 = фактическое значение при касании левой стороны экрана [2]
      912 = фактическое значение при касании правой стороны экрана [2]
      0 = координата левого экрана.
      600 = координата правого экрана.
      Этот процесс повторяется много раз в секунду, и координаты отправляются на компьютер, где эскиз Processing 3 отображает их на экране и преобразует их в gcode.

      Режимы отображения
      Эскиз обработки измеряет временной интервал между координатами.
      Если временной интервал меньше 1500 мс, он присоединяется к координатам (т.е. точки соединяются).
      Если временной интервал больше 1500 мс, точки отображаются отдельно.
      Этот временной интервал можно настроить по своему усмотрению.

      Сохранение gcode
      Коснитесь правого верхнего угла сенсорной панели, чтобы выйти и сохранить gcode.
      gcode автоматически сохраняется в текстовый файл с именем drawing.gcode.
      Этот файл находится в той же папке, что и обрабатываемый эскиз.
      Переименуйте этот файл, чтобы избежать перезаписи работы в следующем проекте.

      Примечания:
      [1]
      Аналоговые входы Arduino имеют высокий импеданс, что означает отсутствие падения напряжения на верхней пленке.
      [2]
      Эти значения зависят от конкреной сенсорной панели и могут нуждаться в корректировке.


      Шаг второй: схема
      Схема проста. Нужно поместить тачпад лицевой стороной вверх и подключить контакты Arduino A0, A1, A2 и A3, как показано на схеме.



      Шаг третий: подготовка деталей
      Основание вырезается из материала для обрамления картин. Она должна быть толщиной примерно 1,5 мм. Основание карты используется для размещения сенсорной панели и защиты ее от давления вниз. Это достигается за счет вырезания отверстия (кармана) в материале.
      Делается это следующим образом.
      Расположите сенсорную панель на расстоянии 20 мм от нижнего правого угла.
      Теперь обведите контур экрана. Вырежьте отверстие для тачпада.
      Расположите Arduino на расстоянии 20 мм от сенсорной панели так, чтобы выводы сенсорной панели лежали под контактами Arduino A0, A1, A2 и A3 (фото 3).
      Обведите Arduino, включая отверстия
      Просверлите отверстия диаметром 3 мм для винтов Arduino.
      Обрежьте основание так, чтобы слева от Arduino оставался зазор 20 мм, а сверху, справа и снизу сенсорной панели - 20 мм .
      Вырежьте отверстие для кабеля сенсорной панели. Кабель на самом деле проходит через верхнюю карту, а прорезь в основании нужна, чтобы сделать трафарет для маркировки верхней карты.









      Верхняя карта идентична нижней за одним важным исключением, отверстие тачпада меньше, чтобы скрыть его края.
      Положите основание сверху. Обведите все края. Отметьте монтажные отверстия Arduino и прорезь для кабеля.
      Измерьте 9 мм вокруг сенсорной панели. Вырежьте смотровое отверстие тачпада.
      Просверлите монтажные отверстия для Arduino диаметром 3 мм.
      Вырежьте прямоугольное отверстие для кабеля.
      Обрежьте внешние края в соответствии с нижней частью.









      Шаг четвертый: сборка
      Увеличьте монтажные отверстия M3 Arduino в основании до 5 мм. Это необходимо для зазора головок болтов M3.
      Прикрепите тачпад к основанию малярным скотчем.
      Приклейте двусторонний скотч по каждому краю основания, включая сенсорную панель. Снимите защитную подложку.
      Прикрепите нейлоновые прокладки с резьбой M3 к верхней плате.
      Пропустите кабель тачпада через прорезь.
      Присоедините перемычки «папа-папа» к кабелю тачпада.
      Прикрутите Arduino к нейлоновым прокладкам с помощью болтов M3 x 5 мм. Отверстия можно закрыть тканевой лентой. Подключите перемычки к контактам A0, A1, A2 и A3 Arduino.
      Теперь графический планшет с ЧПУ готов к тестированию.














      Примечания:
      [1]
      Если интервал между касаниями превышает 1500 мс, программа обработки интерпретирует касание как точку (или новый объект), а не как непрерывную линию.
      [2]
      Файл «drawing.gcode» всегда перезаписывается, поэтому вам нужно переименовать его, если вы хотите сохранить его содержимое.
      Все готово, а на видео можно увидеть работу тачпада.

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

      Предположим у нас имеется: Arduino Leonardo – 1 штука, Bluetooth модуль – 1 штука, Android смартфон – 1 штука. Ключевое отличие Leonardo от остальных ардуин заключается в том, что она поддерживает протоколы HID, а по-простому может притворятся мышкой или клавиатурой. Выглядит это примерно следующим образом:


      Как видим все крайне просто. Метод Mouse.move(X, Y, WHEEL) принимает три относительных параметра:

      X – величина смещения в пикселях по оси X (отрицательные значения сдвигают влево)

      Y – величина смещения в пикселях по оси Y (отрицательные значения сдвигают вверх)

      WHEEL – величина смещения колеса прокрутки (отрицательные значения сдвигают в другую сторону)

      Но сама по себе идея двигать курсор ничего не стоит, если не мы его контролируем, а значит нам нужно непосредственно HID (Human Interface Device), или по-простому устройство ввода. В нашем случае мы его сделаем из смартфона, «написав программу» в среде AppInventor, но, предварительно, разберемся с железной частью и напишем скетч для Arduino. Данные в Leonardo со смартфона мы будем отсылать по bluetooth. Модуль bluetooth можно использовать любой подходящий, наиболее популярным решением является HC-05(06). Подключаем по следующей схеме:


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


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


      В настройках Setup мы указываем порт, к которому подключен модуль bluetooth. Здесь все несколько отличается от стандартных arduino-плат. Leonardo реализован на чипе Atmega32u4 и имеет встроенную поддержку USB-соединения. Соответственно нулевой Serial-порт реализован непосредственно внутри чипа, а стандартные цифровые выводы 0 и 1 реализуют Serial1. Это означает, что для инициализации UART соединения с модулем bluetooth, нам необходимо использовать следующую конструкцию в блоке Setup:


      Обратите внимание, что мы используем не Serial1, а Serial.

      В цикле Loop постоянно опрашиваем буфер Serial1 и в случае поступления данных, производим их обработку:


      Далее работаем с конструкцией if (Serial1.available()) < здесь будет наш основной код >. Принятый в буфер байт мы присваиваем переменной «mess» при помощи следующей конструкции:

      Парсинг всего этого дела выглядит следующим образом:


      После присвоения переменной «mess» пришедшего значения, мы определяем в условных операторах что это за число. Если это просто клик, то мы сразу реализуем клик мыши. Если это прокрутка или смещение, то мы присваиваем соответствующей булевской переменной значение true и следующее пришедшее число кладем в соответствующий параметр конструкции Mouse.move(смещение по X, смещение по Y, прокрутка колеса). Полный код выглядит так:


      Теперь займемся реализацией приложения для смартфона. Не забываем, что мы только-только закончили делать погодные информеры и котопоилки, а значит Andriod Studio пойло для лохов изучать пока рано, посему нальем себе кефирчика используем среду AppInventor. На базовых навыках по работе с этой средой я останавливаться не стану, можно почитать здесь, а еще лучше просто открыть и потыкаться самому, там все очень просто. Сразу перейду к блокам. Полный ээээ…. ну пусть будет код программы выглядит так:

      Совсем просто, правда? А так выглядит интерфейс:

      Вверху, там, где надпись: «ПОДКЛЮЧЕНО», это кнопка (список) для выбора и подключения bluetooth устройства (BTN_connect). Ползунок чуть ниже (Multipiller), регулирует скорость перемещения указателя, число справа указывает во сколько раз(TXT_mult). Серая область ниже, это непосредственно зона тачпада (Touch). Под ней три области слева-направо: левая кнопка мыши (L_click), ползунок колесика (Scroll), правая кнопка мыши (R_click).

      Инициализация экрана и переменных:

      Переменная «mult» (по умолчанию 2) – множитель смещения указателя. X_shift и Y_shift переменные смещения указателя. При открытии приложения, цвет панели «Touch» устанавливаем в черный.

      Далее нам необходимо подключиться к bluetooth устройству (предполагается, что смартфон уже с ним спарен):

      При инициализации (Перед Выбором) кнопки подключения (BTN_connect) в ее список добавятся все спаренные со смартфоном устройства и при клике по ней, откроется окно этого списка. По клику по соответствующему устройству (После Выбора), смартфон пытается подключится к выбранному устройству и в случае успеха, изменяет цвет фона «Touch» на серый, и надпись на кнопке выбора на «ПОДКЛЮЧЕНО».

      Реализация смещения указателя:

      Этот метод срабатывает при движении пальца по панели типа Canvas (Холст). Глобальным переменным X_shift и Y_shift присваиваются округленные (без точки) значения смещения по обоим осям. Затем, в случае если у нас установлено bluetooth соединение, программа отсылает четыре восьмибитных числа где первое число – префикс оси X (120), второе – смещение по Х, третье – префикс оси Y (121), четвертое – смещение по Y. Число смещения по обоим осям умножается на глобальную переменную «mult».
      Реализация колесика схожа:

      Здесь мы объявляем локальную переменную W_shift, которой точно так же присваиваем смещение по оси Y и отправляем через bluetooth два восьмибитных числа, предваряя префиксом 122.

      Реализация кнопок совсем примитивна:

      При клике по соответствующей кнопке происходит отправка одного восьмибитного числа.

      При изменении значения, происходит перезапись соответствующей переменной «mult» и текстовому полю (TXT_mult) присваивается новое значение «Текст».

      Как видим, реализация крайне проста. На все про все потребуется один вечер времени одна Arduino Leonardo, один bluetooth модуль и смартфон, тоже одна штука. Зато теперь, можно управлять компьютером или телевизором не вставая с дивана.

      При желании можно добавить двойной клик и перетаскивание мышью.


      Аренда облачного сервера с быстрыми NVMе-дисками и посуточной оплатой у хостинга Маклауд.

      Читайте также: