Танк на 40 МГц. Энкодер для RX-18 (Heng Long)

Собираем машины, трактора и танки.

Модератор: Виктор Бобров

Аватара пользователя
Phantom
Старожил
Сообщения: 177
Зарегистрирован: Сб мар 31, 2018 8:07 pm
Репутация: 9

Танк на 40 МГц. Энкодер для RX-18 (Heng Long)

Сообщение Phantom »

Модель танка изначально на 40 мгц. Не Heng long. Но очень хотелось ее переделать на современную аппаратуру.
На сайте паркфлаер есть статья как это все сделать, но автор, который это сделал, практически не заходит на сайт(
Мне не понятно, какие контакты куда подключать.
Может тут кто поможет. Да, модуль сам RX-18 есть.
~The Phantom~
Аватара пользователя
Phantom
Старожил
Сообщения: 177
Зарегистрирован: Сб мар 31, 2018 8:07 pm
Репутация: 9

Re: Танк на 40 МГц. Энкодер для RX-18 (Heng Long)

Сообщение Phantom »

Наконец то я разобрался с танком (С энкодером)! Я повторюсь прошивка arduino nano или pro mini - проходит только в версии 1.6.5! Почему так, я не знаю! Кто сможет перевести в новую версию ардуино - приветствуется!
Выкладываю оригинальные файлы и раскладку каналов передатчика:
P.S. Я указал оригинальную раскладку каналов и свою (у вас она может быть другая).
| Показать
ArduHLTX .rar
(6.26 КБ) 184 скачивания
Дополнительно:
Используется канал 6 в качестве микшера в передатчике, чтобы вызвать выстрел из пушки (k) напрямую, не вызывая действия заряжания пули BB и стрельбы. Где (k) - переменная из кода!

Распиновка пинов в arduino плате указана в архиве с прошивкой!

Так же добавляю статью с rcgroups, где сделали изменения в прошивки и благодаря им - все заработало! Спасибо этому человеку, за проделаную работу и уделённое время! Этого я ждал очень долго!
| Показать
https://www.rcgroups.com/forums/showthr ... uino/page3
(35 сообщение)

Схема подключения всех проводов самого модуля RX-18 Heng Long, но я думаю в первой есть ошибки! В второй схеме вроде все нормально, по ней подключал arduino!
№1 -
| Показать
Имеются ошибки!
Имеются ошибки!
Схема подключения №1 RX-18 .png (180.8 КБ) 3657 просмотров
№2 -
| Показать
Подключал по ней arduino!
Подключал по ней arduino!
Cхема подключения №2 RX-18.jpg (37.17 КБ) 3657 просмотров
~The Phantom~
Аватара пользователя
Phantom
Старожил
Сообщения: 177
Зарегистрирован: Сб мар 31, 2018 8:07 pm
Репутация: 9

Re: Танк на 40 МГц. Энкодер для RX-18 (Heng Long)

Сообщение Phantom »

Всем Привет! Выкладываю нормальный код с всеми настройками для обычного приемника (PWM (PPM)), для использования другого приемника читайте выше.
P.S. Наконец - то нашелся, человек на форуме rcgroups, из которого изначально, эта статья! Все сделал и выложил!!!
На днях выложу видео работы....
Вложения
ArduHLTX.rar
(1.54 КБ) 159 скачиваний
~The Phantom~
Аватара пользователя
Phantom
Старожил
Сообщения: 177
Зарегистрирован: Сб мар 31, 2018 8:07 pm
Репутация: 9

Re: Танк на 40 МГц. Энкодер для RX-18 (Heng Long)

Сообщение Phantom »

Наконец то соберу танк - нашел полную раскадировку каналов как должно быть!
И еще самое главное танк запускается и при движение вперед танк зависает, и исправляется это все выключением.
Но и эта ошибка исправлена.
Все на ссылке расписано под спойлером или внизу:
| Показать
https://tankspb.com/index.php/topic,683.0.htm
Продублирую еще здесь на всякий случай:

Скетч для заливки в arduino (работает 1.8.15)
P.S. В отличие от старой! Выше версии Arduino не проверял.
Сам Код | Показать
#include <Arduino.h>
#include <avr/wdt.h>


#define NORMAL // 5 channels, pins 2,4,5,6,7

#define SERIAL_BAUD_RATE 115200
#define OUT_PIN 11


#define LEDPIN_PINMODE pinMode (13, OUTPUT);
#define LEDPIN_TOGGLE PINB |= 1<<5; //switch LEDPIN state (digital PIN 13)
#define LEDPIN_OFF PORTB &= ~(1<<5);
#define LEDPIN_ON PORTB |= (1<<5);


static uint32_t time = 0;
static uint32_t cycleTime = 0;
extern uint16_t rcValue[];


void setup()
{
LEDPIN_PINMODE
LEDPIN_ON

pinMode(OUT_PIN,OUTPUT); // 11
TCCR2B = (1<<CS22);
TCCR2A = (1<<WGM21);
OCR2A = 72; // 124 = 500us
TIMSK2 |= (1<<OCIE2A); // enable tim2 interrupt

setupRX();
setupMotor();
// SerialOpen(uint32_t baud);

wdt_enable(WDTO_2S);
cycleTime = millis();
}


volatile uint8_t count = 0;


#define OUT_TOGGLE PINB |= 1<<3
#define OUT_OFF PORTB &= ~(1<<3)
#define OUT_ON PORTB |= (1<<3)


uint8_t bitdata[70];
boolean last;


ISR(TIMER2_COMPA_vect)
{
if (count < 3) OUT_ON; // 1ms gap
else if (count < 4) {OUT_OFF; last = true;}
else if (count < 66) // 2*4*8 = 64
{
if (count & 0x01) OUT_TOGGLE;
else
{
boolean act = bitdata[count>>1];
if (act == last) OUT_TOGGLE;
else last = act;
}
}
else { OUT_OFF; return; }
count++;
};


// timing:
// 24ms cycletime
// 4ms gap
// 1ms pulse
// data in 0.3ms pulses, 2 pulse/bit ca 60 pulse, 4 byte


// 01234567 89012 34567 89012 34 5678 90
// message: 11111100 01111 00000 01111 00 0000 00
// nrz msg: 00000010 01000 10000 01000 10 0000 00
// fwd krldu left mg cccc
// m-motor, u-up, d-down, l-turleft, r-turright, c-checksum
// g=mg k=fire


extern uint16_t motor[2];
extern uint16_t servo[2];


void loop ()
{
int8_t i;
int16_t num;
boolean m,l,r,g,k,d,u;
int8_t v1,v2;
time = millis();

readRX();


if (time >= cycleTime)
{
wdt_reset();
cycleTime += 23;
count = 0; // tell driver to restart

for (i=2;i<8;i++) bitdata = 1;


d = (rcValue[0] > 1700);
bitdata[18] = d;
k = (rcValue[5] < 1300);
bitdata[15] = k; // fire
g = (rcValue [5]> 1950);
bitdata[26] = g; // mg fire


// fwd rev
v1 = (rcValue[2]-1035)/30; // 1500 -> 15.5
bitdata[10] = (v1 & 0x10) >> 4;
bitdata[11] = (v1 & 0x08) >> 3;
bitdata[12] = (v1 & 0x04) >> 2;
bitdata[13] = (v1 & 0x02) >> 1;
bitdata[14] = v1 & 0x01;

// left right
v2 = (rcValue[1]-1035)/30; // 1500 -> 15.5
bitdata[20] = (v2 & 0x10) >> 4;
bitdata[21] = (v2 & 0x08) >> 3;
bitdata[22] = (v2 & 0x04) >> 2;
bitdata[23] = (v2 & 0x02) >> 1;
bitdata[24] = v2 & 0x01;


l = (rcValue[3] > 1700);
bitdata[17] = l;
r = (rcValue[3] < 1300);
bitdata[16] = r;


m = (rcValue[4] > 1700);
bitdata[25] = m; //motor
u = (rcValue[0] < 1300);
bitdata[19] = u;


// checksum
bitdata[27] = bitdata[ 9] ^ bitdata[13] ^ bitdata[17] ^ bitdata[21];
bitdata[28] = bitdata[10] ^ bitdata[14] ^ bitdata[18] ^ bitdata[22];
bitdata[29] = bitdata[11] ^ bitdata[15] ^ bitdata[19] ^ bitdata[23] ^ bitdata[25];
bitdata[30] = bitdata[12] ^ bitdata[16] ^ bitdata[20] ^ bitdata[24] ^ bitdata[26];
int16_t fr,lr,lm,rm;
fr = rcValue[2] - 1500;
lr = rcValue[1] - 1500;
lm = constrain(fr - lr,0,1000);
rm = constrain(fr + lr,0,1000);
motor[0] = lm>>2;
motor[1] = rm>>2;
writeMotor();
}
}

#include <wiring.c>


#define RX_BUFFER_SIZE 64
#define TX_BUFFER_SIZE 64
#define INBUF_SIZE 64


static volatile uint8_t serialHeadRX,serialTailRX;
static uint8_t serialBufferRX[RX_BUFFER_SIZE];
static volatile uint8_t serialHeadTX,serialTailTX;
static uint8_t serialBufferTX[TX_BUFFER_SIZE];
static uint8_t serialBuffer[INBUF_SIZE]; // this hold the imcoming string from serial O string
static uint8_t readIndex;


uint16_t read16() {
uint16_t t = read8();
t+= (uint16_t)read8()<<8;
return t;
}
uint8_t read8() {
return serialBuffer[readIndex++];
}


void serialize8(uint8_t a)
{
uint8_t t = serialHeadTX;
if (++t >= TX_BUFFER_SIZE) t = 0;
serialBufferTX[t] = a;
serialHeadTX = t;
}


ISR(USART_UDRE_vect)
{ // Serial 0 on a PROMINI
uint8_t t = serialTailTX;
if (serialHeadTX != t) {
if (++t >= TX_BUFFER_SIZE) t = 0;
UDR0 = serialBufferTX[t]; // Transmit next byte in the ring
serialTailTX = t;
}
if (t == serialHeadTX) UCSR0B &= ~(1<<UDRIE0); // Check if all data is transmitted . if yes disable transmitter UDRE interrupt
}


void UartSendData()
{
UCSR0B |= (1<<UDRIE0);
}


static void inline SerialOpen(uint32_t baud)
{
uint8_t h = ((F_CPU / 4 / baud -1) / 2) >> 8;
uint8_t l = ((F_CPU / 4 / baud -1) / 2);
UCSR0A = (1<<U2X0); UBRR0H = h; UBRR0L = l; UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
}


static void inline SerialEnd(uint8_t port)
{
UCSR0B &= ~((1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<UDRIE0));
}


extern boolean rxFrameFlags;
uint16_t spekTimeLast; // counts every ms, 65000 ms = 65 sec


static void inline store_uart_in_buf(uint8_t data)
{
#if defined(SPEK)
if (!rxFrameFlags)
{
sei();
uint16_t spekTimeNow = timer0_overflow_count;
uint16_t spekInterval = spekTimeNow - spekTimeLast;
spekTimeLast = spekTimeNow;
if (spekInterval > 2)
{
serialTailRX = 0;
serialHeadRX = 0;
rxFrameFlags = true;
}
cli();
}
#endif


uint8_t h = serialHeadRX;
if (++h >= RX_BUFFER_SIZE) h = 0;
if (h == serialTailRX) return; // we did not bite our own tail?
serialBufferRX[serialHeadRX] = data;
serialHeadRX = h;
}


ISR(USART_RX_vect) { store_uart_in_buf(UDR0); }


uint8_t SerialRead()
{
uint8_t t = serialTailRX;
uint8_t c = serialBufferRX[t];
if (serialHeadRX != t) {
if (++t >= RX_BUFFER_SIZE) t = 0;
serialTailRX = t;
}
return c;
}


uint8_t SerialAvailable()
{
return ((uint8_t)(serialHeadRX - serialTailRX))%RX_BUFFER_SIZE;
}


void SerialWrite(uint8_t c)
{
serialize8(c);
UartSendData();
}


//------------------------------------------------


char digit10000(uint16_t v) {return '0' + v / 10000;}
char digit1000(uint16_t v) {return '0' + v / 1000 - (v/10000) * 10;}
char digit100(uint16_t v) {return '0' + v / 100 - (v/1000) * 10;}
char digit10(uint16_t v) {return '0' + v / 10 - (v/100) * 10;}
char digit1(uint16_t v) {return '0' + v - (v/10) * 10;}


void printChar(const char *s)
{
while (*s) {serialize8(*s++);}
}


void print_uint8(uint8_t unit)
{
char line[6] = " ";
line[0] = digit100(unit);
line[1] = digit10(unit);
line[2] = digit1(unit);
printChar(line);
}
void print_uint16(uint16_t unit)
{
char line[6] = " ";
line[0] = digit10000(unit);
line[1] = digit1000(unit);
line[2] = digit100(unit);
line[3] = digit10(unit);
line[4] = digit1(unit);
printChar(line);
}
void print_int16(int16_t v) {
uint16_t unit;
char line[7] = " ";
if (v < 0 ) {
unit = -v;
line[0] = '-';
} else {
unit = v;
line[0] = ' ';
}
line[1] = digit10000(unit);
line[2] = digit1000(unit);
line[3] = digit100(unit);
line[4] = digit10(unit);
line[5] = digit1(unit);
printChar(line);
}



uint16_t motor[2];
uint16_t servo[2];


void setupMotor()
{
// 1000hz, 0..255
#if !defined(NORMAL)
pinMode( 6,OUTPUT);
pinMode( 5,OUTPUT);
TCCR0A |= _BV(COM0A1); // connect pin 6 to timer 0 channel A
TCCR0A |= _BV(COM0B1); // connect pin 5 to timer 0 channel B
#endif

pinMode( 9,OUTPUT);
pinMode(10,OUTPUT);
TCCR1A = (1<<WGM11);
TCCR1B = (1<<WGM12) | (1<<WGM13);
TCCR1A |= (1<<COM1A1); // connect pin 9 to timer 1 channel A
TCCR1A |= (1<<COM1B1); // connect pin 10 to timer 1 channel B
ICR1 = 0x9F60; // 20ms
TCCR1B |= (1<<CS11);

// test
motor[0] = 0;
motor[1] = 0;
servo[0] = 1500; // 1,5ms
servo[1] = 1500;
writeMotor();
}


void writeMotor()
{
#if !defined(NORMAL)
OCR0A = motor[0]; // Pin6 0..255
OCR0B = motor[1]; // Pin5 0..255
#endif
OCR1A = servo[0]<<1; // pin 9 PB5
OCR1B = servo[1]<<1; // pin 10 PB6
}



#define RC_CHANS 8
uint16_t rcValue[RC_CHANS];
boolean rxFrameDone;
boolean rxFrameFlags;


#if defined(NORMAL)
#define PCINT_RX_BITS (1<<2),(1<<3),(1<<4),(1<<5),(1<<6),(1<<7)

void setupRX()
{
uint8_t i;
for (i=0;i<RC_CHANS;i++) rcValue = 1500;

// PCINT activation
// PD2=pcint18, PD4=pcint20, PD5=pcint21, PD6=pcint22, PD7=pcint23
PORTD = (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);
PCMSK2 = (1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);

PCICR = (1<<2);
}

// port change Interrupt
ISR(PCINT2_vect)
{ //this ISR is common to every receiver channel, it is call everytime a change state occurs on a RX input pin
uint8_t mask;
uint8_t pin;
uint16_t cTime,dTime;
static uint16_t edgeTime[6];
static uint8_t PCintLast;

pin = PIND;

mask = pin ^ PCintLast; // doing a ^ between the current interruption and the last one indicates wich pin changed
cTime = micros(); // micros() return a uint32_t, but it is not usefull to keep the whole bits => we keep only 16 bits
sei(); // re enable other interrupts at this point, the rest of this interrupt is not so time critical and can be interrupted safely
PCintLast = pin; // we memorize the current state of all PINs [D0-D7]

if (mask & (1<<2))
{
if (pin & (1<<2)) edgeTime [0] = cTime;
else rcValue [0] = cTime-edgeTime[0]; }
if (mask & (1<<4))
{
if (pin & (1<<4)) edgeTime[1] = cTime;
else rcValue[1] = cTime-edgeTime[1];
}
if (mask & (1<<5))
{
if (pin & (1<<5)) edgeTime[2] = cTime;
else rcValue[2] = cTime-edgeTime[2];
}
if (mask & (1<<6))
{
if (pin & (1<<6)) edgeTime[3] = cTime;
else rcValue[3] = cTime-edgeTime[3];
}
if (mask & (1<<7))
{
if (pin & (1<<7)) edgeTime[4] = cTime;
else rcValue[4] = cTime-edgeTime[4];
}
if (mask & (1<<3))
{
if (pin & (1<<3)) edgeTime[5] = cTime;
else rcValue[5] = cTime-edgeTime[5];
}
}

void readRX(void) {}
#endif


#if defined(PPMSUM)
#define IN_PIN 2


void setupRX()
{
uint8_t i;
for (i=0;i<RC_CHANS;i++) rcValue = 1500;
pinMode (IN_PIN, INPUT);
attachInterrupt(0, rxInt, RISING); //PIN 2
}


static uint16_t lastrx = 0;
static uint8_t chan = 0;

void rxInt()
{
uint16_t now,diff;

now = micros();
diff = now - lastrx;
lastrx = now;
if(diff>3000) chan = 0;
else
{
if(900<diff && diff<2200 && chan<RC_CHANS ) rcValue[chan] = diff;
chan++;
if (chan == 6) rxFrameDone = true;
}
}

void readRX(void) {}
#endif


#if defined(SBUS)
#define SBUS_OFFSET 988
#define SBUS_SYNCBYTE 0x0F
static uint8_t sbusIndex=0;
static uint8_t sbus[25]={0};


void setupRX()
{
uint8_t i;
for (i=0;i<RC_CHANS;i++) rcValue = 1500;
SerialOpen(100000);
UCSR0C |= (1<<UPM01)|(1<<USBS0);
}


void readRX(void)
{
while(SerialAvailable()){
int val = SerialRead();
if(sbusIndex==0 && val != SBUS_SYNCBYTE) continue;
sbus[sbusIndex++] = val;
if(sbusIndex==25){
sbusIndex=0;
rxFrameFlags = false;
rcValue[0] = ((sbus[1]|sbus[2]<< 8) & 0x07FF)/2+SBUS_OFFSET;
rcValue[1] = ((sbus[2]>>3|sbus[3]<<5) & 0x07FF)/2+SBUS_OFFSET;
rcValue[2] = ((sbus[3]>>6|sbus[4]<<2|sbus[5]<<10) & 0x07FF)/2+SBUS_OFFSET;
rcValue[3] = ((sbus[5]>>1|sbus[6]<<7) & 0x07FF)/2+SBUS_OFFSET;
rcValue[4] = ((sbus[6]>>4|sbus[7]<<4) & 0x07FF)/2+SBUS_OFFSET;
rcValue[5] = ((sbus[7]>>7|sbus[8]<<1|sbus[9]<<9) & 0x07FF)/2+SBUS_OFFSET;
rcValue[6] = ((sbus[9]>>2|sbus[10]<<6) & 0x07FF)/2+SBUS_OFFSET;
rcValue[7] = ((sbus[10]>>5|sbus[11]<<3) & 0x07FF)/2+SBUS_OFFSET; // & the other 8 + 2 channels if you need them
rxFrameDone = true;
}
}
}
#endif


#if defined(SUMD)
#define SUMD_SYNCBYTE 0xA8
#define SUMD_MAXCHAN 8
#define SUMD_BUFFSIZE SUMD_MAXCHAN*2 + 5 // 6 channels + 5 -> 17 bytes for 6 channels
static uint8_t sumdIndex=0;
static uint8_t sumdSize=0;
static uint8_t sumd[SUMD_BUFFSIZE]={0};


void setupRX()
{
uint8_t i;
for (i=0;i<RC_CHANS;i++) rcValue = 1500;
SerialOpen(100000);
}


void readRX(void)
{
while (SerialAvailable())
{
int val = SerialRead();
if(sumdIndex == 0 && val != SUMD_SYNCBYTE) continue;
if(sumdIndex == 2) sumdSize = val;
if(sumdIndex < SUMD_BUFFSIZE) sumd[sumdIndex] = val;
sumdIndex++;

if(sumdIndex == sumdSize*2+5)
{
sumdIndex = 0;
if (sumdSize > SUMD_MAXCHAN) sumdSize = SUMD_MAXCHAN;
for (uint8_t b = 0; b < sumdSize; b++)
rcValue = ((sumd[2*b+3]<<8) | sumd[2*b+4])>>3;
rxFrameDone = true;
}
}
}
#endif


#if defined(SPEK)
#define SPEK_FRAME_SIZE 16
#if (SPEK == 1024)
#define SPEK_CHAN_SHIFT 2 // Assumes 10 bit frames, that is 1024 mode.
#define SPEK_CHAN_MASK 0x03 // Assumes 10 bit frames, that is 1024 mode.
#define SPEK_DATA_SHIFT // Assumes 10 bit frames, that is 1024 mode.
#endif
#if (SPEK == 2048)
#define SPEK_CHAN_SHIFT 3 // Assumes 11 bit frames, that is 2048 mode.
#define SPEK_CHAN_MASK 0x07 // Assumes 11 bit frames, that is 2048 mode.
#define SPEK_DATA_SHIFT >> 1 // Assumes 11 bit frames, that is 2048 mode.
#endif


void setupRX()
{
uint8_t i;
for (i=0;i<RC_CHANS;i++) rcValue = 1500;
SerialOpen(115200);
}


uint32_t spekLast;
uint8_t lastavail = 0;


void readRX()
{
if (rxFrameFlags) { //The interrupt handler saw at least one valid frame start since we were last here.
if (SerialAvailable() == SPEK_FRAME_SIZE) { //A complete frame? If not, we'll catch it next time we are called.
SerialRead(); SerialRead(); //Eat the header bytes
for (uint8_t b = 2; b < SPEK_FRAME_SIZE; b += 2) {
uint8_t bh = SerialRead();
uint8_t bl = SerialRead();
uint8_t spekChannel = 0x0F & (bh >> SPEK_CHAN_SHIFT);
if (spekChannel < RC_CHANS) rcValue[spekChannel] = 988 + ((((uint16_t)(bh & SPEK_CHAN_MASK) << 8) + bl) SPEK_DATA_SHIFT);
}
rxFrameFlags = false;
rxFrameDone = true;
}
}
}
#endif


#if defined(IBUS)
#define IBUS_BUFFSIZE 32
static uint8_t ibusIndex=0;
static uint8_t ibus[IBUS_BUFFSIZE]={0};


void setupRX()
{
uint8_t i;
for (i=0;i<RC_CHANS;i++) rcValue = 1500;
SerialOpen(100000);
}


void readRX(void)
{
uint8_t i;
uint16_t chksum,rxsum;
uint8_t avail = SerialAvailable();
while (avail)
{
uint8_t val = SerialRead();
if(ibusIndex == 0 && val != 0x20) { continue; }
if(ibusIndex == 1 && val != 0x40) { ibusIndex = 0; continue; }
if(ibusIndex < IBUS_BUFFSIZE) ibus[ibusIndex] = val;
ibusIndex++;

if(ibusIndex == IBUS_BUFFSIZE)
{
ibusIndex = 0;
chksum = 0xFFFF;
for (i=0;i<30;i++) chksum -= ibus;
rxsum = ibus[30] + (ibus[31]<<8);
if (chksum == rxsum)
{
rcValue[0] = (ibus[ 3]<<8) + ibus[ 2];
rcValue[1] = (ibus[ 5]<<8) + ibus[ 4];
rcValue[2] = (ibus[ 7]<<8) + ibus[ 6];
rcValue[3] = (ibus[ 9]<<8) + ibus[ 8];
rcValue[4] = (ibus[11]<<8) + ibus[10];
rcValue[5] = (ibus[13]<<8) + ibus[12];
rcValue[6] = (ibus[15]<<8) + ibus[14];
rcValue[7] = (ibus[17]<<8) + ibus[16];
rxFrameDone = true;
}
}
}
}
#endif

Каналы - PIN Arduino 6 CH.
Подключение 6 channels,
pin 2 - RX - 3 CH,
pin 3 - RX - 6 CH - пулемёт
pin 4 - RX - 1 CH,
pin 5 - RX - 2 CH,
pin 6 - RX - 4 CH,
pin 7 - RX - 5 CH - завод танка

Все работает прекрасно. Может выскочить один неприятный момент, а именно придвижении вперед вдруг заклинивает систему и ничего нельзя сделать пока не выключишь питание. Это связано с тем, что у каждого приемника свои конечные точки, поэтому иногда происходит перехлест управляющего сигнала. Убирается это очень просто, поставьте на 2- CN не на 100 % а на 90 %, поверьте при этом ничего не теряется, управление очень плавное.
Последний раз редактировалось Phantom Чт ноя 17, 2022 10:35 am, всего редактировалось 1 раз.
~The Phantom~
Аватара пользователя
Phantom
Старожил
Сообщения: 177
Зарегистрирован: Сб мар 31, 2018 8:07 pm
Репутация: 9

Re: Танк на 40 МГц. Энкодер для RX-18 (Heng Long)

Сообщение Phantom »

Вот мой танк с этим модулем! Правда требует еще настроек....Но смысл в том что он работает!
https://disk.yandex.ru/i/Kl5pPKNQf-eVGg

P. S, Спасибо форуму я указывал его в предыдущим сообщении. С 2019 г. Я оставил на rcgroups вопрос - дали только 30.06.2019. И после сделали все то что нужно! Но не было раскладки каналов, а без них настройка не возможна, а вот выше сообщением - указанном форуме -на нашем! - Все повторили и даже исправили ошибку с зависанием!!!!
~The Phantom~
Ответить

Вернуться в «Автомоделизм»