Beispiel #1
0
void initMagneto(void){
  int i;
  printf("Magnetometer Initializing..........\n");
  if(first_boot){
    pinMode(MAG_LED, OUTPUT);
    if( (mag.fd = wiringPiI2CSetup(HMC5883L_I2C)) < 0 )
      printf ("I2C connection failed: %s\n", strerror(errno));
    
    if( (wiringPiI2CWriteReg8(mag.fd, HMC5883L_REG_A, HIGH_FREQ8)) < 0 )
      printf("Write to HMC5883L_REG_A failed: %s/n", strerror(errno));

    if( (wiringPiI2CWriteReg8(mag.fd, HMC5883L_REG_B, SENSOR_GAIN)) < 0 )
      printf("Write to HMC5883L_REG_B failed: %s/n", strerror(errno));
   
    if( (wiringPiI2CWriteReg8(mag.fd, HMC5883L_MODE_REG, CONTINUOUS)) < 0)
      printf ("Write to HMC5883L_MODE_REG failed: %s/n", strerror(errno));
    first_boot=0;
  }
  mag_starting_up = 1;
  mag.reading = 0;
  mag.average = 0;
  mag.deviation = 0;
  mag.magnitude = 0;
  mag.oldest_sample = 0;
  for(i = 0 ; i < MAX_SAMPLES ; i++){
    readMagneto();
  }
  updateMagneto();
  printf("Magnetometer Initialized...........\n");
  mag_starting_up = 0;
}
Beispiel #2
0
/*
 * send mag. values to uart 3
 */
void sendMagnetoData(void) {
	readMagneto();
	short b;
	unsigned char mag[20];
	mag[19] = '\0';
	b = usprintf((char*) mag, "%i,%i,%i\n", Mx, My, Mz);
#ifndef wlan
	nrf24l01p_send(mag);
#else
	for (int i = 0; i < b; i++) {
		ROM_UARTCharPut(UART3_BASE, mag[i]);
	}

#endif
}
Beispiel #3
0
int fieldDisruptionDetected(void){
  readMagneto();
  delay(1);
  if( ( mag.low < mag.reading && mag.reading < mag.high ) ){
    digitalWrite(MAG_LED, 0);
    return 0;
  }  
  // else if(( (mag.low - DEVIATION_SENSITIVITY*mag.deviation ) > mag.reading || mag.reading > (mag.high + DEVIATION_SENSITIVITY*mag.deviation ) )){
  //   initMagneto();
  // } 
  else{
    digitalWrite(MAG_LED, 1);
    return 1;
  }
}
Beispiel #4
0
/*
 * read and calculate heading with basic tilt compensation
 * @returns float containing heading value -> -180 to +180
 *
 */
float getHeading(void) {

	readMagneto();
	readAccel();
	double pitch, roll;
	if ((Az > 9500 && Az < 10050) || (Az < -9500 && Az > -10050)) {
		pitch = roll = 0;
	} else {
		pitch = getPitch();
		roll = getRoll();
	}
	int Xh = Mx * cos(pitch) + Mz * sin(pitch);	// Virtual X and Virtual Y (corrected)
	int Yh = Mx * sin(pitch) * sin(roll) + My * cos(roll)
			- Mz * sin(roll) * cos(pitch);
	float heading = (atan2f(Yh, Xh) * 180 / M_PI);
	if (heading < 0) {
		heading = 360 + heading;
	}
	return heading;
}