Paparazzi UAS  v5.12_stable-4-g9b43e9b
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sonar_bebop.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Freek van Tienen <freek.v.tienen@gmail.com>
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, write to
18  * the Free Software Foundation, 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22 
35 #include "sonar_bebop.h"
36 #include "generated/airframe.h"
37 #include "mcu_periph/adc.h"
38 #include "mcu_periph/spi.h"
39 #include "subsystems/abi.h"
40 #include <pthread.h>
42 
43 #include "filters/median_filter.h"
44 
46 
47 #ifdef SITL
48 #include "state.h"
49 #endif
50 
54 #define SONAR_BEBOP_INX_DIFF_TO_DIST 340./(2.*160000.)
55 
57 #define SONAR_BEBOP_ADC_MAX_VALUE 4095
58 
60 #define SONAR_BEBOP_ADC_BUFFER_SIZE 8192
61 
66 static uint8_t mode;
67 
69 #define SONAR_BEBOP_TRANSITION_HIGH_TO_LOW 0.8
70 
72 #define SONAR_BEBOP_TRANSITION_LOW_TO_HIGH 1.2
73 
75 #define SONAR_BEBOP_TRANSITION_COUNT 7
76 
78 
80 #define SONAR_BEBOP_PEAK_THRESHOLD 250
81 
86 static uint8_t sonar_bebop_spi_d[2][16] = {{ 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
87  { 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00 }};
88 
90 
92 void *sonar_bebop_read(void *data);
93 #ifdef USE_SONAR
94 static pthread_t sonar_bebop_thread;
95 #endif
96 
97 void sonar_bebop_init(void)
98 {
99  mode = 0; // default mode is low altitude
101 
102  sonar_bebop.meas = 0;
103  sonar_bebop.offset = 0;
104 
112 
113 #if USE_SONAR
114  pthread_create(&sonar_bebop_thread, NULL, sonar_bebop_read, NULL);
115 #endif
116 
118 }
119 
124 void *sonar_bebop_read(void *data __attribute__((unused)))
125 {
126  while (true) {
127 #ifndef SITL
128  uint16_t i;
129 
130  /* Start ADC and send sonar output */
131  adc_enable(&adc0, 1);
137  adc_enable(&adc0, 0);
138 
139  /* Find the peaks */
140  uint16_t start_send = 0;
141  uint16_t stop_send = 0;
142  uint16_t first_peak = 0;
143  uint16_t lowest_value = SONAR_BEBOP_ADC_MAX_VALUE;
144  uint16_t peak_value = 0;
145 
146  for (i = 0; i < SONAR_BEBOP_ADC_BUFFER_SIZE; i++) {
147  uint16_t adc_val = adc_buffer[i] >> 4;
148  if (start_send == 0 && adc_val == SONAR_BEBOP_ADC_MAX_VALUE) {
149  start_send = i;
150  } else if (start_send != 0 && stop_send == 0 && adc_val != SONAR_BEBOP_ADC_MAX_VALUE) {
151  stop_send = i - 1;
153  continue;
154  }
155 
156  if (start_send != 0 && stop_send != 0 && first_peak == 0 && adc_val < lowest_value) {
157  lowest_value = adc_val; // find trough from initial broadcast signal
158  } else if (start_send != 0 && stop_send != 0 && adc_val > lowest_value + 100 && adc_val > peak_value) {
159  first_peak = i;
160  peak_value = adc_val;
161  }
162  }
163 
164  /* Calculate the distance from the peeks */
165  uint16_t diff = stop_send - start_send;
166  float peak_distance;
167  if (diff > 250) {
168  peak_distance = 0;
169  } else {
170  peak_distance = first_peak - (stop_send - diff / 2);
171  }
172 
174 
175  // set sonar pulse mode for next pulse based on altitude
178  mode = 1;
180  }
183  mode = 0;
185  }
186  } else {
188  }
189 
190 #else // SITL
192  Bound(sonar_bebop.distance, 0.1f, 7.0f);
193  uint16_t peak_distance = 1;
194 #endif // SITL
195 
196  if (peak_distance > 0) {
197  // Send ABI message
198  AbiSendMsgAGL(AGL_SONAR_ADC_ID, sonar_bebop.distance);
199 #ifdef SENSOR_SYNC_SEND_SONAR
200  // Send Telemetry report
202 #endif
203  }
204  }
205  usleep(10000); //100Hz
206  return NULL;
207 }
void adc_enable(struct adc_t *adc, uint8_t value)
Start or stop the ADC readings.
Definition: adc_arch.c:101
unsigned short uint16_t
Definition: types.h:16
void * sonar_bebop_read(void *data)
sonar_bebop_read Read ADC value to update sonar measurement
Definition: sonar_bebop.c:124
int adc_read(struct adc_t *adc, uint16_t *buf, uint16_t size)
Read the ADC buffer from the driver.
Definition: adc_arch.c:113
uint16_t output_length
number of data words to write
Definition: spi.h:146
static struct spi_transaction sonar_bebop_spi_t
Definition: sonar_bebop.c:91
#define AGL_SONAR_ADC_ID
#define SONAR_BEBOP_ADC_BUFFER_SIZE
SONAR_BEBOP_ADC_BUFFER_SIZE ADC buffer size.
Definition: sonar_bebop.c:60
#define SONAR_BEBOP_PEAK_THRESHOLD
SONAR_BEBOP_PEAK_THRESHOLD minimum samples from broadcast stop.
Definition: sonar_bebop.c:80
Main include for ABI (AirBorneInterface).
Parrot Bebop Sonar driver.
static uint8_t sonar_bebop_spi_d[2][16]
sonar_bebop_spi_d the waveforms emitted by the sonar waveform 0 is long pulse used at high altitude w...
Definition: sonar_bebop.c:86
SPI transaction structure.
Definition: spi.h:142
#define SONAR_BEBOP_INX_DIFF_TO_DIST
SONAR_BEBOP_INX_DIFF_TO_DIST conversion from index difference to distance based on time of flight ADC...
Definition: sonar_bebop.c:54
bool spi_submit(struct spi_periph *p, struct spi_transaction *t)
Submit SPI transaction.
Definition: spi_arch.c:458
#define SONAR_BEBOP_TRANSITION_HIGH_TO_LOW
SONAR_BEBOP_TRANSITION_HIGH_TO_LOW below this altitude we should use mode 0.
Definition: sonar_bebop.c:69
static struct EnuCoor_f * stateGetPositionEnu_f(void)
Get position in local ENU coordinates (float).
Definition: state.h:719
volatile uint8_t * output_buf
pointer to transmit buffer for DMA
Definition: spi.h:144
enum SPISlaveSelect select
slave selection behavior
Definition: spi.h:148
arch independent ADC (Analog to Digital Converter) API
Architecture independent SPI (Serial Peripheral Interface) API.
Definition: spi.h:84
struct spi_periph spi0
Definition: spi.c:35
float distance
Distance measured in meters.
Definition: sonar_bebop.h:35
struct MedianFilterFloat sonar_filt
Definition: sonar_bebop.c:45
static void init_median_filter_f(struct MedianFilterFloat *filter, uint8_t size)
static uint8_t pulse_transition_counter
Definition: sonar_bebop.c:77
#define SONAR_BEBOP_TRANSITION_LOW_TO_HIGH
SONAR_BEBOP_TRANSITION_LOW_TO_HIGH above this altitude we should use mode 1.
Definition: sonar_bebop.c:72
static float update_median_filter_f(struct MedianFilterFloat *filter, float new_data)
#define SONAR_BEBOP_TRANSITION_COUNT
SONAR_BEBOP_TRANSITION_COUNT number of samples before switching mode.
Definition: sonar_bebop.c:75
uint16_t input_length
number of data words to read
Definition: spi.h:145
#define SONAR_BEBOP_ADC_MAX_VALUE
SONAR_BEBOP_ADC_MAX_VALUE maximum ADC output (12 bit ADC)
Definition: sonar_bebop.c:57
unsigned char uint8_t
Definition: types.h:14
API to get/set the generic vehicle states.
static uint8_t mode
mode holds the current sonar mode mode = 0 used at high altitude, uses 16 wave patterns mode = 1 used...
Definition: sonar_bebop.c:66
void sonar_bebop_init(void)
Definition: sonar_bebop.c:97
float z
in meters
slave is selected before transaction and unselected after
Definition: spi.h:57
enum SPIDataSizeSelect dss
data transfer word size
Definition: spi.h:151
volatile uint8_t * input_buf
pointer to receive buffer for DMA
Definition: spi.h:143
uint16_t offset
Sonar offset in ADC units.
Definition: sonar_bebop.h:34
uint16_t meas
Raw ADC value.
Definition: sonar_bebop.h:33
struct SonarBebop sonar_bebop
Definition: sonar_bebop.c:89
uint16_t adc_buffer[SONAR_BEBOP_ADC_BUFFER_SIZE]
Definition: sonar_bebop.c:120
enum SPITransactionStatus status
Definition: spi.h:156