Пульт для презентаций своими руками на Arduino.

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

Пульт для презентаций своими руками на Arduino, что понадобится?

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

Что понадобится для управления компьютером через USBКак видим, для проекта нужно минимум комплектующих и если их покупать в Китае, то можно уложиться в 2-5 $.

Схема подключения электроники пульт для проведения презентаций.

Рассмотрим два варианта схем пульта для проведения презентаций. Первая схема подключения состоит из 2 модулей, и собрать ее можно без пайки элементов. Но при этом будет не очень красивая реализация.

Схема подключения устройства удаленного управления ПК.Второй вариант без пайки не собрать. Припаять нужно всего 3 ножки IR приемника. В данном варианте получим небольшое USB устройство, которое можно подключать к компьютеру.

Второй вариант схемы устройства удаленного управления ПК более компактный

Для более красивого и эстетичного вида можно напечатать на 3D принтере корпус для устройства. Также данный вариант выйдет немного дешевле.

Для более красивого и эстетичного вида можно напечатать на 3D принтере корпус

Если возникли сложности и не понятно, что куда припаивать смотрите распиновку IR приемника тут и распиновку DigiSpark тут.

Прошивка для пульта управления презентацией на Arduino.

Сперва, необходимо настроить среду Arduino IDE для работы с платой DigiSpark.

Пошаговую инструкцию вы можете посмотреть в статье DigiSpark ATtiny85 настройка Arduino IDE и установка драйвера. А в данном уроке вкратце расскажу про данные настройки.

  • Добавляем DigiSpark в список отладочных плат Arduino IDE.

В открывшемся окне настроек нам нужно добавить ссылку для менеджера плат.

  • Устанавливаем драйвер для DigiSpark.

Установка драйверов для DigiSpark.

Все материалы, используемые в данном проекте, вы можете скачать внизу статьи в разделе «Файлы для скачивания».

Установка библиотеки Adafruit Trinket USB.

Библиотека Adafruit Trinket USB содержит различные функции позволяющие использовать микроконтроллер, такой как DigiSpark, Arduino Micro, Arduino Leonardo в качестве клавиатуры, мышки для ПК. В данном уроке будем использовать библиотеку TrinketHidCombo, которая идет в составе набора библиотек Adafruit Trinket USB. Давайте приступим к её установке.

Для того чтобы установить библиотеку Adafruit Trinket USB необходимо её скачать с сайта GitHub.

 библиотеку Adafruit Trinket USB необходимо её скачать

После чего с помощью инструмента «Скетч -> Подключить библиотеку -> Добавить ZIP библиотеку..». Загружаем библиотеку в среду разработки.

Скетч Подключить библиотеку Добавить ZIP библиотеку..

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

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

А затем загрузить код в плату.

//отладка. Установите значение 0 после поиска ваших кодов
#define DEBUG 0
//Укажите свои коды здесь:
#define REMOTE_OK 0x61D66897  // Enter (подтвердить действие)
#define REMOTE_LEFT 0x61D618E7 // Left  (стрелка влево на клавиатуре)
#define REMOTE_RIGHT 0x61D630CF // Right (стрелка вправо на клавиатуре)
#define REMOTE_DOWN 0x61D6A857  // Down (стрелка вниз на клавиатуре)
#define REMOTE_UP 0x61D6D02F    // Up (стрелка вверх на клавиатуре)
#define REMOTE_MOUSE_SWITCH 0x61D68877 // Mouse On/Off (включить или выключить Мышь. Аналогов на клавиатуре нет)
#define REMOTE_ESC 0x61D638C7      // Esc (отмена)
#define REMOTE_VOL_UP 0x61D650AF   // увеличит звук 
#define REMOTE_VOL_DOWN 0x61D628D7 // уменьшить звук 
#define REMOTE_BACKSPACE 0x61D6B04F   // BACKSPACE (удалить)
#define REMOTE_PLAYPAUSE 0x61D6D827 // Play/Pause (пуск / пауза воспроизведения) 
#define REMOTE_NEXT 0x61D67887     // Next (след композиция)
#define REMOTE_PREV 0x61D6F807     // Prev (Предыдущая композиция)
#define REMOTE_F5 0x61D6F00F     // F5 (Развернуть презентацию)
#define MOUSE_SENSITIVITY 1
#define REPEAT_DELAY 220
volatile uint8_t m = 0, tcnt = 0, startflag = 0;
uint32_t irdata = 0, keydata = 0 ;
bool mouse = false;
bool pressed = false;
bool complete = false;
int lastMouseX = 0, lastMouseY = 0;
#include <avr/delay.h>
#include "TrinketHidCombo.h"
void setup() {
  DDRB |= (1 << DDB1);      //P1 (LED) OUT в скетче не использован
  PORTB |= 1 << PB2;        // подтяжка PB2 не помешает.
  GIMSK |= 1 << INT0;       //прерывание int0 включить
  MCUCR |= 1 << ISC00;      //Любое логическое изменение в INT0 генерирует запрос на прерывание
  GTCCR |= 1 << PSR0; TCCR0A = 0;
  TCCR0B = (1 << CS02) | (1 << CS00);
  TIMSK = 1 << TOIE0;       //таймер прерывания
  TrinketHidCombo.begin(); // запустите механизм USB-устройства
}
void loop() {
  if (complete) { // если код был получен
    if (keydata != 0) //если код новый
    {
      Action(keydata);
      pressed = true;
    }
    else if (mouse) //Ускоряем движения мыши
    {
      lastMouseX *= 2;
      if (lastMouseX > 64)
        lastMouseX = 64;
      else if (lastMouseX < -64)
        lastMouseX = -64;
      lastMouseY *= 2;
      if (lastMouseY > 64)
        lastMouseY = 64;
      else if (lastMouseY < -64)
        lastMouseY = -64;
    }
    TrinketHidCombo.mouseMove(lastMouseX, lastMouseY, 0);
    complete = false;
    ms_delay(REPEAT_DELAY); // для балансировки задержки повторения/ввода пульта дистанционного управления
  }
  else if (pressed)
  {
    digitalWrite(1, LOW);
    if (mouse)
      TrinketHidCombo.mouseMove(0, 0, 0);
    else
      TrinketHidCombo.pressKey(0, 0);
    pressed = false;
  }
  else
  {
    _delay_ms(1);//ограничьте опрос USB на пустых циклах
    TrinketHidCombo.poll(); // проверьте, не нужно ли что-нибудь сделать с USB
  }
}
ISR (INT0_vect) {
  if (PINB & 1 << 2) {
    TCNT0 = 0;
  }
  else {
    tcnt = TCNT0;
    if (startflag) {
      if (30 > tcnt  && tcnt > 2) {
        if (tcnt > 15 && m < 32) {
          irdata |= (2147483648 >> m);
        }
        m++;
      }
    }
    else  startflag = 1;
  }
}
ISR (TIMER0_OVF_vect) {
  if (m)
    complete = true; m = 0; startflag = 0; keydata = irdata; irdata = 0; // if the index is not 0, then create an end flag
}
void ms_delay(uint16_t x)
{
  for (uint16_t m = 0; m < (x / 10); m++) {
    _delay_ms(10);
    TrinketHidCombo.poll();
  }
}
void Action(uint32_t keycode)
{
  switch (keycode)
  {
    case REMOTE_OK:
      if (mouse)
      {
        lastMouseX = 0;
        lastMouseY = 0;
        TrinketHidCombo.mouseMove(lastMouseX, lastMouseY, MOUSEBTN_LEFT_MASK);
      }
      else
        TrinketHidCombo.pressKey(0, KEYCODE_ENTER);
      break;
    case REMOTE_LEFT:
      if (mouse)
      {
        lastMouseX = -MOUSE_SENSITIVITY;
        lastMouseY = 0;
        TrinketHidCombo.mouseMove(lastMouseX, lastMouseY, 0);
      }
      else
        TrinketHidCombo.pressKey(0, KEYCODE_ARROW_LEFT);
      break;
    case REMOTE_RIGHT:
      if (mouse)
      {
        lastMouseX = MOUSE_SENSITIVITY;
        lastMouseY = 0;
        TrinketHidCombo.mouseMove(lastMouseX, lastMouseY, 0);
      }
      else
        TrinketHidCombo.pressKey(0, KEYCODE_ARROW_RIGHT);
      break;
    case REMOTE_DOWN:
      if (mouse)
      {
        lastMouseX = 0;
        lastMouseY = MOUSE_SENSITIVITY;
        TrinketHidCombo.mouseMove(lastMouseX, lastMouseY, 0);
      }
      else
        TrinketHidCombo.pressKey(0, KEYCODE_ARROW_DOWN);
      break;
    case REMOTE_UP:
      if (mouse)
      {
        lastMouseX = 0;
        lastMouseY = -MOUSE_SENSITIVITY;
        TrinketHidCombo.mouseMove(lastMouseX, lastMouseY, 0);
      }
      else
        TrinketHidCombo.pressKey(0, KEYCODE_ARROW_UP);
      break;
    case REMOTE_ESC:
      TrinketHidCombo.pressKey(0, KEYCODE_ESC);
      break;
    case REMOTE_F5:
      TrinketHidCombo.pressKey(0, KEYCODE_F5);
      break;
    case REMOTE_BACKSPACE:
      TrinketHidCombo.pressKey(0, KEYCODE_BACKSPACE);
      break;
    case REMOTE_MOUSE_SWITCH:
      mouse = !mouse;
      lastMouseX = 0;
      lastMouseY = 0;
      break;
    case REMOTE_VOL_UP:
      TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
      break;
    case REMOTE_VOL_DOWN:
      TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
      break;
    case REMOTE_PREV:
      TrinketHidCombo.pressMultimediaKey(MMKEY_SCAN_PREV_TRACK);
      break;
    case REMOTE_NEXT:
      TrinketHidCombo.pressMultimediaKey(MMKEY_SCAN_NEXT_TRACK);
      break;
    case REMOTE_PLAYPAUSE:
      TrinketHidCombo.pressMultimediaKey(MMKEY_PLAYPAUSE);
      break;
    /*   case REMOTE_F5:
         TrinketHidCombo.pressKey(0, KEYCODE_F5);
         break;*/
    default:
      if (DEBUG)
        TrinketHidCombo.println(keydata, HEX);
      else
        return;
  }
  digitalWrite(1, HIGH);
}

Как получить код с пульта дистанционного управления?

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

  • REMOTE_OK - Enter (подтвердить действие)
  • REMOTE_LEFT - Left (стрелка влево на клавиатуре)
  • REMOTE_RIGHT - Right (стрелка вправо на клавиатуре)
  • REMOTE_DOWN - Down (стрелка вниз на клавиатуре)
  • REMOTE_UP - Up (стрелка вверх на клавиатуре)
  • REMOTE_MOUSE_SWITCH - Mouse On/Off (включить или выключить Мышь. Аналогов на клавиатуре нет)
  • REMOTE_ESC - Esc (отмена)
  • REMOTE_VOL_UP - увеличит звук
  • REMOTE_VOL_DOWN - уменьшить звук
  • REMOTE_BACKSPACE - BACKSPACE (удалить)
  • REMOTE_PLAYPAUSE - Play/Pause (пуск / пауза воспроизведения)
  • REMOTE_NEXT - Next (след композиция)
  • REMOTE_PREV - Prev (Предыдущая композиция)
  • REMOTE_F5 - F5 (Развернуть презентацию)

Добавил основные клавиши, которые понадобятся при управлении презентацией, а также добавил кнопки управления медиа файлами. При показе презентации часто требуется включать ролики и/или звуковое сопровождение. Также стоит выделить команду REMOTE_MOUSE_SWITCH - Mouse On/Off, данная команда переключает управление с клавиш стрелки перемещения влево, вправо, вверх, вниз. На перемещение курсора мыши. После чего, при нажатии на соответствующую клавишу у нас перемещается курсор мыши по экрану в нужном направлении. При частом нажатии скорость перемещения увеличивается, что позволяет достаточно быстро навести курсор на нужный элемент на экране.

После чего нам нужно получить код с пульта ДУ. Так как пульты у всех разные и коды у каждого уникальны.

//отладка. Установите значение 0 после поиска ваших кодов 
#define DEBUG 1

Для получения кода кнопок в скетче есть переменная DEBUG, если установить значение данной переменой 1 и загрузить прошивку в DigiSpark то при нажатии на клавиши на пульте в текстовом документе увидим код данной кнопки. Можно установить курсов в скетче, где нужно задать код кнопки пульта, и нажать на кнопку и у вас автоматически заполнятся нужные поля.

Как получить код с пульта дистанционного управления?

После повторной прошивки платы с отключенным режимом DEBUG, можно приступить к управлению презентацией.

//отладка. Установите значение 0 после поиска ваших кодов 
#define DEBUG 0

Проверка работоспособности самодельного пульта управления презентацией.

С помощью пульта можно перемещаться по элементам в папке и выбирать нужный файл.

С помощью пульта можно перемещаться по элементам в папке и выбирать нужный файл.

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

Проверка работоспособности самодельного пульта управления презентацией.

Второе, чем можно управлять это просмотр изображений. Открываем изображение и листаем. Также можно развернуть на весь экран и закрыть просмотр.

Второе, чем можно управлять это просмотр изображений. Открываем изображение и листаем.

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

Так и управление музыкой, которую включили в браузере. Например, на сайте Вконтакте.

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

Планирую сделать еще пару интересных проектов управления ПК с помощью Arduino. Если данная тема вам интересна, пишите свои предложения и пожелания.

Понравился проект Пульт для презентаций своими руками на Arduino? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

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

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

Прошивка для пульта управления презентацией на Arduino Прошивка для пульта управления презентацией на Arduino.ino7 Kb 615 Скачать
Библиотека Adafruit Trinket USB Библиотека Adafruit Trinket USB.zip3457 Kb 650 Скачать
DigiSpark Drivers DigiSpark Drivers.zip2861 Kb 567 Скачать

Комментарии

Ваше Имя*

Саша

Гость: Саша (24 сентября, 2021 в 03:30)

Наверное лучше сделать на версии Леонардо.


Разработка проектов