Show Posts
Pages: [1]
1  Using Arduino / Networking, Protocols, and Devices / Re: Using 2 SPI devices on: May 13, 2014, 10:02:38 pm
You are an amazing person!
2  Using Arduino / Networking, Protocols, and Devices / Using 2 SPI devices on: May 13, 2014, 08:52:08 pm
Hardware:
Arduino Mini: https://www.sparkfun.com/products/11114
Accelerometer - ADXL 345: https://www.sparkfun.com/products/9836
Micro SD Breakout: http://www.adafruit.com/products/254

I'm using SPI for both devices and have test code working for both separately but when i try to use them both, only the SD breakout works.

Wiring: https://learn.adafruit.com/adafruit-micro-sd-breakout-board-card-tutorial/wiring
CS - SD: 10
CD - ACCEL: 9

Code:
Code:
#include <SPI.h>
#include <SD.h>

const int chipSelectSD = 10;
const int chipSelectAC = 9;

File dataFile;

//This is a list of some of the registers available on the ADXL345.
//To learn more about these and the rest of the registers on the ADXL345, read the datasheet!
char POWER_CTL = 0x2D; //Power Control Register
char DATA_FORMAT = 0x31;
char DATAX0 = 0x32; //X-Axis Data 0
char DATAX1 = 0x33; //X-Axis Data 1
char DATAY0 = 0x34; //Y-Axis Data 0
char DATAY1 = 0x35; //Y-Axis Data 1
char DATAZ0 = 0x36; //Z-Axis Data 0
char DATAZ1 = 0x37; //Z-Axis Data 1

//This buffer will hold values read from the ADXL345 registers.
unsigned char values[10];
//These variables will be used to hold the x,y and z axis accelerometer values.
int x,y,z;

void setup()
{
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  pinMode(A6, INPUT);
  pinMode(A7, INPUT);
  pinMode(chipSelectSD, OUTPUT);
  pinMode(chipSelectAC, OUTPUT);
   
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  SPI.begin();
  //Configure the SPI connection for the ADXL345.
  SPI.setDataMode(SPI_MODE3);
 
  // set CS high for accel
  digitalWrite(chipSelectAC, HIGH);
 
  Serial.print("Initializing SD card...");
 
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelectSD)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    while (1) ;
  }
  Serial.println("card initialized.");
 
  // Open up the file we're going to log to!
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (! dataFile) {
    Serial.println("error opening datalog.txt");
    // Wait forever since we cant write data
    while (1) ;
  }
 
  Serial.println("ACCEL INIT.");
 
  //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
  writeRegister(DATA_FORMAT, 0x01);
  //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
  writeRegister(POWER_CTL, 0x08);  // Measurement mode
  Serial.println("ACCEL INIT DONE");
}

void loop()
{
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 8; analogPin++) {
    int sensor = analogRead(analogPin);
    Serial.print(sensor);
    Serial.print(",");
    dataString += String(sensor);
    dataString += ",";
  }
 
  //Reading 6 bytes of data starting at register DATAX0 will retrieve the x,y and z acceleration values from the ADXL345.
  //The results of the read operation will get stored to the values[] buffer.
  readRegister(DATAX0, 6, values);

  //The ADXL345 gives 10-bit acceleration values, but they are stored as bytes (8-bits). To get the full value, two bytes must be combined for each axis.
  //The X value is stored in values[0] and values[1].
  int x = ((int)values[1]<<8)|(int)values[0];
  //The Y value is stored in values[2] and values[3].
  int y = ((int)values[3]<<8)|(int)values[2];
  //The Z value is stored in values[4] and values[5].
  int z = ((int)values[5]<<8)|(int)values[4];
 
  //Print the results to the terminal.
  dataString += String(x);
  dataString += ",";
  Serial.print(x, DEC);
  Serial.print(',');
  dataString += String(x);
  dataString += ",";
  Serial.print(y, DEC);
  Serial.print(',');
  dataString += String(x);
  Serial.println(z, DEC);

  dataFile.println(dataString);

  // print to the serial port too:
  Serial.println(dataString);
 
  // The following line will 'save' the file to the SD card after every
  // line of data - this will use more power and slow down how much data
  // you can read but it's safer!
  // If you want to speed up the system, remove the call to flush() and it
  // will save the file only every 512 bytes - every time a sector on the
  // SD card is filled with data.
  dataFile.flush();
 
  // Take 1 measurement every 100 milliseconds
  delay(100);
}

//This function will write a value to a register on the ADXL345.
//Parameters:
//  char registerAddress - The register to write a value to
//  char value - The value to be written to the specified register.
void writeRegister(char registerAddress, char value){
  //Set Chip Select pin low to signal the beginning of an SPI packet.
  digitalWrite(chipSelectAC, LOW);
  //Transfer the register address over SPI.
  SPI.transfer(registerAddress);
  //Transfer the desired register value over SPI.
  SPI.transfer(value);
  //Set the Chip Select pin high to signal the end of an SPI packet.
  digitalWrite(chipSelectAC, HIGH);
}

//This function will read a certain number of registers starting from a specified address and store their values in a buffer.
//Parameters:
//  char registerAddress - The register addresse to start the read sequence from.
//  int numBytes - The number of registers that should be read.
//  char * values - A pointer to a buffer where the results of the operation should be stored.
void readRegister(char registerAddress, int numBytes, unsigned char * values){
  //Since we're performing a read operation, the most significant bit of the register address should be set.
  char address = 0x80 | registerAddress;
  //If we're doing a multi-byte read, bit 6 needs to be set as well.
  if(numBytes > 1)address = address | 0x40;
 
  //Set the Chip select pin low to start an SPI packet.
  digitalWrite(chipSelectAC, LOW);
  //Transfer the starting register address that needs to be read.
  SPI.transfer(address);
  //Continue to read registers until we've read the number specified, storing the results to the input buffer.
  for(int i=0; i<numBytes; i++){
    values[i] = SPI.transfer(0x00);
  }
  //Set the Chips Select pin high to end the SPI packet.
  digitalWrite(chipSelectAC, HIGH);
}

Thanks for the help!
3  Using Arduino / Networking, Protocols, and Devices / Re: XBee Not Transmitting Data Properly on: July 26, 2013, 01:40:47 pm
The issue was that the baud of the XBee was the same as the GPS so when I was trying to pass the GPS serial through the XBee there were some issues with buffering. When i increased the baud rate of the XBee it fixed all the problems i was having!
4  Using Arduino / Networking, Protocols, and Devices / Re: XBee Not Transmitting Data Properly on: July 24, 2013, 07:55:13 pm
I know that is not the correct location. I took that before it got a lock. However, the issue is not that it gets the wrong location. I have tested the GPS out separately and it works fine once it gets a lock. The issue that i'm having is in how the XBee is transmitting the data. Please see the logs above and notice the difference in formatting to see what I'm referring to.

Thanks!
5  Using Arduino / Networking, Protocols, and Devices / XBee Not Transmitting Data Properly on: July 24, 2013, 05:39:35 pm
I have a gps unit that uses serial to communicate. I know it works as i have tested that separately from the XBees. However, when i put that data through the XBee for some reason the data does not come through as it should.

Code for sending GPS data:
Code:
#include <SoftwareSerial.h>

SoftwareSerial gps(11, 10); // 11 is RX, 10 is TX, greg soldered them backwards...

void setup()
{
  Serial.begin(9600); // to XBee
  gps.begin(9600);
}

void loop()
{
  if(gps.available())
    Serial.write(gps.read());

  if(Serial.available())
    gps.write(Serial.read());
}

Code for receiving data:
Code:
#include <SoftwareSerial.h>

SoftwareSerial xbee(2,3); // 2 is RX, 3 is TX

void setup()
{
  Serial.begin(9600);  // To Computer
  xbee.begin(9600);
}

void loop()
{
  if(xbee.available())
    Serial.write(xbee.read());  
    
  if(Serial.available())
    xbee.write(Serial.read());
}

This is the same basic code i used to communicate with the GPS previously when i tested it so i'm not sure what is going wrong with it.

This is a sample of what is being received:
Quote
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGS,,,80,7143,24,0,2,74,5,02,326,77
$PS,,,8,23,1,02,8152,0,7122,01,4,6*9
GRC235.1,,40.66N15529,,0.0385201,,*F
$PT,3.,,M000,,0.,,*0
$GPGGA,223951.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*5E
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGV,,,80,7143,2482,2,74,5,02,326,77
$PS,,,8,23,1,92,815,81,7122,01,4,670
GRC235.1,,40.66N15529,W000385201,,*E
GPT,3.,,M000N,0.,,*0
$GPGGA,223952.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*5D
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGV2,,80,7143,24,0,0,74,5,02,326,67
$PS,,,8,23,1,92,8152,017122,01,4,771
GRC235.1,,40.66N15529,,0.0385201,,*D
$PT,3.,,M000,,0.,,*0
$GPGGA,223953.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*5C
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGV21,80,7143,24,262,74,5,92,4,6,57
$PS,,,8123,1,92,815281,7122,01,482*1
GRC235.1,,00.66N15529,,000385201,,*7
$PT,3.,,M000N00.,,*0
$GPGGA,223954.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*5B
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGV21080,7143,24,0,2174,5,82,328267
$PS,,,81,3,1,72,8152,01,122,01,4,87
$GRC235.1,,00.66N15529,,0.,3.5201,,*B
GVG,3.,,M000N000,,*0
$GPGGA,223955.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*5A
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGV210,47,433,24,0,31,405,72,3282*0
$PS,,,81,6332,8,8152,01,4,7,01,4,87
$PM,235.1,,0042,,01529,,0.,3.,471,,*A
GVG385,,M000N000KA0
$GPGGA,223956.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*59
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGV210,0,7133,24,0,2,74,5,62,3282*4
$PS,,,81,631,62,8152,017122,01,4,87
$PMC235.1,,00426N15529,,0.,385201,,*9
GVG33.,,M000N000,,*0
$GPGGA,223957.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*58
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.837
GGV210,47,133,24,0,41,409282,3282*7
GGS,,,81,6332,2,8152,01,4,62,3,4,07
$PM,295.1,,0042,,05529,,0.,3.,473,,*8
GVG385T,M000N000KA00
$GPGGA,223958.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*57
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.83
$GGV210,47,4,3,24,0,41,405,22,3282*E
GGV2,,81,6332,818152,01,4,6201,4,87
$PM,298.1,,0042,,01529,,0.,3.,401,,*7
GVG38.T,M000N000KA0
$GPGGA,223959.716,4000.4626,N,10515.2299,W,1,07,1.2,1614.2,M,-14.0,M,,0000*56
$GPGSA,A,3,24,02,20,17,28,04,10,,,,,,2.2,1.2,1.8*7
GGV210,477132,24,0,5174,5,12,3282*9
GPS,,,81,633252,8152,01,422,01,4,07
$PM,235.1,,0042,,15529,,0.,3.5201,,*6
GVG385,,M000N000KA*0

And what should be received:
Quote
$GPGGA,221351.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*6B
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,2,1,06,24,00,000,37,12,00,000,30,06,00,000,00,17,00,000,40*7A
$GPGSV,2,2,06,08,00,000,00,28,00,000,00*7D
$GPRMC,221351.000,V,0000.0000,N,00000.0000,E,000.0,000.0,240713,,,N*73
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,221352.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*68
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,2,1,06,24,00,000,36,12,00,000,29,06,00,000,00,17,00,000,39*7D
$GPGSV,2,2,06,08,00,000,00,28,00,000,00*7D
$GPRMC,221352.000,V,0000.0000,N,00000.0000,E,000.0,000.0,240713,,,N*70
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,221353.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*69
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,2,1,06,24,00,000,36,12,00,000,29,06,00,000,00,17,00,000,40*73
$GPGSV,2,2,06,08,00,000,00,28,00,000,00*7D
$GPRMC,221353.000,V,0000.0000,N,00000.0000,E,000.0,000.0,240713,,,N*71
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,221354.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*6E
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,2,1,06,24,00,000,36,12,00,000,30,06,00,000,00,17,00,000,40*7B
$GPGSV,2,2,06,08,00,000,00,28,00,000,00*7D
$GPRMC,221354.000,V,0000.0000,N,00000.0000,E,000.0,000.0,240713,,,N*76
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,221355.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*6F
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,2,1,05,24,00,000,37,12,00,000,30,17,00,000,40,08,00,000,00*77
$GPGSV,2,2,05,28,00,000,34*41
$GPRMC,221355.000,V,0000.0000,N,00000.0000,E,000.0,000.0,240713,,,N*77
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,221356.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*6C
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,2,1,05,24,00,000,36,12,00,000,29,17,00,000,39,08,00,000,00*70
$GPGSV,2,2,05,28,00,000,33*46
$GPRMC,221356.000,V,0000.0000,N,00000.0000,E,000.0,000.0,240713,,,N*74
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
$GPGGA,221357.000,0000.0000,N,00000.0000,E,0,00,0.0,0.0,M,0.0,M,,0000*6D
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPGSV,2,1,05,24,00,000,36,12,00,000,29,17,00,000,39,08,00,000,00*70
$GPGSV,2,2,05,28,00,000,34*41
$GPRMC,221357.000,V,0000.0000,N,00000.0000,E,000.0,000.0,240713,,,N*75
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02

Thanks a ton for your assistance!
6  Using Arduino / Networking, Protocols, and Devices / Re: Xbee Baud Rate on: December 09, 2012, 06:38:39 pm
Thanks for your help. Sorry it took me so long to respond, I have had to take care of some stuff that required me to be away from my computer.

I'm unsure exactly what you mean when you say.
Quote
2. However, the switch does not cross Rx,Tx, rather it connects over to pins 2,3, and only
    if you solder in jumpers yourself for the alternate-position. So, the switch has to be in the
    default [pin 0,1] position, and you need to cross-wire pins 0,1 using external jumpers.

I'm not sure where I need to solder in these jumpers and if you mean for me to connect pins 2 and 3 from the Arduino to the shield and how/where you want me to cross wire it. Sorry if this is a stupid question, but would you mind just laying out where all the jumpers go? For example: arduino,p# -> shield,p#

Thanks!
7  Using Arduino / Networking, Protocols, and Devices / Re: Xbee Baud Rate on: December 08, 2012, 03:13:46 pm
the shield that I'm using is: https://www.sparkfun.com/products/10854
It says you can connect it to 5v and it regulates the voltage down to 3.3v. I'm able to communicate between the 2 Xbee's that i have so i would think that they power that it is provided is okay.

I don't know how easy it is to see in the picture but i have the switch at DLINE which i believe is the USB side. However, I have tried it both ways as well as switching the wires up. Being that i have the switch to DLINE and the TX -> TX and RX -> RX in the form Arduino -> shield. Am I supposed to do it like TX -> RX and RX -> TX instead as I had it in the first picture that i posted?

I'm using Putty as my terminal  software and it is configured as followed: http://i45.tinypic.com/29l1nxx.jpg
The device is set up as follows: http://i49.tinypic.com/535uhe.jpg

Actually those are a little mixed but have all the information none the less.

8  Using Arduino / Networking, Protocols, and Devices / Re: Xbee Baud Rate on: December 08, 2012, 02:31:42 pm
Okay i have tried doing what you said (I believe). However it's still unable to communicate over serial.

Here is how it is now wired: http://i49.tinypic.com/33yklmu.jpg

Thanks for your assistance!
9  Using Arduino / Networking, Protocols, and Devices / Re: Xbee Baud Rate on: December 08, 2012, 01:41:56 pm
Thanks for the reply, Ive tried taking that out already and i still can't get it to work. Is there anything else after that I need to do either on the Arduino, the shield or on the computer to make it know that you are trying to communicate with the Xbee correctly?

I have tried to just put the shield on top of the Arduino and wiring it up like this:
http://i49.tinypic.com/jidq44.jpg  I tried just putting in the image and it looked awful on this elderly forum software.

Edit: Is it maybe that it's still using the Arduino drivers?
10  Using Arduino / Networking, Protocols, and Devices / Xbee Baud Rate on: December 08, 2012, 02:41:43 am
I'm trying to set the baud rate of the of an Xbee using an Arduino and it seems like it should be an easy task using terminal software or X-CTU. However, I've been unable to connect to the Xbee using the Arduino as the serial device that is connected to the computer to set the baud rate. I'm mostly wondering if it's even possible to do this or if i need additional hardware outside the Arduino and the Xbee Shield from SparkFun to be able to communicate with the Xbee directly so that I can set the baud rate. I'm using an Uno R3 if that helps. I can provide any additional information per request.

Thanks for your assistance!
Pages: [1]