Espruino:Примеры/Домашний компьютер на базе Espruino

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Домашний компьютер на базе Espruino[1]

Espruino Home Computer

Многие из нас учились программировать на компьютерах ZX Spectrum, Commodore 64, BBC Micro и так далее. Управление ими осуществляется прямо из командной строки, что вдохновляло многих пользователей на интересные эксперименты.

В этом руководстве я расскажу, как всего за несколько часов сделать собственный JavaScript-компьютер на базе Espruino и с выводом картинки через VGA-кабель.

По этой ссылке можно найти похожее руководство, но там видео выводится на Pixl.js.

Нам понадобятся

  • Плата Espruino Pico
  • Кусок пластика или дерева (он будет служить основой)
  • Макетная плата
  • 4 кнопочные панели 4x4
  • Много стикеров
  • 40 соединительных DuPont-кабелей типа «папа-папа». Кабели с многоцветными проводами существенно облегчат подключение компонентов – так проще понять, что куда подключено

Подсоединение

  • Приклейте к основе 4 кнопочные панели в один ряд (у них клейкая задняя сторона). Возможно, их надо будет чуть обрезать по краям, но слишком увлекайтесь, чтобы случайно не отрезать какие-нибудь контакты.
  • Приклейте макетную плату к центральной части основы (у макетной платы тоже клейкая обратная сторона).
  • Разделите DuPont-кабель на 4 кабеля по 8 проводов в каждом. Сделайте так, чтобы порядок цветов у всех получившихся кабелей был одинаковым.
  • Подключите эти кабели к кабелям, идущим от кнопочных панелей, не забывая про порядок цветов.
  • Подогните кабели, идущие от кнопочных панелей, под нижнюю сторону основы. Затем приклейте их к основе скотчем. Также можно прикрепить к нижней части опоры маленькие ножки, чтобы провода не сгибались слишком сильно.
  • Теперь нам нужен дополнительный ряд из 8 маленьких (0.05 дюйма) контактов на Espruino Pico. Возьмите несколько проводов с однопроволочными жилами и припаяйте их к этим контактам. Убедитесь, что они не касаются друг друга!
  • Подключите Espruino Pico к левой части макетной платы и обрежьте 8 проводов, которые подключили в шаге выше (см. картинку ниже).
  • Теперь нам надо подключить клавиатуру. Сделайте это согласно инструкциям ниже – слева направо. Не забывайте сверяться с цветами проводов на фото.
    • Первые 4 провода первой панели -> B6, B5, B4, B3
    • Вторые 4 провода первой панели -> B9, B8, A8, B7
    • Первые 4 провода второй панели -> B6, B5, B4, B3
    • Вторые 4 провода второй панели -> A4, A3, A2, A1
    • Первые 4 провода третьей панели -> B10, B13, B14, B15
    • Вторые 4 провода третьей панели -> B9, B8, A8, B7
    • Первые 4 провода четвёртой панели -> B10, B13, B14, B15
    • Вторые 4 провода четвёртой панели -> A4, A3, A2, A1
  • Теперь подключите контакты VGA-кабеля как показано на схеме ниже. Более подробно читайте в этой статье.
Примечание

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

  • Наклейте на кнопки наклейки как показано на фото ниже. Если вы не из Великобритании, то вам, наверно лучше сделать свою раскладку (т.е. по своему расклеить наклейки), но в этом случае вам также надо будет модифицировать KEYMAP-переменные в коде ниже.

Код

Убедитесь, что на вашу Espruino Pico установлена прошивка последней версии!

Вставьте код ниже в правую часть Web IDE, кликните на кнопку загрузки кода, и когда код загрузится, впишите save() в левой части Web IDE.

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

// Контакты, к которым подключена клавиатура:
var KEYROW = [B10,B13,B14,B15, B6,B5,B4,B3];
var KEYCOL = [A4,A3,A2,A1, B9,B8,A8,B7];

// Раскладка клавиатуры:
var KEYMAPLOWER = [
  "`1234567890-=\x08",
  "\tqwertyuiop[]\n",
  "\0asdfghjkl;'#\x84\x82\x85",
  "\x01\\zxcvbnm,./ \x80\x83\x81",
  ];
var KEYMAPUPPER = [
  "¬!\"£$%^&*()_+\x08",
  "\tQWERTYUIOP{}\n",
  "\0ASDFGHJKL:@~\x84\x82\x85",
  "\x01|ZXCVBNM<>? \x80\x83\x81",
  ];

/* Если символ раскладки >=128, вычитаем 128
   и ищем в этом массиве код для клавиши,
   состоящей из нескольких символов */
var KEYEXTRA = [
  String.fromCharCode(27,91,68), // 0x80 влево
  String.fromCharCode(27,91,67), // 0x81 вправо
  String.fromCharCode(27,91,65), // 0x82 вверх
  String.fromCharCode(27,91,66), // 0x83 вниз
  String.fromCharCode(27,91,53,126), // 0x84 страница вверх
  String.fromCharCode(27,91,54,126), // 0x85 страница вниз
];
// Состояние клавиши Shift:
var hasShift = false;
function setShift(s) {
  hasShift = s;
  digitalWrite(LED1, s);
}

// Преобразовываем клавишу в последовательность символов
// и отправляем её в Loopback (в консоль):
function handleKeyPress(e) {
  var kx = e>>3;
  var ky = e&7;
  if (ky>3) { // превращаем клавиатуру
              // в один длинный ряд клавиш
    kx+=8;
    ky-=4;
  }
  var key = hasShift ? KEYMAPUPPER[ky][kx] : KEYMAPLOWER[ky][kx];
  if (key=="\x01") {
    setShift(!hasShift);
  } else {
    setShift(false);
    if (key && key.length) {
      if (key.charCodeAt(0)>127)
        key = KEYEXTRA[key.charCodeAt(0)-128];
      //USB.write(JSON.stringify(key)+"\r\n"); // отладка
      LoopbackB.write(key);
    }
  }
}

var term; // терминал
var g; // графика

function onInit() {
  // Настраиваем клавиатуру:
  require("KeyPad").connect(KEYROW, KEYCOL, handleKeyPress);
  // Запускаем вывод видео:
  g = require('tv').setup({ type : "vga",
    video : A7,
    hsync : A6,
    vsync : A5,
    width : 320,
    height : 240,
    repeat : 2, // то, сколько раз 
                // будет повторяться каждая строчка 
  });
  // Используем более крупный шрифт,
  // чем шрифт по умолчанию:
  require("Font8x12").add(Graphics);
  g.setFont8x12();

  // Настраиваем терминал:
  term = require("VT100").connect(g, {
    charWidth : 8,
    charHeight : 12,
    marginTop : 10, // возможно, этот показатель
                    // нужно будет подправить
                    // (зависит от монитора)
    marginLeft : 20,
    marginBottom : 16
  });

  // Берём у Espruino символы
  // и отправляем их в терминал VT100:
  LoopbackB.on('data',function(e){
    for (var i in e) term.char(e[i]);
  });
  // Копируем в LoopBackB символы, пришедшие через USB:
  USB.on('data',function(e){ LoopbackB.write(e); });
  // Теперь отправляем консоль в Loopback:
  LoopbackA.setConsole();
}

Использование

Теперь, когда всё настроено и работает, имейте в виду следующее:

  • Клавиатура умеет определять только одно нажатие одновременно. Нажатие на  ⇧ Shift  включает верхний регистр (в результате на плате загорается светодиод-индикатор), но если вы продолжите печатать, это снова включит нижний регистр. Одновременное зажатие  ⇧ Shift  и нажатие на клавишу нужной буквы не сработает.
  • Тем, кто привык к обычной клавиатуре, печатать будет довольно проблематично, так что советуем почаще использовать автозаполнение при помощи клавиши Tab (слева).
  • Графику на экране можно рисовать при помощи методов, вызываемых на переменной g – например, g.fillRect(20,20,40,40) или g.clear().
  • Функция reset() выполнит сброс всего, удалив даже код, который был загружен на Pico для управления клавиатурой. Чтобы избежать этого, зайдите в настройки Web IDE (для этого кликните на иконку шестерёнки справа вверху), выберите меню Communications, найдите там пункт Save on send, выберите в нём опцию Direct to Flash (execute code at boot, even after ‘reset()’) – USE WITH CARE и снова загрузите код на Pico.

См.также

Внешние ссылки