Sensor-Matrix im seriellen Monitor verkehrt rum!?

Hi,

ich habe das Problem, dass ich ein 12x6 Sensor-Array habe und wenn ich mir im seriellen Monitor die Werte ausgeben lasse, dann ist das ganze verkehrt rum.
Also ich habe eine Matte mit 12x6 Sensoren gebaut. Belaste ich nun z.B. die unterste Reihe der Sensormatte (12 von 12) so zeigt mir der serielle Monitor die Belastung aber in der ersten Reihe des Arrays an (1 von 12).

Wo steckt der Fehler? :o

Hier der Code dazu:

//Mux control pins for analog signal (SIG_pin) 
const byte s0 = 13;
const byte s1 = 12;
const byte s2 = 11;
const byte s3 = 10;

//Mux control pins for Output signal (OUT_pin) 
const byte w0 = 9; 
const byte w1 = 8;
const byte w2 = 7;
const byte w3 = 6;

//Mux in "SIG" pin 
const byte SIG_pin = 0; 

//Mux out "SIG" pin 
const byte OUT_pin = 5;

//Row and Column pins 
const byte STATUS_pin = 3;
const byte COL_pin = 2;

const boolean muxChannel[16][4]={
    {0,0,0,0}, //channel 0
    {1,0,0,0}, //channel 1
    {0,1,0,0}, //channel 2
    {1,1,0,0}, //channel 3
    {0,0,1,0}, //channel 4
    {1,0,1,0}, //channel 5
    {0,1,1,0}, //channel 6
    {1,1,1,0}, //channel 7
    {0,0,0,1}, //channel 8
    {1,0,0,1}, //channel 9
    {0,1,0,1}, //channel 10
    {1,1,0,1}, //channel 11
    {0,0,1,1}, //channel 12
    {1,0,1,1}, //channel 13
    {0,1,1,1}, //channel 14
    {1,1,1,1}  //channel 15
  };


//incoming serial byte
int inByte = 0;

int valor = 0;               //variable for sending bytes to processing
int calibra[13][7];         //Array 72 sensors
int minsensor=254;          //Variable for staring the min array
int multiplier = 254;
int pastmatrix[13][7];

void setup(){
    
  pinMode(s0, OUTPUT); 
  pinMode(s1, OUTPUT); 
  pinMode(s2, OUTPUT); 
  pinMode(s3, OUTPUT); 
  
  pinMode(w0, OUTPUT); 
  pinMode(w1, OUTPUT); 
  pinMode(w2, OUTPUT); 
  pinMode(w3, OUTPUT); 
  
  pinMode(OUT_pin, OUTPUT); 
  
  pinMode(STATUS_pin, OUTPUT);
  pinMode(COL_pin, OUTPUT);

  
  digitalWrite(s0, LOW);
  digitalWrite(s1, LOW);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
  
  digitalWrite(w0, LOW);
  digitalWrite(w1, LOW);
  digitalWrite(w2, LOW);
  digitalWrite(w3, LOW);
  
  digitalWrite(OUT_pin, HIGH);
  digitalWrite(STATUS_pin, HIGH);
  digitalWrite(COL_pin, HIGH);
  
 
  
  Serial.begin(115200);
  
  
  for(byte j = 0; j < 13; j ++){ 
    writeMux(j);
    for(byte i = 0; i < 7; i ++)
      calibra[j][i] = 0;
  }
  
  // Calibration
  for(byte k = 0; k < 50; k++){  
    for(byte j = 0; j < 13; j ++){ 
      writeMux(j);
      for(byte i = 0; i < 7; i ++)
        calibra[j][i] = calibra[j][i] + readMux(i);
    }
  }
  
  //Print averages
  for(byte j = 0; j < 12; j ++){ 
    writeMux(j);
    for(byte i = 0; i < 6; i ++){
      calibra[j][i] = calibra[j][i]/50;
      if(calibra[j][i] < minsensor)
        minsensor = calibra[j][i];
      Serial.print(calibra[j][i]);
      Serial.print("\t");
    }
  Serial.println(); 
  }
  
  Serial.println();
  Serial.print("Minimum Value: ");
  Serial.println(minsensor);
  Serial.println();
  
  establishContact();
 
  digitalWrite(COL_pin, LOW);
}


void loop(){
 
  if (Serial.available() > 0){
    inByte = Serial.read();
    
    if(inByte == 'A'){
    
      for(int j = 12; j >= 0; j--){ 
        writeMux(j);
        
        for(int i = 0; i < 7; i++){
            
          valor = readMux(i);
          
          
          int limsup = 450;
          if(valor > limsup)
            valor = limsup;
            
          if(valor < calibra[j][i])
            valor = calibra[j][i];  
          
          valor = map(valor,minsensor, limsup,1,254); 
          
          if(valor < 150)
            valor = 0;
          if(valor > 254)
            valor = 254;
          
          Serial.write(valor);
          digitalWrite(COL_pin,!digitalRead(COL_pin));
        } 
      }
    }
        
  }
}


int readMux(byte channel){
  byte controlPin[] = {s0, s1, s2, s3};

  //loop through the 4 sig
  for(int i = 0; i < 4; i ++){
    digitalWrite(controlPin[i], muxChannel[channel][i]);
  }

  //read the value at the SIG pin
  int val = analogRead(SIG_pin);

  //return the value
  return val;
}

void writeMux(byte channel){
  byte controlPin[] = {w0, w1, w2, w3};

  //loop through the 4 sig
  for(byte i = 0; i < 4; i ++){
    digitalWrite(controlPin[i], muxChannel[channel][i]);
  }
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.print('A');   // send a capital A
    delay(300);
  }
}

was passiert, wenn Du die Zeile
for(int j = 12; j >= 0; j–){

in
for(int j = 0; j < 12; j++){

änderst?

Du solltest prüfen, welche Pins und Mux-Werte zur untersten Reihe gehören. Entweder ist diese Zuordnung verdreht, oder die Ausgaberoutine.

Moko:
was passiert, wenn Du die Zeile
for(byte j = 0; j < 12; j ++){

in
for(int j = 12; j >= 0; j–){

änderst?

Problem bleibt leider bestehen.

ma1kels:
Problem bleibt leider bestehen.

habs meinen Text geändert, das waren die Zeilen aus dem Setup, nicht aus der Loop
probier mal nochmal :wink:

Moko:
habs meinen Text geändert, das waren die Zeilen aus dem Setup, nicht aus der Loop
probier mal nochmal :wink:

Schade, bringt leider auch nichts :frowning:

DrDiettrich:
Du solltest prüfen, welche Pins und Mux-Werte zur untersten Reihe gehören. Entweder ist diese Zuordnung verdreht, oder die Ausgaberoutine.

Die Pins sind alle richtig angeschlossen, also die Zuordnung müsste richtig sein. Was genau meinst du mit den Mux-Werten bzw. der Ausgaberoutine?

Ohne Schaltbild ist nicht erkennbar, welche Pins welchen Einfluß auf die Datenerfassung haben. Entweder Du findest Deinen Fehler selbst, oder rückst alle notwendigen Informationen raus.

Ohne Schaltbild ist nicht erkennbar, welche Pins welchen Einfluß auf die Datenerfassung haben. Entweder Du findest Deinen Fehler selbst, oder rückst alle notwendigen Informationen raus.

An dem ersten Multiplexer von links sind von C0-C5 die 6 Spalten angeschlossen und an dem zweiten von C0-C11 die 12 Reihen des Arrays.

Ein Schaltbild wäre schöner gewesen :frowning:

Fehlt noch die Angabe, welche Pins zu oben und unten, links und rechts gehören.

Welche Ausgabe zeigt Dir die falsche Reihe an?

DrDiettrich:
Ein Schaltbild wäre schöner gewesen :frowning:

Fehlt noch die Angabe, welche Pins zu oben und unten, links und rechts gehören.

(C0 - C5): C0 = 1 Spalte von links, C1 = 2 Spalte von links, usw.
(C0 - C11): C0 = 1 Reihe von unten, C1 = 2 Reihe von unten, usw.

Welche Ausgabe zeigt Dir die falsche Reihe an?

Na die Spaltenangabe im Array ist korrekt, drücke ich links bzw. rechts auf der Sensormatte so ändern sich auch da die Werte entsprechend. Bei der Reihenangabe sieht es aber anders aus, die ist quasi kopfüber. (Drücke ich unten, dann ändern sich die Werte im Array im oberen Bereich und andersrum). Das Ding ist, ich lasse die Ausgabe auch grafisch darstellen in Processing, dort klappt alles wunderbar. Wird die Sensormatte unten, oben, links oder rechts belastet so erscheinen auf dem Display in Processing auch da entsprechend rote Peaks.

Wenn das Display in Processing richtig ist, wo wird es falsch dargestellt, mit welchem Code???

Oder verwirrt es Dich, daß die erste Ausgabe auf Serial oben steht, und die nachfolgenden unten? Du mußt also enstprechend zuerst die Angaben zur obersten Zeile ausgeben, bis runter zur untersten.

DrDiettrich:
Wenn das Display in Processing richtig ist, wo wird es falsch dargestellt, mit welchem Code???

Im seriellen Monitor habe ich die Wertausgabe in der Form 6x12. Links und rechts passt (Spalten), oben und unten ist aber vertauscht (Reihen 1-12). Zeile 1 müsste quasi Zeile 12 sein, Zeile 2 = Zeile 11, usw.
Wenn ich meine Kabel umdrehe dann geht es komischerweise, aber dann ist das Display in Processing wieder verkehrt rum :smiley: und die Anschlüsse stimmen dann auch nicht, also muss der Fehler irgendwo im Arduino Code liegen.

Oben und unten ist nicht vertauscht, Du gibst das genau so (falsch herum) aus. Korrigiere die Ausgaberoutine, dann paßt es.

DrDiettrich:
Oben und unten ist nicht vertauscht, Du gibst das genau so (falsch herum) aus. Korrigiere die Ausgaberoutine, dann paßt es.

Was genau meinst du den jetzt mit Ausgaberoutine anpassen? Ich hatte schon versucht den Code wie Moko vorgeschlagen hat abzuändern, das Problem bleibt aber bestehen. Oder meinst du einen anderen Teil im Code?

Wenn Du die Zeilen so ausgibst wie ganz am Anfang gepostet

 for(byte j = 0; j < 12; j ++){

dann wird doch zuerst die Zeile 0 ausgegeben, also die Werte der untersten Reihe.

Wenn Dir der Fehler immer noch nicht klar ist, gib doch auch noch das j zu jeder Zeile aus.

DrDiettrich:
Wenn Du die Zeilen so ausgibst wie ganz am Anfang gepostet

 for(byte j = 0; j < 12; j ++){

dann wird doch zuerst die Zeile 0 ausgegeben, also die Werte der untersten Reihe.

Wenn Dir der Fehler immer noch nicht klar ist, gib doch auch noch das j zu jeder Zeile aus.

Ich verstehe leider echt nicht was du meinst. Mit den Abänderungen die ich bisher probiert habe bzw. hier gepostet wurden, hat es auf jeden Fall leider nicht funktioniert!

Die erste Ausgabe von Serial.print kommt im Terminal in die erste Zeile.
Die Zweite Zeile kommt DARUNTER
Die Dritte kommt unter die Zweite ecc.

So hast Du Zeile 11 unter der Zeile 0.

Du mußt zuerst Zeile 11 ausgeben dann 10, 9, ... 1, 0.

Grüße Uwe

uwefed:
Die erste Ausgabe von Serial.print kommt im Terminal in die erste Zeile.
Die Zweite Zeile kommt DARUNTER
Die Dritte kommt unter die Zweite ecc.

So hast Du Zeile 11 unter der Zeile 0.

Du mußt zuerst Zeile 11 ausgeben dann 10, 9, … 1, 0.

Grüße Uwe

Danke für die Hilfe, aber so komme ich echt nicht weiter :frowning: Was soll ich den jetzt in diesem Teil des Codes ändern damit es endlich passt??

 // Full of 0's of initial matrix
  for(byte j = 0; j < 13; j ++){ 
    writeMux(j);
    for(byte i = 0; i < 7; i ++)
      calibra[j][i] = 0;
  }
  
  // Calibration
  for(byte k = 0; k < 50; k++){  
    for(byte j = 0; j < 13; j ++){ 
      writeMux(j);
      for(byte i = 0; i < 7; i ++)
        calibra[j][i] = calibra[j][i] + readMux(i);
    }
  }
  
  //Print averages
  for(byte j = 0; j < 12; j ++){ 
    writeMux(j);
    for(byte i = 0; i < 6; i ++){
      calibra[j][i] = calibra[j][i]/50;
      if(calibra[j][i] > minsensor)
        minsensor = calibra[j][i];
      Serial.print(calibra[j][i]);