Измерение напряжения, тока, RSSI и мигание диодами на AIOP с MultiWii.

Дневник, в первую очередь, для себя, чтобы не забыть.
Имею две платки AIOP и пришёл мне датчик напряжения и тока, коих в итернетах полно.

Модуль содержит в себе датчик тока, датчик напряжения и BEC на 5 вольт с нагрузкой до 2А
Распиновка модуля такая:

Значит так.
Для измерения напряжения соответствующий провод от датчика подключаем на пин A0.
Немного теории. Пин А0 (да и другие аналоговые входы) измеряет напряжение в диапазоне от 0 до 5 вольт.
У данного датчика максимально входное напряжение - 25 вольт. Соответственно, при подключении батареи с напряжением 25 вольт на проводе, подключающемся к А0 будет 5 вольт. Проще говоря, между батарейкой и А0 линейная зависимость. От 0 до 25 на батарейке соответствует напряжению от 0 до 5 на А0.
Для активации функции во вкладке config.h нужно раскомментировать строку #define VBAT.
Так-же я раскомментировал строчку #define OVERRIDE_V_BATPIN A0 // instead of A3 // Analog PIN 3.
Не знаю, нужно это было, или нет, надеюсь знающие люди подскажут.
Судя по комментариям к этой строчке, измерение напряжение производится на А3 и активировав эту строчку мы переносим его на А0. Секрет в том, что при любом состоянии строки напряжение измеряется и там, и там. Но на А3 у нас будет RSSI, и я решил что так хуже не будет. Собственно, хуже и не стало.
Ещё один момент. Чтобы напряжение работало корректно, AIOP нужно запитать от BEC датчика. Не просто накинуть минус, а полноценно запитать. Только в этом случае можно корректно настроить отображение напряжения.
Итак, всё подключено, исправленная прошивка прошита - подключаем к GUI.
Напряжение уже будет показывать, но, скорее всего, сильно завышенное.
Переходим в GUI на вкладку Setting и в разделе VBATSCALE выставляем параметр, при котором у нас будет отображаться реальное напряжение, предварительно замеренное на батарейке тестером. После каждой корректировки значения не забываем жамкать Write. Для профилактики этот параметр можно записать в саму прошивку. В #define VBATSCALE.
Но просто так этот параметр не изменить. При первой прошивке он пишется в EEPROM и далее, сколько-бы мы не меняли его в прошивке и не перепрошивали плату - в итоге ничего не изменится. Чтобы параметр зашился непосредственно из прошивки, нужно сначала прошить в плату EEPROM_clear. Тогда при прошивке уже самого Multiwii зашьётся и новый параметр.
У меня параметр #define VBATSCALE получился равен 31. После этого напряжение будет отображаться корректно.
В разделе “battery voltage monitoring” так-же можно поменять номинальные и критические напряжения, если у вас не трёхбаночный аккумулятор.

Следующий пункт - отображение потребляемого тока.
Провод от датчика подключается на пин A2.
Принцип тот-же. Пин измеряет напряжение от 0 до 5 вольт.
При нулевой нагрузке на датчике - напряжение тоже 0. С увеличением нагрузки увеличивается и напряжение.
Для активации измерения тока с помощью датчика нужно в прошивке раскомментировать строку #define POWERMETER_HARD
Если у вас на датчике тока нулевой нагрузке соответствует о вольт (как у меня, да и на всех подобных датчиках), то параметр #define PSENSORNULL надо сделать равным 0.
Далее самое интересное. Нужно правильно установить параметр #define PINT2mA
Официальное Вики предписывает это сделать так:

As example amploc 25A sensor has 37mV/A (from datasheet), promini arduino analog resolution is 4.9mV per unit; units from [0…1023], independant of cycle time, PLEVELDIV is set internally
#define PINT2mA 130 // used for telemtry display: one integer step on arduino analog translates to mA (example 4.9 / 37 * 1000. Larger value of PINT2mA will get you larger displayed value for power (mA and mAh)

Поясню. Первая цифра - 4,9. У нас она останется такая-же. Она описывает шаг измерения напряжения на пине А2 в милливольтах. Всего этих шагов - 1024. Получается, проходя 1024 шагов от 0 до 5 вольт один шаг будет 4,882 милливольта.
Следующую цифру разработчики предлагают нам взять из даташита на наш датчик тока. Это напряжение, на которое изменится напряжение на выходе датчика тока (А2) при изменении нагрузки на 1А. Т.е. например, при нагрузке 20А напряжение будет 2 вольта, если мы добавляем 1А, то напряжение становится например, 2,05 вольта и т.д.
Конечно-же, никакого даташита на наш датчик нам никто не предоставил.
Можно воспользоваться математикой.
Максимальный ток, на который рассчитан датчик - 90А. Теоретически, при этом он должен показывать 5 вольт.
Делим 5 на 90 и получаем шаг одного ампера - 0,05 вольт, или 50 милливольт - это и есть наша вторая цифра в расчётах.
Но цифра эта, сразу скажу, очень и очень примерная.
Можно попробовать измерить напряжение, но у меня проблема оказалась в том, что все три имеющиеся у меня амперметра показывают уж очень разные токи потребления одной и той-же, например, лампочки.
Математика такая-же. Берём лампочку, подключаем,Ю замеряем потребляемый ток. Например, у меня получился 1.75А.
При этом на проводе к пину A2 напряжение составило 0,058 вольт.
0,058\1,75 = 0,033, или 33 милливольта. Ввиду несовершенства имеющихся у меня приборов измерения цифра эта получается всегда довольно приблизительная… А в диапазоне 90 Ампер погрешность может быть довольно большая. На повермодуле стоит элемент, который наиболее вероятно и является непосредственно датчиком тока. Маркировка у него “0m50”. Гугленье ничего не даёт.
Подставляем наиболее близкое получившееся у нас число в уравнение и его результатом и будет значение #define PINT2mA.
4.9/33*1000 = 148.
Теперь ток у нас тоже будет отображаться. Хоть и достаточно примерно.

Следующий параметр - RSSI.
У меня приёмник OrangeRx Open LRS и на нём уже есть вывод RSSI.
Остаётся только активировать его в прошивке и настроить.
Чтобы заработал RSSI в прошивке нужно раскомментировать строки


#define RX_RSSI
#define RX_RSSI_PIN A3

После этого RSSI встаёт на пин А3 и, собственно, уже работает.
А вот дальше немного читерства.
Я не знаю, как калибровать RSSI через родное GUI.
На вкладке Setting есть пункт отображающий RSSI. Но калибровка там, как я понял, не доступна.
Я калибровал через OSD. Это очень легко сделать имея minimOSD с прошивкой MWOSD.
На пульте одновременно Яв и Пич на полную - OSD входит в режим настройки.
Описывать принципы навигации по меню не буду - интуитивно понятно.
Добираемся до вкладки RSSI и выбираем там SET RSSI.
Пока тикает таймер нам нужно просто выключить пульт.
После этого выбираем SAVE+EXIT.
RSSI теперь тоже откалиброван.

Бонусом - подключение и управление светодиодами.
Изначально подсветка приписана на D13.
Мы его хотим видеть на A1.
Казалось-бы, всё просто. В config.h есть строчка:


 //#define OVERRIDE_LEDPIN_PINMODE             pinMode (A1, OUTPUT); // use A1 instead of d13

Но не тут-то было. Скетч не компилируется. Ну и ладно.
Находим секцию и раскомментируем нужные нам пункты.


    #define LED_FLASHER
    #define LED_FLASHER_DDR DDRB
    #define LED_FLASHER_PORT PORTB
    #define LED_FLASHER_BIT PORTB4
    //#define LED_FLASHER_INVERT
    #define LED_FLASHER_SEQUENCE        0b00000000      // leds OFF
    #define LED_FLASHER_SEQUENCE_ARMED  0b00000101      // create double flashes
    #define LED_FLASHER_SEQUENCE_MAX    0b11111111      // full illumination
    #define LED_FLASHER_SEQUENCE_LOW    0b00000000      // no illumination

LED_FLASHER активирует функцию. В GUI появляются пункты LEDMAX и LEDLOW, которые можно назначить на каналы и управлять ими с пульта.
Далее устанавливаются режимы. Каждая цифра после “0b” - это 0,125 секунды. Соответственно 0 - диод выключен, 1 - диод включен. Т.е. восем нулей - постоянно выключено, восемь единиц - постоянно включено. 11110000 - полсекунды горит, полсекунды нет. 00000101 - двойной проблеск и т.д.
LED_FLASHER_SEQUENCE - режим мигания/свечения при дизарменом состоянии.
LED_FLASHER_SEQUENCE_ARMED - режим мигания/свечения при арме.
LED_FLASHER_SEQUENCE_MAX и LED_FLASHER_SEQUENCE_LOW можно активировать с пульта. Можно сделать постоянно включено и постоянно выключено, или назначить свои режимы мигания.
Теперь самое интересное - мы так и не переназначили пин.
за это у нас отвечают строчки


    #define LED_FLASHER_DDR DDRB
    #define LED_FLASHER_PORT PORTB
    #define LED_FLASHER_BIT PORTB4

Последний символ в первых двух строчках и последние два символа в третьей строчке и отвечают за адрес пина.
Чтобы узнать, какие нам нужно, надо пройти по ссылке и посмотреть название нашего пина (Analog 1).
Называется он PF1.
Буква “P” нам не нужна. Нам нужна буква F, которую мы и подставим последней в первых двух строчках.
В третьей строчке подставляем уже F1.
В итоге у нас получается следующее:


    #define LED_FLASHER_DDR DDRF
    #define LED_FLASHER_PORT PORTF
    #define LED_FLASHER_BIT PORTF1

Пин переадресован и диод(ы) подключенные к нему уже будут мигать в соответствии с нашей программой.
Однако выходной ток у пина очень маленький и даже один диод, если он достаточно мощный, может не потянуть.
Решение простое. Организуем подсветку любым удобным нам способом, а подключаем к управляющему пину через транзистор.
Решение, аналогичное подключению управления подсветкой дисплея в Turigy 9X.

Разрываем минусовой провод питания подсветки и подпаиваем на крайние ножки транзистора.
К центральной подключаем провод от A1.
Теперь у нас транзистор будет выключателем, а щёлкать им будет программа.
Разумеется, транзистор нужно подобрать так, чтобы он мог пропустить соответсвующий ток, который требуют диоды.
Например, максимально допустимый ток для вышеозначенного транзистора BS170 - 0,5А.

Выше написал свой собственный опыт.
Если у более знающих людей есть замечания и предложения относительно вышесказанного - буду рад видеть это в комментариях.

  • 3107
Comments
Saire

Сегодня внимательно покурил форум, подключил PF2 в конфиге, на режим дизарма (как еще описали, режим, когда никакие другие режимы неактивны). Подключился аккуратно к А2, минус накинул на колодку, питание драйвера LED воткнул в бп, сидел, моргал платкой 10101010:) Интересно, более длинный сигнал можно закодировать? Чтобы он настраивался двумя, тремя байтами подряд.

Saradon

Тоже думал о более длинном сигнале. Может попробовать записать несколько байт подряд?

Saire

В понедельник попробую, распаяная подсветка там лежит. Дома лежит подсветка, но ее сначала надо вытащить из разбитой матрицы.
Буду пробовать менять длину, то есть 1111111100000000, или 1b111111100000000. Главное чтобы скомпилилось и сигнал различался, что он длинный, а не повторяющийся короткий.

Saradon

Ну нет… всё-же в байте 8 бит.
А вот попробовать записать в иде 0b00000000 0b11111111 можно.