Skocz do zawartości

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


Pomocna odpowiedź

(edytowany)

Dzień dobry!

Dzisiaj z rana naszła mnie taka refleksja, rada dla początkujących programistów: 

Nigdy nie bierzcie się za projekty, w których nie wiecie z góry jak napisać każdą, pojedynczą linijkę kodu, o ile nie chcecie wsiąknąć w długi, samotny i bolesny proces samokształcenia. 

Ten przypadek dotknął mnie. Nauczyłem się już:

- środowiska Processing IDE

- obsługi portu szeregowego i jego niuansów

- operowania na klasach 🤯

- radzenia sobie z systemowymi błędami kompilacji (najnowszy OSX gryzie się z funkcją size() w Proccesing 3.x) potrzebne są łaty i obejścia

- porządkowania rozrastającego się kodu...

To wszystko zamiast wziąć się za Kurs Arduino część II 😭😭😭

I ten czas! Czas magicznie przyśpieszył.... 

 

A... No i czuję się tak, jakbym dojrzewał już do tego Pythona... Coś chyba zaskoczyło mi w głowie. Zupełnie inaczej dzisiaj patrzę na wiele rzeczy niż np. miesiąc temu... 🙂

 

Edytowano przez Adder
Link to post
Share on other sites

A tu aktualny stan projektu. Zalążek Playera sygnału z HC-SR04  🙂

Zapewniam, że to będzie działać. Kiedyś...🤣😂

Player.thumb.png.c2acee07f8c33e9aee32a57c60abe8c5.png

Link to post
Share on other sites
(edytowany)

Dobry wieczór!

Wreszcie dolny wyświetlacz działa jak należy

 

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

Dobry wieczór!

Grafika powoli zaczyna być kończona. Zrobiony przycisk STANDBY. Jest trochę obciachowy, ale mam już dość tej dłubaniny (przynajmniej na dzisiaj). 🤕

Został jeszcze główny wyświetlacz. Najtrudniejsza część. Mam wiele pytań, ale nie wiem jak je zadać. Ten kod nie jest banalny (dla mnie). 

 

Edytowano przez Adder
Link to post
Share on other sites

Dzień dobry!

Aktualny stan kodu w Processing. 

import processing.serial.*;

//***GENERAL***

boolean OFF=true;
String Mode="Idle";

//***SERIAL***

PrintWriter output;
Serial ArduinoPort;
String ArduinoData;

//***INTERFACE***

movingMessage IdleMessage;
movingMessage OffMessage;
PGraphics pg;
PFont Digital;
PFont Neon;
String Message = "";

class movingMessage { 
  float x; 
  String Text;
  
  movingMessage (float _x, String _text) {  
    x = _x;
    Text = _text; 
}
  void drawMessage() { 
     
    pg.beginDraw();
    pg.clear();
    pg.background(28);
    pg.fill(3,26,26);
    pg.noStroke();
    for (int y=0; y<33; y=y+3) {
    for (int x=0; x<601; x= x+3) pg.rect(x, y, 2, 2);
}
    pg.textFont(Digital);
    pg.fill(255);
    pg.text(Text,x,24);
    pg.endDraw();
    
    image(pg,200,518);
} 

  void move_x(float amount){
    x=x+amount;
    if (x<-1200) x=600;
}
}

//***SERIAL***

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...");
}   
} 
}
}  

//***INTERFACE***

void SetupBoard() {
 
  background(28);
  Neon=createFont("NeonLight-Regular.ttf",14);
  Digital=createFont("advanced_dot_digital-7.ttf",20);
  
  fill(3,26,26);
  noStroke();
  
  for (int y=30; y<490; y=y+5) {
  for (int x=20; x<1480; x= x+7) rect(x, y, 5, 3);
}
  
  for (int y=30; y<490; y=y+5) {
  for (int x=1500; x<1530; x= x+7) rect(x, y, 5, 3);
}
  
  for (int y=30; y<490; y=y+5) {
  for (int x=1540; x<1570; x= x+7) rect(x, y, 5, 3);
}
  
  
  fill(20);
  ellipse(1300,530,14,14);
  fill(51);
  ellipse(1300,530,10,10);
  
  fill(20);
  ellipse(1400,530,14,14);
  fill(51);
  ellipse(1400,530,10,10);
  
  fill(20);
  ellipse(1540,530,34,34);
  fill(35);
  ellipse(1540,530,30,30);
  fill(152,0,2);
  ellipse(1540,530,10,10);
  
  fill(35,161,164);
  rect(10,20,1,530);
  rect(10,20,10,1);
  text("Signal", 25,20);
  
  fill(35,161,164);
  rect(190,505,1,45);
  rect(190,505,10,1);
  text("Message line", 205,505);
  
  fill(35,161,164);
  rect(1280,505,1,45);
  rect(1280,505,10,1);
  text("Record", 1300,505);
  
  fill(35,161,164);
  rect(1380,505,1,45);
  rect(1380,505,10,1);
  text("Play", 1400,505);
  
  fill(35,161,164);
  rect(1510,505,1,45);
  rect(1510,505,10,1);
  text("On/Off", 1530,505);
  
  
  rect(1490,20,1,530);
  rect(1490,20,10,1);
  text("Amp", 1505,20);
   
  fill(35,161,164);
  
  textFont(Neon);
  text("Adder PATHEPHONE", 20,550);
  
  fill(214);
  for(int y=130; y<490; y=y+5) rect(20,y,5,2);
  
  
  fill(3,26,26);
  for (int y=518; y<550; y=y+3) {
  for (int x=200; x<800; x= x+3) rect(x, y, 2, 2);
}
}

void mouseClicked() {
  
  if (OFF) {
  
    if (mouseX<1560 && mouseX>1525 && mouseY<550 && mouseY>525) {
    
    fill(100);
    ellipse(1540,530,34,34);
    fill(35);
    ellipse(1540,530,30,30);
    fill(0,150,255);
    ellipse(1540,530,10,10);
    
    Message = "Idle. Awaiting action... press Play or Record on your Arduino. Forbot rules!";
    OFF=false;
} 
} else {
  
    if (mouseX<1560 && mouseX>1525 && mouseY<550 && mouseY>525) {
    
    fill(20);
    ellipse(1540,530,34,34);
    fill(35);
    ellipse(1540,530,30,30);
    fill(152,0,2);
    ellipse(1540,530,10,10);
    Message =" ";
    OFF=true;
    
}

}
}

void setup() {
   size(1585,560,P3D);
   pg = createGraphics(600, 35);
   
  
  String ArduinoSignal = Serial.list()[2]; 
  ArduinoPort = new Serial(this, ArduinoSignal, 9600);
  println(Message);
  
  SetupBoard();
    
  
  IdleMessage=new movingMessage(600,Message);

} 

void draw() {
  
  if (!OFF) { 
    OffMessage.drawMessage();
    OffMessage.move_x(-1);  
} else {
  
  IdleMessage.drawMessage();
  OffMessage= new movingMessage(600,"Idle. Awaiting action... press Play or Record on your Arduino. Forbot rules!");
  if (Mode=="Idle") IdleMessage.move_x(-1);
}

 if (!OFF) {
  switch (Mode) {
    
  case "Idle": {
    GetMode();
    break;
}
  case "Rec": {
    Record();
    break;
}

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

 

Link to post
Share on other sites

Dobry wieczór!

Myślałem, że dzisiaj wezmę się za wyświetlacz amplitudy, ale jeszcze poprawiałem rekorder. 

W dolnej belce dodałem:

1) Ustawianie jasności paneli ledowych i oprogramowałem. Bardzo fajnie działa

2) Przycisk wgrywania zapisanego sygnału

3) Przyciski przeglądu zapisu sygnału. 

4) Powalczyłem też z mouseClicked(), mousePressed() i mouseReleased(). Sprawiło mi trochę kłopotu zrozumienie jak one naprawdę działają.

588568487_Zrzutekranu2021-02-13o21_01_29.thumb.png.775c6fd068de635554c5f97422ca5aba.png

Link to post
Share on other sites
(edytowany)

Niieee!!!!! Zostawiłem włączony komputer na noc, a w nocy wyłączyli prąd....

Cały dzień roboty w ...... Dlaczego nie wrzuciłem tu kodu??? Nie mówiąc o zapisaniu pracy😫😫😫😡.....

Uuuuuuuuhhhh!!!! Ale jestem zły!!!!

 

Edytowano przez Adder
Link to post
Share on other sites

Wyświetlacz amplitudy sygnału oprogramowany! 😀

To jakby wyjazd z drogi gruntowej na asfaltówkę. Poniżej test z losowymi wartościami.

 

 

 

Link to post
Share on other sites

Dzień dobry!

Powoli zbliżam się do końca projektu rekordera dźwięku na bazie HC-SR04. Strasznie jestem ciekawy wyniku! 😬

Pojawiła się refleksja co dalej. Opanowałem w stopniu dostatecznym Processing. To wspaniałe narzędzie i język programowania! Szkoda mi to teraz stracić - zapomnę w miesiąc o co w nim chodzi. Myślę cały czas o zdjęciu za pomocą czujnika odległości. Przy użyciu Processing to byłoby jak najbardziej możliwe. Niestety, zrobiłem mały research, z którego wynika, że koszty budowy mechaniki poruszającej w pionie i poziomie czujnikiem przerosłyby mój budżet. Rozważałem wykorzystanie części ze starej kserokopiarki, ale przeróbki zajęłyby mi chyba lata..  Można byłoby rozważyć budowę urządzenia poruszanego ręcznie, ale moje zdolności manualne są kiepskie. Nie wyobrażam sobie siebie wykonującego samodzielnie potrzebne elementy. Można byłoby też kupić jakiś zestaw "małego konstruktora" i coś skręcić, ale też mi to nie pasuje (koszty + nieprawdopodobna rzeźba). Tak więc jestem w kropce... 

Na pewno zrobię sobie jeszcze radar z fajną wizualizacją. Czyli coś, jakby zdjęcie w jednym wymiarze. Ale takie rzeczy ktoś już pewnie wcześniej robił, więc nie jest to aż tak ekscytujące.  

Proszę podpowiedzcie koledzy co byście radzili. Jak wejść na kolejny level wtajemniczenia? Na czym budować fundamenty?

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

 

6 godzin temu, Adder napisał:

Na pewno zrobię sobie jeszcze radar z fajną wizualizacją. Czyli coś, jakby zdjęcie w jednym wymiarze. Ale takie rzeczy ktoś już pewnie wcześniej robił, więc nie jest to aż tak ekscytujące.  

Czy chodzi Koledze o coś takiego jak na filmie powyżej? Jeśli tak - faktycznie, sporo tego typu projektów

6 godzin temu, Adder napisał:

Proszę podpowiedzcie koledzy co byście radzili. Jak wejść na kolejny level wtajemniczenia? Na czym budować fundamenty?

To zależy, w którym kierunku chciałby się Kolega rozwijać? Processing? Jeśli tak, to może teraz jakaś gra typu pong, gdzie urządzenie wejściowym będą fizyczne potencjometry? 😉

  • Lubię! 1
Link to post
Share on other sites
5 godzin temu, wn2001 napisał:

Czy chodzi Koledze o coś takiego jak na filmie powyżej? Jeśli tak - faktycznie, sporo tego typu projektów

No właśnie. O coś takiego mi chodzi. Jak widać nie jest to zbyt oryginalny pomysł 🙂 

5 godzin temu, wn2001 napisał:

To zależy, w którym kierunku chciałby się Kolega rozwijać? Processing? Jeśli tak, to może teraz jakaś gra typu pong, gdzie urządzenie wejściowym będą fizyczne potencjometry? 😉

Dobre! Podoba mi się! 🙂  🙂  🙂 Chyba pociągają mnie oryginalne projekty techniczne wymagające wysublimowanej grafiki. 

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

Chyba pociągają mnie oryginalne projekty techniczne wymagające wysublimowanej grafiki. 

No to zostaw tego Processinga w spokoju i chwyć się za Pythona i pygame.

  • Lubię! 1
Link to post
Share on other sites
(edytowany)
7 minut temu, ethanak napisał:

No to zostaw tego Processinga w spokoju i chwyć się za Pythona i pygame.

Chyba czas na to ! 🙂 

Myślę o takim artystyczno-technicznym projekcie serii zdjęć tego samego obiektu w różnych widmach. światło widzialne, ultradźwięki, fale wifi, UKF, podczerwone, X... To mogłoby mnie wciągnąć na długie miesiące...

Edytowano przez Adder
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.