Учить программированию можно по-разному. У себя в 169-ой мы пришли к тому, что один из наиболее продуктивных подходов — программирование микроконтроллеров на примере создания компьютерных игр. Почему так? Зачем вообще нужны какие-то микроконтроллеры? Давайте разбираться.
Для начала полезно будет вспомнить, зачем мы в принципе учим детей программированию. Только лишь для решения прикладных задач? Призываю всех перечитать ещё раз Сеймура Пейперта, "Переворот в сознании: Дети, компьютеры и плодотворные идеи".
Сеймур Пейперт использует метафору естественного для ребенка освоения нового языка в новой стране. "Две основополагающие идеи проходят через эту книгу. Первая состоит в утверждении, что можно придумать такие компьютеры, научение общению с которыми превратится в естественный процесс, скорее напоминающий изучение французского живущими во Франции людьми, а не мучительную процедуру постижения иностранных языков в американских школах. Вторая идея состоит в утверждении, что научение общению с компьютерами позволит изменить и другие формы обучения. Компьютер может говорить как на языке математика, так и на языке, использующем обычный алфавит. Мы учимся делать компьютеры, с которыми детям нравилось бы общаться. Когда происходит такое общение, дети осваивают математику наподобие живого языка". "Компьютер - это технический Протей. Это сущность - в его универсальности, в его способности к имитации".
Иными словами, с точки зрения обучения важно то, что компьютер способен стать средством имитации, моделирования физической реальности. А программирование - это инструмент, позволяющий самим детям заниматься компьютерным моделированием физической реальности, и свободно экспериментируя, глубоко осваивать ее законы.
Давайте вспомним и о том, что любая компьютерная игра, воссоздающая реальное поведение объектов, включает соответствующую физическую модель. Чтобы предметы падали, нужно научить их падать. Чтобы предметы сталкивались, нужно научить их сталкиваться. Создавая компьютерную игру, дети создают физические модели, то есть занимаются компьютерным моделированием физической реальности. Именно это и является самым главным с точки зрения обучения. Кроме того, создание игр вызывает у детей живой интерес.
Оправдано ли использовать игры в учебном процессе? Думаю, вряд ли мне следует сильно агитировать за геймификацию, но всё-таки выскажусь: как бы мы не относились к играм, они во все времена были и во все времена будут именно той деятельностью, которой занимаются дети, и биологическая функция игры у людей и прочих животных — именно обучение!
Только есть одна загвоздка... Игры — это как атомная энергия. Чтобы использовать её в мирных целях, ею необходимо очень и очень хорошо управлять. Но человек (уж мы с вами точно!), в отличие от прочих животных, в большей степени способен осознанно контролировать происходящее. И несмотря на существование такого феномена как "компьютерная зависимость" (ru.wikipedia.org/wiki/Компьютерная_зависимость) и "зависимость от компьютерных игр" (ru.wikipedia.org/wiki/Зависимость_от_компьютерных_игр), мы всё-таки храбро будем продолжать программировать игры на занятиях.
Какую роль играют микроконтроллеры в свете всего вышеописанного? Это тот самый "мостик", который связывает два мира, физический и виртуальный, не дает "увязнуть" в иллюзорности.
Использование микроконтроллеров позволяет продемонстрировать детям применимость созданных компьютерных моделей для решения практических задач, в том числе для управления реальными объектами. Пример — проект "Умный домик" из книги "Scratch и Arduino для юных программистов и конструкторов". В зависимости от реального уровня освещенности не только меняется изображение на экране, но и щелкает вполне реальный модуль реле, включая и выключая вполне реальную лампочку.
Пример проекта продвинутого уровня из нашей новой книги "Игровая робототехника для юных программистов и конструкторов: mBot и mBlock". Робот сканирует пространство вокруг себя, с использованием показаний дальномера на экране компьютера рисуется "карта" препятствий, в результате можно управлять перемещениями компьютерного персонажа так, чтобы он объехал метки препятствий, а робот воспроизводит траекторию перемещения компьютерного персонажа на местности.
http://www.instagram.com/p/BjWtpOBAtvQ/?taken-by=projectlab169
Но оба примера выше — достаточно сложны, чтобы с них начинать. Что можно предложить поначалу? Программируя игры, мы стараемся использовать такие проекты, в которых управление будет осуществляться именно на основании показаний датчиков, подключенных к роботу или микроконтроллеру. Это позволяет детям не "увязать" в игровом процессе, акцентирует внимание на инженерных задачах, например, создании эргономичных игровых пультов, вопросах считывания и преобразования значений и т.д.
Например, можно управлять "летающей тарелкой" во время "звездных гонок", накреняя корпус робота (или игровой пульт на базе микроконтроллера с подключенным гироскопом) налево или направо (проект из книги "Игровая робототехника для юных программистов и конструкторов").
Хотите узнать на практике, как всё это выглядит? Давайте создадим очень простой, первоначальный вариант несложной игры. Управление будет осуществляться одной кнопкой. Можно использовать готовый контроллер mCore робота mBot с уже встроенной кнопкой и готовым блоком "кнопка нажата" в визуальной среде mBlock. Но не надо забывать, что нажатие и отпускание кнопки это всего лишь замыкание и размыкание контакта, появление и исчезновение электрического напряжения на "ноге" (pin) микроконтроллера. Поэтому с тем же самым успехом можно использовать распространенную и доступную плату Arduino в сочетании с кнопочным модулем или платой расширения "Joystick Shield", а также базовый блок чтения состояния порта "digitalRead" (на русский переведено в mBlock как "читать цифровой pin").
Сюжет: голодная рыбка плавает влево-вправо, разворачиваясь у края экрана, кроме того, ее можно развернуть в произвольный момент, нажав на кнопку игрового пульта. Сверху периодически опускаются съедобные предметы, которые вовремя надо суметь подобрать.
Итак, первым делом скачиваем и устанавливаем mBlock for PC версии 3.4.11 (mBlock5 использовать пока не будем, о нем поговорим позже) с сайта разработчиков (www.mblock.cc).
Проверяем настройки: "Language" — "Русский", "Boards" — "Arduino Uno", "Extensions" — "Arduino".
Подключаем игровой пульт на базе Arduino Uno и Joystick Shield к компьютеру при помощи кабеля USB. Устанавливаем соединение через последовательный порт. "Соединить" — "Serial Port" — "COM3" (предположим). Загружаем прошивку: "Соединить" — "Обновить прошивку". Проверяем наличие соединения, щелкаем мышью по блоку "читать аналоговый pin (A) 0" из группы "Робот" на палитре блоков. Мы должны увидеть какое-то значение, отличное от нуля.
Удаляем спрайт "M-Panda" (базовые навыки работы в Scratch у всех есть?), добавляем спрайт "Fish3" из библиотеки. Далее собираем для этого спрайта следующий набор скриптов (необходимо будет создать переменную "датчик"). Кнопку будем использовать нижнюю, связанную с пином 4.
Добавляем из библиотеки спрайт "Apple", создаем для него скрипт.
Дублируем спрайт "Apple" один или несколько раз, при желании заменяем костюм. Пробуем!
Ваша программа работает? Есть ли ошибки, всё ли происходит именно так, как вам хотелось бы? "Ошибки приносят нам пользу, поскольку они заставляют нас разобраться в том, что произошло, понять, где мы пошли по ложному пути, и через такое понимание исправить их. Опыт программирования на компьютере эффективнее любой другой деятельности заставляет уверовать в отладку" (Сеймур Пейперт).
Функционирующий проект — это "лакмусовая бумажка", заменяющая оценку учителя и наглядно демонстрирующая ребенку, что он добился результата, достиг поставленной цели. И это тот самый путь, идя по которому, ребенок в конце концов перестанет лишь пассивно усваивать информацию, сможет заняться самообучением, осознанно формулируя персональные задачи и выбирая методы, позволяющие их решить.
P.S. Процесс создания и отладки проекта "Голодная рыбка" подробно описан в книге "Scratch и Arduino для юных программистов и конструкторов".