Resistives Sensorarray für eine Schuhsohle (Velostat)

Ich beziehe mich auf den Code in #43

void loop(){

  if (Serial.available() > 0){
    inByte = Serial.read();
    
    if(inByte == 'A'){

....

Gruß Tommy

Tommy56: Ich beziehe mich auf den Code in #43

void loop(){

  if (Serial.available() > 0){     inByte = Serial.read();         if(inByte == 'A'){

....



Gruß Tommy

Okay, aber was meinst du damit? Wie müsste der code den da abgeändert werden?

Das ist der Nachteil, wenn man Code verwendet, den man nicht verstanden hat. Du musst im Seriellen Monitor ein A eingeben und Senden drücken, damit das ausgeführt wird, was bei den .... steht.

Warum Du in establishContact() ein A zurück sendest erschließt sich mir nicht. Soll das evtl. der Hineis sein, ein A einzugeben?

Gruß Tommy

Tommy56: Das ist der Nachteil, wenn man Code verwendet, den man nicht verstanden hat. Du musst im Seriellen Monitor ein A eingeben und Senden drücken, damit das ausgeführt wird, was bei den .... steht.

Warum Du in establishContact() ein A zurück sendest erschließt sich mir nicht. Soll das evtl. der Hineis sein, ein A einzugeben?

Gruß Tommy

Das habe ich schon verstanden. Problem ist aber, sende ich nun ein A, dann tut sich eben nichts mehr. Der serielle Monitor sieht aus als hätte er sich aufgehängt. Kann doch nicht so schwer sein bei jedem neuen Kontakt mit der Sohle, ein neues Array mit Werten auszuspucken oder?

Warum Du in establishContact() ein A zurück sendest erschließt sich mir nicht. Soll das evtl. der Hineis sein, ein A einzugeben?

Richtig.

Woran willst Du denn den neuen Kontakt mit der Sohle erkennen?

Die Funktion establishContact() sollte nach meiner Meinung nur eine Ausgabe machen und keine Schleife beinhalten.

Gruß Tommy

Tommy56: Woran willst Du denn den neuen Kontakt mit der Sohle erkennen?

Ja ich drücke doch mit der Hand oder dem Fuß darauf!? Und dann ändert sich mein Spannungswert je nachdem wie stark ich belaste. Und genau hier soll immer ein neues Array ausgegeben werden.

Dann musst Du mit 2 Arrays arbeiten und alle Werte des alten Arrays mit den Werten der neuen Messung vergleichen. Sobald Du feststellst, dass ein Wert anders ist (oder um mehr als x anders ist) musst Du ein neues Messwertset schreiben und das neue Array zum alten Array machen.

Ich vermute, dass genau das der Grund war, den Start der Messung per seriellem Monitor zu triggern.

Gruß Tommy

ma1kels: Hier der aktuelle Sketch:

Der kompiliert nicht, da fehlen die Deklarationen.

Warum das interessant ist? Deswegen:

ma1kels: Problem ist aber, sende ich nun ein A, dann tut sich eben nichts mehr.


Eine neue Messung muß angestoßen werden, das passiert nicht von alleine. Ich sehe drei Möglichkeiten:

  • Senden von 'A' oder sonstwas, derzeitiger Stand.
  • Änderungen der Meßwerte, siehe #52
  • In Zeitintervallen.

agmue: Der kompiliert nicht, da fehlen die Deklarationen.

Warum das interessant ist? Deswegen:

Eine neue Messung muß angestoßen werden, das passiert nicht von alleine. Ich sehe drei Möglichkeiten:

  • Senden von 'A' oder sonstwas, derzeitiger Stand.
  • Änderungen der Meßwerte, siehe #52
  • In Zeitintervallen.

Wie meinst du er kompiliert nicht? Wenn ich den momentanen Sketch auf den Arduino hochlade steht unten "Kompilieren abgeschlossen" und der Sketch funktioniert auch.

Und die erste Möglichkeit die du vorschlägst klappt ja leider nicht, das Senden von 'A'.

Dazu hatte ich Dir den möglichen Fehler ja bereits geschrieben.

Gruß Tommy

Edit: Was mich mal interessiert: Wofür ist das ganze denn in der Praxis gedacht? Oser hast Du das schon beschrieben und ich habe es nur überlesen?

ma1kels: Wie meinst du er kompiliert nicht?

In #43 klicke ich auf Select und kopiere das Programm in den Editor der IDE. Dann klicke ich auf den Haken links oben in der Ecke der IDE und erhalte unten im Fenster viele Fehlermeldungen.

ma1kels: Und die erste Möglichkeit die du vorschlägst klappt ja leider nicht, das Senden von 'A'.

Drum wollte ich es ja mal probieren.

agmue: In #43 klicke ich auf Select und kopiere das Programm in den Editor der IDE. Dann klicke ich auf den Haken links oben in der Ecke der IDE und erhalte unten im Fenster viele Fehlermeldungen. Drum wollte ich es ja mal probieren.

Komisch, bei mir werden keine Fehler angezeigt.

Irgendwo muss doch der Wurm drin sein!? Kann doch nicht so schwer sein einfach das Array immer wieder neu zu schreiben :( Wobei doch, wenn man wie ich mit Arduino nicht wirklich was am Hut hat.

  1. Dann solltest Du das, was in #43 steht mal mit dem vergleichen, was in Deiner IDE steht.
  2. Wenn man Dir Fragen stellt, wäre es schön, wenn Du diese beantworten und nicht ignorieren würdest.

Gruß Tommy

Das Programm in #43 enthält:

pinMode(s0, OUTPUT);

Wo im Programm ist "s0" deklariert?

ma1kels: Kann doch nicht so schwer sein ...

Da stimme ich Dir zu!

Tommy56: 1. Dann solltest Du das, was in #43 steht mal mit dem vergleichen, was in Deiner IDE steht. 2. Wenn man Dir Fragen stellt, wäre es schön, wenn Du diese beantworten und nicht ignorieren würdest.

Gruß Tommy

Zu 1: Sorry Leute, ich dachte die ganze Zeit hier wurde mein kompletter Sketch übernommen aber anscheinend hab ich nicht alles aus der IDE kopiert. Hier nun nochmal der wirklich komplette Sketch so wie ich ihn momentan nutze:

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

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

//Mux in "SIG" pin default for arduino mini pro 
const byte SIG_pin = 0; 

//Mux out "SIG" pin default for arduino mini pro
const byte OUT_pin = 5;

//Row and Column pins default for arduino mini pro
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);
  
  
  // 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]);
      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);
          
          //Saturation sensors
          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);
  }
}

Zu 2: Hatte ich zu Beginn des Threads mal erwähnt, ist für ein Projekt im Studium. Es soll die Belastung visualisiert und im besten Fall anhand von Werten dargestellt werden. Die Visualisierung funktioniert momentan mit Hilfe von Processing in Form von Peaks die bei Berührung angezeigt werden und je stärker der Druck auf die Sohle ist, desto höher wird der Peak.

Geht doch :)

Du hast write und print verwechselt, außerdem habe ich noch Zeilenvorschübe ergänzt:

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

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

//Mux in "SIG" pin default for arduino mini pro
const byte SIG_pin = 0;

//Mux out "SIG" pin default for arduino mini pro
const byte OUT_pin = 5;

//Row and Column pins default for arduino mini pro
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);


  // 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]);
      Serial.print("\t");
    }
    Serial.println();
  }

  Serial.println();
  Serial.print("Minimum Value: ");
  Serial.println(minsensor);
  Serial.println();

  Serial.println(F("neue Messung mit 'A'"));

  digitalWrite(COL_pin, LOW);
}


void loop() {

  if (Serial.available() > 0) {
    inByte = Serial.read();

    if (inByte == 'A') {

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

        for (int i = 0; i < 6; i++) {

          valor = readMux(i);

          //Saturation sensors
          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.print(valor);
          Serial.print(' ');
          digitalWrite(COL_pin, !digitalRead(COL_pin));
        }
        Serial.println();
      }
  Serial.println(F("\nneue Messung mit 'A'"));
    }

  }
}


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]);
  }
}

Das Programm macht noch nicht, was Du möchtest, aber zeigt nach jedem 'A' eine neue Ausgabe.

agmue: Geht doch :)

Du hast write und print verwechselt, außerdem habe ich noch Zeilenvorschübe ergänzt:

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

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

//Mux in "SIG" pin default for arduino mini pro const byte SIG_pin = 0;

//Mux out "SIG" pin default for arduino mini pro const byte OUT_pin = 5;

//Row and Column pins default for arduino mini pro 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);

  // 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]);       Serial.print("\t");     }     Serial.println();   }

  Serial.println();   Serial.print("Minimum Value: ");   Serial.println(minsensor);   Serial.println();

  Serial.println(F("neue Messung mit 'A'"));

  digitalWrite(COL_pin, LOW); }

void loop() {

  if (Serial.available() > 0) {     inByte = Serial.read();

    if (inByte == 'A') {

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

        for (int i = 0; i < 6; i++) {

          valor = readMux(i);

          //Saturation sensors           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.print(valor);           Serial.print(' ');           digitalWrite(COL_pin, !digitalRead(COL_pin));         }         Serial.println();       }   Serial.println(F("\nneue Messung mit 'A'"));     }

  } }

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]);   } }



Das Programm macht noch nicht, was Du möchtest, aber zeigt nach jedem 'A' eine neue Ausgabe.

Stark! Ich danke dir :) Im Grunde genommen ist es so schon ganz okay, den jetzt kann z.B. Person A sich daraufstellen und ich erhalte die dazugehörigen Werte, anschließend Person B und es werden wieder neue Werte erzeugt nach Senden eines 'A'. So weit so gut.

Nur verwundert mich gerade, dass bei der ersten Ausgabe die Werte ja ganz ordentlich aussehen und nach dem Senden eines 'A' ändern sich die Werte in der Matrix nicht überall und wenn dann auch nur gering. Ich erhalte sehr oft eine 0. Woran kann das liegen?

ma1kels: Woran kann das liegen?

Das könnte daran liegen, daß die Zuordnung der Werte zu den Feldelementen nicht stimmt. C++ läßt es leider zu, auch in Feldelemente zu schreiben, die nicht definiert/deklariert sind.

Beispiel: muxChannel[16][4] bedeutet, x<16 und y<4. Das solltest Du überall, wo muxChannel[][] verwendet wird, überprüfen. Das gilt auch für calibra[13][7] und pastmatrix[13][7], also alle Felder.

Wenn man da nicht sehr sauber programmiert, schmiert der Arduino irgendwann ab oder liefert irre Daten.

Hi

Wenn die Bitfolge von muxChannel nicht noch angepasst werden sollen - Das ist eine ganz normale binäre Zahl - so was kann man berechnen und muß keinen Speicher dafür opfern. (wobei 'berechnen' schon ein sehr großes Wort dafür ist)

MfG

postmaster-ino: Hi

Wenn die Bitfolge von muxChannel nicht noch angepasst werden sollen - Das ist eine ganz normale binäre Zahl - so was kann man berechnen und muß keinen Speicher dafür opfern. (wobei 'berechnen' schon ein sehr großes Wort dafür ist)

MfG

Hi, da musst du mir jetzt etwas weiter auf die Sprünge helfen. Verstehe grad nicht ganz was du meinst?

Gruß