Главная

Главная

Сообщество

Сообщество

Форум

Форум

STM32

STM32

Электроника

Электроника

Raspberry Pi

Raspberry Pi

Уведомления
Очистить все

[Решено] замена макетной платы Arduino328 на ESP32WROWER-1B

Страница 7 / 9
(@olga549)
Level 3

здравствуйте. я вот про глобус рассказала все, а самое главное забыла рассказать. это принцип построения картинки на JAVA симуляторе. то есть та прога которая создает код картинок и как она его строит. а принцип вот какой. мои догадки на увиденном результате. а код строится так.... как я поняла обод глобуса с диодами разбит на 2 половинки и на этих половинках устанавливаются диоды с левой нечет, с правой чет и так все 40LED. далее идем в симулятор для создания картинок и там код состоящий из 200 строк делится на 2 половинки по 100 строк в каждой. если в примере поставить 2 точки зеленые подряд, то на выходе получим вайты в которых в одной половинке будет записано так В00000010, а в другой половинке ровно через 100 строк на 101 строке увидите такую картину В00000001. вот как записывается картинка. все примеры в зип архиве изложила для понимания. но вот как код суммирует это все так что бы это не выглядело как полуокружности  я не знаю. сам симулятор прилагается в самых первых файлах там где написано исходник в самых началах переписки. для меня 3D симулятор результата запустился не 64бит, а 32бит. почему не знаю. установите его и поиграйтесь для понимания принципа.

 


ОтветитьЦитата
Создатель темы Размещено : 10.07.2026 21:21
(@olga549)
Level 3

у меня почему то на ноут 64 бит установился j3d-1_5_2-windows-i586 (1) на 64 бит не заработал. 


ОтветитьЦитата
Создатель темы Размещено : 10.07.2026 21:37
Aveal MT
(@aveal)
Top level Admin

Запись от: @olga549

здравствуйте. да все согласно схеме изложенной в оригинальном источнике. глобус сам же работает как автор задумал.

Да, точно, логично ))


ОтветитьЦитата
Размещено : 13.07.2026 11:29
Aveal MT
(@aveal)
Top level Admin

Понятно, вот еще вариант для теста.

 


ОтветитьЦитата
Размещено : 13.07.2026 11:51
(@olga549)
Level 3

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

 


ОтветитьЦитата
Создатель темы Размещено : 14.07.2026 21:47
Aveal MT
(@aveal)
Top level Admin

ОтветитьЦитата
Размещено : 17.07.2026 12:40
(@olga549)
Level 3

здравствуйте. да!!! заработало!!! диоды стали двигаться плавно с верху в низ без скачков на фоне глобуса. чего очень радует!!!! а как разделить что бы это было по очереди. что бы не на фоне, а по очереди. то есть картинки и полоска бегает или на оборот.

 


ОтветитьЦитата
Создатель темы Размещено : 18.07.2026 21:31
Aveal MT
(@aveal)
Top level Admin

@olga549 Добрый день! Добавил 4-й режим.

 


ОтветитьЦитата
Размещено : 20.07.2026 11:35
(@olga549)
Level 3

здравствуйте. РАБОТАЕТ!!!!! РАБОТАЕТ!!!!! а можно еще некоторое количество вопросов???? 1 вопрос? а как дальше что бы по кругу цвета перебирал не только G в этом цикле, а покругу RGB этом цикле в какой последовательности цвета  - не важно. 2 вопрос? а как сделать что бы прошел например цикл RGB сверху в низ, а потом BGR в верх и так по кругу ( цветовая последовательность не важна - какая не сложна в написании. ну и 3 вопрос? а можно в добавленных строках коменты после // написать на русском для понимания работы кода. и где в коде скорость меняется? то есть скорость переключения диодов. ну вот .... если это не сложно. то есть 1 картинка глобус, 2 картинка точки, 3 картинка полоски, в 4 цикле погонял с верху в низ и с низу в верх RGB и обратно в начала и тд. а так вообще красиво !!!!!! ОГОНЬ!!!!!!

 


ОтветитьЦитата
Создатель темы Размещено : 21.07.2026 22:04
(@olga549)
Level 3

у меня появился еще один вопрос , а какой принцип положен в основу этого цикла??? так как рассмотрев код внимательно я заметила что написание В00000000 во всей строке. я полагала что это должно выглядеть примерно так В00000001,В00000010,В000000100 и тд. то есть генератор передвигает биты диод бежит по окружности да еще и вращение окружности поэтому бегущая линия получается. интересно????


ОтветитьЦитата
Создатель темы Размещено : 21.07.2026 22:22
Aveal MT
(@aveal)
Top level Admin

@olga549 ну в итоге в 4-м режиме данные отправляются из массива test_array. Этот массив изначально объявлен с нулевыми битами, затем в процессе работы биты меняются при помощи функций SetBit() и ClearBit(). Можно поэкспериментировать на этом участке кода, чтобы разобраться как работает, другие биты - будут другие цвета или диоды. В функции вторым аргументом передается номер бита (от 0 до 120).


ОтветитьЦитата
Размещено : 22.07.2026 12:12
(@olga549)
Level 3

здравствуйте. а как это другие биты? если содержит byte test_array В00000000. а из них 5 красных, 5 зеленых, 5 синих. а на деле получается зажигаются только зеленые.  а как же этим управлять? а где это прописано в коде. а как дальше что бы по кругу цвета перебирал не только G в этом цикле, а покругу RGB этом цикле в какой последовательности цвета  - не важно. 2 вопрос? а как сделать что бы прошел например цикл RGB сверху в низ, а потом BGR в верх и так по кругу ( цветовая последовательность не важна - какая не сложна в написании. ну и 3 вопрос? а можно в добавленных строках коменты после // написать на русском для понимания работы кода. и где в коде скорость меняется? то есть скорость переключения диодов. ну вот .... если это не сложно. то есть 1 картинка глобус, 2 картинка точки, 3 картинка полоски, в 4 цикле погонял с верху в низ и с низу в верх RGB и обратно в начала и тд. куда и что надо дописать? очень хочется понять. очень интересно. не просто загрузила и великая радость. а вот это это и есть 0x80 бит определяющий цвет?


ОтветитьЦитата
Создатель темы Размещено : 22.07.2026 22:19
(@olga549)
Level 3

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


ОтветитьЦитата
Создатель темы Размещено : 23.07.2026 09:38
Aveal MT
(@aveal)
Top level Admin

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;

ОтветитьЦитата
Размещено : 23.07.2026 13:19
(@olga549)
Level 3

здравствуйте. спасибо за пояснения. все прочитала немного разобралась. буду пробовать и экспериментировать. но можно несколько вопросов??? а как дописать так что бы в 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;
}

 


ОтветитьЦитата
Создатель темы Размещено : 23.07.2026 22:44
Страница 7 / 9
Обзор конфиденциальности

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