Activity
Собрал на ATTiny13A небольшой RC-switch с программируемым значением включения.
Реализовал такую задумку:
Отдельный канал на управление наклоном курсовой камеры, но в крайнем положении камеры передатчик отключается - одним каналом управляю наклоном камеры и включением передатчика. На пульте смиксовал крутилку и тумблер.
Схему и прошивку не скрываю, но так как само устройство осталось на потерянном коптере, прошивка (довольно кривая) - на другом компе, добавлю все это по вашей просьбе. Схема - тинька, полевик и пара резаков.
Логика - при замыкании на землю сигнального вывода определяется положение стика (или крутилки) - в верхней половине или нижней для определения отключения передатчика в конце хода стика [пусть будет 97%], после записи значения в еепром передатчик включится на секунду, потом отключится на секунду.
Так же добавлен гистерезис - если записано положение 97%, то отключаться будет при 96-97 процентах (нестабильность внутреннего генератора), а включаться - скажем, при 94%.
Код - микс асма с вставками скомпилированного С (AVR Studio), потому что писал первый раз и нарушил все правила хорошего кодинга. Правда, работает без нареканий.
Исходные данные
- полетный контроллер Crius AIOP V2.0 www.rctimer.com/product_765.html
- плата расширения AIOPIO Board (Input / Output module) www.rctimer.com/product_957.html
- датчик напряжения и тока RCTimer Voltage & Current Sensor 50 V 90A www.rctimer.com/product_861.html
- ОСД RCTimer MAVLink-OSD V1.0 www.rctimer.com/product_862.html
OSD прошита KV_Team_dev_r370, мозги - MultiWii_dev_2013_10_20_r1591_pre_2.3
В основу легло сообщение serenya, направившего меня на запись Angelorsk о подключении датчика к мозгам rcopen.com/blogs/83206/16327#comment333 – за что им огромное спасибо.
подключаем pin “V” OSD на pin A0 AIOPIO
подключаем pin “I” OSD на pin A2 AIOPIO
Настраиваем и выставляем корректное напряжение согласно сообщению Андрея Трубникова.
MultiWii должна быть не ниже версии 2.3 – предыдущие версии работать не будут (без правки).
config.h для измерения тока выглядит так
#define POWERMETER_HARD
#define PSENSORNULL
#define PINT2mA 4 // примечание 1 – см.ниже
Правим прошивку OSD, в которой просто не читается значение текущего тока.
OSD\KV_Team_dev_r370 Добавить строки, выделенные красным:
Файл GlobalVariables.h
uint16_t pMeterSum=0;
uint16_t MwRssi=0;
uint16_t MwAmperage=0; // Mwii 2.3 - DenK
файл Serial.ino
if (cmdMSP==MSP_ANALOG)
{
MwVBat=read8();
pMeterSum=read16();
MwRssi = read16();
MwAmperage = read16(); // Mwii 2.3 - DenK
}
файл Screen.ino – заменить void displayAmperage(void) на следующий:
void displayAmperage(void)
{
// Real Ampere is ampere / 10
if (Settings[S_ENABLEADC]) {
ItoaPadded(amperage, screenBuffer, 4, 3); // 99.9 ampere max!
screenBuffer[4] = SYM_AMP;
screenBuffer[5] = 0;
MAX7456_WriteString(screenBuffer,getPosition(amperagePosition));
}
else {
ItoaPadded(MwAmperage, screenBuffer, 4, 3); // add Mwii 2.3 - DenK
screenBuffer[4] = SYM_AMP;
screenBuffer[5] = 0;
MAX7456_WriteString(screenBuffer,getPosition(amperagePosition));
}
}
/* как определяется структура analogв MWii2.3, файл types.h - нас интересует amperage
typedef struct {
uint8_t vbat; // battery voltage in 0.1V steps
uint16_t intPowerMeterSum;
uint16_t rssi; // range: [0;1023]
uint16_t amperage;
} analog_t;
*/
Примечание 1.
В файле MultiWii.cpp вводится поправка примерно таким образом: значение силы тока умножается на pint2ma.
Так как у меня сейчас нет возможности проверить с большими токами, а в области малых значений (единиц) поправка слишком грубая, то я в файле MultiWii.cpp заменил эту строку на следующую:
analog.amperage = powerValue * conf.pint2ma / 10;
Результат: цифры «0.0А» в ОСД ожили и стали показывать что-то, похожее на правду.
Просьба: если вы можете проверить с реальными токами – отпишитесь, я дополню/поправлю свой текст.