====== Espruino Pixl.js: распиновка, схема подключения и программирование ======
[[amp>product/espruino-pixl-js?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Espruino Pixl.js]] — платформа для разработки со встроенным интерпретатором JavaScript. Плата выполнена в формфакторе Arduino R3: с одной стороны расположены контактные колодки для подключения [[amp>collection/arduino-shields?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|шилдов]], а с обраной графический LCD-дисплей.
{{ :products:espruino-pixl-js:espruino-pixl-js.1.jpg?nolink |}}
Мозгом платы является модуль MDBT42Q с чипом Nordic nRF52840, который также обеспечивает беспроводную связь и прошивку по Bluetooth v5.0.
===== Подключение и настройка =====
Платформа поддерживает два типа подключения и отладки:
* [[#беспроводное_подключение|По беспроводному протоколу BLE]]
* [[#проводное_подключение|По проводному последовательному интерфейсу UART]]
==== Беспроводное подключение ====
Если у вас на ПК отсутствует Bluetooh-модуль или вы сторонник проводной системы — [[#проводное_подключение|используйте проводной способ коммуникации с платформой]].
{{ :products:espruino-pixl-js:espruino-pixl-js-wireless.jpg?nolink |}}
=== Шаг 1 ===
Для старта подключите к плате Espruino Pixl.js линию питания и земли. Выберите один из нескольких вариантов:
* **Разъём USB** Самый простой способ: подключите платформу к питанию через [[amp>product/usb-cable-micro?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|кабель USB (A — Micro USB)]].{{ :products:espruino-pixl-js:espruino-pixl-js-wiring-usb-cable-micro.png?nolink|}}
* **Батарейка CR2032** Портативный способ: вставьте батарейку формата CR2032 в батарейный отсек на плате.{{ :products:espruino-pixl-js:espruino-pixl-js-wiring-cr2032.png?nolink|}}
* **Контакты VIN** Подключите внешний источник питания к контактам ''VIN'' и ''GND''. Диапазон входного напряжения от 3,5 до 16 вольт.{{ :products:espruino-pixl-js:espruino-pixl-js-wiring-battery.png?nolink|}}
=== Шаг 2 ===
Для работы с платой Espruino Pixl.js по беспроводному протоколу Bluetooth добавьте и настройте в Google Chrome среду программирования [[js:ide|Espruino Web IDE]].
==== Проводное подключение ====
{{ :products:espruino-pixl-js:espruino-pixl-js-wiring.jpg?nolink |}}
=== Шаг 1 ====
На плате пристутсвтует физический порт USB, но он предназначен только для питания платформы. В итоге, для коммуникации с компьютером нам понадобиться [[amp>product/troyka-usb-uart?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|USB-UART преобразователь]], а чтобы избавиться от проводов используйте переходник [[amp>product/arduino-troyka-slot-shield?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Troyka Slot Shield]].
{{ :products:espruino-pixl-js:espruino-pixl-js-wiring-troyka-usb-uart.png?nolink |}}
=== Шаг 2 ===
Для работы с платой Espruino Pixl.js добавьте и настройте в Google Chrome среду программирования [[js:ide|Espruino Web IDE]].
===== Примеры работы =====
Рассмотрим несколько примеров с платформой Pixl.js.
==== Маячок на макетке ====
Во всех традициях DIY, мигнём светодиодом на 13 пине.
=== Что понадобится ===
Так как на платформе отсутвует встроенный светодиод, используем дополнительную расспыху:
* [[amp>product/usb-cable-micro?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Espruino Pixl.js]]
* [[amp>product/breadboard-mini?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Breadboard Mini]]
* [[amp>product/led-5mm?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Светодиод 5 мм]]
* [[amp>product/resistor?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Резистор 220 Ом]]
* [[amp>product/wire-mm?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Соединительные провода «папа-папа»]]
{{ :products:espruino-pixl-js:espruino-pixl-js-example-blink-breadbord.1.png?nolink |}}
=== Исходный код ===
Прошейти платформу скриптом ниже.
// переменная состояния светодиода
var state = false;
// каждую секунду переключаем светодиод на пине D13
setInterval(function() {
state = !state;
D13.write(state);
}, 1000);
{{ :products:espruino-pixl-js:espruino-pixl-js-example-blink-breadbord.gif?nolink |}}
==== Маячок на модулях ====
Если вам скучно и неинтересно собирать схемы на макетке, используйте нашу экосистему Troyka-модулей: проапдейтим проект маячок на модулях.
=== Что понадобится ===
Так как на платформе отсутвует встроенный светодиод, используем дополнительную расспыху:
* [[amp>product/usb-cable-micro?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Espruino Pixl.js]]
* [[amp>product/arduino-troyka-slot-shield?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Troyka Slot Shield]]
* [[amp>product/troyka-5mm-led-module?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Светодиод 5 мм (Troyka-модуль)]]
{{ :products:espruino-pixl-js:espruino-pixl-js-examples-blink-slot-shield.1.png?nolink |}}
=== Исходный код ===
Прошейти платформу аналогичным скриптом проекта «маячок».
// переменная состояния светодиода
var state = false;
// каждую секунду переключаем светодиод на пине D13
setInterval(function() {
state = !state;
D13.write(state);
}, 1000);
{{ :products:espruino-pixl-js:espruino-pixl-js-examples-blink-slot-shield.gif?nolink |}}
==== Игра «Динозавр из Google» ====
{{ :products:espruino-pixl-js:espruino-pixl-js-example-dinosaur-game.jpg?nolink |}}
Платформа Pixl.js может похвастаться встроенным монохромным LCD-дисплеем с разрешением 128×64 пикселя. Разработчики платы также установили на платформу четыре пользовательских кнопки. Весь этот сет даёт возможность создавать простые игры на Pixl.js прямо из коробки без дополнительных комплектующих. Восоздадим игру из поиска Google, которая появляется при отсутсвии интренет соединения.
=== Исходный код ===
var BTNL = BTN4;
var BTNR = BTN3;
var BTNU = BTN1;
// Images can be added like this in Espruino v2.00
var IMG = {
rex: [
Graphics.createImage(`
########
##########
## #######
##########
##########
##########
#####
########
# #####
# #######
## ##########
### ######### #
##############
##############
############
###########
#########
#######
### ##
## #
#
##
`),
Graphics.createImage(`
########
##########
## #######
##########
##########
##########
#####
########
# #####
# #######
## ##########
### ######### #
##############
##############
############
###########
#########
#######
### ##
## ##
#
##
`),
Graphics.createImage(`
########
# ######
# # ######
# ######
##########
##########
#####
########
# #####
# #######
## ##########
### ######### #
##############
##############
############
###########
#########
#######
### ##
## #
# #
## ##
`),
],
cacti: [
Graphics.createImage(`
##
####
####
####
####
#### #
# #### ###
### #### ###
### #### ###
### #### ###
### #### ###
### #### ###
### #### ###
### #### ###
###########
#########
####
####
####
####
####
####
####
####
`),
Graphics.createImage(`
##
##
# ##
## ## #
## ## #
## ## #
## ## #
##### #
#### #
#####
####
##
##
##
##
##
##
##
`),
],
};
IMG.rex.forEach((i) => (i.transparent = 0));
IMG.cacti.forEach((i) => (i.transparent = 0));
var cacti, rex, frame;
function gameStart() {
rex = {
alive: true,
img: 0,
x: 10,
y: 0,
vy: 0,
score: 0,
};
cacti = [{ x: 128, img: 1 }];
var random = new Uint8Array((128 * 3) / 8);
for (var i = 0; i < 50; i++) {
var a = 0 | (Math.random() * random.length);
var b = 0 | (Math.random() * 8);
random[a] |= 1 << b;
}
IMG.ground = { width: 128, height: 3, bpp: 1, buffer: random.buffer };
frame = 0;
setInterval(onFrame, 50);
}
function gameStop() {
rex.alive = false;
rex.img = 2; // dead
clearInterval();
setTimeout(function () {
setWatch(gameStart, BTNU, { repeat: 0, debounce: 50, edge: "rising" });
}, 1000);
setTimeout(onFrame, 10);
}
function onFrame() {
g.clear();
if (rex.alive) {
frame++;
rex.score++;
if (!(frame & 3)) rex.img = rex.img ? 0 : 1;
// move rex
if (BTNL.read() && rex.x > 0) rex.x--;
if (BTNR.read() && rex.x < 20) rex.x++;
if (BTNU.read() && rex.y == 0) rex.vy = 4;
rex.y += rex.vy;
rex.vy -= 0.2;
if (rex.y <= 0) {
rex.y = 0;
rex.vy = 0;
}
// move cacti
var lastCactix = cacti.length ? cacti[cacti.length - 1].x : 127;
if (lastCactix < 128) {
cacti.push({
x: lastCactix + 24 + Math.random() * 128,
img: Math.random() > 0.5 ? 1 : 0,
});
}
cacti.forEach((c) => c.x--);
while (cacti.length && cacti[0].x < 0) cacti.shift();
} else {
g.drawString("Game Over!", (128 - g.stringWidth("Game Over!")) / 2, 20);
}
g.drawLine(0, 60, 127, 60);
cacti.forEach((c) => g.drawImage(IMG.cacti[c.img], c.x, 60 - IMG.cacti[c.img].height));
// check against actual pixels
var rexx = rex.x;
var rexy = 38 - rex.y;
if (
rex.alive &&
(g.getPixel(rexx + 0, rexy + 13) ||
g.getPixel(rexx + 2, rexy + 15) ||
g.getPixel(rexx + 5, rexy + 19) ||
g.getPixel(rexx + 10, rexy + 19) ||
g.getPixel(rexx + 12, rexy + 15) ||
g.getPixel(rexx + 13, rexy + 13) ||
g.getPixel(rexx + 15, rexy + 11) ||
g.getPixel(rexx + 17, rexy + 7) ||
g.getPixel(rexx + 19, rexy + 5) ||
g.getPixel(rexx + 19, rexy + 1))
) {
return gameStop();
}
g.drawImage(IMG.rex[rex.img], rexx, rexy);
var groundOffset = frame & 127;
g.drawImage(IMG.ground, -groundOffset, 61);
g.drawImage(IMG.ground, 128 - groundOffset, 61);
g.drawString(rex.score, 127 - g.stringWidth(rex.score));
g.flip();
}
gameStart();
Теперь используя встроенные кнопки на плате Pixl, помогите динозавру Рексу бежать по пустныни и не врезаться в кактусы.
===== Элементы платы =====
{{ :products:espruino-pixl-js:espruino-pixl-js-annotation.png?nolink |}}
==== Дисплей ====
На плате расположен монохромный LCD-дисплей {{ :products:espruino-pixl-js:jhd12864-g176bsw-datasheet.pdf |JHD12864-G176BSW}} с разрешением 128×64 пикселей. Матрица экрана подключена к встроенному чипу {{ :products:espruino-pixl-js:st7567-datasheet.pdf |ST7567}}, который занимается отрисовкой и другими параметрами дисплея. С основным контроллером, в нашем случае [[#модуль_mdbt42q|модуль MQBT42Q]], дисплей общается по интерфейсу SPI.
Экран пригодиться для отображения показаний сенсоров и модулей в виде текста, графиков и диаграмм.
Для работы с дисплеем используйте библиотеку [[http://www.espruino.com/Graphics|Espruino Graphics]], в которой собраны примеры отрисовки графики от пикселя до полноценных битовых изображений.
==== Модуль MDBT42Q ====
Платформа Espruino Pixl.js выполнена на модуле {{ :products:espruino-pixl-js:mdbt42q-datasheet.pdf |MDBT42Q}}, который включает в себя 32-битный микроконтроллер {{ :products:espruino-pixl-js:nrf52832-product-specification.pdf |Nordic nRF52840}} на архитектуре ARM Cortex-M4 с тактовой частотой 64 МГц, 512 КБ Flash-памяти и 64 КБ SRAM-памяти.
{{ :products:espruino-pixl-js:espruino-pixl-js-composed.png?nolink |}}
Чип Nordic nRF52840 так же обеспечивает связь Bluetooth v5.0 в диапазоне 2,4 ГГц и поддерживает энергосберегающий протокол Bluetooth Low Energy (BLE). Всё это позволяет прошивать и отлаживать платформу Pixl.js через Espruino Web IDE прямо по воздуху.
==== Пользовательские кнопки ====
На плате расположено четыре кнопки, которые пригодятся для создания и теста простых программ, без подключения дополнительных тактильных сенсоров.
^ Имя кнопки ^ Назначение ^
| BTN1 | Пользовательская кнопка подключена к ''H1'' цифровому пину микроконтроллера. Используйте определение ''BTN1'' для работы с кнопкой.|
| BTN2 | Пользовательская кнопка подключена к ''H2'' цифровому пину микроконтроллера. Используйте определение ''BTN2'' для работы с кнопкой.|
| BTN3 | Пользовательская кнопка подключена к ''H3'' цифровому пину микроконтроллера. Используйте определение ''BTN3'' для работы с кнопкой.|
| BTN4 | Пользовательская кнопка подключена к ''H4'' цифровому пину микроконтроллера. Используйте определение ''BTN4'' для работы с кнопкой.|
Кнопка BTN1 также может переводить плату в DFU-режим. Это позволит [[js:ide:dfu-firmware|перепрошить или обновить интерпретатор JavaScript]] в микроконтроллер без дополнительного программатора. Для перевода в DFU-режим:
* Отключите питание от платформы.
* Зажмите кнопку BTN1.
* Подключите питание к платформе и отпустите кнопку.
==== Разъём micro-USB ====
Порт micro-USB предназначен для питания платформы Pixl.js через [[amp>product/usb-cable-micro?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|кабель USB (A — Micro USB)]] с [[amp>product/usb-power-plug-3a?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|блоком питания на 5 вольт]].
Если вы хотите не только питать, но и прошивать плату по кабелю, используйте внешний [[amp>product/troyka-usb-uart?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|USB-UART преобразователь]]. Подробности читайте в разделе [[#проводное_подключение|проводное подключение платформы Pixl.js]].
==== Понижающий регулятор 3V3 ====
Линейный понижающий регулятор напряжения {{ :products:espruino-pixl-js:mic5225-3v3-datasheet.pdf |MIC5225-3V3}} обеспечивает питание дисплея, модуля [[#модуль_mdbt42q|MDBT42Q]] и другой логики платы при подключении питания через пин ''VIN''. Диапазон входного напряжения от 3,6 до 16 вольт. Выходное напряжение 3,3 В с максимальным выходным током 150 мА.
==== Гнездо для батарейки ====
На плате расположен отсек для батарейки CR2032, которая обеспечивает работу платформы в портативном режиме. В автономном варианте батарейка сможет протянуть и обеспечить питание платфомы Pixl.js до 20 дней.
==== Контакты SWD ====
Колодки SWD предназначены для подключения программатора и отладчика ST-Link.
===== Распиновка =====
[[this>_media/products:espruino-pixl-js:espruino-pixl-js-pinout.pdf|{{:products:espruino-pixl-js:espruino-pixl-js-pinout.png}}]]
Плата Espruino Pixl.js выполнена в формфакторе Arduino R3, что даёт полную совместимость с [[amp>collection/arduino-shields?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Arduino Shields]].
==== Пины питания ====
* **VIN** Входной пин для подключения внешнего источника напряжения в диапазоне от 3,5 до 16 вольт.
* **VOUT** На платформе Pixl.js отсутствует линия питания 5 вольт, поэтому по умолчанию пин VOUT отключён. Но вы можете подключить к нему одну из линий питания на выбор: VIN или 3V3.
* **3V3** Выходной пин от стабилизатора напряжения с выходом 3,3 вольта и максимальных током 150 мА. Регулятор обеспечивает питание модуля [[#модуль_mdbt42q|MDBT42Q]] и другой вспомогательной логики платы.
* **GND** Выводы земли.
==== Порты ввода/вывода ====
В отличие от большинства плат Arduino, родным напряжением Espruino Pixl.js является 3,3 В, а не 5 В. Выходы для логической единицы выдают 3,3 В, а в режиме входа ожидают принимать не более 3,3 В. Более высокое напряжение может повредить микроконтроллер!
Будьте внимательны при подключении периферии: убедитесь, что она может корректно функционировать в этом диапазоне напряжений.
* **Цифровые входы/выходы** 20 пинов: ''D0''–''D13'' и ''A0''–''A5''\\ Логический уровень единицы — 3,3 В, нуля — 0 В. Максимальный ток выхода — 15 мА. К контактам подключены подтягивающие резисторы, которые по умолчанию выключены, но могут быть включены программно.
* **ШИМ** все пины ввода-вывода\\ Позволяет выводить аналоговые значения в виде ШИМ-сигнала. Разрядность ШИМ установлена в 12 бит. Платформа поддерживает 4 канала аппаратного ШИМ-сигнала, каждый последующий становиться программным.
* **АЦП** 7 пинов: ''A0''–''A5'', ''D3'' и ''D4''\\ Позволяет представить аналоговое напряжение в виде цифровом виде. Разрядность АЦП установлена в 12 бит.
* **NFC**\\ Для общения с картами общественного транспорта, смартфонами и планшетами, поддерживающими технологию Near Field Communication. Антенна уже встроеная в плату Pixl.js и подключена к внутренним пинам модуля MQBT42Q.
==== Интерфейсы ====
Каждый пин ввода-вывода платформы поддерживает аппаратные интерфейсы.
^ Интерфейс ^ Количество ^ Назначение ^
|I²C| 1 | Используется для общения с периферией по параллельному интерфейсу «I²C».|
|SPI| 1 | Для общения с периферией по последовательному интерфейсу «SPI».|
|UART/Serial| 1 | Для общения с периферией по интерфейсу «UART».|
===== Принципиальная и монтажная схемы =====
{{:products:espruino-pixl-js:espruino-pixl-js-schematic.png?direct&540 |}}
{{ :products:espruino-pixl-js:espruino-pixl-js-layout-top.png?direct&130|}}
{{ :products:espruino-pixl-js:espruino-pixl-js-layout-bottom.png?direct&130|}}
===== Габаритный чертёж =====
[[this>_media/products:espruino-pixl-js:espruino-pixl-js-dimensions.pdf|{{:products:espruino-pixl-js:espruino-pixl-js-dimensions.png}}]]
===== Характеристики =====
* Модуль: MDBT42Q с чипом nRF52832
* Ядро: 32-битный ARM Cortex M4
* Частотный диапазон связи: 2,4 ГГц
* Стандарт связи: Bluetooth v5.0 с поддержкой BLE
* Тактовая частота: 64 МГц
* Flash-память: 512 КБ
* SRAM-память: 64 КБ
* Индикация: встроенный LCD-экран
* Пинов ввода-вывода всего: 20
* Напряжение логических уровней: 3,3 В
* Пины с АЦП: 7
* Разрядность АЦП: 12 бит
* Пины с ШИМ: 20
* Разрядность ШИМ: 12 бит
* Аппаратных интерфейсов SPI: 1
* Аппаратных интерфейсов I²C / TWI: 1
* Аппаратных интерфейсов UART / Serial: 1
* Максимальный ток с пина или на пин: 15 мА
* Максимальный выходной ток пина 3V3: 150 мA
* Входное напряжение через пин Vin: 3,5–16 В
* Габариты платы: 60×53 мм
**Дисплей**
* Модель: JHD12864-G176BSW
* Диаганаль: 2,4 дюйма
* Разрешение: 128×64
* Цвет: монохромный
* Цвет подсветки: белая
* Контроллер: ST7567
* Интерфейс: SPI
===== Ресурсы =====
* [[amp>product/espruino-pixl-js?utm_source=man&utm_campaign=espruino-pixl-js&utm_medium=wiki|Espruino Pixl.js]] в магазине.
* [[https://github.com/amperka/hardware-drawings/blob/master/espruino-pixl-js.svg|Векторное изображение Espruino Pixl.js]]
* [[js:ide|Как настроить платформу Pixl.js со средой Espruino Web IDE]]
* [[js:start|Учебные и справочные материалы по JavaScript’у в микроконтроллере]]
* [[http://www.espruino.com/Graphics|Библиотека для работы с дисплеем Espruino Graphics]]
* {{ :products:espruino-pixl-js:mdbt42q-datasheet.pdf |Datasheet на модуль MDBT42Q}}
* {{ :products:espruino-pixl-js:nrf52832-product-specification.pdf |Product Specification на nRF52832}}
* {{ :products:espruino-pixl-js:jhd12864-g176bsw-datasheet.pdf |Datasheet на дисплей JHD12864-G176BSW}}
* {{ :products:espruino-pixl-js:st7567-datasheet.pdf |Datasheet на контроллер дисплея ST7567}}
* {{ :products:espruino-pixl-js:espruino-pixl-js-scheme.zip |Исходники платы в Eagle}}