Педаль в пол: создаём очередной ножной манипулятор для ПК

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

А зачем оно мне?

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

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

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

мастер класс с фото и видео уроки

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

Мастер-класс: руль из конфет своими руками

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

Материалы и инструменты

  • Пеноплекс шириной 2 см и размером 35 см;
  • Бумага черного цвета;
  • Шоколадные конфеты 500 гр;
  • Красивая тесьма шириной 2 см и длиной 2 м;
  • Канцелярский нож;
  • Ножницы;
  • Ручка;
  • Линейка;
  • Горячий клей-пистолет;
  • Картон;
  • Двусторонний скотч;
  • Наклейка логотипа Ауди;
  • Тарелки.

Процесс изготовления руля из конфет своими руками

  • Начинают работу с заготовки. Для этого нужно взять пеноплекс, приложить на него круглую большую широкую тарелку большого диаметра и обвести ее ручкой. Получилась окружность.
  • Берут тарелку меньшего размера, прикладывают к центру круга и обводят ручкой. Ширина полоски отступа должна соответствовать размеру конфет, поэтому размер тарелок нужно выбирать тщательно. Зачастую в качестве шаблона используют не только тарелки, но и кастрюли и другие емкости, которые имеют круглую форму. Приблизительное расстояние между кругами будет составлять 2 см.
  • Снова берут тарелку большего размера, прикладывают к заготовке таким образом, чтобы обвести фигуру, которая образует полумесяц. Он будет находиться посередине руля. Аналогичное действие производят с тарелкой, отступив 2 см вниз.
  • От руки дочерчивают ручкой еще несколько деталей, чтобы заготовка была похожа на настоящий руль.
  • С помощью канцелярского ножа вырезают заготовку из пеноплекса.
  • Когда заготовка под руль полностью вырезана, ее нужно всю проклеить. Для этого берут бумагу, ножницы и клеевой пистолет.
  • Всю поверхность заготовки покрывают горячим клеем, но работать следует поэтапно, потому что разогретый силиконовый клей быстро застывает. Наносить клей нужно жирным слоем.

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

  • Переворачивают заготовку руля на противоположную сторону и проклеивают бумагой точно так же, как переднюю часть.
  • Когда обе стороны заготовки будут проклеены, нужно обратить внимание на то, чтобы все швы и стыки были посередине, потому что сверху нужно наклеить тесемку. Благодаря этой тесемке, все швы после наклеивания будут закрыты. Приклеивать тесьму следует так же на клеевой пистолет.
  • Аналогично проклеивают тесьмой и внутреннюю часть руля.
  • Когда заготовка для руля будет полностью готова, переходят к этапу приклеивания конфет. Рекомендуется предварительно выложить все конфетки на заготовку руля, чтобы составить нужную композицию и визуально распределить все конфеты на руле.
  • Перед тем, как приклеивать конфеты, стоит учитывать то, что сами конфеты от горячего клея тают. Поэтому перед тем, как приклеить конфетку на руль, нужно вырезать небольшую полоску двустороннего скотча и полоску картона. На каждую конфетку приклеивают кусочек двустороннего скотча, на который крепят кусочек картона. И только после этого конфетку можно приклеивать на горячий клей, капнув капельку клея на кусочек картонки, которая приклеена к конфете.
  • Весь руль обклеивают конфетками, после чего в центре руля приклеивают наклейку с логотипом ауди.
  • Получился прекрасный и вкусный руль из конфет.

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

Необходимые ресурсы

  • Собственно, педали.
    Тут сразу же возникли некоторые сложности из-за того, что я никак не мог придумать название для такой педали. Я знал лишь то, что подобные вещи используются в швейных машинках. В общем, по запросу
    electric pedal
    мне всё же удалось найти то, что нужно, на Aliexpress, и я, недолго думая, заказал 3 штуки.
  • Контроллер.
    Педалборд должен эмулировать работу клавиатуры и, возможно, мыши для возможности подключения к ПК без лишних драйверов. Для этого отлично подойдёт плата Arduino Pro Micro, которая хоть и не имеет некоторых выводов, но зато сделана максимально компактно. Идём на тот же Aliexpress, и покупаем китайскую версию этого чуда.
  • Провода.
    Чтобы поместить 3 педали под стол, нужен как минимум четырёхжильный провод длиной не меньше метра. Тут, думаю, проблем возникнуть не должно.
  • RGB-светодиод и кнопка.
    Первый нужен для индикации режимов, а вторая — для их переключения.
  • Ну и, понятное дело, нам нужны Arduino IDE, паяльник и прямые руки.

Педали

Основа модуля делается аналогично модулю руля из 12мм фанеры с поперечиной из твердой древесины (3) для крепления пружины возврата. Пологая форма основы служит подставкой для ног. Стойка педали (8) сделана из 12мм стальной трубки, к верхнему концу которой крепится болтами педаль. Через нижний конец стойки проходит 5мм стержень, который держит педаль в монтажных кронштейнах (6), прикрученных к основанию и сделанных из стального уголка. Поперечина (3) проходит через всю ширину педального модуля и надежно (должна выдерживать полное растяжение пружин) приклеивается и привинчивается к основанию (2). Пружина возврата (5) крепится к стальному винту с ушком (4), который проходит через поперечину прямо под педалью. Такая конструкция крепления позволяет легко регулировать натяжение пружины. Другой конец пружины цепляется к стойке педали (8).

Педальный потенциометр установлен на простом L-кронштейне (14) в задней части модуля. Тяга (11) крепится к приводу (12) на втулках (9, 13), позволяя сопротивлению вращаться в диапазоне 90 градусов.

Схема устройства

Ещё до того, как мне пришли посылки, я приступил к созданию схемы устройства. Хотя это сильно сказано, так как мне надо было всего лишь подключить педали, диод и кнопку. Получилось как-то так:

Для педалей я решил выделить сразу 4 порта PB1-PB4, то есть две для левой, и две для правой ноги, хотя пока педали у меня только 3. К тому же, они все находятся в одной группе и расположены в одном месте. Под светодиод я отвёл выводы PD0, PD1 и PD4, под кнопку — PD7. При этом нам не понадобятся никакие подтягивающие резисторы, если использовать те, что встроены в контроллер. Правда, тогда, при нажатии кнопки или педали, на входе будет низкий уровень, а при отпускании — высокий, то есть, нажатия будут инвертироваться, и об этом не стоит забывать.

Перетяжка руля в домашних условиях

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

Сшивание оплётки

  • Для начала накладываем кусок кожи на рулевое колесо.
  • Достаем иглу и продеваем в нее нить с узелком на конце.
  • Кожа из такого набора уже имеет небольшие отверстия по краям ткани, поэтому иглой ничего протыкать не нужно. Просто «зашнуровываем» руль в оплетку из кожи. Наиболее простой способ «шнуровки»: крест-накрест. Но можно придумать и что-то более креативное («бабочка» «елочка» и пр. Здесь все зависит от вашей фантазии).
  • Чтобы кожа для перетяжки была максимально эластичной и податливой, ее лучше прогреть.

Полный исходный код

Он вот тут

#include #include #include #define modeButton 6 struct pedal { unsigned char type; //0 — режим реального времени, 1 — режим триггера, 255 — педаль не назначена unsigned char act1[16]; unsigned char act2[16]; }; struct pedal pedals[7][4] = { { { 255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}} }, { { 255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}} }, { { 255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}} }, { { 255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}} }, { { 255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}} }, { { 255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}} }, { { 255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}}, {255, {255}, {255}} } }; char ports[4] = {8, 16, 15, 14}; char pos1[4] = {0, 0, 0, 0}; char pos2[4] = {0, 0, 0, 0}; char state[4] = {0, 0, 0, 0}; char oldState[4] = {0, 0, 0, 0}; char wait[4] = {0, 0, 0, 0}; void pedalAction(); char mode = 0; char curPedal; Thread pedalThreads[6] = {Thread(pedalAction, 10), Thread(pedalAction, 10), Thread(pedalAction, 10), Thread(pedalAction, 10), Thread(pedalAction, 10), Thread(pedalAction, 10)}; void setup() { pinMode(2, 1); pinMode(3, 1); pinMode(4, 1); pinMode(modeButton, 2); if (!digitalRead(modeButton)) { //Режим программирования Serial.begin(9600); while (!Serial) { PORTD = 0b00000000 + (PORTD & 0b11101100); delay(250); PORTD = 0b00010000 + (PORTD & 0b11101100); delay(250); } Serial.println(F(«***Programming mode***»)); Serial.println(F(«Write the command as «)); Serial.println(F(«m — number of mode, one digit»)); Serial.println(F(«p — number of pedal, one digit»)); Serial.println(F(«c — command, it can be:»)); Serial.println(F(«\tr — read pedal info»)); Serial.println(F(«\tw — enter to writing mode and change pedal programm»)); Serial.println(F(«\te — erase pedal programm and delete it»)); Serial.println(F(«There are up to 7 modes and 6 pedals per mode can be configured»)); Serial.println(F(«Mode will be incative if there is no pedal configured in it»)); while (1) { while (Serial.available()) { Serial.read(); delay(1); } PORTD = 0b00000001 + (PORTD & 0b11101100); Serial.println(«»); Serial.println(F(«Enter command»)); while (!Serial.available()); PORTD = 0b00000010 + (PORTD & 0b11101100); delay(3); if (Serial.available() == 3) { int curMode = Serial.read() — 48; int curPedal = Serial.read() — 48; char cmd = Serial.read(); if (curMode > 6 || curMode < 0) { Serial.print(F(«Mode must be in 0-6. You entered «)); Serial.println(curMode); continue; } if (curPedal > 3 || curPedal < 0) { Serial.print(F(«Pedal must be in 0-3. You entered «)); Serial.println(curPedal); continue; } Serial.println(); if (cmd == ‘r’) { int beginAddress = sizeof(struct pedal) * (curMode * 6 + curPedal); Serial.print(«type: «); int curAddress = beginAddress; Serial.println(EEPROM[curAddress++]); Serial.print(«act1: «); for (int i = curAddress ; i < curAddress + (sizeof(struct pedal) — 1) / 2; i++) { Serial.print(EEPROM
); Serial.print(«\t»); } Serial.println(); curAddress = beginAddress + 1 + (sizeof(struct pedal) — 1) / 2; Serial.print(«act2: «); for (int i = curAddress ; i < curAddress + (sizeof(struct pedal) — 1) / 2; i++) { Serial.print(EEPROM); Serial.print(«\t»); } Serial.println(); } else if (cmd == ‘w’) { Serial.println(F(«Enter type:»)); PORTD = 0b00000001 + (PORTD & 0b11101100); while (!Serial.available()); int beginAddress = sizeof(struct pedal) * (curMode * 6 + curPedal); int curAddress = beginAddress; PORTD = 0b00000010 + (PORTD & 0b11101100); EEPROM[curAddress++] = (char)Serial.parseInt(); PORTD = 0b00000001 + (PORTD & 0b11101100); Serial.println(F(«Enter act1 in DEC divided by space:»)); while (Serial.available()) { Serial.read(); delay(1); } while (!Serial.available()); PORTD = 0b00000010 + (PORTD & 0b11101100); while (Serial.available()) { EEPROM[curAddress++] = (char)Serial.parseInt(); delay(1); } PORTD = 0b00000001 + (PORTD & 0b11101100); curAddress = beginAddress + 1 + (sizeof(struct pedal) — 1) / 2; Serial.println(F(«Enter act2 in DEC divided by space:»)); while (Serial.available()) { Serial.read(); delay(1); } while (!Serial.available()); PORTD = 0b00000010 + (PORTD & 0b11101100); while (Serial.available()) { EEPROM[curAddress++] = (char)Serial.parseInt(); delay(1); } PORTD = 0b00000001 + (PORTD & 0b11101100); Serial.println(F(«Finished, don’t forget to verify written data!»)); } else if (cmd == ‘e’) { int beginAddress = sizeof(struct pedal) * (curMode * 6 + curPedal); Serial.println(F(«Disabling pedal…»)); PORTD = 0b00000010 + (PORTD & 0b11101100); EEPROM[beginAddress] = 255; PORTD = 0b00000001 + (PORTD & 0b11101100); Serial.println(F(«Pedal disabled»)); } } else { Serial.println(F(«Incorrect command, please read help above»)); } }; } for (int i : ports) pinMode(i, 2); pinMode(17, 1); for (int i = 0; i < 7; i++) { for (int j = 0; j < 4; j++) { struct pedal *p = &pedals[j]; int beginAddress = sizeof(struct pedal) * (i * 6 + j); int curAddress = beginAddress; unsigned char type = EEPROM[curAddress++]; if (type == 0 || type == 1) { p->type = type; for (int k = 0 ; k < 16; k++) { p->act1[k] = EEPROM[curAddress++]; } for (int k = 0 ; k < 16; k++) { p->act2[k] = EEPROM[curAddress++]; } } } } Keyboard.begin(); } int last = 0; void loop() { int current; if ((current = digitalRead(modeButton)) != last) { if (!current) { if (++mode >= 7) mode = 0; while (pedals[mode][0].type == 255 && pedals[mode][1].type == 255 && pedals[mode][2].type == 255 && pedals[mode][3].type == 255) if (++mode >= 7) { mode = 0; break; } } last = current; digitalWrite(2, (mode + 1) & 0b001); digitalWrite(3, (mode + 1) & 0b010); digitalWrite(4, (mode + 1) & 0b100); for (int i = 0; i < 4; i++) { pos1 = 0; pos2 = 0; state = 0; oldState = 0; wait = 0; } delay(50); } for (int i = 0; i < 4; i++) { if (pedalThreads.shouldRun()) { curPedal = i; pedalThreads.run(); } } } void pedalAction() { struct pedal *pedal1 = &pedals[mode][curPedal]; if (pedal1->type == 255) return; unsigned char *prg; char *pos; if (pedal1->type) { int current; if ((current = digitalRead(ports[curPedal])) != oldState[curPedal]) { if (!current) state[curPedal] = !state[curPedal]; oldState[curPedal] = current; } if (!state[curPedal]) { //act1 pos2[curPedal] = 0; pos = &(pos1[curPedal]); prg = pedal1->act1; } else { //act2 pos1[curPedal] = 0; pos = &(pos2[curPedal]); prg = pedal1->act2; } } else { if (!digitalRead(ports[curPedal])) { //act1 pos2[curPedal] = 0; pos = &(pos1[curPedal]); prg = pedal1->act1; } else { //act2 pos1[curPedal] = 0; pos = &(pos2[curPedal]); prg = pedal1->act2; } } while (1) { if (wait[curPedal]) { wait[curPedal]—; return; } else if (prg[*pos] == 250) { wait[curPedal] = prg[++*pos]; } else if (prg[*pos] == 254) { //Удерживать клавишу, следующую за *pos Keyboard.press(prg[++*pos]); } else if (prg[*pos] == 253) { //Отпустить клавишу, следующую за *pos Keyboard.release(prg[++*pos]); } else if (prg[*pos] == 252) { delay(10); //»Пропуск хода», ничего не делать ++*pos; return; } else if (prg[*pos] == 251) { //Переместиться в программе на позицию в ячейке *pos+1 *pos = prg[*pos + 1]; return; } else if (prg[*pos] == 255 || prg[*pos] == 0) { //Конец программы, просто заглушка return; } else { //Отправляем нажатие клавиши Keyboard.write(prg[*pos]); } //Циклически переходим на ячейку вперёд после тех команд, после которых это необходимо if (++*pos >= 16) pos = 0; } }

Инструкция установки пульта на руле с совместимой автомагнитолой

  1. Снимается бардачок.
  2. Отсоединяются тросики печки.
  3. Снимается борода на панели.
  4. Вынимается магнитола, от которой отходят три провода – черный, коричнево-желтый и коричнево-оранжевый.
  5. В разъеме от магнитолы в левом углу (желто-зеленая фишка) расположены два провода от пульта управления на руле.
  6. Соединяются два провода от пульта и черный и коричнево-желтый провода от магнитолы.
  7. Магнитола, борода и бардачок ставятся на место.

Послесловие

Хотя изначально я и делал педалборд для возможности проматывания записи во время игры на гитаре, однако лично мне показалось удобным испольщование педалей и в обычных задачах, главное немного привыкнуть к такому необычному манипулятору. А вот тут кроется ещё одна проблема: уже без любимых педалей работать становится наоборот сложнее, так как приходится вспоминать, что, куда и для чего нажимать. Если в офис педали ещё можно носить и подключать, то в институте бегать с ними по кабинетам уже сложнее. Так что использовать этот девайс для чего-то, кроме его изначального предназначения стоит на свой страх и риск.
Собраный педалборд:

Краткий итог

Тюнинг авто немыслим без правильного оформления руля. Существует большое количество вариантов его оформления.

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

Рейтинг
( 2 оценки, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]