mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-09 22:49:53 +08:00
srf08 telemeter, a good example for delay=""
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
<define name="ALT_KALMAN"/>
|
||||
<define name="WIND_INFO"/>
|
||||
<define name="WIND_INFO_RET"/>
|
||||
<define name="USE_I2C0"/>
|
||||
</target>
|
||||
|
||||
<subsystem name="radio_control" type="ppm"/>
|
||||
@@ -41,7 +42,7 @@
|
||||
<param name="GPS_BAUD" value="B38400"/>
|
||||
</subsystem>
|
||||
<subsystem name="navigation"/>
|
||||
<subsystem name="spi"/>
|
||||
<subsystem name="i2c"/>
|
||||
</firmware>
|
||||
|
||||
<firmware name="setup">
|
||||
@@ -54,8 +55,9 @@
|
||||
|
||||
<!-- modules -->
|
||||
<modules>
|
||||
<load name="baro_MS5534A.xml"/>
|
||||
<!--load name="baro_bmp.xml"/>
|
||||
<load name="alt_srf08.xml"/>
|
||||
<!--load name="baro_MS5534A.xml"/>
|
||||
<load name="baro_bmp.xml"/>
|
||||
<load name="baro_scp_i2c.xml"/>
|
||||
<load name="light_temt.xml"/>
|
||||
<load name="humid_hih.xml"/>
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE module SYSTEM "module.dtd">
|
||||
|
||||
<module name="alt_srf08" dir="sensors">
|
||||
<header>
|
||||
<file name="alt_srf08.h"/>
|
||||
</header>
|
||||
<init fun="srf08_init()"/>
|
||||
<periodic fun="srf08_initiate_ranging()" freq="1"/>
|
||||
<!-- 65ms since initiate_ranging() (the spec ask for 65ms),
|
||||
delay="4", 60Hz, 4x 16.7ms = 66.7ms -->
|
||||
<periodic fun="srf08_receive()" freq="1" delay="4"/>
|
||||
<event fun="srf08_event"/>
|
||||
<makefile>
|
||||
<file name="alt_srf08.c"/>
|
||||
<flag name="TELEMETER"/>
|
||||
</makefile>
|
||||
</module>
|
||||
@@ -75,10 +75,6 @@
|
||||
#include "airspeed.h"
|
||||
#endif
|
||||
|
||||
#ifdef TELEMETER
|
||||
#include "srf08.h"
|
||||
#endif
|
||||
|
||||
#if defined USE_I2C0 || USE_I2C1
|
||||
#include "i2c.h"
|
||||
#endif
|
||||
@@ -87,10 +83,6 @@
|
||||
#include "spi.h"
|
||||
#endif
|
||||
|
||||
#ifdef TELEMETER
|
||||
#include "srf08.h"
|
||||
#endif
|
||||
|
||||
#ifdef TRAFFIC_INFO
|
||||
#include "traffic_info.h"
|
||||
#endif
|
||||
@@ -446,15 +438,6 @@ void periodic_task_ap( void ) {
|
||||
kill_throttle |= launch && (dist2_to_home > Square(KILL_MODE_DISTANCE));
|
||||
}
|
||||
switch (_1Hz) {
|
||||
#ifdef TELEMETER
|
||||
case 1:
|
||||
srf08_initiate_ranging();
|
||||
break;
|
||||
case 5:
|
||||
/** 65ms since initiate_ranging() (the spec ask for 65ms) */
|
||||
srf08_receive();
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef TCAS
|
||||
case 6:
|
||||
@@ -612,9 +595,6 @@ void init_ap( void ) {
|
||||
#ifdef GPS
|
||||
gps_init();
|
||||
#endif
|
||||
#ifdef TELEMETER
|
||||
srf08_init();
|
||||
#endif
|
||||
#ifdef USE_UART0
|
||||
Uart0Init();
|
||||
#endif
|
||||
@@ -809,19 +789,6 @@ void event_task_ap( void ) {
|
||||
}
|
||||
#endif /** DATALINK */
|
||||
|
||||
#ifdef TELEMETER
|
||||
/** Handling of data sent by the device (initiated by srf08_receive() */
|
||||
if (srf08_received) {
|
||||
srf08_received = FALSE;
|
||||
srf08_read();
|
||||
}
|
||||
if (srf08_got) {
|
||||
srf08_got = FALSE;
|
||||
srf08_copy();
|
||||
DOWNLINK_SEND_RANGEFINDER(DefaultChannel, &srf08_range);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MCU_SPI_LINK
|
||||
if (spi_message_received) {
|
||||
/* Got a message on SPI. */
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2005 Pascal Brisset, Antoine Drouin
|
||||
* Copyright (C) 2002 Chris efstathiou hendrix@otenet.gr
|
||||
*
|
||||
* This file is part of paparazzi.
|
||||
*
|
||||
* paparazzi is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* paparazzi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with paparazzi; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
*/
|
||||
/** \file srf08.c
|
||||
* \brief Basic library for SRF08 telemeter
|
||||
*
|
||||
*/
|
||||
|
||||
#include "i2c.h"
|
||||
#include "alt_srf08.h"
|
||||
#include "uart.h"
|
||||
#include "messages.h"
|
||||
#include "downlink.h"
|
||||
#include "led.h"
|
||||
|
||||
#ifndef SRF08_I2C_DEV
|
||||
#define SRF08_I2C_DEV i2c0
|
||||
#endif
|
||||
|
||||
/* Global Variables */
|
||||
bool_t srf08_received, srf08_got;
|
||||
struct i2c_transaction srf_trans;
|
||||
uint16_t srf08_range;
|
||||
|
||||
|
||||
/*###########################################################################*/
|
||||
|
||||
void srf08_init(void)
|
||||
{
|
||||
srf08_received = FALSE;
|
||||
srf08_got = FALSE;
|
||||
|
||||
srf_trans.buf[0] = 0x00;
|
||||
srf_trans.buf[1] = 0x51;
|
||||
I2CTransmit(SRF08_I2C_DEV, srf_trans, SRF08_UNIT_0, 2);
|
||||
|
||||
/** Setting the gain to the minimun value (to avoid echos ?) */
|
||||
srf_trans.buf[0] = SRF08_SET_GAIN;
|
||||
srf_trans.buf[1] = SRF08_MIN_GAIN;
|
||||
I2CTransmit(SRF08_I2C_DEV, srf_trans, SRF08_UNIT_0, 2);
|
||||
|
||||
return;
|
||||
}
|
||||
/*###########################################################################*/
|
||||
|
||||
void srf08_initiate_ranging(void) {
|
||||
LED_ON(2);
|
||||
srf_trans.buf[0] = SRF08_COMMAND;
|
||||
srf_trans.buf[1] = SRF08_CENTIMETERS;
|
||||
I2CTransmit(SRF08_I2C_DEV, srf_trans, SRF08_UNIT_0, 2);
|
||||
}
|
||||
|
||||
/** Ask the value to the device */
|
||||
void srf08_receive(void) {
|
||||
LED_OFF(2);
|
||||
srf_trans.buf[0] = SRF08_ECHO_1;
|
||||
srf08_received = TRUE;
|
||||
I2CTransmit(SRF08_I2C_DEV, srf_trans, SRF08_UNIT_0, 1);
|
||||
}
|
||||
|
||||
/** Read values on the bus */
|
||||
void srf08_read(void) {
|
||||
srf08_got = TRUE;
|
||||
I2CReceive(SRF08_I2C_DEV, srf_trans, SRF08_UNIT_0, 2);
|
||||
}
|
||||
|
||||
/** Copy the I2C buffer */
|
||||
void srf08_copy(void) {
|
||||
srf08_range = srf_trans.buf[0] << 8 | srf_trans.buf[1];
|
||||
}
|
||||
|
||||
void srf08_ping()
|
||||
{
|
||||
srf08_initiate_ranging();
|
||||
while (srf_trans.status != I2CTransSuccess); /* blocking */
|
||||
|
||||
srf08_receive();
|
||||
}
|
||||
/*###########################################################################*/
|
||||
|
||||
uint32_t srf08_read_register(uint8_t srf08_register)
|
||||
{
|
||||
uint8_t cnt;
|
||||
|
||||
union i2c_union {
|
||||
uint32_t rx_word;
|
||||
uint8_t rx_byte[2];
|
||||
} i2c;
|
||||
|
||||
|
||||
srf_trans.buf[0] = srf08_register;
|
||||
|
||||
/* get high byte msb first */
|
||||
if (srf08_register>=2)
|
||||
cnt = 2;
|
||||
else
|
||||
cnt = 1;
|
||||
|
||||
I2CTransceive(SRF08_I2C_DEV, srf_trans, SRF08_UNIT_0, 1, cnt);
|
||||
|
||||
/* get high byte msb first */
|
||||
if(srf08_register>=2) {
|
||||
i2c.rx_byte[1]=srf_trans.buf[1];
|
||||
}
|
||||
|
||||
/* get low byte msb first */
|
||||
i2c.rx_byte[0]=srf_trans.buf[0];
|
||||
|
||||
return(i2c.rx_word);
|
||||
}
|
||||
|
||||
void srf08_event(void)
|
||||
{
|
||||
float f=0;
|
||||
uint8_t i=0;
|
||||
|
||||
/** Handling of data sent by the device (initiated by srf08_receive() */
|
||||
if (srf_trans.status == I2CTransSuccess) {
|
||||
if (srf08_received) {
|
||||
srf08_received = FALSE;
|
||||
srf08_read();
|
||||
}
|
||||
else if (srf08_got) {
|
||||
srf08_got = FALSE;
|
||||
srf08_copy();
|
||||
DOWNLINK_SEND_RANGEFINDER(DefaultChannel, &srf08_range, &f, &f, &f, &f, &f, &i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2005 Pascal Brisset, Antoine Drouin
|
||||
* Copyright (C) 2002 Chris efstathiou hendrix@otenet.gr
|
||||
*
|
||||
* This file is part of paparazzi.
|
||||
*
|
||||
* paparazzi is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* paparazzi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with paparazzi; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
*/
|
||||
/** \file srf08.h
|
||||
* \brief Basic library for SRF08 telemeter
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SRF08_H
|
||||
#define SRF08_H 1
|
||||
|
||||
/*###########################################################################*/
|
||||
/* START OF CONFIGURATION BLOCK */
|
||||
/*###########################################################################*/
|
||||
/* Normally you shouldn't need to change anything */
|
||||
|
||||
#define SRF08_UNIT_0 0xE0 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_1 0xE2 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_2 0xE4 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_3 0xE6 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_4 0xE8 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_5 0xEA /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_6 0xEC /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_7 0xEE /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_8 0xF0 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_9 0xF2 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_10 0xF4 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_11 0xF6 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_12 0xF8 /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_13 0xFA /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_14 0xFC /* the SRF08 MODULE I2C address */
|
||||
#define SRF08_UNIT_15 0xFE /* the SRF08 MODULE I2C address */
|
||||
|
||||
/*###########################################################################*/
|
||||
/* END OF CONFIGURATION BLOCK */
|
||||
/*###########################################################################*/
|
||||
|
||||
#define SRF08_I2C_BROADCAST_ADDRESS 0X00
|
||||
|
||||
#define SRF08_MIN_GAIN 0 /* sets gain to 94 */
|
||||
#define SRF08_MAX_GAIN 31 /* sets gain to 1025 */
|
||||
#define SRF08_MIN_RANGE 0 /* in millimeters */
|
||||
#define SRF08_MAX_RANGE 11008 /* in millimeters */
|
||||
|
||||
#define SRF08_INCHES 0X50
|
||||
#define SRF08_CENTIMETERS 0X51
|
||||
#define SRF08_MICROSECONDS 0X52
|
||||
|
||||
/* register positions */
|
||||
#define SRF08_COMMAND 0
|
||||
#define SRF08_SET_GAIN 1
|
||||
#define SRF08_LIGHT 1
|
||||
#define SRF08_ECHO_1 2
|
||||
#define SRF08_ECHO_2 4
|
||||
#define SRF08_ECHO_3 6
|
||||
#define SRF08_ECHO_4 8
|
||||
#define SRF08_ECHO_5 10
|
||||
#define SRF08_ECHO_6 12
|
||||
#define SRF08_ECHO_7 14
|
||||
#define SRF08_ECHO_8 16
|
||||
#define SRF08_ECHO_9 18
|
||||
#define SRF08_ECHO_10 20
|
||||
#define SRF08_ECHO_11 22
|
||||
#define SRF08_ECHO_12 24
|
||||
#define SRF08_ECHO_13 26
|
||||
#define SRF08_ECHO_14 28
|
||||
#define SRF08_ECHO_15 30
|
||||
#define SRF08_ECHO_16 32
|
||||
#define SRF08_ECHO_17 34
|
||||
|
||||
/* Function Declaration */
|
||||
|
||||
extern void srf08_select_unit(uint8_t srf08_address);
|
||||
extern void srf08_init(void);
|
||||
|
||||
extern void srf08_set_gain(uint8_t gain);
|
||||
extern void srf08_set_range(uint32_t millimeters);
|
||||
|
||||
extern void srf08_ping(void);
|
||||
extern uint32_t srf08_read_register(uint8_t srf08_register);
|
||||
|
||||
extern void srf08_change_i2c_address(uint8_t new_i2c_address);
|
||||
|
||||
extern void srf08_initiate_ranging(void);
|
||||
extern void srf08_receive(void);
|
||||
|
||||
extern uint16_t srf08_range;
|
||||
extern bool_t srf08_received, srf08_got;
|
||||
/** Read values on the bus */
|
||||
extern void srf08_read(void);
|
||||
/** Copy the I2C buffer */
|
||||
extern void srf08_copy(void);
|
||||
|
||||
extern void srf08_event(void);
|
||||
|
||||
#endif /* #ifndef SRF08_H */
|
||||
|
||||
Reference in New Issue
Block a user