Zum Einsatz kommt hier ein ADXL330. Der ADXL330 ist ein 3-Achsenbeschleunigungssensor bis maximal 3g.
Die Ausgabe erfolgt mit einer variablen Spannung in abhängigkeit zur Beschleunigung.
Anbei ein Video wo ein ADXL330 mit einem Arduino ausgelesen/verabeitet wird und die Daten zu einem mit Proccessing erstellten 3D-Modell gesendet und dargestellt wird:
Datenblatt: http://www.analog.com/static/imported-files/data_sheets/ADXL330.pdf
Arduino Sketch:
#include <LiquidCrystal.h> int adxlX=2; int adxlY=1; int adxlZ=0; int KalibTast=2; volatile int Prellen = 250; volatile unsigned long letzter_irq=millis(); int adxlXK=0; int adxlYK=0; int adxlZK=0; int adxlRauschen=2; int Kalibrieren=0; //LiquidCrystal lcd(12, 11, 5, 4, 3, 2); LiquidCrystal lcd(12, 11, 7, 6, 5, 4); void setup(void) { pinMode(KalibTast,INPUT); attachInterrupt(0,Kalib,FALLING); Serial.begin(9600); lcd.begin(16,2); Kalibrieren=1; Kalib(); delay(1000); } void loop () { int i=0; int x=0; int y=0; int z=0; int x1=0; int y1=0; int z1=0; x=analogRead(adxlX)-adxlXK; y=analogRead(adxlY)-adxlYK; z=analogRead(adxlZ)-adxlZK; if(x <= -adxlRauschen or x >= adxlRauschen) x1=x; if(y <= -adxlRauschen or y >= adxlRauschen) y1=y; if(z <= -adxlRauschen or z >= adxlRauschen) z1=z; lcd.clear(); lcd.setCursor(0,0); lcd.print("X="); lcd.print(x1); lcd.print(" Y="); lcd.print(y1); lcd.setCursor(0,1); lcd.print("Z="); lcd.print(z1); Serial.print(x1,DEC); Serial.print(" "); Serial.print(y1,DEC); Serial.print(" "); Serial.print(z1,DEC); Serial.println(); delay(50); } void Kalib (void) { unsigned long akt_irq; akt_irq=millis(); if(akt_irq - letzter_irq > Prellen or Kalibrieren == 1) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Kalibriere..."); adxlXK=analogRead(adxlX); adxlYK=analogRead(adxlY); adxlZK=analogRead(adxlZ); letzter_irq=akt_irq; if(Kalibrieren == 1) { Kalibrieren=0; } } }
Proccessing Sketch:
import processing.serial.*; Serial port; String message = null; String elements[] = null; int[] sensorValues = new int[3]; float boxSize = 50; float margin = boxSize*2; float depth = 400; color boxFill; void setup() { size(800,400,P3D); noStroke(); println(Serial.list()); port = new Serial(this, Serial.list()[6], 9600); frameRate(25); } void draw() { background(255); translate(width/2, height/2, -depth); rotateZ(radians(360-(sensorValues[0]*1.5))); rotateX(radians(360-((sensorValues[1]*1.5)-90))); for (float i =- depth/2+margin; i <= depth/2-margin; i += boxSize){ pushMatrix(); for (float j =- height+margin; j <= height-margin; j += boxSize){ pushMatrix(); for (float k =- width+margin; k <= width-margin; k += boxSize){ boxFill = color(abs(i), abs(j), abs(k), 50); pushMatrix(); translate(k/1.5, j/1.5, i/1.5); fill(boxFill); box(boxSize, boxSize, boxSize); popMatrix(); } popMatrix(); } popMatrix(); } } void serialEvent(Serial p){ message = port.readStringUntil(13); if (message != null) { try { elements = splitTokens(message); for (int i =0; i < elements.length && i < 3; i++ ) { sensorValues[i] = int(elements[i]); } } catch (Exception e){ } } }