Show Posts
|
|
Pages: [1]
|
|
2
|
Using Arduino / Interfacing w/ Software on the Computer / Re: Serial Freezing
|
on: February 11, 2013, 06:12:26 pm
|
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. #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?
|
|
|
|
|
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: #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 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 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 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: while(Wire.available() < 1) Serial.print("Wating... \n"); Serial.println(Wire.read());
new: 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: 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: 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? #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; }
|
|
|
|
|
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. /* 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 /* 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 #include <BMPSensor.h>
BMPSensor sensor;
void setup() { Serial.begin(9600); }
void loop() { Serial.println(sensor.ReadPressure()); } But I'm getting this error: 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?
|
|
|
|
|