Foliendrucksensor, Arduino als MC?

Hallo,

Ich arbeite gerade an meiner Bachelorarbeit. Diese handelt von der Druckverteilung unter einem Schienbeinschoner beim Fußball. Ich bin dabei den Versuchsstand aufzubauen und stehe jetzt vor folgendem Problem:
Ein Foliendrucksensor soll mit Hilfe des Arduino angesteuert werden und möglichst genau Spannungsabfälle aufzeichnen. Der Sensor arbeitet über x- und y-Leiterbahnen, die an den Kreuzungen, abhängig vom einwirkendem Druck, ihren Widerstand verändern.
Jetzt wollte ich zuerst nur eine einzelne Zelle (x/y Kreuzung) ansprechen. Als Multiplexer ist dieser IC vorgesehen: ADG 731 (Datasheet: http://www.analog.com/static/imported-files/data_sheets/ADG725_731.pdf)
Wie kann ich mittels der Truth Table bestimmte Ausgänge ansteuern? Wie müsste das Programm ungefähr aussehen?

Ich besitze das Arduino Uno, bin aber ein absoluter Einsteiger. Einige Examples habe ich aber bereits durchgeführt.
Ich hoffe ich habe nichts vergessen, falls ihr aber genauere Informationen braucht, bitte bescheid sagen.
Danke!

Gruß

Bekomme ich denn Deinen Batchelor wenn ich es Dir verrate? ]:smiley:
Denk an Herrn von und zu Nichtschlechterhügel.

Aber mal im Ernst, meinst Du nicht es wäre fairer sich zunächst mit der Materie grundsätzlich vertraut zu machen, mit dem Programm anzufangen und dann gegebenenfalls nach Lösungen zu Detailproblemen zu fragen, statt übertrieben ausgedrückt zu fragen: wer erzählt mir von die Pieke auf an, wie meine Arbeit auszusehen hat?
Ich finde das stilistisch doch sehr fragwürdig.

LG Lena

jop, da hast du recht! Es ist aber nicht so, dass ich mich mit der Materie überhaupt nicht auseinander gesetzt habe. Leider sind in meinem Studiengang Elektronik und Programmentwicklung etwas kurz gekommen, was den Einstieg bei Arduino schon recht schwer macht. Die Frage oben war aber wohl eindeutig zu allgemein...
Ich versuche mich mal weiter in die Materie einzuarbeiten. Kennt denn jemand ein Bsp (außer diesen: http://arduino.cc/en/Tutorial/HomePage), dass mir helfen kann die SPI-Kommunikation weiter zu verstehen? Vor allem interessiert mich, wie ich mittels dem Arduino ein Binärwort an den Multiplexer schicken kann...

Edit:
@Lena: meinen Bachelor kann ich dir nicht anbieten, aber natürlich eine Erwähnung in meiner Danksagung XD

Für die Kommunikation via SPI steht eine spezielle Library zur Verfügung.SPI - Arduino Reference
Nun brauchst zunächst nur zwei verschachtelte schleifen für Zeilen und Spalten, setzt die jeweigen Schalter und speicherst das Ergebnis in einem array[16,16].
Mal so gaaanz grundsätzlich ohne nähere Kenntniss was am Ende rauskommen soll.

LG Lena

Ich sehe das ähnlich wie Lena. Neulich hat sich hier einer bei seiner Meisterarbeit helfen lassen. Hinterher ist im eingefallen, dass die Prüfer vieleicht eine andere Auffassung von selbständiger Arbeit haben als er. Davon hat am Ende keiner was.

Was für Bachelor willst Du werden?

Das schöne war noch, daß er den Moderator frech forderte, alles zu löschen und seinen Freund, den Anwalt zitierte. Das alles noch unter 3 verschiedenen Usern.

Wir helfen gerne, aber lassen uns nicht ausnutzen. Ums blumig zu sagen: Das meiste muß auf Deinen Mist wachsen. :wink: :wink: :wink:

Grüße Uwe

Ich denke nicht, dass das hier in eine Grundsatzdiskussion ausarten sollte, die beiden Fälle sind auch nicht vergleichbar. Beim letzten Mal war eine Komplettleistung gefragt, hier geht es um die Ansteuerung eines ICs im Rahmen einer Arbeit. Ist wohl eher mit dem Carrerabahn-Thread zu vergleichen, oder?
Da mir selbst die nöige Erfahrung mit SPI-Programmierung fehlt, muss ich an dieser Stelle auch passen. Eine Frage drängt sich mir aber auf: Wird der ADC des Mega328 schnell genug sein, um die Messwerte auswerten zu können? Ich habe mal versucht, eine Gameboy-Kamera anzusteuern, da versagte der inerne ADC auf ganzer Linie...

Ich wollte da auch keine Grundsatzdiskussion draus machen und deshalb habe ich im Anschluß auch versucht konstruktiv auf die Sprünge zu helfen.
Die Frage des Timings habe ich für mich auch sofort hinterfragt. tt22 (ich liebe solche Anreden) will 64 Messwerte erfassen, die (verm.) in einem Zeitfenster von wenigen ms auftreten - das wird wirklich eng.
Bei einem Zeitfenster von 10 ms und geschickter Programmireung könnte das aber funktionieren.
Leider tappen wir ja bezüglich der Rahmenbedingen sehr im dunkeln.
Mag der Threadstarter sich zunächst die geschilderten Aspekte zu gemüte führen und dann sehen wir weiter.

LG Lena

Als Entscheidungshilfe, ob ich eine Lichtschranke Analog oder Digital mit Schmitt-Trigger auswerte, hatte ich mal eine kleine Versuchsreihe gemacht. Ich hatte für die Zeitmessung analogRead() in einer Schleife 10000 mal aufgerufen. Um halbwegs realistische Zeiten zu erhalten, wurden in der Schleife auch noch diverse Berechnungen durchgeführt (schließlich bringt einem das reine Auslesen wenig).

Ich kam dabei auf 8,93 Aufrufe pro Millisekunde bzw. 0,112 Millisekunden für einen Aufruf.

Wenn man den ADC des ATmega beschleunigt, kommt man auf 58,59 Aufrufe/ms (0,017 ms/Aufruf).

Hallo,
bitte entschuldigt, dass ich erst jetzt Antworte. Zunächst einmal muss ich sagen, dass die Arduino Programmierung nur einen kleinen Teil meines Projekts darstellt. Die konstruierte Messeinrichtung verfügt außerdem über einen Kraftaufnehmer, Winkelmesser und Beschleunigungssensor, die ich aber alle mittels LabView ansteuern kann...
(Der Arduino sollte am Ende möglichst auch mit LabView kommunizieren, aber da habe ich mit VISA schon etwas gefunden...)
Den ersten Beitrag habe ich echt unüberlegt hier hin "gerotzt"...sry dafür.

Zu dem Timingproblem:
Leider sollen nicht nur 64 Messwerte erfasst werden, sondern im Optimalfall 484. Das Zeitfenster würde etwa 15ms betragen.
Dabei wird eine Messfläche von ca.64 cm^2 abgedeckt. Die Anzahl der Messwerte könnte ich durch verkleinern des Messfelds oder verringern der Auflösung noch mindern.

Ich kam dabei auf 8,93 Aufrufe pro Millisekunde bzw. 0,112 Millisekunden für einen Aufruf.

Das wären in 15ms also ca 134 Messwerte...damit könnte ich mit Sicherheit schon ein Aussagekräftiges Ergebnis erzielen. (klar, besser gehts immer...)

Ich werde jetzt erstmal versuchen, mittels analogRead() (ähnlich wie MaFu) ein kleines Programm zu schreiben um mal den ADC meines Arduino zu testen.

Grüße

Edit: analogRead() - Arduino Reference
Habe gerade noch was zur max. lese Rate gefunden. Diese beträgt ca. 10MHz. Also könnte ich immerhin etwa 150 Messwerte in 15ms aufnehmen.

tt22:
Edit: analogRead() - Arduino Reference
Habe gerade noch was zur max. lese Rate gefunden. Diese beträgt ca. 10MHz. Also könnte ich immerhin etwa 150 Messwerte in 15ms aufnehmen.

Einigen wir uns auf 10 kHz? :wink: Aber das mit 150 Messwerte in 15 ms passt.

sth77:

tt22:
Edit: analogRead() - Arduino Reference
Habe gerade noch was zur max. lese Rate gefunden. Diese beträgt ca. 10MHz. Also könnte ich immerhin etwa 150 Messwerte in 15ms aufnehmen.

Einigen wir uns auf 10 kHz? :wink: Aber das mit 150 Messwerte in 15 ms passt.

joa, damit kann ich leben;)

hallo zusammen,

guck dir doch mal hier nach. Wenn du Geschwindigkeit brauchst, dann hilft nur noch in Assembler oder C den ADC direkt anzusprechen. Nur so wirst du wissen, wo deine Taktzyklen abgeblieben sind. Nix gegen "analogRead", aber wenn ich mir die Doku des mega328 durchlese, glaube ich, dass du mit direkter CPU programmierung in C am meisten rausholen kannst.

cu markus

Was hältst du von einer zufälligen Abfrage der Werte, so kannst du alle Messstellen Abfragen, und erhältst zufällig an manchen Punkten ne höhere Auflösung. Oder zwei Arduinos die gekoppelt sind und zeitversetzt abfragen.

Meine Vorschläge sollen nur dazu dienen dich in eine andere Denkrichtung zu stoßen. :wink:

Edit: oder prioritäten setzen, vielleicht sind Werte am Rand wichtiger oder weniger wichtig.

Ich komm nochmal auf die Anmerkung in meinem letzten Post zurück:

MaFu:
Wenn man den ADC des ATmega beschleunigt, kommt man auf 58,59 Aufrufe/ms (0,017 ms/Aufruf).

580 Abfragen in 10 ms, reicht das nicht?

Mafu, ich weiß nicht ob du dich hierauf beziehst.

Aber er erreicht sogar kurzzeitig über 8000 Samples pro Sekunde. Der TE sollte sich das mal durchlesen, ist sehr interessant.

Razor1990:
Mafu, ich weiß nicht ob du dich hierauf beziehst.

http://sites.google.com/site/measuringstuff/the-arduino

Aber er erreicht sogar kurzzeitig über 8000 Samples pro Sekunde. Der TE sollte sich das mal durchlesen, ist sehr interessant.

Das ist ja der Normalwert. In meinem ersten Post erwähnte ich ja, dass der Wandler etwas über 8 Auslesevorgänge in der Millisekunde schafft. Das wären dann deine 8000/Sek.
Mit entsprechender Programmierung sind aber über 50 Auslesevorgänge pro ms zu erreichen, das sind dann 50000 in der Sekunde.

Hallo,
bitte entschuldigt, dass ich länger nicht mehr geantwortet habe.
Ich bin mittlerweile zumindest ein kleines Stück weitergekommen. Soweit, dass die angesprochenen Probleme mit der Geschwindigkeit relevant werden könnten.
Ich zeige euch mal mein Programm:

#include <SPI.h>;

const int slaveSelectPin = 10;
const int slaveSelectPin2 =7;

int LED = 8;
int address;
int gnd;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(slaveSelectPin, OUTPUT);
  pinMode(slaveSelectPin2, OUTPUT);
  SPI.begin();
  digitalWrite(LED, HIGH);
  SPI.setDataMode(SPI_MODE1);
  SPI.setBitOrder(MSBFIRST); 
  Serial.begin(115200);

}

void loop() {
  int sensorValue = analogRead(A5);
  for(int gnd = 0; gnd < 32; gnd++){
    digitalGND(gnd);
  for(int channel = 0; channel < 32; channel++){
  digitalChannel(channel);
  
  Serial.println(sensorValue);
  }

}
 
}

int digitalGND(int gnd){
  digitalWrite(slaveSelectPin2,LOW);
  SPI.transfer(gnd);
  digitalWrite(slaveSelectPin2,HIGH);
}

int digitalChannel(int channel){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(channel);
  digitalWrite(slaveSelectPin,HIGH);
}

Ich lasse im Moment noch eine LED Kette ansteuern, was sich allerding leicht auf die einzelnen Zellen des Foliendrucksensors übertragen lässt.

Hab leider keine Bemerkungen gemacht...Evtl könnt ihr ja trotzdem nachvollziehen, was ich gemacht habe.

Der Serial Monitor zeigt mir die Spannung(10bit Wörter) an. Allerdings ohne Addressierung (Falls ich diese Zusätzlich anzeigen lasse,dauert ein Zyklus deutlich länger). Ich habe 32x32 (=1024) Messwerte.
Der Zyklus läuft jetzt ziemlich schnell ab (in etwa 0,5s) aber wie könnte ich jetzt herausfinden, ob der ADC auch alle Werte in dieser Zeit umsetzt?
Falls er das macht, wäre die Geschwindigkeit ausreichend.

Falls ihr Fragen oder Optmierungsvorschläge für das Programm habt, immer her damit:)

Viele Grüße

Er zeigt die wirklich nacheinander jeden Messwert an?

Denn du liest am Anfang jedes Zyklus einen Wert aus. Dann schaltest du alle Sensoren durch und das wars. Ohne die auszulesen. Du müsstest genau vor deinem Println den Wert ermitteln IN der FOR-Schleife.

Oh Mann...
Vielen Dank, da hast du natürlich vollkommen recht. Er hat zwar einen Wert angezeigt, aber immer den Gleichen (also Falschen).
Habs gleich geändert, jetzt macht er es aber Einwandfrei.