Создай проволочную игру с Arduino

В этом увлекательном проекте мы узнаем, как сделать игру с проволокой на Arduino. Многие из необходимых деталей можно найти в стартовом наборе (что в стартовом наборе

?) и вокруг дома. В этом проекте используется Arduino, хотя вы можете использовать практически любой микроконтроллер, который у вас есть (посмотрите на это сравнение между $ 5 микроконтроллерами

для вдохновения).

Проверьте конечный результат — он даже играет музыку:

Что вам нужно

Вот основные части, которые вам понадобятся для завершения этого проекта:

  • 1 х Arduino UNO или аналогичный.
  • 1 х металлическая вешалка.
  • 2 х 220 Ом резисторов.
  • 1 х макет.
  • 1 х пьезо зуммер.
  • 2 х Крокодил клипы.
  • Ассорти термоусадочные трубки.
  • Соединительные провода между мужчинами.

если вы не уверены, что вам нужно.

План строительства

Arduino Buzzwire завершен

Хотя это может показаться сложным, на самом деле это довольно простой проект. Я начну с основной игры, а затем добавлю дополнительные компоненты для увеличения сложности. Вы можете «выбирать и выбирать», как вам нравится, в зависимости от имеющихся у вас компонентов.

Основной механик состоит из проволочной формы и петли на ручке. Игрок должен вести петлю по трассе, не касаясь двух. Если два касания, цепь завершена, и звучит зуммер. Конечно, возможно построить эту схему, не используя микроконтроллер, но где в этом удовольствие (и как еще вы услышите песню Монти Пайтона «Flying Circus»)?

Курс

Arduino Buzzwire Course

Это та форма, которую игрок должен будет направлять по кругу. Это основа всей игры, так что сделайте это хорошо! Я выбрал небольшое падение, а затем большой подъем. Согните металлическую вешалку в нужную вам форму. Медный провод или медная труба будут работать одинаково хорошо, хотя вешалка может быть самой дешевой.

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

Arduino Buzzwire Изоляция

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

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

.)

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

Ардуино витой проволоки
Использование упражнений для этого очень помогает:

Скручивание провода сверлильного патрона

База

Arduino Buzzwire Case

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

Отрежьте три части, чтобы сформировать «н» форму. Просто прикрутите (или склейте) эти три части вместе. Не забудьте сначала просверлить пробное отверстие в боковых частях, чтобы предотвратить их раскалывание. Вы можете захотеть утопить винты (особенно, если вы будете заполнять, а затем красить), и я настоятельно рекомендую сверло для зенковки. Если у вас нет инструмента для зенковки или сверла, то вам поможет сверло большего диаметра.

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

Рукоять

Arduino Buzzwire Handle
Теперь пришло время сделать цикл / контроллер. Скрутите маленький кусочек вешалки на одном конце, чтобы создать петлю с маленькой металлической ручкой. Убедитесь, что вы запилили край среза, а затем при необходимости накройте его лентой / пеной.

Arduino Buzzwire Loop
Это сформирует вторую половину цепи — когда этот цикл касается курса, он завершит цикл (точно так же, как переключатель). Припой (или используйте зажим крокодила) другой провод к нижней части этого, точно так же, как вы делали ранее для курса.

Вырежьте небольшую длину дюбеля для фактической ручки. Эта металлическая петля будет вставлена ​​в эту ручку. Если у вас нет дюбеля, вы можете закруглить кусок квадратной мягкой древесины с помощью ленточной или дисковой шлифовальной машины (вы также можете использовать наждачную бумагу, но это займет много времени).

Просверлите отверстие в этой ручке. Это должно быть достаточно большим, чтобы соответствовать металлической петле и проводу через:

Arduino Buzzwire Ручка Отверстие
Это можно сделать на столбе, хотя это сложно. Токарный станок отлично справится с работой:

Дюбель Токарный станок Buzzwire Ручка

Да, я прекрасно знаю, что это металлический токарный станок (для всех, кто интересуется, это часовой станок Boley 1930-х годов. Я думаю, что это 3C, но я хотел бы услышать от вас, если вы узнаете об этом больше).

Вы также можете использовать шариковую ручку со снятым центром.

Наконец, используйте горячий клей, чтобы закрепить кабель и петлю в ручке. Горячий клей обеспечит прочное (но не постоянное) крепление, поэтому он идеально подходит для этого.

Завершение выкл

Вставьте проводной курс в отверстия в основании. Не забудьте сначала добавить петлю / контроллер. Снова используйте горячий клей, чтобы закрепить курс на основании, заполнив утопленные отверстия на нижней стороне основания следующим образом:

Arduino Buzzwire Пайка

Схема

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

Arduino Buzzwire Full Circuit
Сначала подключите два пьезоэлемента к цифровым контактам 10 и 11. Полярность не имеет значения:

Arduino Piezo Circuit
Вам не нужно использовать два пьезо — единственная причина, по которой я это сделал, — это иметь гораздо более громкий жужжащий звук при касании проводов. Подключите одну сторону к цифровому контакту, а другую — к заземлению.

Теперь включите металлический курс и обработайте:

Arduino Buzzwire Circuit
Опять же, не имеет значения, в какую сторону эти два проводные. Эта часть схемы в точности похожа на кнопку или переключатель — игрок завершает цикл, когда петля касается курса. Убедитесь, что вы включили оба резистора.

Один резистор связывает цепь с землей (так называемый понижающий резистор), обеспечивая, чтобы он не был «плавающим» (это позволяет Arduino обнаруживать изменение цепи). Другой резистор защищает Arduino. Когда две части соприкасаются, + 5В входит в цифровой контакт. Если бы этого резистора не было, это означало бы короткое замыкание — ваш компьютер отключил бы USB-разъем для подачи слишком большого тока, если вам повезет.

Подсоедините сигнальный провод (фиолетовый на схеме) к цифровому контакту 9.

Затем подключите кнопку к цифровому контакту 2:

Arduino Piezo Button Circuit

Наконец, подключите семисегментный светодиодный дисплей:

Ардуино Семисегментная цепь
Эта конкретная модель от Seeed. Это использует TM1637 для управления четырьмя дисплеями — это означает, что нужны только два цифровых контакта. соединять GND на Arduino землю и VCC в Arduino + 5V. соединять D10 к цифровому выводу Arduino 13 и CLK к цифровому выводу 12.

Код

Чтобы этот проект работал, вам понадобятся два дополнительных файла. Первый называется pitches.h. Этот файл просто отображает имена заметок в их пьезо-значения. Это значительно облегчает написание мелодии, например, вы можете просто сказать «NOTE_C3» вместо «31». Это в свободном доступе, и доступно на веб-сайте Arduino здесь. Следуйте инструкциям, чтобы создать новый файл с именем pitches.h (в качестве альтернативы, вставьте код в существующий скрипт).

Затем вам нужен метод, чтобы на самом деле играть ноты / мелодии на пьезо. Эта суть Энтони Ди Джироламо на Github содержит код, который вам нужен. Скопируйте все между «void buzz» и «}}» и вставьте его в свой основной файл. Для справки вот оно:

void buzz(int targetPin, long frequency, long length) {
/* Buzzer example function by Rob Faludi
http://www.faludi.com
https://gist.github.com/AnthonyDiGirolamo/1405180
*/
long delayValue = 1000000/frequency/2; // calculate the delay value between transitions
//// 1 second's worth of microseconds, divided by the frequency, then split in half since
//// there are two phases to each cycle
long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing
//// multiply frequency, which is really cycles per second, by the number of seconds to
//// get the total number of cycles to produce
for (long i=0; i < numCycles; i++){ // for the calculated length of time...
digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphragm
delayMicroseconds(delayValue); // wait for the calculated delay value
digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphragm
delayMicroseconds(delayValue); // wait again for the calculated delay value
}
}

Последняя библиотека, которая вам нужна, - это управление семисегментным дисплеем - вы можете пропустить этот шаг, если вы его не используете. Эта библиотека называется TM1637 и был создан Seeed, той же компанией, которая создала плату водителя.

В Arduino IDE перейдите в «Управление библиотеками» (эскиз > Включить библиотеку > Управление библиотеками). Это поднимет менеджер библиотеки. Подождите несколько секунд, чтобы выполнить обновление, а затем выполните поиск в верхнем правом окне поиска «TM1637». Будут найдены две библиотеки - вы хотите «TM1637», а не «TM1637Display». Выберите и нажмите «Установить».

Последнее задание с этой библиотекой - оно не завершено! В таком виде библиотека может отображать только цифры 0–9 и буквы A – F. Если это охватывает все, что вы хотели бы отобразить, то вы можете пропустить этот шаг. Если нет, вам нужно будет изменить код. Расслабьтесь! Это не так сложно, как кажется, и если вы можете написать код, используя Arduino IDE, вы можете сделать это.

Сначала откройте папку вашей библиотеки. Это будет в вашей папке Arduino. На Mac OS X это находится в / Пользователи / Joe / Документы / Arduino / Библиотеки. Откройте папку с именем TM1637. Вам нужно будет отредактировать файл под названием TM1637.cpp - вы можете спокойно игнорировать другой файл с расширением .час. Откройте этот файл в своем любимом текстовом редакторе (для меня это Sublime Text 3), Блокноте или Arduino IDE.

Измените третью строку кода из этого:

static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,F

К этому:

static int8_t TubeTab[] = {
/* defaults */
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x77, // A -- 10
0x7c, // b -- 11
0x39, // C -- 12
0x5e, // d -- 13
0x79, // E -- 14
0x71, // F -- 15
/* additional */
0x174, // h -- 16
0x176, // H -- 17
0x138, // L -- 18
0x15, // M -- 19
0x137, // n -- 20
0x73, // P -- 21
0x67, // q -- 22
0x131, // r -- 23
0x78, // t -- 24
0x240 // - 25
};

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

Пришло время для реального кода. Во-первых, включите две библиотеки, упомянутые ранее:

#include
#include 

Теперь создайте экранный объект:

TM1637 *_display = new TM1637(12, 13);

Не беспокойтесь, если вы не понимаете синтаксис - эта строка сообщает Arduino, что контакты 12 и 13 подключены к семисегментному дисплею, и настроить его соответствующим образом.

Песня хранится в мелодия а также темп. Они содержат все ноты и продолжительность нот для музыки. Если вы хотите изменить музыку, измените эти массивы (хотя это не так просто, как вставка значений нот, синхронизация является очень важной частью музыки). songState переменная просто хранит позицию последней сыгранной ноты. Это гарантирует, что мелодия воспроизводится от начала до конца, а не скачет непоследовательно:

int songState = 0;
int melody[] = {
NOTE_F4,...}
int tempo[] = {
8,...}

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

Этот код не является блокирующим - это означает, что Arduino может выполнять несколько задач одновременно. Взгляните на это объяснение

для дополнительной информации. Вот как настроены таймеры:

unsigned long previousMillis1 = 0;
const long interval1 = 1500;

Переменная previousMillis1 будет обновлен на более позднем этапе, чтобы сохранить текущее время. interval1 переменная хранит как долго ждать между выполнением кода - в этом случае 1,5 секунды. Определяется как Const, Это означает, что она постоянна и никогда не изменится - это позволяет Arduino дополнительно оптимизировать код.

Внутри настроить() Функция происходит несколько вещей. Сначала настраиваются входы и выходы. Это нужно сделать, чтобы Arduino знал, что связано с каждым из его контактов:

pinMode(9, INPUT); // setup circuit
pinMode(10, OUTPUT); // setup buzzer 1
pinMode(11, OUTPUT); // setup buzzer 2
pinMode(2, INPUT); // setup button

Теперь дисплей нуждается в настройке:

_display->set(5); // set brightness
_display->point(false); // remove colon
_display->init(); // start display

Методы задавать, точка, а также в этом все содержатся в _display объект. Вместо точки указатель («->») используется для доступа к ним. Опять же, не беспокойтесь о синтаксисе (хотя, если вы хотите узнать больше, ищите указатели C ++).

Основной цикл имеет два режима игры: вызов и свободная игра. Свободная игра позволяет игроку играть неограниченное количество раз. Режим испытаний устанавливает таймер на 20 секунд, используя showCountdown метод. Он использует кнопку для запуска и остановки таймера. в настоящее время единственный способ изменить режимы игры - вручную изменить переменную Режим. Посмотрите, можете ли вы добавить еще одну кнопку для этого и соответствующим образом изменить код.

жужжание Метод воспроизводит записанные данные. Это используется в сочетании с петь. Метод sing проходит каждую ноту и воспроизводит ее. Этот метод вызывается регулярно, хотя он будет воспроизводить следующую ноту только по истечении достаточного времени с момента последнего воспроизведения. Как только песня подходит к концу, она сбрасывает песню к стиху 1 (songState = 14). Вы можете установить его на ноль, чтобы начать песню в начале, однако причина для этого - пропустить введение. Вступление воспроизводится один раз после включения Arduino, а затем снова не воспроизводится.

showFree а также showPlay Методы просто выводят слова «FrEE» и «PLAY» на дисплей. Обратите внимание, что «r» в свободном является строчными, когда все остальные символы прописными. Это одно из ограничений семисегментных дисплеев. Они не могут отображать каждую букву алфавита, и некоторые символы, которые они могут отображать, должны быть в смешанном регистре.

toggleFreePlay Метод мигает на дисплее между «FREE» и «PLAY». Опять же, это делает это неблокирующим способом.

Еще один полезный метод showNumber. Это записывает число в средние два символа дисплея следующим образом:

Arduino Buzzwire Дисплей

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

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

Вот весь этот код вместе взятый:

#include  // include display library
#include  // include pitches
TM1637 *_display = new TM1637(12, 13); // create display object, 12 = CLK (clock), 13 = D10 (data)
// music
int songState = 0;
int melody[] = {
NOTE_F4, NOTE_E4, NOTE_D4, NOTE_CS4,
NOTE_C4, NOTE_B3, NOTE_AS3, NOTE_A3,
NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_A3,
NOTE_G3, NOTE_C4, 0,
NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3,
NOTE_GS3, NOTE_A3, NOTE_F4, NOTE_C4,
NOTE_C4, NOTE_A3, NOTE_AS3, NOTE_AS3,
NOTE_AS3, NOTE_C4, NOTE_D4, 0,
NOTE_AS3, NOTE_G3, NOTE_G3, NOTE_G3,
NOTE_FS3, NOTE_G3, NOTE_E4, NOTE_D4,
NOTE_D4, NOTE_AS3, NOTE_A3, NOTE_A3,
NOTE_A3, NOTE_AS3, NOTE_C4, 0,
NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3,
NOTE_GS3, NOTE_A3, NOTE_A4, NOTE_F4,
NOTE_F4, NOTE_C4, NOTE_B3, NOTE_G4,
NOTE_G4, NOTE_G4, NOTE_G4, 0,
NOTE_G4, NOTE_E4, NOTE_G4, NOTE_G4,
NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_G4,
NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_C4,
NOTE_B3, NOTE_C4, NOTE_B3, NOTE_C4, 0
};
int tempo[] = {
8, 16, 8, 16,
8, 16, 8, 16,
16, 16, 16, 8,
16, 8, 3,
12, 16, 16, 16,
8, 16, 8, 16,
8, 16, 8, 16,
8, 16, 4, 12,
12, 16, 16, 16,
8, 16, 8, 16,
8, 16, 8, 16,
8, 16, 4, 12,
12, 16, 16, 16,
8, 16, 8, 16,
8, 16, 8, 16,
8, 16, 4, 16,
12, 17, 17, 17,
8, 12, 17, 17,
17, 8, 16, 8,
16, 8, 16, 8, 1
};
// non blocking setup
// free play
unsigned long previousMillis1 = 0; // time words last changed
const long interval1 = 1500; // interval between changing
// music
unsigned long previousMillis2 = 0; // time last changed
const long interval2 = 100; // interval between notes
int displayStatus = 0; // keep track of what's displayed
int mode = 0; // keep track of game mode -- change to 0 or 1 for different modes
bool countdown = false;
unsigned long previousMillis3 = 0; // time last changed
const long interval3 = 1000; // interval between countdown
int count = 20; // challenge mode timer
void setup() {
// put your setup code here, to run once:
pinMode(9, INPUT); // setup circuit
pinMode(10, OUTPUT); // setup buzzer 1
pinMode(11, OUTPUT); // setup buzzer 2
pinMode(2, INPUT); // setup button
_display->set(5); // set brightness
_display->point(false); // remove colon
_display->init(); // start display
}
void loop() {
// put your main code here, to run repeatedly:
if(mode == 0) {
// challenge mode
if(digitalRead(2) == HIGH) {
delay(25);
if(digitalRead(2) == HIGH) {
countdown = true; // stop the countdown
}
else {
countdown = false; // stop the countdown
}
}
if(countdown) {
showCountdown(); // advance countdown
}
}
else {
// free play
toggleFreePlay();
}
if(digitalRead(10) == HIGH) {
delay(25);
if(digitalRead(10) == HIGH) {
while(digitalRead(10) == HIGH) {
buzz(11, NOTE_B0, 1000/24);
}
}
}
else
sing();
}
void showCountdown() {
// countdown the time remaining
unsigned long currentMillis = millis(); // current time
if (currentMillis - previousMillis3 >= interval3) {
previousMillis3 = currentMillis;
--count;
showNumber(count);
if(count == 0) {
// game over
countdown = false;
count = 20;
// reset countdown
// buzz 3 times
buzz(11, NOTE_B0, 1000/24);
delay(100);
buzz(11, NOTE_B0, 1000/24);
delay(100);
buzz(11, NOTE_B0, 1000/24);
}
}
}
void showNumber(int number) {
// show numbers (maximum 99) on display
_display->display(0, 25); // write - to segment 1
_display->display(3, 25); // write - to segment 4
// write number to middle of display
if(number == 10)
{
_display->display(1,1);
_display->display(2,0);
}
else if(number > 9)
{
_display->display(1,1);
int newVal = number - 10;
_display->display(2, newVal);
}
else
{
_display->display(1,0);
_display->display(2,number);
}
}
void toggleFreePlay() {
// scroll between words without blocking
unsigned long currentMillis = millis(); // current time
if (currentMillis - previousMillis1 >= interval1) {
previousMillis1 = currentMillis;
if(displayStatus == 1)
showPlay();
else
showFree();
}
}
void showPlay() {
// write "PLAY" to the display
_display->display(0, 21); // write P to segment 1
_display->display(1, 18); // write L to segment 2
_display->display(2, 10); // write A to segment 3
_display->display(3, 4); // write Y to segment 4
displayStatus = 2;
}
void showFree() {
// write "Free" to the display
_display->display(0, 15); // write F to segment 1
_display->display(1, 23); // write r to segment 2
_display->display(2, 14); // write E to segment 3
_display->display(3, 14); // write E to segment 4
displayStatus = 1;
}
void buzz(int targetPin, long frequency, long length) {
/* Buzzer example function by Rob Faludi
http://www.faludi.com
https://gist.github.com/AnthonyDiGirolamo/1405180
*/
long delayValue = 1000000/frequency/2; // calculate the delay value between transitions
//// 1 second's worth of microseconds, divided by the frequency, then split in half since
//// there are two phases to each cycle
long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing
//// multiply frequency, which is really cycles per second, by the number of seconds to
//// get the total number of cycles to produce
for (long i=0; i = interval2) {
previousMillis2 = currentMillis;
int noteDuration = 1000 / tempo[songState];
buzz(10, melody[songState], noteDuration);
int pauseBetweenNotes = noteDuration;
delay(pauseBetweenNotes);
// stop the tone playing:
buzz(10, 0, noteDuration);
++songState;
// start song again if finished
if(songState > 79) {
songState = 14; // skip intro
}
}
}

Сохраните этот файл как «buzzwire» (Файл> Сохранить как), а затем загрузить его на свою доску (Файл> Загрузить). Если вы не знаете, как загрузить Arduino, или этот код выглядит немного страшно, ознакомьтесь с нашим Руководством для начинающих Arduino.

, Все будет хорошо, теперь у вас должна быть своя игра, но круто!

Если вы прочитали что-нибудь классное после прочтения, я хотел бы это увидеть - дайте мне знать в комментариях ниже!

Ссылка на основную публикацию
Adblock
detector