Teensy 3.2 Ohmmeter mit Midi Ausgabe

Hallo zusammen - und frohes neues Jahr

ich bastele gerade an einem Ohmmeter mit Teensy 3.2 welches die Widerstandswerte auch als Midi Noten per USB ausgeben soll.
Als Eingang wird derzeit nur der A0 Pin verwendet.

Sketch:

// Widerstände messen

//              _____
//            -|_R1__|- VCC
//AnalogPin  -' _____
//           '-|_R2__|- GND

// R2 = zu messender Widerstand

float Quellspannung=3.30;
int AnalogPin=0;
int R1=3280.0; //Wert des bekannten Widerstands 
long Messwert;
float SpannungR2; //Spannung über dem zu messenden Widerstand
float Widerstand;

void setup()
{
  Serial.begin(9600);
  Serial.println("Widerstand ausmessen");
  Serial.println();
}

void loop()
{
  //5 Messungen machen und Mittelwert bilden
  Messwert=0;
  //for(int i=0;i<5;i++){
  Messwert+=analogRead(AnalogPin);
  //}
  //Messwert=trunc(Messwert/5);
  
  //Spannung berechnen

  SpannungR2=(Quellspannung/1023.0)*Messwert;
  Serial.print("Spannung ueber R2 betraegt ");
  Serial.print(SpannungR2,2);
  Serial.println(" Volt!");

  //Berechnung: (R2 = R1 * (U2/U1))

  Widerstand=R1*(SpannungR2/(Quellspannung-SpannungR2));
  Serial.print("Der Widerstand hat ");
  Serial.print(Widerstand,2);
  Serial.println(" Ohm.");
  Serial.println();
  delay(1000);
}

Das messen der Widerstände funktioniert.

Wie müsste dazu eine passende IF oder IF / else Abfrage für mehrere in Reihe geschaltete, gleiche Widerstände (je 3,3K) aussehen, um dann mit unterschiedlichen Wertebereichen auch MidiNoten per USB senden zu können ?

Wo muss die IF Abfrage im Sketch plaziert werden (im Loop )?

Wo müsste usbMIDI.sendNoteOn(60, 99, 1); hin ?

würde mich freuen wenn Ihr mir nen Anstubbser dazu geben könntet.

Hi

In Sachen Midi bin ich der Falsche :) Aber: Dein R1 - Datentyp int - hat den Wert 3280. Das Punkt 0 bringt Dir Nichts, da INT keine Kommastellen hat.

Ich versteh Deine Frage nicht, wo die IFs hin müssten für mehrere 3K3-Widerstände. Wäre dann hier R2 ein Vielfaches der 3k3 Einzel-Widerstände?

MfG

Hi postmaster-ino,

R2 wäre tatsächlich ein vielfaches der 3,3k Widerstände !

Ich müsste für eine IF Abfrage also Wertebereiche für die Widerstände erzeugen, und diesen dann eine Midinote zuweisen...

Etwa so: Wenn R2 zwischen 3281 und 6560 dann sende Midi Note C1 Wenn R2 zwischen 6561 und 9840 dann sende Midi Note C2 Wenn R2 zwischen 9841 und 13120 dann sende Midi Note C3

Mir ist bei der IF Abfrage die Syntax, und der Ort (in den Loop?) wo die dann hin muss nicht so ganz klar...

Grüsse

stingray05:
Wo muss die IF Abfrage im Sketch plaziert werden (im Loop )?

Wo müsste usbMIDI.sendNoteOn(60, 99, 1); hin ?

Wenn Du den Wert von Widerstand am Ende von loop berechnet hast, kannst Du durch Dividieren durch 3300 den Index für das Notenfeld ermitteln, prinzipiell also so:

const byte noten[] = {60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71};
const byte anz = sizeof(noten);

void setup(void)
{
  Serial.begin(115200);
    // Wait for USB Serial
  while (!Serial) {
    if (millis() > 3000) break;
  }
  Serial.println("Anfang");
  for (byte j = 0; j < anz; j++)
  {
    float Widerstand = 3300.0 * (j + 1);
    byte note = (Widerstand / 3300) - 1;
    // usbMIDI.sendNoteOn(noten[note], 99, 1);
    Serial.println(noten[note]);
  }
}

void loop(void)
{
}

Über die Intervallgrenzen wegen realer Meßwerte habe ich noch nicht nachgedacht.

Hier mal eine langweilige Variante:

switch(R2.value())
{
  case 3281 ...  6560 : send(C1); break;
  case 6561 ...  9840 : send(C2); break;
  case 9841 ... 13120 : send(C3); break;
}

Hi agmue,

erstmal vielen Dank ! Hab den Code gerade mal getestet: Kompilieren und Hochladen geht - aber keinerlei Ausgabe im Seriellen Monitor / keine MidiDaten im MidiMonitor. usbMidi.sendNoteOn war dabei natürlich aktiviert.

Weitere Ideen ?

Ich verwende übrigens die IDE 1.86 /WIN 10.

Mit dem ursprünglichen Ohmmeter Sketch konnte ich bisher 22 Stück in Reihe geschaltete R2 3,3K Widerstände erfolgreich einzeln oder auch als Rges messen. Es genügt dabei an einen beliebigen der R2 Widerstände zusätzlich GND anzulegen. Wird zusätzlich kein GND angelegt wird Rges gemessen.

Ziel ist es jedem Widerstand, bzw dem Bereich zwischen den benachbarten Widerständen, eine Midinote zuweisen zu können. Die soll aber per USB nur solange gesendet werden wie der betreffende R2 Widerstand oder Rges tatsächlich auch gemessen wird...

Im Prinzip eigentlich eine Tasterabfrage per AnalogIN durch Widerstands- bzw Spannungsmessung.

Ich stehe allerdings mit meinen Programmierkenntnissen noch ziemlich am Anfang...

würde mich über weitere Anregungen dazu freuen ! Grüsse

stingray05:
Kompilieren und Hochladen geht - aber keinerlei Ausgabe im Seriellen Monitor / keine MidiDaten im MidiMonitor.
usbMidi.sendNoteOn war dabei natürlich aktiviert.

Ich sehe erwartungsgemäß (Teensy 3.2 Serial + MIDI; IDE 1.8.6 Win10):

Anfang
60
61
62
63
64
65
66
67
68
69
70
71

Geringfügig abgewandelt höre ich zusätzlich neben der Ausgabe auch noch ein Klavier (Magix Music Maker mit Concert Grand LE - Piano).

const byte noten[] = {60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71};
const byte anz = sizeof(noten);

void setup(void)
{
  Serial.begin(115200);
  // Wait for USB Serial
  while (!Serial) {
    if (millis() > 3000) break;
  }
  Serial.println("Anfang");
}

void loop(void)
{
  for (byte j = 0; j < anz; j++)
  {
    float Widerstand = 3300.0 * (j + 1);
    byte note = (Widerstand / 3300) - 1;
    usbMIDI.sendNoteOn(noten[note], 99, 1);
    Serial.print(noten[note]);
    Serial.print("  ");
    delay(500);
  }
  Serial.println();
  delay(5000);
}

Anfang
60 61 62 63 64 65 66 67 68 69 70 71
60 61 62 63 64 65 66 67 68 69 70 71
60 61 62 63 64 65 66 67 68 69 70 71
60 61 62 63 64 65 66 67 68 69 70 71

Hi agmue,

vielen Dank ! Der Sketch funktioniert zwar- ist aber noch nicht so ganz das was ich vor hatte.

Die Midinoten werden jetzt unabhängig vom gerade gemessenen Widerstand in einer Schleife abgespielt.

Mein Ziel wäre: Wenn 3,3k bis 6,6k gemessen werden spiele mir zB nur Note 60, ausschließlich solange dieser widerstsand gemessen wird. Wenn 6601 bis 9,3k gemessen werden spiele mir zB nur Note 61, ausschließlich solange solange dieser widerstsand gemessen wird. Wenn 9301 bis 12,6k gemessen werden spiele mir zB nur Note 62, ausschließlich solange solange dieser widerstsand gemessen wird usw.

Grüsse

Hi

Da der Widerstand in dem Beispiel 'der Reihe nach hoch gezählt wird' - wundert mich nicht wirklich, daß die Noten ebenfalls dieser Reihenfolge folgen.

Wenn Du in diesem Sketch Deine Widerstand-Messung einbaust, gibt Das was?

MfG

stingray05: Der Sketch funktioniert zwar- ist aber noch nicht so ganz das was ich vor hatte.

Ich verstehe dieses Forum als Hilfe zur Selbsthilfe, folgerichtig hast Du nach einem Anstubser gefragt und den von mir bekommen.

Jetzt darfst [u]Du[/u] wieder Aktivität zeigen :)

Den andere Thread https://forum.arduino.cc/index.php?topic=657121.0 habe ich zur Löschung gemeldet - dann wohl doch hier weiter :) Nachdem der Thread gelöscht wurde, wird auch dieser Beitrag (Meiner) entfernt ... wenn ich dran denke ;)

Edit Der Situation angepasst

Ich glaube, da will uns einer verarschen.

Gruß Tommy

postmaster-ino:
Wenn Du in diesem Sketch Deine Widerstand-Messung einbaust, gibt Das was?

MfG

Mit dem Einbau meiner Widerstand-Messung vom Ohmmeter Sketch war ich bisher leider nicht erfolgreich.
Habe mal versucht das senden von MidiNoteOn einzubauen. Der Sketch sieht jetzt so aus:

// Widerstände messen

//              _____
//            -|_R1__|- VCC
//AnalogPin  -' _____
//           '-|_R2__|- GND

// R2 = zu messender Widerstand (Reihenschaltung von mehreren 3,3k Widerständen)

float Quellspannung=3.30;
int AnalogPin=0;
int R1=3280.0; //Wert des bekannten Widerstands(3,3k, nachgemessen = 3280)
long Messwert;
float SpannungR2; //Spannung über dem zu messenden Widerstand
float Widerstand;

void setup()
{
  Serial.begin(9600);
  Serial.println("Widerstand ausmessen");
  Serial.println();
  
}

void loop()
{
  
 if((AnalogPin > 3300) && (AnalogPin < 6600))
 {
  usbMIDI.sendNoteOn(60, 99, 1);
  }else{
  usbMIDI.sendNoteOff(60, 0, 1);
  }

  
  //5 Messungen machen und Mittelwert bilden
  Messwert=0;
  for(int i=0;i<5;i++){
  Messwert+=analogRead(AnalogPin);
  }
  Messwert=trunc(Messwert/5);
  
  //Spannung berechnen
  SpannungR2=(Quellspannung/1023.0)*Messwert;
  Serial.print("Spannung ueber R2 betraegt ");
  Serial.print(SpannungR2,2);
  Serial.println(" Volt!");
  //Berechnung: (R2 = R1 * (U2/U1))
  Widerstand=R1*(SpannungR2/(Quellspannung-SpannungR2));
  Serial.print("Der Widerstand hat ");
  Serial.print(Widerstand,2);
  Serial.println(" Ohm.");
  Serial.println();
  delay(1000);
}

Midi Note 60 wird zwar am MidiMonitor ausgegeben, allerdings nur als NoteOff und leider auch unabhängig vom gemessenen Widerstand…

Mir ist nicht ganz klar ob die IF Abfrage so überhaupt stimmt bzw wo der Fehler liegt.
Auch ein auskommentieren von else{usbMIDI.sendNoteOff(60, 0, 1); n Zeile 32 + 33 führte nicht zum Erfolg…, im MidiMonitor kommt dann nix mehr…

Wo, wie und in welcher Reihenfolge sollte die IF Abfrage erfolgen ?

Würde mich sehr freuen wenn hier nochmal jemand drüber schauen könnte !

Grüsse

PS.: Sorry für den Doppelpost unter https://forum.arduino.cc/index.php?topic=657121.0, mein Fehler,
bitte ggfs löschen !

Dann solltest Du wohl zurück zur Widerstandsmessung gehenn und von der aus die Noten ausgeben.

switch/case auf dem AVR-GCC kann Bereiche (range) nutzen. Pseudocode:

// Widerstand ist berechnet
switch (widerstand) {

case 3001 ... 4000:
     // Ausgabe Note 1
     Serial.println("Note 1");
     break;
case 4001 ... 5000:
     // Ausgabe Note 2
     Serial.println("Note 2");
     break;
default:
      Serial.println("Falscher Wert");

}

usw. Werte anpassen.

Gruß Tommy

Wenn Du die Reihenfolge in Messen → Auswerten veränderst und den gemessenen Wert in den Vergleich nimmst, könnte es besser werden (ungetestet):

...
  Serial.println(" Ohm.");
  Serial.println();

 if((Widerstand > 3300) && (Widerstand < 6600))
 {
  usbMIDI.sendNoteOn(60, 99, 1);
  }else{
  usbMIDI.sendNoteOff(60, 0, 1);
  }

  delay(1000);

Tommy war schneller :-[

Hi agmue,
vielen Dank ! Grundsätzlich funktioniert das jetzt mit 22 Widerständen bzw MidiNoten per USB.

// Widerstände messen

//              _____
//            -|_R1__|- VCC
//AnalogPin  -' _____
//           '-|_R2__|- GND

// R2 = zu messender Widerstand (Reihenschaltung von mehreren 3,3k Widerständen)

float Quellspannung=3.30;
int AnalogPin=0;
int R1=3280.0; //Wert des bekannten Widerstands(3,3k, nachgemessen = 3280)
long Messwert;
float SpannungR2; //Spannung über dem zu messenden Widerstand
float Widerstand;

void setup()
{
  Serial.begin(9600);
  Serial.println("Widerstand ausmessen");
  Serial.println();
 
}

void loop()
{
 
  //5 Messungen machen und Mittelwert bilden
  Messwert=0;
  for(int i=0;i<5;i++){
  Messwert+=analogRead(AnalogPin);
  }
  Messwert=trunc(Messwert/5);
 
  //Spannung berechnen
  SpannungR2=(Quellspannung/1023.0)*Messwert;
  Serial.print("Spannung ueber R2 betraegt ");
  Serial.print(SpannungR2,2);
  Serial.println(" Volt!");
  //Berechnung: (R2 = R1 * (U2/U1))
  Widerstand=R1*(SpannungR2/(Quellspannung-SpannungR2));
  Serial.print("Der Widerstand hat ");
  Serial.print(Widerstand,2);
  Serial.println(" Ohm.");
  Serial.println();
  
   if((Widerstand > 3300) && (Widerstand < 6600))
 {
  usbMIDI.sendNoteOn(60, 99, 1);
  }else{
  //usbMIDI.sendNoteOff(60, 0, 1);
  }
    if((Widerstand > 6601) && (Widerstand < 9300))
 {
  usbMIDI.sendNoteOn(61, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(61, 0, 1);
  }
    if((Widerstand > 9301) && (Widerstand < 12600))
 {
  usbMIDI.sendNoteOn(62, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(62, 0, 1);
  }
    if((Widerstand > 12601) && (Widerstand < 15900))
 {
  usbMIDI.sendNoteOn(63, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(63, 0, 1);
  } 
    if((Widerstand > 15901) && (Widerstand < 19200))
 {
  usbMIDI.sendNoteOn(64, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(64, 0, 1);
  }  
    if((Widerstand > 19201) && (Widerstand < 22500))
 {
  usbMIDI.sendNoteOn(65, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(65, 0, 1);
  }   
    if((Widerstand > 22501) && (Widerstand < 25800))
 {
  usbMIDI.sendNoteOn(66, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(66, 0, 1);
  }  
    if((Widerstand > 25801) && (Widerstand < 29100))
 {
  usbMIDI.sendNoteOn(67, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(67, 0, 1);
  }  
     if((Widerstand > 29101) && (Widerstand < 32400))
 {
  usbMIDI.sendNoteOn(68, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(68, 0, 1);
  } 
     if((Widerstand > 32401) && (Widerstand < 35700))
 {
  usbMIDI.sendNoteOn(69, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(69, 0, 1);
  }
     if((Widerstand > 35701) && (Widerstand < 39000))
 {
  usbMIDI.sendNoteOn(70, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(70, 0, 1);
  }
     if((Widerstand > 39001) && (Widerstand < 42300))
 {
  usbMIDI.sendNoteOn(71, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(71, 0, 1);
  }  
     if((Widerstand > 42301) && (Widerstand < 45600))
 {
  usbMIDI.sendNoteOn(72, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(72, 0, 1);
  }
     if((Widerstand > 45601) && (Widerstand < 48900))
 {
  usbMIDI.sendNoteOn(73, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(73, 0, 1);
  }
     if((Widerstand > 48901) && (Widerstand < 52200))
 {
  usbMIDI.sendNoteOn(74, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(74, 0, 1);
  }  
     if((Widerstand > 52201) && (Widerstand < 55500))
 {
  usbMIDI.sendNoteOn(75, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(75, 0, 1);
  }
     if((Widerstand > 55501) && (Widerstand < 58800))
 {
  usbMIDI.sendNoteOn(76, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(76, 0, 1);
  }
     if((Widerstand > 58801) && (Widerstand < 62100))
 {
  usbMIDI.sendNoteOn(77, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(77, 0, 1);
  } 
     if((Widerstand > 62101) && (Widerstand < 65400))
 {
  usbMIDI.sendNoteOn(78, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(78, 0, 1);
  }    
     if((Widerstand > 65401) && (Widerstand < 68700))
 {
  usbMIDI.sendNoteOn(79, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(79, 0, 1);
  }
     if((Widerstand > 68701) && (Widerstand < 72000))
 {
  usbMIDI.sendNoteOn(80, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(80, 0, 1);
  }
     if((Widerstand > 72001) && (Widerstand < 75300))
 {
  usbMIDI.sendNoteOn(81, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(81, 0, 1);
  } 
     if((Widerstand > 75301) && (Widerstand < 78600))
 {
  usbMIDI.sendNoteOn(82, 99, 1);
  //}else{
  //usbMIDI.sendNoteOff(82, 0, 1);
  }   
  delay(1000);
}

Aber:
Im Moment läuft alles im Loop und produziert so auch reichlich ungewollten Midi Trafic, bis der Software Synth irgendwann hängenbleibt… Daher hatte ich NoteOff testweise mal überall auskommentiert.

Es wäre wahrscheinlich theoretisch besser die Widerstandsmessung zwar im Loop laufen zu lassen, aber MidiNote On / Off nur tatsächlich dann zu senden wenn Kontakt zu einem einzelnen Widerstand besteht.

Dazu fehlt mir allerdings die passende Idee wie das hinzukriegen wäre…

Grüsse

Hi

Wen mehr als ein Widerstand Kontakt hat, wird Das auch in irgend einer Note enden - der Gesamt-Widerstand ist ja immernoch in dem Bereich einer der Noten, oder? Du musst Dir nur merken, ob sich was an der aktuellen Note geändert hat. Vorher keine Note, jetzt Note: Midibefehl für Note x Vorher Note, jetzt keine Note: Midibefehl für Note x aus Vorher Note, jetzt andere Note: Midibefehl für Note x aus, Midibefehl für Note y

Dabei merken, welche Note denn gerade aktiv ist. Wenn Keine aktiv ist, muß auch Nix abgeschaltet werden - so schwer ist's wirklich nicht.

MfG

stingray05: Dazu fehlt mir allerdings die passende Idee wie das hinzukriegen wäre...

Male einen Programmablaufplan, der das zeigt, was Du möchtest, vergleiche das mit dem, was Du programmiert hast und baue dann das Gewünschte an der richtigen Stelle ein.

Sorrry, aber für mein Empfinden stellst Du Dich ein bisschen dämlich an.

Gruß

Gregor

Hallo zusammen und noch ein gutes Neues…

Ich wundere mich gerade etwas über die Grenzwerte der Widerstandsbereiche. Da die Widerstände Toleranzen haben, die Temperatur mit reinspielt und der Analogeingang zappelt, würde ich die Grenze bei einem halben Widerstandwert (+Vielfaches) machen.

Statt
if((Widerstand > 3300) && (Widerstand < 6600))
also
if((Widerstand > 1650) && (Widerstand < 4950)) //0.5R bzw 1.5R

stingray05: Aber: Im Moment läuft alles im Loop und produziert so auch reichlich ungewollten Midi Trafic, bis der Software Synth irgendwann hängenbleibt...

Dazu habe ich in #6 delay(500); ergänzt, was der Klaviersaite Zeit zum Klingen läßt.

An welches Instrument hast Du gedacht? Beim Thema "Ohmmeter mit Midi Ausgabe" könnte es auch ein Sinustongenerator sein, also keine angeschlagene Saite, sondern ein Dauertonerzeuger, dessen Ton Du nur bei Widerstandsänderung umschaltest.