четверг, 2 июня 2016 г.

1.12. Макроопределения, переменные, цикл со счетчиком

Урок: 1.12. Макроопределения, переменные, цикл со счетчиком

Транскрибация урока: Программа, которую мы написали, на самом деле далеко не идеальна. Сейчас мы рассмотрим несколько очень полезных вещей в процессе доработки ее. Для начала представьте, что вам потребовалось один из светодиодов переключить к другому PIN. Особенно интересно получится, если речь идет о зеленом светодиоде, мы обращаемся к нему чаще всего. Вам нужно будет внимательно, дотошно изучить код и все обращения к PIN, куда подключен светодиод, заменить на другой PIN. Согласитесь, перспектива не самая лучшая, а кроме того, вероятность ошибки повышается на порядок. Чтобы подобной ситуации избежать, я немножко переработал код. Обратите внимание в начало скетча, где появились строки #define RED PIN 8, #define YELLOW PIN 10, #define GREEN PIN 12 Что это такое? Мы создали так называемые макроопределения. Директива #define будет рассмотрена средой разработки еще перед компиляцией скетча. Она пробежится по всему коду и заменит RED PIN на 8, YELLOW PIN на 10 и GREEN PIN на 12. В целом работа #define аналогична функции «найти и заменить» в любом текстовом редакторе. Здесь нужно обратить внимание на синтаксис использования этой директивы. Во-первых, не забывайте про #, когда ее вызываете. Затем вы ставите пробел между самим словом #define и строкой, которую вы хотите найти. Затем вы ставите еще один пробел и пишете строку, на которую хотите заменить первую строку. Обратите внимание, что в данном случае точка с запятой в конце строки не ставится, иначе вызовете ошибку. Теперь мы все вхождения, все упоминания PIN, куда у нас подключены разные светодиоды, заменяем на соответствующие макроопределения. И когда мы, например, пишем digitalWrite и имеем в виду красный светодиод, пишем digitalWrite RED PIN и состояние, в которое мы хотим его переключить. Нам не нужно задумываться в каждый момент о том, к какому контакту подключено какое устройство. И еще один важный момент: когда вы создаете, например, макроопределение или потом какие-то другие вещи, всегда давайте им осмысленные имена, потому что на следующий день, когда вы откроете свою программу и не сможете понять, что вы вчера имели в виду, будет очень досадно, вы потратите много времени на то, чтобы разобраться в собственном коде. Это важно наряду с использованием комментариев. Кстати, для вашего удобства рекомендую использовать заглавные буквы при создании этих макроопределений, потому что вы, во-первых, снижаете риск заменить в коде что-нибудь ненужное, то, что не нужно заменять, а во-вторых, вы лучше их можете заметить сами и понять, что речь здесь идет о макроопределении. Теперь давайте посмотрим на задержки, которые мы делаем, когда светится каждый из светодиодов. Мы вновь записали числовую константу для каждого из этих мест, и в какой-то момент это может перестать быть удобным. У вас есть уже один способ избавиться от числовых констант, вы могли бы сделать такие же макроопределения, но обращу ваше внимание на то, что ваш светофор может со временем поумнеть, и, например, фаза горения красного также может менять длительность, например, в зависимости от трафика. Поэтому я предлагаю вам использовать переменные. Это одно из базовых понятий в программировании, и сейчас мы создадим несколько переменных для хранения времени задержки каждого светодиода. Посмотрим на еще раз переработанный код, где я создал 5 переменных. У всех из них есть понятные имена, которые отправляют нас к их назначению. red_on это время горения красного, red_yellow_on – это время совместного горения красного и желтого, ну и так далее, green_on, green_blink – мигание зеленого и yellow_on. Что вообще такое «переменная»? Это некий фрагмент памяти в контроллере, который имеет свой адрес. По этому адресу могут храниться какие-то значения. Но вся история про адреса лично нам не очень интересна, с этим справится компилятор и сам контроллер. А мы обращаемся к переменным по имени. Сначала мы их создаем, как я сделал вот здесь и дал им имена. К именованию переменных есть несколько требований. Кроме того, что вы должны понимать, что эта переменная значит, что там хранится, компилятор будет требовать, чтобы название переменной начиналось с буквы, естественно, с латинской буквы, состояло имя переменной из одного слова, и использованы в нем были только буквы, цифры и символы подчеркивания. Обычно, если вы хотите создать переменную, имя которой состоит из нескольких слов, вы их разделяете символами подчеркивания. и пишете все буквы строчные. Что еще важного мы видим в этих 5 строках? Каждое из них начинается со слова int, от английского integer – «целое число». Дело в том, что при создании переменных нужно указать тип данных, к которому она относится. Данные бывают разного типа хотя бы потому что они занимают разное количество памяти, и нашей системе нужно понимать, как с этими данными работать. В данном случае целочисленная переменная занимает 16 бит, и, соответственно, мы можем закодировать 2 в 16 65 536 значений. Также обратите внимание на вот эти части: = 3000, = 1000 и так далее. Здесь мы сразу присваиваем переменным значение. В программировании в большинстве языков символ «=» является оператором присваивания. То есть он помещает то, что находится справа от него в то место, которое обозначено слева от него. Естественно, если в это место можно что-то поместить. Переменные как раз предназначены для того, чтобы в них что-то хранили, поэтому когда мы указываем имя переменной, пишем «=» и указываем некое значение, это значение будет помещено в эту переменную. Итак, мы создали 5 переменных и присвоили им значения. Разные количества миллисекунд для разных фаз работы светофора. Затем, когда нам нужно использовать эти данные, мы просто обращаемся к переменной, обращаемся по имени. Посмотрите, я заменил конкретные константы, числа, которые были указаны в delay на соответствующие переменные. red_on, red_yellow_on, green_on green_blink и так далее. Как вам понять, когда создавать макроопределения, вот эту штуку #define, а когда переменную? Критерий довольно простой. Если вы собираетесь работать с этими данными внутри программы, изменяя их, то есть если в начале у вас будет одно значение, над которым произойдут какие-то вычисления, манипуляции, и оно заменится на другое значение, естественно, вам нужна переменная. Когда же вам нужно просто зафиксировать некое число, например, номер контакта, или какую-то другую константу, проще создать макроопределение. Дополнительным бонусом будет то, что оно не займет память для данных, а у наших контроллеров память совсем небольшая. Затем, надеюсь, что вы обратили внимание на некоторую странность в том месте кода, где мы мигаем зеленым. В общем-то странного ничего нет, но, по-моему, довольно глупо три раза писать одно и то же. В связи с этим предлагаю вам следующее улучшение, а по совместительству одну из базовых управляющих конструкций, которая есть в любом языке программирования, а именно цикл со счетчиком. Здесь он у нас называется for и описывается следующим образом. Мы создаем некоторую переменную-счетчик уже знакомым нам образом: int i = 0, то есть вначале она будет иметь значение 0. Затем мы записываем некое условие, до тех пор, пока это условие выполняется, наш цикл будет работать. Следующим шагом мы указываем правило, по которому этот счетчик будет изменяться. То есть в данном случае переменная i будет увеличиваться на 1 каждый раз, когда будет начинаться новая итерация цикла, то есть цикл будет начинаться заново. Затем мы видим вновь наши любимые фигурные скобки, которые должны быть парными. И эта пара фигурных скобок находится внутри пары фигурных скобок loop, в рамках которого этот цикл создается. Давайте теперь внимательно посмотрим, как будет выполняться этот цикл. Вначале счетчик равен нулю. Очевидно, что 0 < 3, поэтому то, что описано внутри цикла, будет выполнено. После этого счетчик изменится по указанному нами правилу, то есть увеличится на 1. На следующей итерации условие будет вновь проверено, и переменная i, в данном случае равная 1 < 3, поэтому цикл выполнится вновь. После этого i = 2, цикл пройдет еще одну итерацию, а после этого, когда счетчик достигнет значения 3, вот это условие уже не будет выполняться, и программа перейдет к выполнению кода, описанного после цикла for. Таким образом, мы, во-первых, можем добиться многократного повторения некоего действия, в данном случае трехкратного мигания светодиодов. А во-вторых, на самом деле, внутри этого цикла мы можем использовать переменную-счетчик. Эксперименты с этим мы будем проводить в дальнейшем, но так или иначе это полезная вещь. Теперь давайте загрузим наш обновленный скетч и убедимся, что на самом деле ничего не изменилось. Ваш светофор работает точно так же, как и работал, только программа стала гораздо более удобной, читаемой. А кроме этого, вы знаете 3 полезных вещи: про создание макроопределений, переменных и организаций цикла со счетчиком for. Давайте загрузим окончательно обновленный скетч и увидим, что на самом деле ничего не изменилось. Наше устройство работает так же отлично. Красный, красный, желтый, зеленый. Зеленый мигает. Желтый и красный. Теперь я вас поздравляю с первым удачным погружением в среду Arduino. У вас есть время поэкспериментировать с вашим устройством, с кодом, есть время сдать тестирование, и приготовиться к следующей неделе. Я хочу, чтобы вы то, что мы рассмотрели сейчас, поняли досконально, потому что это фундамент. Если у вас возникают какие-то вопросы, не стесняйтесь задавать их, общайтесь друг с другом, пишите нам. До встречи на следующей неделе!

Часть: Видео

Модуль: Один старый и много новых знакомых

Описание модуля: Добро пожаловать! На этой неделе вас ждет введение в курс (обязательно ознакомьтесь с ним), а затем начало работы: знакомство с Arduino, средой разработки и первыми компонентами. Вы научитесь собирать схемы на макетке, напишете первую программу и получите первое готовое устройство. Не забывайте про важнейший раздел "Сделайте сами"!

Курс: Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера

Описание курса: На протяжении тысячелетий люди усовершенствовали орудия труда, изучали силы природы и подчиняли их себе, использовали их энергию для работы машин, а в прошлом веке создали машины, которые могут управлять другими машинами. Теперь создание устройств, которые взаимодействуют с физическим миром, доступно даже школьнику.

Наш курс состоит из серии практических задач про создание вещей, которые работают сами: изучают мир, принимают решения и действуют – двигаются, обмениваются данными друг с другом и с человеком, управляют другими устройствами. Мы покажем, как собирать эти устройства и программировать их, используя в качестве основы платформу Arduino.

Пройдя этот курс, вы сможете создавать устройства, которые считывают данные о внешнем мире с разнообразных датчиков, обрабатывают информацию, получают и отправляют данные на ПК, в Интернет, на мобильные устройства, управляют индикацией и движением. Создание устройств будет включать проектирование, изучение компонентов, сборку схем, написание программ, диагностику. Попутно с созданием самих устройств вы сделаете визуализацию на ПК, создадите веб-страницу, которую будет демонстрировать одно из ваших устройств, а также разберетесь с устройством и работой FDM 3D-принтера.

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

Курс не требует специальных знаний у слушателей, доступен даже ученикам старших классов средней школы. Плюсом будут навыки программирования и владение английским языком на уровне чтения технической документации, однако обязательным это не является.

Весь курс посвящен практике и самым лучшим решением для вас будет раздобыть электронику, повторять показанные примеры и экспериментировать самостоятельно.

Программа:
  • Неделя 1 Один старый и много новых знакомых
  • Неделя 2 Контроллер изучает мир
  • Неделя 3 Цель обнаружена
  • Неделя 4 Как полить цветок из другого города
  • Неделя 5 Мобильный робот
  • Неделя 6 Как создать новый предмет за час
Преподаватель: Алексей Перепелкин (1), Дмитрий Савицкий (2)

Описание преподавателя: (1) Алексей Перепёлкин занимается развитием робототехники на базе ЛИОТ МФТИ. В 2012 году открыл для себя новое захватывающее чувство – когда устройство, которое сам построил и запрограммировал, работает. Свернул с финансовой дорожки и создал кружок робототехники для подростков. Готовил их к соревнованиям. Стал посещать конференции, а затем проводил мастер-классы для тех, кто тоже хочет организовать занятия. Совместно с коллегами в 2013 году разработал новые соревнования – Робопрофи – для конкурса Робот для жизни и провел их. В 2014 году впервые провел Arduino-номинацию на фестивале Робофест, а для российского финала Russian Robot Olympiad 2014 сделал творческую категорию. С тех пор эти соревнования стали регулярными. Летом 2014 провел двухнедельную мастерскую в детском лагере Никола-Ленивца, а затем преподавал в выездной школе, посвященной программированию и робототехнике, которую провели ABBYY и Яндекс. В 2015 году стал руководителем направления робототехники в GoTo Camp, выездных школах, где участники создали десятки проектов, от прототипов умных домов и операторских тележек до робота-бубниста и принтера для незрячих. В 2014 году с коллегами начал проект Роболабы: мероприятия для школьников и студентов, где участники параллельно решают усложненные задачи, а затем проводят рефлексию сделанной работы и оценивают чужие в ходе серии мероприятий.

(2) Физик, научный сотрудник, выпускник МФТИ. Запустил кружок робототехники в 2011 году. Рассказал Алексею Перепелкину о том, как здорово вести кружок робототехники. Рассказал об этом еще целому ряду людей. Побеждал со своими командами на соревнованиях. Проводил проектную работу с участниками исследовательской выездной школы МКШ с 2013 года, где руководил реализацией физических и робототехнических проектов, например, «Вслед за солнцем», в котором изучалась эффективность динамической ориентации солнечных батарей на солнце. Вместе с коллегами разрабатывал и был судьей Робопрофи. Участвовал в подготовке проекта Роболабы. Вновь пришел в МФТИ для проведения факультативного курса «Основы создания киберфизических устройств»

Организатор: Лаборатория инновационных образовательных технологий МФТИ (1), Лаборатория инновационных образовательных технологий МФТИ (2)

Описание организатора: (2) Московский физико-технический институт (неофициально известный как МФТИ или Физтех) является одним из самых престижных в мире учебных и научно-исследовательских институтов. Он готовит высококвалифицированных специалистов в области теоретической и прикладной физики, прикладной математики, информатики, биотехнологии и смежных дисциплин. Физтех был основан в 1951 году Нобелевской премии лауреатами Петром Капицей, Николаем Семеновым, Левом Ландау и Сергеем Христиановичем. Основой образования в МФТИ является уникальная «система Физтеха»: кропотливое воспитание и отбор самых талантливых абитуриентов, фундаментальное образование высшего класса и раннее вовлечение студентов в реальную научно-исследовательскую работу. Среди выпускников МФТИ есть Нобелевские лауреаты, основатели всемирно известных компаний, известные космонавты, изобретатели, инженеры.

Категория: Компьютерные науки

Описание категории: Специализации и курсы по компьютерным наукам посвящены разработке и дизайну программного обеспечения, алгоритмическому мышлению, человеко-компьютерному взаимодействию, языкам программирования и истории вычислительной науки. Курсы в этой широкой области помогут вам мыслить абстрактно, методически подходить к проблемам и вырабатывать качественные решения.

Тематика: Разработка ПО

Материал: