Show Posts
Pages: 1 ... 11 12 [13] 14 15
181  Forum 2005-2010 (read only) / Exhibition / Re: Arduino 3DOF Head Tracker on: January 08, 2009, 02:25:20 pm
Quote
void A2Ddata(unsigned int n) {
 long tempG = 0, tempX = 0, tempY = 0, tempZ = 0;

 for(unsigned int k = 1; k <= n; k++){
   tempG += analogRead(gPin);  
 }
 gRaw = tempG*10/n;  ????
}



???? what the value you get ?   is it radians/sec or deg/sec ?   is tempG  given you as raw value of the sensor ?
especially i didnt understand the  temG*10/n ?    what this calc. do?

Uhm... A2Ddata(n) simply averages n readings from the A2D converter. If you take the average of many readings from a noisy sensor, the average will have more resolution than the A2D converter readings, so by using temG*10/n I keep some of the increased resolution. So A2Ddata(smiley-cool takes the average of 8 readings. These are just raw A2D readings.

Code:
rate = (gRaw*Vin/100-gOffset)*0.0150;  

gRaw is the raw gyro value*10, Vin/100 is the A2D full scale voltage (322/100) or 3.22V. This voltage is feed to the VRef pin of arduino. gOffset is the voltage from the gyro when it's stationary*10, and 0.0150 finally converts everything into degree/s. I'm assuming my gyro has a response of 150dgr/s/V output, it's pretty close to that.

Code:
angle += (rateold+rate)*0.010;  //trapz intergration
rateold = rate;

This does a second order trapezoidal integration, the formula is:

y_n = y_n-1 + ( x_n + x_n-1 )/2 *dt

dt/2 in my case is approximately 0.010

Quote
Did you use this in your code?

That bit of code does work to reduce drift when the head tracker is stationary, but it's not good when it's moving.

My code is very basic. I'm working on a better drift removal method by using a digital high-pass filter.

Hope this helps,
-Z-

182  Forum 2005-2010 (read only) / Exhibition / Re: Arduino 3DOF Head Tracker on: January 07, 2009, 01:33:12 pm
No, it does not eliminate gyro drift. I've programmed it to recentre when I lower my head. You can see me do that a couple of times in the video.
183  Forum 2005-2010 (read only) / Exhibition / Re: Arduino 3DOF Head Tracker on: January 06, 2009, 10:14:29 am
Hi,

I didn't really write the code for interfacing with FSX. I took a SimConnect SDK example in Delphi, and modify it to take serial data, that's about it... If that's what you want to look at, I'll post it here...

Cheers,
-Z-
184  Forum 2005-2010 (read only) / Exhibition / Re: Arduino 3DOF Head Tracker on: January 05, 2009, 03:13:08 pm
Here's the code, will need to be modified to suit you own setup. Also, if anyone wants it, I've got a program that interfaces with FSX camera control and serial port, all you need to do is send a comma separated string of pitch, roll yaw and so on. Should make it easy for anyone wanting to control FSX camera from arduino.

Code:
#include <math.h>
#include <string.h>

#define gPin 0    
#define xAccePin 1
#define yAccePin 2
#define zAccePin 3
#define ledPin 7  
#define rledPin 7  
#define Vin 322
#define xOffset 5081
#define yOffset 5080
#define zOffset 5517


int gOffset = 0;//, xOffset = 0, yOffset = 0, zOffset = 0;
long gRaw = 0, xRaw = 0, yRaw = 0, zRaw = 0;
unsigned long timeold_fast = 0, timeold_med = 0;      
float rate = 0, rateold = 0, angle = 0, Azi = 0, Ele = 0, Roll = 0, AziOld = 0, EleOld = 0, RollOld = 0;
char tempc[10], printStr[50];



void A2Ddata(unsigned int n) {
  long tempG = 0, tempX = 0, tempY = 0, tempZ = 0;

  for(unsigned int k = 1; k <= n; k++){
    tempG += analogRead(gPin);  
    tempX += analogRead(xAccePin);
    tempY += analogRead(yAccePin);
    tempZ += analogRead(zAccePin);
    //delayMicroseconds(10);
  }
  gRaw = tempG*10/n;
  xRaw = tempX*10/n-xOffset;
  yRaw = tempY*10/n-yOffset;
  zRaw = tempZ*10/n-zOffset;
}


void setup() {
  pinMode(ledPin, OUTPUT);  
  pinMode(rledPin, OUTPUT);
  Serial.begin(38400);        

  analogReference(EXTERNAL);
  digitalWrite(rledPin,HIGH);
  delay(1000);
  //Find Gyro rate offset
  A2Ddata(10000);
  gOffset = gRaw*Vin/100;
  printStr[0]= '\0';
  digitalWrite(rledPin,LOW);
}



void loop() {

  if (millis()-timeold_fast > 10) {
    timeold_fast = millis();
    A2Ddata(8);

    //Calculate gyro turn rate
    rate = (gRaw*Vin/100-gOffset)*0.0150;

    if (abs(rate) > 2.5) {
      angle += (rateold+rate)*0.010;  //trapz intergration
    }
    rateold = rate;

    //Calculate elevation and roll angles
    Ele = (atan2(zRaw,xRaw)*57.296-90+EleOld)/2;
    Roll = (atan2(zRaw,yRaw)*57.296-90+RollOld)/2;

  }

  if (millis()-timeold_med > 50) {
    timeold_med = millis();
    // hysterisis dead band
    if (abs(Ele - EleOld) > 0.5) {
      EleOld = Ele;
    }
    else {
      Ele = EleOld;
    }

    if (abs(Roll - RollOld) > 0.5) {
      RollOld = Roll;
    }
    else {
      Roll = RollOld;
    }
    
// reset yaw angle to 0 when head is lowered > 60 degrees
    if (Ele < -60) {
      angle = 0;
    }
  
/*
// code to reduce gyro drift under steady conditions
    if (rate < 5) {
      if (rate > 0) {
        gOffset++;
      }
      else{
        gOffset--;
      }
    }
*/
    digitalWrite(ledPin, HIGH);

    strcat(printStr,floatToString(tempc,rate,2,6,false));
    strcat(printStr,",");
    strcat(printStr,floatToString(tempc,Ele,3,6,false));
    strcat(printStr,",");
    strcat(printStr,floatToString(tempc,Roll,3,6,false));
    strcat(printStr,",");
    strcat(printStr,floatToString(tempc,angle,3,6,false));
    Serial.println(printStr);

    printStr[0] = '\0';
    /*
    Serial.print(floatToString(tempc,rate,2,6,false));
     Serial.print(',');
     //Serial.println(floatToString(tempc,angle,2,6,false));  
     Serial.print(floatToString(tempc,Ele,2,6,false));
     Serial.print(',');
     Serial.print(floatToString(tempc,Roll,2,6,false));
     Serial.print(',');
     Serial.println(floatToString(tempc,angle,2,6,false));
     */
    digitalWrite(ledPin, LOW);  
  }

}
185  Forum 2005-2010 (read only) / Exhibition / Arduino 3DOF Head Tracker on: January 05, 2009, 03:01:54 pm
I posted it at RC Groups, but a couple of people have asked me for the code, which I thought would be more appropriate to post here.
(For more detail, check this thread:
http://www.rcgroups.com/forums/showthread.php?t=964184)



But I thought people here might be interested in it, especially the code.

It's a 3 degree of freedom (pitch, roll, yaw) head tracker built from:

  • A cheap RC heli gyro for ~$15
  • A cheap 3 axis accelerometer board for ~$16
  • RBBB for ~$12

The final goal is to fly my FPV plane through VR goggles, but I'm currently testing it with Microsoft FSX, here's a video:



186  Forum 2005-2010 (read only) / Exhibition / Re: Arduino Helicopter Autopilot on: February 03, 2009, 01:23:31 pm
Subscripted  smiley


With respect to the PPM noise, maybe you can try to add a limit for a maximum amount an axis can change between PPM frames. Since it is unlikely for any axis to change say >25% in 20ms (unless you have super fast commands).

I donno, just thinking...

Cheers,
-Z-
187  Forum 2005-2010 (read only) / Exhibition / Re: Leds (n00b projects) on: March 01, 2010, 04:46:29 pm
Dude I wish I could program arduino when I was 11...
188  Forum 2005-2010 (read only) / Exhibition / Re: Arduino / Processing Timelapse with Pan on: September 08, 2009, 09:21:09 pm
Nice! I have a similar setup, except I use a servo driving a gear box

189  Forum 2005-2010 (read only) / Exhibition / Re: Robotic Arm on: February 19, 2009, 04:46:17 pm
Real industrial articulated robots use a counter weight or spring on the arm axis to balance the weigh of the arm and end effector, this reduces the load on the motor. Maybe you can try something like that?

-Z-
190  Forum 2005-2010 (read only) / Exhibition / Re: Autonomous robot platform on: December 03, 2008, 03:25:17 pm
smiley-lol that music in your video was hilarious. Cool robot!

mem:

The servotimer lib makes the code look much nicer. I think I'll rewrite my robot code with the library instead of the old timer method...

Cheers,
-Z-
191  Forum 2005-2010 (read only) / Exhibition / Re: Levitating magnet and improved Serial library on: March 03, 2009, 03:13:19 pm
That is very cool. Nice work!
192  Forum 2005-2010 (read only) / Exhibition / Arduino FPV RC flight instrumentation on: May 09, 2008, 03:22:14 am
If you haven't heard about FPV flying, check it out:
http://www.rcgroups.com/video-piloting-fpv-rpv-469/

I'm using arduino to display low battery voltage warning and ground proximity (with a ultrasonic sensor) in flight. Here's a video:
http://www.veoh.com/videos/v8567662mGXeNbNN

Cheers,
-Z-
193  Forum 2005-2010 (read only) / Exhibition / PC -> Arduino -> RC brushless motor on: October 01, 2007, 05:21:30 pm
OK, pretty simple stuff, I happened to have this video around. I send servo positions (as strings not bytes) from the PC program to the arduino, which runs a PMW to drive the motor controller. I wrote the program originally to test servos. I'm thinking about adding a RPM sensor and eventually measure battery voltage and current and all that, eventually...

Since it's pretty simple to do, and has probably been done hundreds of times before, I'm not going to explain too much here, unless anyone is interested.




-Z-
194  Forum 2005-2010 (read only) / Exhibition / Re: HummBot on: December 25, 2007, 09:07:46 am
Cool, maybe you can turn one of the IR sensors backward, so it can see what's behind it.

-Z-
195  Forum 2005-2010 (read only) / Exhibition / Re: Paint on the TV screen with Arduino on: April 22, 2007, 01:44:53 am
Benoît,

Thanks for your help! I tried both commenting out wiring.c and cli(), made no difference. I tried your first code in this thread, commented out the code in wiring.c, and I get a fairly clear image but with noise bands rolling over. Maybe we have different PAL standards? I'm guessing my TV tuner was trying to automatically detect what the input format is, and the improper formating of the signal is making it choose the wrong format. Because if I try to watch TV after I'm done messing with it, I have to reset the signal to PAL-GB, otherwise the picture would be messed up. I'll see if I can test it on someone else's TV.

I'm about to give up, maybe get a dedicated chip or board for this. I love how the German guy's high res test picture says: "Hello World, I'm super good, and test image generator is easy"

-Z-
Pages: 1 ... 11 12 [13] 14 15