События‎ > ‎

Перепрошивка ESC Hobbywing Skywalker 20A

Отправлено 10 янв. 2014 г., 12:04 пользователем Олег Евсегнеев   [ обновлено 10 янв. 2014 г., 12:05 ]
Наслушавшись страшных баек про отвратительные стандартные прошивки ESC, не приспособленных пол мультикоптеры, я решил перепрошить свои Hobbywing Skywalker 20A на известную прошивку BlHeli. Всё оказалось очень и очень просто, я даже сам не ожидал. Думал что придется повозиться, ан нет.

Прошиваем Arduino Uno AVR программатором

Чтобы залить на ESC новую прошивку, нам потребуется программатор. Сделаем его из обычной Arduino Uno.

1) Запускаем программу для прошивки в Arduino программатора (AvrBurnTool_v101.exe).


2) В первом пункте выбираем OwSilProg on Arduino Uno. Во втором пункте указываем COM-порт, к которому в данный момент подключен Arduino. И жмем Burn All. В результате, в окне статуса должны появиться вот такие буквы:


Если всё так, то значит программатор успешно записан на Arduino, и можно приступать к следующему шагу - прошивке самого ESC.

Прошивка BLHeli на ESC

1) Для начала необходимо подключить ESC к Arduino Uno по SPI интерфейсу. Подпаиваем к соответствующим площадкам ESC два провода. Выглядит это так:

   

2) Теперь подключаем подпаянные провода к Arduino по следующей схеме:

 Arduino Uno ESC
 MISO (12) MISO (белый)
 MOSI (11) MOSI (розовый)
 GND черный

Землю можно взять в любом удобном месте ESC: 
  • с входного провода от LiPo батареи;
  • с самой верхней площадки около MISO и MOSI;
  • с черного провода уходящего от ESC на контроллер
Проще всего, конечно, следовать последнему варианту, что я и сделал.

   

3) Далее, запускаем приложение для прошивки и настройки ESC - BLHeliTool_v122.exe


4) Выбираем тип ESC - SKYWALKER_20A. Затем версию прошивки - 10.4. Наконец, тип нашего беспилотника - MULTI. Жмем кнопку Flash.

Поле нажатия кнопки, должно выскочить окно с командной строкой, в котором отобразится процесс прошивания:


Готово!

Настройки BLHeli

Та же программа, что позволила нам прошить ESC, предоставляет возможности по настройке разных полезных параметров драйвера. Настройки эти находятся на двух вкладках "Setup Basic" и "Setup Advanced". 

   

Настроек много, но я решил пока всё оставить как есть. Если кто-то собирается управлять драйвером с помощью PPM сигнала, стоит отметить два важных параметра: 
  • Throttle Min - 1148
  • Throttle Max - 1832
Мне же проще использовать сигнал PWM.

Испытания

Итак, после успешной прошивки хорошо бы было сравнить поведение обоих ESC - со старой прошивкой и с новой. Опыт я выбрал не очень научный, прямо скажем. По уму, следовало измерять скорости вращения лопастей оптическим тахометром. У меня же все "на глазок".


Для теста был использован простой алгоритм:
  1. разгоняем двигатель до 50% тяги;
  2. 10 рез меняем тягу с 50% на 70%, каждые 128мс;
  3. 10 рез меняем тягу с 50% на 70%, каждые 64мс;
  4. 10 рез меняем тягу с 50% на 70%, каждые 32мс;
  5. 10 рез меняем тягу с 50% на 70%, каждые 16мс.

Судя по разным роликам на ютубе, у людей случались ситуации, когда в стандартной прошивке ESC вел себя настолько тупо, что это было четко видно (и слышно!) даже невооруженным глазом (ухом). Этот тест как раз пытается резко менять тягу двигателя, давая наблюдатель услышать и увидеть все гипотетические лаги и "чихания".

Тест ESC для PWM сигнала

#include "Arduino.h"

int OFF_TIMEOUT = 100;
int off_time = 0;

int CTRL_TIMEOUT = 2;
int ctrl_timeout_ = 0;
int ctrl_time = 0;
int time = 0;

int mot_pin = 9;
int raw_trg;
int pwr = 0;
int i;
int a_idx = 0;
int f_idx = 0;

bool s1_on = false;
bool flg = true;

int frs[4] = {128,64,32,16};

void setPwmFrequency( int pin, int divisor ){
    byte mode;
    if( pin == 9 ){
        switch(divisor) {
            case 1: mode = 0x01; break;
            case 8: mode = 0x02; break;
            case 64: mode = 0x03; break;
            case 256: mode = 0x04; break;
            case 1024: mode = 0x05; break;
            default: return;
        }
    }    
    if( pin == 9 ){
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
}

void blip(int count){
    for( int c=0; c<count; c++ ){
        digitalWrite(13, HIGH);
        delay(300);
        digitalWrite(13, LOW);
        delay(300);
    }
}

void init_esc(){
    delay(2000);
    analogWrite(mot_pin, 50);
    delay(2000);
    analogWrite(mot_pin, 0);
    delay(2000);
}

void start_esc(){
    int state = 0;
    for( int p=0; p<=50; p+=2 ){
        analogWrite(mot_pin, int((p/100.0)*255));
        state = !state;
        digitalWrite(13, state);
        delay(70);
    }
    pwr = 50;
    s1_on = true;
}

void stop_esc(){
    for( int p=pwr; p>0; p-=2 ){
        analogWrite(mot_pin, p);
        delay(70);
    }
    analogWrite(mot_pin, 0);
    s1_on = false;
}

void setup() {
    ctrl_timeout_ = frs[f_idx];
      
    pinMode(12, INPUT);
    pinMode(11, INPUT);
    pinMode(13, OUTPUT);
    pinMode(mot_pin, OUTPUT);

    setPwmFrequency(mot_pin, 8);

    init_esc();
    blip(5);
    start_esc();
}

void loop() {
    if( s1_on ){
        time = millis();
        if( time - ctrl_time > ctrl_timeout_ ){
            ctrl_time = time;
            if( flg )
                pwr = 50;
            else
                pwr = 70;
            analogWrite(mot_pin, int((pwr/100.0)*255));
            flg = !flg;
            a_idx++;
            if( a_idx == 20 ){
                f_idx++;
                if( f_idx==4 )
                    f_idx = 0;
                ctrl_timeout_ = frs[f_idx];
                a_idx = 0;
            }        
        }    

        if( time - off_time > OFF_TIMEOUT ){
            off_time = time;
            raw_trg = digitalRead(11);
            if( raw_trg ){
                stop_esc();
            }
        }    
    }
}

Мой тест показал, что в случае ESC Skywalker 20A, поведение стандартной прошивки не имеет резких отличий от BLHeli. Но все таки, как мне подсказывает мое ухо не испорченное медведями, шум от BLHeli все таки звучит ярче...
Но повторюсь, надо делать тахометр и всё тщательно измерять. Возможно я этим займусь, когда буду очередной раз прокачивать машину.

Ставлю ESC на квадрокоптер, вешаю новый LiPo на 3000mAh (вместо 5000), делаю новый пульт, и пробую снова летать. До кучи, через месяц приедет FPV.
Comments