Оглавление:

Звуковые сигналы для парусного спорта: 11 шагов
Звуковые сигналы для парусного спорта: 11 шагов

Видео: Звуковые сигналы для парусного спорта: 11 шагов

Видео: Звуковые сигналы для парусного спорта: 11 шагов
Видео: Всё про парусный спорт 2024, Июль
Anonim
Image
Image
Оборудование Telltale
Оборудование Telltale

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

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

При изготовлении этого устройства требуется доступ к паяльному оборудованию и 3D-принтеру.

Шаг 1. Спецификация материалов

Спецификация со ссылками и ценами

Примечание. Вам понадобится 2 комплекта из перечисленного ниже.

Система ввода

  • Ардуино Нано
  • Макетная плата половинного размера Adafruit perma-proto
  • Модуль беспроводного приемопередатчика nRF24L01
  • Фото прерыватель
  • Коммутационная плата Sparkfun Photo Interrupter
  • Аккумулятор на 9 В, совместимый с Arduino
  • Аккумулятор 9В
  • Несколько отрезков провода калибра 22
  • Пряжа
  • Неодимовые магниты
  • Эпоксидная смола

Система вывода

  • Ардуино Нано
  • Макетная плата половинного размера Adafruit perma-proto
  • Модуль беспроводного приемопередатчика nRF24L01
  • Аккумулятор на 9 В, совместимый с Arduino
  • Потенциометр 1 кОм
  • Резистор 120 Ом
  • 2Н3904 транзистор
  • Конденсатор 0,1 мкФ
  • Динамик, совместимый с Arduino

Файлы GitHub

  • Весь код и файлы STL, необходимые для создания этих индикаторов, можно найти в этом репозитории GitHub.
  • Вам понадобятся два комплекта корпуса и один корпус динамика.

Шаг 2: Инструменты / Машины / Требования к программному обеспечению

Чтобы запрограммировать Arduino, вам необходимо загрузить Arduino IDE. Ссылку для скачивания можно найти здесь.

Чтобы запрограммировать модуль nRF24L01, вам необходимо загрузить его библиотеку через Arduino IDE. Инструменты> Управление библиотеками…> установить библиотеку RF24

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

Чтобы построить контрольную раму и корпус динамика, вам понадобится доступ к 3D-принтеру.

Шаг 3. Оборудование Telltale

Оборудование Telltale
Оборудование Telltale
Оборудование Telltale
Оборудование Telltale

Соберите схему согласно схемам выше. Arduino Nano должен быть выровнен по верхней части макетной платы. Это позволяет вам иметь доступ к USB-порту даже после подключения всей электроники.

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

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

Подключение резистора, GND и провода 5V к фотопрерывателю не изображены. Подключите фотопрерыватель, как указано на его коммутационной плате. Изображение коммутационной платы прилагается.

Цепи для правого и левого контрольных сигналов точно такие же.

Шаг 4. Программное обеспечение Telltale

Вот код для правого контрольного сигнала. Подключите nano правого контрольного устройства к вашему компьютеру, откройте Arduino IDE, скопируйте и вставьте в нее этот код и загрузите его на плату.

/ ** Программа, которая использует Photogate для проверки контрольных

* / #include #include #include #include RF24 radio (9, 10); // CE, CSN, постоянный адрес байта [6] = "00010"; // --- программные константы --- // время const int string_check_time = 1; const int flow_check_time = 30; const int base_delay = 5; const int flow_check_delay = 0; const int GATE_PIN = 6; const int GATE_PIN_2 = 7; const int max_when_testing = время_проверки * 0,6; // установить переменную выше на основе ваших собственных экспериментальных испытаний const int max_in_flow = min (max_when_testing, int (flow_check_time / string_check_time)); const int msg_max_val = 9; // const int string_thresh = 20; #define STRING_THRESH 0.2 // --- программные переменные --- int num_string_seen = 0; int num_loops = 0; void setup () {// while (! Serial); // для флоры // delay (500); num_string_seen = 0; num_loops = 0; pinMode (GATE_PIN, ВХОД); pinMode (GATE_PIN_2, ВХОД); Serial.begin (115200); // для отладки radio.begin (); radio.openWritingPipe (адрес); radio.setPALevel (RF24_PA_MIN); radio.stopListening (); } void loop () {// поместите сюда ваш основной код для повторного запуска: if (num_loops% string_check_time == 0) {// проверьте состояние строки check_string (); } if (num_loops == flow_check_time) {// проверять поток //Serial.println(num_string_seen); int flow_num = explore_flow (); // отправляем значения send_out (flow_num); // сбросить переменные num_string_seen = 0; num_loops = 0; задержка (flow_check_delay); } num_loops ++; задержка (base_delay); } / * * Метод проверки, пересекает ли строка ворота * / void check_string () {int string_state = digitalRead (GATE_PIN); //Serial.println(string_state); если (string_state == 0) {num_string_seen ++; //Serial.println("Пила строка! "); }

int bot_state = digitalRead (GATE_PIN_2);

если (bot_state == 0) {num_string_seen--; //Serial.println(" строка внизу! "); } //Serial.print("Счетная строка проходит: "); //Serial.println(num_string_seen); возвращение; } / * * Метод для анализа того, какая часть времени строка покрывала вентиль * / int explore_flow () {double percent_seen = double (num_string_seen) / max_in_flow; Serial.print ("Процент покрытия:"); printDouble (percent_seen, 100); // масштабировать значение в соответствии с масштабом связи int scaled_flow = int (percent_seen * msg_max_val); если (scaled_flow> msg_max_val) {scaled_flow = msg_max_val; } if (scaled_flow = 0) frac = (val - int (val)) * precision; иначе frac = (int (val) - val) * точность; Serial.println (frac, DEC); }

Вот код левого контрольного сигнала. Выполните те же шаги, что и выше, для левого контрольного индикатора. Как видите, единственная разница - это адрес, на который контрольный прибор отправляет свои результаты.

/ ** Программа, которая использует Photogate для проверки контрольных

* / #include #include #include #include RF24 radio (9, 10); // CE, CSN адрес константного байта [6] = "00001"; // --- программные константы --- // время const int string_check_time = 1; const int flow_check_time = 30; const int base_delay = 5; const int flow_check_delay = 0; const int GATE_PIN = 6; const int GATE_PIN_2 = 7; const int max_when_testing = время_проверки * 0,6; // установить переменную выше на основе ваших собственных экспериментальных испытаний const int max_in_flow = min (max_when_testing, int (flow_check_time / string_check_time)); const int msg_max_val = 9; // const int string_thresh = 20; #define STRING_THRESH 0.2 // --- программные переменные --- int num_string_seen = 0; int num_loops = 0; void setup () {// while (! Serial); // для флоры // delay (500); num_string_seen = 0; num_loops = 0;

pinMode (GATE_PIN, ВХОД);

pinMode (GATE_PIN_2, ВХОД); Serial.begin (115200); // для отладки radio.begin (); radio.openWritingPipe (адрес); radio.setPALevel (RF24_PA_MIN); radio.stopListening (); } void loop () {// поместите сюда ваш основной код для повторного запуска: if (num_loops% string_check_time == 0) {// проверьте состояние строки check_string (); } if (num_loops == flow_check_time) {// проверять поток //Serial.println(num_string_seen); int flow_num = explore_flow (); // отправляем значения send_out (flow_num); // сбросить переменные num_string_seen = 0; num_loops = 0; задержка (flow_check_delay); } num_loops ++; задержка (base_delay); } / * * Метод проверки, пересекает ли строка ворота * / void check_string () {int string_state = digitalRead (GATE_PIN); //Serial.println(string_state); если (string_state == 0) {num_string_seen ++; //Serial.println("Пила строка! "); }

int bot_state = digitalRead (GATE_PIN_2);

если (bot_state == 0) {num_string_seen--; //Serial.println(" строка внизу! "); } //Serial.print("Счетная строка проходит: "); //Serial.println(num_string_seen); возвращение; } / * * Метод для анализа того, какая часть времени строка покрывала вентиль * / int explore_flow () {double percent_seen = double (num_string_seen) / max_in_flow; Serial.print ("Процент покрытия:"); printDouble (percent_seen, 100); // масштабировать значение в соответствии с масштабом связи int scaled_flow = int (percent_seen * msg_max_val); если (scaled_flow> msg_max_val) {scaled_flow = msg_max_val; } if (scaled_flow = 0) frac = (val - int (val)) * precision; иначе frac = (int (val) - val) * точность; Serial.println (frac, DEC); }

Шаг 5: Сборка Telltale

Telltale Assembly
Telltale Assembly

Отдельные части

  • Контрольная рамка
  • Пряжа
  • Построенная контрольная цепь
  • Аккумуляторная батарея
  • Электроизоляционная лента
  • Эпоксидная смола или клей

STL для 3D-печати контрольных компонентов

  • STL для контрольной рамки: слева, справа
  • STL для блока электроники: верх, низ

Руководство по сборке

  1. Поместите стержневые магниты в прорези на 3D-печатной контрольной рамке. Убедитесь, что магниты правильно выровнены между правой и левой рамками, затем используйте эпоксидную смолу (или клей), чтобы прикрепить магниты к рамке. Дайте эпоксидной смоле (или клею) полностью застыть.
  2. Поместите фото прерыватели в верхнюю и нижнюю прорези на задней стороне рамки. Тщательно смонтируйте (или приклейте) платы фотопрерывателя к раме. Дайте эпоксидной смоле (или клею) полностью схватиться
  3. Отрежьте ~ 7 дюймов пряжи. Свяжите один конец пряжи на выемке первой вертикальной полосы. Отрежьте небольшой кусок изоленты и намотайте изолентой на участок пряжи, который будет в области фотоэлементов. Проденьте пряжу через рамку так, чтобы она проходила через щель заслонки фотопрерывателя.
  4. Поместите стержневые магниты в прорези на дне блока электроники, напечатанного на 3D-принтере. Убедитесь, что магниты правильно выровнены между правой и левой коробками, затем используйте эпоксидную смолу (или клей), чтобы прикрепить магниты к раме. Дайте эпоксидной смоле (или клею) полностью застыть.
  5. Поместите собранную контрольную цепь в блок электроники, совместив различные компоненты с их гнездами. Закройте коробку крышкой для электроники, напечатанной на 3D-принтере. Закрепите аккумулятор эпоксидной смолой (или приклейте) к верхней части коробки, чтобы выключатель был открыт.

Шаг 6: оборудование динамика

Спикер Аппаратное обеспечение
Спикер Аппаратное обеспечение
Спикер Аппаратное обеспечение
Спикер Аппаратное обеспечение
Спикер Аппаратное обеспечение
Спикер Аппаратное обеспечение

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

Затем соберите схему, как показано на схеме выше, обращаясь к фотографиям готовых схем.

Инструкции по сборке платы

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

  1. Arduino Nano необходимо разместить напротив верхнего края платы в центре так, чтобы штифт Vin располагался на G16. Это позволит легко перепрограммировать Arduino Nano после сборки схемы.
  2. Плата nRF24L01 должна быть размещена в правом нижнем углу платы, охватывающей восемь позиций от C1 до D5. Это оставит nRF24L01 свисающим с прототипной платы, чтобы обеспечить лучшую беспроводную связь.
  3. Батарейный блок для акустической системы питает обе прототипы, поэтому обязательно подключите две шины / контакты GND Arduino Nano и контакты Vin к источнику питания.
  4. Для «нижней» цепи потенциометр должен быть размещен на верхней части платы, обращенной наружу, так, чтобы его контакты находились в положениях J2, J4 и J6.

    1. J2: выход Arduino Nano с цифрового контакта 3 (D3)
    2. J4 вывод базы транзистора 2N3904
    3. J6 ↔ не подключен
  5. Для «верхней» цепи потенциометр следует разместить на нижней части платы, обращенной наружу, так, чтобы его контакты находились в положениях J9, J11 и J13.

    1. J13: выход Arduino Nano с цифрового контакта 3 (D3)
    2. J11 вывод базы транзистора 2N3904
    3. J9 ↔ не подключен

Шаг 7. Программное обеспечение динамика

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

#включают

#include #include RF24 radio (7, 8); // CE, CSN // левый контрольный сигнал, верхняя плата динамика, адрес константного байта [6] = "00001"; const int pitch = 2000; const int pitch_duration = 200; const int динамик = 3; const int delay_gain = 100; int status = 0; int cur_delay = 0; char read [2]; void setup () {pinMode (динамик, ВЫХОД); Serial.begin (115200); Serial.println («Запуск беспроводной связи…»); radio.begin (); radio.openReadingPipe (0, адрес); radio.setPALevel (RF24_PA_MIN); radio.startListening (); } void loop () {if (radio.available ()) {radio.read (& читать, sizeof (читать)); status = (int) (читать [0] - '0'); Serial.print ("Получено:"); Serial.println (статус); cur_delay = delay_gain * статус; } если (cur_delay) {тон (динамик, высота, продолжительность); задержка (cur_delay + pitch_duration); Serial.println («Гудок!»); }}

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

#включают

#include #include RF24 radio (7, 8); // CE, CSN // правый контрольный сигнал, нижняя плата динамика const byte address [6] = "00010"; const int pitch = 1500; const int pitch_duration = 200; const int динамик = 3; const int delay_gain = 100; int status = 0; int cur_delay = 0; char read [2]; void setup () {pinMode (динамик, ВЫХОД); Serial.begin (115200); Serial.println («Запуск беспроводной связи…»); radio.begin (); radio.openReadingPipe (0, адрес); radio.setPALevel (RF24_PA_MIN); radio.startListening (); } void loop () {if (radio.available ()) {radio.read (& читать, sizeof (читать)); status = (int) (читать [0] - '0'); Serial.print ("Получено:"); Serial.println (статус); cur_delay = delay_gain * статус; } если (cur_delay) {тон (динамик, высота, продолжительность); задержка (cur_delay + pitch_duration); Serial.println («Гудок!»); }}

Шаг 8: Сборка динамика

Отдельные части

  • 2 построенные схемы громкоговорителей
  • 2 динамика
  • 1 аккумулятор

STL для 3D-печати

  • Коробка сверху
  • Дно коробки

Инструкции по физической сборке

  1. Осторожно поместите схемы громкоговорителей в нижнюю часть коробки, одна плата должна быть поверх другой, так, чтобы ручки регулировки громкости находились рядом друг с другом и входили в отверстия. Микросхемы связи должны быть открыты на задней стороне коробки.
  2. Разместите динамики слева и справа от монтажной платы, убедившись, что динамики соответствуют правильным сторонам. Совместите динамики с пазами по бокам коробки.
  3. Пропустите провода аккумуляторной батареи через небольшое отверстие в задней части коробки. Закрепите аккумулятор эпоксидной смолой (или приклейте) к задней части коробки, чтобы выключатель был открыт.
  4. Поместите 3D-печатную коробку сверху над нижней частью коробки, чтобы в ней было все.

Шаг 9: Настройка / монтаж

Настройка / Монтаж
Настройка / Монтаж
  1. Включите контрольные лампы, повернув переключатели на аккумуляторных батареях в положение «ON». Сделайте то же самое для динамика в сборе, чтобы включить систему вывода.
  2. Монтаж звуковых сигнальных устройств проще всего выполнить двумя людьми, но можно и одним. При установке на стаксель без закрутки контрольные приборы легче всего установить до подъема паруса.
  3. Чтобы убедиться, что контрольная рамка ориентирована правильно, посмотрите на выемку на одной из вертикальных полос. При удерживании рамы вертикально выемка должна быть направлена вверх. Сторона рамы с этой планкой также должна быть обращена к передней части лодки.
  4. Поместите один из контрольных сигналов на желаемой высоте и в нужном месте на парусе. Его следует разместить так, чтобы пряжа находилась на том же месте, что и в традиционном сказке.
  5. Однажды у вас будет одна сказка в желаемой позиции. Поместите другой сказочный материал с другой стороны паруса, точно напротив того, который вы разместили, так, чтобы магниты выровнялись. Как только магниты соединятся, они должны надежно удерживать раму на парусе. Выровняйте магниты корпусов электроники по каждой из сторон паруса так, чтобы они также соединялись.
  6. Если вы заметили, что, когда струна течет прямо назад, она не пересекает верхние ворота, поверните контрольную рамку так, чтобы задняя половина рамки была направлена вниз. Поворачивайте рамку до тех пор, пока нить не пройдет через верхний фотопрерыватель, когда нить потечет обратно.

Шаг 10: Устранение неполадок

Все фрагменты кода имеют операторы отладочной печати, указывающие, что они отправляют, получают и обрабатывают данные. Открытие COM-порта с помощью Arduino IDE с одной из подсистем Arduino Nano, подключенной к компьютеру, позволит вам просматривать эти сообщения о состоянии.

Если система не работает должным образом, переключите переключатели на всех компонентах.

Шаг 11: возможные следующие шаги

  • Гидроизоляция
  • Связь на большие расстояния. Wi-Fi будет многообещающим вариантом.
  • Наша текущая установка в настоящее время использует 2 фото прерывателя на контрольный прибор. Было бы интересно попробовать добавить в систему больше фото прерывателей.

Рекомендуемые: