464

Мікроконтроллери 3x3x3 LED куб

Практическая работа

Коммуникация, связь, радиоэлектроника и цифровые приборы

3x3x3 LED куб це фігура яка складаються з 27 світлодіодів, яку використовують переважно для дизайну інтер'єру. Різні сфери використання 3x3x3 LED куба. Розробка програмного і технологічного продукту, створення мікросхеми та розробка програми.

Украинкский

2013-01-06

643.5 KB

39 чел.

Міністерство освіти і науки україни

Національний університет «Львівська політехніка»

Кафедра автоматизованих систем управління

Розрахункова робота  

з дисципліни “Системний аналіз

на тему

«Мікроконтроллери.  3x3x3 LED куб»

Виконав:

студент групи КН-22

Кравчук А.В.

Прийняв:

                                                                                 доцент каф. АСУ

Зербіно Д.Д.

Львів – 2012

Зміст

Вступ

  1.  Вибір теми .

  1.  Формування й аналіз проблеми.

  1.  Вибір мікроконтроллера для вирішення поставленого завдання.

  1.  Схема та підєднання дротів.

  1.  Лістинг програмного коду для вирішення проблеми.

Висновки

Вступ

Мікроконтро́лер (англ. microcontroller), або днокристальна мікроЕОМ — виконана у вигляді мікросхеми , спеціалізована мікропроцесорна система, що включає мікропроцесор, блоки пам'яті для збереження коду програм і даних, порти вводу-виводу і блоки зі спеціальними функціями лічильники, компаратори, АЦП та інші).

Використовується для керування електронними пристроями. По суті, це — однокристальний комп'ютер, здатний виконувати прості завдання. Використання однієї мікросхеми значно знижує розміри, енергоспоживання і вартість пристроїв, побудованих на базі мікроконтролерів.

Мікроконтролери можна зустріти в багатьох сучасних приладах, таких як телефони, пральні машини, вони відповідають за роботу двигунів і систем гальмування сучасних автомобілів, з їх допомогою створюються системи контролю ісистеми збору інформації. Переважна більшість процесорів, що випускаються у світі — мікроконтролери.

При проектуванні мікроконтролерів доводиться дотримувати баланс між розмірами і вартістю з одного боку і гнучкістю і продуктивністю з іншою. Для різних застосувань оптимальне співвідношення цих і інших параметрів може розрізнятися дуже сильно. Тому існує величезна кількість типів мікроконтролерів, що відрізняються архітектурою процесорного модуля, розміром і типом вбудованої пам'яті, набором периферійних пристроїв, типом корпусу.

В той час, як 8-розрядні процесори загального призначення повністю витиснені продуктивнішими моделями, 8-розрядні мікроконтролери продовжують широко використовуватися. Це пояснюється тим, що існує велика кількість застосувань, в яких не потрібна висока продуктивність, але важлива низька вартість. В той же час, є мікроконтролери, з більшими обчислювальними можливостями, наприклад цифрові сигнальні процесори.

Обмеження за ціною і енергоспоживанням стримують також зростання тактової частоти контроллерів. Хоча виробники прагнуть забезпечити роботу своїх виробів на високих частотах, вони, в той же час, надають замовникам вибір, випускаючи модифікації, розраховані на різні частоти і напругу живлення. У багатьох моделях мікроконтролерів використовується статична пам'ять для ОЗП і внутрішніх регістрів. Це дає контролеру можливість працювати на менших частотах і навіть не втрачати дані при повній зупинці тактового генератора. Часто передбачені різні режими енергозбереження, в яких відключається частина периферійних пристроїв і обчислювальний модуль.

Окрім ОЗП, мікроконтролер може мати вбудовану незалежну пам'ять для зберігання програми і даних. У багатьох контролерах взагалі немає шин для підключення зовнішньої пам'яті. Найбільш дешеві типи пам'яті допускають лише одноразовий запис. Такі пристрої підходять для масового виробництва в тих випадках, коли програма контролера не оновлюватиметься. Інші модифікації контролерів мають можливістю багатократного перезапису незалежної пам'яті. На відміну від процесорів загального призначення, в мікроконтролерах часто використовується гарвардська архітектура.

Вибір теми

Тема яку я вибрав , це «3x3x3 LED куб» тобто фігура яка складаються з 27 світлодіодів, яку використовують переважно для дизайну інтер’єру.

Також цей куб можна використовувати і у інших сферах.

Часто користувачі ПК прикрашають свою «техніку» різними засобами. Наприклад світлом, світловими ефектами, при яких у темну пору доби робота  за комп’ютером є набагато цікавішою.

Але використання куба далеко не обмежується комп’ютерами. Він є універсальним засобом дизайну інтер’єру, так як проекційна дошка, годинник оптоволоконний світильник і т. д.

Куб є невеликих розмірів і вартість його є невеликою, а задоволення від такої прикраси величезне.


Різні сфери використання
3x3x3 LED куба:

Рис 1. LED куб у системному блоці  комп’ютера..

Рис 2. Світломузика.
Формування й аналіз проблеми

Дана проблема полягає в розробці програмного і технологічного продукту тобто створенні мікросхеми та розробка програми

У даній розрахунковій роботі я покроково розповім про виготовлення 3D LED куба, з розмірністю 3х3х3. Управління LED здійснюється за допомогою контролера Arduino.

Відмінною рисою даного проекту від інших є:

1. Невелике число додаткових компонентів, підключається безпосередньо до Arduino без використання різних мультиплексорів і т.п.

2. Проста для повторення принципова схема з безліччю фотографій і разьяснений.

3. Використання універсальної бібліотеки, що значно спрощує написання програми.

Для цього мені слід зрозуміти роботу світлодіодів та їх застосування.

Світлодіоди, або світловипромінюючі діоди (СІД, в англійському варіанті LED - light emitting diode) - напівпровідниковий прилад, що випромінює некогерентне світло при пропусканні через нього електричного струму. Робота заснована на фізичному явищі виникнення світлового випромінювання при проходженні електричного струму через pn-перехід. Колір світіння (довжина хвилі максимуму спектра випромінювання) визначається типом використовуваних напівпровідникових матеріалів, що утворюють pn-перехід.

 

Переваги:

1. Світлодіоди не мають ніяких скляних колб і ниток розжарювання, що забезпечує високу механічну міцність і надійність (ударна і вібраційна стійкість)

2. Відсутність розігріву і високих напруг гарантує високий рівень електро-і пожежобезпеки

3. Безінерційною робить світлодіоди незамінними, коли потрібна висока швидкодія

4. мініатюрність

5. Довгий термін служби (довговічність)

6. Високий ККД,

7. Щодо низькі напруги харчування та спожиті струми, низьке енергоспоживання

8. Велика кількість різних кольорів світіння, спрямованість випромінювання

9. регульована інтенсивність

Недоліки:

1. Відносно висока вартість. Ставлення гроші / люмен для звичайної лампи розжарювання в порівнянні зі світлодіодами становить приблизно 100 разів

2. Малий світловий потік від одного елемента

3. Деградація параметрів світлодіодів з часом

4. Підвищені вимоги до живлячої джерела

Зовнішній вигляд і основні параметри:

У світлодіодів є кілька основних параметрів:

1. Тип корпусу

2. Типовий (робочий) струм

3. Падіння (робоче) напруги

4. Колір світіння (довжина хвилі, нм)

5. Кут розсіювання 

В основному, під типом корпусу розуміють діаметр і колір колби (лінзи). Як відомо, світлодіод - напівпровідниковий прилад, який необхідно живити струмом. Так струм, яким слід живити той чи інший світлодіод називається типовим. При цьому на світлодіоді падає певну напругу. Колір випромінювання визначається як використовуваними напівпровідниковими матеріалами, так і легуючими домішками. Найважливішими елементами, використовуваними в світлодіодах, є: Алюміній (Al), Галій (Ga), Індій (In), Фосфор (P), що викликають світіння в діапазоні від червоного до жовтого кольору. Індій (In), Галій (Ga), Азот (N) використовують для отримання блакитного і зеленого свічень. Крім того, якщо до кристалу, що викликає блакитне (синє) світіння, додати люмінофор, то отримаємо білий колір світлодіода. Кут випромінювання також визначається виробничими характеристиками матеріалів, а також колбою (типу) світлодіода.

В даний час світлодіоди знайшли застосування в самих різних областях: світлодіодні ліхтарі, автомобільна світлотехніка, рекламні вивіски, світлодіодні панелі і індикатори, що біжать рядки і світлофори і т.д.

Схема включення і розрахунок необхідних параметрів:

Так як світлодіод є напівпровідниковим приладом, то при включенні в ланцюг необхідно дотримуватись полярності. Світлодіод має два висновки, один з яких катод ("мінус"), а інший - анод ("плюс").

Світлодіод буде "горіти" тільки при прямому включенні, як показано на малюнку

При зворотному включенні світлодіод "горіти" не буде. Більш того, можливий вихід з ладу світлодіода при малих допустимих значеннях зворотної напруги. 
Вибір мікроконтроллера для вирішення поставленого завдання

Я вибрав платформу Arduino – оскільки це один з новітніх мікроконтролерів.

Він непотребує окремого розроблення схеми оскільки має в додатку уже готовий стенд до якого підключається як сам мікроконтролер , так і всі інші деталі потрібні для створення певного проекту.

Arduino — апаратна обчислювальна платформа, основними компонентами якої є плата вводу/виводу та середовище розробки на мові Processing/Wiring. Arduino може використовуватися як для створення автономних інтерактивних об'єктів, так і підключатися до програмного забезпечення, яке виконується на комп'ютері (наприклад: Adobe Flash, Processing, Max/MSP, Pure Data, SuperCollider). Інформація про плату (малюнок друкованої плати) знаходиться у відкритому доступі і може бути використана тими, хто вважає за краще збирати плати самостійно

Отже, нам знадобиться:

- Макетна плата

- 3 NPN транзистора (2N2222, 2N3904, BC547 і т.п.)

- 12 резисторів (~ 220 Ом і 22 кОм)

- 13 конекторів (тато або мама)

- 27 світлодіодів (LED)

- З'єднувальні дроти


Схема та під
єднання дротів

Схема пристрою проста. Кожна з дев'яти колон підключена до висновків Arduino через струмообмежувальні резистори. А всі 3 рівня підключені до загального висновку через NPN-транзистори, які, в свою чергу підключаються до Arduino.

Т.ч. використовується тільки 12 висновків Arduino. В один момент часу буде загорятися LED тільки одного рівня, але за рахунок швидкого перемикання між рівнями, буде здаватися, що одночасно горять всі рівні (залежно від програми).

Передусім необхідно припаяти 9 резисторів. Я використовував резистори опором 220 Ом, які обмежують струм на рівні 22 мА. Номінал резисторів залежить від типу застосовуваних світлодіодів, і варіюється від 135 до 470 Ом. Більш точний розрахунок резистора для світлодіода можна зробити тут: LED калькулятор. Кожен висновок Arduino здатний видати до 40 мА.

Резистори на платі, я припаяв вертикально.

Після, я наклеїв шар ізоляційної стрічки, щоб не коротнуло з перемичками.

Наступним етапом буде монтаж радіоелементів для управління рівнями. Тут використовується три NPN-транзистора. Бази транзисторів, через резистор 22 кОм приєднуються до висновків Arduino. Т.ч. контролер відкриває транзистор і весь рівень LED з'єднується з "загальним".


Лістинг програмного коду для вирішення проблеми

В інтернеті я знайшов кілька прикладів управління подібними LED кубами. Але у всіх них був потрібний величезний початковий масив bin або hex даних. Я все вирішив написати свою програму управління.

Першим завданням було зробити доступне для розуміння відповідність програми і заліза. Я прийняв рішення звертатися до рівнів і колонах, замість використання RAW-даних порту або традиційних x, y, z. Другим завданням було зробити базові функції куба, такі як включення / відключення окремого світлодіода і ін..

Також, я вирішив ввести дві додаткові можливості для реалізації різних ефектів. Перша це буфер, який дозволяє реалізовувати основні функції для реалізації складних шаблонів, і друга - це функція послідовності.

Всю цю функціональність я зробив у вигляді класів і зробив бібліотеку Arduino, яку можна використовувати для інших проектів і навіть з іншого розмірністю куба.

#include <stdlib.h> // malloc and free

#include "WProgram.h"

#include "LedCube.h"

LedCube::LedCube(byte size, byte lp[], byte cp[]) : levels(size), cols(size*size), bufferEnabled(false), bufferInverted(false)

{

randomSeed(analogRead(0));

 

// initialize memory for dynamic arrays

buffer    = (byte **) malloc(size * sizeof(*buffer));

colPins   = (byte *)  malloc(cols * sizeof(byte));

levelPins = (byte *)  malloc(size * sizeof(byte));

 

for (byte i= 0; i < levels; i++)

{

 buffer[i] = (byte *) malloc(cols * sizeof(byte));

 levelPins[i] = lp[i];

 pinMode(levelPins[i], OUTPUT);

}

 

for (byte i= 0; i < cols; i++)

{

 colPins[i] = cp[i];

 pinMode(colPins[i], OUTPUT);

}

 

clearBuffer();

}

byte LedCube::getNumCols()

{

return cols;

}

byte LedCube::getNumLevels()

{

return levels;

}

int LedCube::getLevelPin(int lv)

{

return lv <= levels ? levelPins[lv] : 0;

}

int LedCube::getColPin(int col)

{

return col <= cols ? colPins[col] : 0;

}

// buffer methods

void LedCube::enableBuffer(boolean enable)

{

bufferEnabled = enable;

}

void LedCube::invertBuffer(boolean invert)

{

bufferInverted = invert;

}

 

void LedCube::clearBuffer()

{

 toggleBuffer(0);

}

void LedCube::fillBuffer()

{

 toggleBuffer(1);

}

 

void LedCube::toggleBuffer(byte val)

{

for(byte lv=0; lv < levels; lv++)

 for(byte col=0; col < cols; col++)

  buffer[lv][col] = val;

}

byte LedCube::getBufferAt(byte lv, byte col)

{

return buffer[lv][col];

}

void LedCube::drawBuffer(unsigned int wait, byte duration)

{

byte seq[levels*cols*2];

byte num = 0;

for(byte lv=0; lv<levels; lv++) {

 for(byte col=0; col<cols; col++) {

  if(buffer[lv][col]){

   seq[num] = lv;

   seq[num+1] = col;

   num+=2;

  }

 }

};

 

bool tmpBuffer = bufferInverted;

bufferEnabled = false;

bufferInverted = false;

 

lightSequence(seq,num,wait,duration);

 

bufferEnabled = true;

bufferInverted = tmpBuffer;

}

void LedCube::light(byte lv, byte col, byte val)

{

if(lv<levels && col<cols){

 if(bufferEnabled){

  buffer[lv][col] = val;

 } else {

  digitalWrite(colPins[col], val);

  digitalWrite(levelPins[lv], val);

 }

}

}

void LedCube::lightOff(byte level, byte col)

{

light(level,col,(bufferInverted ? HIGH : LOW));

}

void LedCube::lightOn(byte lv, byte col)

{

light(lv,col,(bufferInverted ? LOW : HIGH));

}

void LedCube::lightPulse(byte lv, byte col, unsigned int wait)

{

lightOn(lv, col);

if(!bufferEnabled){

 delay(wait);

 lightOff(lv, col);

}

}

void LedCube::lightSequence(byte seq[], byte length, unsigned int loops, byte duration)

{

if(length%2){ return; }

 

if(bufferEnabled){ loops = 1; }

 

for (unsigned int l=0; l<loops; l++) {

 for (byte s=0; s<length; s+=2) {

  if(bufferEnabled){

    lightOn(seq[s],seq[s+1]);

  } else {

    lightPulse(seq[s],seq[s+1],duration);

  }

 }

}

}

void LedCube::lightLevel(byte lvl, unsigned int wait)

{

if(lvl<levels){

 byte seq[2 * cols];

 for(byte c=0; c<cols; c++) {

   seq[c*2] = lvl;

   seq[c*2+1] = c;

 }

 lightSequence(seq,sizeof(seq),wait);

}

}

void LedCube::lightRow(byte r, byte level, unsigned int wait)

{

if(r<levels && level<cols){

 byte start = r*levels;

 byte seq[] = {level,start,level,start+1,level,start+2};

 lightSequence(seq,levels*2,wait);

}

}

void LedCube::lightColumn(byte col, unsigned int wait)

{

if(col && col<=cols){

 byte seq[] = {0,col-1,1,col-1,2,col-1};

 lightSequence(seq,levels*2,wait);

}

}

void LedCube::lightDrop(byte col, unsigned int wait)

{

 for(byte r=0; r<levels; r++) {

  lightPulse(r,col-1,wait);

 }

}

void LedCube::lightPerimeter(byte level, byte rotations, unsigned int wait)

{

byte seq[] = {level,0,level,1,level,2,level,5,level,8,level,7,level,6,level,3};

lightSequence(seq, sizeof(seq), rotations, wait);

}

void LedCube::randomLight(byte numLights, unsigned int wait)

{

for (byte l=0; l<numLights; l++) {

 lightPulse(random(0,levels), random(0,cols), wait);

}

}

void LedCube::randomColumn(byte numColumns, unsigned int wait)

{

for (byte c=0; c < numColumns; c++) {

 lightColumn(random(0,cols), wait);

}

}

Висновок: 

Під час виконання розрахункової роботи я провів досить довгу роботу по збору інформації , класифікації інформації , абстрагування її – відкидання усіх непотрібних(неважливих) деталей. Окрім того вибрав якомога кращий спосіб для реалізування задуманого проекту . Цю роботу і повинен робити системний аналітик. Також я написав універсальну програму яка можливо і не є ідеальною але може бути на перший використаною.


 

А также другие работы, которые могут Вас заинтересовать

68908. Файлы образов фрагментов экрана 46.5 KB
  Детали формата Каждый файл содержит заголовок файла заголовок Bitmp карту цветов если изображение не 24 битное и собственно изображение. Заголовок Bitmp Windows За заголовком файла следует заголовок Bitmp и необязательно карта цветов.
68909. Преобразование на плоскости 85 KB
  Представление графических изображений осуществляется точками и линиями. Возможность преобразования точек и линий является основой компьютерной графики. При использовании компьютерной графики можно изменять масштаб изображения, вращать его, смещать и трансформировать для улучшения наглядности изображения объекта.
68910. Аффинные преобразования координат при моделировании динамики объектов 197 KB
  Начальному положению фигуры соответствует единичная матрица R единицы на главной диагонали остальные члены нули. Новые координаты x y высчитываются в процедуре NEW_XY которая вызывается непосредственно при выводе фигуры на экран процедурой PICT.=
68911. Преобразования в пространстве 54.5 KB
  В трехмерном случае (3D) рассмотрим однородные координаты. Поступая аналогично тому, как это было сделано в размерности два, заменим координатную тройку (х, у, z), задающую точку в пространстве, на четверку чисел (х, у, z, 1).
68912. Виды проектирования 92.5 KB
  Линия горизонта и точка схода являются особенностью изображения и реально не существуют в трёхмерном пространстве. Однако наша задача получить картину трёхмерного изображения, т.е. двухмерную твердую копию (на экране, на бумаге).
68914. Вывод текста 54 KB
  Вывод текста на экран в графическом режиме имеет ряд отличий от подобных действий в текстовом режиме. Отличие состоит в том, что все действия производятся только со строковыми константами и переменными, числовая же информация должна предварительно преобразовываться в строковую (процедуру Str).