Thursday, April 18, 2013

Introducing MySQL Connector/Arduino

Have you ever wanted to use a local database server to store data from your Arduino projects? Would you like to be able to send queries directly to a MySQL database from your Arduino sketch? Well, now you can!

The MySQL Connector/Arduino is a new technology made for the Arduino permitting you to connect your Arduino project to a MySQL server via an Ethernet shield without using an intermediate computer or a web-based service.

Having direct access to a database server means you can store data acquired from your project as well as check values stored in tables on the server and keep the network local to your facility including having a network that isn't connected to the internet or any other network.

The Connector/Arduino library allows you to issue queries to the database server in much the same manner as you would through the MySQL client application. You can insert, delete, and update data, call functions, create objects, etc. Issuing SELECT queries are also possible but they incur a bit more thought concerning memory management.

http://drcharlesbell.blogspot.com/2013/04/introducing-mysql-connectorarduino_6.html

Monday, April 15, 2013

BMA180 Accelerometer

Years ago I saw a neat dash gadget for a Jeep that had two pictures of a Jeep on the unit. As you drove, the two pictures would move, showing pitch and roll angles, with the idea it would help prevent you from tipping over when driving off road.


I received a BMA180 Accelerometer, and decided to build an Arduino version, maybe eventually displaying graphics on a LCD screen. For now I want to get the unit talking to the Arduino, displaying G forces in 3 dimensions:

Pitch (front to back, or X)
Roll (side to side, or Y)
Yaw (pivoting as in a skid, or Z)

I connected a BMA180 breakout as follows:


Although the BMA180 requires a 3.3v input, the TWI interface (SCK/SDI) is 5v logic tolerant.



//BMA180 triple axis accelerometer sample code//
//www.geeetech.com//
//
#include <wire.h>
#define BMA180 0x40  //address of the accelerometer
#define RESET 0x10
#define PWR 0x0D
#define BW 0X20
#define RANGE 0X35
#define DATA 0x02
//
int offx = 31;
int offy = 47;
int offz = -23;
//
void setup()
{
 Serial.begin(9600);
 Wire.begin();
 Serial.println("Demo started, initializing sensors");
 AccelerometerInit();
 Serial.println("Sensors have been initialized");
}
//
void AccelerometerInit()
//
{
 byte temp[1];
 byte temp1;
  //
  writeTo(BMA180,RESET,0xB6);
  //wake up mode
  writeTo(BMA180,PWR,0x10);
  // low pass filter,
  readFrom(BMA180, BW,1,temp);
  temp1=temp[0]&0x0F;
  writeTo(BMA180, BW, temp1);
  // range +/- 2g
  readFrom(BMA180, RANGE, 1 ,temp);
  temp1=(temp[0]&0xF1) | 0x04;
  writeTo(BMA180,RANGE,temp1);
}
//
void AccelerometerRead()
{
 // read in the 3 axis data, each one is 14 bits
 // print the data to terminal
 int n=6;
 byte result[5];
 readFrom(BMA180, DATA, n , result);

 int x= (( result[0] | result[1]<<8>>2)+offx ;
 float x1=x/4096.0;
 Serial.print("x=");
 Serial.print(x1);
 Serial.print("g");
 //
 int y= (( result[2] | result[3]<<8>>2)+offy;
 float y1=y/4096.0;
 Serial.print(",y=");
 Serial.print(y1);
 Serial.print("g");
 //
 int z= (( result[4] | result[5]<<8>>2)+offz;
 float z1=z/4096.0;
 Serial.print(",z=");
 Serial.print(z1);
 Serial.println("g");
}
//
void loop()
{
 AccelerometerRead();
 delay(300); // slow down output
}
//
//---------------- Functions--------------------
//Writes val to address register on ACC
void writeTo(int DEVICE, byte address, byte val)
{
  Wire.beginTransmission(DEVICE);   //start transmission to ACC
  Wire.write(address);               //send register address
  Wire.write(val);                   //send value to write
  Wire.endTransmission();           //end trnsmisson
}
//reads num bytes starting from address register in to buff array
 void readFrom(int DEVICE, byte address , int num ,byte buff[])
 {
 Wire.beginTransmission(DEVICE); //start transmission to ACC
 Wire.write(address);            //send reguster address
 Wire.endTransmission();        //end transmission

 Wire.beginTransmission(DEVICE); //start transmission to ACC
 Wire.requestFrom(DEVICE,num);  //request 6 bits from ACC

 int i=0;
 while(Wire.available())        //ACC may abnormal
 {
 buff[i] =Wire.read();        //receive a byte
 i++;
 }
 Wire.endTransmission();         //end transmission
 }



As I move the sensor through the X, Y, and Z axis, the serial monitor shows the changing g forces for each axis. Next update will be to show actual angles on a LCD.



The next step would be to convert the g forces to angles. I have not had a chance to try this, but look at http://wizmoz.blogspot.com/2013/01/simple-accelerometer-data-conversion-to.html
and if that works for you, please let me know!