Activity

"Чугунный станок с ЧПУ"

Со времен постройки фанерного станка с ЧПУ сразу же у меня была мысль о строительстве старшего брата. Это должен быть станок с возможностью качественной обработки цветных сплавов, с полем 700х500. Такой размер вызван не “юношеским максимализмом”, на станке планируется серийно изготавливать детали из цветного металла примерно такими габаритами, при толщине до 20мм.
Не так давно я узнал, оказывается не далеко от меня ветает возможность отлить станину для своего нового станка из чугуна. Обрадывавшись, кинулся я рисовать станину. По-проще, да по-жирнее. Нарисовал. Масса оказалась порядка 250-300 кг. Дабы оценить возможность отлить станину такой формы с такими габаритами и такой массой, эскиз был отослан литейщикам. Вердикт меня не порадовал - печь на данном производстве позволяет максимум загружать 160 кг чугуна. К форме и габаритам претензий не было. И тут я взялся как-то оптимизировать свой эскиз, дабы уложиться в рамки по массе. Нарисовал. Если в жесткости первого варианта станины мне сомневаться не приходилось, то второй вариант в сечениях очень прилично похудел, хотя и остался весьма и весьма “мощным”.
Цель заметки - продемонстрировать коллегам по хобби мое творчество и выслушать те или иные замечания, пожелания, да и вообще вердикт - жизнеспособен ли мой проект.

Фанерный станок ЧПУ, окончание постройки.

Настала пора написать последнюю заметку о фанерном станке, потому как строительство завершено. Механика полностью готова, осталось подключить электронику и настроить ПО контроллера. Ну а дальше будем пробовать грызть деревяшки.
Ранее я писал о неудачном опыте резки лазером с безответственным дядей в качестве оператора. Помимо описанных в той заметке косяков оказалось, что у меня еще и не выдержана толщина фанеры. Покупал шлифованную 8 и 10 мм, а приехала 7,2 и 9,1. А я даже не додумался ее измерить, так был уверен, что покупая шлифованную фанеру она будет именно такая, какая должна быть. В итоге все мои соединения шип/паз оказались очень слабыми. Тем не менее решено было работать с теми заготовками, которые есть.
Счистив весь нагар с кромок деталей принялся клеить. В виду того, что на шипы и пазы мои уже положится было нельзя, пришлось активно пользоваться разнообразными кондукторами, шаблонами и прочим подобным. Все зазоры заполнила эпоксидная смола. Думаю соединения получились достаточно прочными.
В результате работой своей я остался доволен. Все направляющие удалось вклеить параллельно и перпендикулярно там, где это необходимо. Благодаря советам, которые мне давали в комментариях к первой заметке о станке, станок получился достаточно жестким для конструкции из фанеры. Единственное, возможно я напрасно не заложил в конструкцию распорки для стоек портала, положившись на заделку направляющих валов. Но это в принципе поправимо: если портал будет демонстрировать в процессе работы склонность к складыванию в ромб, распорку эту я сделаю и прилажу к станку позже.
Далее несколько фото готового станка, а также процесса изготовления отдельных деталей и узлов.

Вопросы о лазерной резке фанеры

Первый раз имел дело с лазерной резкой фанеры и лазерной резкой вообще. Сегодня получил детали, которые заказывал для постройки фанерного ЧПУ. Притащил мешок домой, высыпал детальки - красота.

Взялся тщательно рассматривать детали, и в итоге остался крайне недоволен. Собственно требования свои я озвучивал, и основные претензии сейчас как раз в том, что требования эти оказались не выполнены. Но все таки хочу спросить сообщество мнение, не загнул ли я с требованиями своими.

В общем по порядку:

  1. Просил прожоги делать не на контуре, а где-нибудь рядом с ним и только рабочим лучем заходить на контур. В итоге все контуры с следами прожогов. Но это в принципе не критично, написал в качестве вступления больше.
  2. Понятно, что рез от лазера имеет толщину. Я просил учесть этот момент и его компенсировать. Если точно выставить компенсацию толщины реза невозможно, просил оставить запас, с тем, чтобы потом я мог подогнать шипы/пазы дома напильником/наждачной бумагой. В итоге каждый шип меньше номинального размера на 0,5мм, а каждый паз на эти 0,5мм больше. И зазор получается 1мм. Собственно вопрос: позволяет ли ПО лазерных станков учитывать толщину реза по аналогии с CAM программами для фрезерования? Или я должен был сам на этапе подготовки файлов учесть толщину реза? Станок Rapid 3015, больше я про него ничего не знаю.
  3. Также я предполагал, что торец реза не будет перпендикулярным плоскости детали. У отверстий будет некоторая конусность. У моих детали угол отклонения получился очень большой, и самой, что удивительное - это не конус, это скос обоих сторон деталей в одну и ту же сторону. Причем сами поверхности реза на глаз параллельны. Такое ощущение, как-будто лист просто лежал криво (под углом). Также есть места, где “заваленная” поверхность реза на отверстиях граничит с вполне нормальным резом.\

    Детали, резанные из одного файла, но из фанеры разной толщины, в итоге различаются размерами (тонкие детали прилично меньше, чем из толстой фанеры).
    Основные вопросы: это халатность отношения к заказу, или это специфика лазерного раскроя материала типа фанеры?
Фанерный станок ЧПУ

Давно собирался построить станок с ЧПУ управлением для раскроя, но все как-то не мог решиться, то не был готов к материальной составляющей постройки, то к затратам по времени, то к всему вместе сразу. И вот наконец понимание необходимости такого девайса (а может желание заиметь новую игрушку) пересилило все препятствующие моменты, и я решился…

Станок был спроектирован по мотивам фанерного станка Графа на валах, за идею ему конечно большое спасибо. Обрабатывать планирую всякие неметаллы (раскрой фанеры, бальзы, текстолита, карбона. Попробую делать на нем платы методом гравировки, потому как ЛУТ метод хоть и хорошо, но у меня с ним дружба не очень гладко идет. Попробую 3D фрезеровку мдф и древисины). Станок будет фанерным, особых требований к нему не предъявляются, но и расхлябанным он не должен быть. В общем я рассчитываю, что получится вполне крепкий середнячок. Станок будет выглядеть так:

Основные характеристики станка:
Ход X – 600 мм
Ход Y – 400 мм
Ход Z – 90 мм
Валы X и Y – 20 мм
Валы Z – 16 мм
Линейные подшипник – шариковые
Двигатели:
X и Y – типоразмера 57 х 76
Z – типоразмера 57 х 56
Ходовые винты – трапеция, 10 х 2 (по всем трем осям)
Ходовые гайки – капролон, 10 х 2 (по всем трем осям)
Драйверы ШД ¬– Leadshine M542 (если есть более бюджетные варианты, не уступающие по функционалу, с удовольствием воспользуюсь советом их применения)
Шпиндель – коллекторный, 300Вт, ER11 (вот такой)
Блок питания – 48В 350Вт х 2 шт.
Контроллер – пока не решил, планирую минимум 4 оси.

Все детали будут вырезаны из шлифованной березовой фанеры 8 мм. Клеить отдельные детали планирую эпоксидкой – пятиминуткой, основной критерий выбора которой это время склейки.

Столешница будет съемной, 40 мм толщиной, варианты по материалам – МДФ, фанерный переклей, мебельный щит. Окончательно пока не решил.
Ходовые винты будут фиксироваться с одной стороны по всем трем осям (2 радиальных подшипника, между которыми упорная дюралевая пластина 4 мм), с противоположных сторон – только муфта и ШД.

Портал с траверсой будут разъемным, в стенки портала планирую ввернуть на эпоксидную смолу мебельные ввертыши, и через сквозные отверстия в траверсе портал планирую крепить винтами М4 или М5 (пока не искал ввертыши, не знаю, какие удастся найти).

Блоки питания будут одинаковые, один на шпиндель, второй на моторы. Почему 48 вольт для моторов? Я не гонюсь за большими скоростями обработки по понятным причинам, но если в холостую мой станок будет бегать чуть быстрее, чем ползти, это будет для меня приятным моментом. Только поэтому. Ну еще есть оглядка: если в будущем я решу строить станок крупнее, из других материалов, драйверы и блок можно будет перенести. В этом подходе я не уверен, поэтому если я тут в чем то ошибаюсь, подскажите, в чем.

Есть мысли побаловаться в перспективе с 4 поворотной осью. Если до этого дойдет, то между траверсой и порталом можно будет установить проставки 30-40 мм, чтобы поднять шпиндель над столом, или убрать стол и поставить поворотную ось прямо на опоры стола. А лучше всего (только что мысль пришла) наверное будет сделать вторую аналогичную столешницу, в которой вырезать прямоугольное отверстие, в которое и будет помещена 4 ось с заготовкой (опираться она будет на опоры столешницы).

Из сомнений… Я понимаю, что я отошел от эталонного дизайна фанерного станка Графа, увеличив ход по Y практически в 2 раза и немного по Z. Я постарался это компенсировать увеличенным сечением направляющих валов и «мясом» отдельных деталей. Но в голове таится мысль, что портал может получиться очень тяжелым и, хотя я уменьшил ход по X, возможно я столкнусь с прогибом валов X. Но мне нужны эти 400 мм по Y, поэтому будем пробовать.

Из вопросов… Контроллер. Тут я вообще в растерянности. Как я понял, одной из самых распространенных программ управления является Mach3. И опять таки на сколько я знаю, он работает только через LPT порт. Но это древний век, компа такого у меня нет (хотя найти конечно не проблема), и резонно возникает желание контроллер к ПК подключить по USB интерфейсу. Но в таком случае придется отказываться от Mach3 в пользу каких-то других программ управления. Здесь я прошу совета – как поступить? Искать ли комп с LPT и пользоваться распространенным Mach3, или же есть сейчас нормальные контроллеры и программы управления, позволяющие работать по USB интерфейсу. Если все таки вариант первый (с LPT разъемом), то какие минимальные требования предъявляются к такому ПК?

Еще не решил вопрос с концевиками и датчиками Home. Но тут, если честно, я и не курил форум, пойду покурю.

На сегодня имею спроектированный станок, набор деталей для раскроя (чертежи), направляющие валы и линейные подшипники. Сейчас договариваюсь на счет раскроя фанеры. Следующим этапом планирую собрать механику, чтобы все каретки и портал ездили ровно и хорошо. Этот этап будет отражен в следующей заметке. Затем буду покупать ШД, ходовые винты, изготавливать ходовые гайки и муфты и монтировать все это дело на станок. Шпиндель уже едет. Всю остальную электронику буду покупать третьим этапом, монтировать ее планирую в отдельный ящик.

Адаптер датчика оборотов для Graupner HoTT

Девайс представляет из себя небольшую плату (которая могла бы быть еще меньше, если применить двусторонний монтаж). С одной стороны адаптер подключается к приемнику HoTT, с другой стороны подключается к датчику оборотов.

Распиновки со стороны приемника такая:

  1. GND - земля,
  2. V_IN - питание адаптера (5-12В),
  3. Rx,
  4. Tx.

Как и в случае с Heli модулем, в рабочем состянии выводы Rx и Tx должны быть замкнуты, то есть замкнули выводы, подали питание на адаптер, адаптер в рабочем положении. В противном случае адаптер входит в режим установки коэффициента редукции трансмиссии (об этом чуть ниже). Я предлагаю соединять эти выводы проводком типа как в Heli модуле, только там не использовался центральный провод питания, а тут он используется. То есть с одной стороны у нас полноценный сервоудлиннитель (земля питание сигнал), который подключается к приемнику в телеметрийный разъем, с другой у нас колодка на 4 пина и два крайних в ней замкнуты.

Со стороны датчика оборотов контакты такие:

  1. S1 - первый датчик (пока не используется),
  2. S2 - второй датчик,
  3. +5V - используется для питания датчика, если это необходимо,
  4. GND.

Датчик оборотов должен выдавать импулься, кратные числу этих самых оборотов. Импульсы могут иметь амплитуду до 40В, но не менее 4В. Простой пример датчика - это маленький магнитик на роторе и датчик Холла рядом с ним. Этот датчик как раз имеет три ноги: земля, питание, выход. Можно подключить простым сервоудлиннителем. Я использую специальный выход моего регулятора.

Сам адаптер разведен для работы с двумя датчиками оборотов. В принципе и логика обсчета тоже готова (не проверена, правда, пока). Но так как я не нашел удобного способа вывода показаний с двух датчиков в стандартное окно Електрик аир модуля, пока прошивка позволяет работать с одним датчиком (вход S2). Чуть позже покапаюсь с текстовым режимом и сделаю полноценную поддержку двух датчиков. Может быть и настройки после этого будут осуществляться с пульта. В принципе, можно и 4 датчика задействовать, но тут я бы использовал мегу 64, потому как у нее для этого хватит входов внешних прерываний.

Установка коэффициента редукции трансмиссии осущетсвляется аналогично Heli модулю.
Устройство позволяет задавать коэффициент передачи от 0,01 до 99,99. Для магнитного датчика на валу ОР коэффициент будет 1, для случаев с сигналом из ESC, датчиков оборотов, которые вешаются на провода между мотором и ESС, необходимо рассчитывать коэффициент передачи, как шестерней, так и в моторе. В моторе коэффициент передачи равен половине количества магнитов ротора. У меня передатка между валом мотора и ОР составляет 9,18, в моем моторе 8 магнитов, следовательно, моя итоговая передатка получается 9,18 х (8 / 2) = 36,72. Эту цифру мы и запишем в устройство во время настройки.

Для входа в режим программирования необходимо освободить контакты Rx и Tx, а затем подать питание на адаптер. Сделать это можно как со стороны датчика (земля и +5В там есть), так и со стороны приемника (земля и 5-12В). Условием входа в режим программирования являются отсутствие какого либо потенциала на ножках Rx и Tx. Затем необходимо подключить модуль к USB конвертеру тремя проводками (GND – GND, RxD – TxD, TxD – RxD) и подключить конвертер к компьютеру.
Также нужна терминальная программа. В настройках терминалки мы выставляем скорость 19 200 бод, а остальное все как всегда (без четности, 8 бит, 1 стоп бит).

Для установки коэффициента передачи трансмиссии применяется команда, состоящая из одной буква “r” и четырех цифр. Цифры выравниваются по центру, потому как есть дробная часть. Например:

r0918 – устанавливает коэффициент передачи, равный 9,18,
r3672 – устанавливает коэффициент передачи, равный 36,72,
r0100 – устанавливает коэффициент передачи, равный 1,00.

На выполенение команды адаптер должен ответить:

Команда: r3672 Ответ: 36.72 ОК

Только в этом случае можно считать, что коэффициент установлен.
Для любителей покопаться в коде, ниже исходник:


#define u08 unsigned char
#define u16 unsigned int
#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/eeprom.h>
#include <stdint.h>

#define baudrate 19200L
#define bauddivider (F_CPU/(16*baudrate)-1)
#define HI(x) ((x)>>8)
#define LO(x) ((x)& 0xFF)


#define r_gear_ratio_0 0x0066
#define r_gear_ratio_1 0x0067
#define r_gear_ratio_2 0x0068
#define r_gear_ratio_3 0x0069




volatile u08 	USART_msg_number = 0,
				UDR_data[2],
				UDR_set_data[5],
				UDR_tmp,
				sys_status = 0,
				settings = 0,
				tmr_ovf = 0,
				cnt = 0,
				data_update = 0;



volatile u16 	tcnt1, rpm;

volatile float 	gear_ratio;


struct HOTT_EAM_MSG {
        u08 start_byte;                      //#01 start int8_t
        u08 eam_sensor_id;           		//#02 EAM sensort id. constat value 0x8e
        u08 warning_beeps;                   //#03 1=A 2=B ... or 'A' - 0x40 = 1
                                                                // Q    Min cell voltage sensor 1
                                                                // R    Min Battery 1 voltage sensor 1
                                                                // J    Max Battery 1 voltage sensor 1
                                                                // F    Mim temperature sensor 1
                                                                // H    Max temperature sensor 1
                                                                // S    Min cell voltage sensor 2
                                                                // K    Max cell voltage sensor 2
                                                                // G    Min temperature sensor 2
                                                                // I    Max temperature sensor 2
                                                                // W    Max current
                                                                // V    Max capacity mAh
                                                                // P    Min main power voltage
                                                                // X    Max main power voltage
                                                                // O    Min altitude
                                                                // Z    Max altitude
                                                                // C    (negative) sink rate m/sec to high
                                                                // B    (negativeADIF 4 6) sRXC 7 11ink rate m/3sec to high
                                                                // N    climb rate m/sec to high
                                                                // M    climb rate m/3sec to high

        u08 sensor_id;                   //#04 constant value 0xe0
        u08 alarm_invers1;                   //#05 alarm bitmask. Value is displayed inverted
                                                                //Bit#  Alarm field
                                                                // 0    mAh
                                                                // 1    Battery 1
                                                                // 2    Battery 2
                                                                // 3    Temperature 1
                                                                // 4    Temperature 2
                                                                // 5    Altitude
                                                                // 6    Current
                                                                // 7    Main power voltage
        u08 alarm_invers2;                   //#06 alarm bitmask. Value is displayed inverted
                                                                //Bit#  Alarm Field
                                                                // 0    m/s
                                                                // 1    m/3s
                                                                // 2    Altitude (duplicate?)
                                                                // 3    m/s     (duplicate?)
                                                                // 4    m/3s (duplicate?)
                                                                // 5    unknown/unused
                                                                // 6    unknown/unused
                                                                // 7    "ON" sign/text msg active

        u08 cell1_L;                         //#07 cell 1 voltage lower value. 0.02V steps, 124=2.48V
        u08 cell2_L;                         //#08
        u08 cell3_L;                         //#09
        u08 cell4_L;                         //#10
        u08 cell5_L;                         //#11
        u08 cell6_L;                         //#12
        u08 cell7_L;                         //#13
        u08 cell1_H;                         //#14 cell 1 voltage high value. 0.02V steps, 124=2.48V
        u08 cell2_H;                         //#15
        u08 cell3_H;                         //#16
        u08 cell4_H;                         //#17
        u08 cell5_H;                         //#18
        u08 cell6_H;                         //#19
        u08 cell7_H;                         //#20

        u08 batt1_voltage_L;         //#21 battery 1 voltage lower value. opt. cell8_L 0.02V steps
        u08 batt1_voltage_H;         //#22

        u08 batt2_voltage_L;         //#23 battery 2 voltage lower value. opt cell8_H value-. 0.02V steps
        u08 batt2_voltage_H;         //#24

        u08 temp1;                                   //#25 Temperature sensor 1. 0°=20, 26°=46
        u08 temp2;                                   //#26 temperature sensor 2

        u08 altitude_L;                      	//#27 Attitude lower value. unit: meters. Value of 500 = 0m
        u08 altitude_H;                      	//#28

        u08 current_L;                          //#29 Current in 0.1 steps
        u08 current_H;                          //#30

        u08 main_voltage_L;          			//#30 Main power voltage (drive) in 0.1V steps
        u08 main_voltage_H;						//#31

        u08 batt_cap_L;                      //#32 used battery capacity in 10mAh steps
        u08 batt_cap_H;                      //#33

        u08 climbrate_L;                     //#34 climb rate in 0.01m/s. Value of 30000 = 0.00 m/s
        u08 climbrate_H;                     //#35

        u08 climbrate3s;                     //#36 climbrate in m/3sec. Value of 120 = 0m/3sec

        u08 rpm_L;                           //#37 RPM. Steps: 10 U/min
        u08 rpm_H;                           //#38

        u08 electric_min;                    //#39 Electric minutes. Time does start, when motor current is > 3 A
        u08 electric_sec;                    //#40

        u08 speed_L;                         //#41 (air?) speed in km/h. Steps 1km/h
        u08 speed_H;                         //#42
        u08 stop_byte;                       //#43 stop int8_t
      //u08 parity;                          //#44 CRC/Parity
} hott_eam_msg;




ISR (USART_RXC_vect)
	{
	switch (settings)
		{
		case 0:
			UDR_data[1] = UDR;
			if ((USART_msg_number == 0) && (UDR_data[1] == 0x80))
				{
				UDR_data[0] = UDR_data[1];
				USART_msg_number = 1;
				}
				else
					{
					if ((UDR_data[1] == 0x8e) || (UDR_data[1] == 0x80)) sys_status = 1;

					USART_msg_number = 0;
					}
			break;

		case 1:
			UDR_tmp = UDR;
			if ((UDR_tmp == 'r') || (UDR_tmp == 'R'))
				{
				USART_msg_number = 0;
				}

			UDR_set_data[USART_msg_number] = UDR_tmp;
			USART_msg_number++;

			break;
		}
	}




ISR (INT1_vect) //?????????? ?? ?????????? ??????? ????????
	{
	if (cnt < 36) cnt++;
		else
			{
			tcnt1 = TCNT1;
			TCNT1 = 0x0000;
			cnt = 0;
			if (!data_update)
				{
				data_update = 1;
				}

			}

	}


ISR (TIMER1_OVF_vect)
	{
	tmr_ovf = 1;
	}

void UART_INIT (void);
void INT1_INIT (void);
void TIMER1_INIT (void);
void UART_RX_EN (void);
void UART_TX_EN (void);
void SEND_EAM_MSG (void);
void DATA_UPDATE (void);


void main (void)
	{

	DDRD &= ~(1<<1);
	PORTD |= 1<<1;
	DDRD |= 1<<0;
	PORTD &= ~(1<<0);

	sei();

	if (PIND & (1<<1))
		{

		UART_INIT();
		settings = 1;
		UCSRB |= 1<<TXEN | 1<<RXEN;
		_delay_ms(20);

		while (1)
			{
			while (USART_msg_number != 5);

			USART_msg_number = 0;



			for (u08 i = 1; i < 5; i++)
				{
				UDR_set_data[i] &= 0x0f;
				}


			if (UDR_set_data[0] == 'r')
				{

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_0;
						EEDR = UDR_set_data[1];
						EECR |= (1<<EEMWE);
						EECR |= (1<<EEWE);

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_1;
						EEDR = UDR_set_data[2];
						EECR |= (1<<EEMWE);
						EECR |= (1<<EEWE);

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_2;
						EEDR = UDR_set_data[3];
						EECR |= (1<<EEMWE);
						EECR |= (1<<EEWE);

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_3;
						EEDR = UDR_set_data[4];
						EECR |= (1<<EEMWE);
						EECR |= (1<<EEWE);

						///////////////////////////
						_delay_ms(3);

						UDR = ' ';

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_0;
						EECR |= (1<<EERE);
						UDR = EEDR | 0x30;

						_delay_ms(3);

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_1;
						EECR |= (1<<EERE);
						UDR = EEDR | 0x30;

						_delay_ms(3);

						UDR = '.';

						_delay_ms(3);

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_2;
						EECR |= (1<<EERE);
						UDR = EEDR | 0x30;

						_delay_ms(3);

						while (EECR & (1<<EEWE));
						EEAR = r_gear_ratio_3;
						EECR |= (1<<EERE);
						UDR = EEDR | 0x30;

						_delay_ms(3);

						UDR = ' ';

						_delay_ms(3);

						UDR = 'O';

						_delay_ms(3);

						UDR = 'K';



				}//if...


			} // while
	}// if(...







	////////////считываем значения из ПЗУ и формируем коэффициент передачи трансмиссии.

	while (EECR & (1<<EEWE));
	EEAR = r_gear_ratio_0;
	EECR |= (1<<EERE);
	gear_ratio = (float)EEDR*10;


	while (EECR & (1<<EEWE));
	EEAR = r_gear_ratio_1;
	EECR |= (1<<EERE);
	gear_ratio += (float)EEDR;

	while (EECR & (1<<EEWE));
	EEAR = r_gear_ratio_2;
	EECR |= (1<<EERE);
	gear_ratio += ((float)EEDR)/10;

	while (EECR & (1<<EEWE));
	EEAR = r_gear_ratio_3;
	EECR |= (1<<EERE);
	gear_ratio += ((float)EEDR)/100;



	UART_INIT();
	INT1_INIT ();
	TIMER1_INIT ();
	UART_RX_EN ();

	memset(&hott_eam_msg, 0, sizeof(struct HOTT_EAM_MSG));
 	hott_eam_msg.start_byte = 0x7c;
 	hott_eam_msg.eam_sensor_id = 0x8e; //HOTT_TELEMETRY_EAM_SENSOR_ID
 	hott_eam_msg.sensor_id = 0xe0;
 	hott_eam_msg.stop_byte = 0x7d;


	while(1)
		{
		if (sys_status)		SEND_EAM_MSG ();
		if (data_update)	DATA_UPDATE ();
		}
	}

void UART_INIT (void)
	{
	UBRRL = LO(bauddivider);
	UBRRH = HI(bauddivider);
	UCSRA = 0;
	UCSRC |= 1<<URSEL|1<<UCSZ0|1<<UCSZ1;
	UCSRB |= 1<<RXCIE;
	}

void TIMER1_INIT (void)
	{
	TIMSK &= ~((1<<TICIE1)|(1<<OCIE1A)|(1<<OCIE1B)|(1<<TOIE1));
	TCCR1B |= 5<<CS10; // prescale /1024
	TIMSK |= 1<<TOIE1;
	}

void UART_RX_EN (void)
	{
	UCSRB &= ~(1<<TXEN);
	UCSRB |= 1<<RXEN;
	}

void UART_TX_EN (void)
	{
	UCSRB &= ~(1<<RXEN);
	UCSRB |= 1<<TXEN;
	}

void SEND_EAM_MSG (void)
	{
	_delay_ms(5);
	UART_TX_EN ();
	u08 msg_len = sizeof(struct HOTT_EAM_MSG);
	u08 *msg_pntr;
	u08 msg_crc=0;
	msg_pntr = &hott_eam_msg;
	while (msg_len)
		{
		UDR=*msg_pntr;
		msg_crc+=*msg_pntr;
		msg_pntr++;
		msg_len--;
		_delay_ms(3);
		}
	msg_crc &= 0xFF;
	UDR=msg_crc;
	UART_RX_EN ();
	sys_status = 0;
	}


void INT1_INIT (void)
	{
	DDRD &= ~(1<<3);
	PORTD |= 1<<3;
	MCUCR |= 3<<ISC10;
	GICR |= 1<<INT1;
	}

void DATA_UPDATE (void)
	{
	if (!tmr_ovf)
				{

				rpm = (u16)((2160 / (tcnt1 * 0.00128)) / gear_ratio);

				}
				else
					{
					rpm = 0;
					}

			tmr_ovf = 0;
			hott_eam_msg.rpm_L = rpm;
			hott_eam_msg.rpm_H = rpm>>8;
			data_update = 0;

	}


Ну вот собственно и все. Если есть вопросы, задавайте, буду рад ответить. Файлы к статье (схема, печатная плата, прошивка) тут.
UPD: Не так давно выяснилось, что адаптер с текущей прошивкой не корректно работает на передаточным отношении 1:1. Я делал его в основном для вертолета с большим передаточным числом, и думал, что будет достаточно просто “недоразделить” число оборотов и отправить это дело приемнику. Оказалось что нет. Валерий возможно именно об этом пытался мне рассказать в комментариях, но я его не понял, а он был не достаточно настойчив.
Тем не менее, косяк этот я поправил. Не стал делать универсальную прошивку, сделал “экспресс” прошивку для систем с передаточным числом 1:1 и диапазоном до 15 000 об/мин. Адаптер считает и дальше, но там цена деления одного тика таймера уже получает очень высокой, но грубо оценить обороты можно. Ничего настраивать в этой прошивки не нужно. Залил, подключил и полетел. Прошивка доступная по ссылке. Не знаю, буду ли делать универсальную - очень туго со временем. Пока так.

Телеметрийный протокол Graupner HoTT

Продолжим вещание про Hott и его телеметрию. Сегодня опишу протокол взаимодействия разнообразных модулей Hott с приемниками.
Стоит сразу сказать, что система позволяет взаимодействовать с двумя основными типами устройств: со стандартными модулями Hott и с нестандартными. В первом случае стандартный модуль телеметрии передает структуру данных, в которой пульт уже знает, что первый байт это напряжение, второй температура, третий обороты и т.п. Информация, содержащаяся в такой структуре, просто форматируется и распихивается по стандартным окошкам телеметрии в пульте. Этот режим называется binary. Во втором случае от модуля, являющегося не стандартным Hott, поступает информация в виде текста, описывающего отображаемый параметр, и самого значения параметра. То есть у нас есть возможность создавать кастомный экран на пульте и отображать нужные нам данные. Ко всему тут появляется возможность передачи данных в обратном направлении (настройка параметров модуля через пульт). Этот режим называется text (текстовый). В нем я до конца не разобрался, потому как для моих целей вполне достаточен подлог своих данных в структуры данных стандартных модулей Hott. В виду этого речь дальше пойдет о binary mode (числовой режим, наверное по-русски это будет примерно так).
На самом деле, все тут у нас очень и очень просто. На физическом уровне обмен осуществляется средствами протокола UART, на скорости 19200 бод, 8 бит данных, 1 стоп бит, без четности. Используются два провода: земля и сигнал. Поэтому в модуле у микроконтроллера необходимо ноги Rx и Tx замкнуть и подключить к сигнальной линии, аппаратный UART постоянно переключать с режима передачи на режим приема. То есть, после инициализации UART настроен на прием. Как только услышали нужную команду, переключаемся на передачу, отправляем структуру данных, переключаемся на прием и ждем следующую команду.
Приемник каждые 200 мсек посылает на линию два байта вида:

0x80 0x89…
0x80 0x8e…
0x80 0x8d…,

где первый байт (0x80) показывает, что общение идет в binary mode, а второй байт, это идентификатор модуля, от которого приемник сейчас ждет ответ. Услышали вторым байтом идентификатор своего модуля, зарядили в ответ структуру данных этого модуля. Между приемом идентификатора своего модуля и отправкой первого байта структуры данных этого модуля по спецификации проткола положена задержка в 5 мсек. Плюс ко всему, между отправками байтов структуры должны быть задержки 2 мсек (я использовал 3 мсек). То есть схематично это выглядит так:
(Приемник ->0x80 0x8e) задержка 5 мсек (модуль->первый байт) задержка 2 мсек (модуль->второй байт) задержка 2 мсек (модуль->третий байт) задержка 2 мсек … (модуль->последний байт).
Вот и все.
Тут есть один момент: через некоторое время (секунд 5-10) после включения пульта приемник в линию телеметрии перестает выдавать запросы на конкретные модули, если не получает ответы от них, а просто выдает два байта 0x80 0x80. По крайней мере на моей прошивке пульта и приемника так. А мой HeliModule отвечал строго на запрос идентификатора Electrik Air модуля (0x8e). Соответственно, если не успеть включить модуль до конца перебора приемником идентификаторов известных ему модулей, то модуль просто не определяется. Причем как я понял, обмен весь инициирует и поддерживает пульт через эфир и приемник, потому как если при включенном приемнике перезагрузить пульт, перебор идентификаторов модулей опять восстанавливается. Это было жутко не удобно, потому что приходилось либо очень быстро включать приемник и модуль, либо при включенном борте на модели перезагружать пульт, что противоречит общеизвестному порядку включения аппаратуры РУ. Я попробовал отвечать своей структурой данных на любой запрос приемника, даже на два байт 0x80 0x80, и фокус удался (благо в структуре данных, посылаемых модулем, так же содержится тот самый идентификатор, по которому в конечном счете пульт и понимает, что же это за данные). В итоге ограничение по времени на подключение борта удалось обойти.
Теперь о структуре данных. Я использовал структуру данных стандартного электрик аир модуля. Его в качестве примера и приведу и прокомментирую каждый байт этой структуры (если я понял, что это за байт))). Думаю тут все будет предельно понятно. Работа со всеми остальными структурами аналогична.
Структура данных на языке Си объявляется так:

struct HOTT_EAM_MSG {
        int8_t start_byte;                          //#01 Старт байт. Обозначает начало структуры данных. Значение фиксировано - 0x7c;
        int8_t eam_sensor_id;                   //#02 Идентификатор електрик аир модуля - 0x8e
        int8_t warning_beeps;                   //#03 Как следует из названия, это предупреждающие писки пульта. Я попробовал пару,
                                                           они отличались друг от друга незначительно тоном. Все не пробовал, в своем проекте я
                                                           использовал только предупреждение понижения порога напряжения на банке. Логика тут думаю понятная.
                                                           1=A 2=B ... or 'A' - 0x40 = 1
                                                                // Q    Достигнута минимальное напряжение банки, датчик 1
                                                                // R    Достигнута минимальное напряжение батареи 1, датчик 1
                                                                // J    Достигнута максимальное напряжение батареи 1, датчик 1
                                                                // F    Достигнута минимальная температура, датчик 1
                                                                // H    Достигнута максимальная температура, датчик 1
                                                                // S    Достигнута минимальное напряжение батареи 2, датчик 2
                                                                // K    Достигнута максимальное напряжение батареи 2, датчик 2
                                                                // G    Достигнута минимальная температура, датчик 2
                                                                // I    Достигнута максимальная температура, датчик 2
                                                                // W   Достигнут максимальный ток
                                                                // V    Достигнут порог максимального потребления mAh
                                                                // P    Достигнуто минимально напряжение главного источника питания (не понял я, какой у них главный)
                                                                // X    Достигнуто максимальное напряжение главного источника питания (не понял я, какой у них главный)
                                                                // O    Достигнута минимальная высота
                                                                // Z    достигнута максимальная высота
                                                                // C    Скорость снижения m/sec слишком высокая
                                                                // B    Скорость снижения m3/sec слишком высокая
                                                                // N    Скорость подъема m/sec слишком высокая
                                                                // M    Скорость подъема m/3sec слишком высокая

        int8_t sensor_id;                   //#04 Какое-то стандартное значение, равное 0xe0
        int8_t alarm_invers1;                   //#05 Маска выделения значения на дисплее пульта (инверсное отображнение - темный фон, светлые символы)
                                                                //Bit#  Поле выделения (бит в байте)
                                                                // 0    mAh
                                                                // 1    Батарея 1 (наверное напряжение)
                                                                // 2    Батарея 2 (наверное напряжение)
                                                                // 3    Температура 1
                                                                // 4    Температура 2
                                                                // 5    Высота
                                                                // 6    Ток
                                                                // 7    Напряжение основного питания...
        int8_t alarm_invers2;                   //#06 Маска выделения значения на дисплее пульта (инверсное отображнение - темный фон, светлые символы)
                                                                //Bit#  Поле выделения (бит в байте)
                                                                // 0    m/s
                                                                // 1    m/3s
                                                                // 2    Высота (повтор?)
                                                                // 3    m/s     (повтор?)
                                                                // 4    m/3s (повтор?)
                                                                // 5    не используется/ неизвестен
                                                                // 6    не используется/ неизвестен
                                                                // 7    "ON" sign/text msg active (похоже, включает режим всплывающего окна, по типу Throttle too high...)

        int8_t cell1_L;                         //#07 Банка 1, минимальное значение. Шаг 0.02V, 124=2.48V
        int8_t cell2_L;                         //#08 Банка 2...
        int8_t cell3_L;                         //#09 Я просто вывел в эти поля значения напряжения банок
        int8_t cell4_L;                         //#10
        int8_t cell5_L;                         //#11
        int8_t cell6_L;                         //#12
        int8_t cell7_L;                         //#13
        int8_t cell1_H;                         //#14 Банка 1, максимальное значение. Шаг 0.02V, 124=2.48V
        int8_t cell2_H;                         //#15 Банка 2...
        int8_t cell3_H;                         //#16
        int8_t cell4_H;                         //#17
        int8_t cell5_H;                         //#18
        int8_t cell6_H;                         //#19
        int8_t cell7_H;                         //#20

        int8_t batt1_voltage_L;         //#21 Минимальное напряжение батареи 1, шаг 0,1V. Младший байт. Я просто вывел сюда напряжение своей батареи.
        int8_t batt1_voltage_H;         //#22 Старший байт.

        int8_t batt2_voltage_L;         //#23 Напряжение батареи 2, шаг 0,1V. Младший байт.
        int8_t batt2_voltage_H;         //#24 Старший байт.

        int8_t temp1;                                   //#25 Температура, датчик 1. Смещение на 20 единиц: 20 = 0°, 46 = 26°
        int8_t temp2;                                   //#26 Температура, датчик 1

        int8_t altitude_L;                      //#27 Высота. единицы: метр. Смещение на 500 единиц: 500 = 0m. Младший байт.
        int8_t altitude_H;                      //#28 Старший байт.

        int8_t current_L;                               //#29 Ток, шаг 0.1А. Младший байт
        int8_t current_H;                               //#30 Старший байт

        int8_t main_voltage_L;          //#30 Напряжение главного источника питания, шаг 0.1V, младший байт
        int8_t main_voltage_H;          //#31 Старший байт

        int8_t batt_cap_L;                      //#32 Использованная емкость батареи, шаг 10mAh, младший байт
        int8_t batt_cap_H;                     //#33 Использованная емкость батареи, шаг 10mAh, старший байт

        int8_t climbrate_L;                     //#34 Скорость подъема в 0.01m/s. Смещение - 30 000 единиц. 30000 = 0.00 m/s. Младший байт.
        int8_t climbrate_H;                     //#35 Старший байт. ХЗ, как они в двубайтном слове умудрились сделать смещение в 30 000 единиц. Не разбирался.

        int8_t climbrate3s;                     //#36 Скорость подъема в m/3sec. Смещение в 120 единиц. 120 = 0m/3sec

        int8_t rpm_L;                                   //#37 RPM. Шаг: 10 об/мин. Младший байт.
        int8_t rpm_H;                                   //#38 Старший байт.

        int8_t electric_min;                    //#39 Время работы потребителей тока, в минутах. Время начинает идти, когда ток потребления превышает  3A
        int8_t electric_sec;                    //#40 То же, секунды

        int8_t speed_L;                         //#41 Воздушная скорость, km/h. Шаг 1km/h. Младший байт.
        int8_t speed_H;                         //#42 Старший байт
        int8_t stop_byte;                      //#43 Стоп байт. Значение фиксировано - 0x7d;
//      int8_t parity;                          //#44 CRC, байт контрольной суммы. Байт равен сумме всех предыдущих байтов.
};

Ну вот собственно и все.

Самодельный HeliModule для Graupner HoTT

Задумал я как-то заиметь у себя на верте девайс, который транслировал бы мне на пульт напругу побаночно, ну и общую ко всему. Посмотрел готовые девайсы от граупнера, а там либо простой датчик на 4 банки, что для меня мало, либо сундук с ненужным мне функционалом, большими габаритами и массой. В общем подходящего ничего для себя не обнаружил. Что же делать? Решено было разобраться в протоколе обмена приемников HoTT с разнообразными модулями телеметрии. Разобрался, будем паять. В конечном счете ТЗ было примерно таким.

  • мониторинг побаночно напряжения на аккумуляторах 3-6s;
  • мониторинг общего напряжения на аккумуляторе;
  • звуковая сигнализация при понижении порогового напряжения на какой-либо банке;
  • мониторинг текущего тока, потребляемого от аккумулятора;
  • подсчет потраченной емкости аккумулятора;
  • мониторинг текущих оборотов основного ротора;
  • возможность довольно простым способом задавать следующие параметры:
  • коэффициент передачи трансмиссии для подсчета текущих оборотов;
  • пороговое напряжение для банки, ниже которого пульт начинает пищать;
  • смещение нуля датчика тока;
  • чувствительность датчика тока.
  • в пульте модуль должен определяться как Electric Air и все параметры должны отображаться в стандартных окнах для этого модуля.

Ну и хорошее пожелание: компактные размеры и вес устройства на столько, на сколько позволяет мой тех процесс.

В принципе, это все параметры, которые могут быть интересны вертолетчику, большего я придумать не смог. Да и хорошо, нечего загромождать девайс не нужными с точки зрения практики опциями. Поэтому я решил назвать его гордо - HeliModule)).

В результате девайс был разработан в соответствии с ТЗ.

В виду того, что я не исключаю, что кто-то захочет повторить модуль, повествование дальше местами будет в стиле инструкции.

Основой его стал контроллер Atmel AVR Mega8 в виду своей компактности, приемлемой стоимости и достаточности. Некоторые технические особенности реализации:

Масштабирование напряжения банок было решено делать на операционных усилителях. Тут можно было конечно отделаться резистивными делителями, но в этом случае на первой банке у нас точность измерения составляет 0,02в, а к шестой она падает и на шестой банке составляет порядка 0,1в. Меня этот вариант не устроил, не люблю нелинейность в таких местах, да и склонность к перфекционизму дала о себе знать. Кстати, стандартные граупнеровские датчик напряжения и Електрик Модуль, на сколько мне известно, построены на основе резистивных делителей…

Для формирования опорного напряжение для АЦП ИОНов я не использовал, использовал простой LC фильтр. Считаю, для моих целей этого вполне достаточно. Напряжение питания задается регулируемым стабилизатором LM1117-ADJ. Он привлек своей компактностью в корпусе SOT-223 и достаточными характеристиками, а также возможностью двумя резисторами задавать напряжение. Напряжением питания контроллера и АЦП выбраны 5.1 вольта. Обусловлено это тем, что при 8 битном АЦ преобразовании цена деления у нас получается 0,019 вольта, это практически 0,02 вольта, что, в свою очередь, является минимальным шагом отображения напряжения банки в пульте. Я применял в обвязке помимо конденсаторов два резистора, которые задают выходное напряжение: 680 и 220 Ом. Сами LM1117 показали некоторую нестабильность от микросхемы к микросхеме: в одной и той же обвязке первая показывала 5,1 вольта ровно, вторая 5,12. При этом во втором случае иногда стали появляться две лишние сотки в показаниях напряжения банок (один лишний попугай АЦП). Поэтому я бы рекомендовал добиться ровно 5.1 вольта. Как это сделать и нужно ли оно Вам, решите сами. Я пока оставил второй вариант

Датчик тока… тут хотел городить сам на основе ферритового кольца и датчика Холла, а затем просто пропускать в это кольцо силовой провод АКБ, но потом решил не париться и купить готовый девайс в виде датчика ACS758. Он компактнее, с ним проще работать. Единственное сквозь него не пропустишь имеющийся провод АКБ, придется паять.
В виду того, что диапазон потребляемых токов у разных людей может быть различным, можно просто купить датчик с необходимым диапазоном из серии ACS758 или аналогичных по методу формирования выходного сигнала (пропорциональное току напряжение), питанию (5 вольт), и распиновке. В дальнейшем при настройке у нас будет возможность задать смещение нуля и чувствительность датчика тока.

Датчик оборотов потребляет импульсы размахом 5вольт. У меня этот сигнал идет с ESC, думаю с магнитных датчиков тока сигнал примерно такой же. Устройство позволяет задавать коэффициент передачи от 0,01 до 99,99. Для магнитного датчика на валу ОР коэффициент будет 1, для случаев с сигналом из ESC, датчиков оборотов, которые вешаются на провода между мотором и ESС, необходимо рассчитывать коэффициент передачи, как шестерней, так и в моторе. В моторе коэффициент передаче равен половине количества магнитов ротора. У меня передатка между валом мотора и ОР составляет 9,18, в моем моторе 8 магнитов, следовательно, моя итоговая передатка получается 9,18 х (8 / 2) = 36,72. Эту цифру мы и запишем в устройство во время настройки (об этом чуть ниже). Датчик оборотов подключается через стандартный серворазъем, в котором должны быть земля и сигнальный провод. Центральный пин не используется и физически никуда не подключен.

В качестве конструкции модуля был выбран бутерброд из двух плат с двухсторонним монтажом. Такая конструкция позволяет путем не критичного увеличения толщины и массы прилично уменьшить площадь девайса. Первый прототип, который позволял только измерять напряжение побаночно, был построен на одной плате и был площадью процентов на 40 больше. Меня этот факт очень расстраивал, и я решил изменить концепцию. Сейчас мне все нравится.
На одной плате собрана схема масштабирования напряжений и расположены разъемы для связи с внешним миром, на второй с одной стороны находится контроллер и цепи организации его питания, с другой стороны находиться датчик тока. Эта сторона полностью металлизирована (за исключением очень небольшой части, где проходят выводы датчика), и заземлена. Это, я думаю, уменьшит влияние довольно приличных токов на аналоговые цепи контроллера на столько, на сколько позволяет выбранная конструкция устройства.

На текущем этапе механизм программирования контроллера осуществляется подпайкой на специальные пяточки проводков AVR ISP программатора. Тем, кто прошивал турниги, эта схема знакома. Не стал запариваться с бутлоадерами или загромождать устройство дополнительным шестипиновым разъемом, потому как прошивать модуль часто я думаю не придется (в идеале один раз вообще).

Питание модуль берет с 4-й или с 6-й ноги балансирного разъема.
К телеметрийному разъему модуль подключает обычным проводом от серв, но слегка модернизированным. Землю мы не трогаем, а центральны провод где-то между разъемами необходимо обрезать и в месте разреза подпаять к второму сигнальному проводу. В разъеме, подключаемом к приемнику, должен отсутствовать центральный провод.

Настройка. Настройка модуля осуществляется через тот же разъем, которым он подключается к приемнику. Для настройки необходим USB – RS232 конвертер, коих у моделистов в столах вагон. Я использую от ФБЛ системы Tarot ZYX-S, также думаю подойдет и тот, через который мы все подключаем наши приемники к компу для обновления ПО, там надо только разобраться, где земля, где RxD, а где TxD. Я не разбирался.
Для входа в режим программирования необходимо освободить разъем tele от каких либо подключений, а затем подать питание на модуль, подключив к балансирному разъему ваш АКБ. Условием входа в режим программирования являются отсутствие какого либо потенциала на ножках этого разъема. Затем необходимо подключить модуль к USB конвертеру тремя проводками (GND – GND, RxD – TxD, TxD – RxD) и подключить конвертер к компьютеру.
Также нужна терминальная программа. В настройках терминалки мы выставляем скорость 19 200 бод, а остальное все как всегда (без четности, 8 бит, 1 стоп бит).

Для настройки модуля применяются команды, состоящие из одной буква (v, r, o или s) и четырех цифр.

Команда, начинающаяся с буквы ‘v’ служат для установки порогового напряжения для сигнализации просадки по банкам. Цифры выравниваются по центру, потому как есть дробная часть. Например:
v0290 – устанавливает порог 2,9 вольта,
v0300 – устанавливает порог 3,0 вольта,
v0310 – устанавливает порог 3,1 вольта.

Команда, начинающаяся с буквы ‘r’ служат для установки коэффициента передачи трансмиссии для расчета оборотов ОР. Цифры выравниваются по центру, потому как есть дробная часть. Например:
r0918 – устанавливает коэффициент передачи, равный 9,18,
r3672 – устанавливает коэффициент передачи, равный 36,72,
r0100 – устанавливает коэффициент передачи, равный 1,00.

Команда, начинающаяся с буквы ‘o’ служат для установки смещения нуля датчика тока. Рассчитывается цифра следующим методом: измеряется уровень выходного сигнала датчика при отсутствии тока через него (датчик должен быть запитан). У меня цифра получилась 0,62В, для примененного датчика это норма. Далее мы находим, сколько это в попугаях АЦП: 0,62В / (5,1В / 256) = 31. Эту цифру и записываем. Цифры выравниваются по правому краю. Например:
o0031 – устанавливает смещение, равное 31 в показаниях АЦП (или 31 х 0,02 = 0,62В),
o0030 – устанавливает смещение, равное 30 в показаниях АЦП (или 30 х 0,02 = 0,60В),
o0032 – устанавливает смещение, равное 32 в показаниях АЦП (или 32 х 0,02 = 0,64В),.

Команда, начинающаяся с буквы ‘s’ служат для установки чувствительности датчика тока. Эта цифра даже больше похожа на некий коэффициент, который переводит показания АЦП в показания тока. Рассчитывается следующим способом: (цена деления АЦП / чувствительность датчика тока) х 10. В моем случае (0,02В / 0,027) х 10 = 7,407. Цифры выравниваются по центру, потому как есть дробная часть. Например:
s0740 – для чувствительности, равной 27мВ,
s1481 – для чувствительности, равной 13,5мВ,
s0033 – для чувствительности, равной 60мВ,

На любую команду устройство, если оно ее приняло и зафиксировало, должно ответить. Например:
Команда: v0310 Ответ: 3.1 ОК
Команда: r3672 Ответ: 36.72 ОК
Команда: o0031 Ответ: 31 ОК
Команда: s0740 Ответ: 7.40 ОК

Только получив ответ можно считать, что параметр зафиксирован. После сборки и прошивки эти параметры необходимо задать. Никаких дефолтных значений в прошивке нет. Не задав эти параметры, модуль может некорректно отображать данные или не работать вообще.
Процедура возможно не сильно элегантна, но я нахожу ее вполне достаточной и вполне простой.

После настройки отключение производится в произвольном порядке.

Подключение на модели к балансирному разъему осуществляется только после подключения минусового провода АКБ к регулятору оборотов. В противном случае присутствует очень большая вероятность спалить практически любой компонент электронной системы модели (правда только один, который первый полыхнет)))). Этот момент очень важен. Я словил ситуацию, когда вертолет ожил при подключении балансирного разъема к устройству. Оказалось, что АКБ был подключен плюсовым кабелем к регулю, минусовой был разорван, и вот этот вот минус пролез через землю балансирного разъема, модуля, приемника, фбл и прилез к регулю через его провод управления. У меня погорели дорожки в модуле (сразу в трех местах участки шириной как минимум 1 мм).
В общем схема такая:

  1. Закрепили устройство;
  2. Подключили телеметрийный разъем и разъем датчика оборотов;
  3. Включили передатчик;
  4. Подключили минус АКБ к регулю;
  5. Подключили балансирный разъем;
  6. Подключили плюсовой разъем.

Другой схемы не предусмотрено. В общем ровно того же требует от нас и инструкция оригинального электрика. Так что никакого упущения в технологическом плане тут нет.

На текущий момент собран рабочий прототип, все описанные выше функции проверены и показали себя рабочими. Единственный «мутный» момент – датчик тока. По хорошему его надо калибровать. Если ноль найти не проблема, то стабилизированный ток – задача та еще. После некоторых мытарств я откалибровал свой датчик с использованием зарядного устройства всего лишь на 10А (при диапазоне в 150А). Остается все-таки верить в заявленную линейность в районе 1%. В принципе, цифры смещения нуля и чувствительности практически совпали с таковыми в ДатаШите на датчик. Если кто-то возьмется откалибровать датчик по всему диапазону и обнаружит приличную нелинейность, думаю можно будет заделать и кусочно-линейную аппроксимацию. Я хотел сначала пойти по этому пути, но у меня нет возможности задавать эталонный ток таких масштабов.

Из нюансов: на текущий момент не отображаются корректно логи в HoTT Manager и DataExplorer в разделе Electric module, но в тоже время отображаются в Log View программы Fermware Upgrade Studio. Я еще раз просмотрел структуру пакета данных обмена модуля с приемником. На мой скромный взгляд, косячить там просто негде. Поэтому я валю все это дело на прошивку приемника/пульта)))

Ну вот и все, заметку накропал, файлы к статье тут. Сегодня тут печатка, схема, файл прошивки и фотки в большем разрешении, исходники чуть-чуть подправлю и выложу.
Если есть замечания, пожалуйста, пишите. Только прошу учесть, что я не большой специалист в электронике с большим опытом, а всего лишь любитель.

Graupner MX-16 HoTT. Два тумблера на управление одним каналом.

Понадобилось мне тут заиметь хитрое управление (для кого-то может не хитрое, а я потратил пару вечеров на решение проблемы и еще один совет) двумя тумблерами одним единственным каналом. Управление должно осуществляться по следующей схеме: есть трехпозиционный тумблер. на него назначен 5 канал в аппе. Схема состояний такая: 1 положение - -100; 2 положение - 0; 3 положение - +100. Есть также еще один двух позиционный тумблер. Надо сделать так, чтобы при 1-ом положении двухпозиционного тумблера трехпозиционный работал по вышеуказанной схеме, а при 2-ом положении двухпозиционного на пятом канале было +100, независимо от положения трехпозиционного.
На верный путь к решению натолкнул Сергей Федотов (Lazy-bones), за что ему спасибо. Решение выглядит так:

  1. Назначаем пятый канал на трехпозиционный тумблер ctrl10. Делается это в меню contr set. (у меня модель вертолета).
  2. В меню free mixer надо замиксовать 5 канал на себя же. А на активацию данного миксера ставим нужный нам двухпозиционный тумблер.
  3. Далее самое то, ради чего эта запись и создавалась. Схема микширования. В принципе, ниже на скрине все видно. При такой схеме у нас при включении двухпозиционного тумблера не зависимо от состояния трехпозиционнго на пятом канале максимум расходов (+100). Если необходимо сделать -100, необходимо зеркально перенести ось offs (сделать значение -100), а в строке тревел выкрутить правое число на +100. Тогда у нас диаграмма отразится по диагонали справа сверху налево вниз.

ЗЫ. Запись в дневнике сделана как памятка: как это делается. Чтобы больше не тратить два дня и советы))) Но если кому-то она будет полезна, я буду только рад.