Compare commits

...

22 Commits

Author SHA1 Message Date
Oleg Kalachev
75b63ad77d Merge branch 'master' into recent-px4 2021-11-25 23:41:36 +03:00
Oleg Kalachev
36a4962bc0 www: add link to topics list page in topic viewer 2021-11-25 23:41:24 +03:00
Oleg Kalachev
140535b0b4 Merge branch 'master' into recent-px4 2021-11-25 23:36:30 +03:00
Oleg Kalachev
2cd3be1139 optical_flow: ability to change default flow gyro values 2021-11-25 23:36:20 +03:00
Oleg Kalachev
6909ba5819 www: change background when connection in closed in topics view 2021-11-25 23:27:09 +03:00
Oleg Kalachev
2a8c85144e Merge branch 'master' into recent-px4 2021-11-25 22:55:46 +03:00
Oleg Kalachev
f1783bdd0b selfcheck.py: ignore some records of error log in report 2021-11-25 22:54:45 +03:00
Oleg Kalachev
528be179e6 selfcheck.py: parse warnings from error log correctly 2021-11-25 22:49:31 +03:00
Oleg Kalachev
fe588e7af9 blocks: raise exception when cannot connect to pigpiod 2021-11-22 20:16:10 +03:00
Oleg Kalachev
15551db840 docs: add redirect from /gpio 2021-11-22 20:10:39 +03:00
Oleg Kalachev
65bc74b5ec docs: some updates to optical flow article 2021-11-19 10:16:10 +03:00
Oleg Kalachev
ac4f16f973 selfcheck.py: fix and simplify firmware version parsing, remove Clover firmware warning 2021-11-19 10:14:41 +03:00
Oleg Kalachev
baf8b736d4 selfcheck.py: make not finding vcgencmd not a failure 2021-11-19 09:47:45 +03:00
Oleg Kalachev
bb318ce93f selfcheck.py: add gzclient and gzserver to cpu eaters whitelist 2021-11-19 09:47:07 +03:00
Oleg Kalachev
d7b6968fee selfcheck.py: remove timestamps from selfcheck reports 2021-11-19 09:46:46 +03:00
Oleg Kalachev
08f6aa7aee docs: update 2021-11-18 14:43:21 +03:00
Oleg Kalachev
d5e729c66c docs: update firmware flashing section 2021-11-16 09:09:50 +03:00
Oleg Kalachev
27c83d062c docs: use enumerated list for consistency 2021-11-16 07:40:27 +03:00
Oleg Kalachev
04bc9fb017 docs: some updates in setup section 2021-11-16 07:32:02 +03:00
Oleg Kalachev
b2928dd536 docs: info on no mags found error 2021-11-16 07:31:01 +03:00
Oleg Kalachev
2a4163cbeb docs: update PX4 docs links 2021-11-16 07:30:33 +03:00
Oleg Kalachev
d1edc95ab5 docs: minor fix 2021-11-16 07:28:31 +03:00
15 changed files with 70 additions and 64 deletions

View File

@@ -53,6 +53,7 @@ private:
std::unique_ptr<tf2_ros::Buffer> tf_buffer_; std::unique_ptr<tf2_ros::Buffer> tf_buffer_;
std::unique_ptr<tf2_ros::TransformListener> tf_listener_; std::unique_ptr<tf2_ros::TransformListener> tf_listener_;
bool calc_flow_gyro_; bool calc_flow_gyro_;
float flow_gyro_default_;
void onInit() void onInit()
{ {
@@ -69,6 +70,7 @@ private:
roi_px_ = nh_priv.param("roi", 128); roi_px_ = nh_priv.param("roi", 128);
roi_rad_ = nh_priv.param("roi_rad", 0.0); roi_rad_ = nh_priv.param("roi_rad", 0.0);
calc_flow_gyro_ = nh_priv.param("calc_flow_gyro", false); calc_flow_gyro_ = nh_priv.param("calc_flow_gyro", false);
flow_gyro_default_ = nh_priv.param("flow_gyro_default", NAN);
img_pub_ = it_priv.advertise("debug", 1); img_pub_ = it_priv.advertise("debug", 1);
flow_pub_ = nh.advertise<mavros_msgs::OpticalFlowRad>("mavros/px4flow/raw/send", 1); flow_pub_ = nh.advertise<mavros_msgs::OpticalFlowRad>("mavros/px4flow/raw/send", 1);
@@ -194,9 +196,9 @@ private:
uint32_t integration_time_us = integration_time.toSec() * 1.0e6; uint32_t integration_time_us = integration_time.toSec() * 1.0e6;
// Calculate flow gyro // Calculate flow gyro
flow_.integrated_xgyro = NAN; flow_.integrated_xgyro = flow_gyro_default_;
flow_.integrated_ygyro = NAN; flow_.integrated_ygyro = flow_gyro_default_;
flow_.integrated_zgyro = NAN; flow_.integrated_zgyro = flow_gyro_default_;
if (calc_flow_gyro_) { if (calc_flow_gyro_) {
try { try {

View File

@@ -201,18 +201,13 @@ def check_fcu():
if version_str == '': if version_str == '':
info('no version data available from SITL') info('no version data available from SITL')
r = re.compile(r'^FW (git tag|version): (v?\d\.\d\.\d.*)$') for line in version_str.split('\n'):
is_clover_firmware = False if line.startswith('FW version: '):
for ver_line in version_str.split('\n'): info(line[len('FW version: '):])
match = r.search(ver_line) elif line.startswith('FW git tag: '):
if match is not None: info(line[len('FW git tag: '):])
field, version = match.groups() elif line.startswith('HW arch: '):
info('firmware %s: %s' % (field, version)) info(line[len('HW arch: '):])
if 'clover' in version or 'clever' in version:
is_clover_firmware = True
if not is_clover_firmware:
failure('not running Clover PX4 firmware, https://clover.coex.tech/firmware')
est = get_param('SYS_MC_EST_GROUP') est = get_param('SYS_MC_EST_GROUP')
if est == 1: if est == 1:
@@ -648,13 +643,22 @@ def check_clover_service():
elif 'failed' in output: elif 'failed' in output:
failure('service failed to run, check your launch-files') failure('service failed to run, check your launch-files')
r = re.compile(r'^(.*)\[(FATAL|ERROR)\] \[\d+.\d+\]: (.*?)(\x1b(.*))?$') BLACKLIST = 'Unexpected command 520', 'Time jump detected'
r = re.compile(r'^(.*)\[(FATAL|ERROR| WARN)\] \[\d+.\d+\]: (.*?)(\x1b(.*))?$')
error_count = OrderedDict() error_count = OrderedDict()
try: try:
for line in open('/tmp/clover.err', 'r'): for line in open('/tmp/clover.err', 'r'):
skip = False
for substr in BLACKLIST:
if substr in line:
skip = True
if skip:
continue
node_error = r.search(line) node_error = r.search(line)
if node_error: if node_error:
msg = node_error.groups()[1] + ': ' + node_error.groups()[2] msg = node_error.groups()[1].strip() + ': ' + node_error.groups()[2]
if msg in error_count: if msg in error_count:
error_count[msg] += 1 error_count[msg] += 1
else: else:

View File

@@ -3,11 +3,13 @@ const ros = new ROSLIB.Ros({ url: url });
ros.on('connection', function () { ros.on('connection', function () {
document.body.classList.add('connected'); document.body.classList.add('connected');
document.body.classList.remove('closed');
init(); init();
}); });
ros.on('close', function () { ros.on('close', function () {
document.body.classList.remove('connected'); document.body.classList.remove('connected');
document.body.classList.add('closed');
setTimeout(function() { setTimeout(function() {
// reconnect // reconnect
ros.connect(url); ros.connect(url);
@@ -37,13 +39,14 @@ function viewTopicsList() {
let rosdistro; let rosdistro;
function viewTopic(topic) { function viewTopic(topic) {
title.innerHTML = topic; let index = '<a href=topics.html>Topics</a>';
title.innerHTML = `${index}: ${topic}`;
topicMessage.style.display = 'block'; topicMessage.style.display = 'block';
ros.getTopicType(topic, function(typeStr) { ros.getTopicType(topic, function(typeStr) {
const [pack, type] = typeStr.split('/'); const [pack, type] = typeStr.split('/');
let href = `https://docs.ros.org/en/${rosdistro}/api/${pack}/html/msg/${type}.html`; let href = `https://docs.ros.org/en/${rosdistro}/api/${pack}/html/msg/${type}.html`;
title.innerHTML = `${topic} <a id="topic-type" href=${href} target="_blank">${typeStr}</a>`; title.innerHTML = `${index}: ${topic} <a id="topic-type" href=${href} target="_blank">${typeStr}</a>`;
}); });
new ROSLIB.Topic({ ros: ros, name: topic }).subscribe(function(msg) { new ROSLIB.Topic({ ros: ros, name: topic }).subscribe(function(msg) {

View File

@@ -17,6 +17,7 @@
} }
#topic-type { font-family: monospace; font-size: 0.5em; vertical-align: super; font-weight: normal; } #topic-type { font-family: monospace; font-size: 0.5em; vertical-align: super; font-weight: normal; }
.topic { font-family: monospace; } .topic { font-family: monospace; }
body.closed { background-color: rgb(207, 207, 207); }
</style> </style>
</head> </head>
<body> <body>

View File

@@ -464,7 +464,7 @@ Blockly.Python.led_count = function(block) {
function pigpio() { function pigpio() {
Blockly.Python.definitions_['import_pigpio'] = 'import pigpio'; Blockly.Python.definitions_['import_pigpio'] = 'import pigpio';
Blockly.Python.definitions_['init_pigpio'] = 'pi = pigpio.pi()'; Blockly.Python.definitions_['init_pigpio'] = 'pi = pigpio.pi()\nif not pi.connected: raise Exception(\'Cannot connect to pigpiod\')';
} }
const GPIO_READ = `\ndef gpio_read(pin): const GPIO_READ = `\ndef gpio_read(pin):

View File

@@ -17,7 +17,7 @@
* [Работа с FS-A8S](rc_flysky_a8s.md) * [Работа с FS-A8S](rc_flysky_a8s.md)
* [Полетные режимы](modes.md) * [Полетные режимы](modes.md)
* [Настройка питания](power.md) * [Настройка питания](power.md)
* [Настройка failsafe](failsafe.md) * [Настройка Failsafe](failsafe.md)
* [Ручной полет](flight.md) * [Ручной полет](flight.md)
* [Упражнения](flight_exercises.md) * [Упражнения](flight_exercises.md)
* [Работа с Raspberry Pi](raspberry.md) * [Работа с Raspberry Pi](raspberry.md)

View File

@@ -14,7 +14,9 @@
4. Последовательно устанавливайте квадрокоптер в каждую из указанных ориентаций до появления желтой рамки. 4. Последовательно устанавливайте квадрокоптер в каждую из указанных ориентаций до появления желтой рамки.
5. Вращайте квадрокоптер по направлению стрелки до появления зеленой рамки. 5. Вращайте квадрокоптер по направлению стрелки до появления зеленой рамки.
Дополнительная информация: https://docs.px4.io/v1.9.0/en/config/compass.html. > **Warning** Последние версии прошивки PX4 не поддерживают внутренний компас на полетном контроллере COEX Pix. При появлении ошибки *No mags found* перейдите во вкладку *Parameters*, установите параметры `SYS_HAS_MAG` в `0`, `EKF2_MAG_TYPE` в `None` и перезагрузите полетный контроллер (*Tools* => *Reboot Vehicle*).
Дополнительная информация: https://docs.px4.io/master/en/config/compass.html.
## Гироскоп ## Гироскоп
@@ -27,7 +29,7 @@
> **Warning** Во время калибровки гироскопа квадрокоптер не должен менять своего положения, шататься и т. д. > **Warning** Во время калибровки гироскопа квадрокоптер не должен менять своего положения, шататься и т. д.
Дополнительная информация: https://docs.px4.io/v1.9.0/en/config/gyroscope.html. Дополнительная информация: https://docs.px4.io/master/en/config/gyroscope.html.
## Акселерометр ## Акселерометр
@@ -38,7 +40,7 @@
3. Последовательно устанавливайте квадрокоптер в каждую из указанных ориентаций до появления желтой рамки. 3. Последовательно устанавливайте квадрокоптер в каждую из указанных ориентаций до появления желтой рамки.
4. Держите квадрокоптер неподвижно до появления зеленой рамки. 4. Держите квадрокоптер неподвижно до появления зеленой рамки.
Дополнительная информация: https://docs.px4.io/v1.9.0/en/config/accelerometer.html. Дополнительная информация: https://docs.px4.io/master/en/config/accelerometer.html.
## Уровень горизонта ## Уровень горизонта
@@ -50,6 +52,6 @@
4. Нажмите *OK*. 4. Нажмите *OK*.
5. Дождитесь окончания калибровки. 5. Дождитесь окончания калибровки.
Дополнительная информация: https://docs.px4.io/v1.9.0/en/config/level_horizon_calibration.html. Дополнительная информация: https://docs.px4.io/master/en/config/level_horizon_calibration.html.
**Далее**: [Настройка пульта](radio.md). **Далее**: [Настройка пульта](radio.md).

View File

@@ -1,13 +1,13 @@
# Настройка failsafe # Настройка Failsafe
Основная статья: https://docs.px4.io/master/en/config/safety.html. Основная статья: https://docs.px4.io/master/en/config/safety.html.
Во вкладке *Safety* настраиваются реакции квадрокоптера на различные нештатные ситуации. Рекомендуется включить как минимум реакцию на потерю связи с пультом управления: Во вкладке *Safety* настраиваются реакции квадрокоптера на различные нештатные ситуации. Рекомендуется включить как минимум реакцию на потерю связи с пультом управления:
1. Откройте вкладку *Safety*. 1. В программе QGroundControl перейдите в панель *Vehicle Setup* и выберите меню *Safety*.
2. В блоке *RC Loss Failsafe Trigger* выберите один из рекомендуемых вариантов реакции на потерю связи с пультом: 2. В блоке *RC Loss Failsafe Trigger* выберите один из рекомендуемых вариантов реакции на потерю связи с пультом:
* *Land mode* – переход в режим посадки; * *Land mode* – переход в режим посадки;
* *Terminate* аварийное отключение моторов. * *Terminate* аварийное отключение моторов.
3. В поле *RC Loss Timeout* выберите значение таймаута, по истечении которого связь с пультом считается потерянной. Рекомендуемое значение  0.5 s. 3. В поле *RC Loss Timeout* выберите значение таймаута, по истечении которого связь с пультом считается потерянной. Рекомендуемое значение  2 s.
<img src="../assets/qgc-failsafe.png" alt="QGroundControl failsafe" class="zoom"> <img src="../assets/qgc-failsafe.png" alt="QGroundControl failsafe" class="zoom">

View File

@@ -1,13 +1,14 @@
# Полетные режимы # Полетные режимы
**Режим** полетного контроллера PX4 определяет, как именно коптер (или другое ТС) должно себя вести: каким образом интерпретировать входящие команды и сигналы с пульта. Режим переключается одним из переключателей на пульте радиоуправления. **Режим** полетного контроллера PX4 определяет, как именно квадрокоптер (или другой аппарат) должен себя вести: каким образом интерпретировать входящие команды и сигналы с пульта. Режим переключается одним из переключателей на пульте радиоуправления.
Чтобы настроить полетные режимы: Чтобы настроить полетные режимы:
1. Зайдите во вкладку *Vehicle Setup*. 1. В программе QGroundControl перейдите в панель *Vehicle Setup*.
2. Выберите меню *Flight Modes*. 2. Выберите меню *Flight Modes*.
3. Установите переключатель режимов на переключатель SwC (Channel 6). 3. Установите переключатель режимов (*Mode Channel*) на переключатель SwC (*Channel 6*).
4. Выберите необходимые полетные режимы. 4. Опционально, установите экстренное отключение пропеллеров (*Emergency Kill Switch Channel*) на переключатель SwA (*Channel 5*).
5. Выберите необходимые полетные режимы.
Рекомендуемые полетные режимы: Рекомендуемые полетные режимы:
@@ -15,8 +16,8 @@
* Flight Mode 4: *Altitude*. * Flight Mode 4: *Altitude*.
* Flight Mode 6: *Position*. * Flight Mode 6: *Position*.
5. Проверьте корректность переключения режимов, переключая переключатель на пульте. 6. Проверьте корректность переключения режимов, переключая переключатель на пульте.
6. Назначьте аварийное отключение моторов (*Kill switch*) на переключатель SwA (Channel 5). 7. Назначьте аварийное отключение моторов (*Kill switch*) на переключатель SwA (Channel 5).
<img src="../assets/qgc-modes.png" class="zoom" alt="QGroundControl modes"> <img src="../assets/qgc-modes.png" class="zoom" alt="QGroundControl modes">

View File

@@ -4,9 +4,7 @@
## Включение ## Включение
> **Hint** Необходимо использование [специальной сборки PX4 для Клевера](firmware.md#прошивка-для-клевера). > **Hint** Для работы Optical Flow необходим [подключенный и настроенный лазерный дальномер](laser.md).
Необходимо использование дальномера. [Подключите и настройте дальномер VL53L1X](laser.md), используя инструкцию.
Включите Optical Flow в файле `~/catkin_ws/src/clover/clover/launch/clover.launch`: Включите Optical Flow в файле `~/catkin_ws/src/clover/clover/launch/clover.launch`:
@@ -14,7 +12,7 @@
<arg name="optical_flow" default="true"/> <arg name="optical_flow" default="true"/>
``` ```
Optical Flow публикует данные в топик `mavros/px4flow/raw/send`. Кроме того, в топик `optical_flow/debug` публикуется визуализация, которую можно просмотреть с помощью [web_video_server](web_video_server.md). Optical Flow публикует данные в топик `/mavros/px4flow/raw/send`. Кроме того, в топик `/optical_flow/debug` публикуется визуализация, которую можно просмотреть с помощью [web_video_server](web_video_server.md).
> **Info** Для правильной работы модуль камеры должен быть корректно подключен и [сконфигурирован](camera.md). > **Info** Для правильной работы модуль камеры должен быть корректно подключен и [сконфигурирован](camera.md).

View File

@@ -1,6 +1,6 @@
# Настройка PID регуляторов # Настройка PID регуляторов
Основная статья: https://docs.px4.io/v1.9.0/en/config_mc/pid_tuning_guide_multicopter.html. Основная статья: https://docs.px4.io/master/en/config_mc/pid_tuning_guide_multicopter.html.
В этой статье описаны методы и основные технологии настройки каскадного ПИД-регулятора. Приведенные советы и методики подходят для любых видов рам (Квадрокоптеров, Гексакоптеров, Октокоптеров и т.д.). В этой статье описаны методы и основные технологии настройки каскадного ПИД-регулятора. Приведенные советы и методики подходят для любых видов рам (Квадрокоптеров, Гексакоптеров, Октокоптеров и т.д.).

View File

@@ -6,15 +6,16 @@
> **Note** Калибровка делителя напряжения должна выполняться с подключенным АКБ. > **Note** Калибровка делителя напряжения должна выполняться с подключенным АКБ.
В случае отсутствия индикатора напряжения или невозможности ручной калибровки, установите усредненное значение делителя напряжения для комплекта Клевер 4 (*Voltage divider* = 11). 1. В программе QGroundControl перейдите в панель *Vehicle Setup* и выберите меню *Power*.
2. Установите параметр *Number of cells* в соответствии с количеством банок в АКБ (*3S* для Клевера 4).
1. Установите параметр *Number of cells* в соответствии с количеством банок в АКБ (*3S* для Клевера 4). 3. Откалибруйте делитель напряжения:
2. Откалибруйте делитель напряжения:
* Подключите индикатор напряжения к балансировочному разъему АКБ. * Подключите индикатор напряжения к балансировочному разъему АКБ.
* Нажмите кнопку *Calculate* напротив надписи *Voltage Divider*. * Нажмите кнопку *Calculate* напротив надписи *Voltage Divider*.
* Введите в открывшемся поле суммарное значение напряжения с индикатора напряжения. * Введите в открывшемся поле суммарное значение напряжения с индикатора напряжения.
* Нажмите *Close*, чтобы сохранить рассчитанное значение. * Нажмите *Close*, чтобы сохранить рассчитанное значение.
В случае отсутствия индикатора напряжения или невозможности ручной калибровки, установите усредненное значение делителя напряжения для комплекта Клевер 4 (*Voltage divider* = 11).
<img src="../assets/qgc-voltage-divider.png" class="zoom"> <img src="../assets/qgc-voltage-divider.png" class="zoom">
Дополнительная информация: https://docs.qgroundcontrol.com/en/SetupView/Power.html. Дополнительная информация: https://docs.qgroundcontrol.com/en/SetupView/Power.html.
@@ -30,6 +31,6 @@
<img src="../assets/qgc-power.png" class="zoom"> <img src="../assets/qgc-power.png" class="zoom">
Дополнительная информация: https://docs.px4.io/v1.9.0/en/advanced_config/esc_calibration.html. Дополнительная информация: https://docs.px4.io/master/en/advanced_config/esc_calibration.html.
**Далее**: [настройка Failsafe](failsafe.md). **Далее**: [настройка Failsafe](failsafe.md).

View File

@@ -9,7 +9,7 @@
## Подключение пульта ## Подключение пульта
1. Зайдите во вкладку *Vehicle Setup* и выберите меню *Radio*. 1. В программе QGroundControl перейдите в панель *Vehicle Setup* и выберите меню *Radio*.
2. Включите пульт, переводя переключатель *POWER* в верхнее положение. 2. Включите пульт, переводя переключатель *POWER* в верхнее положение.
3. Убедитесь, что связь с приемником установлена. 3. Убедитесь, что связь с приемником установлена.

View File

@@ -16,33 +16,26 @@
<img src="../assets/pix-sd.png" alt="Pixracer и MicroSD-карта" class="zoom center" width=400> <img src="../assets/pix-sd.png" alt="Pixracer и MicroSD-карта" class="zoom center" width=400>
* Установите карту в компьютер (используйте адаптер при необходимости). 1. Установите карту в компьютер (используйте адаптер при необходимости).
* Отформатируйте карту в файловую систему FAT32. Для этого кликните на значок SD-карты в "Проводнике" и нажмите "Форматирование" в Windows. Используйте "Дисковую утилиту" в macOS. 2. Отформатируйте карту в файловую систему FAT32. Для этого кликните на значок SD-карты в "Проводнике" и нажмите "Форматирование" в Windows. Используйте "Дисковую утилиту" в macOS.
* Выполните "Безопасное извлечение" карты, извлеките карту. 3. Выполните "Безопасное извлечение" карты, извлеките карту.
* Установите карту в полетный контроллер. 4. Установите карту в полетный контроллер.
## Загрузка прошивки в полетный контроллер ## Загрузка прошивки в полетный контроллер
Основная статья: https://docs.qgroundcontrol.com/en/SetupView/Firmware.html. Для использования всех наиболее актуальных функций PX4 используйте последнюю версию прошивки PX4 (*1.12+*).
> **Note** Перед осуществлением перепрошивки Pixracer не должен быть подключен к компьютеру по USB. > **Note** Альтернативой является использование более старой прошивки (*1.8.2*) [с патчами COEX](firmware.md). В этой прошивке функциональность автономных полетов является более оттестированной и отлаженной. Прошивка может быть скачана с GitHub — **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">Скачать</a>**.
Для Клевера, в особенности для осуществления автономных полетов, рекомендуется использовать версию прошивки PX4 от Copter Express. Скачайте актуальную версию прошивки на GitHub — **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">скачать</a>**. 1. Отключите полетный контроллер от компьютера (если он подключен).
2. Запустите программу QGroundControl.
> **Info** Для квадрокоптеров с Pixhawk (Клевер 2) существует отдельная версия прошивки. Подробности смотрите в статье "[Прошивка полетного контроллера](firmware.md)". 3. Перейдите в панель *Vehicle Setup* (кликнув на логотип QGroundControl в левом верхнем углу) и выберите меню *Firmware*.
4. Подключите полетный контроллер к компьютеру по USB.
Загрузите прошивку в полетный контролер: 5. Выберите в появившемся меню справа *PX4 Flight Stack*.
<img src="../assets/qgc-firmware.png" alt="QGroundControl firmware upload" class="zoom"> <img src="../assets/qgc-firmware.png" alt="QGroundControl firmware upload" class="zoom">
1. Запустите программу QGroundControl. Для загрузки прошивки COEX:
2. Зайдите во вкладку *Vehicle Setup*.
3. Выберите меню *Firmware*.
4. Подключите Pixracer к компьютеру по USB.
5. Дождитесь подключения Pixracer к QGroundControl.
6. Выберите в меню справа *PX4 Flight Stack*.
Для загрузки прошивки от Copter Express (рекомендуется):
* Выберите *Advanced settings*. * Выберите *Advanced settings*.
* В выпадающем меню выберите *Custom firmware file...* * В выпадающем меню выберите *Custom firmware file...*

View File

@@ -63,6 +63,7 @@
{ "from": "power/", "to": "en/power.html" }, { "from": "power/", "to": "en/power.html" },
{ "from": "connection/", "to": "en/connection.html" }, { "from": "connection/", "to": "en/connection.html" },
{ "from": "clover_vm/", "to": "en/simulation_vm.html" }, { "from": "clover_vm/", "to": "en/simulation_vm.html" },
{ "from": "gpio/", "to": "en/gpio.html" },
{ "from": "ru/microsd_images.html", "to": "image.html" }, { "from": "ru/microsd_images.html", "to": "image.html" },
{ "from": "en/microsd_images.html", "to": "image.html" } { "from": "en/microsd_images.html", "to": "image.html" }