Skocz do zawartości

"Elektroniczny patefon" na bazie czujnika odległości HC-SR04


Pomocna odpowiedź

Zabawy z czujnikiem HC-SR04 skłoniły mnie do refleksji, czy za jego pomocą możliwe byłoby zarejestrowanie dźwięku. 

Oczywiste jest, że można byłoby stwierdzić, czy "radio gra" kierując odpowiednio czujnik na membranę głośnika. Mniej oczywisty, ale chyba relatywnie prosty byłby (obarczony błędem ma się rozumieć) pomiar głośności. Zastanawiam się jednak, czy czujnik byłby w stanie zarejestrować drgania głośnika na tyle precyzyjnie, aby wykonać analogowe nagranie. Aby to sprawdzić konieczne jest zapisanie odczytów czujnika na jakimś nośniku, a potem odtworzyć i zobaczyć co słychać. Czy moglibyście proszę polecić jakąś dobrą i PROSTĄ metodę/moduł Arduino do zapisywania danych z portu szeregowego Arduino do pliku oraz wysyłania danych na port Arduino z zapisanego pliku? 

Link to post
Share on other sites
15 minut temu, Adder napisał:

Czy moglibyście proszę polecić jakąś dobrą i PROSTĄ metodę/moduł Arduino do zapisywania danych z portu szeregowego Arduino do pliku oraz wysyłania danych na port Arduino z zapisanego pliku? 

Zapomniałeś napisać kto ma to zapisywać... U mnie na Linuksie to po prostu dwa polecenia (stty i cat), prościej się raczej nie da 😉 A jeśli chcesz się bawić pythonem to pyserial.

 

  • Lubię! 1
Link to post
Share on other sites

Hm, a jak myślisz, co dostaniesz z powrotem, po odbiciu swoich ultradźwięków od drgającej membrany? Załóżmy, że wysyłasz czysty prążek 40kHz a odbijasz się od przeszkody drgającej na 1kHz. Czy możesz narysować widmo tego sygnału? To tylko tak na próbę, pierwsze z brzegu pytanie, czy w ogóle wiesz o czym mówisz.

  • Lubię! 1
Link to post
Share on other sites
(edytowany)

@marek1707

6 godzin temu, marek1707 napisał:

Hm, a jak myślisz, co dostaniesz z powrotem, po odbiciu swoich ultradźwięków od drgającej membrany? 

Przyjmuję 4 hipotezy:

1. Otrzymam przypadkową zmianę czasu pomiędzy odbiorem kolejnych impulsów z czujnika (przypadkowe odległości od membrany głośnika w chaotycznym układzie). Wtedy czujnik może w teorii przekazywać wyłącznie sygnał 0-1 - "radio gra/radio nie gra".

2. Otrzymam przypadkową zmianę jak w 1 z tą różnicą, że wprawdzie odległości będą przypadkowe, ale rytm ich zmian będzie się pokrywał z ruchem membrany. Wtedy uda mi się zapisać rytm (dajmy na to melodii)

3. Otrzymam zmiany w rytmie jak pkt 2, ale wartości będą odpowiadały wychyleniom membrany, przy czym będą one na tyle nieprecyzyjne, że co najwyżej pozwolą na odtworzenie rytmu i głośności

4. Otrzymam to co w 3, ale zmiany będą wystarczająco precyzyjne, że odtworzą nie tylko rytm, głośność, ale także melodię. Liczę tu również na wpływ ruchu powietrza przy membranie na wynik pomiaru. 

Być może uda się tylko pozytywnie zweryfikować hipotezę 1. Nie wiem..., chcę to sprawdzić.

Za eksperymentem, kryje się również chęć nauczenia się obsługi portu szeregowego Arduino w zakresie zapisu/odczytu do/z pliku, czego bardzo zabrakło mi w kursie, a co wydaje mi się jakimś technicznym fundamentem. W tym kontekście wynik jaki otrzymam jest wtórny, bo wiedza już zostanie.  🙂

Mam też pomysł na kolejny projekt - zrobienie zdjęcia tym czujnikiem. Niestety, aby go zrealizować muszę najpierw nauczyć się zapisywać dane, a potem przetwarzać je graficznie. Ale to już będzie Gubałówka, bo trzeba będzie w tym celu zbudować robota przesuwającego czujnik w ten sposób, aby skutecznie skanował przestrzeń np. linia po linii w zadanych odstępach, na razie chcę wejść na górkę za domem. 

@ethanak

8 godzin temu, ethanak napisał:

U mnie na Linuksie to po prostu dwa polecenia (stty i cat), prościej się raczej nie da 😉 A jeśli chcesz się bawić pythonem to pyserial.

 

Dziękuję za odpowiedź. Jestem zielony z programowania, a moje umiejętności sprowadzają się do chwiejnych kroków w Arduino IDE. Python to na razie za wysokie progi... Zauważyłem, że środowisko Arduino IDE nie daje oczywistych możliwości pracy z plikiem danych jakie pojawiają się na porcie szeregowym (jak np. zapisanie stanów pinu na komputerze). To jest dysfunkcja tego środowiska, która mi bardzo przeszkadza. Potrzebuję podpowiedzi na poziomie dziecka. 🥺

 

   

Edytowano przez Adder
  • Lubię! 1
Link to post
Share on other sites
2 godziny temu, Adder napisał:

Zauważyłem, że środowisko Arduino IDE nie daje oczywistych możliwości pracy z plikiem danych jakie pojawiają się na porcie szeregowym (jak np. zapisanie stanów pinu na komputerze). To jest dysfunkcja tego środowiska, która mi bardzo przeszkadza.

A ja zauważyłem, że nie piecze ciastek według przepisów w EEPROMie, nie śpiewa kołysanek zależnie od stanu pinów, ani nie recytuje haiku w języku oryginalnym po otrzymaniu stanu napięcia na pinie ADC podłączonego Arduino. Pewnie nie robi jeszcze wielu rzeczy, do których nie zostało zaprojektowane... natomiast doskonale[1] robi to, do czego zostało zaprojektowane, czyli pozwala na edycję[2], wgranie do Arduino i obserwowanie efektów działania napisanego przez siebie (albo kogoś innego) programu. Czy do dysfunkcja środowiska czy użytkownika wymagającego, aby program robił Wszystko O Czym Tylko Zamarzy™?

3 godziny temu, Adder napisał:

Jestem zielony z programowania

Jeśli bierzesz się za tworzenie dość nietypowych programów (jak np. pomiar prędkości za pomocą czujnika odległości) to wybacz - nie uwierzę. A jeśli nawet - to już najwyższy czas zmienić kolor 😉

3 godziny temu, Adder napisał:

Python to na razie za wysokie progi...

Bardzo dobrze napisałeś: na razie. Czyli pewnie nadchodzi czas, aby się na te wysokie progi zacząć wdrapywać...

Niestety - cała zabawa z tym programowanie polega na tym, że się pisze programy a nie szuka gotowców po necie i ma się pretensje do całego świata że ktoś tego śmiał jeszcze nie napisać.

3 godziny temu, Adder napisał:

Przyjmuję 4 hipotezy:

Zapomniałeś o piątej - czyli dostaniesz sieczkę nie pozwalającą na odróżnienie włączonego od wyłączonego.

Ale spokojnie - jeśli masz do dyspozycji porządny głośnik basowy (taki co mu się pasmo od góry kończy poniżej 100 Hz, skok membrany to pół metra a współpracujący wzmacniacz to przynajmniej kilowat) to ustawiając czujnik dostatecznie blisko głośnika (nie za blisko, żeby go ruch powietrza nie wysłał na orbitę) będziesz w stanie policzyć BPM-y na koncercie Martyniuka z dokładnością jakieś 50%. Co prawda dużo lepiej nadaje się do tego mikrofonik za 50 groszy, czy nawet samodzielnie wykonany mikrofon z paru metrów drutu i magnesu... ale cóż, próbuj!

3 godziny temu, Adder napisał:

uda mi się zapisać rytm (dajmy na to melodii)

Z czystej ciekawości: co to jest rytm melodii?

---

[1]Wiem, sprawa dyskusyjna, ale dla dobra śledztwa uznajmy tymczasowo owo stwierdzenie za prawdziwe

[2]Tak, pozwala, do tego służy taka opcja w preferencjach "Użyj zewnętrznego edytora" 🙂

 

  • Lubię! 1
Link to post
Share on other sites
59 minut temu, ethanak napisał:

A ja zauważyłem, że nie piecze ciastek według przepisów w EEPROMie, nie śpiewa kołysanek ...

 

Tak, wiem... Dysfunkcja to złe słowo. Po prostu brakuje mi opcji w rodzaju Monitor portu szeregowego - zapisz w pliku

1 godzinę temu, ethanak napisał:

Jeśli bierzesz się za tworzenie dość nietypowych programów (jak np. pomiar prędkości za pomocą czujnika odległości) to wybacz - nie uwierzę. A jeśli nawet - to już najwyższy czas zmienić kolor 😉

Moje umiejętności są szkolne bez żadnej praktyki. Nic ponadto. Uczyłem się C++ przez kilka miesięcy, dawno temu. Zauważyłem jednak, że programowanie sprawia mi przyjemność i przychodzi łatwo. Swobodnie poruszam się po kodzie, dość łatwo łapię istotę działania, strukturę. Takie tam wrodzone preferencje.

1 godzinę temu, ethanak napisał:

Bardzo dobrze napisałeś: na razie. Czyli pewnie nadchodzi czas, aby się na te wysokie progi zacząć wdrapywać...

Niestety - cała zabawa z tym programowanie polega na tym, że się pisze programy a nie szuka gotowców po necie i ma się pretensje do całego świata że ktoś tego śmiał jeszcze nie napisać.

Tak, trzeba się za to wziąć... Ale brak czasu...😟

Wiem, że to nie jest najlepsza cecha, ale szukanie gotowych rozwiązań w internecie nudzi mnie i irytuje. Wolę przeczytać kilka razy podręcznik w rodzaju "kursu dla początkujących" do momentu aż mi się wydaje, że zrozumiałem i próbować samemu. Jeśli już, to małe fragmenty kodów z książki wklejam czasem tylko z lenistwa. Jak piszę program to mnie cały czas coś goni, nurtuje, jak w gorączce. Robię coś działającego, a dopiero potem poprawiam 100 razy.

1 godzinę temu, ethanak napisał:

Zapomniałeś o piątej - czyli dostaniesz sieczkę nie pozwalającą na odróżnienie włączonego od wyłączonego.

Jest taka opcja...😟

 

1 godzinę temu, ethanak napisał:

Z czystej ciekawości: co to jest rytm melodii?

 

Rytm to tempo nadawane przez instrumenty rytmiczne jak perkusja, bas etc Melodia to wypełnienie rytmu innymi dźwiękami. Tak sobie wykombinowałem... 🤣

 

Dziękuję za wskazówki!!!

Link to post
Share on other sites

Poniżej Miś, który otwiera oczy (ze zdumienia) niedowiarkom... 😀😀😝

Hipoteza 0: "Sieczka, która nie pozwala na odróżnienie włączonego od niewłączonego" - obalona

Hipoteza 1: "Radio gra/ radio nie gra" - potwierdzona

 ✊ Youuhu!

--- Hipoteza 2 też już jest praktycznie potwierdzona, ale nie śpieszmy się..., muszę zrobić trochę ładu na biurku i jakiś wyświetlacz poziomu głośności. 😀

  • Lubię! 2
Link to post
Share on other sites
(edytowany)

Dzień dobry!

Co sądzicie o wykorzystaniu środowiska Processing IDE https://processing.org do komunikowania z portem szeregowym Arduino na potrzeby tego projektu? Czy to ma sens, czy pcham się w mało perspektywiczne rozwiązanie? Biorąc pod uwagę, że wkrótce będę potrzebował trochę grafiki (zdjęcie czujnikiem) może i warto się w to trochę wgryźć... Widzę też, że z zapisem do pliku sobie bardzo ładnie radzi przez bibliotekę serial...🤔

Edytowano przez Adder
Link to post
Share on other sites

A jeszcze tak zapytam. Czy budował ktoś własny system prowadnic liniowych dla ruchu w pionie i poziomie? Rzuciłem okiem na sklep Botlandu i gotowe systemy. Jak mawiał Ferdynand Kiepski "To nie są tanie rzeczy".....😲

Link to post
Share on other sites
(edytowany)

Ale numer! Jakikolwiek dłuższy kod w loop() oprócz czytania z czujnika zaburza pobieranie odczytów z samego czujnika. Prawdopodobnie poprzez opóźnienia w wysyłaniu impulsów. 

Zacząłem pisać kod "wyciszający szum" w warunkach braku dźwięku z głosnika i odczyty natychmiast zaczynają skakać. Gdy w loop() jest tylko odczyt wszystko wraca do normy, czyli do równego "szumu", gdy "radio nie gra". 

Zauważyłem też, że stabilizacja odcztów zajmuje jakiś czas (krótki) po uruchomieniu programu, kiedy odczyty mocno "skaczą".  

Wniosek: Wszystkie operacje związane z obróbką otrzymywanych sygnałów muszą być dokonane PO ich zapisie. Czas na plik, uhhh...  

Najlepiej by było, gdyby odczyt sobie chodził równomiernie w tle. Może te "przerwania" by pomogły? Ale jeszcze do nich nie doszedłem w kursie. Kurczę, ale dyletant ze mnie...

Edytowano przez Adder
Link to post
Share on other sites
(edytowany)

Dobry wieczór!

No i udało się przesłać dane z Arduino IDE do Processing IDE. Tak przyznaję, ściągałem, ale skąd się uczyć!!!???😝

Trochę czasu zajęło mi znalezienie portu, na którym siedzi Arduino. U mnie to port numer 3, znaczy się 2.

Zasmuciło mnie, że gdy Processing czyta dane z portu, Kreślarka Arduino nie działa i odwrotnie. Te dwa programy zajmują port na zasadzie, kto pierwszy ten lepszy...

Teraz pozostaje zapisać tą sieczkę (nie, to był sarkazm, tak naprawdę to jest ładny równy szum - niestety nie mogę teraz puścić Nirvany na cały regulator🤔) do pliku. Martwi mnie tylko, że wszystko działa TAK WOLNO. No, ale może jak się nie będzie wyrzucało danych na konsolę Processing, to coś z tych danych zostanie...

 

Edytowano przez Adder
Link to post
Share on other sites
(edytowany)

Mam już ładny plik .csv ...

ArduinoData-Noise.thumb.png.2ff7c094b31063ee703cfb5923678901.png

Teraz trzeba coś nagrać, obrobić sygnał i wysłać z powrotem.. 🤔🤔

 

Zapomniałem dodać, że bez wyświetlania danych na konsoli transfer jest dużo, dużo szybszy...

Edytowano przez Adder
Link to post
Share on other sites
(edytowany)

Dobry wieczór!

Dawno mnie tu nie było. Walczyłem z portem szeregowym. Zacięta bestyja. 

Moje Arduino IDE już się grzecznie i bez kopania w podbrzusze komunikuje z Processing IDE . 

Chciałem trochę "ucywilizować" pobieranie danych z Arduino. Jest więc i "shakehand" i cały system do nagrywania i odtwarzania z przyciskami. Namęczyłem się strasznie, ale warto było! Poniżej wklejam dane z konsoli Processing. To działa i plik też się zapisuje poprawnie! 😀😀😀

Idle.Action requested...
Recording...
Arduino Data: 363,356,362,362,356,362,362,356,362,362,356,362,362,362,356,362,362,356,362,362,356,362,362,356,362,362,332,338,362,332,357,362,362,332,362,338,
Return to Idle. Action requested...
Recording...
Arduino Data: 335,356,335,335,356,362,362,356,362,362,356,362,335,356,362,362,356,355,362,362,356,362,338,356,362,362,332,362,362,332,338,338,332,338,363,332,338,338,332,338,363,332,338,338,332,362,362,332,338,
Return to Idle. Action requested...

Nie mam na dzisiaj pomysłu jak usunąć ten przecinek na końcu pliku .csv, jestem wymęczony programowaniem - ale pewnie dam sobie radę. 

Teraz mam dylemat: Czy skoncentrować się na nauce wizualizacji danych w Processing (bardzo kuszące). Czy napisać obsługę przycisku play na Arduino (trochę się boję końcowego efektu..😝). 

Poniżej aktualny stan kodów:

Arduino:


#define trigPin 12
#define echoPin 11
#define recordPin 8
#define playPin 9
#define stopPin 10
#define redLed 2
#define greenLed 4

#define Rec 100
#define Play 101
#define Stop 102

unsigned long GetTime() {

  unsigned long Time; 
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(20);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  Time = pulseIn(echoPin, HIGH);
  
  return Time;
 
 }



boolean RecordingConfirmed(){

  boolean Connection=false;
  String Signal;

  while (!Connection) {
  
  if (Serial.available()<=0) {
  Serial.println("R");
  delay(200);
  
} else {
    Signal=Serial.readString();
    Signal.trim();
    if (Signal=="C") {
       digitalWrite(greenLed,HIGH);
       delay(50);
       digitalWrite(greenLed,LOW);
       digitalWrite(redLed,HIGH);
       Connection=true;
}  
}   
}
  return Connection;
}


void Record(){
  
  do {

    digitalWrite(redLed,LOW);
    delay(50);
    digitalWrite(redLed,HIGH);
    delay(50);
  Serial.print(GetTime());
  Serial.print(",");
} while (digitalRead(stopPin)==HIGH);

  Serial.println();
  digitalWrite(redLed,LOW);
}

void setup() {
  
  Serial.begin (9600);
  while (!Serial);
  
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  pinMode(recordPin, INPUT_PULLUP);
  pinMode(playPin, INPUT_PULLUP);
  pinMode(stopPin, INPUT_PULLUP);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);

  digitalWrite(redLed, LOW);
  digitalWrite(greenLed,LOW); 
}


void loop() {

  if (digitalRead(recordPin)==LOW) {
    
  if (RecordingConfirmed()) Record();
    
}
  if (digitalRead(playPin)==LOW) {
    
}
  if (digitalRead(stopPin)==LOW) {
    
}
    
}

Processing: 

import processing.serial.*;

PrintWriter output;
Serial ArduinoPort;
String Mode="Idle";
String ArduinoData;



void GetMode() {
   
  String Signal;
 
    while (ArduinoPort.available()>0) { 
     
    Signal = ArduinoPort.readStringUntil('\n');
     if (Signal != null) {
         Signal=trim(Signal);
      
         if (Signal.equals("R")) {
         ArduinoPort.write("C"); 
         ArduinoPort.clear();
         Mode="Rec";
         delay(10);
         java.awt.Toolkit.getDefaultToolkit().beep();
       
}
         if (Signal.equals("P")) {
         ArduinoPort.write("C"); 
         ArduinoPort.clear();
         Mode="Play";
         delay(10);
         java.awt.Toolkit.getDefaultToolkit().beep();
       
}   
}
}
} 


void Record() {
  
  
  output=createWriter ("ArduinoData.csv");
  
  if (ArduinoPort.available()>0) {
     println("Recording...");
     while(Mode=="Rec") {
     ArduinoData = ArduinoPort.readStringUntil('\n'); 
     if (ArduinoData !=null) {
     ArduinoData=trim(ArduinoData);
     output.print(ArduinoData);
     output.flush();
     output.close();
     ArduinoPort.clear();
     Mode="Idle";
     println("Arduino Data: " + ArduinoData);
     println("Return to Idle. Action requested...");
}   
}
  
 
  
}
}  



void setup() {
  
  String ArduinoSignal = Serial.list()[2]; 
  ArduinoPort = new Serial(this, ArduinoSignal, 9600);
  println("Idle.Action requested...");
  
} 

void draw() {
  switch (Mode) {
    
  case "Idle": {
    GetMode();
    break;
}
  case "Rec": {
    Record();
    break;
}

case "Play": {
    println (Mode);
    break;
}
     
}
}

Dużo w nich jeszcze śmiecia, ale na cyzelowanie przyj∂zie czas...

Ogólnie jestem zadowolony. 🙂

 

Edytowano przez Adder
Link to post
Share on other sites
3 minuty temu, Adder napisał:

Nie mam na dzisiaj pomysłu jak usunąć ten przecinek na końcu pliku .csv

bool przecinek;

for (przecinek = false,cośtam; cośtam; cośtam, przecinek = true) {
	// cośtam
	if (przecinek) Serial.print(",");
	Serial.print(cośtam);
}

Taki mój sposób 🙂

 

 

  • Lubię! 1
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.