Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2022:cristip:soundactivatedstrobelights [2022/05/31 04:04]
theodor.tulba
pm:prj2022:cristip:soundactivatedstrobelights [2022/05/31 04:51] (current)
theodor.tulba [Descriere generală]
Line 2: Line 2:
 ===== Introducere ===== ===== Introducere =====
  
-Acest proiect reprezintă implementarea unui analizator de spectru ce capteaza ​sunetul din mediul încojurător. Asupra sample-urilor de sunet captate se realizeaza ​o transformare ​Fouriersi ​se obtine ​spectrul de frecvente ale sunetului. Datele sunt afisate ​codificând spectograma ​obtinuta ​pe un ecran de 24x8 LED-uri (alcatuita ​din 3 matrici LED 8x8) in functie ​de frecventa ​(coloane) ​si intensitate ​(randuri). Matricile sunt organizate ​in asa fel incat frecventele ​joase sunt reprezentate cu rosu, cele medii cu verde si cele inalte ​cu albastru.+Acest proiect reprezintă implementarea unui analizator de spectru ce captează ​sunetul din mediul încojurător. Asupra sample-urilor de sunet captate se realizează ​o transformare ​Fourier și se obține ​spectrul de frecvențe. Datele sunt afișate ​codificând spectograma ​obtinută ​pe un "ecran" ​de 24x8 LED-uri (alcatuită ​din 3 matrici LED 8x8) în funcție ​de frecvență ​(coloane) ​și intensitatea sunetului ​(rânduri). Matricile sunt organizate ​în așa fel încât frecvențele ​joase sunt reprezentate cu roșu, cele medii cu verde și cele înalte ​cu albastru.
  
 ===== Descriere generală ===== ===== Descriere generală =====
 Principiul de funcționare al proiectului este următorul: Principiul de funcționare al proiectului este următorul:
-  1. Prin intermediul unui microfon sunt preluate sunetele sub forma de date analog; +  1. Prin intermediul unui microfon sunt preluate sunetele sub formă ​de date analog; 
-  2. Asupra acestor date se aplica ​o transformare Fourier ​si se obtine ​spectograma ​de frecvente+  2. Asupra acestor date se aplică ​o transformare Fourier ​și se obține ​spectograma;​ 
-  3. Spectograma este afisata ​pe ecranul de LED-uri.+  3. Spectograma este afisată ​pe ecranul de LED-uri.
   ​   ​
 === Schemă bloc === === Schemă bloc ===
  
-{{ :​pm:​prj2022:​cristip:​diagrama_proiect_stroboscop.drawio.png?720 }}+{{ :​pm:​prj2022:​cristip:​diagrama_proiect_stroboscop.png?​720 }}
  
 ===== Hardware Design ===== ===== Hardware Design =====
Line 24: Line 24:
   * 1x [[https://​ardushop.ro/​ro/​home/​2257-lm8x83mmblue.htm|Matrice LED 8x8 3mm albastru(32mm)]];​   * 1x [[https://​ardushop.ro/​ro/​home/​2257-lm8x83mmblue.htm|Matrice LED 8x8 3mm albastru(32mm)]];​
   * 4x [[https://​ardushop.ro/​ro/​electronica/​141-ic-shift-register-sn74hc595n-74hc595.html|Shift register SN74HC595N]];​   * 4x [[https://​ardushop.ro/​ro/​electronica/​141-ic-shift-register-sn74hc595n-74hc595.html|Shift register SN74HC595N]];​
-  * 24x [[https://​www.tme.eu/​ro/​details/​1_4w220r/​rezistente-carbon-tht-1-4w/​royal-ohm/​cfr0w4j0221a50/​|Rezistor 220Ω]].+  * 24x [[https://​www.tme.eu/​ro/​details/​1_4w220r/​rezistente-carbon-tht-1-4w/​royal-ohm/​cfr0w4j0221a50/​|Rezistor 220Ω]]
 +  * 2x [[https://​cleste.ro/​breadboard-830-puncte-mb-102-mb102.html|Breadboard 830 puncte]]; 
 +  * 3x [[https://​cleste.ro/​placa-prototipare-5x7.html|Placă prototipare 5x7 cm]] 
 +  * 1x Carcasă printată 3D
  
-=== Parți Printate 3D === +=== Schema ​Electrică ​===
- +
- +
-=== Schema ​Electrica ​===+
  
 {{ :​pm:​prj2022:​cristip:​Schema_Electrica_GabiTulba_EG.png?​720 }} {{ :​pm:​prj2022:​cristip:​Schema_Electrica_GabiTulba_EG.png?​720 }}
Line 42: Line 42:
 === Implementare === === Implementare ===
  
 +**Setup**
 +
 +În setup se initializează pinii, se testează că funcționează matricile LED și se initializează un timer. Timer-ul este folosit pentru a crea întreruperi în mod regulat ce va declanșa randarea următoarei coloane de pixeli ai "​ecranului"​. ​
 +<code cpp>
 +void setup() {
 +  // Initialize pins
 +  pinMode(SER1,​ OUTPUT);
 +  pinMode(RCLK1,​ OUTPUT);
 +  pinMode(SRCLK1,​ OUTPUT);
 +  pinMode(OE, OUTPUT);
 +  pinMode(SER2,​ OUTPUT);
 +  pinMode(RCLK2,​ OUTPUT);
 +  pinMode(SRCLK2,​ OUTPUT);
 +
 +  digitalWrite(OE,​ HIGH);
 +
 +  // Code for checking if the LED lights work
 +  for(int i = 1; i <= 8; i++) {
 +    for(int j = 0; j < 8; j++) {
 +      write_mat((1<<​i) - 1, (1<<​i) - 1, (1<<​i) - 1, 1<<​j);​
 +      delay(50);
 +    }
 +  }
 +  write_mat(255,​ 255, 255, 255);
 +  delay(2000);​
 +
 +  // Initialize Timer for the interrupts
 +  Timer1.initialize(1000);​ //​microseconds
 +  Timer1.attachInterrupt(draw_column);  ​
 +}
 +</​code>​
 +
 +**Comunicare cu Shift Register**
 +
 +Conform datasheet-ului,​ se transmit date seriale ce sunt reținute în shift register. cel mai simplu mod de interacționare este folosirea funcției ''​shiftOut''​ care transmite un întreg byte de date.
 +<code cpp>
 +// Send one byte of data to a shift register
 +void write_to_register(byte data, int rclk, int ser, int srclk) {
 +  digitalWrite(rclk,​ LOW);
 +  shiftOut(ser,​ srclk, LSBFIRST, data);
 +  digitalWrite(rclk,​ HIGH);
 +}
 +</​code>​
 +
 +**Randarea Matricelor LED**
 +
 +Randarea unei matrici se face pe coloane. Refresh rate-ul este de 1000 * 24 µs = 24ms.
 +<code cpp>
 +// Write to the 24x8 LED matrix using the shift registers
 +void write_mat(byte r, byte g, byte b, byte row) {
 +  digitalWrite(OE,​ HIGH);
 +  ​
 +  write_to_register(b,​ RCLK1, SER1, SRCLK1);
 +  write_to_register(g,​ RCLK1, SER1, SRCLK1);
 +  write_to_register(r,​ RCLK1, SER1, SRCLK1);
 +  ​
 +  write_to_register(row ^ 255, RCLK2, SER2, SRCLK2);
 +
 +  digitalWrite(OE,​ LOW);
 +}
 +
 +// Renders the next column of the matrix
 +void draw_column() {
 +  if(mat_line < 8) { // Draw a red column
 +    write_mat((1 << min(8, histogram[mat_line])) - 1, 0, 0, 1 << mat_line);
 +  } else if(mat_line < 16) { // Draw a green column
 +    write_mat(0,​ (1 << min(8, histogram[mat_line])) - 1, 0, 1 << (mat_line & 7));
 +  } else { // Draw a blue column
 +    write_mat(0,​ 0, (1 << min(8, histogram[mat_line])) - 1, 1 << (mat_line & 7));
 +  }
 +
 +  mat_line++;
 +  if(mat_line == 24) { // Reset the rendering process
 +    mat_line = 0;
 +  }
 +}
 +</​code>​
 +
 +**Main Loop**
 +
 +În ''​loop''​ se citesc datele analog de la microfon și sunt transformate in spectograma utilizând funcția ''​fix_fft''​.
 +<code cpp>
 +void loop()
 +{
 +  static int i, j, step;
 +  int val;
 +
 +  // get audio data
 +  for(i = 0; i < SAMPLES; i++) {
 +    val = analogRead(AUDIO);​ // 0-1023
 +    ​
 +    real[i] = (char)(val/​4 - 128); // store the result on 8 bits
 +    imag[i] = 0; // set all imaginary parts to 0
 +  }
 +
 +  // run FFT
 +  fix_fft(real,​ imag, LOG_SAMPLES,​ 0);
 +
 +  histogram[0] = 0; // noise, so we ignore it
 +  ​
 +  // extract absolute value of data only, for half the results
 +  for(i = 1; i < SAMPLES/2; i++) {
 +    histogram[i] = (int)sqrt(real[i] * real[i] + imag[i] * imag[i]);
 +  }
 +
 +  // compress the histogram to 24 values so it can be printed on the LED matrices
 +  for(int i = 0; i < LED_COLS; i++) {
 +    // magic to make the spectogram look good and ignore low frequency signals
 +    histogram[i] = (histogram[i * 2 + 6] + histogram[i * 2 + 7] + histogram[i * 2 + 8]) * 1.33f;
 +  }
 +}
 +</​code>​
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-Demo functionalitate: [[https://studio.youtube.com/​video/​wtGvMIOnKYM/edit|link]]+**Demo funcționalitate:** [[https://youtu.be/​wtGvMIOnKYM|link]]
  
 ===== Concluzii ===== ===== Concluzii =====
Line 53: Line 165:
 ===== Download ===== ===== Download =====
  
-<note warning>​ +Codul sursa al proiectului poate fi găsit aici{{:​pm:​prj2022:​cristip:​Spectrum_Analyser.zip| Spectrum Analyser}}.
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, scheme, etcUn fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). +
- +
-</​note>​ +
 ===== Bibliografie ===== ===== Bibliografie =====
  
Line 68: Line 176:
  
 === Resurse === === Resurse ===
-  * Tutorial ​Shift Registers: [[https://​lastminuteengineers.com/​74hc595-shift-register-arduino-tutorial|link]] +  * Setup Shift Registers: [[https://​lastminuteengineers.com/​74hc595-shift-register-arduino-tutorial|link]]; 
-  * Spectrum Analyzer: [[https://​create.arduino.cc/​projecthub/​mircemk/​diy-fft-audio-spectrum-analyzer-ca2926|link]] +  * Spectrum Analyzer: [[https://​create.arduino.cc/​projecthub/​mircemk/​diy-fft-audio-spectrum-analyzer-ca2926|link]]; 
-  * Timer Interrupts: [[https://​www.instructables.com/​Arduino-Timer-Interrupts|link]]+  * Timer Interrupts: [[https://​www.instructables.com/​Arduino-Timer-Interrupts|link]].
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
  
pm/prj2022/cristip/soundactivatedstrobelights.1653959071.txt.gz · Last modified: 2022/05/31 04:04 by theodor.tulba
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0