Перейти к содержимому






Фотография
* * * * * 5 голосов

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

Написано Totoro , 25 Декабрь 2014 · 11 506 просмотров

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

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

Но найдем задачку посложнее, где Lua BIOS не поможет.
Попробуем собрать микроконтроллер, который будет управлять входными дверями.

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

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

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

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


2. Крафтим контроллер
С этим проблем не возникнет. Потому, что я играю в креативе :P .
Открываем NEI и берем нужные детали. В последний слот положим пока пустой EEPROM. Потом поставим на него прошивку, а пока - не важно.

Изображение

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

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 на верстак. При этом пустой чип вылетит, а новый встанет на его место.

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

Изображение


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
  end
end

modem.close()
Все согласно плану.
Прошиваем чип, вставляем в контроллер, а контроллер ставим слева от дверей. Сзади к контроллеру осторожно прилаживаем запал.
ПКМ!

Изображение

Теперь открываем новый файл на компьютере: edit send
И пишем в него такой код:
local com = require('component')
local modem = com.modem
local args = {...}

modem.broadcast(27, args[1])
print("Message '"..args[1].."' sent!")
Сохраняем, и закрываем. Это будет программка для тестирования контроллера.


5. Тест!
Пишем в консоль send open. Дверь открылась!
Пишем send close. Дверь закрылась!
Пишем send opeh
Упс! Опечатка.

Изображение

О_О

  • 1Ridav, Fingercomp, TheScientist и 5 другим это нравится



 

 

Но найдем задачку посложнее, где Lua BIOS не поможет.
Попробуем собрать микроконтроллер, который будет управлять входными дверями.

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

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

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

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

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

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

=)

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

    • DUIIIES и Quant это нравится

=)
На сервере 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(<полученный адрес модема>). Как и сказано в документации, результатом становится прокси модема. 

 

Вуаля!

    • Asummonster это нравится

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

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

 

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

 

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

 

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

    • Asummonster это нравится

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

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

 

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

name, _, sender, _, _, message = computer.pullSignal(2)
А зачем нам 'отправитель'? Он-же нигде не используется...

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

 

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

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


Обратные ссылки на эту запись [ URL обратной ссылки ]

Обратных ссылок на эту запись нет

Август 2018

В П В С Ч П С
   1234
567891011
12131415161718
1920 21 22232425
262728293031 

Новые комментарии

0 посетителей

0 пользователей, 0 гостей, 0 анонимных

Последние посетители

  • Фотография
    BrightYC
    Вчера, 22:17
  • Фотография
    Digitex
    Вчера, 01:15
  • Фотография
    doktorkrab
    17 авг 2018 - 22:52
  • Фотография
    fancube
    15 авг 2018 - 03:43
  • Фотография
    Fingercomp
    14 авг 2018 - 22:02