Espruino:Примеры/Цифровые кости: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Цифровые кости<ref>[https://www.espruino.com/Digital+Dice www.espruino.com - Digital Dice]</ref>= | ||
[https://www.youtube.com/watch?v=1agbdmdVqrQ Espruino Project - Digital Dice] | |||
В этом руководстве мы расскажем, как сделать устройство на видео выше – многофункциональные цифровые кости. | |||
== Нам понадобятся == | |||
[Картинка] | |||
* Чистая и пустая банка от [[Pringles]] | |||
* Плата [[Espruino]] | |||
* Батарея | |||
* Переключатель и два провода для него | |||
* Гирлянда светодиодов [[WS2811]] | |||
* Обёрточная бумага, изолента и двусторонняя изолента (не показаны на фото выше) | |||
== Что надо сделать == | |||
Отмерьте 4 см с обоих концов банки, а затем отрежьте их как можно прямее с помощью монтажного ножа. | |||
Также вырежьте ещё одно кольцо из середины банки шириной около 3 см и сделайте в нём один поперечный разрез. Это кольцо поможет закрепить светодиоды внутри банки. | |||
[Картинка] | |||
Затем проделайте в донном конце банки 12 отверстий (8 мм) так, чтобы они находились на одинаковом расстоянии друг от друга и примерно в 2 мм от края банки. Также нужно будет проделать отверстие в середине – для переключателя. Я сначала при помощи маркера отметил места для отверстий, а уже потом просверлил их. | |||
[Картинка] | |||
Теперь примкните оба конца банки друг к другу и скрепите изолентой изнутри. | |||
[Картинка] | |||
Прилепите снаружи банки двустороннюю изоленту, а затем приклейте на него обёрточную бумагу с узором, чтобы закрыть обёртку Pringles. | |||
[Картинка] | |||
Теперь повнимательнее приглянитесь к обоим концам светодиодной гирлянды. Светодиоды сделаны из прозрачного пластика, поэтому вы должны увидеть надписи на печатной плате в тех местах, куда подключены провода. На одном конце должны быть отчётливые надписи «5V, DI, GND», а на другом, возможно, «D0» (а иногда на нём вообще ничего нельзя разобрать). Пометьте провода, идущие от конца с надписями «5V, DI, GND», а оставшийся провод нам не важен – просто отогните его в сторону. | |||
Теперь просуньте все 12 светодиодов в их отверстия в донной части банки (по порядку). Их также можно закрепить на месте при помощи клея Blu Tack или двусторонней изоленты. | |||
[Картинка] | |||
Поместите третье кольцо банки внутрь, чтобы закрепить светодиоды на месте. Также можно прилепить немного изоленты, чтобы всё держалось ещё крепче. | |||
[Картинка] | |||
Теперь подсоедините два провода к переключателю. Чтобы контакты не замыкали, я одел на них изоляционную термоусадочную трубку, но подойдёт и обычная изолента. Если контакты замкнут, это не вызовет никаких повреждений, но [[Espruino]] будет думать, что мы нажали на кнопку. | |||
[Картинка] | |||
Теперь припаяйте эти провода к [[Espruino]]: | |||
* Первый провод – к контакту '''A1''' на [[Espruino]]. | |||
* Второй провод – к контактной площадке '''3.3v''' (она должна быть рядом с '''A1'''). | |||
Теперь возьмите помеченный конец гирлянды (тот, что с надписями ''«5V, DI, GND»'') и разделите его на 3 провода, каждый из которых будет соответствовать какой-либо из пометок: | |||
* Подключите провод '''5V''' к контакту '''VBAT''' на [[Espruino]]. | |||
* Подключите провод '''GND''' к контакту '''GND''' на [[Espruino]]. | |||
* Подключите провод '''DI''' к контакту '''B5''' на [[Espruino]] (для этого провода вам понадобится контакт, помеченный как '''SPI#_MOSI'''). | |||
Готово! Теперь можно подключать батарею. | |||
[Картинка] | |||
Теперь мы можем поместить всё это внутрь. [[Espruino]] и батарея должны плотно сесть между [[светодиод]]ами. [[USB-коннектор]] должен смотреть наружу – чтобы вы могли подключить его к [[ПК]]. | |||
[Картинка] | |||
== Код == | |||
Теперь код! Подключите ваш [[ПК]] к [[Espruino]] как объясняется [https://www.espruino.com/Quick+Start здесь]. Вы также можете поэкспериментировать с примерами кода из [https://www.espruino.com/WS2811 статьи о светодиодах WS2811], но не забывайте использовать контакт '''B5''' для шины [[SPI]]. | |||
Теперь просто скопируйте и вставьте код ниже, в результате чего на костях начнёт вращаться светодиодной ''«волчок»'' как показано в видео выше: | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
SPI1.setup({baud:3200000, mosi:B5}); | |||
var FRONT_BUTTON = A1; | |||
var slowdown; | |||
var speed; | |||
var running; | |||
var timePressed; | |||
var pos=0; | |||
// Нажатие на кнопку: | |||
setWatch(function(e) { | |||
if (e.time < timePressed+0.01) return; // убираем «дребезг» | |||
timePressed = e.time; | |||
// Удаляем анимацию, если она выполняется в данный момент: | |||
clearInterval(); | |||
// Задаём начальные значения: | |||
speed = 20; | |||
slowdown = 1.1 + Math.random()*0.1; | |||
running = true; | |||
// Запускаем анимацию... | |||
setInterval(function() { | |||
if (!running) { // если кнопка была отпущена... | |||
speed = speed * slowdown; // замедляем | |||
changeInterval(1,speed); // используем это, | |||
// чтобы замедлить таймер | |||
if (speed > 500) clearInterval(); // если стало совсем медленно, | |||
// останавливаем анимацию | |||
} | |||
pos++; // крутим | |||
if (pos>11) pos = 0; // дойдя до последнего светодиода, | |||
// обнуляем счётчик | |||
// Теперь рассчитываем то, какой паттерн показать - | |||
// включаем один светодиод (с красным и синим огнями): | |||
var leds = new Uint8Array(12*3); | |||
leds[0+(11-pos)*3] = 255; // красный | |||
leds[2+(11-pos)*3] = 255; // синий | |||
SPI1.send4bit(leds, 0b0001, 0b0011); // отправляем на светодиоды | |||
}, speed); // скорость для setInterval() | |||
}, FRONT_BUTTON, { repeat: true, edge: "rising" }); | |||
// Отпускание кнопки: | |||
setWatch(function(e) { | |||
timePressed = e.time; | |||
// Сигнал для замедления и остановки анимации: | |||
running = false; | |||
}, FRONT_BUTTON, { repeat: true, edge: "falling" }); | |||
function onInit() { | |||
// Притягиваем переключатель к значению «0», | |||
// чтобы не использовать внешний резистор: | |||
pinMode(FRONT_BUTTON, "input_pulldown"); | |||
} | |||
onInit(); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Или же вы можете загрузить на [[Espruino]] код ниже, умеющий работать во всех режимах, которые были показаны на видео в самом начале статьи: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
clearWatch(); | |||
SPI1.setup({baud:3200000, mosi:B5}); | |||
var FRONT_BUTTON = A1; | |||
var hours = 3,mins = 20,secs = 0; | |||
var slowdown; | |||
var speed; | |||
var running; | |||
var mode = 0; | |||
var timePressed; | |||
var pos=0; | |||
// Нажатие на кнопку: | |||
setWatch(function(e) { | |||
if (e.time < timePressed+0.01) return; // убираем «дребезг» | |||
timePressed = e.time; | |||
clearInterval(); | |||
if (mode == 0) { // часы | |||
setInterval(function() { | |||
secs++; | |||
if (secs>59) { | |||
secs = 0; | |||
mins++; | |||
if (mins>59) { | |||
mins = 0; | |||
hours++; | |||
if (hours>11) { | |||
hours = 0; | |||
} | |||
} | |||
} | |||
var leds = new Uint8Array(12*3); | |||
var secled = parseInt(secs/5); | |||
leds[1+(11-secled)*3] = 255; // зелёный | |||
var minled = parseInt(mins/5); | |||
leds[2+(11-minled)*3] = 255; // синий | |||
leds[0+(11-hours)*3] = 255; // красный | |||
SPI1.send4bit(leds, 0b0001, 0b0011); | |||
}, 1000); | |||
} else if (mode == 1) { // вращение | |||
speed = 20; | |||
slowdown = 1.1 + Math.random()*0.1; | |||
running = true; | |||
setInterval(function() { | |||
if (!running) { | |||
speed = speed * slowdown; | |||
changeInterval(1,speed); | |||
if (speed > 500) clearInterval(); | |||
} | |||
pos++; | |||
if (pos>11) { | |||
pos = 0; | |||
} | |||
var leds = new Uint8Array(12*3); | |||
leds[0+(11-pos)*3] = 255; // красный | |||
leds[2+(11-pos)*3] = 255; // синий | |||
SPI1.send4bit(leds, 0b0001, 0b0011); | |||
}, speed); | |||
} else if (mode == 2) { // случайное число | |||
// в диапазоне между 1 и 6 | |||
speed = 20; | |||
slowdown = 1.1 + Math.random()*0.1; | |||
running = true; | |||
setInterval(function () { | |||
if (!running) { | |||
speed = speed * slowdown; | |||
changeInterval(1,speed); | |||
if (speed > 500) clearInterval(); | |||
} | |||
pos = parseInt(Math.random()*6)*2; | |||
var leds = new Uint8Array(12*3); | |||
var r = 1+parseInt(Math.random()*6); | |||
leds[0+(11-pos)*3] = (r&1)?0:255; // красный | |||
leds[1+(11-pos)*3] = (r&2)?0:255; // зелёный | |||
leds[2+(11-pos)*3] = (r&4)?0:255; // синий | |||
SPI1.send4bit(leds, 0b0001, 0b0011); | |||
}, speed); | |||
} else if (mode == 3) { | |||
speed = 20; | |||
slowdown = 1.2 + Math.random()*0.1; | |||
running = true; | |||
setInterval(function () { | |||
if (!running) { | |||
speed = speed * slowdown; | |||
changeInterval(1,speed); | |||
if (speed > 500) clearInterval(); | |||
} | |||
var patterns = [ | |||
[0], | |||
[0,5], | |||
[0,4,8], | |||
[0,3,6,9], | |||
[0,2,4,6,9], | |||
[0,2,4,6,8,10], | |||
]; | |||
var r = parseInt(Math.random()*patterns.length); | |||
var leds = new Uint8Array(12*3); | |||
for (i in patterns[r]) { | |||
leds[1+patterns[r][i]*3] = 255; // зелёный | |||
leds[2+patterns[r][i]*3] = 255; // синий | |||
} | |||
SPI1.send4bit(leds, 0b0001, 0b0011); | |||
}, speed); | |||
} | |||
}, FRONT_BUTTON, { repeat: true, edge: "rising" }); | |||
// Отпускание кнопки: | |||
setWatch(function(e) { | |||
if (e.time < timePressed+0.01) return; // убираем «дребезг» | |||
if (e.time > timePressed+1) { // долгое нажатие | |||
clearInterval(); | |||
// Переходим в следующий режим: | |||
mode++; | |||
if (mode>3) mode=0; | |||
print(mode); | |||
// Выключаем все светодиоды: | |||
SPI1.send4bit(new Uint8Array(12*3), 0b0001, 0b0011); | |||
} else { | |||
// Короткое нажатие – | |||
// это сигнал для замедления и остановки анимации: | |||
running = false; | |||
} | |||
timePressed = e.time; | |||
}, FRONT_BUTTON, { repeat: true, edge: "falling" }); | |||
function onInit() { | |||
// Притягиваем контакт, к которому подключена кнопка, к «0», | |||
// чтобы не использовать внешний резистор: | |||
pinMode(FRONT_BUTTON, "input_pulldown"); | |||
} | |||
onInit(); | |||
</syntaxhighlight> | |||
Вот и всё – мы сделали цифровые кости! Теперь напечатайте '''save()''', и весь этот код будет сохранён на [[flash-память]]. В результате при следующем запуске Espruino автоматически загрузит этот код для цифровых костей! | |||
=См.также= | =См.также= |
Версия от 18:33, 13 июля 2021
Цифровые кости[1]
Espruino Project - Digital Dice
В этом руководстве мы расскажем, как сделать устройство на видео выше – многофункциональные цифровые кости.
Нам понадобятся
[Картинка]
- Чистая и пустая банка от Pringles
- Плата Espruino
- Батарея
- Переключатель и два провода для него
- Гирлянда светодиодов WS2811
- Обёрточная бумага, изолента и двусторонняя изолента (не показаны на фото выше)
Что надо сделать
Отмерьте 4 см с обоих концов банки, а затем отрежьте их как можно прямее с помощью монтажного ножа.
Также вырежьте ещё одно кольцо из середины банки шириной около 3 см и сделайте в нём один поперечный разрез. Это кольцо поможет закрепить светодиоды внутри банки.
[Картинка]
Затем проделайте в донном конце банки 12 отверстий (8 мм) так, чтобы они находились на одинаковом расстоянии друг от друга и примерно в 2 мм от края банки. Также нужно будет проделать отверстие в середине – для переключателя. Я сначала при помощи маркера отметил места для отверстий, а уже потом просверлил их.
[Картинка]
Теперь примкните оба конца банки друг к другу и скрепите изолентой изнутри.
[Картинка]
Прилепите снаружи банки двустороннюю изоленту, а затем приклейте на него обёрточную бумагу с узором, чтобы закрыть обёртку Pringles.
[Картинка]
Теперь повнимательнее приглянитесь к обоим концам светодиодной гирлянды. Светодиоды сделаны из прозрачного пластика, поэтому вы должны увидеть надписи на печатной плате в тех местах, куда подключены провода. На одном конце должны быть отчётливые надписи «5V, DI, GND», а на другом, возможно, «D0» (а иногда на нём вообще ничего нельзя разобрать). Пометьте провода, идущие от конца с надписями «5V, DI, GND», а оставшийся провод нам не важен – просто отогните его в сторону.
Теперь просуньте все 12 светодиодов в их отверстия в донной части банки (по порядку). Их также можно закрепить на месте при помощи клея Blu Tack или двусторонней изоленты.
[Картинка]
Поместите третье кольцо банки внутрь, чтобы закрепить светодиоды на месте. Также можно прилепить немного изоленты, чтобы всё держалось ещё крепче.
[Картинка]
Теперь подсоедините два провода к переключателю. Чтобы контакты не замыкали, я одел на них изоляционную термоусадочную трубку, но подойдёт и обычная изолента. Если контакты замкнут, это не вызовет никаких повреждений, но Espruino будет думать, что мы нажали на кнопку.
[Картинка]
Теперь припаяйте эти провода к Espruino:
- Первый провод – к контакту A1 на Espruino.
- Второй провод – к контактной площадке 3.3v (она должна быть рядом с A1).
Теперь возьмите помеченный конец гирлянды (тот, что с надписями «5V, DI, GND») и разделите его на 3 провода, каждый из которых будет соответствовать какой-либо из пометок:
- Подключите провод 5V к контакту VBAT на Espruino.
- Подключите провод GND к контакту GND на Espruino.
- Подключите провод DI к контакту B5 на Espruino (для этого провода вам понадобится контакт, помеченный как SPI#_MOSI).
Готово! Теперь можно подключать батарею.
[Картинка]
Теперь мы можем поместить всё это внутрь. Espruino и батарея должны плотно сесть между светодиодами. USB-коннектор должен смотреть наружу – чтобы вы могли подключить его к ПК.
[Картинка]
Код
Теперь код! Подключите ваш ПК к Espruino как объясняется здесь. Вы также можете поэкспериментировать с примерами кода из статьи о светодиодах WS2811, но не забывайте использовать контакт B5 для шины SPI.
Теперь просто скопируйте и вставьте код ниже, в результате чего на костях начнёт вращаться светодиодной «волчок» как показано в видео выше:
SPI1.setup({baud:3200000, mosi:B5});
var FRONT_BUTTON = A1;
var slowdown;
var speed;
var running;
var timePressed;
var pos=0;
// Нажатие на кнопку:
setWatch(function(e) {
if (e.time < timePressed+0.01) return; // убираем «дребезг»
timePressed = e.time;
// Удаляем анимацию, если она выполняется в данный момент:
clearInterval();
// Задаём начальные значения:
speed = 20;
slowdown = 1.1 + Math.random()*0.1;
running = true;
// Запускаем анимацию...
setInterval(function() {
if (!running) { // если кнопка была отпущена...
speed = speed * slowdown; // замедляем
changeInterval(1,speed); // используем это,
// чтобы замедлить таймер
if (speed > 500) clearInterval(); // если стало совсем медленно,
// останавливаем анимацию
}
pos++; // крутим
if (pos>11) pos = 0; // дойдя до последнего светодиода,
// обнуляем счётчик
// Теперь рассчитываем то, какой паттерн показать -
// включаем один светодиод (с красным и синим огнями):
var leds = new Uint8Array(12*3);
leds[0+(11-pos)*3] = 255; // красный
leds[2+(11-pos)*3] = 255; // синий
SPI1.send4bit(leds, 0b0001, 0b0011); // отправляем на светодиоды
}, speed); // скорость для setInterval()
}, FRONT_BUTTON, { repeat: true, edge: "rising" });
// Отпускание кнопки:
setWatch(function(e) {
timePressed = e.time;
// Сигнал для замедления и остановки анимации:
running = false;
}, FRONT_BUTTON, { repeat: true, edge: "falling" });
function onInit() {
// Притягиваем переключатель к значению «0»,
// чтобы не использовать внешний резистор:
pinMode(FRONT_BUTTON, "input_pulldown");
}
onInit();
Или же вы можете загрузить на Espruino код ниже, умеющий работать во всех режимах, которые были показаны на видео в самом начале статьи:
clearWatch();
SPI1.setup({baud:3200000, mosi:B5});
var FRONT_BUTTON = A1;
var hours = 3,mins = 20,secs = 0;
var slowdown;
var speed;
var running;
var mode = 0;
var timePressed;
var pos=0;
// Нажатие на кнопку:
setWatch(function(e) {
if (e.time < timePressed+0.01) return; // убираем «дребезг»
timePressed = e.time;
clearInterval();
if (mode == 0) { // часы
setInterval(function() {
secs++;
if (secs>59) {
secs = 0;
mins++;
if (mins>59) {
mins = 0;
hours++;
if (hours>11) {
hours = 0;
}
}
}
var leds = new Uint8Array(12*3);
var secled = parseInt(secs/5);
leds[1+(11-secled)*3] = 255; // зелёный
var minled = parseInt(mins/5);
leds[2+(11-minled)*3] = 255; // синий
leds[0+(11-hours)*3] = 255; // красный
SPI1.send4bit(leds, 0b0001, 0b0011);
}, 1000);
} else if (mode == 1) { // вращение
speed = 20;
slowdown = 1.1 + Math.random()*0.1;
running = true;
setInterval(function() {
if (!running) {
speed = speed * slowdown;
changeInterval(1,speed);
if (speed > 500) clearInterval();
}
pos++;
if (pos>11) {
pos = 0;
}
var leds = new Uint8Array(12*3);
leds[0+(11-pos)*3] = 255; // красный
leds[2+(11-pos)*3] = 255; // синий
SPI1.send4bit(leds, 0b0001, 0b0011);
}, speed);
} else if (mode == 2) { // случайное число
// в диапазоне между 1 и 6
speed = 20;
slowdown = 1.1 + Math.random()*0.1;
running = true;
setInterval(function () {
if (!running) {
speed = speed * slowdown;
changeInterval(1,speed);
if (speed > 500) clearInterval();
}
pos = parseInt(Math.random()*6)*2;
var leds = new Uint8Array(12*3);
var r = 1+parseInt(Math.random()*6);
leds[0+(11-pos)*3] = (r&1)?0:255; // красный
leds[1+(11-pos)*3] = (r&2)?0:255; // зелёный
leds[2+(11-pos)*3] = (r&4)?0:255; // синий
SPI1.send4bit(leds, 0b0001, 0b0011);
}, speed);
} else if (mode == 3) {
speed = 20;
slowdown = 1.2 + Math.random()*0.1;
running = true;
setInterval(function () {
if (!running) {
speed = speed * slowdown;
changeInterval(1,speed);
if (speed > 500) clearInterval();
}
var patterns = [
[0],
[0,5],
[0,4,8],
[0,3,6,9],
[0,2,4,6,9],
[0,2,4,6,8,10],
];
var r = parseInt(Math.random()*patterns.length);
var leds = new Uint8Array(12*3);
for (i in patterns[r]) {
leds[1+patterns[r][i]*3] = 255; // зелёный
leds[2+patterns[r][i]*3] = 255; // синий
}
SPI1.send4bit(leds, 0b0001, 0b0011);
}, speed);
}
}, FRONT_BUTTON, { repeat: true, edge: "rising" });
// Отпускание кнопки:
setWatch(function(e) {
if (e.time < timePressed+0.01) return; // убираем «дребезг»
if (e.time > timePressed+1) { // долгое нажатие
clearInterval();
// Переходим в следующий режим:
mode++;
if (mode>3) mode=0;
print(mode);
// Выключаем все светодиоды:
SPI1.send4bit(new Uint8Array(12*3), 0b0001, 0b0011);
} else {
// Короткое нажатие –
// это сигнал для замедления и остановки анимации:
running = false;
}
timePressed = e.time;
}, FRONT_BUTTON, { repeat: true, edge: "falling" });
function onInit() {
// Притягиваем контакт, к которому подключена кнопка, к «0»,
// чтобы не использовать внешний резистор:
pinMode(FRONT_BUTTON, "input_pulldown");
}
onInit();
Вот и всё – мы сделали цифровые кости! Теперь напечатайте save(), и весь этот код будет сохранён на flash-память. В результате при следующем запуске Espruino автоматически загрузит этот код для цифровых костей!
См.также
Внешние ссылки