Resistives Sensorarray für eine Schuhsohle (Velostat)

@DrDiettrich: Die Überschriften "Arduino Code" / "Processing Code" sind vertauscht.

import processing.serial.*; ist natürlich Java.

Ah ja, ich habe mich schon über setup() und loop() im Processing Code gewundert :wink:

michael_x:
@DrDiettrich: Die Überschriften "Arduino Code" / "Processing Code" sind vertauscht.

import processing.serial.*; ist natürlich Java.

Stimmt, auch eben erst gemerkt. Sorry dafür :slight_smile:

Kann mir nochmal jemand sagen wie ich den Widerstand für den Spannungsteiler wähle? Wenn ich mein Multimeter anschließe zeigt mir dieses einen sich dauernd abnehmenden Wert beginnend bei 50kOhm bis ca 20kOhm... beim Aufbringen von Druck ändert sich dieser auf etwa 2 - 1,5kOhm.

Vielleicht kriecht das Material beim Auflegen der Meßspitzen. Der Meßwiderstand sollte etwa in der Mitte des Widerstandsbereichs liegen, wobei die Obergrenze schon durch die normale Belastung (Körpergewicht) begrenzt ist.

Hi,

die Messung des Widerstandes ist am genauesten, wenn Du oben wie unten den gleichen Spannungswert hast (rawADC 1024 / 2), zu den Rändern hin wird der Wert immer ungenauer. Die Messfehlerkurve ergibt eine Badewanne zwischen den Werten 0 bis 1023, in der Mitte flach (genau) und knapp vor dem Rand jeweils steil ansteigend. Da Du Werte zwischen 1,5k und ca. 20k nennst, würde ich ca. 5,4k Ohm nehmen, dann hast Du in Richtung 1,5k Faktor 3,6x wie auch in Richtung 20k, liegst also in der Mitte Deiner genannten Daten.

Gruß André

michael_x:
Zum Spass kannst du den Messwert vor der Ausgabe durch 100 teilen und bekommst so nur einstellige Zahlen, die sich so von selbst in einer Matrix abbilden, die deiner Schuhsohle entspricht. ( Sowas meinte ich mit geringer Auflösung)

Hallo Michael,

ich komme nochmal zurück auf deinen Tipp hier.

Ich habe nun Meinen Arduino Code soweit fertig, nur wenn ich mir den Seriellen Monitor öffne, werden mir zwar die Werte in Form einer Matrix (12x6) angezeigt, dass aber nur ein einziges mal. Die Werte ändern sich also nicht mehr bei Belastung. Mein Ziel ist, dass der serielle Monitor bei jedem neuen Kontakt mit der Sohle eine neue Matrix mit neuen Werten ausgibt.

Hier der aktuelle Sketch:

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

Du hast das so gebaut, dass erst bei Eingabe eines 'A' eine neue Messung getriggert wird. Tust Du das?

Gruß Tommy

Tommy56:
Du hast das so gebaut, dass erst bei Eingabe eines 'A' eine neue Messung getriggert wird. Tust Du das?

Gruß Tommy

Du meinst wenn ich ein 'A' sende? Also bei mir kommt halt am Anfang die gewünschte Matrix mit den Werten (je nachdem wie stark ich Anfangs die Sohle belaste) und ab dann tut sich nichts mehr, außer dass ich eben ein nach rechts fortlaufendes 'A' unterhalb der Matrix bekomme (establishContact).

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.