mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-04 06:51:35 +08:00
Merge branch 'main' into pr-dual-atmos
This commit is contained in:
@@ -40,6 +40,7 @@ CONFIG_DRIVERS_MAGNETOMETER_ST_IIS2MDC=y
|
|||||||
CONFIG_DRIVERS_POWER_MONITOR_INA226=y
|
CONFIG_DRIVERS_POWER_MONITOR_INA226=y
|
||||||
CONFIG_DRIVERS_POWER_MONITOR_INA228=y
|
CONFIG_DRIVERS_POWER_MONITOR_INA228=y
|
||||||
CONFIG_DRIVERS_POWER_MONITOR_INA238=y
|
CONFIG_DRIVERS_POWER_MONITOR_INA238=y
|
||||||
|
CONFIG_DRIVERS_PCA9685_PWM_OUT=y
|
||||||
CONFIG_DRIVERS_PWM_OUT=y
|
CONFIG_DRIVERS_PWM_OUT=y
|
||||||
CONFIG_DRIVERS_PX4IO=y
|
CONFIG_DRIVERS_PX4IO=y
|
||||||
CONFIG_COMMON_RC=y
|
CONFIG_COMMON_RC=y
|
||||||
|
|||||||
@@ -97,5 +97,11 @@ bmm150 -I start
|
|||||||
# Internal Baro on I2C
|
# Internal Baro on I2C
|
||||||
bmp388 -I start
|
bmp388 -I start
|
||||||
|
|
||||||
|
# Start an external PWM generator
|
||||||
|
if param greater PCA9685_EN_BUS 0
|
||||||
|
then
|
||||||
|
pca9685_pwm_out start
|
||||||
|
fi
|
||||||
|
|
||||||
unset HAVE_PM2
|
unset HAVE_PM2
|
||||||
unset HAVE_PM3
|
unset HAVE_PM3
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ CONFIG_DRIVERS_IMU_MURATA_SCH16T=y
|
|||||||
CONFIG_COMMON_LIGHT=y
|
CONFIG_COMMON_LIGHT=y
|
||||||
CONFIG_COMMON_MAGNETOMETER=y
|
CONFIG_COMMON_MAGNETOMETER=y
|
||||||
CONFIG_DRIVERS_OSD_MSP_OSD=y
|
CONFIG_DRIVERS_OSD_MSP_OSD=y
|
||||||
|
CONFIG_DRIVERS_PCA9685_PWM_OUT=y
|
||||||
CONFIG_DRIVERS_PWM_OUT=y
|
CONFIG_DRIVERS_PWM_OUT=y
|
||||||
CONFIG_COMMON_RC=y
|
CONFIG_COMMON_RC=y
|
||||||
CONFIG_DRIVERS_UAVCAN=y
|
CONFIG_DRIVERS_UAVCAN=y
|
||||||
|
|||||||
@@ -16,3 +16,9 @@ iis2mdc -R 0 -I -b 4 start
|
|||||||
|
|
||||||
# Internal Baro on I2C
|
# Internal Baro on I2C
|
||||||
bmp388 -I -b 2 start
|
bmp388 -I -b 2 start
|
||||||
|
|
||||||
|
# Start an external PWM generator
|
||||||
|
if param greater PCA9685_EN_BUS 0
|
||||||
|
then
|
||||||
|
pca9685_pwm_out start
|
||||||
|
fi
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ CONFIG_COMMON_LIGHT=y
|
|||||||
CONFIG_DRIVERS_MAGNETOMETER_MEMSIC_MMC5983MA=y
|
CONFIG_DRIVERS_MAGNETOMETER_MEMSIC_MMC5983MA=y
|
||||||
CONFIG_DRIVERS_MAGNETOMETER_ST_IIS2MDC=y
|
CONFIG_DRIVERS_MAGNETOMETER_ST_IIS2MDC=y
|
||||||
CONFIG_DRIVERS_OPTICAL_FLOW_PAW3902=y
|
CONFIG_DRIVERS_OPTICAL_FLOW_PAW3902=y
|
||||||
|
CONFIG_DRIVERS_PCA9685_PWM_OUT=y
|
||||||
CONFIG_DRIVERS_POWER_MONITOR_INA226=y
|
CONFIG_DRIVERS_POWER_MONITOR_INA226=y
|
||||||
CONFIG_DRIVERS_PWM_OUT=y
|
CONFIG_DRIVERS_PWM_OUT=y
|
||||||
CONFIG_COMMON_RC=y
|
CONFIG_COMMON_RC=y
|
||||||
|
|||||||
@@ -34,3 +34,9 @@ paw3902 -s -b 3 start -Y 90
|
|||||||
|
|
||||||
# Internal distance sensor
|
# Internal distance sensor
|
||||||
afbrs50 start
|
afbrs50 start
|
||||||
|
|
||||||
|
# Start an external PWM generator
|
||||||
|
if param greater PCA9685_EN_BUS 0
|
||||||
|
then
|
||||||
|
pca9685_pwm_out start
|
||||||
|
fi
|
||||||
|
|||||||
@@ -74,5 +74,5 @@ ist8310 -X -b 1 -R 10 start
|
|||||||
# Start an external PWM generator
|
# Start an external PWM generator
|
||||||
if param greater PCA9685_EN_BUS 0
|
if param greater PCA9685_EN_BUS 0
|
||||||
then
|
then
|
||||||
pca9685_pwm_out start -b 1
|
pca9685_pwm_out start
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -11,3 +11,7 @@ param set BAT1_V_DIV 5.7
|
|||||||
|
|
||||||
# Always keep current config
|
# Always keep current config
|
||||||
param set SYS_AUTOCONFIG 0
|
param set SYS_AUTOCONFIG 0
|
||||||
|
|
||||||
|
# PCA9685 PWM Out defaults
|
||||||
|
param set-default PCA9685_EN_BUS 4
|
||||||
|
param set-default PCA9685_I2C_ADDR 64
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ then
|
|||||||
echo "ads1115 not found."
|
echo "ads1115 not found."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! pca9685_pwm_out start -a 0x40 -b 4
|
if ! pca9685_pwm_out start
|
||||||
then
|
then
|
||||||
echo "pca9685_pwm_out not found."
|
echo "pca9685_pwm_out not found."
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -486,6 +486,16 @@ The integer refers to the I2C bus number where PCA9685 is connected.
|
|||||||
| ------ | -------- | -------- | --------- | ------- | ---- |
|
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||||
| | 0 | 10 | | 0 |
|
| | 0 | 10 | | 0 |
|
||||||
|
|
||||||
|
### PCA9685_I2C_ADDR (`INT32`) {#PCA9685_I2C_ADDR}
|
||||||
|
|
||||||
|
I2C address of PCA9685.
|
||||||
|
|
||||||
|
The default address is 0x40 (64).
|
||||||
|
|
||||||
|
| Reboot | minValue | maxValue | increment | default | unit |
|
||||||
|
| ------ | -------- | -------- | --------- | ------- | ---- |
|
||||||
|
| | 0 | 127 | | 64 |
|
||||||
|
|
||||||
### PCA9685_FAIL1 (`INT32`) {#PCA9685_FAIL1}
|
### PCA9685_FAIL1 (`INT32`) {#PCA9685_FAIL1}
|
||||||
|
|
||||||
PCA9685 Output Channel 1 Failsafe Value.
|
PCA9685 Output Channel 1 Failsafe Value.
|
||||||
|
|||||||
@@ -899,6 +899,8 @@ fetching the latest mixing result and write them to PCA9685 at its scheduling ti
|
|||||||
It can do full 12bits output as duty-cycle mode, while also able to output precious pulse width
|
It can do full 12bits output as duty-cycle mode, while also able to output precious pulse width
|
||||||
that can be accepted by most ESCs and servos.
|
that can be accepted by most ESCs and servos.
|
||||||
|
|
||||||
|
The I2C bus and address can be configured via parameters `PCA9685_EN_BUS` and `PCA9685_I2C_ADDR`, or via command line arguments.
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
It is typically started with:
|
It is typically started with:
|
||||||
|
|||||||
@@ -74,6 +74,11 @@ ssize_t Serial::bytesAvailable()
|
|||||||
return _impl.bytesAvailable();
|
return _impl.bytesAvailable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t Serial::txSpaceAvailable()
|
||||||
|
{
|
||||||
|
return _impl.txSpaceAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t Serial::read(uint8_t *buffer, size_t buffer_size)
|
ssize_t Serial::read(uint8_t *buffer, size_t buffer_size)
|
||||||
{
|
{
|
||||||
return _impl.read(buffer, buffer_size);
|
return _impl.read(buffer, buffer_size);
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ public:
|
|||||||
bool close();
|
bool close();
|
||||||
|
|
||||||
ssize_t bytesAvailable();
|
ssize_t bytesAvailable();
|
||||||
|
ssize_t txSpaceAvailable();
|
||||||
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
||||||
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_ms = 0);
|
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_ms = 0);
|
||||||
|
|
||||||
|
|||||||
@@ -293,12 +293,36 @@ ssize_t SerialImpl::bytesAvailable()
|
|||||||
{
|
{
|
||||||
if (!_open) {
|
if (!_open) {
|
||||||
PX4_ERR("Device not open!");
|
PX4_ERR("Device not open!");
|
||||||
|
errno = EBADF;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t bytes_available = 0;
|
ssize_t bytes_available = 0;
|
||||||
int ret = ioctl(_serial_fd, FIONREAD, &bytes_available);
|
int ret = ioctl(_serial_fd, FIONREAD, &bytes_available);
|
||||||
return ret >= 0 ? bytes_available : 0;
|
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytes_available;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t SerialImpl::txSpaceAvailable()
|
||||||
|
{
|
||||||
|
if (!_open) {
|
||||||
|
PX4_ERR("Device not open!");
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t space_available = 0;
|
||||||
|
int ret = ioctl(_serial_fd, FIONSPACE, &space_available);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return space_available;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
|
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ public:
|
|||||||
bool close();
|
bool close();
|
||||||
|
|
||||||
ssize_t bytesAvailable();
|
ssize_t bytesAvailable();
|
||||||
|
ssize_t txSpaceAvailable();
|
||||||
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
||||||
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
|
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ public:
|
|||||||
bool close();
|
bool close();
|
||||||
|
|
||||||
ssize_t bytesAvailable();
|
ssize_t bytesAvailable();
|
||||||
|
ssize_t txSpaceAvailable();
|
||||||
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
||||||
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
|
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
|
||||||
|
|
||||||
|
|||||||
@@ -281,12 +281,31 @@ ssize_t SerialImpl::bytesAvailable()
|
|||||||
{
|
{
|
||||||
if (!_open) {
|
if (!_open) {
|
||||||
PX4_ERR("Device not open!");
|
PX4_ERR("Device not open!");
|
||||||
|
errno = EBADF;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t bytes_available = 0;
|
ssize_t bytes_available = 0;
|
||||||
int ret = ioctl(_serial_fd, FIONREAD, &bytes_available);
|
int ret = ioctl(_serial_fd, FIONREAD, &bytes_available);
|
||||||
return ret >= 0 ? bytes_available : 0;
|
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytes_available;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t SerialImpl::txSpaceAvailable()
|
||||||
|
{
|
||||||
|
if (!_open) {
|
||||||
|
PX4_ERR("Device not open!");
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// POSIX/Linux doesn't have a direct equivalent to NuttX's FIONSPACE
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
|
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ public:
|
|||||||
bool close();
|
bool close();
|
||||||
|
|
||||||
ssize_t bytesAvailable();
|
ssize_t bytesAvailable();
|
||||||
|
ssize_t txSpaceAvailable();
|
||||||
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
ssize_t read(uint8_t *buffer, size_t buffer_size);
|
||||||
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
|
ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0);
|
||||||
|
|
||||||
|
|||||||
@@ -156,14 +156,33 @@ ssize_t SerialImpl::bytesAvailable()
|
|||||||
{
|
{
|
||||||
if (!_open) {
|
if (!_open) {
|
||||||
PX4_ERR("Device not open!");
|
PX4_ERR("Device not open!");
|
||||||
|
errno = EBADF;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t rx_bytes = 0;
|
uint32_t rx_bytes = 0;
|
||||||
(void) fc_uart_rx_available(_serial_fd, &rx_bytes);
|
int ret = fc_uart_rx_available(_serial_fd, &rx_bytes);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return (ssize_t) rx_bytes;
|
return (ssize_t) rx_bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t SerialImpl::txSpaceAvailable()
|
||||||
|
{
|
||||||
|
if (!_open) {
|
||||||
|
PX4_ERR("Device not open!");
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// QURT doesn't have a direct equivalent to NuttX's FIONSPACE
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
|
ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size)
|
||||||
{
|
{
|
||||||
if (!_open) {
|
if (!_open) {
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
#include <drivers/drv_hrt.h>
|
#include <drivers/drv_hrt.h>
|
||||||
#include <px4_platform_common/getopt.h>
|
#include <px4_platform_common/getopt.h>
|
||||||
#include <px4_platform_common/sem.hpp>
|
#include <px4_platform_common/sem.hpp>
|
||||||
|
#include <lib/parameters/param.h>
|
||||||
|
|
||||||
#include "PCA9685.h"
|
#include "PCA9685.h"
|
||||||
|
|
||||||
@@ -356,8 +357,30 @@ int PCA9685Wrapper::custom_command(int argc, char **argv) {
|
|||||||
|
|
||||||
int PCA9685Wrapper::task_spawn(int argc, char **argv) {
|
int PCA9685Wrapper::task_spawn(int argc, char **argv) {
|
||||||
int ch;
|
int ch;
|
||||||
int address=PCA9685_DEFAULT_ADDRESS;
|
int address = PCA9685_DEFAULT_ADDRESS;
|
||||||
int iicbus=PCA9685_DEFAULT_IICBUS;
|
int iicbus = PCA9685_DEFAULT_IICBUS;
|
||||||
|
|
||||||
|
int32_t en_bus = 0;
|
||||||
|
param_t param_handle = param_find("PCA9685_EN_BUS");
|
||||||
|
|
||||||
|
if (param_handle != PARAM_INVALID) {
|
||||||
|
param_get(param_handle, &en_bus);
|
||||||
|
|
||||||
|
if (en_bus > 0) {
|
||||||
|
iicbus = en_bus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t i2c_addr = 0;
|
||||||
|
param_handle = param_find("PCA9685_I2C_ADDR");
|
||||||
|
|
||||||
|
if (param_handle != PARAM_INVALID) {
|
||||||
|
param_get(param_handle, &i2c_addr);
|
||||||
|
|
||||||
|
if (i2c_addr > 0) {
|
||||||
|
address = i2c_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int myoptind = 1;
|
int myoptind = 1;
|
||||||
const char *myoptarg = nullptr;
|
const char *myoptarg = nullptr;
|
||||||
|
|||||||
@@ -29,6 +29,16 @@ parameters:
|
|||||||
min: 0
|
min: 0
|
||||||
max: 10
|
max: 10
|
||||||
default: 0
|
default: 0
|
||||||
|
PCA9685_I2C_ADDR:
|
||||||
|
description:
|
||||||
|
short: I2C address of PCA9685
|
||||||
|
long: |
|
||||||
|
I2C address of PCA9685.
|
||||||
|
The default address is 0x40 (64).
|
||||||
|
type: int32
|
||||||
|
min: 1
|
||||||
|
max: 127
|
||||||
|
default: 64
|
||||||
PCA9685_SCHD_HZ:
|
PCA9685_SCHD_HZ:
|
||||||
description:
|
description:
|
||||||
short: PWM update rate
|
short: PWM update rate
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ EscBattery::Run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
average_voltage_v /= online_esc_count;
|
average_voltage_v /= online_esc_count;
|
||||||
total_current_a /= online_esc_count;
|
|
||||||
average_temperature_c /= online_esc_count;
|
average_temperature_c /= online_esc_count;
|
||||||
|
|
||||||
_battery.setConnected(true);
|
_battery.setConnected(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user