Вообще, инструмент этот довольно мощный,
и подробно про него можно снять целый курс.
Сейчас мы только затронем начало его работы, и если вас это заинтересует,
пожалуйста, идите на сайт processing.org.
Здесь тоже есть разделы для обучения.
[БЕЗ_ЗВУКА] И в виде теста, и в виде видео.
И можете продолжать изучение.
А мы сейчас будем строить карту.
Сейчас мы рассмотрим скетч на processing, но прежде давайте поймем,
каким образом сам радар будет передавать данные для этого скетча.
Что происходит на стороне Arduino?
Какие сведения о пространстве нам позволяет радар получить?
Расстояние до какой-то точки и угол, в котором сейчас
находится сервомотор и, соответственно, дальномер.
То есть мы про каждое положение знаем вот этот вот угол
и расстояние до точки.
Таким образом, мы можем найти координаты в каждой из вот этих вот точек,
которые в конце концов складываются в объекты, вспомнив про то,
что по углу и стороне можно решить треугольник.
То есть координаты каждой из этих точек вычислить.
Соответственно, для нашего радара будет достаточно передавать
угол и соответствующее ему расстояние, что мы, собственно, и делаем в скетче.
Я его немножко трансформировал, теперь сохраняю в переменную distance результаты
измерений и вывожу на экран эту переменную.
Кроме этого, я решил, что для разделения вот этих
данных я буду использовать двоеточие,
и в конце каждой пары ставить точку с запятой.
Обратите внимание, что я использую метод print, а не println,
потому что перевод строки мне в данном случае не нужен,
и я буду не глазами читать эти данные, а их будет разбирать скетч на processing.
Итого, мы отправляем угол, двоеточие, расстояние, точка с запятой.
И все то же самое на обратном пути, когда серво крутится от 180 до 0.
Теперь давайте перейдем к processing, и на примере вот этого
построителя карты познакомимся с тем, каким образом можно с ним работать.
Я сразу буду разбирать написанный скетч.
Здесь я подключаю библиотеку для работы с последовательным портом,
потому что нам нужно в этом скетче получать данные от Arduino.
И создаю соответствующий объект.
В отличии от Arduino здесь нет готового объекта Serial, поэтому мы его создаем.
Затем создаю все переменные, которые пригодятся в работе.
Угол, расстояние, данные – это те данные,
которые мы будем получать с Arduino.
Index – это некая служебная переменная, до которой сейчас дойдем;
и xpos и ypos – это координаты той точки, которую мы будем строить.
Теперь посмотрим дальше и увидим уже знакомое слово,
точнее, пару слов – void setup.
Действительно, среды Processing и Arduino родственные,
именно поэтому в обоих из них есть такой раздел.
Здесь тоже делаются всякие настройки, и в частности,
мы создаем окошко размером 600 на 300 пикселей.
Затем устанавливаем соединение с Arduino.
Здесь мы указываем скорость, здесь мы указываем порт,
который можно посмотреть в диспетчере устройств, и скорость соединения,
которая должна совпадать с таковой в скетче в радаре.
Затем вот эта инструкция определяет,
до какого символа будет буферизоваться сообщение,
прежде чем вызовется некая функция, о которой мы посмотрим дальше.
Затем идет строчка background
и 3 цифры – это мы задаем цвет фона в виде RGB,
то есть (255, 255, 255) – это белый фон.
Что мы видим далее?
void draw.
Здесь это на месте loop, который мы всегда видим в Arduino.
То есть ваше окошко постоянно будет перерисовываться в связи с тем,
что написано внутри этой функции.
Как я уже упоминал, processing – это инструмент, в первую очередь для
визуализации, и я действительно рекомендую вам покопаться на сайте,
посмотреть примеры, там есть много мощных инструментов для визуализации данных,
для работы с картинками, анимациями и так далее.
Что происходит внутри draw здесь?
Здесь я устанавливаю цвет заливки фигуры, которую я буду рисовать.
255,0,0 – это красный цвет.
И функцией noStroke говорю, что у нее не будет контура,
будет только заливка без обводки.
И, собственно, указываю что за фигуру мне нужно нарисовать – это эллипс,
координаты которой записаны в переменной (xpos, ypos).
И это размеры эллипса, ну размером 3 пикселя.
Осталось разобраться с тем, как мы расшифровываем данные,
которые приходят от радара.
Это происходит в функции Serial event.
То есть по наступлении некого события в последовательном
порту будут обрабатываться, будут происходить вот эти инструкции.
Как вы помните, мы в setup написали, что ожидаться будет символ точки с запятой,
то есть как раз, когда мы окончили передачу пары угол-расстояние.
Здесь мы в созданную ранее переменную data
считываем данные до точки с запятой,
и затем в эту же переменную сохраняем подстроку,
то есть кусок этой же самой строки с позиции 0 до позиции,
которая равна длине этой строки минус 1.
Затем в переменную index – служебную переменную,
про которую я в начале упоминал, – сохраняем позицию двоеточие,
то есть разделительного символа в нашей строке.
И в переменную angle (угол) сохраняем ту подстроку,
которая идет от начала полученных данных
до index, то есть до позиции двоеточие.
А в переменную distance сохраняем подстроку от позиции двоеточие плюс 1,
то есть начало расстояния, до позиции,
которая равняется размеру самой переменой, то есть до конца.
Затем мы преобразуем эту пару в координаты,
здесь есть еще несколько вычислений, связанных
с выходом за пределы нашего поля.
И остается одна функция...
А, да, вот здесь еще есть две строчки,
которые преобразуют немножко полученные координаты,
потому что в рисовании карты, как вы скоро увидите,
мы нулем будем считать вот это место, ну что бы как бы смотреть из глаз радара.
И последнее что остается —
это функция для очистки карты.
Ну периодически нам захочется ее почистить, чтобы радар построил ее заново,
и поэтому по событию «мышка нажата»,
экран будет очищаться, то есть просто заливаться белым.
Вот и все.
Давайте теперь посмотрим, как это работает, и тем,
кому показалось использование процессинга интересным,
я рекомендую в первую очередь посмотреть на тот скетч, который вы уже
давно скачали, который используется для визуализации аналогового сигнала.
Может быть, вы его как-то улучшите для себя.
Может быть, предложите улучшение нам.
Ну, естественно, можете изучать предмет дальше, делать какие-то другие инструменты
визуализации и связывать с вашими устройствами, чтобы по мановению руки,
у вас, например, происходила какая-нибудь крутая трехмерная анимация.
Впрочем, вернемся к рисованию карты радаром.
Мы соорудили импровизированную полосу препятствий для радара из того,
что нашли в студии.
Здесь есть картонная коробка,
пластмассовая коробка с какой-то электроникой внутри и угол комнаты.
Я сейчас обнулю карту, и мы посмотрим, как они отображаются.
Это дальняя стена, это коробка с электроникой, это картонная коробка.
И обратно.
И вот мы дошли до угла и видим вторую стену.
Угол выглядит таким вот странным образом, но это довольно предсказуемо.
Все шумы и погрешности связаны с тем, что, во-первых, мы не применяем никакую
фильтрацию; во-вторых, могут быть какие-то погрешности вычислений.
Ну а самая главная причина – это то, что у каждого датчика есть свои особенности,
в частности, у ультразвукового дальномера.
Мы об этом уже немного говорили.
Тем не менее карта строится.