Arduino Forum

International => Deutsch => Topic started by: ma1kels on Jul 06, 2018, 12:42 pm

Title: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 06, 2018, 12:42 pm
Hi! Das hier ist mein erstes Arduino-Projekt, welches ich für die Uni benötige.
Ich habe eine Schuhsohle gebastelt mit je 6 Spalten und 12 Zeilen an Kupferbahnen (Bild ist angehängt). Dazwischen liegt eine Velostat-Schicht. Teste ich das Ganze vorab mit dem Multimeter scheint es auch ganz gut zu funktionieren. So für die Auswertung habe ich mir zwei 16-Channel-Analog Multiplexer von SparkFun besorgt und programmieren möchte ich es mit einem Arduino Pro Mini.

Meine Frage jetzt, weiß jemand wie ich die Kreuzungen der Kupferbahnen, also die einzelnen Sensorelemente, über den seriellen Monitor auslesen kann? (Widerstand? Spannung? Druck?)
Evtl. wäre auch ein Sketch für Arduino und Processing zur visualisierten Darstellung wo auf der Sohle und wie stark der Druck aufgebracht wird, hilfreich.

Ich bedanke mich schon herzlichst im Voraus bei euch allen!!

Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 06, 2018, 01:33 pm
Und die 6*12 = 72 Widerstand-Werte zu erfassen ist kein Problem?
Toll. (Zeig mal ;) )


Wie schnell soll das Ganze sein?
Die Auflösung ist vermutlich nicht so hoch. Ein Byte/Wert reicht sicher; wenn das Ergebnis nur als verschiedene Farben dargestellt wird, evtl. sogar nur Werte '0' ...'9'
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: DrDiettrich on Jul 06, 2018, 09:28 pm
Die Widerstände hängen über die Velostat-Schicht zusammen, nehme ich an. Oder gehört zu jeder Kreuzung ein isolierter Velostat-Punkt?

Ein Arduino kann nur Spannungen messen, es muß also über einen Multiplexer eine Spannung an eine Sensor-Zeile gelegt werden, mit dem anderen Multiplexer wird die Spalte ausgewählt, und mit einem Analog-Eingang und einem Ableit-Widerstand nach Gnd verbunden werden (Spannungsteiler). Mit 6 Analog-Eingängen kann man den zweiten Mux auch sparen, nur geht dann kein I2C mehr (benutzt A5/A6).
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 08, 2018, 10:50 am
Quote from: ma1kels
zwei 16-Channel-Analog Multiplexer von SparkFun
Wenn es die hier (https://www.sparkfun.com/products/9056) sind oder etwas ähnliches, reicht eigentlich einer, der mit 4 Adress-Bits einen von 12 (16) Kanälen lesen kann. 6 Ausgangspins für die Spalten, bleibt Rx / Tx frei für den "SerialMonitor" bzw. das PC - Anzeige/Auswerteprogramm.

Quote
Teste ich das Ganze vorab mit dem Multimeter scheint es auch ganz gut zu funktionieren.
Ich nehme mal an, du nimmst einen Widerstandsmessbereich und misst zwischen einer Spalte und eine Zeile? Wenn du dann den Kreuzungspunkt belastest, ändert sich der Messwert ?

Mit dem Arduino kannst du nur Spannungen messen. Brauchst also einen zusätzlichen konstanten Widerstand, der mit deinem Messwiderstand einen Spannungsteiler bildet.
Code: [Select]

Spalten  1 ... 6 

Zeilen  A0 ... A11 

            |
            |
   S0 ---- MUX  --- SIG --+-- R ---- GND
   S1 ----                |
   S2 ----                +--------- A0
   S3 ----

 Eine der Spalten 1..6 HIGH und die 4 Adress-Bits S0 .. S3 per Arduino OUTPUT einstellen, und an A0 kann der entsprechende Messwert gelesen werden.

Die Auflösung ist am besten, wenn der Widerstand R eine ähnliche Größenordnung hat wie der Widerstand zwischen Zeile und Spalte.

Erstmal je Adresse die 6 Spalten lesen und nacheinander in einer Zeile die Werte auf Serial ausgeben.
Dann das gleiche für die nächste Adresse in der nächsten Zeile.

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)
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 08, 2018, 11:13 pm
okay, den ersten Teil verstehe ich. Aber mit dem "code" verstehe ich nicht ganz was du mir sagen willst?!

Und ab hier..

Quote
Die Auflösung ist am besten, wenn der Widerstand R eine ähnliche Größenordnung hat wie der Widerstand zwischen Zeile und Spalte.

Erstmal je Adresse die 6 Spalten lesen und nacheinander in einer Zeile die Werte auf Serial ausgeben.
Dann das gleiche für die nächste Adresse in der nächsten Zeile.

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)
.. hört es bei mir ganz auf  :( Also ich verstehe es was du meinst, aber ich hab keine Ahnung wie man das im Arduino Sketch umsetzt.

Hier ist mal der Steckbrett-Aufbau (Auf dem Bild wird ein Array von 15x15 verwendet, bei mir bleibt es 6x12): https://cdn.instructables.com/FDC/6B90/IB3HOF9S/FDC6B90IB3HOF9S.LARGE.jpg und im Anhang ist ein Bild des Sohlen-Aufbaus zu sehen.

Auf jeden Fall vielen Dank für die bereits geleistete Hilfe.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: gregorss on Jul 08, 2018, 11:16 pm
.. hört es bei mir ganz auf  :( Also ich verstehe es was du meinst, aber ich hab keine Ahnung wie man das im Arduino Sketch umsetzt.
Michael spricht vom Messen (Spannungen mit dem Multimeter). Da musst Du im Sketch überhaupt nichts tun.

Gruß

Gregor
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: LD- on Jul 08, 2018, 11:57 pm
Bei dir ändert sich der Widerstand der Schicht zwischen den Kontakten. Du misst quasi immer den Widerstand zwischen den beiden Bahnen eines Kreuzungspunktes deiner Sohle. Mit dem Multimeter gar kein Problem, dummerweise kann ein MCU keinen Widerstand direkt messen. Allerdings können sie meist recht gut Spannung messen. Also wandelst du den Widerstandswert in eine Spannung um mittels eines Spannungsteilers. Ein solcher besteht in der Regel aus 2 Widerständen in Reihe, wobei die Spannung in der Mitte der beiden Widerstände gemessen wird. Du hast bis jetzt nur einen Widerstand (genauer 72x einen Einzelwiderstand, welcher seinen Wert ändert). Um einen Spannungsteiler daraus zu machen brauchst du einen festen Referenzwiderstand. Dieser sollte ungefähr in der Größenordnung liegen, in der sich auch der Widerstandswert deiner Schickt befindet. Ansonsten geht die Änderung durch das Draufdrücken auf die Schicht komplett unter.

Wenn es jetzt ans Programmieren geht einfach über den Mux einen der Kreuzungspunkte wählen und über "analogRead(Pin)" den Spannungswert auslesen. Anschließend kannst du diesen in den eigentlichen Wiederstandwert oder auch in einen Druck umrechnen.

Um zu schauen ob es geht einfach alle 72 Werte als lange Zeile oder in einer Art kleinen Tabelle ausgeben (Im Setup: Serial.begin(), im Loop: Serial.println("text")). Sieht nicht hübsch aus, aber du solltest sehen, dass sich die Werte ändern. Später kann man das ganze dann als Pixel darstellen.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 09, 2018, 10:02 am
Quote
Bei dir ändert sich der Widerstand der Schicht zwischen den Kontakten. Du misst quasi immer den Widerstand zwischen den beiden Bahnen eines Kreuzungspunktes deiner Sohle. Mit dem Multimeter gar kein Problem, dummerweise kann ein MCU keinen Widerstand direkt messen. Allerdings können sie meist recht gut Spannung messen. Also wandelst du den Widerstandswert in eine Spannung um mittels eines Spannungsteilers. Ein solcher besteht in der Regel aus 2 Widerständen in Reihe, wobei die Spannung in der Mitte der beiden Widerstände gemessen wird. Du hast bis jetzt nur einen Widerstand (genauer 72x einen Einzelwiderstand, welcher seinen Wert ändert). Um einen Spannungsteiler daraus zu machen brauchst du einen festen Referenzwiderstand. Dieser sollte ungefähr in der Größenordnung liegen, in der sich auch der Widerstandswert deiner Schickt befindet. Ansonsten geht die Änderung durch das Draufdrücken auf die Schicht komplett unter.
Das heißt also ich messe nochmal den Widerstand zwischen den beiden Bahnen eines Kreuzungspunktes und wähle dann einen Referenzwiderstand der dieser Größenordnung entspricht, richtig?! Wie verschalte ich diesen dann auf dem Steckbrett? An den VCC-Pin des Arduino? Sorry für die banalen Fragen, aber für mich ist es nicht ganz so simpel  :smiley-confuse:

 
Quote
Wenn es jetzt ans Programmieren geht einfach über den Mux einen der Kreuzungspunkte wählen und über "analogRead(Pin)" den Spannungswert auslesen
Ich schließe quasi meine Sohle jetzt an die beiden Mux an und über "analogRead(Pin)" wähle ich die entsprechenden Kanäle dann?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 09, 2018, 12:11 pm
Sorry für die Verwirrung. "Code"-Formatierung habe ich nur verwendet, damit die Ascii-Grafik besser rüber kommt.
GND und A0 sind Arduino Pins
S0 ... S3 sind Multiplexer Pins die vom Arduino angesteuert werden
A0 ... A11 sind die Multiplexer Eingänge
SIG der Multiplexer Ausgang
R der Spannungsteiler-Widerstand

--- + |  sollen Verbindungen darstellen und das Ganze einen Schaltplan, keinen Code.



Quote
Ich schließe quasi meine Sohle jetzt an die beiden Mux an und über "analogRead(Pin)" wähle ich die entsprechenden Kanäle dann?
Wenn du unbedingt zwei Mux verwenden willst, adressierst du über einen eine Spalte und über den anderen eine Zeile. und nutzt aus, dass die Mux bidirektional arbeiten. Der eine SIG bekommt 5V und schaltet diese auf 1 von 6 (16) Ausgängen, der andere SIG hat liefert dann die Spannung hinter dem Messwiderstand.

Um den Analogwert zu lesen brauchst du nur einen einzigen Analog-Eingang und einen Spannungsteiler-Widerstand.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 10, 2018, 11:51 am
Eine der Spalten 1..6 HIGH und die 4 Adress-Bits S0 .. S3 per Arduino OUTPUT einstellen, und an A0 kann der entsprechende Messwert gelesen werden.


Erstmal je Adresse die 6 Spalten lesen und nacheinander in einer Zeile die Werte auf Serial ausgeben.
Dann das gleiche für die nächste Adresse in der nächsten Zeile.

Wenn es jetzt ans Programmieren geht einfach über den Mux einen der Kreuzungspunkte wählen und über "analogRead(Pin)" den Spannungswert auslesen. Anschließend kannst du diesen in den eigentlichen Wiederstandwert oder auch in einen Druck umrechnen.

Um zu schauen ob es geht einfach alle 72 Werte als lange Zeile oder in einer Art kleinen Tabelle ausgeben (Im Setup: Serial.begin(), im Loop: Serial.println("text")). Sieht nicht hübsch aus, aber du solltest sehen, dass sich die Werte ändern. Später kann man das ganze dann als Pixel darstellen.
So ich habe jetzt mal die hier erwähnten Hinweise versucht als code darzustellen ... Kann jemand mal darüber gucken und mir feedback geben ob es den so gemeint ist?

Code: [Select]

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

int columnPin = 9;

int analogPin = A0;

int val = 0;

void setup() {
 
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);

  digitalWrite(columnPin, HIGH);

  Serial.begin(9600);

  
}

void loop() {
  val = analogRead(analogPin);
  Serial.println(val);

}
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 10, 2018, 03:33 pm
Das ist doch schonmal ein Anfang ;)

Ich sehe jetzt nicht genau, wofür
   int columnPin = 9;
gut ist.

Willst du 1 oder 2 Multiplexer verwenden?
( Im Augenblick verwendest du noch gar keinen, bzw. liest permanent von Kanal 0 )

Erstmal mit nur einem MUX und ohne dynamische Spalten-Anwahl:
Musst du nacheinander die Kanäle 0 .. 11  des MUX adressieren.

z.B. so oder ähnlich:

Code: [Select]
...
byte kanal = 0; // Wertebereich 0 .. 11
void loop () {
  setzeMUXAdresse(kanal, s0, s1, s2, s3) ;
  int val =  analogRead(analogPin);
  Serial.print ("Kanal "); Serial print(kanal);
  Serial.print(" : "); Serial.println(val);
  delay(100); // zum Test verlangsamen
  kanal++;
  if (kanal > 11) kanal = 0;
}

void setzeMUXAdresse(byte kanal, const byte S0, const byte S1, const byte S2, const byte S3) {
  digitalWrite(S0, bitRead(kanal, 0);
  digitalWrite(S1, bitRead(kanal, 1);
  digitalWrite(S2, bitRead(kanal, 2);
  digitalWrite(S3, bitRead(kanal, 3);
}
Mit den vielen Parametern kannst du die Funktion setzeMUXAdresse mehrfach (für zwei MUX) verwenden.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 10, 2018, 06:51 pm




Quote
Willst du 1 oder 2 Multiplexer verwenden?
( Im Augenblick verwendest du noch gar keinen, bzw. liest permanent von Kanal 0 )
Na wenn es mit 1 Multiplexer auch geht, dann erstmal einen ;)

Quote
Erstmal mit nur einem MUX und ohne dynamische Spalten-Anwahl:
Musst du nacheinander die Kanäle 0 .. 11  des MUX adressieren.

z.B. so oder ähnlich:

Okay, ich hab den sketch jetzt mal angepasst und deinen part noch eingebunden. Der serielle Monitor gibt mir jetzt Kanal 0: 0 - Kanal 11:0 aus. (Habe die Schaltung noch nicht umgebaut und den Spannungsteiler noch nicht drin.) Wenn das dann richtig aufgebaut ist sollte mir hier die Spannung angezeigt werden, richtig? Also ich drücke quasi auf meiner Sohle auf einen Kreuzungspunkt von Spalte und Reihe und je nachdem welche Reihe (Kanal 0-11) nun belastet wird, so zeigt mir der serielle Monitor den entsprechenden Wert?

Wo schließe ich den aber jetzt mein Kabel mit den 6 Pins an? Also die 12 Pins kommen ja an den Multiplexer an Ch 0-11, soweit ist es mir klar.

Danke!  

Hier mein aktueller code:


Code: [Select]

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

int analogPin = A0;

int val = 0;

byte kanal = 0; // Wertebereich 0 .. 11

void setup() {
 
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);


  Serial.begin(9600);
 
}

void loop() {
  setzeMUXAdresse(kanal, s0, s1, s2, s3) ;
  int val =  analogRead(analogPin);
  Serial.print("Kanal"); Serial.print(kanal);
  Serial.print(" : "); Serial.println(val);
  delay(500);
  kanal++;
  if (kanal > 11) kanal = 0;
}

void setzeMUXAdresse(byte kanal, const byte S0, const byte S1, const byte S2, const byte S3) {
  digitalWrite(S0, bitRead(kanal, 0));
  digitalWrite(S1, bitRead(kanal, 1));
  digitalWrite(S2, bitRead(kanal, 2));
  digitalWrite(S3, bitRead(kanal, 3));
}
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 10, 2018, 08:12 pm
Ich würde langsam vorgehen, und mich erstmal über 12 lebende Messwerte freuen, bevor ich auch noch die 6 Spalten schalte.

Dazu brauchst du nur die interessierende Spalte mit 5V zu verbinden und den Widerstand zwischen GND und den Analog-Eingang = MUX - Ausgang. Fertig ist der Spannungsteiler.


Statt 5V kannst du natürlich auch einen von 6 weiteren Ausgängen verwenden, die du an die Spalten anschliesst und so das Spalten-Multiplexen direkt machst.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 10, 2018, 10:26 pm
Ich würde langsam vorgehen, und mich erstmal über 12 lebende Messwerte freuen, bevor ich auch noch die 6 Spalten schalte.
Na ich kriege aber doch keinen Messwert wenn ich nur die 12 Reihen schalte, weil dieser entsteht doch durch den Kontakt von "Spalte - Velostat - Reihe" ?! Oder verstehe ich dich jetzt falsch?


Quote
Statt 5V kannst du natürlich auch einen von 6 weiteren Ausgängen verwenden, die du an die Spalten anschliesst und so das Spalten-Multiplexen direkt machst.
Von welchen Ausgängen ist die Rede? Mit 5V direkt verbinden wird nicht gehen da ich die Spalten und Reihen ja über Flachbandkabel mit 6-poligen und 12-poligen Steckverbinder kontaktiert habe.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 11, 2018, 02:18 am
Mir ist ein Problem aufgefallen:
Wenn alle Kreuzungspunkte mit der Velostat-Widerstandsmatte untereinander verbunden sind, bräuchte man noch zusätzlich in jedem Kreuzungspunkt eine Diode, um das Ganze frei von Rückwirkungen zu halten, oder ?

Aber das müsste auch schon bei deiner direkten Widerstandmessung zwischen einem Spalten- und einem Reihendraht der Fall sein, auch wenn die gerade nicht aktiven Reihen und Spalten nicht auf LOW, sondern offen sind.
(https://forum.arduino.cc/index.php?action=dlattach;topic=556800.0;attach=265571)
Oder habe ich da einen Denkfehler ?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: SpaghettiCode on Jul 11, 2018, 08:43 am
Wenn alle Kreuzungspunkte mit der Velostat-Widerstandsmatte untereinander verbunden sind, bräuchte man noch zusätzlich in jedem Kreuzungspunkt eine Diode, um das Ganze frei von Rückwirkungen zu halten, oder ?
Naja, ein "Kanalübersprechen" hast Du bei so einer Konstruktion schon, aber solange der Widerstand am direkten Druckpunkt um wenigstens eine Größenordnung kleiner ist als der Widerstand zum Nachbarkanal (Spalte) sollte das Signal auswertbar bleiben. Hier hängt viel von der Sohlenkonstruktion ab, wie gut die Druckpunkte voneinander unterscheidbar und damit messbar sind.

Gruß André

Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 11, 2018, 02:50 pm
Quote
Mir ist ein Problem aufgefallen:
Wenn alle Kreuzungspunkte mit der Velostat-Widerstandsmatte untereinander verbunden sind, bräuchte man noch zusätzlich in jedem Kreuzungspunkt eine Diode, um das Ganze frei von Rückwirkungen zu halten, oder ?

Aber das müsste auch schon bei deiner direkten Widerstandmessung zwischen einem Spalten- und einem Reihendraht der Fall sein, auch wenn die gerade nicht aktiven Reihen und Spalten nicht auf LOW, sondern offen sind.
Ne da denkst du falsch glaub ich, also es funktioniert vom Aufbau her alles so wie es sollte. Mir fehlt jetzt eben nur noch der korrekte Anschluss der 6 Spalten.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 11, 2018, 03:10 pm
Quote
fehlt jetzt eben nur noch der korrekte Anschluss der 6 Spalten
In meinem Bildchen von heute 02:18 sind das die Linien links (4 in diesem Beispiel-Bild)
Eine von denen sollte OUTPUT HIGH sein, die anderen INPUT (= High Impedance) oder LOW.

Quote
solange der Widerstand am direkten Druckpunkt um wenigstens eine Größenordnung kleiner ist als der Widerstand zum Nachbarkanal
Na, im Gegensatz zu einer Tasten-Matrix, werden ja "alle" Kreuzungspunkte mehr oder weniger gleichmässig belastet. Immerhin geht der Einfluss der Nachbar-Kanäle durch zwei Widerstände hintereinander, aber dafür durch alle 5 Nachbarspalten. So ganz bin ich von einer Lösung ohne Dioden noch nicht überzeugt.



Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: SpaghettiCode on Jul 11, 2018, 03:23 pm
Immerhin geht der Einfluss der Nachbar-Kanäle durch zwei Widerstände hintereinander, aber dafür durch alle 5 Nachbarspalten.
Damit hast Du zwar Recht, aber um so weiter weg der 2. /3./ 4. Nachbarkanal ist um so größer und unbedeutender wird der Widerstand der Folie. Die soll nur 0.1 - 0.2mm dick sein. Unter der Annahme, daß der Widerstand der Folie nicht richtungsgebunden ist, hast Du am Druckpunkt 0,1mm Folie, zum Nachbardruckpunkt meinetwegen 5mm, also 1:50 auch den Widerstand. Der übernächste ist dann schon egal ...
Als Denkanstoß: der NANO hat 8 Analogeingänge A0-A7, A4+A5 sind I²C, bleiben 6x, passt!

Gruß André
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 11, 2018, 03:34 pm
Mir geht es nicht darum, den Widerstand über mehrere Zentimeter längs der Folie zu messen.

Vielmehr denke ich, dass die Widerstände an den anderen Kreuzungspunkten über die im Moment eigentlich nicht beachteten Spalten- und Reihen-Leitungen mitgemessen werden.

Wenn ein Fuß auf der Sohle steht, sind gut die Hälfte der Kreuzungspunkte mehr oder weniger belastet, und eine Mischung aus vielen parallel und hintereinander geschalteten Widerständen wird bei jeder Zeile-Spalte-Kombi gemessen.
( Wenn nicht jeder Kreuzungspunkt mit einer Diode entkoppelt wird. )
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: SpaghettiCode on Jul 11, 2018, 04:05 pm
Michael, ich glaube Du hast Recht.
Ohne Entkopplung bekommt man da eine Menge paralell und seriell geschalteter Widerstände "zu sehen",
da der Druckpunkt eben kein Punkt ist, sondern flächig mit ein paar Nuancen. Ich war da noch beim DruckPunkt.

Gruß André
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 11, 2018, 05:07 pm
Quote
Als Denkanstoß: der NANO hat 8 Analogeingänge A0-A7, A4+A5 sind I²C, bleiben 6x, passt!
Ich nutze einen Pro Mini, da habe ich nur A0-A3 ?!


Quote
Wenn ein Fuß auf der Sohle steht, sind gut die Hälfte der Kreuzungspunkte mehr oder weniger belastet, und eine Mischung aus vielen parallel und hintereinander geschalteten Widerständen wird bei jeder Zeile-Spalte-Kombi gemessen.
Also das eigentliche Ziel am Ende soll sein, die Druckverteilung in Form einer Heatmap über Processing darstellen zu können. Ich denke da spielen die parallel und seriell geschalteten Widerstände keine Rolle oder?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 11, 2018, 05:22 pm
Ich denke da spielen die parallel und seriell geschalteten Widerstände keine Rolle oder?
Schlechte Sensorwerte ergeben eine schlechte Heatmap. Den Einwand von michael_x solltest Du daher auf jeden Fall ernst nehmen. Wenn Du Druckpunkte hättest, könntest Du auf einen vernachlässigbaren Einfluß hoffen. Dein Bild zeigt aber große Druckflächen relativ zu den Bereichen ohne Kupferfolie, weshalb ich diese Vereinfachung für unwahrscheinlich erachten und nur nach sorgfältigen Messungen akzeptieren würde.

Ich hoffe, Dir ist die Langsamkeit des AD-Wandlers bewußt.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: combie on Jul 11, 2018, 05:25 pm
Quote
Ich nutze einen Pro Mini, da habe ich nur A0-A3 ?!
Schaue nochmal genau nach....
Auch mal die Lötpunkte abseits der üblichen Stiftleisten.
Da wirst du vermutlich A6 und A7 finden.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 11, 2018, 05:47 pm
In meinem Bildchen von heute 02:18 sind das die Linien links (4 in diesem Beispiel-Bild)
Eine von denen sollte OUTPUT HIGH sein, die anderen INPUT (= High Impedance) oder LOW.

Okay, Danke habe es verstanden. Ist den der Code hier dann so auch in Ordnung?

Code: [Select]
//Mux control pins for output signal (OUT_pin) default for arduino mini pro
const byte s0 = 13;
const byte s1 = 12;
const byte s2 = 11;
const byte s3 = 10;

int analogPin = A0;

int val = 0;

byte kanal = 0; // Wertebereich 0 .. 11

void setup() {
 
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);


  Serial.begin(9600);
 
}

void loop() {
  setzeMUXAdresse(kanal, s0, s1, s2, s3) ;
  int val =  analogRead(analogPin);
  Serial.print("Kanal"); Serial.print(kanal);
  Serial.print(" : "); Serial.println(val);
  delay(500);
  kanal++;
  if (kanal > 11) kanal = 0;
}

void setzeMUXAdresse(byte kanal, const byte S0, const byte S1, const byte S2, const byte S3) {
  digitalWrite(S0, bitRead(kanal, 0));
  digitalWrite(S1, bitRead(kanal, 1));
  digitalWrite(S2, bitRead(kanal, 2));
  digitalWrite(S3, bitRead(kanal, 3));
}


Quote
Schlechte Sensorwerte ergeben eine schlechte Heatmap. Den Einwand von michael_x solltest Du daher auf jeden Fall ernst nehmen.
Ja na gut, das klingt logisch. Ich werd den Tipp im Hinterkopf behalten und in der Schaltung berücksichtigen. Ich bräuchte ja dann 72 Dioden + Vorwiderstände? Hab ich es so richtig verstanden? Zwischen jeden Kreuzungspunkt eine Diode mit Vorwiderstand schalten?

Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 11, 2018, 05:52 pm
Quote
Ist den der Code hier dann so auch in Ordnung
Na ja, das ist noch der Code vom letzten Mal.

Mit dem du 1 von den 6 Spalten messen kannst,  (wenn du sie entsprechend anschliesst)

Aber sonst immer noch in Ordnung, schätze ich mal...
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: SpaghettiCode on Jul 11, 2018, 06:14 pm
Ich bräuchte ja dann 72 Dioden + Vorwiderstände? Hab ich es so richtig verstanden? Zwischen jeden Kreuzungspunkt eine Diode mit Vorwiderstand schalten?
In Michaels Schaltung in #14 sind die Widerstände Deine Foliendruckpunkte. Und ja, 72 Dioden. Und wenn ich jetzt richtig liege, müssten die mit in die Sohle, oder Du musst jede Menge Drähte nach außen führen. Und da die Dioden nicht Deine Druckpunkte sein sollen, solltest Du Dir ein neues Design überlegen. Damit brauchst Du kleine Dioden.
https://diotec.com/tl_files/diotec/files/pdf/datasheets/1n4148ws.pdf (https://diotec.com/tl_files/diotec/files/pdf/datasheets/1n4148ws.pdf) ... gibts für 2c bei Reichelt. Und die müssen dann auch noch mit viel "Luft" verlötet werden, also daß die nicht sofort abreißen bei der ersten Dehnung der Sohle.
Ich hoffe, ich habe es diesmal bis zu Ende gedacht, Michael?

Gruß André
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: DrDiettrich on Jul 12, 2018, 04:45 am
Wenn die Kreuzungspunkte nicht isolierte Punkte sind, sondern über die Velostat-Matte miteinander verbunden sind, dann läßt sich da nicht viel sinnvoll messen, egal ob mit oder ohne Dioden. Es bleibt nichts übrig als die Matte zu zerschnipseln, so daß alle Kreuzungspunkte voneinander isoliert sind.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 12, 2018, 11:05 am
Quote
Es bleibt nichts übrig als die Matte zu zerschnipseln, so daß alle Kreuzungspunkte voneinander isoliert sind.
Na ich denke, der Widerstand von einem "Kreuzungspunkt" zum nächsten ist erheblich größer als der Widerstand quer durch die Dicke der Matte. Das wäre also eher uninteressant oder egal.

Aber wie man da mechanisch die (72) Dioden zuverlässig reinkriegt, weiß ich auch nicht.
Das simple Prinzip mit den Kupferbahnen kreuzweise und der Matte dazwischen ist damit weg.

Gibt es noch "Plattengleichrichter" ?
Meine Vermutung: a) nein b) auch keine Lösung

Wie kriegt man so Dinger
(https://ae01.alicdn.com/kf/HTB16NXka97PL1JjSZFHq6AciXXaq.jpg)
hochkant gehalten, so dass man sich draufstellen kann und sie auch noch einen Kontaktwiderstand deutlich kleiner als die Velostat - Matte haben?

Das Bild stellte übrigens AliExpress (https://www.aliexpress.com/item/100PCS-Diode-SMD-SMT-LL4148-1N4148/1852107559.html) freundlicherweise zur Verfügung
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 12, 2018, 11:12 am
Hier wären mal konkrete Widerstandswerte vom TO hilfreich.

a) zwischen 2 gekreuzten Elektroden am Messpunkt unbelastet
b) zwischen 2 gekreuzten Elektroden am Messpunkt maximal belastet
c) zwischen 2 benachbarten Elektroden in Längsrichtung
d) zwischen 2 benachbarten Elektroden in Querrichtung

Dann wäre es nicht nur ein Herumgerate.

Gruß Tommy
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 12, 2018, 11:30 am
Jetzt mal doof gefragt, wo liegt der Unterschied zu dem gezeigten hier in dem Video: https://www.youtube.com/watch?v=xvmgzwjKnN4? Da funktioniert es doch auch nach dem Schema?!
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 12, 2018, 12:18 pm
Na ja, das ist noch der Code vom letzten Mal.

Mit dem du 1 von den 6 Spalten messen kannst,  (wenn du sie entsprechend anschliesst)

Aber sonst immer noch in Ordnung, schätze ich mal...
Der serielle Monitor hat mir jetzt mal bei starker Belastung der entsprechenden Reihe/Spalte Werte von bis zu 900 ausgegeben. Über Dreisatz kann ich mir nun also meinen Spannungswert errechnen oder? (5V = 1023 und xV = 900). Wie komme ich jetzt aber auf den Widerstandswert? Also R = U/I, doch was ist mein I? Und besteht die möglich dann anschließend noch einen Druckwert zu ermitteln?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 12, 2018, 12:40 pm
Über den Spannungsteiler

 U1 / (U1+ U2) = R1 / ( R1 + R2)

(U1 + U2) sind deine 5V

R2 ist dein Spannungsteiler-Widerstand


Aber brauchst du den Widerstand überhaupt ?
Und wie kriegt man bei solch einer Matte aus dem gemessenen Widerstand den Druck?

Einfacher dürfte es sein, zu gegebenen Gewichten die sich ergebenden Roh-Messwerte zu notieren.
Und auf einigermaßen lineare Verhältnisse hoffen.
Oder das Haupt-Augenmerk auf imposante gaphische Darstellung legen ;)


Nach dem verlinkten Video sieht das Ganze ja einfach und problemlos aus, Viel Erfolg ! 

Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 12, 2018, 01:15 pm
Nach dem verlinkten Video sieht das Ganze ja einfach und problemlos aus, Viel Erfolg ! 

Ich habe es auch bereits mit dem dort verwendeten code versucht umzusetzen. Habe diesen natürlich auf eine 12x6 Matrix angepasst, sowohl im Arduino als auch im Processing. Ändere ich die beiden Sketche nicht, also starte ich es mit 15x15, dann läuft alles bis auf die Darstellung im Processing, die zeigt mir natürlich 225 Kästchen an. Aber sobald ich alle Befehle auf 12x6 anpasse und wieder auf den Arduino spiele, dann zeigt mir die Darstellung zwar 72 Kästchen an, aber es tut sich nicht wirklich was. Woran könnte es liegen?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 12, 2018, 02:34 pm
Woran könnte es liegen?

An deiner Anpassung ;)

"Sowohl im Arduino als auch im Processing"
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 12, 2018, 03:06 pm
Woran könnte es liegen?

An deiner Anpassung ;)

"Sowohl im Arduino als auch im Processing"
Vielleicht kann ja mal einer noch darüber gucken?
Hier der Processing Code:
Code: [Select]


import processing.serial.*;
import processing.opengl.*;


int bgcolor;                 // Background color
int fgcolor;                 // Fill color
Serial myPort;                       // The serial port
int[] serialInArray = new int[72];    // Where we'll put what we receive
int[] pastInArray = new int [72];
float[][] colorTarget   = new float[3][255];
float[][] currentColor   = new float[3][255];
PVector[][] vertices = new PVector[6][12];
float[] verticesTZ = new float[12];
float w = 18;
float ease = 0.75;

int serialCount = 0;                 // A count of how many bytes we receive
int xpos, ypos;                  // Starting position
boolean firstContact = false;        // Whether we've heard from the microcontroller
int tiempoant;
int render=0;
int dif=0;

void setup() {
  size(960, 600, OPENGL);  // Stage size
  noStroke();      // No border on the next thing draw
 
 
  // Print a list of the serial ports, for debugging purposes:
  println(Serial.list());

  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
 
  myPort = new Serial(this, Serial.list()[1], 115200);
 
  for (int j = 0; j < 12; j++) {
        for (int i = 0; i < 6; i++) {
            vertices[i][j] = new PVector( i*w, j*w, 0);
        }
    }
   
 
}

void draw() {

  if (render==1) {
   
    translate(width/4, 100);
    rotateX(0.5);
    //rotateX(PI/10);
    background(0);
    for (int j=0; j<11; j++) {
      beginShape(QUAD_STRIP);
      for (int i=0; i<6; i++) {
          stroke(255);
     
          fill(serialInArray[j*6+i], 0, 0);
          float x = i*width/12;
          float y = j*height/6;
          verticesTZ[i] = serialInArray[j*6+i];
         
          vertices[i][j].z += (verticesTZ[i]-vertices[i][j].z)*ease;
          vertex( vertices[i][j].x, vertices[i][j].y, vertices[i][j].z);
          vertex( vertices[i][j+1].x, vertices[i][j+1].y, vertices[i][j+1].z);
        }
         endShape(CLOSE);
        //        println();
      }
      render=0;
  }
}

void serialEvent(Serial myPort) {
  // read a byte from the serial port:
  int inByte = myPort.read();
  // if this is the first byte received, and it's an A,
  // clear the serial buffer and note that you've
  // h
  //  ad first contact from the microcontroller.
  // Otherwise, add the incoming byte to the array:
  if (firstContact == false) {
    if (inByte == 'A') {
      myPort.clear();          // clear the serial port buffer
      firstContact = true;     // you've had first contact from the microcontroller
      myPort.write('A');       // ask for more
    }
  } else {
    // Add the latest byte from the serial port to array:

      serialInArray[serialCount] = inByte;

    serialCount++;

    // If we have 3 bytes:
    if (serialCount > 71 ) {
      println(millis()-tiempoant);
      tiempoant = millis();
     
      render = 1;
   
      // Send a capital A to request new sensor readings:
      myPort.write('A');
      // Reset serialCount:
      serialCount = 0;
    }
  }
}


Und hier das Arduino Pendant:
Code: [Select]


//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[12][6];         //Calibration array for the min values of each od the 72 sensors.
int minsensor=254;          //Variable for staring the min array
int multiplier = 254;
int pastmatrix[12][6];

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);
 
  Serial.println("\n\Calibrating...\n");
 
  // Full of 0's of initial matrix
  for(byte j = 0; j < 12; j ++){
    writeMux(j);
    for(byte i = 0; i < 6; i ++)
      calibra[j][i] = 0;
  }
 
  // Calibration
  for(byte k = 0; k < 50; k++){ 
    for(byte j = 0; j < 12; j ++){
      writeMux(j);
      for(byte i = 0; i < 6; 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(){
  //Loop through and read all 16 values
  //Reports back Value at channel 6 is: 346
  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);
  }
}


Im Anhang ist ein Foto der Darstellung die ich von Processing bekomme. Nur dass das Ganze sich ständig bewegt.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: DrDiettrich on Jul 12, 2018, 04:05 pm
Mir kommen die Konstruktoren mit "new int[]..." verdächtig vor. Falls hier die Arrays zur Laufzeit erzeugt werden, kann das zu Problemen mit dem dynamischen Speicher führen.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: michael_x on Jul 12, 2018, 05:31 pm
@DrDiettrich:  Die Überschriften "Arduino Code" / "Processing Code" sind vertauscht.

import processing.serial.*; ist natürlich Java.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: DrDiettrich on Jul 12, 2018, 06:00 pm
Ah ja, ich habe mich schon über setup() und loop() im Processing Code gewundert ;-)
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 12, 2018, 10:42 pm
@DrDiettrich:  Die Überschriften "Arduino Code" / "Processing Code" sind vertauscht.

import processing.serial.*; ist natürlich Java.
Stimmt, auch eben erst gemerkt. Sorry dafür :)
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 13, 2018, 01:30 pm
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.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: DrDiettrich on Jul 13, 2018, 02:03 pm
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.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: SpaghettiCode on Jul 13, 2018, 02:32 pm
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é
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 02:56 pm
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:

Code: [Select]
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);
  }
}
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 27, 2018, 03:07 pm
Du hast das so gebaut, dass erst bei Eingabe eines 'A' eine neue Messung getriggert wird. Tust Du das?

Gruß Tommy
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 03:35 pm
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).
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 27, 2018, 03:41 pm
Ich beziehe mich auf den Code in #43
Code: [Select]

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

....


Gruß Tommy
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 04:09 pm
Ich beziehe mich auf den Code in #43
Code: [Select]

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?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 27, 2018, 04:23 pm
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
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 04:33 pm
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?

Quote
Warum Du in establishContact() ein A zurück sendest erschließt sich mir nicht. Soll das evtl. der Hineis sein, ein A einzugeben?
Richtig.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 27, 2018, 04:42 pm
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
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 04:50 pm
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.

Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 27, 2018, 05:01 pm
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
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 27, 2018, 05:15 pm
Hier der aktuelle Sketch:
Der kompiliert nicht, da fehlen die Deklarationen.

Warum das interessant ist? Deswegen:

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:
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 05:33 pm
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'.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 27, 2018, 05:44 pm
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?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 27, 2018, 05:59 pm
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.

Und die erste Möglichkeit die du vorschlägst klappt ja leider nicht, das Senden von 'A'.
Drum wollte ich es ja mal probieren.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 06:08 pm
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.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Tommy56 on Jul 27, 2018, 06:22 pm
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
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 27, 2018, 06:23 pm
Das Programm in #43 enthält:

Code: [Select]
pinMode(s0, OUTPUT);
Wo im Programm ist "s0" deklariert?

Kann doch nicht so schwer sein ...
Da stimme ich Dir zu!
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 09:44 pm
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:
Code: [Select]
//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.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 27, 2018, 11:11 pm
Geht doch :)

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

Code: [Select]
//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.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 27, 2018, 11:30 pm
Geht doch :)

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

Code: [Select]
//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?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 28, 2018, 07:43 am
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.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: postmaster-ino on Jul 28, 2018, 11:35 am
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
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 30, 2018, 10:13 am
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ß
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 30, 2018, 10:19 am
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.

Du meinst quasi wenn es so deklariert ist, dann sollte im weiteren Verlauf writeMux auch [16][4] sein?
Anfangs lege ich ja den muxChannel für jeden Kanal (0-15) fest. Meine Sohle besteht aber aus einem 13x7 array, d.h. ich verwende nur 13 bzw. 7 Kanäle des Mux. Soweit ich das jetzt durchgegangen bin, sollte die Programmierung hierfür eigentlich in Ordnung sein. Kann der Fehler auch woanders liegen?
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 30, 2018, 12:53 pm
Kann der Fehler auch woanders liegen?
Na klar, Feldüberlauf ist halt ein Klassiker.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: postmaster-ino on Jul 30, 2018, 05:18 pm
Hi
Hi, da musst du mir jetzt etwas weiter auf die Sprünge helfen. Verstehe grad nicht ganz was du meinst?
Du hast in Deinem Code
Code: [Select]
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
};

Darin sind für die Channel 0 bis 15 vier Zaheln eingetragen, Die wohl den Muxer entsprechend ansteuern sollen.
Wenn man diese Zahlen umdreht (also statt 1000 -> 0001), sind Das die binären Zahlen des entsprechenden Channel.
0000 = 0
0001 = 1 (nur Bit 0 gesetzt)
0010 = 2
0011 = 3
...
1101 = 13 (8 + 4 + 1)
1110 = 14 (Bit 1 bis 3 gesetzt)
1111 = 15
Bisher habe ich selber nicht viel mit analogen Inputs gemacht, meine damaligen Blicke zeigten aber, daß die entsprechenden Bits in den Registern ebenfalls 'zusammen hängen' (zumindest im ATtiny45, Register ADMUX (0x07), Bits 0...3).
Somit kannst Du dieses Register mit der Channel-Nummer 'ver-ODER-n' und ver-UND-en (setzen der fehlenden Bits, löschen der überzähligen Bits).

MfG
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: ma1kels on Jul 31, 2018, 11:26 am
HiDu hast in Deinem Code
Code: [Select]
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
};

Darin sind für die Channel 0 bis 15 vier Zaheln eingetragen, Die wohl den Muxer entsprechend ansteuern sollen.
Wenn man diese Zahlen umdreht (also statt 1000 -> 0001), sind Das die binären Zahlen des entsprechenden Channel.
0000 = 0
0001 = 1 (nur Bit 0 gesetzt)
0010 = 2
0011 = 3
...
1101 = 13 (8 + 4 + 1)
1110 = 14 (Bit 1 bis 3 gesetzt)
1111 = 15
Bisher habe ich selber nicht viel mit analogen Inputs gemacht, meine damaligen Blicke zeigten aber, daß die entsprechenden Bits in den Registern ebenfalls 'zusammen hängen' (zumindest im ATtiny45, Register ADMUX (0x07), Bits 0...3).
Somit kannst Du dieses Register mit der Channel-Nummer 'ver-ODER-n' und ver-UND-en (setzen der fehlenden Bits, löschen der überzähligen Bits).

MfG
Hi,

du meinst quasi ich müsste die vier Zahlen in meinem Code umgedreht schreiben? Oder was genau meinst du mit
Quote
Somit kannst Du dieses Register mit der Channel-Nummer 'ver-ODER-n' und ver-UND-en (setzen der fehlenden Bits, löschen der überzähligen Bits).
Danke und Gruß
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: agmue on Jul 31, 2018, 01:24 pm
du meinst quasi ich müsste die vier Zahlen in meinem Code umgedreht schreiben?
Die binäre Darstellung von Zahlen erfolgt üblicherweise mit dem höchsten signifikanten Bit links beginnend:

0x01 = 0000 0001

Bei Dir steht {1, 0, 0, 0}, //channel 1, was genau umgedreht ist. Du könntest auf das Feld muxChannel verzichten und mit Bitschubsereien den gleichen Effekt erzielen.
Title: Re: Resistives Sensorarray für eine Schuhsohle (Velostat)
Post by: Nyto14 on Jan 22, 2019, 11:11 am
Ich habe es auch bereits mit dem dort verwendeten code versucht umzusetzen. Habe diesen natürlich auf eine 12x6 Matrix angepasst, sowohl im Arduino als auch im Processing. Ändere ich die beiden Sketche nicht, also starte ich es mit 15x15, dann läuft alles bis auf die Darstellung im Processing, die zeigt mir natürlich 225 Kästchen an. Aber sobald ich alle Befehle auf 12x6 anpasse und wieder auf den Arduino spiele, dann zeigt mir die Darstellung zwar 72 Kästchen an, aber es tut sich nicht wirklich was. Woran könnte es liegen?
Would you please help me with that code on the 15x15 matrix, the original code for the omat, both the arduino and processing codes, thank you in advance, I know this was already dealt with a while ago but I am in need of it just to confirm a few stuff, though I'm going to use PIC18F for my presentation.