воскресенье, 10 апреля 2016 г.

Обучение управлению радиоуправляемым самолетом

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


Сразу скажу, начинать учится летать нужно в симуляторе. Тем более, есть открытые проекты.


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

Устройство состоит из Arduino Pro Mini ATmega328P (5V, 16MHz)


На самом деле подойдет любая ардуино с контроллером ATmega328 или ATmega168. Просто Arduino Pro Mini самая маленькая и легкая. Конечно лучше сделать специальную платку, но для начала и Pro Mini сгодится.

К ардуино подключаются приемник от аппаратуры учителя, приемник от аппаратуры ученика, регулятор и сервоприводы самолета. Кто именно управляет самолетом зависит от положения тумблера на аппаратуре учителя. Думаю уже ясно, что аппаратура учителя и соответствующий ей приемник должны иметь минимум 5 каналов. Аппаратура ученика и его приемник могут быть и 4 канальными.

Скетч

////////////////////////
//
// Arduino
//
////////////////////////
//
// Sketch: Trainer
//

// Arduino   Receiver 1
//
// D0 --- CH1 (AIL)
// D1 --- CH2 (ELE)
// D2 --- CH5
// D3 --- CH3 (THR)
// D4 --- CH4 (RUD)

// Arduino   Receiver 2
//
// A0 --- CH1 (AIL)
// A1 --- CH2 (ELE) 
// A3 --- CH3 (THR)
// A4 --- CH4 (RUD)

// Arduino   Airplane
//
// D8 --- AIL (CH1)
// D9 --- ELE (CH2)
// D11 --- THR (CH3)
// D12 --- RUD (CH4)

volatile unsigned char time = 0;

void setup()
{
    // Global disable interrupts
    cli();

    // Port B initialization
    // - - PB5 PB4 PB3 PB2 PB1 PB0
    DDRB = 0b00111111;
    PORTB = 0b00000000;

    // Port C initialization
    // - - PC5 PC4 PC3 PC2 PC1 PC0
    DDRC = 0b00000000;
    PORTC = 0b00000000;

    // Port D initialization
    // PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
    DDRD = 0b00000000;
    PORTD = 0b00000000;

    // External Interrupt initialization
    // – – – – ISC11 ISC10 ISC01 ISC00
    EICRA = (1<<ISC00);
    // – – – – – – INT1 INT0
    EIMSK = (1<<INT0);
    // – – – – – – INTF1 INTF0
    EIFR = (1<<INTF0);

    // Timer/Counter 0 initialization
    TCNT0 = 0;
    // COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
    TCCR0A = 0;
    // FOC0A FOC0B - - WGM02 CS02 CS01 CS00
    TCCR0B = 0;
    // - - - - - OCIE0B OCIE0A TOIE0
    TIMSK0 = 0;
    // - - - - - OCF0B OCF0A TOV0
    TIFR0 = 0;

    // Timer/Counter 2 initialization
    TCNT2 = 0;
    // COM2A1 COM2A0 COM2B1 COM2B0 - - WGM21 WGM20
    TCCR2A = 0;
    // FOC2A FOC2B - - WGM22 CS22 CS21 CS20
    TCCR2B = ((1<<CS22)|(1<<CS21));
    // - - - - - OCIE2B OCIE2A TOIE2
    TIMSK2 = 0;
    // - - - - - OCF2B OCF2A TOV2
    TIFR2 = 0;

    // Global enable interrupts
    sei();
}

void loop()
{
    while (1)
    {
        if ( time < 94 )
        {
            PORTB = PIND;
        }

        else
        {
            PORTB = PINC;
        }
    }
}

ISR(INT0_vect)
{
    if ( (PIND & (1<<2)) == 0 )
    {
        time = TCNT2;
    }

    else
    {
        TCNT2 = 0;
    }
}

//
// End
//
////////////////////////

Соединение компонентов описано в начале программы. Сама программа очень простая. Обработчик прерывания по внешнему сигналу INT0 измеряет длительность управляющего импульса на 5 канале приемника учителя. Если сигнал меньше 1500 микросекунд, то на выход передаются сигналы с аппаратуры учителя. Если сигнал больше 1500 микросекунд, то на выход передаются сигналы с аппаратуры ученика и управление самолетом переходит в его руки.

В заключении несколько важных замечаний. Это устройство предназначено для работы с приемниками выдающими управляющие сигналы длительностью от 1000 до 2000 микросекунд с частотой в 50 герц.

Возможно потребуется внешний BEC, так как тока выдаваемого стабилизатором ESC может не хватить на два приемника, ардуино и сервоприводы.

В реальных условиях устройство не проверялось. Был собран небольшой тестовый стендик. К выходам ардуино подключались сервоприводы HEXTRONIK HXT900. А вместо приемников использовались генераторы сигналов сделанные из ардуино нано.

Использование устройства предполагает соблюдение техники безопасности и разумных мер предосторожности. Автор проекта никакой ответственности ни за что не несет.

Есть еще один момент. При переключении управления с одного приемника на другой возможно изменение длительности отдельного управляющего импульса. Его длительность может оказаться меньше 1000 микросекунд или больше 2000 микросекунд. Сервоприводы достаточно медлительные устройства. Проблем быть не должно. Тем не менее эта особенность устройства может быть устранена. Только код придется писать уже на ассемблере.