PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3D-Accelerometer ADXL330



BlueNature
27.02.2009, 01:16
Servus,

ich habe in den letzten Tagen einen 3D-Beschleunigungs-Sensor vom Typ ADXL330 in Betrieb genommen. Eine Sensorplatine die zur Kommunikation zum PC dient ist ebenfalls lauffähig. Die PC-Software und der Sensor laufen mittlerweile stabil. Ein kleines (wenn auch schlechtes) Video habe ich aufgenommen, bin nicht so firm mit den Video-Bearbeitungsprogrammen und habe leider nur ein einfaches Tool meiner S8000 genommen. Hoffe man erkennt es dennoch einigermaßen:

http://wiesolator.de/data/topics/Projekte/3D-AccMeter/_downloads/adxl330_2.wmv
http://wiesolator.gotdns.org/data/topics/Projekte/3D-AccMeter/_downloads/adxl330.mpg

Die Filterung der 3D-Lage wird mittels Low-Pass Filter im PC erzeugt. Diese sind umschaltbar, und in 2 Varianten ausgeführt (AWM = Amplituden-Mittelwerts-Bildung) und FIR (Finite-Response-Filter). Zum Projekt habe ich soweit auf meiner Seite alles wesentliche dokumentiert.

http://wiesolator.gotdns.org/index.php?area=Projekte&topic=3D-AccMeter

Hoffe es ist für den ein oder anderen eine nützliche Information oder Anreiz für ähnliche Projekte.
Die Software an sich hat eine XYZ-Anzeige der Realwerte vom Sensor, darunter eine kleine von mir entworfene 3D-Engine, welche den Sensor im Raum rotierend anzeigt. Links davon ist die am aktuellen Messpunkt vorhandene 3D-Auslenkung und rechts eine Reihe von Werten im 3D-Raum visualisiert zum akuten Betrachtungspunkt der Messung/Liveaufnahme.

http://wiesolator.gotdns.org/data/topics/Projekte/3D-AccMeter/_images/th/SoftMess_Neu.png

Der Sensor ist in der Platine montiert und gebondet, um ihn stabil und sauber verlöten zu können. Hier ist noch ein Foto vom Sensor an sich:

http://wiesolator.gotdns.org/data/topics/Projekte/3D-AccMeter/_images/th/DSCF1025.jpg

Grüße Wolfgang

BlackDevil
27.02.2009, 09:30
Sehr schön. Ich würd ja auch gern solche PC Programme schreiben können, naja.

Sehr interessant das ganze, werde mich mal auf deiner Website umschauen. Danke für die Arbeit :)


Aber eine Frage: Wie soll man den in eigene Projekte einbinden wenn er IN der Platine ist?

Edit: Auf der Webpage hab ichs jezt gesehen ^^

BlueNature
27.02.2009, 10:24
Aber eine Frage: Wie soll man den in eigene Projekte einbinden wenn er IN der Platine ist?

Den Sensor habe ich so in der Platine platziert das er waagerecht sauber hineinpasst. Einfach mit Schlüsselfeilen eingearbeitet auf Maß, dann mit Sekundenkleber fixiert. So hatte ich die Pads auf gleicher Höhe und konnte sie gut verbinden.
Apropos Sensor, den habe ich in Österreich ergattert für low. Möchte ich bei den bereits sehr teuren 2-achsigen Sensoren als Alternative hier auch mal nennen:
http://neuhold-elektronik.at/catshop/product_info.php?products_id=3094&osCsid=a4c80ab2767113f6702089e0301ccbff
Dort habe ich ihn um die 5 Euro als Restposten (plus Versand) erstanden.

Grüße Wolfgang

Andree-HB
27.02.2009, 12:12
Dort habe ich ihn um die 5 Euro als Restposten (plus Versand) erstanden


Boahh, ich habe letztes Jahr für meinen um die 15,- Euro (+Versand) bezahlt...War ein elendiges Gefrickel... ;-)

http://www.pixelklecks.de/images/lfcsp16.jpg

http://www.pixelklecks.de/images/adxl.jpg


http://www.youtube.com/watch?v=Ra4A9E2jNYk&

Netzman
27.02.2009, 13:12
oh danke für den tipp, wie praktisch dass der neuhold ca. 10min von mir entfernt ist :)

mfg

BlueNature
27.02.2009, 16:07
Boahh, ich habe letztes Jahr für meinen um die 15,- Euro (+Versand) bezahlt...War ein elendiges Gefrickel... ;-)
Naja, Gefrickel war es nicht so schlimmes, eher das Gekleckse^^
Mit ner feinen Lötnadel die mit 12V und einem eigens angbastelten Steckernetzeil betrieben wird sowie etwas feinstem Lötdaht geht das eigentlich ganz fix.
Dein Video hab ich doch gleich wiedererkannt, hatte das bereits unten auf meiner Seite als Interessante Links angegeben.


oh danke für den tipp, wie praktisch dass der neuhold ca. 10min von mir entfernt ist :)

Seh schon, ich muß mir auch noch einen holen bevor du den letzen aus dem Regal ziehst, hab noch Roboter im Regal, die könnten auch als Messplatform dienen :-)

Grüße Wolfgang

Netzman
27.02.2009, 16:18
zu spät, seit etwa 3 stunden liegt bei mir auch einer herum :) komischerweise ist noch ein Sensor-Funksystem für 8€ dazugekommen... wie geht das denn immer?
Ich kann dich aber beruhigen, zum Zeitpunkt meines Kaufes waren noch genug ADXLs da :)

mfg

BlueNature
28.02.2009, 21:13
zu spät, seit etwa 3 stunden liegt bei mir auch einer herum :) komischerweise ist noch ein Sensor-Funksystem für 8€ dazugekommen... wie geht das denn immer?
Ich kann dich aber beruhigen, zum Zeitpunkt meines Kaufes waren noch genug ADXLs da :)

mfg

Denke ich bestell noch einen und baue es spaßhalber auch einmal mit Funksystem auf. Gibt es ja diese netten kleinen Funkmodule mit wenig Stromaufnahme. Da es beidseitige Daten kann wäre es vieleicht nettes Feature einen SMD-AVR herzunehmen für die Lageberechnung und einen Bootloader per Funkt zu implementieren. Ich schaue mir diese Funkmodule jedenfalls einmal auf ihre Funktion genauer an.

http://neuhold-elektronik.at/catshop/images/medium/E9235.jpg

Grüße Wolfgang

Willa
28.02.2009, 21:42
Das ist echt schick :-D ! Wie komplex ist denn dein Tiefpassfilter? Ich mache in meinem Tricopter (http://www.villalachouette.de/william/krims/tricopter/Tri.wmv) eigentlich das gleiche wie Du (nur ohne die schicke 3D Ausgabe), habe aber nen anderen ACC (lis3l02as4). Allerdings muss bei mir alles im µC (Mega32@16MHz) geglättet werden was nur grad so zufriedenstellend funktioniert. Vielleicht hast du eine schöne Filtertechnik?

BlueNature
28.02.2009, 21:59
Das ist echt schick :-D ! Wie komplex ist denn dein Tiefpassfilter? Ich mache in meinem Tricopter (http://www.villalachouette.de/william/krims/tricopter/Tri.wmv) eigentlich das gleiche wie Du (nur ohne die schicke 3D Ausgabe), habe aber nen anderen ACC (lis3l02as4). Allerdings muss bei mir alles im µC (Mega32@16MHz) geglättet werden was nur grad so zufriedenstellend funktioniert. Vielleicht hast du eine schöne Filtertechnik?

Die 3D-Ausgabe ist eigentlich auch nur eine Matritzen/Vektorberechnung. Aber darauf basiert auch meine Raumlageberechnung einfach ne Pic-Box genommen und über die gdi32.dll darauf losgelegt.
Die Filtertechnik habe ich in 3 Modis ausgeführt. Das FIR-filter ist mit seinen Koeffizienten auf 200 Werte je Tap auf 5Hz realisiert. Im Grunde ist es in jeder Filterordung (Wiederholung der Filterung) das selbe. Ich multipliziere nach der allgemeinen FIR-Gleichung eben die Koeffizienten von (n) mit einem gleitenden Array (In meinem Fall Pointer auf den Aufnahmebuffer). Daraus ergibt sich das FIR-Filter 1. Ordnung (nach Chebyshev) in seiner Summe über alle Koeffizientenmultiplikationen zum akuten Sample. Der entstandene Verstärkungsfaktor von x(n) zu y(n) in DC-Betrachtung rechne ich über die Summe der Koeffizienten gegen.
Danach kommt erst die Lagebestimmung, nachdem alle drei Achsen in der Filterung durchlaufen wurden. Das bildet ein Rohsignal für die Umrechnung in eine Raumrotationsmatrix. Die Matrix sieht man auch im 3D laufen (diese 3x3 Zahlen).
Diese Berechnung geht folgendermaßen vor: Ich errechne über einen normalisierten Ebenenvektor eine Raumrichtung um Achse Z über X und Y. Über diesen errechneten Winkel (Gamma) neige ich über die nun verdreht gerechnete X-Achse den Raumkörper um eine Alpha-Achse. Damit habe ich die neuen Achsen im Raum (was einer Lage zu Bewegungsrichtungsdecodierung taugt). Nebenbei entstehen bei der Berechnung sechs undefinierte Polstellen im normierten (1er Radus=1g)Kugelraum. Diese müssen sonderbehandelt errechnet werden. Das ganze rotieren und bewegen wird als einzige Summen-3x3-Matrix errechnet, und darüber werden alle Objektpunkte im Raum in einer Vektor-Matritzen-Multiplikation umgerechnet. Deshalb dient es auch 1:1 der Lage im Raum als direkte Verrechnung.

http://wiesolator.gotdns.org/data/topics/Projekte/3D-AccMeter/_images/lageposition.png

Grüße Wolfgang

Willa
28.02.2009, 22:19
...okay, klingt so als hättest du dich ein bisschen damit auseinandergesetzt..... ;-D Im Gegensatz zu mir... Mein Tiefpass ist einfach:
yACCfiltlowpass = Yacc * 31
yACCfiltlowpass = yACCfiltlowpass + Yacc
Shift yACCfiltlowpass, Right , 5 '<-- das gleiche wie division durch 32
Wie der offizielle Name für diese Filterung ist weiss ich aber nicht. Ich frage mich allerdings wie komplex die Filteroperationen auf einem µC so sein können... Werde mich mal etwas mit deinem Post beschäftigen...

BlueNature
28.02.2009, 22:40
yACCfiltlowpass = Yacc * 31
yACCfiltlowpass = yACCfiltlowpass + Yacc
Shift yACCfiltlowpass, Right , 5 '<-- das gleiche wie division durch 32
Wie der offizielle Name für diese Filterung ist weiss ich aber nicht.

Der Filter sieht (ohne den Zussammenhang jetzt genauer zu kennen) aus wie eine arithmetische Mittelwertsbildung. Wenn du ihn nach jeder Messung aufrufst verhält er sich wie eine Halbwertszeit über t. Ist also recht sensibel auf apruppte neue Eingangsgrößen und wird dir daher auch in deine Regelkreise einschlagen als Istwert-Sprung bei einer Sensorwert-Spitze.

Der (Glättungs)Filter von mir basiert auf einer Tiefpassfilterung, das heißt es wird eine digitale Filterung aufgrund eines Frequenzspektrums (0Hz bis Samplingfrequenz) vorgenommen. Sinn ist schlicht und einfach das "hochfrequente" Anteile (hoher Differentialsprung dg/dt) aus dem nützlichen "tieffrequenten" Anteil sicher und definiert entfernt werden. Die Qualität ist eine Frage wie weit man die digitalen Filter ausreizt und was der Ziel-Prozessor an Resorcen zur Samplingfrequenz hergibt.

Hier habe ich eben noch eine kleine Grafik zur Veranschaulichung gezeichnet wie das System grundlegend funktioniert:

http://wiesolator.gotdns.org/data/topics/Projekte/3D-AccMeter/_images/RaumMatrixSystem.png

Hat irgendwas von Sudoku, nur bissel aufwändiger...

Noch ein kleiner Nachtrag, habe den Code von dir einmal einfach umgestellt auf eine einfache Darstellung:

NeuenWertRechnen
{
Wert = NeuerWert * 31
Wert = Wert + NeuerWert
Wert = Wert / 32
}

Wobei Wert 'Static' ist, also nicht bei jedem Aufruf neu initialisiert wird, sondern seinen Wert beibehält bis zum nächsten Aufruf.

Das Verhalten ist eine (Laufzeitverbesserte) arithmetische Mittelwertsbildung auf einer Dimension (Array[n]). Heißt du schiebst einen neuen Wert in das Array unter Beachtung von 31 (weil ja eines rausfliegt bei neuem Wert) verbleibenden Messpunkten und fügst den 32sten hinzu um ihn über den gesamten Bereich von 32 Samples wieder zu dividieren. Das erspart die unnützen Shiftoperationen beim Eingang eines neuen Samples über alle 32 Arrayelemente in der Form:

For n = 30 To 0 Step -1
Buffer(n) = Buffer(n + 1)
Next n
Buffer(31) = NeuerWert

Ist im Grunde das hier:

Wert = Summe{Buffer[n]} / 32

Wobei n einen Buffer über n Elemente (in deinem Fall 32) darstellt.

Habe das bei meiner Software anstatt FIR-Filter AMW-Filter (arithmetisches Mittelwertfilter) genannt. Da sieht man das ein Mittelwertsfilter "träge" reagiert, mit einem FIR dafür subitl und schnell. Hängt daran, das auf der Frequenz selektiert wird (dem speziellen eben frequenz-selektiven Differenzial aufgrund y=dx/dt), nicht auf einem Mittelwert.

Grüße Wolfgang

BlueNature
01.03.2009, 00:33
Fehler bei einer Korrektur

error41
01.03.2009, 14:15
Hi!

Ich lese mir gerade die Projektdoku auf deiner Webseite durch.
Super Arbeit!
Schon lange nicht mehr eine so ordentliche und vollständige Ausarbeitung gesehen!
Danke fürs Veröffentlichen!

Gruß

BlueNature
02.03.2009, 06:48
@error41
Vielen Dank für das positive Feedback, ich hoffe es stimmt alles soweit und du kannst es gebrauchen.

Grüße Wolfgang

sakul85
02.12.2009, 11:49
Hallo,
erstmal muss ich sagen, dass dieses Projekt sehr interssant ist und mich inspiriert hat!
Ich habe jetzt auch einen ADXL 330 bestellt . Es ist geplant minimale Winkeländerungen (<1,0°) und Vibrationen zu detektieren.
Leider werde ich aus dem Datasheet nicht schlau und kann mir unter +/- 3g nicht genau vorstellen welche minimalste Winkeländerung messbar sind? Ich freu mich über eure Antworten.
Gruß Lukas

BlueNature
02.12.2009, 16:10
Servus,

Vorweg, +/- 3g sind die maximalen verzerrungsfreien (linearen) Auflösungen in allen drei Raum-Achsen. Bei Ruhelage im Raum hat der Sensor damit 1g Vorbelastung in Z (wenn er mit Z genau senkrecht steht) und in X bzw. Y 0g. Im freien Fall hätten alle Achsen genau 0g.
Die theoretische Auflösung kannst du dir damit grob ausrechnen. Primär hängt aber alles von deiner verwendeten Digitalisierung (AD-Wandlung) ab. Solltest es einmal ausrechnen als Tabelle über den Winkel (z.b. -90 bis +90°) bei einer Drehung um die X-Achse. Dann folgen die Y und Z-Achsensignale einem Sinus und Cosinus. Daraus erkennst du das Problem mit der Winkel-Genauigeit, diese kann nicht linear beziffert werden.

Grüße Wolfgang

dremler
02.12.2009, 22:51
was ist von solchen angeboten zu halten:

http://cgi.ebay.de/ADXL330-Small-Low-Power-3-Axis-3g-iMEMS_W0QQitemZ220506609358QQcmdZViewItemQQptZLH_D efaultDomain_0?hash=item335737d6ce


der preis lockt schon...

BlueNature
06.12.2009, 18:38
was ist von solchen angeboten zu halten...

Was davon zu halten ist weiß ich nicht, habe noch keine Erfahrungen mit diesem Anbieter. Der Preis sollte ca. um 11,35 Euro liegen.
Meine beiden Sensoren hatte ich in Österreich bei Neuhold-Elektronik gekauft und lagen in ähnlicher Preisregion wenn man den Versand mitbetrachtet.
http://www.neuhold-elektronik.at/catshop/product_info.php?products_id=3094
Dieser Artikel wird dort auch wie es aussieht noch vertrieben.

Grüße Wolfgang

sakul85
10.12.2009, 16:39
Hallo,
Vielen dankt für die ausführliche Antwort zur Winkel Berechnung. Die von Ihnen gut dokumentierte Schaltung habe ich aufgebaut und konnte die analogen Spannungswerte vom ADXL330 auch schon am Oszi nachvollziehen.
Jetzt hängt es nur an der Dimensionierung der Pegelwandler Schaltung. Da die Bezeichnung der Bauteile auf dem Layout nur schlecht lesbar sind, wäre es super wenn Sie den Pegelwandler nochmals kurz nähr erläutern könnten.

BlueNature
10.12.2009, 16:46
Servus sakul85

Den Pegelwandler habe ich in der letzten Version einfach überbrückt, ist nicht nötig gewesen, da die Pegel kurz oberhalb des minimalen Pegels lagen der RS232-Schnittstelle (3V lt. Spezifikation). Zudem ist sie nicht so schnell, und da ich in der Geschwindigkeit auf 115200 Baud gegangen bin, wäre sie eh zu langsam gewesen (enorme Verrundung der Flanken).
Wenn man es etwas geräumiger aufbaut sollte man aber der Ordnung halber die Sparversion mit einem echten Pegelwandler (z.B. MAX232) aufbauen. Dann ist man auf der sicheren Seite, vor allem bei hoher Störumgebung oder langer Zuleitung.

Grüße Wolfgang

sakul85
12.02.2010, 10:08
Hallo, meine A/D Wandlung lasse ich jetzt über eine 16-Bit DAQCard laufen. In LabVIEW 8.0 werden die Signalverläufe von X Y Z dargestellt wobei ich die Lage im Raum auch schon grob bestimmen konnte. Der ADXL335 (+-3g) wird mit einer Versorgungsspannung von 3V betrieben.
Jedoch habe ich noch einge Fragen zur Umrechnung der Spannungssignale XYZ in Gravitation [g] und bei der Berechnung der genauen Lagewinkel.

Bsp.: Umrechnung [V] in [g]
Die Z Achse steht senkrecht und ist somit um 1g vorbelastet. Es werden folgende Spannungswerte geliefert.

Z
|_Y
/
X

Z=1,37V = 1g
Y=1,15V = 0g
X=1,13V = 0g

180°Rotation um Y-Achse

Z=0,98V=-1g
Y=1,12V=0g
X=1,12V=0g

Meine Überlegung war jetzt eine einfache Zweipunktkalibrierung durchzuführen um die entsprechenden [g] Werte zu ermitteln.

gravitation (g) = -1; 0; 1
Spannung (U) = 0,92; 1,14; 1,37
(dU) = -0,22; 0,00; 0,23

(dU) = ist der Spannungswert - Vorbeaufschlagung(U bei 0g)



Somit ist die Output Sensitivität etwa 223mV/g bei einer Vorbeaufschlagung (bias) von etwa 1,14 V.

Ich glaube das müsste so richtig sein und somit komme ich zu meiner eigentlichen Frage.
Bluenature hat es zwar schon mal kurz erläutert, aber ich bin mir immer noch nicht im Klaren mit welcher Gleichung ich genau die Winkel bei einer Dehung um die entsprechenden Rotationsachse errechne (Gier-, Nick-, Roll-Achse).
ich habe mir überlegt die Winkel über das Skalarprodukt im euklidischen Raum zu berechen. Kann mir jemand sagen, ob ich damit auf dem richtigen weg bin?
[left:f39fb12a21]http://upload.wikimedia.org/math/8/f/9/8f91260a51f8ceae520865b84cbdbc8d.png[/left:f39fb12a21]
http://de.wikipedia.org/wiki/Skalarprodukt


@bluenature: Welche Gleichung hast du zur Berechnung der Winkel verwendet?

BlueNature
14.02.2010, 00:16
Servus,

einen "Algorithmus" habe ich nicht verwendet. Habe alles so hergeleitet.

Die kalibrierung ist natürich die eine Sache die vorher geschehen muß mitsamt der Nullung auf Lageruhe. Daraus kommen dann deine X- ,Y- ,Z-Werte zur Weiterberechnung.

Die Berechnung basiert einfach auf einer Kugel. Die Kugel hat eine Einheitsgröße Radius = 1 (Normvektor 3D). D. h. man berechnet zuerst mithilfe der XY-Werte (Fallentscheidungen ebenbei Z positiv) den Richtungsvektor auf der Ebene und erhält daraus einen Winkel (Rotation). Darüber wird dann mithilfe des Z-Werts rotiert um diese neue Richtungsachse (Neigung).
Ich habe eben daraus noch eine Rotations-Transformationsmatrix errechnet die als Basis dient die 3D-Anzeige direkt zu berechnen. Die Werte siehst in der Software.

Grüße Wolfgang