Changes to RoverSensor API Signed-off-by: Mustafa Ozcelikors <mozcelikors@gmail.com>
diff --git a/rover/include/roverapi/rover_sensor.hpp b/rover/include/roverapi/rover_sensor.hpp new file mode 100644 index 0000000..85173c7 --- /dev/null +++ b/rover/include/roverapi/rover_sensor.hpp
@@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017 FH Dortmund and others + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Description: + * Rover Sensor API - Interfaces for Rover sensors application development + * Header file + * + * Contributors: + * M.Ozcelikors <mozcelikors@gmail.com>, modified C++ API 04.12.2017 + * created C++ API 17.11.2017 + * initial QMC5883L driver implemented 30.11.2017 + * David Schmelter, Fraunhofer IEM - compass sensor initial implementation + * Gael Blondelle, Eclipse Foundation - initial API and parameters + * + */ + +#ifndef API_ROVER_SENSORS_HPP_ +#define API_ROVER_SENSORS_HPP_ + +#include <stdint.h> +#include <stdio.h> +#include <unistd.h> + + +//To debug the application, uncomment the following +//#define DEBUG 1 + + +namespace rover +{ + /** + * @brief RoverSensorID_t defines the sensor location ID of the proximity sensors on the rover + */ + enum RoverSensorID_t { ROVER_REAR_RIGHT = 0, + ROVER_REAR_LEFT = 1, + ROVER_FRONT_RIGHT = 2, + ROVER_FRONT_LEFT = 3, + ROVER_FRONT = 4, + ROVER_REAR = 5}; + + /** + * @brief RoverSensor class is an abstract class to define interface between common sensors used in the rover. + */ + class RoverSensor + { + public: + /** + * @brief Virtual function (interface) for setting up sensors + * @return void + */ + virtual void initialize (void) = 0; + + /** + * @brief Virtual function (interface) for reading from sensors + * @return sensor_val Sensor value read from sensor + */ + virtual float read (void) = 0; + + /** + * @brief Destructor for the RoverSensor class + */ + virtual ~RoverSensor() {}; + + }; +} + + + +#endif /* API_ROVER_SENSORS_HPP_ */
diff --git a/rover/include/roverapi/rover_sensors.hpp b/rover/include/roverapi/rover_sensors.hpp deleted file mode 100644 index 4eddcee..0000000 --- a/rover/include/roverapi/rover_sensors.hpp +++ /dev/null
@@ -1,243 +0,0 @@ -/* - * Copyright (c) 2017 FH Dortmund and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Description: - * Rover Sensors API - Interfaces for Rover sensors application development - * Header file - * - * Contributors: - * M.Ozcelikors <mozcelikors@gmail.com>, created C++ API 17.11.2017 - * initial QMC5883L driver implemented 30.11.2017 - * David Schmelter, Fraunhofer IEM - compass sensor initial implementation - * Gael Blondelle, Eclipse Foundation - initial API and parameters - * - */ - -#ifndef API_ROVER_SENSORS_HPP_ -#define API_ROVER_SENSORS_HPP_ - -#include <stdint.h> -#include <stdio.h> -#include <unistd.h> - - -//To debug the application, uncomment the following -//#define DEBUG 1 - - -namespace rover -{ - /** - * @brief RoverSensors class contains member functions to setup and read from embedded sensors from rover's RoverSenseLayer sensor layer. - */ - class RoverSensors - { - private: - /* Pins of ultrasonic sensors */ - /** - * @brief Groove Sensor Pin for Front Sensor Socket (in wiringPi format) - */ - static const int SIG0 = 0; //BCM-17 -> WiringPi 0 //Same as ECHO0 pin, if some one wants to replace front sr04 with groove sensor - - /** - * @brief Groove Sensor Pin for Rear Sensor Socket (in wiringPi format) - */ - static const int SIG1 = 2; //BCM-27 -> WiringPi 2 //Same as ECHO1 pin, if some one wants to replace back sr04 with groove sensor - - /** - * @brief HC-SR04 Sensor Trigger Pin for Front Sensor Socket (in wiringPi format) - */ - static const int TRIG0 = 7; //BCM-4 -> WiringPi 7 - /** - * @brief HC-SR04 Sensor Echo Pin for Front Sensor Socket (in wiringPi format) - */ - static const int ECHO0 = 0; //BCM-17 -> WiringPi 0 - - /** - * @brief HC-SR04 Sensor Trigger Pin for Rear Sensor Socket (in wiringPi format) - */ - static const int TRIG1 = 1; //BCM-18 -> WiringPi 1 - /** - * @brief HC-SR04 Sensor Echo Pin for Rear Sensor Socket (in wiringPi format) - */ - static const int ECHO1 = 2; //BCM-27 -> WiringPi 2 - - /* Definitions related to DHT22 sensor */ - /** - * @brief DHT22 sensor pin in wiringPi format - */ - static const int DHT22_RPI_PIN = 24; //BCM19 -> wiringPi 24 - static const int MAX_TIMINGS = 85; - - /* Definitions related to compass sensor */ - /** - * @brief Address for compass sensor - */ - int HMC588L_ADDRESS = 0x1E; //0x1E; - /** - * @brief Calibration duration for compass sensor - */ - int CALIBRATION_DURATION = 10000; //compass calibration has a duration of 5 seconds - /** - * @brief Declination angle / correction factor for compass sensor - */ - float DECLINATION_ANGLE = 0.0413; //correction factor for location Paderborn - - /** - * @brief Calibration variable for HMC588L - */ - unsigned int calibration_start; - - public: - - /* Rover Sensor IDs */ - /** - * @brief Static definition to indicate rover's front ultrasonic sensor socket - */ - static const int ROVER_FRONT = 0; - - /** - * @brief Static definition to indicate rover's rear ultrasonic sensor socket - */ - static const int ROVER_REAR = 1; - - /* Rover Infrared Sensor IDs */ - /** - * @brief Static definition to indicate rover's rear-right infrared sensor - */ - static const int ROVER_REAR_RIGHT = 0; - - /** - * @brief Static definition to indicate rover's rear-left infrared sensor - */ - static const int ROVER_REAR_LEFT = 1; - - /** - * @brief Static definition to indicate rover's front-right infrared sensor - */ - static const int ROVER_FRONT_RIGHT = 2; - - /** - * @brief Static definition to indicate rover's front-left infrared sensor - */ - static const int ROVER_FRONT_LEFT = 3; - - /** - * @brief Initializes the sensors - * @return void - */ - void initialize(); - - /*** - * @brief Constructor for the RoverSensors class. - */ - explicit RoverSensors(); - - /** - * @brief Sets up the HC-SR04 ultrasonic sensor - * @return void - */ - void setupHCSR04UltrasonicSensor(int sensor_id); - - /** - * @brief Reads from HC-SR04 ultrasonic sensor in centimeters. sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor. - * @param sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor. - * @return sensor_val in centimeters - */ - int readHCSR04UltrasonicSensor (int sensor_id); - - /** - * @brief Sets up the groove ultrasonic sensor - * @return void - */ - void setupGrooveUltrasonicSensor (void); - - /** - * @brief Reads from groove ultrasonic sensor in centimeters. sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor. - * @param sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor. - * @return sensor_val in centimeters - */ - int readGrooveUltrasonicSensor (int sensor_id); - - /** - * @brief Sets up the infrared sensors and Analog to digital converter - * @return void - */ - void setupInfraredSensors (void); - - /** - * @brief Reads from infrared sensor in centimeters (float). - * @param infrared_sensor_id Indicates the channel of which on-board sensor is addressed. RoverSensors::ROVER_REAR_RIGHT: Rear-right, RoverSensors::ROVER_REAR_LEFT: Rear-left, RoverSensors::ROVER_FRONT_RIGHT: Front-right, RoverSensors::ROVER_FRONT_LEFT: Front-left. - * @return sensor_val in centimeters (float). - */ - float readInfraredSensor (int infrared_sensor_id); - - /** - * @brief Sets up the bearing sensor Sunfounder HMC5883L and its I2C interface - * @return void - */ - void setupBearingHMC5883L (void); - - /** - * @brief Starts calibration for the bearing sensor - * @return void - */ - void calibrateBearingSensor (void); - - /** - * @brief Sets the HMC588L Address - * @return void - */ - void setHMC588LAddress (int address); - - /** - * @brief Sets the HMC588L Caliration Duration - * @return void - */ - void setHMC588LCalibrationPeriod(int period); - - /** - * @brief Sets the HMC588L Declination angle - * @return void - */ - void setHMC588LDeclinationAngle (float angle); - - /** - * @brief Reads the bearing value from Bearing sensor Sunfounder HMC5883L (float). - * @return bearing_val in degrees (float). - */ - float readBearingHMC5883L (void); - - /** - * @brief Reads the temperature value in Celcius degrees from DHT22 temperature and humidity sensor (float). - * @return temperature_val in Celcius degrees (float). - */ - float readTemperature (void); - - /** - * @brief Reads the humidity value in percentage from DHT22 temperature and humidity sensor (float). - * @return humidity_val in percentage (float). - */ - float readHumidity (void); - - /** - * @brief Sets up the bearing sensor with QMC5883L chip and its I2C interface - * @return void - */ - void setupBearingQMC5883L (void); - - /** - * @brief Reads the bearing value from Bearing sensor with QMC5883L chip (float). - * @return bearing_val in degrees (float). - */ - float readBearingQMC5883L (void); - }; -} - - - -#endif /* API_ROVER_SENSORS_HPP_ */
diff --git a/rover/src/roverapi/rover_sensors.cpp b/rover/src/roverapi/rover_sensors.cpp deleted file mode 100644 index 0e96497..0000000 --- a/rover/src/roverapi/rover_sensors.cpp +++ /dev/null
@@ -1,607 +0,0 @@ -/* - * Copyright (c) 2017 FH Dortmund and others - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Description: - * Rover Sensors API - Interfaces for Rover sensors application development - * - * Contributors: - * M.Ozcelikors <mozcelikors@gmail.com>, created C++ API 17.11.2017 - * initial QMC5883L driver implemented 30.11.2017 - * David Schmelter, Fraunhofer IEM - compass sensor initial implementation - * Gael Blondelle - initial API and parameters - * - */ - -#include <roverapi/basic_psys_rover.h> -#include <roverapi/rover_sensors.hpp> -#include <mcp3004.h> -#include <wiringPiI2C.h> -#include <math.h> -#include <stdint.h> -#include <stdio.h> -#include <unistd.h> - -static int i2c_hmc588l_fd = -1; - -static int16_t xMinRaw = 0; -static int16_t xMaxRaw = 0; -static int16_t yMaxRaw = 0; -static int16_t yMinRaw = 0; - -rover::RoverSensors::RoverSensors() -{ - this->calibration_start = 0; -} - -void rover::RoverSensors::initialize (void) -{ - //wiringPiSetup(); - - this->setupHCSR04UltrasonicSensor(this->ROVER_FRONT); - this->setupHCSR04UltrasonicSensor(this->ROVER_REAR); - this->setupInfraredSensors(); - this->setupBearingHMC5883L(); - this->setupBearingQMC5883L(); -} - -void rover::RoverSensors::setupHCSR04UltrasonicSensor (int sensor_id) -{ - int trig_pin, echo_pin; - - if (sensor_id == this->ROVER_FRONT) - { - trig_pin = this->TRIG1; - echo_pin = this->ECHO1; - } - else if (sensor_id == this->ROVER_REAR) - { - trig_pin = this->TRIG0; - echo_pin = this->ECHO0; - } - else - { - printf ("Invalid Sensor ID for the Ultrasonic Sensor to function setupHCSR04UltrasonicSensor.\n"); - } - - pinMode(trig_pin, OUTPUT); - pinMode(echo_pin, INPUT); - - //TRIG pin must start LOW - digitalWrite(trig_pin, LOW); - delayMicroseconds(2); -} - -int rover::RoverSensors::readHCSR04UltrasonicSensor (int sensor_id) -{ - int trig_pin, echo_pin; - - if (sensor_id == this->ROVER_FRONT) - { - trig_pin = this->TRIG1; - echo_pin = this->ECHO1; - } - else if (sensor_id == this->ROVER_REAR) - { - trig_pin = this->TRIG0; - echo_pin = this->ECHO0; - } - else - { - printf ("Invalid Sensor ID for the Ultrasonic Sensor to function readHCSR04UltrasonicSensor.\n"); - } - - int distance = 0; - //Send trig pulse - digitalWrite(trig_pin, HIGH); - delayMicroseconds(10); - digitalWrite(trig_pin, LOW); - - //Wait for echo start - long startTime = micros(); - while(digitalRead(echo_pin) == LOW && micros() < startTime + 100000); - - //Wait for echo end - startTime = micros(); - while(digitalRead(echo_pin) == HIGH); - long travelTime = micros() - startTime; - - //Get distance in cm - distance = travelTime * 34300; - distance = distance / 1000000; - distance = distance / 2; - // The below protection is to ensure there is no value fluctuation due to timeout - if (distance > 40 ) - distance = 40; - - // printf("dist=%d\n",distance); - return distance; -} - -void rover::RoverSensors::setupGrooveUltrasonicSensor(void) { - //wiringPiSetup(); //Since this can only be used once in a program, we do it in main and comment this. -} - -int rover::RoverSensors::readGrooveUltrasonicSensor (int sensor_id) -{ - int sig_pin; - - if (sensor_id == this->ROVER_FRONT) - { - sig_pin = this->SIG1; - } - else if (sensor_id == this->ROVER_REAR) - { - sig_pin = this->SIG0; - } - else - { - printf ("Invalid Sensor ID for the Ultrasonic Sensor to function readGrooveUltrasonicSensor.\n"); - } - - long startTime, stopTime, elapsedTime, distance = 0; - pinMode(sig_pin, OUTPUT); - digitalWrite(sig_pin, LOW); - delayMicroseconds(2); - digitalWrite(sig_pin, HIGH); - delayMicroseconds(5); - digitalWrite(sig_pin, LOW); - pinMode(sig_pin,INPUT); - - startTime = micros(); - while (digitalRead(sig_pin) == LOW ); - startTime = micros(); - // For values above 40cm, groove sensor is unable to receive signals which causes it to stuck - // This is resolved by adding the timeout below. - // However, this timeout cause values bigger than 40 to fluctuate - while (digitalRead(sig_pin) == HIGH && micros() < startTime + 100000); - stopTime = micros(); - elapsedTime = stopTime - startTime; - distance = elapsedTime / 29 /2; - // The below protection is to ensure there is no value fluctuation - if (distance > 40 ) - distance = 40; - return distance; -} - -void rover::RoverSensors::setupInfraredSensors (void) -{ - /* Init the analog digital converter */ - mcp3004Setup (BASE, SPI_CHAN); // 3004 and 3008 are the same 4/8 channels -} - -float rover::RoverSensors::readInfraredSensor (int infrared_sensor_id) -{ - float x; - float y = analogRead (BASE+infrared_sensor_id); - - if (infrared_sensor_id != this->ROVER_FRONT_LEFT && - infrared_sensor_id != this->ROVER_FRONT_RIGHT && - infrared_sensor_id != this->ROVER_REAR_LEFT && - infrared_sensor_id != this->ROVER_REAR_RIGHT) - { - printf ("Invalid Sensor ID for the Infrared Sensor to function readInfraredSensor.\n"); - } - - // 1/cm to output voltage is almost linear between - // 80cm->0,4V->123 - // 6cm->3,1V->961 - // => y=5477*x+55 => x= (y-55)/5477 - if (y<123){ - x=100.00; - } else { - float inverse = (y-55)/5477; - //printf("inverse=%f\n",inverse); - // x is the distance in cm - x = 1/inverse; - } - - return x; -} - -void rover::RoverSensors::calibrateBearingSensor (void) -{ - this->calibration_start = millis(); -} - -void rover::RoverSensors::setupBearingQMC5883L(void) -{ - this->setHMC588LAddress(0x0D); - this->setHMC588LCalibrationPeriod(10000); - this->setHMC588LDeclinationAngle(0.0413); - - if ((i2c_hmc588l_fd = wiringPiI2CSetup(this->HMC588L_ADDRESS)) < 0) - { - printf("Failed to initialize HMC588L compass sensor"); - } - - if (i2c_hmc588l_fd >= 0) - { - wiringPiI2CWriteReg8 (i2c_hmc588l_fd, 0x0B, 0x01); //init SET/PERIOD register - - /* - Define - OSR = 512 - Full Scale Range = 8G(Gauss) - ODR = 200HZ - set continuous measurement mode - */ - wiringPiI2CWriteReg8 (i2c_hmc588l_fd, 0x09, 0x1D); - } - - this->calibration_start = millis(); - - // - // To do a software reset - // wiringPiI2CWriteReg8 (i2c_hmc588l_fd, 0x0A, 0x80); - // - -} - -float rover::RoverSensors::readBearingQMC5883L(void) -{ - int8_t buffer[6]; - - //wiringPiI2CWrite (i2c_hmc588l_fd, 0x00); //Start with register 3 - //delay(25); - - buffer[0] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x00); //LSB x - buffer[1] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x01); //MSB x - buffer[2] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x02); //LSB y - buffer[3] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x03); //MSB y - buffer[4] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x04); //LSB z - buffer[5] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x05); //MSB z - - int16_t xRaw = (((int16_t) buffer[1] << 8) & 0xff00) | buffer[0]; - int16_t yRaw = (((int16_t) buffer[3] << 8) & 0xff00) | buffer[2]; -#ifdef DEBUG - printf ("%d %d\n",xRaw,yRaw); -#endif - - //if calibration is active calculate minimum and maximum x/y values for calibration - if (millis() <= this->calibration_start + this->CALIBRATION_DURATION) { - if (xRaw < xMinRaw) { - xMinRaw = xRaw; - } - if (xRaw > xMaxRaw) { - xMaxRaw = xRaw; - } - if (yRaw < yMinRaw) { - yMinRaw = yRaw; - } - if (yRaw > yMaxRaw) { - yMaxRaw = yRaw; - } - } - - //calibration: move and scale x coordinates based on minimum and maximum values to get a unit circle - float xf = xRaw - (float) (xMinRaw + xMaxRaw) / 2.0f; - xf = xf / (xMinRaw + xMaxRaw) * 2.0f; - - //calibration: move and scale y coordinates based on minimum and maximum values to get a unit circle - float yf = yRaw - (float) (yMinRaw + yMaxRaw) / 2.0f; - yf = yf / (yMinRaw + yMaxRaw) * 2.0f; - - float bearing = atan2(yf, xf); -#ifdef DEBUG - printf("%f, bearing\n", bearing); -#endif - - //location specific magnetic field correction - bearing += this->DECLINATION_ANGLE; - - if (bearing < 0) { - bearing += 2 * M_PI; - } - - if (bearing > 2 * M_PI) { - bearing -= 2 * M_PI; - } - - float headingDegrees = bearing * (180.0 / M_PI); -#ifdef DEBUG - printf("%lf, headingDegrees\n", headingDegrees); -#endif - return headingDegrees; - - -} - -void rover::RoverSensors::setupBearingHMC5883L(void) -{ - this->setHMC588LAddress(0x1E); - this->setHMC588LCalibrationPeriod(10000); - this->setHMC588LDeclinationAngle(0.0413); - -#ifdef DEBUG - printf ("HMC588L Address is: %x\n", this->HMC588L_ADDRESS); - printf ("HMC588L Calibration period is %d\n", this->CALIBRATION_DURATION); - printf ("HMC588L Declination angle is %f\n", this->DECLINATION_ANGLE); -#endif - - if ((i2c_hmc588l_fd = wiringPiI2CSetup(this->HMC588L_ADDRESS)) < 0) { - printf("Failed to initialize HMC588L compass sensor"); - } - - if (i2c_hmc588l_fd >= 0) { - int8_t gain = 5; - - wiringPiI2CWriteReg8(i2c_hmc588l_fd, 0x00, 0x70); // 8-average, 15 Hz default, positive self test measurement - wiringPiI2CWriteReg8(i2c_hmc588l_fd, 0x01, gain << 5); // Gain - wiringPiI2CWriteReg8(i2c_hmc588l_fd, 0x02, 0x00); // Continuous-measurement mode - } - - this->calibration_start = millis(); -} - -float rover::RoverSensors::readBearingHMC5883L(void) -{ - int8_t buffer[6]; - - //potential optimization: wiringPiI2CReadReg16 - buffer[0] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x03); //MSB x - buffer[1] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x04); //LSB x - buffer[2] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x05); //MSB z - buffer[3] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x06); //LSB z - buffer[4] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x07); //MSB y - buffer[5] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x08); //LSB y - - int16_t xRaw = (((int16_t) buffer[0] << 8) & 0xff00) | buffer[1]; - //int16_t zRaw = (((int16_t) buffer[2] << 8) & 0xff00) | buffer[3]; - int16_t yRaw = (((int16_t) buffer[4] << 8) & 0xff00) | buffer[5]; - - //if calibration is active calculate minimum and maximum x/y values for calibration - if (millis() <= this->calibration_start + this->CALIBRATION_DURATION) { - if (xRaw < xMinRaw) { - xMinRaw = xRaw; - } - if (xRaw > xMaxRaw) { - xMaxRaw = xRaw; - } - if (yRaw < yMinRaw) { - yMinRaw = yRaw; - } - if (yRaw > yMaxRaw) { - yMaxRaw = yRaw; - } - } - - //calibration: move and scale x coordinates based on minimum and maximum values to get a unit circle - float xf = xRaw - (float) (xMinRaw + xMaxRaw) / 2.0f; - xf = xf / (xMinRaw + xMaxRaw) * 2.0f; - - //calibration: move and scale y coordinates based on minimum and maximum values to get a unit circle - float yf = yRaw - (float) (yMinRaw + yMaxRaw) / 2.0f; - yf = yf / (yMinRaw + yMaxRaw) * 2.0f; - - float bearing = atan2(yf, xf); -#ifdef DEBUG - printf("%f, bearing\n", bearing); -#endif - - //location specific magnetic field correction - bearing += this->DECLINATION_ANGLE; - - if (bearing < 0) { - bearing += 2 * M_PI; - } - - if (bearing > 2 * M_PI) { - bearing -= 2 * M_PI; - } - - float headingDegrees = bearing * (180.0 / M_PI); -#ifdef DEBUG - printf("%lf, headingDegrees\n", headingDegrees); -#endif - return headingDegrees; -} - -float rover::RoverSensors::readTemperature (void) -{ - int data[5] = { 0, 0, 0, 0, 0 }; - - uint8_t laststate; - uint8_t counter; - uint8_t j; - uint8_t i; - - int try_again = 1; - float f, h, c; - - while (try_again == 1) - { - data[0] = data[1] = data[2] = data[3] = data[4] = 0; - laststate = HIGH; - counter = 0; - j = 0; - - /* pull pin down for 18 milliseconds */ - pinMode( this->DHT22_RPI_PIN, OUTPUT ); - digitalWrite( this->DHT22_RPI_PIN, LOW ); - delay( 18 ); - - /* prepare to read the pin */ - pinMode( this->DHT22_RPI_PIN, INPUT ); - - /* detect change and read data */ - for ( i = 0; i < this->MAX_TIMINGS; i++ ) - { - counter = 0; - while ( digitalRead( this->DHT22_RPI_PIN ) == laststate ) - { - counter++; - delayMicroseconds( 1 ); - if ( counter == 255 ) - { - break; - } - } - laststate = digitalRead( this->DHT22_RPI_PIN ); - - if ( counter == 255 ) - break; - - /* ignore first 3 transitions */ - if ( (i >= 4) && (i % 2 == 0) ) - { - /* shove each bit into the storage bytes */ - data[j / 8] <<= 1; - if ( counter > 16 ) - data[j / 8] |= 1; - j++; - } - } - - /* - * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte - * print it out if data is good - */ - if ( (j >= 40) && - (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) ) - { - h = (float)((data[0] << 8) + data[1]) / 10; - if ( h > 100 ) - { - h = data[0]; // for DHT11 - } - c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10; - if ( c > 125 ) - { - c = data[2]; // for DHT11 - } - if ( data[2] & 0x80 ) - { - c = -c; - } - f = c * 1.8f + 32; -#ifdef DEBUG - printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f ); -#endif - try_again = 0; - } - else - { - /* Data not good */ - try_again = 1; - //printf ("Data not good, skipping\n"); - - } - } - - /* Return temperature */ - return c; -} - -float rover::RoverSensors::readHumidity (void) -{ - int data[5] = { 0, 0, 0, 0, 0 }; - - uint8_t laststate; - uint8_t counter; - uint8_t j; - uint8_t i; - - int try_again = 1; - float f, h, c; - - while (try_again == 1) - { - data[0] = data[1] = data[2] = data[3] = data[4] = 0; - laststate = HIGH; - counter = 0; - j = 0; - - /* pull pin down for 18 milliseconds */ - pinMode( this->DHT22_RPI_PIN, OUTPUT ); - digitalWrite( this->DHT22_RPI_PIN, LOW ); - delay( 18 ); - - /* prepare to read the pin */ - pinMode( this->DHT22_RPI_PIN, INPUT ); - - /* detect change and read data */ - for ( i = 0; i < this->MAX_TIMINGS; i++ ) - { - counter = 0; - while ( digitalRead( this->DHT22_RPI_PIN ) == laststate ) - { - counter++; - delayMicroseconds( 1 ); - if ( counter == 255 ) - { - break; - } - } - laststate = digitalRead( this->DHT22_RPI_PIN ); - - if ( counter == 255 ) - break; - - /* ignore first 3 transitions */ - if ( (i >= 4) && (i % 2 == 0) ) - { - /* shove each bit into the storage bytes */ - data[j / 8] <<= 1; - if ( counter > 16 ) - data[j / 8] |= 1; - j++; - } - } - - /* - * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte - * print it out if data is good - */ - if ( (j >= 40) && - (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) ) - { - h = (float)((data[0] << 8) + data[1]) / 10; - if ( h > 100 ) - { - h = data[0]; // for DHT11 - } - c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10; - if ( c > 125 ) - { - c = data[2]; // for DHT11 - } - if ( data[2] & 0x80 ) - { - c = -c; - } - f = c * 1.8f + 32; -#ifdef DEBUG - printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f ); -#endif - try_again = 0; - } - else - { - /* Data not good */ - try_again = 1; - //printf ("Data not good, skipping\n"); - } - } - - /* Return humidity */ - return h; -} - -void rover::RoverSensors::setHMC588LAddress (int address) -{ - this->HMC588L_ADDRESS = address; -} - -void rover::RoverSensors::setHMC588LDeclinationAngle (float angle) -{ - this->DECLINATION_ANGLE = angle; -} - -void rover::RoverSensors::setHMC588LCalibrationPeriod(int period) -{ - this->CALIBRATION_DURATION = period; -}