Для тех, кто учится не в Англии, плата бесплатной, разумеется, не будет. Но заказать ее по вполне невысокой цене можно на eBay или на Amazon. Кстати, пока плата идет почтой, можно уже начинать писать программы - на сайте доступен полностью функциональный эмулятор, к которому мы и приступим.
Для тех же, кому возможностей платы станет мало, можно заказать “Набор изобретателя” (inventor’s kit), состоящий из платы расширения, макетной платы и различных деталей.

А мы пока начнем с самого начала.
5.2 Первая программа для BBC Micro:bit
Первое что удивляет, никакого софта на компьютер ставить не нужно вообще (кстати, это удобно и для школ - им не придется покупать лицензионное программное обеспечение). При подключении платы к компьютеру, она просто видна как съемный диск. Дальше достаточно зайти на сайт http://microbit.org/code/ и выбрать на каком языке мы хотим писать — Javascript или Python. Мы выберем блочный редактор Javascript, как самый простой для начинающих. Сам код писать не придется, все конструкции перетаскиваются мышью прямо на экране.
Редактор Javascript в «блочном» режиме открывается прямо в браузере и выглядит вот так:

Традиционно, начнем с самого простого - мигания светодиодом. Здесь у нас даже не один светодиод, а целая матрица 5х5. Выберем раздел Basic, из него “перетащим” на экран компоненты show leds и pause, как показано на рисунке справа.
Как можно видеть, принципиального отличия от того, что мы делали в Arduino, в общем и нет. Лишь названия немного другие, например, вместо setup используется функция on_start, а вместо функции loop, используется функция forever. Инициализация режима ввода-вывода делается автоматически, что проще.
Сам код очень прост. Мы выводим определенную картинку на матрицу светодиодов, затем делаем паузу на 500мс (0.5с), затем меняем картинку на другую, и процесс повторяется. Режим перетаскивания блоков мышью удобен тем, что не дает сделать синтаксических ошибок, это позволяет создавать программы даже самым маленьким детям. Кстати, желающие посмотреть, как код устроен внутри, могут переключиться из “блочного” редактора в “обычный”, нажав кнопку Javascript. При этом откроется окно с текстом программы:
basic.forever(() => {
basic.showLeds(`
. . # . .
. # . # .
# . . . #
. # . # .
. . # . .
`)
basic.pause(500)
basic.showLeds(`
. . . . .
. . # . .
. # . # .
. . # . .
. . . . .
`)
basic.pause(500)
})
Здесь, как можно видеть, задается лишь функция basic.forever, что делается внутри нее, вполне читабельно и понятно.
Еще один удобный момент - при добавлении компонентов, симулятор платы слева начинает работать автоматически, показывая что получится в результате. Таким образом, для написания и отладки программы даже не нужна сама плата BBC Micro:bit, все можно сделать прямо в симуляторе на странице.
Наконец, посмотрев на программу в симуляторе, можно загрузить ее в реальную плату. Подключаем Micro:bit к компьютеру USB-кабелем (она определится в системе как диск), на странице нажимаем Download, и сохраняем получившийся Hex-файл на новый диск. После сохранения, программа запустится автоматически, и мы увидим горящие светодиоды. Как и в случае с Arduino, программа сохраняется во флеш-памяти, и при следующем включении платы будет запущена автоматически. Это позволяет использовать BBC Micro:bit автономно, отдельно от компьютера.
5.3 Возможности ввода-вывода
Несмотря на небольшой размер, BBC Micro:bit имеет достаточно разнообразные способы ввода данных.
Пользователю доступны:
- нажатие кнопок А или В,
- одновременное нажатие кнопок А+В,
- прикосновение одной рукой к контакту 0, 1 или 2, другой к GND,
- встряхивание,
- использование акселерометра.
Для примера, сделаем простой счетчик, увеличивающий значение при нажатии кнопки “А” или “В”, одновременное нажатие будет сбрасывать счетчик в 0. Он может пригодиться например, при подсчете числа посетителей на спортивном соревновании, птиц, прилетающих к кормушке, и пр. Такие устройства, кстати, до сих пор производятся и продаются в “механическом” виде:

Ну а мы сделаем электронную версию такого счетчика. “Код” несложно создать мышью, блок-схема показана на рисунке.

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

Когда программа проверена и отлажена, ее можно загрузить в реальную плату. Кстати, в комплекте с платой идет блок питания от батареек, так что BBC Micro:bit можно брать с собой и использовать не только дома, но и с друзьями или на улице.
Самостоятельная работа: попробовать остальные способы ввода, доступные на BBC Micro:bit. Кстати, среди них есть довольно-таки экзотические, например в качестве события можно использовать “свободное падение”.
5.4 Управление наклонами платы - использование акселерометра
Рассмотрим режим, наиболее подходящий для несложных игр - выведем на экране пиксел, которым можно будет управлять, наклоняя плату в разную сторону. За наклоны платы “отвечает” акселерометр - сенсор, позволяющий получить значения относительно осей x, y и z.
Шаг-1: Узнаем, как меняются показания акселерометра при наклоне платы. Это можно найти в документации, но гораздо проще и быстрее просто проверить. Для этого создаем простую программу, выводящую значения на экран.
Запускаем программу, наклоняем плату и убеждаемся что значения варьируются в диапазоне -1023...1023.
Шаг-2. Выведем на экране точку, положение которой будет определяться двумя координатами x и y.
Матрица светодиодов имеет размерность 5х5, соответственно, координаты точек будут изменяться от (0,0) до (4,4).

Шаг-3. Изменим значение x, если наклон платы превышает определенную величину. Максимальный наклон равен 1023, возьмем нечто меньшее, например 200. Также необходимо будет добавить проверку на пересечение краев экрана: х не должно быть меньше 0 и больше 4. Также добавим паузу, чтобы точка не “убегала” слишком быстро. Получается немного громоздкая, но вполне понятная конструкция.

Сам код вполне понятен - если наклон платы превышает пороговую величину, мы гасим старый пиксел командой unplot, увеличиваем (или уменьшаем) значение координаты, и зажигаем пиксел снова командой plot. Кстати, в данном случае бывает полезно переключиться в режим прямого редактирования кода - однотипные блоки и логические выражения вводить так гораздо быстрее. Полностью код выглядит так:
let y = 2
let x = 2
led.plot(x, y)
basic.forever(() => {
if (input.acceleration(Dimension.X) < -200 && x > 0) {
led.unplot(x, y)
x = x - 1
led.plot(x, y)
basic.pause(100)
}
if (input.acceleration(Dimension.X) > 200 && x < 4) {
led.unplot(x, y)
x = x + 1
led.plot(x, y)
basic.pause(100)
}
})
Запускаем программу, убеждаемся что можем управлять точкой с помощью наклонов платы:

Самостоятельная работа #1: Добавить обработку второй координаты y, чтобы точка могла двигаться не только по горизонтали, но и по вертикали.
Самостоятельная работа #2: Продумать и реализовать сценарий мини-игры, где сверху будут падать объекты, а с помощью “каретки” их можно будет ловить. “Каретку” можно будет сделать их двух точек, находящихся на нижней плоскости (y-координата всегда будет = 4), наклонами платы ее можно будет двигать вправо-влево. Для хранения информации о падающих объектах нужно будет добавить отдельные переменные.
5.5 Игра “Змейка”
Мы уже умеем двигать точку по экрану. Рассмотрим более сложную задачу - будем двигать “змейку”, состоящую из нескольких точек.

Основная сложность здесь - в хранении координат, для чего мы используем структуру данных, называемую массив. Массив - это список объектов одного типа, как раз то что нам нужно.
Шаг 1. Продумаем структуру данных. В нашем случае, мы будем использовать два массива для хранения координат x и y. Наша “змея”, таким образом, будет представляться в памяти следующим образом:
Важно иметь в виду, что массивы нумеруются с нуля. Соответственно, элемент x[0], y[0] указывает на “хвост” змеи, элемент x[3], y[3] указывает на “голову”. Обозначим количество элементов как N=4, это позволит легко менять длину змеи, изменив всего один параметр. Тогда “головой” будет элемент x[N-1], y[N-1].
К сожалению, создавать массивы в визуальном редакторе не очень удобно. Проще переключиться в режим кода, и добавить следующий текст:
let N = 4
let x: number[] = [0, 1, 2, 3]
let y: number[] = [4, 4, 4, 4]
Мы создали массивы x и y и проинициализировали их начальными значениями. Теперь выведем точки на экран:
for (let p = 0; p < N; p++) {
led.plot(x[p], y[p])
}
Шаг-2. Движение “змеи”. Это пожалуй, самая сложная часть данной задачи.
Чтобы передвинуть змею, мы должны:
- выключить крайний элемент в “хвосте”,
- сдвинуть все остальные элементы массива влево (первый станет нулевым, второй первым и пр),
- изменить значение элемента в “голове” и включить новый светодиод.
Графически для массива X это выглядит так (для Y все аналогично):
Все это несложно по сути, главное не ошибиться с индексами и не перепутать, что куда сдвигается. Новое значение xN будет вычисляться из старого, в зависимости от того, куда движется змея. Напишем универсальную функцию moveSnake, которая сдвигает змею в любую сторону.
function moveSnake(dx: number, dy: number) {
if (x[N - 1] + dx < 0 || x[N - 1] + dx > 4 ||
y[N - 1] + dy < 0 || y[N - 1] + dy > 4) {
return
}
led.unplot(x[0], y[0])
for (let q = 0; q < N - 1; q++) {
x[q] = x[q + 1]
y[q] = y[q + 1]
}
x[N - 1] = x[N - 2] + dx
y[N - 1] = y[N - 2] + dy
led.plot(x[N - 1], y[N - 1])
}
Рассмотрим код подробнее. Параметры dx и dy - приращения координат: если змея движется вправо, то dx=1, если влево, то dx=-1, если вверх то dy=-1, если вниз то dy=1. Т.к. “змея” движется головой вперед, то эти приращения добавляются к координатам “головы”. Но вначале мы проверяем, что “змея” не уйдет за края экрана, и что новые значения не будут меньше 0 или больше 4. Команда led.unplot(x[0], y[0]) выключает последний светодиод в “хвосте” змеи. Затем в цикле for мы сдвигаем все элементы “змеи”, как было показано выше на рисунке. Последним шагом мы формируем новое значение координат “головы”, которое мы определяем как старое значение, плюс новое приращение координат dx, dy. Наконец, нам достаточно включить новый светодиод функцией led.plot(x[N - 1], y[N - 1]).
Шаг-3. Подключение акселерометра. В зависимости от наклона платы, будем двигать “змею” в нужную сторону.
if (input.acceleration(Dimension.X) > 200) {
moveSnake(1, 0)
basic.pause(200)
}
if (input.acceleration(Dimension.X) < -200) {
moveSnake(-1, 0)
basic.pause(200)
}
...
На этом программа готова. Код полностью приведен ниже, его можно просто скопировать в редактор для запуска на плате или в симуляторе.
let N = 4
let x: number[] = [0, 1, 2, 3]
let y: number[] = [4, 4, 4, 4]
for (let p = 0; p < N; p++) {
led.plot(x[p], y[p])
}
function moveSnake(dx: number, dy: number) {
if (x[N-1] + dx < 0 || x[N-1] + dx > 4 || y[N-1] + dy < 0 || y[N-1] + dy > 4)
{
return
}
led.unplot(x[0], y[0])
for (let q = 0; q < N - 1; q++) {
x[q] = x[q + 1]
y[q] = y[q + 1]
}
x[N - 1] = x[N - 2] + dx
y[N - 1] = y[N - 2] + dy
led.plot(x[N - 1], y[N - 1])
}
basic.forever(() => {
if (input.acceleration(Dimension.X) > 200) {
moveSnake(1, 0)
basic.pause(200)
}
if (input.acceleration(Dimension.X) < -200) {
moveSnake(-1, 0)
basic.pause(200)
}
if (input.acceleration(Dimension.Y) > 200) {
moveSnake(0, 1)
basic.pause(200)
}
if (input.acceleration(Dimension.Y) < -200) {
moveSnake(0, -1)
basic.pause(200)
}
})