RSS блога
Подписка
Дорабатываем настольную игру с помощью Arduino
- Цена: 350р
- Перейти в магазин
Решил написать небольшой обзорчик на тему:
«Как еще можно применить Arduino»…
Если коротко, то добавим рандома в игру.
Обзор будет не длинным, просто покажу что, как делал.
Начнем повесть с того, что сыну на день рождения подарили настольную игру «Зомби в доме».
Ну как подарили !?
Увидел рекламу, сказал «Хочу» и вуаля, список подарков пополнился еще одной настолкой )))
Сама по себе настольная игра довольно прикольная и не смотря на рейтинг 12+, подходит для детей более юного возраста (сыну исполнилось 6).
Фотографий игры в интернете много, поэтому уберу свои под спойлер:
Коробку я уже немного порезал )))
Виновником обзора является вот это картонный диск:
Если Ваш доходяга должен сходить или он наткнулся на зомби, то берем в руки эту штуку, крутим стрелку и в зависимости от выпавшей картинки или цифры выполняем действие.
После первой же партии обнаружились некоторые минусы:
1) Стрелка крутиться не свободно и иногда заедает;
2) Крутить стрелку пальцем/рукой не очень удобно;
3) Большое поле для мухлежа, а так хочется честной игры.
Видя такую несправедливость, я не мог остаться в стороне и с наступлением ночи, одев супергеройские колготки и дырявые носки, я отправился в кладовку для поиска идей и вдохновения.
Идея, как и компоненты для ее реализации, пришла довольно быстро.
Итак в кладовке я нашел:
— Пластиковый бокс, приобретенный для другого проекта (он чуть больше диска, ну да ладно);
— Arduino Nano V3 (я их покупал давно и сразу много);
— Моторчик, выдранный из какой-то старой игрушки;
— Кнопка (без фиксации);
— Переключатель (вкл/выкл);
— Power Bank (их как-то давали на работе просто так, с тех пор пылиться на полке);
— Кусок старого USB кабеля (помимо пакета с пакетами, у меня еще есть пакет в проводами);
— NPN транзистор KSP44 (выдрал его из базы старого радиотелефона).
Групповое фото, найденного барахла
Для разбора вязанки проводов, накидал небольшую схему:
В собранном виде это выглядит, как фильм из категории XXX:
Моторчик приклеил на суперклей + сода, остальное на термоклей.
Повербанк посадил на двухсторонний скотч, чтобы не болтался по корпусу.
Картонный диск так же приклеил на кусочки двухстороннего скотча, чтобы можно было снять, в случае чего.
В стрелке просверлил небольшое отверстие по диаметру вала моторчика.
Вот собственно и собранная конструкция.
Работает эта «Штука», так: включаем, нажимаем на кнопку, Arduino «случайным» образом генерирует время от 0 до 1000 мс, крутит мотор и по прошествии времени останавливает его.
К этому добавляем неизвестное начальное положение стрелки + инерцию при остановке.
Вуаля — теперь этот девайс выдает случайное количество шагов или действие.
Т.к. абсолютно чистый рандом реализовать в принципе невозможно, есть возможность отказаться от помощи Arduino и крутить стрелку самостоятельно.
Итог
Т.к. я нашел все в кладовке, то денег я потратил 0, но поскольку это все мной же и покупалось, то стоимость компонент составила около 350р (по текущему курсу $$$).
Стоимость Power Bank я сюда не включал, т.к. реализовать питание можно по разному.
У меня, в случае необходимости, Power Bank можно снять для зарядки или своих нужд.
На разработку, сборку и программирование ушло около 3,5 часов лежания на диване )))
Сыграв пару партий, все одобрили девайс, поскольку полный рандом добавляем изюминку игре.
Спасибо за внимание, за грамматику не бить )))
P.S. Вариантов реализации идеи много. Я лишь показал свой вариант.
P.P.S. Видео перезалил, рандом присутствует )))
«Как еще можно применить Arduino»…
Если коротко, то добавим рандома в игру.
Обзор будет не длинным, просто покажу что, как делал.
Справка: Random (рандом) — Случайный, произвольный, выбранный наугад.
Начнем повесть с того, что сыну на день рождения подарили настольную игру «Зомби в доме».
Ну как подарили !?
Увидел рекламу, сказал «Хочу» и вуаля, список подарков пополнился еще одной настолкой )))
Сама по себе настольная игра довольно прикольная и не смотря на рейтинг 12+, подходит для детей более юного возраста (сыну исполнилось 6).
Правила можно посмотреть тут
Фотографий игры в интернете много, поэтому уберу свои под спойлер:
Пару фотографий настолки
Коробку я уже немного порезал )))
Виновником обзора является вот это картонный диск:
Если Ваш доходяга должен сходить или он наткнулся на зомби, то берем в руки эту штуку, крутим стрелку и в зависимости от выпавшей картинки или цифры выполняем действие.
После первой же партии обнаружились некоторые минусы:
1) Стрелка крутиться не свободно и иногда заедает;
2) Крутить стрелку пальцем/рукой не очень удобно;
3) Большое поле для мухлежа, а так хочется честной игры.
Видя такую несправедливость, я не мог остаться в стороне и с наступлением ночи, одев супергеройские колготки и дырявые носки, я отправился в кладовку для поиска идей и вдохновения.
Идея, как и компоненты для ее реализации, пришла довольно быстро.
Мысля:
Прокручивать стрелку случайное время, чтобы результат нельзя было предсказать.
Конечно сюда можно прикрутить Arduino…
Arduino, как bluetooth — с ним все становиться только лучше!
Итак в кладовке я нашел:
— Пластиковый бокс, приобретенный для другого проекта (он чуть больше диска, ну да ладно);
— Arduino Nano V3 (я их покупал давно и сразу много);
— Моторчик, выдранный из какой-то старой игрушки;
— Кнопка (без фиксации);
— Переключатель (вкл/выкл);
— Power Bank (их как-то давали на работе просто так, с тех пор пылиться на полке);
— Кусок старого USB кабеля (помимо пакета с пакетами, у меня еще есть пакет в проводами);
— NPN транзистор KSP44 (выдрал его из базы старого радиотелефона).
Иногда мне кажется, что моя кладовка это Нарния, сколько всего интересного там можно найти!
Балкон — Нарния 2 )))
Групповое фото, найденного барахла
Для разбора вязанки проводов, накидал небольшую схему:
В собранном виде это выглядит, как фильм из категории XXX:
Моторчик приклеил на суперклей + сода, остальное на термоклей.
Повербанк посадил на двухсторонний скотч, чтобы не болтался по корпусу.
Еще пару фотографий с разных ракурсов
Картонный диск так же приклеил на кусочки двухстороннего скотча, чтобы можно было снять, в случае чего.
В стрелке просверлил небольшое отверстие по диаметру вала моторчика.
Вот собственно и собранная конструкция.
Код для Adruino - постарался по максимуму пояснить, что и как работает
// Задаём номера выводов:
const int buttonPin = 5; // Вход с кнопки
const int motorPin = 6; // Выход на мотор
const int timeMin = 0; // Минимальное время (в миллисекундах)
const int timeMax = 100; // Максимальное время (в миллисекундах)
const int count = 5; // Количество проходов цикла
void setup() {
pinMode(motorPin, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(13, OUTPUT);
randomSeed(analogRead(0));
}
void loop() {
int timer = 0;
int sol = 0;
// Считываем состояние кнопки
if (digitalRead(buttonPin) == HIGH)
{
for (int i=0; i <= count; i++){
sol = random(timeMin, timeMax); // Генерируем случайное число
if (sol % 2 == 0) // Если число четное
{
timer = timer + random(timeMin, timeMax); // Добавляем случайное время
}
}
sol = random(timeMin, timeMax); // Генерируем случайное число
if (sol % 2 == 0) // Если число четное
{
timer = timer / 2; // Уменьшаем время в 2 раза
}
else
{
sol = random(timeMin, timeMax); // Генерируем случайное число
if (sol % 2 == 0) // Если число четное
{
timer = timer * 2; // Увеличиваем время в 2 раза
}
}
digitalWrite(13, HIGH); // Включаем светодиод на 13 пине
digitalWrite(motorPin, HIGH); // Включаем мотор
delay(timer);
}
else
{
digitalWrite(13, LOW); // Выключаем светодиод на 13 пине
digitalWrite(motorPin, LOW); // Выключаем мотор
}
}
Упрощенный вариант кода
// Задаём номера выводов:
const int buttonPin = 5; // Вход с кнопки
const int motorPin = 6; // Выход на мотор
const int count = 15; // Количество проходов цикла
void setup()
{
pinMode(motorPin, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(13, OUTPUT);
randomSeed(analogRead(0));
}
void loop()
{
int timer = 0;
// Считываем состояние кнопки
if (digitalRead(buttonPin) == HIGH)
{
for (int i = 0; i <= random(1, count); i++)
{
timer = timer + 100; // Добавляем случайное время
}
digitalWrite(13, HIGH); // Включаем светодиод на 13 пине
digitalWrite(motorPin, HIGH); // Включаем мотор
delay(timer);
}
else
{
digitalWrite(13, LOW); // Выключаем светодиод на 13 пине
digitalWrite(motorPin, LOW); // Выключаем мотор
}
}
Работает эта «Штука», так: включаем, нажимаем на кнопку, Arduino «случайным» образом генерирует время от 0 до 1000 мс, крутит мотор и по прошествии времени останавливает его.
К этому добавляем неизвестное начальное положение стрелки + инерцию при остановке.
Вуаля — теперь этот девайс выдает случайное количество шагов или действие.
Т.к. абсолютно чистый рандом реализовать в принципе невозможно, есть возможность отказаться от помощи Arduino и крутить стрелку самостоятельно.
Итог
Т.к. я нашел все в кладовке, то денег я потратил 0, но поскольку это все мной же и покупалось, то стоимость компонент составила около 350р (по текущему курсу $$$).
Стоимость Power Bank я сюда не включал, т.к. реализовать питание можно по разному.
У меня, в случае необходимости, Power Bank можно снять для зарядки или своих нужд.
На разработку, сборку и программирование ушло около 3,5 часов лежания на диване )))
Сыграв пару партий, все одобрили девайс, поскольку полный рандом добавляем изюминку игре.
Спасибо за внимание, за грамматику не бить )))
P.S. Вариантов реализации идеи много. Я лишь показал свой вариант.
P.P.S. Видео перезалил, рандом присутствует )))
Это тоже котик )))
Самые обсуждаемые обзоры
+71 |
3366
135
|
+51 |
3572
66
|
+29 |
2535
48
|
+38 |
2894
41
|
+55 |
2043
37
|
у ардуины нет мощей мотор напрямую крутить, кто крутит?
Потребление моторчика 11 mA, запуск около 60 mA.
Но логика почему-то нормально не отрабатывает, поэтому добавил npn.
Почему так, разбираться было не охото, проще переделать.
Да и вообще Arduino не способна, что-то серьезное питать.
P.S. Да, это живой львенок.
Фоткались летомв Крыме, в каком-то заповеднике.
Спасибо за подсказку.
Только цены там не особо гуманные, а так там круто.
Сама идея хорошая, у меня для таких целей лежит светодиодный бегунок, покупал на али набор для пайки. Типа такого
https://aliexpress.com/item/item/Round-Electronic-Lucky-Rotary-Suite-CD4017-NE555-Self-DIY-LED-Light-Kit-Production-Parts-and-Components/32795203638.html,searchweb201602_3_10152_10065_10151_10068_10136_10137_10060_10138_10062_10156_10153_10141_10056_10055_10054_10059_10099_10103_10102_10096_10148_120_10147_10052_10053_10142_10107_10050_10143_10051_10117_10084_10083_10119_10080_10082_10081_10110_10111_10112_10113_10114_10078_10079_10073_10070_10123_10120_10127_10124_10125-10120,searchweb201603_9,afswitch_1_afChannel,ppcSwitch_5&btsid=71effd8f-74ef-4923-964b-22e9b543fae6&algo_expid=94ef1c04-765f-4d2e-9b4b-0deee3da2825-26&algo_pvid=94ef1c04-765f-4d2e-9b4b-0deee3da2825
Бокс 60р + кнопка 30р + переключатель 30р + мотор 70р + ардуино 120р + запас, т.к. цены везде разные.
Секторов всего 4, поэтому шанс выпадения каждого сектора 25% + погрешность на размер сектора.
На самом деле при игре сектора выпадают разные, бывают и повторы.
И еще надо принять во внимание то, что чистого рандомайзера, как такового нет. В данном случае Arduino генерирует какую-то последовательность. Можно только постараться увеличить случайность.
Могу вечером переснять видео, если нужно )))
а так и динозавра встретить — 50% шанс)
В теории, коротким нажатием можно примерно предугадать результат.
Конечно можно сделать проще, но сто сделано, то сделано )))
Но что сделано, то сделано))
Ну если хочется чтоб стрелка крутилась аналоговая и результат зависел от скетча а не от кривизны стрелки, циферблата и сил трения, можно использовать серву на 360 вместо двигателя.
Я показал свой.
При тестировании в игре, всех такой вариант устроил, жалоб не было.
Можно и не использовать ардуинку, а крутить руками, как и задумывали авторы.
Вечером пересниму видео в доказательство рандома )))
А так шанс выпадения каждого сектора около 25%, так что все честно.
У мотора есть плюс: разгон и торможение по инерции добавляют своего рандома.
1-2 — бег
3-4 — зубы
5 — сабли
6 — мишень:)
Авторам игры уже так советовали.
Но если бы я взял кубик, то не было бы обзора )))
С кубиком нет колхоза, а так уже не интересно.
Можно раскручивать «чашку» в которой вращается ось стрелки, тогда стрелка не будет привязана к ротору.
Не лично вам, но тем, кто решится повторить.
1. Кнопкой лучше прижимать ногу ардуины не к плюсу, а к земле. Соответственно, резистор подтягивающий пойдёт на плюс или (спасибо Атмелу) от него можно отказаться вовсе, используя внутреннюю подтяжку. Профит: экономим одну деталь, делаем всё, как правильно.
2. Ключ сделан совсем уж неправильно: сейчас мы в управляющий ток базы включаем весь ток через мотор. Так делать не надо. Будь мотор сильнее, пожжём выход ардуины. Надо так: эмитер сразу сажаем на минус, моторчик включаем в коллектрную, а не в эмитерную цепь. По феншую, ещё бы и базовый ток ограничить резистром. И диод от противотока моторчика добавить.
3. Использовать полиэтиленовую крышку для крепления на клей — бессмысленно. Суперклей с содой — это хорошо, но чуть пошевелите свою крышку — всё растрескается и отвалится. Тут лучше сработает механическое крепление. Хомут вокруг движка и болты — всё будет как влитое.
Просьба воспринимать не как «голословный наезд» а как «конструктивную критику».
1,2 — Я в радиотехнике разбираюсь, как свинья в апельсинах. Делал по наитию + интернет. За 2 пункт отдельное спасибо. Буду знать.
3 — Суперклей + сода держат очень даже хорошо, конечно в разумных пределах. Если нет желания изобретать крепеж, этот вариант, отлично подойдет. Единственное, я крышку немного зашкурил, иначе термоклей отваливается.
Первая же картинка из интернета. Просто вместо реле моторчик будет.
по п.1.
Один контакт кнопки к пину ардуины, второй к минусу. Безо всяких резисторов и прочего. В скетче тогда заменится следующее (без кавычек):
«pinMode(buttonPin, INPUT);» на «pinMode(buttonPin, INPUT_PULLUP);»
«if (digitalRead(buttonPin) == HIGH)» на «if (digitalRead(buttonPin) == LOW)»
Так строятся некоторые выходные каскады усилителей или входные усилители с большим входным сопротивлением.
Объединять токи управления и нагрузки для ключевого режима — неправильно.
И коэффициент усиления по напряжению у такого каскада всегда меньше 1.
И плохо во время выключения. Ток из коллектора перестает подпитывать двигатель/индуктивность. И он начинает течь забирая то что может их базы, а там нога контроллера. Она оказывается в минусе. В принципе нынешние микроконтроллеры порой и переполюсовку питания выдерживают, но это не значит что их всех надо подвергать таким истязаниям.
А автор молодец, что не зная почти ничего, все таки сделал и ОНО работает ))))
hobbyworld.ru/kubik-d4-opak-raznih-cvetov-v-assort-
hobbygames.ru/kubik-d4-andquot-prostojandquot-16mm-v-assortimente
хобби это хорошо, но принцип разумной достаточности никто не отменял :)
Это из серии «дурная голова ногам покоя не даёт». Вы сначала в хардварной части наплодили ненужных сущностей, а потом в софтварной части нагородили таких костылей, что волосы дыбом встают… Знаменитые индийские программисты по сравнению в вами — дети.
На муске есть конкурс типа «золотой малины»? Я б за вашу поделку проголосовал.
Нажал и все, не надо держать, arduino все сделал сама.
Но а так, похвально, улучшайте вашу подделку, улучшите скилл прогерства и хардвара :).
Увы, скилл радиотехника, где-то на уровне 3-4, до 99 еще далеко )))
Может его к мотору все же цеплять?
У вас в профиле вроде «программист» написано? Это шутка? Вы серьёзно полагаете, что эти ваши навороты в коде хоть как-то улучшат «рандомность» получаемых чисел?
Мне просто интересно, какими соображениями вы руководствовались при написании этого шедевра из 21 строки кода? И чем ваш метод лучше прямолинейного
?
2) Вы знаете как работает рандом !? Это некая псевдо случайная последовательность. При моем подходе результат сильно отличается от простого timer = random(timeMin, timeMax), где в большинстве случаев разница между результатами незначительна.
Вы можете предложить свой вариант, никто не запрещает.
Я-то знаю. А вы?
random(timeMin, timeMax) выдает псевдослучайное число из диапазона [timeMin, timeMax) с равномерным распределением.
Вы можете назвать хотя бы диапазон вашей псевдослучайной величины timer? Про распределение вероятности я уж не спрашиваю…
И еще…
Вы думаете, мне лень было написать random(0, 1000) !?
Судя по Вашим комментариям, скилл в программировании у Вас около 99 лвл.
Такой код там не просто так, обычный random выдает фигню.
Если Ваши навыки программирования, хоть сколько-нибудь приближены к самомнению, то продемонстрируйте свой вариант, а мы заценим и поглядим.
Счетчик i примет значения от 0, до 5, всего 6 раз. Максимальное значение timer будет
Я прогнал ваш алгоритм миллион раз и построил гистограмму в Excel. Компилятор GNU GCC, среда разработки Code::Blocks.
На равновероятный закон не похоже.
Случайные числа легче всего получать, собирая младшие биты с АЦП.
Занятно. У меня при тестировании получались немного несколько результаты, но в любом случае, я уже переписал алгоритм (код есть в обзоре).
Кстати да, это идея.
Чуток поправлю:
Поскольку диапазон значений функции random — [min, max). См. www.arduino.cc/en/Reference/Random
Садись, два.
Как ниже было показано, диапазон возможных значений
Учитывая, что timeMax = 100, получаем диапазон [0, 1188].
> Вы думаете, мне лень было написать random(0, 1000) !?
Нет, не думаю. Что я думаю, я уже написал: дурная голова ногам покоя не даёт.
> Такой код там не просто так, обычный random выдает фигню.
Фигню выдаёт ваш код, а недостаток математического образования и программистской квалификации не позволяют вам понять этого.
> Если Ваши навыки программирования, хоть сколько-нибудь приближены к самомнению, то продемонстрируйте свой вариант, а мы заценим и поглядим.
Жалкая попытка сменить тему дискуссии.
Адью.
после нас он сразу побежал обедать.
В подобных играх самое главное — взаимодействие людей. Верчение стрелки, бросание кубика, и все прочие сопутствующие процессы — часть игры, в которой раскрывается (а у детей ещё и формируется) характер. Кто-то пытается мухлевать, кто-то говорит что надо играть честно, а если кто-то будет играть нечестно, то получит по наглой рыжей морде… После автоматизации вращения стрелки осталось ещё автоматизировать передвижение фишек — и всё, можно расходиться, ардуина сама с собой сыграет, потом пришлёт на почту имя победителя. Каждый может уткнуться в собственный смартфон.
Стрелка — всего лишь инструмент, как кубики.
Что нашел, то и поставил.
Я их заказывал никогда, т.к. не было необходимости.
Зато у меня лежит образцовый вакууметр 1227, не знаю куда девать + куча разных двигателей и прочей советской электроники )))
А так да, идея хорошая. Мороки было бы меньше.
Я вечером перезалью видео, при игре он выпадает рандомно, проблема магнитов не ощущается.
Желательно схемой, если она не сложная.
только RUN и STOP одновременно нельзя подавать.
Есть настольная игра Тик Так Бумм. В ней есть такой элемент как бомба. Нажимаешь на кнопку бомба начинает тикать и через случайное время звучит взрыв. Возможно сымитировать убыстряющиеся звуки тиканья и взрыв на Arduino Nano?
Вот пример работы.
1) Сгенерировать случайное время
2) Воспроизводить звук 1 раз в секунду (например)
3) Если осталось < 3 секунд, то воспроизводить звук 1 раз в 500 мс.
Как-то так. Это общий алгоритм работы.
Хотя все равно ее дома нету.
Конечно с Ардуиной солиднее, особенно в прозрачном корпусе. Но результат тот же.
> Конечно с Ардуиной солиднее, особенно в прозрачном корпусе. Но результат тот же.
Комментарий выше говорит, что для решения проблемы достаточно капли смазки на ось стрелки. А результат — совершенно разный. Про каплю смазки обзор не напишешь, сотню лайков не заработаешь.
Вангую парень в своём ЭД Директум далеко пойдёт, архитектором скоро станет. Навыки по изготовлению высокотехнологичных проектов из г и палок уже есть, опыт в PR набирает быстрыми темпами. Ставить непарные закрывающие скобки уже научился.
А в области проектирования интерфейса между человеком и машиной парень — чёртов гений. Кто-нибудь обратил внимание на индикатор включения (зелёный светодиод)? Это же находка. Революция в области промдизайна.