ADXL – 3-Achsenbeschleunigungssensor

adxl330Zum 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){
               }
     }

}