здравствуйте. я вот про глобус рассказала все, а самое главное забыла рассказать. это принцип построения картинки на JAVA симуляторе. то есть та прога которая создает код картинок и как она его строит. а принцип вот какой. мои догадки на увиденном результате. а код строится так.... как я поняла обод глобуса с диодами разбит на 2 половинки и на этих половинках устанавливаются диоды с левой нечет, с правой чет и так все 40LED. далее идем в симулятор для создания картинок и там код состоящий из 200 строк делится на 2 половинки по 100 строк в каждой. если в примере поставить 2 точки зеленые подряд, то на выходе получим вайты в которых в одной половинке будет записано так В00000010, а в другой половинке ровно через 100 строк на 101 строке увидите такую картину В00000001. вот как записывается картинка. все примеры в зип архиве изложила для понимания. но вот как код суммирует это все так что бы это не выглядело как полуокружности я не знаю. сам симулятор прилагается в самых первых файлах там где написано исходник в самых началах переписки. для меня 3D симулятор результата запустился не 64бит, а 32бит. почему не знаю. установите его и поиграйтесь для понимания принципа.
у меня почему то на ноут 64 бит установился j3d-1_5_2-windows-i586 (1) на 64 бит не заработал.
здравствуйте. да все согласно схеме изложенной в оригинальном источнике. глобус сам же работает как автор задумал.
Да, точно, логично ))
здравствуйте. проверила я последний вариант. цвет зеленый появился во всех картинках. а на картинку глобуса накладывается динамическая полоса зеленая скачущая хаотично, не последовательно.
здравствуйте. да!!! заработало!!! диоды стали двигаться плавно с верху в низ без скачков на фоне глобуса. чего очень радует!!!! а как разделить что бы это было по очереди. что бы не на фоне, а по очереди. то есть картинки и полоска бегает или на оборот.
здравствуйте. РАБОТАЕТ!!!!! РАБОТАЕТ!!!!! а можно еще некоторое количество вопросов???? 1 вопрос? а как дальше что бы по кругу цвета перебирал не только G в этом цикле, а покругу RGB этом цикле в какой последовательности цвета - не важно. 2 вопрос? а как сделать что бы прошел например цикл RGB сверху в низ, а потом BGR в верх и так по кругу ( цветовая последовательность не важна - какая не сложна в написании. ну и 3 вопрос? а можно в добавленных строках коменты после // написать на русском для понимания работы кода. и где в коде скорость меняется? то есть скорость переключения диодов. ну вот .... если это не сложно. то есть 1 картинка глобус, 2 картинка точки, 3 картинка полоски, в 4 цикле погонял с верху в низ и с низу в верх RGB и обратно в начала и тд. а так вообще красиво !!!!!! ОГОНЬ!!!!!!
у меня появился еще один вопрос , а какой принцип положен в основу этого цикла??? так как рассмотрев код внимательно я заметила что написание В00000000 во всей строке. я полагала что это должно выглядеть примерно так В00000001,В00000010,В000000100 и тд. то есть генератор передвигает биты диод бежит по окружности да еще и вращение окружности поэтому бегущая линия получается. интересно????
@olga549 ну в итоге в 4-м режиме данные отправляются из массива test_array. Этот массив изначально объявлен с нулевыми битами, затем в процессе работы биты меняются при помощи функций SetBit() и ClearBit(). Можно поэкспериментировать на этом участке кода, чтобы разобраться как работает, другие биты - будут другие цвета или диоды. В функции вторым аргументом передается номер бита (от 0 до 120).
здравствуйте. а как это другие биты? если содержит byte test_array В00000000. а из них 5 красных, 5 зеленых, 5 синих. а на деле получается зажигаются только зеленые. а как же этим управлять? а где это прописано в коде. а как дальше что бы по кругу цвета перебирал не только G в этом цикле, а покругу RGB этом цикле в какой последовательности цвета - не важно. 2 вопрос? а как сделать что бы прошел например цикл RGB сверху в низ, а потом BGR в верх и так по кругу ( цветовая последовательность не важна - какая не сложна в написании. ну и 3 вопрос? а можно в добавленных строках коменты после // написать на русском для понимания работы кода. и где в коде скорость меняется? то есть скорость переключения диодов. ну вот .... если это не сложно. то есть 1 картинка глобус, 2 картинка точки, 3 картинка полоски, в 4 цикле погонял с верху в низ и с низу в верх RGB и обратно в начала и тд. куда и что надо дописать? очень хочется понять. очень интересно. не просто загрузила и великая радость. а вот это это и есть 0x80 бит определяющий цвет?
здравствуйте. коменты я имела в виду оставить как в скетче написано, пару слов после слеша к тем строкам которые можно редактирования или для понимания работы дописанного вами. не требуется расписывать каждое действие как научный трактат в 2 тома каждую строчку. просто там в скетче видели я переводила с немецкого коменты для понимания. примерно так . вот что я имела в виду.
test_array[] - массив из 15 байт = 120 бит. 40 светодиодов по 3 цвета = 120 бит. Один бит в массиве соответствует одной цветовой составляющей одного из светодиодов.
Функция SetBit() устанавливает определенный бит массива (от 0 до 119) в единицу. Например, после такой операции SetBit(&test_array[0], 1), первый элемент массива будет иметь вид B01000000 (нумерация битов от старшего к младшему (слева направо) ).
При работе программы:
int sector_index = pointer;
if (sector_index == 0)
{
test_counter++;
}
int led_index = test_counter % 20;
sector_index - индекс текущего сектора, когда он равен 0, то инкрементируется счетчик test_counter. Таким образом, test_counter соответствует количеству оборотов, то есть test_counter увеличивается на 1 после полного оборота.
led_index - индекс светодиода, в данном случае от 0 до 19, увеличивается так же на каждый оборот.
Работаем со светодиодами с индексами:
- 2 * led_index
- 2 * led_index + 1
Если led_index = 0, то зажигаем светодиоды 0 и 1 (по схеме они на разных половинах) и так далее для других светодиодов попарно (финальная пара: 38, 39).
Считываем текущее состояние битов:
int cached_bit_1 = GetBit(&test_array[0], 2 * led_index); int cached_bit_2 = GetBit(&test_array[0], 2 * led_index + 1);
В данном случае это не нужно, это актуально, если меняем биты в существующем изображении (массиве), чтобы потом вернуть их к изначальному значению. Выставляем биты в единицу:
SetBit(&test_array[0], 2 * led_index); SetBit(&test_array[0], 2 * led_index + 1);
Как мы выяснили, это будут биты от 0 до 39 (попарно), соответственно эти биты в массиве из 120 бит отвечают за зеленую составляющую.
После цикла сбрасываем измененные биты в случае необходимости:
if (cached_bit_1 == 0) ClearBit(&test_array[0], 2 * led_index); if (cached_bit_2 == 0) ClearBit(&test_array[0], 2 * led_index + 1);
Для примера - чтобы здесь поменять зеленый цвет на другой, можно сделать так:
int led_index = test_counter % 20 + 20;
здравствуйте. спасибо за пояснения. все прочитала немного разобралась. буду пробовать и экспериментировать. но можно несколько вопросов??? а как дописать так что бы в 4 цикле с верху вниз двигаются диоды как они сейчас работают, а в 5 цикле снизу в верх двигались. как я поняла
SetBit(&test_array[0], 2 * led_index);
SetBit(&test_array[0], 2 * led_index + 1);
case 4: for (int l=0; l<15; l++){SendRecSPI(test_array[l]);} на увеличение. а на уменьшение счета как записать???? case 5: for (int l--; l>15; l=0){SendRecSPI(test_array[l]);} так? или это не грамотно??? и как организована процедура настройки вот здесь
void SetBit(uint8_t* ptr, int bit_index)
{
if (bit_index < 0 || bit_index >= 120) return;
int byte_offset = bit_index / 8;
int bit_position = bit_index % 8;
ptr[byte_offset] |= (0x80 >> bit_position);
}
void ClearBit(uint8_t* ptr, int bit_index)
{
if (bit_index < 0 || bit_index >= 120) return;
int byte_offset = bit_index / 8;
int bit_position = bit_index % 8;
ptr[byte_offset] &= ~(0x80 >> bit_position); //вот здесь записан 0х80 это установка начального бита В10000000 как я поняла. для уменьшения надо это изменить на В00000001 так мыслю или не правильно???
}
int GetBit(const uint8_t* ptr, int bit_index)
{
if (bit_index < 0 || bit_index >= 120) return 0;
int byte_offset = bit_index / 8;
int bit_position = bit_index % 8;
return (ptr[byte_offset] & (0x80 >> bit_position)) ? 1 : 0;
}