|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools |
Rating:
|
Display Modes |
|
|
|
#1
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
Yes, it is legal to use the Accelerometers from last year. |
|
#2
|
||||
|
||||
|
Re: 2010 Accelerometer I2C Object/Class
does anyone know where to buy the Analog Accelerometer Breakout ?
|
|
#3
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
Alternately, you could manufacture your own from the designs posted of last year's boards. -Joe |
|
#4
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Here is java class for the ADXL345 when connected as I2C device at default address.
Code:
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package edu.wpi.first.wpilibj;
/**
*
* digital accelerometer from the 2010 KOP
*
* this implementation just gets the 3 axis values and allows setting the range
*
* Possible enhancements:
* Add access to other features of the chip
* Add measurement of error during intialization and set channel offsets
*/
public class ADXL345DigitalAccelerometer extends SensorBase {
private I2C i2c;
// default address
private static final byte kAddress = 0x3A;
// register map from datasheet
private static final byte OFSX = 0x1E;
private static final byte OFSY = 0x1F;
private static final byte OFSZ = 0x20;
private static final byte BW_RATE = 0x2C;
private static final byte POWER_CTL = 0x2D;
private static final byte DATA_FORMAT = 0x31;
private static final byte DATAX0 = 0x32;
private static final byte DATAY0 = 0x34;
private static final byte DATAZ0 = 0x36;
private static final byte FIFO_CTL = 0x38;
private static final byte FIFO_STATUS = 0x39;
// would use enums here if we had them
// BW_RATE 0x2C
private static final byte BW_RATE_R3200B1600 = 0x0F;
private static final byte BW_RATE_R1600B0800 = 0x0E;
private static final byte BW_RATE_R0800B0400 = 0x0D;
private static final byte BW_RATE_R0400B0200 = 0x0C;
private static final byte BW_RATE_R0200B0100 = 0x0B;
private static final byte BW_RATE_R0100B0050 = 0x0A;
private static final byte BW_RATE_R0050B0025 = 0x09;
private static final byte BW_RATE_R0025B0012 = 0x08;
private static final byte BW_RATE_R0012B0006 = 0x07;
private static final byte BW_RATE_R0006B0003 = 0x06;
private static final byte BW_RATE_LOW_POWER = 0x10;
// POWER_CTL 0x2D
private static final byte POWER_CTL_LINK = 0x20;
private static final byte POWER_CTL_AUTO_SLEEP = 0x10;
private static final byte POWER_CTL_MEASURE = 0x08;
private static final byte POWER_CTL_SLEEP = 0x04;
private static final byte POWER_CTL_WAKEUP8 = 0x00;
private static final byte POWER_CTL_WAKEUP4 = 0x01;
private static final byte POWER_CTL_WAKEUP2 = 0x02;
private static final byte POWER_CTL_WAKEUP1 = 0x03;
// DATA_FORMAT
public static final byte DATA_FORMAT_02G = 0x00;
public static final byte DATA_FORMAT_04G = 0x01;
public static final byte DATA_FORMAT_08G = 0x02;
public static final byte DATA_FORMAT_16G = 0x03;
// store the current
private byte range = DATA_FORMAT_02G;
public class ADXL345Exception extends RuntimeException {
/**
* Create a new exception with the given message
* @param message the message to pass with the exception
*/
public ADXL345Exception(String message) {
super(message);
}
}
//
// constuctior with slot number parameter
//
public ADXL345DigitalAccelerometer(int slot) {
i2c = new I2C( DigitalModule.getInstance(slot), kAddress );
}
// initialize the sensor
public void intitialize()
{
// set BW_RATE
i2c.write(BW_RATE, BW_RATE_R0100B0050);
// set POWER_CTL
i2c.write(POWER_CTL, POWER_CTL_MEASURE);
}
// set the range (default is =/- 2g
public void setRange( byte rangeParam )
{
if ( !( rangeParam == DATA_FORMAT_02G ||
rangeParam == DATA_FORMAT_04G ||
rangeParam == DATA_FORMAT_08G ||
rangeParam == DATA_FORMAT_16G ) )
{
throw new ADXL345Exception("Invalid range!");
}
range = rangeParam;
i2c.write(DATA_FORMAT, range);
}
// get acceleration routines
public double getXAxis()
{
return getAxis( DATAX0 );
}
public double getYAxis()
{
return getAxis( DATAY0 );
}
public double getZAxis()
{
return getAxis( DATAZ0 );
}
protected double getAxis( byte registerParam )
{
// setup array for our data
byte[] data = new byte[2];
// read consecutive registers
this.i2c.read( registerParam, (byte) data.length, data);
// convert to 2s complement integer
// [0] has low byte [1] has the high byte
// jave does not have unsigned so we have to do it this way
int intResult = ( data[0] & 0xFF ) | ( data[1] << 8 );
// convert to double based on 10 bit result
double returnValue = (double)intResult / 512.0 ;
// now scale based upon our range
switch( range )
{
case DATA_FORMAT_02G:
returnValue *= 2.0;
break;
case DATA_FORMAT_04G:
returnValue *= 4.0;
break;
case DATA_FORMAT_08G:
returnValue *= 8.0;
break;
case DATA_FORMAT_16G:
returnValue *= 16.0;
break;
}
return returnValue;
}
}
|
|
#5
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
Also, did this code work? I didn't see anything wrong with it. |
|
#6
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
If you look at the getAxis method you will see that I am doing a 2-byte read when I get the data (2 consecutive registers in one read). This insures that the data does not get corrupted. If two individual 1-byte reads were performed there is a chance that in between the first and second read the data could change. This would result in first read getting the low byte of the prior value and second read getting the high byte of the subsequent value. Putting the two together again could create some really funny numbers. See page 18 of the ADXL345 data sheet "Register 0x32 to Register 0x37" section for more information about this. Here is an example of the problem: prior value is 0x0100 subsequent value is 0x00ff, a 1 bit change. Two single byte reads would read low byte 0x00 and high byte 0x00 giving 0x0000. No where near close to what the sensor is actually reading. Last edited by charrisTTI : 03-02-2010 at 10:56. |
|
#7
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
|
|
#8
|
||||
|
||||
|
Re: 2010 Accelerometer I2C Object/Class
/sigh
we tested this code yesterday. but it did not work for us and since the code seems to work for u guys. We are probably doing something wrong. For our wiring we plugged in (obviously 5v to 5v and 0v to ground and so on) but what i have a question on is which I2C channel those plug in to. There are 2 that are not labeled, so i guess the question here is what channel I2C is the kaddress is referring to? Also I am using the class in the code by -instantiating with an argument of 4 (which is where the digital module is plugged in to on the crio) -calling the initialize() method -and then calling the getXAxis() method in my polling while loop which runs every .02 seconds. The only thing i could see that might cause a problem is that the accel does not show a significant enough amount of change in the .02s in which we check it. If this is what is happening please let me know and if its not please try and help. Thanks in advance. |
|
#9
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Here is my test program:
Code:
public class RobotTest extends SimpleRobot {
ADXL345DigitalAccelerometer accelerometer = new ADXL345DigitalAccelerometer(4);
public RobotTest()
{
accelerometer.intitialize();
accelerometer.setRange(ADXL345DigitalAccelerometer.DATA_FORMAT_16G);
}
/**
* This function is called once each time the robot enters autonomous mode.
*/
public void autonomous() {
}
/**
* This function is called once each time the robot enters operator control.
*/
public void operatorControl() {
this.getWatchdog().setEnabled(false);
while( this.isOperatorControl() && this.isEnabled() )
{
System.out.println("Accel X, Y, Z: " + accelerometer.getXAxis() + " " + accelerometer.getYAxis() + " " + accelerometer.getZAxis() );
Timer.delay(0.001);
}
}
}
|
|
#10
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
![]() |
|
#11
|
||||
|
||||
|
Re: 2010 Accelerometer I2C Object/Class
possibly the most helpful post Ever.
I will try this in about an hour and post the results we were on the ones labeled not these. Also i am curious what the pins labeled not these are for? It says "Out" does that just mean those are all Digital Outputs? Thanks again |
|
#12
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
-Joe |
|
#13
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
|
|
#14
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Quote:
Quote:
|
|
#15
|
|||
|
|||
|
Re: 2010 Accelerometer I2C Object/Class
Sorry for the confusion. The ADXL345 (same as this year KOP) from sparkfun is 3.3V.
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Help with 2010 Accelerometer & I2C | wt200999 | C/C++ | 33 | 08-02-2010 15:16 |
| 2010 accelerometer | chsr | C/C++ | 1 | 22-01-2010 02:28 |
| 2010 Accelerometer Documentation? | JDM | Sensors | 13 | 18-01-2010 12:42 |
| Where to find a Gyro and Accelerometer Sensor Board for 2010 FRC? | xSpongeX | Sensors | 4 | 18-01-2010 06:17 |
| Accelerometer class - isn't reading zero at rest? | oddjob | C/C++ | 3 | 02-02-2009 17:11 |