Denys Zverev

Динамическая развертка для построения изображений в пространстве

6 сообщений в этой теме

Добрый день дорогие форумчане!

Кто может помочь с написанием/"или ткнуть носом" кода для микроконтроллера, который будет выполнять динамическую развертку изображения в пространстве.

Для того чтоб было понятнее что я хочу, вот ссылка на видео https://www.youtube.com/watch?v=YuVXndVujG8&list=RDLGy0neDXxAE&index=4.

Конструкция собой представляет: 1) гироскоп - будет передавать сигнал положения в пространстве, и из этого должна строится картинка. 2) RGB светодиоды - 144шт. на метр. 3) Микроконтроллер. Может еще что-то упустил.

Изменено пользователем Denys Zverev

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
солар    122

Подпишусь. Жутко любопытно про гироскоп в такой приблуде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
irokess    112
10 часов назад, Denys Zverev сказал:

Может еще что-то упустил

Да, сущую мелочь - понимание, как это работает.

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

При поиске используйте фразу "Часы Боба Блика"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    226

Интересная тема, но как вы будете ее осуществлять без навыков программирования? Помочь можно, но писать за вас программу никто не будет. Понаблюдаю за темой, лет 5 назад с другом делали нечто подобное, исходники к сожалению не сохранились, но платы где-то валяются, было две платы, каждая 40 см. 80 rgb светодиодов, выглядело как-то так...

6cc1af5d175ea1b8cd1b407abe84d4d6.png   7815b50306d7cd313fe9647853ce395f.png   70e2b92285d51f94633bb75243583912.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

1 час назад, croc19 сказал:

Спасибо

Изменено пользователем Denys Zverev

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

Войти

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

Войти сейчас


  • Похожие публикации

    • Автор: Максим Окатов
       
      Товарищи, помогите пожалуйста. Данная програмулина при нажатии на кнопку входит в функцию MinU() в которой инициализирует таймер для задержки(ждем отпустит пользователь кнопку или нет) если кнопка не отпущена то уменьшаем скважность ШИМ.
      проблема в выделенной красным строчке! когда count больше 3 уменьшаем скважность, но в отладчике AVR studio, Proteus и в железе не робит.
      Перепрыгивает действие в {} так будь-то условие не выполнено...
      #define F_CPU 1000000L
      #include <avr/io.h>
      #include <avr/interrupt.h>
      #include <util/delay.h>
      unsigned char count = 0;
      unsigned char a=5,s=3,b=0;
          //===================================Насройка таймера====================
      void Timer_ini(void){
         TCCR1B = (1<<CS12)|(0<<CS11)|(0<<CS10);
         TCNT1 = 65535-976;
         TIMSK |= (1<<TOIE1);
         count = 0;
        }
          //===========================настройка шим===========================
      void PWM_ini(void){
         ASSR=0x00;
         TCCR2=0b01101110; //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ
         OCR2=200;
      }
      //===============
      void MinU(){
          unsigned char i=0;
          Timer_ini();
          while (!(PINB&0b00000010)){
              if(count>2){        //Если таймер считал более двух раз
                _delay_ms(100); // ждем 100 мс
                OCR2--; // Уменьшаем скважность
                i=1;        // были в плавном уменьшении
            }
            
         }
         if (i!=1) // если не были в плавном уменьшении
         {
             OCR2=OCR2-50;
             i=0;
         }
      }
              //=======================================================
      int main(void)
          {
             
              // Настраиваем порт D на выход
              DDRB = 0b00001000;
              PWM_ini();
              //Timer_ini();
              sei();
              
              
              while(1)
              {
                  b=a-s;
                  if (!(PINB&0b00000010))
                  {
                      MinU();
                  }/*
                  //if (!(PINB&0b00000100))
                  //{
                      //PlsU();
                  //}*/
              }
              return 0;
          }
          
          ISR (TIMER1_OVF_vect)
          {
              count++;
              TCNT1 = 65535-976;
                  }
       
       
       
    • Автор: Serg_Mang
      Можно ли залить в arduino прошивку, предназначенную для чистого AVR?
    • Автор: Дмитрий Мартынов
      Здравствуйте!
      Пишу программу на C++ для управления LCD (HD44780) по I2C через модуль расширения портов ввода/вывода PCF8574AT.
      void LCD_I2C::readBF() { transmitByte(0b00001110); //transmits E, RW set to HIGH and RS, set to LOW _delay_ms(5); transmitByte(0b00001010); //transmits E, RS set to LOW and RW set to HIGH _delay_ms(5); initRestart(); transmitAddrRW(0b01111111); //sends PCF8574AT address + SLA+R do { receiveDataAck(); PORTA = storage; } while((storage & (1 << BF)) != 0); //wait until BF is 0 initRestart(); transmitAddrRW(0b01111110); } Метод void transmitByte(uint8_t data) после инициализации состояния "Старт" и отправки адреса устройства + SLA+W отправляет байт данных по TWI с ожиданием бита подтверждения (команды работают верно, проверял по регистру статуса TWI - 0x08, 0x10 и 0x24).
      Метод void transmitAddrRW(uint8_t address) отправляет соответственно SLA+W/R + адрес устройства (команда работает также верно). Нареканий к работе TWI у меня нет, т.к. недавно с его помощью успешно запустил часы DS1307 с интеграцией LCD.
      После передачи запроса на чтение флага занятости инициализируется состояние "ПОВСТАРТ", отправляется адрес устройства + SLA+R, далее идет цикл - запрос байта данных (состояние выводов PCF8574AT) с отправкой бита подтверждения uint8_t receiveDataAck() (команды работают также верно, возвращает storage = TWDR) и вывод storage на порт А микроконтроллера (там установлены светодиоды).
      Чтение регистра данных TWDR после принятия байта данных (receiveDataAck()) дает следующий результат - 0b00000010 - установлен только бит RW микросхемы. Таким образом, флаг занятости BF = DB7 = 7й бит оказывается сразу же сброшенным, происходит мгновенный выход из цикла - контроллер дисплея не успевает скушать информацию, и инициализация не выполняется (неудачную инициализацию определяю по отсутствию курсора). Ожидалось, что флаг занятости будет установлен в единицу и произойдет несколько итераций перед выходом из цикла.
      При замене метода ожидания сброса флага занятости BF на программную задержку в 250 мс везде, где это требует datasheet - инициализация происходит успешно (появляется курсор, как и должно быть).

      Вопрос: что можно сделать, чтобы вместо _delay_ms(250) использовать readBF(), т.к. этот путь мне кажется более верным (уж очень не хочется использовать задержку .__.)? Возможно, проблема в микросхеме, которая неверно выдает информацию при чтении? (Имеется вторая микросхема, она вообще не работает:D)

      З.Ы. На фото виден результат чтения флага BF и Adress Counter - установлен только бит RW.  



      З.Ы.Ы Кому интересно - вот функция main(). Повторюсь - проблема только в методе readBF():
      void LCD_I2C::init() { setBitRate(20000); initStart(); transmitAddrRW(0b01111110); //send PCF8574AT address + SLA+W _delay_ms(60); sendInstruction(0b00110000); //function set 8-bit operation _delay_ms(20); sendInstruction(0b00110000); //function set 8-bit operation _delay_ms(5); sendInstruction(0b00110000); //function set 8-bit operation _delay_ms(5); sendInstruction(0b00100000); //function set 4-bit operation readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00100000); //function set 4-bit operation, 2 lines, 5x8 dots sendInstruction(0b10000000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //display off, cursor off, blinking off sendInstruction(0b10000000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //display clear sendInstruction(0b00010000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //entry mode set increment, display shift off sendInstruction(0b01100000); readBF(); //_delay_ms(250); //debug!! sendInstruction(0b00000000); //display on, cursor off, blinking off sendInstruction(0b11100000); readBF();/ }  
    • Гость Сергей
      Автор: Гость Сергей
      здравствуйте. ребята помогите разобраться  с программой 
      задача программы мигать светодиодами и менять тетрады при внешнем прерывании
      всё хорошо только одно но! если по шагово смотреть процесс в avr studio 4 то доходя до команды call её  не получается активировать. То есть в подпрограмму не получается зайти, после этой команды переходит к следующей команде. ЗАГРУЖАЮ В Мк atmega16A программа не работает
      подскажите пожалуйста в чём косяк  что я не правильно делаю
      .include"m16def.inc"
      .ORG 0x0000          // адрес прерывания по сбросу
           JMP start       // переход на метку start
      .ORG 0x0024          // адрес прерывания INT2
           JMP int_2       // переход на обработчик прерывания INT2
      .ORG 0x002A          // адрес начала программы
      start:
      //**** инициализация стека ****
           LDI R16, 0x04   ;// загрузка в R16 числа 0x04
           OUT SPH, R16    ;// пересылка числа 0x04 из R16 в регистр SPH
           LDI R16, 0x5F   ;// загрузка в R16 числа 0x5F
           OUT SPL, R16    ;// пересылка числа 0x5F из R16 в регистр SPL
      //**** инициализация прерывания ****
           LDI R16, 0b00100000
           OUT GICR, R16   ;// разрешение прерывания INT2
           LDI R16, 0b00000000
           OUT MCUCSR, R16 ;// прерывание по спадающему фронту сигнала ("H->L")
      //**** инициализация порта С ****
           SER R16         ;// установка всех бит регистра R16 в "1"
           OUT DDRC, R16   ;// инициализация порта C (работает как выход)
      //**** загрузка R16 и R17 ****
           LDI R16, 0b11110000  ;// значение 0xF0
           LDI R17, 0b11100111  ;// значение 0xE7
      SEI             ;// установка флага глобального прерывания
      m1:                  ;// метка начала цикла основной программы
           OUT PORTC, R16  ;// вывод на светодиоды содержимого R16
           CALL wait       ;// вызов подпрограммы задержки
           OUT PORTC, R17  ;// вывод на светодиоды содержимого R17
           CALL wait       ;// вызов подпрограммы задержки
           RJMP m1         ;// переход на метку m1
      //**** подпрограмма задержки на 800 мкс (при f=1 МГц) ****
      wait:                ;// метка по которой вызывается подпрограмма
           PUSH R17        ;// сохранение [R17] в стеке
           LDI R17, 200    ;// загрузка в R17 константы задержки (200 циклов)
      w1:                  ;// метка цикла задержки на 800 машинных тактов
           NOP             ;// пустая команда (добавляет 1 такт в цикл задержки)
           DEC R17         ;// декрементирование R17 (уменьшение на 1)
           BRNE w1         ;// если не обнулился R17, продолжать цикл
           POP R17         ;// восстановление содержимого R17 из стека
           RET             ;// выход из подпрограммы задержки
      //**** обработчик прерывания INT_2 ****
      int_2:
           SWAP R16        // поменять тетрады R16 местами
         RETI            // выход из подпрограммы обработчика прерывания