Анимация с Рубином - PullRequest
       18

Анимация с Рубином

1 голос
/ 27 февраля 2010

Это относится как к физическому программированию, так и к Ruby, работающему на веб-сервере. У меня есть массив светодиодов RGB, который составляет 5x5, то есть всего 25 светодиодов. Они пронумерованы и индивидуально адресуемы как таковые:

 1   2   3   4   5
 6   7   8   9  10
11  12  13  14  15
16  17  18  19  20
21  22  23  24  25

Вот фото:

led matrix

Что касается аппаратного обеспечения (которое на самом деле не важно, потому что оно работает нормально), система состоит из 25 BlinkM , Arduino и некоторых различных кабелей и разъемы.

Светодиоды посылают команды через последовательный порт с такой командой:

@sp.write ["\x01", led, "\x04\x00", "c", color]

Который записывает байтовый массив в последовательный порт, используя Serialport gem в ruby, переменные "led" и "color" заменяются шестнадцатеричным числом каждого, поэтому, например, если я хочу сделать led номер 8 красный, мой вывод будет выглядеть так:

@sp.write ["\x01","\x08", "\x04\x00", "c", "\xff\x00\x00"]

Пока все это творит чудеса, и я действительно доволен тем, что у меня есть, теперь мой вопрос в значительной степени связан с общей математикой и простым программированием, но каким-то образом реализация идет мне на ум.

Вот пример такой анимации. В основном мне интересно, как можно анимировать узоры, используя рубин. Я вспоминаю некоторые сценарии «обработки» анимации, просто зацикливая функцию, используя массив в качестве объекта и воздействуя на элементы массива, создавая интересные анимации только из-за математики вывода.

Кто-нибудь имеет представление о том, как я мог начать с чего-то подобного? В настоящее время я могу воздействовать на светодиоды по одному своим сценарием, и я могу связать их вместе с sleep x после каждой команды и вручную создавать анимации, но как я могу сделать так, чтобы один работал бесконечно с какой-то процедурной анимацией?


EDIT

Я действительно не описал массив байт-кодов полностью, вот что делает каждая часть:

@sp.write ["\x01", led, "\x04\x00", "c", color]
             ^      ^      ^   ^     ^    ^
             a      b      c   d     e    f

a. start byte (not important, tells serial that it is the start of a command)
b. hex for LED address, ex. `\x07` is led 7
c. length of command (starting at "e")
d. bytes to be read (always 0 in our case)
e. the "fade to color" command
f. the color we want to fade to in rrggbb hex format.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Должно быть легко отобразить ваши светодиоды в 2d массив

@led = []
led = 1
5.times do |y|
  5.times do |x|
    @led[x] ||= []
    @led[x][y] = led
    led +=1
  end
end

Я бы, вероятно, создал класс светодиодов, который инкапсулирует способность записывать цвета, поэтому вместо этого:

@led[x][y] = led

становится

@led[x][y] = Led.new(:id => led)

А затем напишите метод, чтобы вы могли легко сделать что-то вроде этого:

@led[1][5].color(255,255,255)

или что-то еще.

1 голос
/ 27 февраля 2010

Если вы просто хотите сделать анимацию, вы должны попытаться абстрагироваться от аппаратного обеспечения, чтобы оно могло быть представлено некоторой структурой данных, с которой легко работать. Я не знаком с Руби, поэтому я не знаю, как это сделать. Если бы вы делали что-то вроде этой таблицы, которая является просто сеткой, я бы попытался отобразить светодиоды в 2D-массив.

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

Как только вы это сделаете, вам придется манипулировать только этой структурой данных. Это имеет какой-то смысл?

Так что-то вроде этого:

function stepAnimation(){
    //modify 2d array for each step of the animation here
}

//I'm assuming you have a function that gets
//Looped forever. In Wiring you do, not sure 
//about working with Arduino using Ruby, if not
//just add while(1) in there.. 
function mainLoop(){ 
    for(var y = 0; y < 5; y++){
     for(var x = 0; x < 5; x++){
         sp.write(2darray[x][y]) //write color from array to hardware
     }
    }
    sleep(60);
    stepAnimation();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...