Перейти к публикации
Форум - ComputerCraft

Totoro Cookies

  • записей
    9
  • комментариев
    116
  • просмотров
    80 457

А что такое EEPROM и где оно живет?

Totoro

11 776 просмотров

В последних версиях OpenComputers обрастает всякими загадочными вещами.

Игроки, которые только только освоились с предыдущей версией вдруг понимают, что надо изучать все заново.

"А пошло оно все!" - думают игроки, и уходят на версию 1.3.6, или переучиваются на ComputerCraft, который проще, и не требует непонятного.

 

А одна из самых загадочных - неведомый EEPROM.

Это такая мелкая хрень, без которой не работает ни один компьютер, или даже робот. Хорошо еще, что есть стандартный EEPROM который называется Lua BIOS. Он легко крафтится и заставляет работать компьютеры как и раньше.

 

Но найдем задачку посложнее, где Lua BIOS не поможет.

Попробуем собрать микроконтроллер, который будет управлять входными дверями.

 

1. План

Представим, как оно должно работать.

2014-12-25_20.17.07.png

 

Слева от двери (если входить) - микроконтроллер.

Ради понтов, возьмем Микроконтроллер 2-ого уровня и поставим в него беспроводную сетевую плату. Кроме того добавим красную плату, чтобы управлять дверью.

 

1. Если контроллер принимает сигнал "open" - он открывает дверь.

2. Если примет сигнал "close" - он закрывает дверь.

3. Если примет посторонний сигнал - взрывает динамит. Дабы сокровища не достались хакерам.

 

Для управления задействуем любой комп, у которого тоже будет беспроводная плата (или точка доступа).

 

 

2. Крафтим контроллер

С этим проблем не возникнет. Потому, что я играю в креативе :P .

Открываем NEI и берем нужные детали. В последний слот положим пока пустой EEPROM. Потом поставим на него прошивку, а пока - не важно.

 

2014-12-25_21.10.37.png

 

Нажимаем кнопку "Старт" и достаем готовый блок.

 

3. Готовим прошивку

Теперь, когда все готово, мы построили сокровищницу и скрафтили контроллер - осталось самое главное.

 

Программирование EEPROM'а отличается от программирования обычной программы.

Потому, что обычно, наши программы выполняются в OpenOS, которая заботливо загружает нужные библиотеки, предоставляет всякие удобные фичи и прочее.

 

Тем не менее писать мы будем именно в OpenOS. Запустим компьютер, напишем edit bios и введем следующие строки:

red = component.proxy(component.list("redstone")())while true do  red.setOutput(5, 0)  computer.pullSignal(1)  red.setOutput(5, 15)  computer.pullSignal(1)end

Дело в том, что большая часть библиотек, которые мы использовали - это библиотеки OpenOS. А значит мы не можем ими пользоваться в BIOS. Однако кое-что нам доступно.

Это библиотеки computer и component, и соответственно все установленные в целевом агрегате (микроконтроллер) компоненты.

Более чем достаточно для наших задач.

 

Вышеприведенный код делает следующее:

* ищет компонент с названием "redstone" и возвращает его прокси

* в вечном цикле посылает нулевой редстоун-импульс направо (side = 5), т.е. гасит сигнал

* ждет секунду (на самом деле - ожидает эвентов, то есть сигналов)

* посылает редстоун сигнал с силой 15 направо

* опять ждет секунду

 

Преследуем двоякую цель: во-первых проверить, что EEPROM вообще работает так про него написано на Вики. Кто его знает? А во-вторых: убедиться, что сторона 5 это именно та сторона, где дверь. А не какая-нибудь другая.

 

Нажмем Ctrl+S, чтобы сохраниться и Ctrl+W, чтобы закрыть редактор.

Вставим пустой EEPROM (еще один) в слот нашего компьютера, вместо лежащего там Lua BIOS. И напишем в консоль такую команду:

flash -q bios MCBios

Программа flash предназначена для прошивки чипов. Флаг -q говорит ей, чтобы не задавала лишних вопросов, затем идет имя файла с нашим кодом (bios) и метка, которую программа шлепнет на чип (MCBios).

 

Все. Доставайте. Lua BIOS на место класть не обязательно, ибо этот слот нам еще потребуется. (Но не забудьте его вернуть, если будете перезагружать компьютер)

 

Чтобы заменить пустой EEPROM в контроллере на наш MCBios, надо положить контроллер и MCBios на верстак. При этом пустой чип вылетит, а новый встанет на его место.

 

Поставим контроллер на пол и протестируем.

После клика ПКМ на контроллере - замигала правая лампа. Значит все работает как нужно.

 

2014-12-25_20.12.33.png

 

 

4. Теперь - серьезно

Извлеките чип с MCBios обратно (так же как и вставляли, только наоборот). Или приготовьте новый пустой чип. Главное - не запутайтесь в них.

 

Пишем клиент для контроллера. У меня он выглядит примерно так:

red = component.proxy(component.list("redstone")())modem = component.proxy(component.list('modem')())modem.open(27)red.setOutput(5, 0)red.setOutput(2, 0)  -- no explosions yet =)while true do  name, _, sender, _, _, message = computer.pullSignal(2)  if name == 'modem_message' then    if message == 'open' then      red.setOutput(5, 15)    elseif message == 'close' then      red.setOutput(5, 0)    else                    -- hacker tries to get?      red.setOutput(2, 15)  -- fire in the hole!!!    end  endendmodem.close()

Все согласно плану.

Прошиваем чип, вставляем в контроллер, а контроллер ставим слева от дверей. Сзади к контроллеру осторожно прилаживаем запал.

ПКМ!

 

2014-12-25_20.22.44.png

 

Теперь открываем новый файл на компьютере: edit send

И пишем в него такой код:

local com = require('component')local modem = com.modemlocal args = {...}modem.broadcast(27, args[1])print("Message '"..args[1].."' sent!")

Сохраняем, и закрываем. Это будет программка для тестирования контроллера.

 

 

5. Тест!

Пишем в консоль send open. Дверь открылась!

Пишем send close. Дверь закрылась!

Пишем send opeh

Упс! Опечатка.

 

2014-12-25_22.04.43.png

 

О_О

  • Like 8


15 комментариев


Рекомендованные комментарии

 

 

Но найдем задачку посложнее, где Lua BIOS не поможет.

Попробуем собрать микроконтроллер, который будет управлять входными дверями.

А чего ж тут такого Lua BIOS сделать не сможет?

Поделиться комментарием


Ссылка на комментарий

А чего ж тут такого Lua BIOS сделать не сможет?

Сможет, если собрать полноценный компьютер.

Но поскольку для такой небольшой задачи было решено воспользоваться микроконтроллером, Lua BIOS не подойдет. Ведь у микроконтроллера нет файловой системы.

Поделиться комментарием


Ссылка на комментарий

Zer0Galaxy, изучай OC возможностей в пару десятков раз больше чем в CC.

Поделиться комментарием


Ссылка на комментарий

Ничего не понял :3

=)

На сервере IT 1.7.10 можно познакомиться с микроконтроллерами и немного их попинать.

  • Like 2

Поделиться комментарием


Ссылка на комментарий
=)

На сервере IT 1.7.10 можно познакомиться с микроконтроллерами и немного их попинать.

С превеликим удовольствием, но теперь только в 2015-ом)

Поделиться комментарием


Ссылка на комментарий

очень рад появлению микроконтролеров в OC теперь только узнать откуда взять lua BIOS и можно будет замутить чего-нибудь интересного

Поделиться комментарием


Ссылка на комментарий

Помоги мне разобраться с командой.

В ваше программе я увидел:

modem = component.proxy(component.list('modem')()) 

 

Мои вопросы:

1) Почему две команды в одной и каким образом она работает (ведь  реально получает рабочий modem)

2) зачем в конце скобки "()"?

 

Может это и просто, но я удивлен.

Поделиться комментарием


Ссылка на комментарий

Мои вопросы:

1) Почему две команды в одной и каким образом она работает (ведь  реально получает рабочий modem)

2) зачем в конце скобки "()"?

 

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

"Вычисляются" эти конструкции аналогично, начиная со внутренних скобок.

 

В данной строке, сначала произойдет вызов функции component.list('modem')

Согласно документации ОС, функция component.list() возвращает функцию-итератор по компонентам с подходящими именами. Имя у нас "modem". (Итератор - это такая функция, которая при каждом вызове возвращает следующий элемент коллекции).

 

Далее срабатывают пустые скобки (). На самом деле они стоят там не отдельно.

Поскольку конструкция component.list('modem') вернула нам функцию, дописав справа пару скобок, я тем самым вызвал эту функцию. Это можно записать так: <полученная функция итератор>().

Вызванная функция вернула первый элемент коллекции модемов в виде адреса, как и полагается итератору.

 

Таким образом у нас теперь происходит вызов функции component.proxy(<полученный адрес модема>). Как и сказано в документации, результатом становится прокси модема. 

 

Вуаля!

  • Like 1

Поделиться комментарием


Ссылка на комментарий

А почему не использовать

if component.isAvailable("modem") then modem=component.modem end  ?

 

Эта конструкция использует "главный компонент", который выбирает OpenOS при старте, из списка однотипных компонентов доступных компьютеру.

 

Для EEPROM такое не подойдет, потому что там нет OpenOS, да и файловой системы как таковой.

 

Конструкция modem = component.proxy(component.list('modem')()) по сути как раз и производит выбор компонента из списка вместо отсутствующей ОСи.

  • Like 1

Поделиться комментарием


Ссылка на комментарий

Тоторо, спасибо за гайд, теперь смогу замутить свинокоптер =)

Поделиться комментарием


Ссылка на комментарий

Тоторо, спасибо за гайд, теперь смогу замутить свинокоптер =)

 

Рад что он все еще актуален )

Поделиться комментарием


Ссылка на комментарий

name, _, sender, _, _, message = computer.pullSignal(2)

А зачем нам 'отправитель'? Он-же нигде не используется...

Поделиться комментарием


Ссылка на комментарий

А зачем нам 'отправитель'? Он-же нигде не используется...

 

Ну, здесь не используется, да.

Но его можно использовать для того чтобы запилить "вайтлист" или что-нибудь в таком духе. Я решил что это полезный параметр и не стал его скрывать. Мало ли у кого какие идеи появятся.

Поделиться комментарием


Ссылка на комментарий

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
×