HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>13 дек 2024</li>
2 <ul><li>13 дек 2024</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Превращаем бездушную машину в имитацию жизни.</p>
4 </ul><p>Превращаем бездушную машину в имитацию жизни.</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6 <p>Программист-робототехник. Работает c шагающими, летающими, колёсными роботами. А в свободное время сама их конструирует. Увлекается IT и инженерией сама и вас заинтересует!</p>
6 <p>Программист-робототехник. Работает c шагающими, летающими, колёсными роботами. А в свободное время сама их конструирует. Увлекается IT и инженерией сама и вас заинтересует!</p>
7 <p>Это вторая часть туториала по сборке робота. В <a>предыдущей статье</a>мы подготовили физическую часть проекта: подобрали (или напечатали) детали, подключили электронику.</p>
7 <p>Это вторая часть туториала по сборке робота. В <a>предыдущей статье</a>мы подготовили физическую часть проекта: подобрали (или напечатали) детали, подключили электронику.</p>
8 <p>Сегодня займёмся программированием: напишем код для управления моторами, настроим управление со смартфона и сможем наконец попробовать наш робокар в деле.</p>
8 <p>Сегодня займёмся программированием: напишем код для управления моторами, настроим управление со смартфона и сможем наконец попробовать наш робокар в деле.</p>
9 <p>Напомним, наша конечная цель - создание механической машинки, которая управляется по Bluetooth через приложение на смартфоне.</p>
9 <p>Напомним, наша конечная цель - создание механической машинки, которая управляется по Bluetooth через приложение на смартфоне.</p>
10 <em>Фото: личный архив Екатерины Можеговой</em><p><strong>План работы</strong></p>
10 <em>Фото: личный архив Екатерины Можеговой</em><p><strong>План работы</strong></p>
11 <ul><li><a>Готовим среду разработки Arduino IDE</a></li>
11 <ul><li><a>Готовим среду разработки Arduino IDE</a></li>
12 <li><a>Программируем движения</a></li>
12 <li><a>Программируем движения</a></li>
13 <li><a>Загружаем код на плату</a></li>
13 <li><a>Загружаем код на плату</a></li>
14 <li><a>Настраиваем управление со смартфона</a></li>
14 <li><a>Настраиваем управление со смартфона</a></li>
15 <li><a>Подводим итоги</a></li>
15 <li><a>Подводим итоги</a></li>
16 </ul><p>А теперь перейдём к гайду ;)</p>
16 </ul><p>А теперь перейдём к гайду ;)</p>
17 <p>Arduino IDE - это самая популярная и удобная среда разработки для проектов на Arduino, поэтому именно в ней мы и напишем программу для управления роботом. Скачать установочный файл можно с <a>официального сайта</a>.</p>
17 <p>Arduino IDE - это самая популярная и удобная среда разработки для проектов на Arduino, поэтому именно в ней мы и напишем программу для управления роботом. Скачать установочный файл можно с <a>официального сайта</a>.</p>
18 <p>В Arduino IDE мы напишем код, а потом с помощью этой же программы мы загрузим его на Arduino Uno. Шаблон пустой программы (или скетча) выглядит так:</p>
18 <p>В Arduino IDE мы напишем код, а потом с помощью этой же программы мы загрузим его на Arduino Uno. Шаблон пустой программы (или скетча) выглядит так:</p>
19 <em>Скриншот:<a>Arduino IDE</a></em><p>Язык программирования для Arduino IDE основан на C++. C++ используется в робототехнике и за рамками проектов на Arduino, поэтому, если вы хотите в дальнейшем серьёзно заниматься робототехникой, советуем вам<a>изучить его более серьёзно</a>.</p>
19 <em>Скриншот:<a>Arduino IDE</a></em><p>Язык программирования для Arduino IDE основан на C++. C++ используется в робототехнике и за рамками проектов на Arduino, поэтому, если вы хотите в дальнейшем серьёзно заниматься робототехникой, советуем вам<a>изучить его более серьёзно</a>.</p>
20 <p>Вернёмся к скетчу. Здесь мы видим две (пока что пустые) функции: setup(), loop(). Разберём подробнее, что они означают:</p>
20 <p>Вернёмся к скетчу. Здесь мы видим две (пока что пустые) функции: setup(), loop(). Разберём подробнее, что они означают:</p>
21 <ul><li>В setup() обычно инициализируются переменные, а также режимы подключённых контактов (пинов) - через функцию pinMode(). Код внутри setup() выполняется единожды, сразу после запуска Arduino, то есть фактически этот метод используется для начальной настройки платы.</li>
21 <ul><li>В setup() обычно инициализируются переменные, а также режимы подключённых контактов (пинов) - через функцию pinMode(). Код внутри setup() выполняется единожды, сразу после запуска Arduino, то есть фактически этот метод используется для начальной настройки платы.</li>
22 <li>Функция loop() содержит основной код, который выполняется непрерывно после завершения выполнения функции setup().</li>
22 <li>Функция loop() содержит основной код, который выполняется непрерывно после завершения выполнения функции setup().</li>
23 <li>Параметр void перед функцией указывает на тип возвращаемого значения после выполнения команд функции. В переводе на русский язык void означает "пустота" - это значит, что функция ничего не возвращает.</li>
23 <li>Параметр void перед функцией указывает на тип возвращаемого значения после выполнения команд функции. В переводе на русский язык void означает "пустота" - это значит, что функция ничего не возвращает.</li>
24 </ul><p>Теперь попробуем написать программу для управления нашей машинкой. Не переживайте: мы подробно расскажем и покажем на примерах, как это сделать, но, если сегодня у вас нет настроения программировать, можете воспользоваться<a>уже готовым кодом</a>:)</p>
24 </ul><p>Теперь попробуем написать программу для управления нашей машинкой. Не переживайте: мы подробно расскажем и покажем на примерах, как это сделать, но, если сегодня у вас нет настроения программировать, можете воспользоваться<a>уже готовым кодом</a>:)</p>
25 <p>Напомним, что для управления роботом мы будем отправлять команды с мобильного приложения, а Bluetooth-модуль, подключённый к машинке, будет их принимать. Наша задача - написать программу, которая будет обрабатывать полученные команды, считывая их с Bluetooth-модуля, преобразовывать в управляющие сигналы для моторов и передавать эти сигналы на моторы для выполнения нужных действий.</p>
25 <p>Напомним, что для управления роботом мы будем отправлять команды с мобильного приложения, а Bluetooth-модуль, подключённый к машинке, будет их принимать. Наша задача - написать программу, которая будет обрабатывать полученные команды, считывая их с Bluetooth-модуля, преобразовывать в управляющие сигналы для моторов и передавать эти сигналы на моторы для выполнения нужных действий.</p>
26 <p>Коммуникация с модулем происходит по последовательному (serial) порту - чтобы активировать его, добавим в функцию setup() следующую строчку:</p>
26 <p>Коммуникация с модулем происходит по последовательному (serial) порту - чтобы активировать его, добавим в функцию setup() следующую строчку:</p>
27 Serial.begin(9600);<p>Эта команда настраивает последовательный порт на нужную скорость передачи данных, которая должна совпадать со скоростью передачи данных на Bluetooth-модуле. 9600 бит/с - это стандартная скорость передачи данных для последовательного порта.</p>
27 Serial.begin(9600);<p>Эта команда настраивает последовательный порт на нужную скорость передачи данных, которая должна совпадать со скоростью передачи данных на Bluetooth-модуле. 9600 бит/с - это стандартная скорость передачи данных для последовательного порта.</p>
28 <p>В прошлой части инструкции мы уже физически подключили контакты моторов к пинам 6-9 Arduino. Теперь укажем их в коде. Для этого внутри той же функции setup() добавим следующие строчки:</p>
28 <p>В прошлой части инструкции мы уже физически подключили контакты моторов к пинам 6-9 Arduino. Теперь укажем их в коде. Для этого внутри той же функции setup() добавим следующие строчки:</p>
29 pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT);<p>Команда pinMode задаёт режим работы подключённых контактов. Например, pinMode(6, OUTPUT); означает, что мы устанавливаем 6-й пин как выходной и будем отправлять на него управляющие сигналы от Arduino.</p>
29 pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT);<p>Команда pinMode задаёт режим работы подключённых контактов. Например, pinMode(6, OUTPUT); означает, что мы устанавливаем 6-й пин как выходной и будем отправлять на него управляющие сигналы от Arduino.</p>
30 <p>Теперь в void loop() опишем основную логику программы.</p>
30 <p>Теперь в void loop() опишем основную логику программы.</p>
31 <p>В этой функции мы проверяем, есть ли в последовательном порте данные, доступные для чтения (в нашем случае - команды управления), реализуем мы это с помощью метода Serial.available(). Если данные доступны, то они читаются.</p>
31 <p>В этой функции мы проверяем, есть ли в последовательном порте данные, доступные для чтения (в нашем случае - команды управления), реализуем мы это с помощью метода Serial.available(). Если данные доступны, то они читаются.</p>
32 while(Serial.available() &gt; 0){ data = Serial.read(); }<p>Значения data в нашем случае могут быть такими:</p>
32 while(Serial.available() &gt; 0){ data = Serial.read(); }<p>Значения data в нашем случае могут быть такими:</p>
33 <ul><li>'F' (forward): движение вперёд;</li>
33 <ul><li>'F' (forward): движение вперёд;</li>
34 <li>'B' (backward): движение назад;</li>
34 <li>'B' (backward): движение назад;</li>
35 <li>'L' (left): движение налево;</li>
35 <li>'L' (left): движение налево;</li>
36 <li>'R' (right): движение направо;</li>
36 <li>'R' (right): движение направо;</li>
37 <li>'0' (stop): остановка.</li>
37 <li>'0' (stop): остановка.</li>
38 </ul><p>Допустим, если пришедшая команда - "вперёд", программа активирует пины 6 и 7.</p>
38 </ul><p>Допустим, если пришедшая команда - "вперёд", программа активирует пины 6 и 7.</p>
39 <p>Определить, какие порты нужно включать для разных движений, можно экспериментально: поочерёдно активируя пары пинов и наблюдая, в каком направлении движется машинка.</p>
39 <p>Определить, какие порты нужно включать для разных движений, можно экспериментально: поочерёдно активируя пары пинов и наблюдая, в каком направлении движется машинка.</p>
40 void loop(){ while(Serial.available() &gt; 0){ data = Serial.read(); if(data == 'F'){ // Forward digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); }<p>В Arduino HIGH, LOW - это логические уровни, управляющие состоянием пинов. Когда мы используем функцию digitalWrite(pin, HIGH), мы подаём высокий уровень напряжения на соответствующий пин, то есть включаем его. А при использовании digitalWrite(pin, LOW) мы подаём низкий уровень напряжения, то есть выключаем пин.</p>
40 void loop(){ while(Serial.available() &gt; 0){ data = Serial.read(); if(data == 'F'){ // Forward digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); }<p>В Arduino HIGH, LOW - это логические уровни, управляющие состоянием пинов. Когда мы используем функцию digitalWrite(pin, HIGH), мы подаём высокий уровень напряжения на соответствующий пин, то есть включаем его. А при использовании digitalWrite(pin, LOW) мы подаём низкий уровень напряжения, то есть выключаем пин.</p>
41 <p>Аналогично будет реализована логика движения и в других направлениях: влево, вправо и назад.</p>
41 <p>Аналогично будет реализована логика движения и в других направлениях: влево, вправо и назад.</p>
42 <p><strong>Готовый код для управления моторами</strong>спрятан под спойлером:</p>
42 <p><strong>Готовый код для управления моторами</strong>спрятан под спойлером:</p>
43 int data; void setup(){ Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); } void loop(){ while(Serial.available() &gt; 0){ data = Serial.read(); if(data == 'F'){ // Forward digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); } if (data == 'B'){ // Backward digitalWrite(6, LOW); digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(9, HIGH); } if (data == 'L'){ // Left digitalWrite(6, HIGH); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); } if (data == 'R'){ // Right digitalWrite(6, LOW); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(9, LOW); } if(data == '0'){ // Stop digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } } }<p>Теперь, когда наш код готов, нужно загрузить его на Arduino. Для начала подключаем Arduino к компьютеру через USB и открываем программу Arduino IDE. В IDE настроим параметры для загрузки кода: выбираем соответствующую плату и порт. В списке доступных плат выбираем Arduino Uno, так как именно с этой платой мы работаем.</p>
43 int data; void setup(){ Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); } void loop(){ while(Serial.available() &gt; 0){ data = Serial.read(); if(data == 'F'){ // Forward digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); } if (data == 'B'){ // Backward digitalWrite(6, LOW); digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(9, HIGH); } if (data == 'L'){ // Left digitalWrite(6, HIGH); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); } if (data == 'R'){ // Right digitalWrite(6, LOW); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(9, LOW); } if(data == '0'){ // Stop digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } } }<p>Теперь, когда наш код готов, нужно загрузить его на Arduino. Для начала подключаем Arduino к компьютеру через USB и открываем программу Arduino IDE. В IDE настроим параметры для загрузки кода: выбираем соответствующую плату и порт. В списке доступных плат выбираем Arduino Uno, так как именно с этой платой мы работаем.</p>
44 <em>Скриншот:<a>Arduino IDE</a></em><p>Теперь выберем корректный USB-порт.</p>
44 <em>Скриншот:<a>Arduino IDE</a></em><p>Теперь выберем корректный USB-порт.</p>
45 <em>Скриншот:<a>Arduino IDE</a></em><p>Готовую программу нужно будет сначала проверить на наличие ошибок. Для этого воспользуемся кнопкой Проверить.</p>
45 <em>Скриншот:<a>Arduino IDE</a></em><p>Готовую программу нужно будет сначала проверить на наличие ошибок. Для этого воспользуемся кнопкой Проверить.</p>
46 <em>Скриншот:<a>Arduino IDE</a></em><p>Если всё в порядке, то загрузим код на плату.</p>
46 <em>Скриншот:<a>Arduino IDE</a></em><p>Если всё в порядке, то загрузим код на плату.</p>
47 <em>Скриншот:<a>Arduino IDE</a></em><p><strong>Важная оговорка</strong>: для этого проекта мы использовали приложение<a>Arduino Bluetooth Controller</a>на Android для работы с Bluetooth-модулем HC-06. Похожие программы есть и для iPhone, но мы не можем гарантировать качество работы - возможно, вам придётся самостоятельно искать альтернативы этому приложению.</p>
47 <em>Скриншот:<a>Arduino IDE</a></em><p><strong>Важная оговорка</strong>: для этого проекта мы использовали приложение<a>Arduino Bluetooth Controller</a>на Android для работы с Bluetooth-модулем HC-06. Похожие программы есть и для iPhone, но мы не можем гарантировать качество работы - возможно, вам придётся самостоятельно искать альтернативы этому приложению.</p>
48 <p>Теперь нам нужно настроить отправку команд по Bluetooth с телефона.</p>
48 <p>Теперь нам нужно настроить отправку команд по Bluetooth с телефона.</p>
49 <p>1. Для начала установим на телефон приложение<a>Arduino Bluetooth Controller</a>.</p>
49 <p>1. Для начала установим на телефон приложение<a>Arduino Bluetooth Controller</a>.</p>
50 <p>2. В интерфейсе выберем корректное устройство для подключения к Bluetooth - HC-06, так как именно такой Bluetooth модуль мы и используем, затем введём пароль по умолчанию - 1234. Далее выберем сценарий Gamepad.</p>
50 <p>2. В интерфейсе выберем корректное устройство для подключения к Bluetooth - HC-06, так как именно такой Bluetooth модуль мы и используем, затем введём пароль по умолчанию - 1234. Далее выберем сценарий Gamepad.</p>
51 Вы увидите интерфейс управления<em>Скриншот:<a>Arduino IDE</a>/ Skillbox Media</em><p>3. При нажатии на кнопки в интерфейсе приложения данные должны посылаться на Arduino по Bluetooth.</p>
51 Вы увидите интерфейс управления<em>Скриншот:<a>Arduino IDE</a>/ Skillbox Media</em><p>3. При нажатии на кнопки в интерфейсе приложения данные должны посылаться на Arduino по Bluetooth.</p>
52 <p>Если для сборки вы использовали контроллер Arduino Mega вместо классического Uno, можно проследить, как выглядит отправка команд со смартфона на плату робота.</p>
52 <p>Если для сборки вы использовали контроллер Arduino Mega вместо классического Uno, можно проследить, как выглядит отправка команд со смартфона на плату робота.</p>
53 <p>Для этого нужно загрузить на плату и запустить проверочный код.</p>
53 <p>Для этого нужно загрузить на плату и запустить проверочный код.</p>
54 void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { if (Serial1.available()){ Serial.println(char(Serial1.read())); } }<p>Поздравляем! ? Вы только что собрали и запрограммировали своего первого робота ;) Теперь вы сможете сами им управлять! Примерно так:</p>
54 void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { if (Serial1.available()){ Serial.println(char(Serial1.read())); } }<p>Поздравляем! ? Вы только что собрали и запрограммировали своего первого робота ;) Теперь вы сможете сами им управлять! Примерно так:</p>
55 <p>Благодаря такому несложному проекту мы отточили несколько важных для робототехника навыков: попрактиковались в сборке, поработали с микроконтроллером Arduino, научились подключать моторы и управлять ими. Эти навыки - хорошая база для новых, более сложных проектов.</p>
55 <p>Благодаря такому несложному проекту мы отточили несколько важных для робототехника навыков: попрактиковались в сборке, поработали с микроконтроллером Arduino, научились подключать моторы и управлять ими. Эти навыки - хорошая база для новых, более сложных проектов.</p>
56 <p>Теперь можно дорабатывать машинку столько, сколько вам позволяет воображение, - например, подключить к ней датчики освещённости, камеру, микрофон и даже манипулятор для захвата различных предметов.</p>
56 <p>Теперь можно дорабатывать машинку столько, сколько вам позволяет воображение, - например, подключить к ней датчики освещённости, камеру, микрофон и даже манипулятор для захвата различных предметов.</p>
57 Разные версии колёсных роботов на базе Arduino<em>Скриншот:<a>Kuongshun</a>/<a>AliExpress</a>/<a>Supereyes</a></em><p>Отдельные умельцы<a>прикручивают к Arduino ИИ-мозги с помощью API популярных нейронок</a>. Вы можете пойти дальше и научить робота общаться с вами с помощью ChatGPT и небольшого динамика. Как знать, возможно, именно вам суждено собрать первого Терминатора :)</p>
57 Разные версии колёсных роботов на базе Arduino<em>Скриншот:<a>Kuongshun</a>/<a>AliExpress</a>/<a>Supereyes</a></em><p>Отдельные умельцы<a>прикручивают к Arduino ИИ-мозги с помощью API популярных нейронок</a>. Вы можете пойти дальше и научить робота общаться с вами с помощью ChatGPT и небольшого динамика. Как знать, возможно, именно вам суждено собрать первого Терминатора :)</p>
58 <a>Практический курс: "Программист микроконтролле­ров" Узнать о курсе</a>
58 <a>Практический курс: "Программист микроконтролле­ров" Узнать о курсе</a>