Spisu treści:

Sygnały dźwiękowe do żeglowania: 11 kroków
Sygnały dźwiękowe do żeglowania: 11 kroków

Wideo: Sygnały dźwiękowe do żeglowania: 11 kroków

Wideo: Sygnały dźwiękowe do żeglowania: 11 kroków
Wideo: Teoria żeglowania - Jak działa żagiel? S01E08 2024, Listopad
Anonim
Image
Image
Sprzęt Telltale
Sprzęt Telltale

Telltales to kawałki sznurka używane w żeglarstwie, które wskazują, czy na żaglu występuje przepływ turbulentny czy laminarny. Jednak różnokolorowe kawałki przędzy przymocowane do każdej strony żagla są czysto wizualnymi wskaźnikami. Te słyszalne wskaźniki są urządzeniem pomocniczym, które ma na celu przekazywanie informacji wizualnych w formie słuchowej zarówno dla żeglarzy widzących, jak i niedowidzących, takich jak Pauline.

Urządzenie składa się z systemu wejściowego, który odczytuje ruch wskaźnika, oraz systemu wyjściowego, który emituje serię sygnałów dźwiękowych przekazujących informacje o przepływie powietrza.

Do wykonania tego urządzenia wymagany jest dostęp do sprzętu lutowniczego i drukarki 3D.

Krok 1: Zestawienie materiałów

BOM z linkami i cenami

Uwaga: będziesz potrzebować 2 zestawów wszystkich poniższych.

System wejściowy

  • Arduino Nano
  • Adafruit perma-proto połówkowa płytka stykowa PCB
  • Bezprzewodowy moduł nadawczo-odbiorczy nRF24L01
  • Przerywacz zdjęć
  • Sparkfun Photo Interrupter Breakout Board
  • Akumulator 9V kompatybilny z Arduino
  • Bateria 9V
  • Kilka długości drutu 22 Gauge
  • Przędza
  • Magnesy neodymowe
  • epoksydowe

System wyjściowy

  • Arduino Nano
  • Adafruit perma-proto połówkowa płytka stykowa PCB
  • Bezprzewodowy moduł nadawczo-odbiorczy nRF24L01
  • Akumulator 9V kompatybilny z Arduino
  • Potencjometr 1K Ohm
  • Rezystor 120 Ohm
  • Tranzystor 2N3904
  • Kondensator 0,1 uF
  • Głośnik kompatybilny z Arduino

Pliki GitHub

  • Cały kod i pliki STL potrzebne do skonstruowania tych wskaźników można znaleźć w tym repozytorium GitHub.
  • Potrzebne będą dwa zestawy obudów i jeden z obudów głośników.

Krok 2: Narzędzia/Maszyny/Wymagania dotyczące oprogramowania

Aby zaprogramować Arduino, musisz pobrać Arduino IDE. Link do pobrania można znaleźć tutaj.

Aby zaprogramować moduł nRF24L01, musisz pobrać jego bibliotekę przez Arduino IDE. Narzędzia > Zarządzaj bibliotekami… > zainstaluj bibliotekę RF24

Do montażu elementów elektronicznych wymagany jest dostęp do podstawowych narzędzi lutowniczych. Przydatna może być również pompa rozlutowująca, ale nie jest to konieczne.

Aby skonstruować ramkę ostrzegawczą i obudowę głośnika, potrzebujesz dostępu do drukarki 3D.

Krok 3: Sprzęt Telltale

Sprzęt Telltale
Sprzęt Telltale
Sprzęt Telltale
Sprzęt Telltale

Zmontuj obwód zgodnie z powyższymi schematami. Arduino Nano powinien być wyrównany z górną częścią płyty prototypowej. Dzięki temu masz dostęp do portu USB nawet po podłączeniu całej elektroniki.

Aby uniknąć zwarcia elektroniki, upewnij się, że wycięto ślady płyty prototypowej w rzędach, które zajmie nRF24, jak pokazano na powyższym obrazku.

W przeciwnym razie będziesz potrzebować kabli połączeniowych, aby podłączyć nRF24 do płyty prototypowej.

Połączenie rezystora, GND i przewody 5V do fotoprzerywacza nie są pokazane. Podłącz fotoprzerywacz, jak wskazano na jego tablicy zaciskowej. Dołączono obraz tablicy sygnalizacyjnej.

Obwody wskaźników kontrolnych prawego i lewego są dokładnie takie same.

Krok 4: Oprogramowanie Telltale

Oto kod wskaźnika właściwego. Podłącz nano wskaźnik Right telltale do komputera, otwórz Arduino IDE, skopiuj i wklej do niego ten kod i prześlij go na płytkę.

/** Program wykorzystujący fotokomórkę do badania wskaźnika ostrzegawczego

*/ #include #include #include #include RF24 radio(9, 10); // CE, stały adres bajtowy CSN[6] = "00010"; //---program consts--- //time 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 = flow_check_time * 0.6; //ustaw powyższą zmienną na podstawie własnych prób eksperymentalnych 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 //---program vars--- int num_string_seen = 0; int liczba_pętli = 0; void setup() { //while(!Serial); // dla flory //delay(500); liczba_widocznych_łańcuchów = 0; liczba_pętli = 0; pinMode(BRAMKA_PIN, WEJŚCIE); pinMode(BRAMKA_PIN_2, WEJŚCIE); Serial.początek(115200); // do debugowania radio.begin(); radio.openWritingPipe(adres); radio.setPALevel(RF24_PA_MIN); radio.stopSłuchanie(); } void loop() { //wstaw tutaj swój główny kod, aby działał wielokrotnie: if(num_loops % string_check_time == 0){ //sprawdź stan ciągu check_string(); } if(num_loops == flow_check_time){ //zbadaj przepływ //Serial.println(num_string_seen); int numer_przepływu = badanie_przepływu(); //wyślij wartości send_out(flow_num); //resetuj vars num_string_seen = 0; liczba_pętli = 0; opóźnienie(flow_check_delay); } liczba_pętli++; opóźnienie(baza_opóźnienia); } /* *Sposób sprawdzenia, czy ciąg przekracza bramkę */ void check_string(){ int string_state = digitalRead(GATE_PIN); //Serial.println(string_state); if (string_state == 0){ num_string_seen++; //Serial.println("Piła łańcuch!"); }

int bot_state = digitalRead(GATE_PIN_2);

if (stan_bota == 0){ num_string_seen--; //Serial.println("ciąg na dole!"); } //Serial.print("Liczenie ciągów ciągów: "); //Serial.println(num_string_seen); powrót; } /* * Metoda analizy, jaki ułamek czasu ciąg znaków pokrył bramkę */ int exam_flow(){ double percent_seen = double(num_string_seen)/max_in_flow; Serial.print("Procent pokrycia: "); printDouble(percent_seen, 100); //skaluj wartość do skali komunikacji int scaled_flow = int(percent_seen * msg_max_val); if(skalowany_przepływ > msg_max_val){ skalowany_flow = msg_max_val; } if(scaled_flow = 0) frac = (val - int(val)) * precyzja; w przeciwnym razie frac = (int(val)- val) * precyzja; Serial.println(frac, DEC); }

Oto kod lewego wskaźnika ostrzegawczego. Wykonaj te same czynności, co powyżej dla lewego wskaźnika ostrzegawczego. Jak widać, jedyną różnicą jest adres, na który wskaźnik wysyła swoje wyniki.

/** Program wykorzystujący fotokomórkę do badania wskaźnika ostrzegawczego

*/ #include #include #include #include RF24 radio(9, 10); // CE, stały adres bajtowy CSN[6] = "00001"; //---program consts--- //time 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 = flow_check_time * 0.6; //ustaw powyższą zmienną na podstawie własnych prób eksperymentalnych 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 //---program vars--- int num_string_seen = 0; int liczba_pętli = 0; void setup() { //while(!Serial); // dla flory //delay(500); liczba_widocznych_łańcuchów = 0; liczba_pętli = 0;

pinMode(BRAMKA_PIN, WEJŚCIE);

pinMode(BRAMKA_PIN_2, WEJŚCIE); Serial.początek(115200); // do debugowania radio.begin(); radio.openWritingPipe(adres); radio.setPALevel(RF24_PA_MIN); radio.stopSłuchanie(); }void loop() { // wstaw tutaj swój główny kod, aby działał wielokrotnie: if(num_loops % string_check_time == 0){ //sprawdź stan ciągu check_string(); } if(num_loops == flow_check_time){ //zbadaj przepływ //Serial.println(num_string_seen); int numer_przepływu = badanie_przepływu(); //wyślij wartości send_out(flow_num); //resetuj vars num_string_seen = 0; liczba_pętli = 0; opóźnienie(flow_check_delay); } liczba_pętli++; opóźnienie(baza_opóźnienia); } /* *Sposób sprawdzenia, czy ciąg przekracza bramkę */ void check_string(){ int string_state = digitalRead(GATE_PIN); //Serial.println(string_state); if (string_state == 0){ num_string_seen++; //Serial.println("Piła łańcuch!"); }

int bot_state = digitalRead(GATE_PIN_2);

if (stan_bota == 0){ num_string_seen--; //Serial.println("ciąg na dole!"); } //Serial.print("Liczenie ciągów ciągów: "); //Serial.println(num_string_seen); powrót; } /* * Metoda analizy, jaki ułamek czasu pokrył bramkę string */ int exam_flow(){ double percent_seen = double(num_string_seen)/max_in_flow; Serial.print("Procent pokrycia: "); printDouble(percent_seen, 100); //skaluj wartość do skali komunikacji int scaled_flow = int(percent_seen * msg_max_val); if(skalowany_przepływ > msg_max_val){ skalowany_flow = msg_max_val; } if(scaled_flow = 0) frac = (val - int(val)) * precyzja; w przeciwnym razie frac = (int(val)- val) * precyzja; Serial.println(frac, DEC); }

Krok 5: Montaż Telltale

Zespół Telltale
Zespół Telltale

Poszczególne części

  • Ramka Telltale
  • Przędza
  • Zbudowany obwód ostrzegawczy
  • Paczka baterii
  • Taśma elektryczna
  • Epoksyd lub klej

STL do drukowania 3D charakterystycznych komponentów

  • STL dla ramki ostrzegawczej: lewy, prawy
  • STL do skrzynki na elektronikę: góra, dół

Instrukcje składania

  1. Umieść magnesy sztabkowe w szczelinach drukowanej w 3D ramki ostrzegawczej. Upewnij się, że magnesy są prawidłowo ułożone między prawą ramą a lewą ramą, a następnie użyj żywicy epoksydowej (lub kleju), aby przymocować magnesy do ramy. Pozostaw żywicę epoksydową (lub klej) do całkowitego związania.
  2. Umieść przerywacze zdjęć w górnej i dolnej szczelinie z tyłu ramki. Ostrożnie zaimpregnuj (lub przyklej) płyty przerywacza zdjęć do ramy. Poczekaj, aż żywica epoksydowa (lub klej) całkowicie zwiąże
  3. Wytnij ~7 kawałka włóczki. Zawiąż jeden koniec przędzy w nacięciu pierwszego pionowego paska. Odetnij mały kawałek taśmy elektrycznej i owiń taśmą elektryczną odcinek przędzy, który będzie w obszarze fotoprzerywaczy. Przeciągnij przędzę przez ramkę, tak aby przechodziła przez szczelinę bramki przerywacza zdjęć.
  4. Umieść magnesy sztabkowe w szczelinach dna pudełka z elektroniką wydrukowaną w 3D. Upewnij się, że magnesy są prawidłowo ułożone między prawym pudełkiem a lewym pudełkiem, a następnie użyj żywicy epoksydowej (lub kleju), aby przymocować magnesy do ramy. Pozostaw żywicę epoksydową (lub klej) do całkowitego związania.
  5. Umieść skonstruowany obwód kontrolny w pudełku z elektroniką, dopasowując różne komponenty do ich gniazd. Zamknij pudełko za pomocą wydrukowanego w 3D blatu z elektroniką. Epoksydową (lub przyklejoną) baterię do górnej części pudełka tak, aby przełącznik był odsłonięty.

Krok 6: Sprzęt głośnikowy

Sprzęt głośnikowy
Sprzęt głośnikowy
Sprzęt głośnikowy
Sprzęt głośnikowy
Sprzęt głośnikowy
Sprzęt głośnikowy

System wyjściowy składa się z dwóch obwodów głośnikowych, po jednym dla każdego wskaźnika, wyposażonych w komunikację bezprzewodową i pokrętło regulacji głośności. Najpierw przygotuj płyty prototypowe do użycia z modułami nRF24L01, tak jak zrobiliśmy to w przypadku obwodów ostrzegawczych, przecinając przewody oddzielające dwa rzędy pinów, w których zostanie umieszczona płytka.

Następnie zmontuj obwód, jak pokazano na powyższym schemacie, odwołując się do zdjęć wykonanych obwodów.

Instrukcja montażu płyty

Aby ułożyć płytki w obudowie głośnika, główne elementy muszą być umieszczone w określonych obszarach płytki. W poniższych instrukcjach będę odnosić się do układu współrzędnych używanego do oznaczania wierszy i kolumn na płycie prototypowej Adafruit:

  1. Arduino Nano musi być umieszczone na środku górnej krawędzi płytki tak, aby pin Vin znajdował się w pozycji G16. Umożliwi to łatwe przeprogramowanie Arduino Nano po zmontowaniu obwodu.
  2. Płytka nRF24L01 musi być umieszczona w prawym dolnym rogu planszy w ośmiu pozycjach od C1 do D5. Dzięki temu nRF24L01 będzie zwisał z płyty prototypowej, aby umożliwić lepszą komunikację bezprzewodową.
  3. Akumulator do systemu głośnikowego zasila obie płyty prototypowe, więc upewnij się, że podłączyłeś dwie szyny/piny GND Arduino Nano i piny Vin do zasilacza.
  4. W przypadku obwodu „dolnego” potencjometr należy umieścić na górze płytki skierowanej na zewnątrz, tak aby jego piny znalazły się w pozycjach J2, J4 i J6

    1. J2 ↔ Wyjście Arduino Nano z cyfrowego pinu 3 (D3)
    2. J4 (pin podstawowy tranzystora 2N3904)
    3. J6 (niepodłączony)
  5. W przypadku obwodu „górnego” potencjometr należy umieścić na spodzie płytki skierowanej na zewnątrz, tak aby jego piny znalazły się w pozycjach J9, J11 i J13

    1. J13 ↔ Wyjście Arduino Nano z cyfrowego pinu 3 (D3)
    2. J11 (pin podstawowy tranzystora 2N3904)
    3. J9 ↔niepodłączony

Krok 7: Oprogramowanie głośnika

Oto kod dla głośnika komunikującego się z lewą wskazówką. Podłącz Arduino Nano na płycie głośnika dolnego do komputera, otwórz Arduino IDE, skopiuj i wklej do niego ten kod i prześlij go na płytę.

#włączać

#include #include RF24 radio (7, 8); // CE, CSN //lewy wskaźnik ostrzegawczy, płyta głośnika górnego const byte address[6] = "00001"; const int skok = 2000; const int pitch_duration = 200; const int mówca = 3; const int delay_gain = 100; stan int = 0; int cur_delay = 0; odczytanie znaków[2]; void setup() { pinMode(głośnik, WYJŚCIE); Serial.początek(115200); Serial.println("Uruchamianie komunikacji bezprzewodowej…"); radio.początek(); radio.openReadingPipe(0, adres); radio.setPALevel(RF24_PA_MIN); radio.startNasłuch(); } void loop() { if(radio.available()) { radio.read(&read, sizeof(read)); status = (int)(odczyt[0]-'0'); Serial.print("Otrzymano: "); Serial.println(stan); cur_delay = opóźnienie_wzmocnienia*stan; } if (cur_delay) { ton (głośnik, wysokość tonu, czas trwania tonu); delay(cur_delay + pitch_duration); Serial.println("Brzęczyk!"); } }

Oto kod dla mówcy komunikującego się z odpowiednim wskaźnikiem. Podłącz Arduino Nano na górnej płycie głośnika do komputera, otwórz Arduino IDE, skopiuj i wklej do niego ten kod i prześlij go na płytę.

#włączać

#include #include RF24 radio (7, 8); // CE, CSN //właściwy wskaźnik ostrzegawczy, dolny głośnik płyty const byte address[6] = "00010"; const int skok = 1500; const int pitch_duration = 200; const int mówca = 3; const int delay_gain = 100; stan int = 0; int cur_delay = 0; odczytanie znaków[2]; void setup() { pinMode(głośnik, WYJŚCIE); Serial.początek(115200); Serial.println("Uruchamianie komunikacji bezprzewodowej…"); radio.początek(); radio.openReadingPipe(0, adres); radio.setPALevel(RF24_PA_MIN); radio.startNasłuch(); } void loop() { if (radio.available()) { radio.read(&read, sizeof(read)); status = (int)(odczyt[0]-'0'); Serial.print("Otrzymano: "); Serial.println(stan); cur_delay = opóźnienie_wzmocnienia*stan; } if (cur_delay) { ton (głośnik, wysokość tonu, czas trwania tonu); opóźnienie(cur_delay+pitch_duration); Serial.println("Brzęczyk!"); } }

Krok 8: Montaż głośnika

Poszczególne części

  • 2 skonstruowane obwody głośnikowe
  • 2 głośniki
  • 1 akumulator

STL do druku 3D

  • Górna część pudełka
  • Dno pudełka

Fizyczne instrukcje montażu

  1. Ostrożnie umieść obwody głośnikowe w dolnej części pudełka, jedna płytka na drugiej, tak aby pokrętła głośności znajdowały się obok siebie i wsuwały się w otwory. Chipy komunikacyjne powinny być odsłonięte z tyłu pudełka.
  2. Umieść głośniki po lewej i prawej stronie płytki drukowanej, upewniając się, że głośniki odpowiadają właściwym bokom. Dopasuj głośniki do szczelin po bokach pudełka.
  3. Przeprowadź przewody akumulatora przez mały otwór z tyłu pudełka. Żywić (lub przykleić) akumulator z tyłu pudełka tak, aby przełącznik był odsłonięty.
  4. Umieść wydrukowany w 3D wierzch pudełka na dnie pudełka, aby pomieścić wszystko.

Krok 9: Konfiguracja/Montaż

Konfiguracja/Montaż
Konfiguracja/Montaż
  1. Włącz kontrolki, przestawiając przełączniki na zestawach baterii do pozycji „ON”. Zrób to samo dla zespołu głośników, aby włączyć system wyjściowy.
  2. Montaż sygnalizatorów dźwiękowych najłatwiej wykonać w dwie osoby, ale można to zrobić z jedną. W przypadku montowania na fokarze bez rolera, przyrządy kontrolne najłatwiej byłoby założyć przed podniesieniem żagla.
  3. Aby upewnić się, że ramka ostrzegawcza jest prawidłowo zorientowana, spójrz na wycięcie na jednym z pionowych pasków. Trzymając ramę pionowo, wycięcie powinno być skierowane do góry. Strona ramy z tym drążkiem powinna być również skierowana w stronę przodu łodzi.
  4. Umieść jeden z pilotów na żądanej wysokości i pozycji na żaglu. Powinien być umieszczony tak, aby przędza znajdowała się w tym samym miejscu, w którym byłaby, gdyby była częścią tradycyjnej opowieści.
  5. Gdy już masz jedną opowieść w żądanej pozycji. Umieść drugie urządzenie ostrzegawcze po drugiej stronie żagla, dokładnie naprzeciwko pierwszego, który umieściłeś, tak aby magnesy były ustawione w jednej linii. Gdy magnesy połączą się, powinny pewnie trzymać ramę na żaglu. Wyrównaj magnesy obudów elektroniki, dla każdego elementu ostrzegawczego po obu stronach żagla, tak aby również się ze sobą łączyły.
  6. Jeśli zauważysz, że gdy sznurek płynie prosto do tyłu, nie przechodzi przed górną bramką, obróć ramkę urządzenia ostrzegawczego tak, aby tylna połowa ramki była skierowana w dół. Obracaj ramkę, aż sznurek przejdzie przez górny przerywacz zdjęć, gdy przędza spływa prosto z powrotem.

Krok 10: Rozwiązywanie problemów

Wszystkie fragmenty kodu zawierają instrukcje drukowania debugowania, które wskazują, że wysyłają, odbierają i przetwarzają dane. Otwarcie portu COM za pomocą Arduino IDE z jednym z podsystemów Arduino Nano wpiętym do komputera, umożliwi podgląd tych komunikatów o stanie.

Jeśli system nie działa prawidłowo, przełącz przełączniki na wszystkich komponentach.

Krok 11: Możliwe następne kroki

  • Hydroizolacja
  • Komunikacja o większym zasięgu. Wi-Fi będzie obiecującą opcją.
  • Nasza obecna konfiguracja wykorzystuje obecnie 2 przerywacze zdjęć na wskaźnik. Dodanie do systemu większej liczby przerywaczy zdjęć może być interesujące.

Zalecana: