Платы CopterControl, CC3D, LibrePilot, Revolution от OpenPilot

pnm

Помогите с кодом. Собрал прошивку на линуксе.
Теперь хочу добавить в нее термокомпенсацию.

--- a/flight/Modules/Attitude/attitude.c
+++ b/flight/Modules/Attitude/attitude.c
@@ -215,11 +215,18 @@ static void updateSensors(AttitudeRawData * attitudeRaw)
                return;
        }

+       // use temp sensor
+       float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
+       // write a value to monitor in the GSC
+       attitudeRaw->magnetometers[0] = compensation * 100;

        // First sample is temperature
-       attitudeRaw->gyros[ATTITUDERAW_GYROS_X] = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
-       attitudeRaw->gyros[ATTITUDERAW_GYROS_Y] = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
-       attitudeRaw->gyros[ATTITUDERAW_GYROS_Z] = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;
+       float tc1 = 1.0;
+       float tc2 = 0.5;
+       float tc3 = 1.0;
+       attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
+       attitudeRaw->gyros[1] =  (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
+       attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;

        int32_t x = 0;
        int32_t y = 0;

Но мой синтаксис отличается от Dmitry(HikeR)

Вот мой, я закоментил гиры и добавил термокопенсацию ручками. Ссори я ламер в программировании.

/**
 * Get an update from the sensors
 * @param[in] attitudeRaw Populate the UAVO instead of saving right here
 * @return 0 if successfull, -1 if not
 */
static int32_t updateSensors(AccelsData * accels, GyrosData * gyros)
{
    struct pios_adxl345_data accel_data;
    float gyro[4];

    // Only wait the time for two nominal updates before setting an alarm
    if(xQueueReceive(gyro_queue, (void * const) gyro, UPDATE_RATE * 2) == errQUEUE_EMPTY) {
        AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE, SYSTEMALARMS_ALARM_ERROR);
        return -1;
    }

    // Do not read raw sensor data in simulation mode
    if (GyrosReadOnly() || AccelsReadOnly())
        return 0;

    // No accel data available
    if(PIOS_ADXL345_FifoElements() == 0)
        return -1;

    // First sample is temperature
    //gyros->x = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
    //gyros->y = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
    //gyros->z = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;

    static void updateSensors(AttitudeRawData * attitudeRaw)
                return;
        }

        // use temp sensor
        float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
        // write a value to monitor in the GSC
        attitudeRaw->magnetometers[0] = compensation * 100;

        // First sample is temperature
        float tc1 = 1.0;
        float tc2 = 0.5;
        float tc3 = 1.0;
        attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
        attitudeRaw->gyros[1] =  (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
        attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;



    int32_t x = 0;
    int32_t y = 0;
    int32_t z = 0;
    uint8_t i = 0;
    uint8_t samples_remaining;

Теперь прошивка не собирается.

slides

А где скачать оригинал прошивки (закомпиленый вариант термокомпенсации)? Точнее ткните в пост/ссылку, плиз 😃.

pnm
slides:

А где скачать оригинал прошивки (закомпиленый вариант термокомпенсации)? Точнее ткните в пост/ссылку, плиз 😃.

rcopen.com/forum/f123/topic238442/978

HikeR
pnm:

Теперь прошивка не собирается.

в файле патча знак “минус” в начале строки означает удаленную строчку, знак “плюс” — добавленную. у вас же какой-то ужас получился, это раз.
в текущей прошивке значения акселя, гироскопа и магнетометра из одного объекта attitudeRaw разнесли по трем отдельным, это два. причем магнетометр в CopterControl-е теперь вобще не используется (экономия памяти), поэтому оперативно следить за значением компенсации сходу не получится.

просто “на посмотреть” можно сделать так:
вместо этого кусочка

	// First sample is temperature
	gyros->x = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
	gyros->y = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
	gyros->z = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;

вставить такой


	// First sample is temperature
	float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
	float tc1 = 1.0;
	float tc2 = 0.5;
	float tc3 = 1.0;
	attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
	attitudeRaw->gyros[1] =  (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
	attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;

и ничего больше не менять (кроме подбора коэффициентов tc(1,2,3) и пересборки/перезаливки).

pnm

Спасибо Дмитрий, попробую сегодня.

pnm

Не получаеться
стандартный конфиг, вывод

root@debian:/home/pnm/1/OpenPilot# make coptercontrolmake[1]: Nothing to be done for `first'.
- OpenPilot UAVObject Generator -
Done: processed 59 XML files and generated 59 objects with no ID collisions. Total size of the data fields is 2016 bytes.
generating flight code
 FWINFO     build/fw_coptercontrol/fw_coptercontrol.bin.firmwareinfo.c
root@debian:/home/pnm/1/OpenPilot#

Изменил,

        // First sample is temperature
//      gyros->x = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
//      gyros->y = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
//      gyros->z = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;
        float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
        float tc1 = 1.0;
        float tc2 = 0.5;
        float tc3 = 1.0;
        attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
        attitudeRaw->gyros[1] =  (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
        attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;

        int32_t x = 0;
        int32_t y = 0;

вывод

root@debian:/home/pnm/1/OpenPilot# make coptercontrolmake[1]: Nothing to be done for `first'.
- OpenPilot UAVObject Generator -
Done: processed 59 XML files and generated 59 objects with no ID collisions. Total size of the data fields is 2016 bytes.
generating flight code
 CC         flight/Modules/Attitude/attitude.c
../Modules/Attitude/attitude.c: In function 'updateSensors':
../Modules/Attitude/attitude.c:291:2: error: 'attitudeRaw' undeclared (first use in this function)
../Modules/Attitude/attitude.c:291:2: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [/home/pnm/1/OpenPilot/build/fw_coptercontrol/attitude.o] Error 1
make: *** [fw_coptercontrol_opfw] Error 2
root@debian:/home/pnm/1/OpenPilot#

Вот так прокатило

gyros->x = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
gyros->y = (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
gyros->z = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;

pnm

Короче залил я прошивку))) Снес bootloader, rescue не видит плату. Без JTAG не восстановить bootloader?

Gapey

можно восстановить через компорт …
нужен или аппаратный порт с переходником ±12=>3.3 вольта или USB=>COM желательно на FT232 или CP210х … на всяких PL23хх ака шнурки от моболок успех негарантирован …
wiki.openpilot.org/…/Firmware+Recovery+on+Windows

pnm
Gapey:

можно восстановить через компорт …
нужен или аппаратный порт с переходником ±12=>3.3 вольта или USB=>COM желательно на FT232 или CP210х … на всяких PL23хх ака шнурки от моболок успех негарантирован …
wiki.openpilot.org/…/Firmware+Recovery+on+Windows

Есть PL23, попробую на выходных.

HikeR
pnm:

error: ‘attitudeRaw’ undeclared

мой косяк, сам ведь и писал что этого объекта больше нет.

pnm:

Снес bootloader

зачем???

pnm
HikeR:

зачем???

После загрузки прошивки, плата не загрузилась.

HikeR

при загрузке даже кривой-косой прошивки бутлоадер невозможно испортить (если только в прошивка специально не делает чего-то подобного). попробуйте в Rescue режим входить сразу после перезапуска GCS подключая плату только после запроса.

21 days later
SergDoc

Подглядел код revo
bma180
imu3000
hmc5883
bmp085 😦

Bluebird
SergDoc:

Подглядел код revo
bma180
imu3000
hmc5883
bmp085

А можно перевод для тупых 😉)) Можно субтитрами 😉

SergDoc

аксель BMA180
Гиры imu3000
магнитометр hmc5883
баро bmp 085
как то так…
по ходу всё по i2c, почему барометр такой? х.з. наверно от платок к CC остались?

Covax

На CC с роду не было барометра…

Bluebird

Серег, у некоторых был… Даже работало. И сонар был…

Covax
Covax:

На CC

имеется ввиду прям на плате? Ну ладно заливать то 😃 Отдельно ставили умельцы.

Bluebird

Конечно вне платы)))))) два порта стоит - что хочешь то и подключай… только еще же и код надо дописать…

SergDoc

CopterControl Mag & Prescure платка внешняя называлась, так в продажу и не попала из за проблем с i2c единственное что делали - высоту показывала, ну и сонар подключался, был программный модуль Altitude сейчас даже в ветке next его уже нет 😦

9 days later
pnm
HikeR:

при загрузке даже кривой-косой прошивки бутлоадер невозможно испортить (если только в прошивка специально не делает чего-то подобного). попробуйте в Rescue режим входить сразу после перезапуска GCS подключая плату только после запроса.

Все верно, откатился на последную, но пока не отсоедил провода, прошивка не заливалась.