Сегодня сделаем пульт для презентаций своими руками на базе Arduino (DigiSpark). Данный девайс отличная вещь и пригодиться может в самый неожиданней момент. Благо собрать недорогой вариант беспроводного управления презентацией достаточно просто. Подробно рассматривать техническую часть не будем. Разберём, какая электроника нужна и основные настройки скетча. Более подробнее о прошивке и электронике вы можете почитать в предыдущем проекте и уроке.
Пульт для презентаций своими руками на Arduino, что понадобится?
Для пульта управления презентацией понадобится следующая электроника:
Пульт ДУ (можно использовать старый пульт от бытовой техники).
Как видим, для проекта нужно минимум комплектующих и если их покупать в Китае, то можно уложиться в 2-5 $.
Схема подключения электроники пульт для проведения презентаций.
Рассмотрим два варианта схем пульта для проведения презентаций. Первая схема подключения состоит из 2 модулей, и собрать ее можно без пайки элементов. Но при этом будет не очень красивая реализация.
Второй вариант без пайки не собрать. Припаять нужно всего 3 ножки IR приемника. В данном варианте получим небольшое USB устройство, которое можно подключать к компьютеру.
Для более красивого и эстетичного вида можно напечатать на 3D принтере корпус для устройства. Также данный вариант выйдет немного дешевле.
Если возникли сложности и не понятно, что куда припаивать смотрите распиновку IR приемника тут и распиновкуDigiSpark тут.
Прошивка для пульта управления презентацией на Arduino.
Сперва, необходимо настроить среду Arduino IDE для работы с платой DigiSpark.
Добавляем DigiSpark в список отладочных плат Arduino IDE.
Устанавливаем драйвер для DigiSpark.
Все материалы, используемые в данном проекте, вы можете скачать внизу статьи в разделе «Файлы для скачивания».
Установка библиотеки Adafruit Trinket USB.
Библиотека Adafruit Trinket USB содержит различные функции позволяющие использовать микроконтроллер, такой какDigiSpark, Arduino Micro, Arduino Leonardo в качестве клавиатуры, мышки для ПК. В данном уроке будем использовать библиотеку TrinketHidCombo, которая идет в составе набора библиотек Adafruit Trinket USB. Давайте приступим к её установке.
Для того чтобы установить библиотеку Adafruit Trinket USB необходимо её скачать с сайта GitHub.
После чего с помощью инструмента «Скетч -> Подключить библиотеку -> Добавить 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_MOUSE_SWITCH - Mouse On/Off, данная команда переключает управление с клавиш стрелки перемещения влево, вправо, вверх, вниз. На перемещение курсора мыши. После чего, при нажатии на соответствующую клавишу у нас перемещается курсор мыши по экрану в нужном направлении. При частом нажатии скорость перемещения увеличивается, что позволяет достаточно быстро навести курсор на нужный элемент на экране.
После чего нам нужно получить код с пульта ДУ. Так как пульты у всех разные и коды у каждого уникальны.
//отладка. Установите значение 0 после поиска ваших кодов
#define DEBUG 1
Для получения кода кнопок в скетче есть переменная DEBUG, если установить значение данной переменой 1 и загрузить прошивку в DigiSpark то при нажатии на клавиши на пульте в текстовом документе увидим код данной кнопки. Можно установить курсов в скетче, где нужно задать код кнопки пульта, и нажать на кнопку и у вас автоматически заполнятся нужные поля.
После повторной прошивки платы с отключенным режимом DEBUG, можно приступить к управлению презентацией.
//отладка. Установите значение 0 после поиска ваших кодов
#define DEBUG 0
Проверка работоспособности самодельного пульта управления презентацией.
С помощью пульта можно перемещаться по элементам в папке и выбирать нужный файл.
Так как пульт нужен в первую очередь для управления презентацией. Давайте рассмотрим, как это происходит. По описанию клавиш понятно, что мы можем листать слайды. Разворачивать презентацию на весь экран. Также выходить из полноэкранного просмотра презентации. Но это еще не все, благодаря управлению курсором мыши можно закрыть презентацию и вернуться обратно в папку с материалами.
Второе, чем можно управлять это просмотр изображений. Открываем изображение и листаем. Также можно развернуть на весь экран и закрыть просмотр.
Третье, это воспроизведение мультимедийных файлов: видеоклипы или звуковые файлы. Одной приятной фишкой является фоновое управление медиафайлами благодаря горячим клавишам. Например, при просмотре презентации менять звуковое сопровождение и регулировать громкость.
Это набор функция которые, по моему мнению, пригодятся при показе презентаций. Возможно, что-то лишнее или чего-то не хватает. Свое мнение и предложения пишите в комментариях.
Планирую сделать еще пару интересных проектов управления ПК с помощью Arduino. Если данная тема вам интересна, пишите свои предложения и пожелания.
Понравился проект Пульт для презентаций своими руками на Arduino? Не забудь поделиться с друзьями в соц. сетях.
Комментарии