Show Posts
Pages: [1]
1  Using Arduino / Interfacing w/ Software on the Computer / Re: Serial Freezing on: February 11, 2013, 08:37:05 pm
Oh, I see what you're getting at now. I found my problem with Serial freezing, too. I noticed I had a print in an interrupt, which doesn't work.
2  Using Arduino / Interfacing w/ Software on the Computer / Re: Serial Freezing on: February 11, 2013, 06:12:26 pm
Quote
Changing the resolution of the values stored, so that one unit is say 1/10" of an inch or 1/4 of a centimeter would cut your storage requirements in half.

While you're correct, and I probably should change the resolution of my scan, I'm not sure what you mean by "1/10" " since this is a rotational scale, not a linear one. The 300 is the number of ticks in a complete turn on my encoder.
3  Using Arduino / Interfacing w/ Software on the Computer / Re: Serial Freezing on: February 11, 2013, 05:32:47 pm
I have a 360 degree continuous motion servo attached to a rod. The interrupt is one of the channel pins on a wheel watcher watching the rotation of the rod. At the top of the rod is an infrared distancer and an ultrasonic one.

Code:
#include <Servo.h>

#define SCAN_RESOLUTION 1

#define ULTRASONIC_CONTROL_PIN 7
#define ULTRASONIC_READ_PIN A1
#define INFRARED_PIN A0

unsigned int ultraSonicDistance = 0;
double infraredValue = 0.0;
double infraredDistance = 0.0;
volatile int xAngle = 0; //Goes from 0-300 covering 1 full circle
//int yAngle = 0;
Servo xServo;
//Servo yServo;
int xServoDirection = SCAN_RESOLUTION;
int yServoDirection = SCAN_RESOLUTION;
boolean highResScan = false;

double surroundingsMap[300] = {0};

void setup()
{
  Serial.begin(9600);
 
  xServo.attach(9,492,2348); //values found experimentally to make write(90) say stop
  //yServo.attach(10);
  attachInterrupt(0,stopXServo,FALLING);
  pinMode(ULTRASONIC_CONTROL_PIN,OUTPUT);
  digitalWrite(ULTRASONIC_CONTROL_PIN,LOW);
}

void loop()
{
  xServo.write(90 + (xServoDirection*2)); //90 is "don't move"
  Serial.print(90 + (xServoDirection*2));
  Serial.print(" ");
  Serial.println(xAngle);
  if(highResScan)
    delay(100);
}

void readInfrared()
{
  infraredValue = analogRead(INFRARED_PIN);
  infraredValue *= .0049;
  infraredDistance = 3*pow((infraredValue-3),4) + 15;
}

void readUltrasonic()
{
  digitalWrite(ULTRASONIC_CONTROL_PIN,HIGH);
  delayMicroseconds(20);
  ultraSonicDistance = analogRead(ULTRASONIC_READ_PIN);
  digitalWrite(ULTRASONIC_CONTROL_PIN,LOW);
}

void stopXServo()

  xServo.write(90);
  readInfrared();
  ultraSonicDistance = infraredDistance;
  if(highResScan)
    readUltrasonic();
 
  surroundingsMap[xAngle] = (infraredDistance+ultraSonicDistance)/2;
  xAngle += xServoDirection;
  if(xAngle == 300)
  {
    xAngle = 0;
    //xServoDirection *= -1;
    /*yServo.write(yServo.read()+yServoDirection);
    if(yAngle == 90 || yAngle == 0)
      yServoDirection *= -1;*/
  }
}

The serial communication stops, as does the rotation of my servo/rod setup, around xAngle = 295 to 298.
4  Using Arduino / Interfacing w/ Software on the Computer / Serial Freezing on: February 08, 2013, 09:20:57 pm
I have a strange issue with Serial: it will sometimes freeze mid-message (i.e. Serial.print("This is my message"); will only print "This is m" and then nothing). The TX light on the Uno is no longer lit, and as far as I can tell, the entire program locks up. Any idea what could be causing this and/or what I might try to fix it?
5  Using Arduino / Sensors / Re: Wire.requestFrom() hangs when there is an analogRead() after it on: December 11, 2012, 07:11:06 pm
Ah, excellent. Adding the "true" parameter seems to have fixed the issue. Many thanks for your help.
6  Using Arduino / Sensors / Re: Wire.requestFrom() hangs when there is an analogRead() after it on: December 11, 2012, 04:09:44 pm
Here's what I've written:
Code:
#include <Wire.h>

#define PWR_I2C_ADDRESS 1

int accessAddress(int regAddress)
{
  return (PWR_I2C_ADDRESS<<5)+regAddress;
}

void writeTo(int regAddress, byte data)
{
  Wire.beginTransmission(accessAddress(regAddress));
  Wire.write(data);
  Wire.endTransmission();
}

byte readFrom(int regAddress)
{
  Wire.beginTransmission(accessAddress(regAddress));
  Wire.endTransmission();
  Wire.requestFrom(accessAddress(regAddress),1);
 return Wire.read();
}

void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

void loop()
{
  writeTo(0x01,B00010010);
  Serial.println(readFrom(0x01));
  Serial.println(analogRead(A1));
}

Reading from the registers works fine right up until I add the analogRead(), at which point I start getting 255 back from readFrom(), which is, apparently, the default value, as it is what I get back when I try reading from a non-existent register.
7  Using Arduino / Sensors / Re: Wire.requestFrom() hangs when there is an analogRead() after it on: December 11, 2012, 03:29:35 pm
I missed the bit about running it before and after my code. Here is what I get then

Code:
Scanning...
I2C device found at address 0x20 !
I2C device found at address 0x21 !
I2C device found at address 0x22 !
I2C device found at address 0x23 !
I2C device found at address 0x24 !
I2C device found at address 0x25 !
I2C device found at address 0x26 !
I2C device found at address 0x27 !
I2C device found at address 0x28 !
I2C device found at address 0x29 !
I2C device found at address 0x2A !
I2C device found at address 0x2B !
I2C device found at address 0x2C !
I2C device found at address 0x2D !
I2C device found at address 0x2E !
I2C device found at address 0x2F !
I2C device found at address 0x30 !
I2C device found at address 0x31 !
I2C device found at address 0x32 !
I2C device found at address 0x33 !
I2C device found at address 0x34 !
I2C device found at address 0x35 !
I2C device found at address 0x36 !
I2C device found at address 0x37 !
I2C device found at address 0x38 !
I2C device found at address 0x39 !
I2C device found at address 0x3A !
I2C device found at address 0x3B !
I2C device found at address 0x3C !
I2C device found at address 0x3D !
I2C device found at address 0x3E !
I2C device found at address 0x3F !
done

16
1023
Scanning...
No I2C devices found

Scanning...
No I2C devices found

1023
Scanning...
No I2C devices found
8  Using Arduino / Sensors / Re: Wire.requestFrom() hangs when there is an analogRead() after it on: December 11, 2012, 03:05:20 pm
The BQ76925 uses a condensed version of the I2C protocol where the device address and register address are combined into one address (to reduce overhead or something like that), but for what it's worth, here's what I get when I run the scanner
Code:
I2C Scanner
Scanning...
I2C device found at address 0x20 !
I2C device found at address 0x21 !
I2C device found at address 0x22 !
I2C device found at address 0x23 !
I2C device found at address 0x24 !
I2C device found at address 0x25 !
I2C device found at address 0x26 !
I2C device found at address 0x27 !
I2C device found at address 0x28 !
I2C device found at address 0x29 !
I2C device found at address 0x2A !
I2C device found at address 0x2B !
I2C device found at address 0x2C !
I2C device found at address 0x2D !
I2C device found at address 0x2E !
I2C device found at address 0x2F !
I2C device found at address 0x30 !
I2C device found at address 0x31 !
I2C device found at address 0x32 !
I2C device found at address 0x33 !
I2C device found at address 0x34 !
I2C device found at address 0x35 !
I2C device found at address 0x36 !
I2C device found at address 0x37 !
I2C device found at address 0x38 !
I2C device found at address 0x39 !
I2C device found at address 0x3A !
I2C device found at address 0x3B !
I2C device found at address 0x3C !
I2C device found at address 0x3D !
I2C device found at address 0x3E !
I2C device found at address 0x3F !
done

The address format is 01(5-bit reg address)
9  Using Arduino / Sensors / Re: Wire.requestFrom() hangs when there is an analogRead() after it on: December 11, 2012, 02:10:37 pm
Okay, I now have 4k7 pullups on the I2C bus, I'm using your recommended code, and I've added a delay before analogRead(). Now I get
Code:
1023
1022
1022
1023
1022
1023
1023
1022
1023
1023
1021
1023
1023
1023
1023
1023
1023
1023
1023
1023
as my output, indicating that I am reading the analog port, but never getting a reply from the chip, meaning I have no idea if it's actually listening to me, and therefore whether the data is valid.
10  Using Arduino / Sensors / Re: Wire.requestFrom() hangs when there is an analogRead() after it on: December 11, 2012, 01:12:44 pm
Chip supply voltage is 3.3V. I am not currently using external resistors on the I2C bus, just letting the internal Arduino ones handle it.


old:
Code:
while(Wire.available() < 1)
    Serial.print("Wating... \n");
  Serial.println(Wire.read());

new:
Code:
while(Wire.available())
{
  Serial.println(Wire.read());
}


Only problem with that is I'm trying to confirm communications with that code (0x07 is the CHIP_ID register), so I'm waiting for the chip to communicate. Your code would be wonderful if I was getting a variable amount of data back, but I'm not.

Because you call analogRead() after you read from the I2C bus this cannot be the reason for the failure.

That would be why I'm posting here asking about it: it doesn't make any sense. I can remove everything before and after the analogRead() call and get "Waiting..." forever, but the second I remove it, data starts printing.

Here's the output with:
Code:
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...
Wating...

without:
Code:
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
11  Using Arduino / Sensors / Wire.requestFrom() hangs when there is an analogRead() after it on: December 06, 2012, 07:45:43 pm
I'm trying to use the BQ76925 to monitor a battery bank. One of the pins on the chip is an analog output that give the voltage of the currently selected cell selected by writing to a register using the I2C protocol. However, when I try to read the value of that output after doing some I2C commands to confirm communications have been established, I never get a response from the chip (as far as my Uno is concerned). The problem goes away as soon as I remove the analogRead(), but I need that to monitor my batteries. Is this a known issue with the Wire library, or am I doing something screwy?

Code:
#include <Wire.h>

#define PWR_I2C_ADDRESS 1

#define ALERT_PIN 2
#define VCOUT_PIN A1
#define VIOUT_PIN A2

void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

void loop()

  Wire.beginTransmission(accessAddress(0x07));
  Wire.endTransmission();
 
  Wire.requestFrom(accessAddress(0x07),1);
  while(Wire.available() < 1)
    Serial.print("Wating... \n");
  Serial.println(Wire.read());
 
  Wire.beginTransmission(accessAddress(0x01));
  Wire.write(B00010000);
  Wire.endTransmission();
  Serial.println(analogRead(VCOUT_PIN));
//  Wire.beginTransmission(accessAddress(0x01));
//  Wire.write(B00010001);
//  Wire.endTransmission();
//  Serial.println(analogRead(VCOUT_PIN));
//  Wire.beginTransmission(accessAddress(0x01));
//  Wire.write(B00010010);
//  Wire.endTransmission();
//  Serial.println(analogRead(VCOUT_PIN));
//  Wire.beginTransmission(accessAddress(0x01));
//  Wire.write(B00010011);
//  Wire.endTransmission();
//  Serial.println(analogRead(VCOUT_PIN));
//  Wire.beginTransmission(accessAddress(0x01));
//  Wire.write(B00010100);
//  Wire.endTransmission();
//  Serial.println(analogRead(VCOUT_PIN));
//  Wire.beginTransmission(accessAddress(0x01));
//  Wire.write(B00010101);
//  Wire.endTransmission();
//  Serial.println(analogRead(VCOUT_PIN));
}

int accessAddress(int regAddress)
{
  return (PWR_I2C_ADDRESS<<5)+regAddress;
}
12  Using Arduino / Programming Questions / Re: Wire library includes, but error says "Not Defined" on: September 20, 2012, 05:33:23 pm
Awesome, that fixed it! Thanks a ton!
13  Using Arduino / Programming Questions / Wire library includes, but error says "Not Defined" on: September 20, 2012, 04:32:09 pm
I'm building a library to get pressure readings from a BMP085 pressure sensor using the Wire library.

Code:
/*
  BMPSensor.h - Library for reading pressure values from the BMP085
  Created by Jacob Talley, September 20, 2012.
*/
#ifndef BMPSensor_h
#define BMPSensor_h

#include "Arduino.h"
#include <Wire.h>

class BMPSensor
{
  public:
    BMPSensor();
    long ReadPressure();
  private:
    void bmp085Calibration();
    short bmp085GetTemperature(unsigned int ut);
    long bmp085GetPressure(unsigned long up);
    char bmp085Read(unsigned char address);
    int bmp085ReadInt(unsigned char address);
    unsigned int bmp085ReadUT();
    unsigned long bmp085ReadUP();
    int ac1;
    int ac2;
    int ac3;
    unsigned int ac4;
    unsigned int ac5;
    unsigned int ac6;
    int b1;
    int b2;
    int mb;
    int mc;
    int md;
    long b5;
};

#endif

Code:
/*
  BMPSensor.cpp - Library for reading pressure values from the BMP085
  Created by Jacob Talley, September 20, 2012.
*/
#include "BMPSensor.h"

#define BMP085_ADDRESS 0x77  //I2C address of BMP085
#define OSS 0 //Oversampling setting


BMPSensor::BMPSensor()
{
  Wire.begin();
  bmp085Calibration();
}

long BMPSensor::ReadPressure()
{
  short temperature;
  long pressure;
 
  temperature = bmp085GetTemperature(bmp085ReadUT());
  pressure = bmp085GetPressure(bmp085ReadUP());

  return pressure;
}

void BMPSensor::bmp085Calibration()
{
  ac1 = bmp085ReadInt(0xAA);
  ac2 = bmp085ReadInt(0xAC);
  ac3 = bmp085ReadInt(0xAE);
  ac4 = bmp085ReadInt(0xB0);
  ac5 = bmp085ReadInt(0xB2);
  ac6 = bmp085ReadInt(0xB4);
  b1 = bmp085ReadInt(0xB6);
  b2 = bmp085ReadInt(0xB8);
  mb = bmp085ReadInt(0xBA);
  mc = bmp085ReadInt(0xBC);
  md = bmp085ReadInt(0xBE);
}

short BMPSensor::bmp085GetTemperature(unsigned int ut)
{
  long x1, x2;
 
  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  x2 = ((long)mc << 11)/(x1 + md);
  b5 = x1 + x2;
 
  return ((b5 + 8)>>4);
}

long BMPSensor::bmp085GetPressure(unsigned long up)
{
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;
 
  b6 = b5 - 4000;
 
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
 
  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6* b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
 
  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;
   
  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
  p += (x1 + x2 + 3791)>>4;
 
  return p;
}

char BMPSensor::bmp085Read(unsigned char address)
{
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
 
  Wire.requestFrom(BMP085_ADDRESS,1);
  while(!Wire.available())
    ;
   
  return Wire.read();
}

int BMPSensor::bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;
 
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
 
  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2)
    ;
  msb = Wire.read();
  lsb = Wire.read();
 
  return (int) msb<<8 | lsb;
}

unsigned int BMPSensor::bmp085ReadUT()
{
  unsigned int ut;
 
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4); //register
  Wire.write(0x2E); //value, requests uncompensated temp
  Wire.endTransmission();
 
  delay(5); //Wait for at least 4.5ms
 
  ut = bmp085ReadInt(0xF6);
  return ut;
}

unsigned long BMPSensor::bmp085ReadUP()
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
 
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x34 + (OSS<<6));
  Wire.endTransmission();
 
  delay(2 + (3<<OSS)); //Wait for conversion, delay time dependant on OSS
 
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF6);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 3);
 
  while(Wire.available() < 3)
    ;
  msb = Wire.read();
  lsb = Wire.read();
  xlsb = Wire.read();
 
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
 
  return up;
}

My test program is
Code:
#include <BMPSensor.h>

BMPSensor sensor;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println(sensor.ReadPressure());
}

But I'm getting this error:
Code:
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp: In constructor 'BMPSensor::BMPSensor()':
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp:15: error: 'Wire' was not declared in this scope
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp: In member function 'char BMPSensor::bmp085Read(unsigned char)':
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp:89: error: 'Wire' was not declared in this scope
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp: In member function 'int BMPSensor::bmp085ReadInt(unsigned char)':
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp:104: error: 'Wire' was not declared in this scope
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp: In member function 'unsigned int BMPSensor::bmp085ReadUT()':
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp:121: error: 'Wire' was not declared in this scope
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp: In member function 'long unsigned int BMPSensor::bmp085ReadUP()':
C:\Users\Big Bang\Documents\Arduino\libraries\BMPSensor\BMPSensor.cpp:137: error: 'Wire' was not declared in this scope

Since Wire doesn't need a variable of type Wire, I'm not sure what this could be talking about.
Any ideas?
Pages: [1]