Programmierer Signal Analyzer/ Oszilloskop

→ English Thread: http://forum.arduino.cc/index.php?topic=573157.new;topicseen#new

Moin moin, ich suche nach jemanden der mir mit einem Projekt weiterhelfen/ programmieren kann.
Ich bin komplett neu im Arduino Sektor und habe nur wenig Erfahrungen damit gemacht.

Zuerst: Ich bin kein Informatiker, sondern E-Techniker, was heißt, dass ich nicht wirklich gut im programmieren in C bin, weswegen ich auch frage, ob mir jemand helfen kann (sonst würde ich nicht so doof fragen :D).
Ich baue mir derzeitig einen analogen Synthesizer und wollte dem ganzen noch die Kirsche oben drauf setzen indem ich an den Mainoutput eine Art Signal-Analysierer dranhänge mit einem kleinen TFT Bildschirm. Ich habe selbstverständlich alles im Internet abgegrast und viele Programmcodes getestet, allerdings passt nichts so richtig zu dem was ich vorhabe.

Das ganze soll dazu dienen, eine Vorstellung des auf dem Synth gepatchten Sounds am Ausgang zu bekommen, als eine Art kleines Gimmick. Dazu soll man sehen wie das Signal im Zeitbereich (also Frequenzanteile, FFT sind egal) aussieht. Das heißt in dem Falle auch, dass das Signal immer annähernd gleichgroß auf dem Screen zu sehen sein muss und die Darstellung unabhängig von der Frequenz (also vom gespielten Ton) ist. Ich habe keine Ahnung ob ein Arduino von der Leistung in der Lage ist und ob man das ganze rein softwaretechnisch lösen kann.

Noch geil wäre, wenn man beim Anschalten für ein paar Sekunden einen Startbildschirm zeigen könnte mit dem Namen des Synths… nur so als Gimmick des Gimmicks :smiley:

Ich habe bereits einen Code in den Tiefen des Internets gefunden, den FFT Teil auskommentiert und farblich alles etwas angepasst. Allerdings habe ich eben hier das Problem mit der Frequenzstärke, dem Offset (ich sehe nur eine Halbwelle). Allerdings weiß ich nicht mehr wo ich den her habe, ich kann keine Links oder sonst was finden, um dem Entwickler zu schreiben.

Deswegen suche ich hier jemanden der sowas eventuell für mich schreiben könnte oder zumindest den Code umschreiben kann (falls möglich).

Selbstverständlich gehören die Rechte dann dem Entwickler und ich werde in den Community-Boards, sowie Posts den Schreiber der Software erwähnen!

#define FILENAME "TFTGraph3"
#include <TFT.h>  // Arduino LCD library
#include <SPI.h>

// pin definition for the Uno
#define cs   10
#define dc   9
#define rst  8
#define quiet false

TFT TFTscreen = TFT(cs, dc, rst);
byte h = TFTscreen.height();
byte w = TFTscreen.width();
byte b[160];
boolean f = false; 
int dt; // microseconds

void setup() {
  Serial.begin(9600);
  Serial.println(FILENAME);
  Serial.println(w);
  Serial.println(h);
  ADCSRA = 132;   // set prescale to 16, see http://www.microsmart.co.za/technical/2014/03/01/advanced-arduino-adc/
  // initialize the display
  TFTscreen.begin();
  for (int i = 0; i < w; i++) b[i] = -1; // avoid erasing on the first go
  // clear the screen with a pretty color
  clearScreen();
}

//==========================================================================00

void loop() {
  int a[160]; // "double buffering"
  const byte sensorPin = A0;
  long t1, t2;
  t1 = micros();
  // sampling:
  for (int i = 1; i < w-1; i++) {
    a[i] = analogRead(sensorPin);
    // delay if desired
  }
  t2 = micros();
  dt = t2 - t1;
  Serial.println(dt);
  // displaying:
  if (f) {
    for (int i = 1; i < w-1; i++) {
      TFTscreen.stroke(0, 0, 0); // erase old
      TFTscreen.point (i, b[i]);
      b[i] = map (a[i], 0, 1023, h-2, 1);
      // zero should be at the bottom, 5 volts at the top
      TFTscreen.stroke(255, 200, 0); // print new
      TFTscreen.point (i, b[i]);
    }
  }
  else {
    for (int i = 1; i < w-1; i++) {
      TFTscreen.stroke(0, 0, 0); // erase old
      TFTscreen.point (i, b[i]);
      b[i] = map (a[i], 0, 1023, h-2, 1);
      TFTscreen.stroke(255, 200, 0); // print new
      TFTscreen.point (i, b[i]);  
    }
  }
  f = !f;
  grid();
  // trigger:
  /* edge triggered: */
  int v1 = analogRead(sensorPin);
  int v2 = analogRead(sensorPin);
  // wait for rising edge:
  while (v2 - v1 < 2) {
    v1 = v2;
    v2 = analogRead(sensorPin);
  }
  // wait for falling edge
  while (v1 - v2 < 2) {
    v1 = v2;
    v2 = analogRead(sensorPin);
  }
  /* alternative use level triggering:
  while (analogRead(sensorPin) > 512);
  while (analogRead(sensorPin) < 512);
  /* */
}

void clearScreen() {
  TFTscreen.background(0, 0, 0);
  TFTscreen.stroke(255, 0, 0);
  TFTscreen.rect(0, 0, w, h);
}

void grid() { // dotted vertical lines
  // display the axes:
  TFTscreen.stroke(255, 0, 0); // red
  // horizontal lines:
  for (int i = 1; i < 5; i++) {
    int b = 6;
    int x = 3;
    while (x < w) {
      TFTscreen.line(x, i*h/5, x + b, i*h/5);
      x = x + 2 * b;
    }
  }
  // vertical  lins:
  long div = 500; // microseconds
  int dx = div * (w - 2) / dt;
  int x = 0;
  while (x < w) {
    int b = 6;
    x = x + dx;
    int y = 2;
    while (y < h)  {
      TFTscreen.line(x, y, x, y + b);
      y = y + 2 * b;
    }
  }  
  // print margins:
  byte h1 = 3*h/5;
  TFTscreen.stroke(0,0,0); // background color
  TFTscreen.fill(0,0,0); 
  TFTscreen.rect(w-30,h1-8,29,7);
  /*TFTscreen.stroke(255,255,255); // white
  TFTscreen.text("0",    1, h1-8);
  TFTscreen.text("0.5 ms", w-36, h1-8); 
  TFTscreen.text("/div",   w-24, h1+1);   
  TFTscreen.text("0V",   1,  h-8); 
  TFTscreen.text("5V",   1,    1);*/  
}

P.S. Eignet hierzu sich besser ein Mega, Uno oder reicht auch ein kleiner Mini/Nano? Ich weiß nicht, ob das große Performanceunterschiede sind, da es ja die gleichen Chips sind.

Grüße Ludwig

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Dann ist er besonders für die User von mobilen Geräten besser Lesbar und Du bekommst wahrscheinlich mehr Hilfe.

Gruß Tommy

Wenn Du 3 gleiche Treads anfängst wirst Du nicht mehr Antworten bekommen sondern weniger weil Du so die User ärgerst. Grüße Uwe

Tommy56:
Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Dann ist er besonders für die User von mobilen Geräten besser Lesbar und Du bekommst wahrscheinlich mehr Hilfe.

Gruß Tommy

Werde ich machen, vielen Dank!

uwefed:
Wenn Du 3 gleiche Treads anfängst wirst Du nicht mehr Antworten bekommen sondern weniger weil Du so die User ärgerst.
Grüße Uwe

Nicht jeder kann Deutsch, nicht jeder kann Englisch, ganz einfache Sache. Allerdings kann ich den Thread in Audio nicht löschen. Hatte es bereits versucht. LG

Hi

Dann verlinke wenigstens die Thread untereinander - nicht Jeder ist erpicht darauf, Dir genau den gleichen Kram vorzubeten, Den Du bereits vor Wochen wo anders bekommen hast. Auch, wenn's in anderen Sprachen war ...

MfG

BLACKAVID:
Nicht jeder kann Deutsch, nicht jeder kann Englisch, ganz einfache Sache. Allerdings kann ich den Thread in Audio nicht löschen. Hatte es bereits versucht. LG

Da sage ich mir als deutsch (und italienisch) schreibender User, daß doch die englischschreibenden Dir antworten sollen.
Grüße Uwe

Während hier im Deutschen Forum wieder jeder kleinlich und penibel ist, hat man mir im englisch sprachigen Raum schon längst zum Thema geantwortet xD

Ich kann auch im englischen Forumsteil wegen Mehrfachposting Diene Diskussion löschen und jeder Moderator gibt mir da Recht. Also Achtung was Du sagst. Grüße Uwe