You are on page 1of 19

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНІ “КИЇВСЬКИЙ

ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ СІКОРСЬКОГО” ІНСТИТУТ


ПРИКЛАДНОГО СИСТЕМНОГО АНАЛІЗУ КАФЕДРА СИСТЕМНОГО
ПРОЕКТУВАННЯ

Розрахункова графічна робота


З архітектуриобчислювальних систем на тему
“Arduino як контроллер LED-стрічки з адресацією”

Керівник роботи
Доцент кафедри СП
Артюхов В.Г.

Виконала
Фоменко М.М

Київ – 2023
Зміст

Вступ 3
Опис завдання 6 3
Елементи проекту 4
3.1 Плата Arduino Nano 328P
4
3.2 LED-стрічка з адресацією
9
3.3 Резистор
10
Загальна схема проекту
11
Блок схема алгоритму
12
Приклад роботи пристрою
14
Висновок
15
Використана література
16
Додаток
17

Вступ
2
Темою проекту є використання Arduino як контроллера LED, адже зараз на
ринку багато пропозицій, пов’язаних з гарним освітленням для дому, тому
хочу зробити це освітлення автоматично керованим за допомогою
персонального комп’ютеру.
Цей проект включає у собі використання різноманітних пристроїв, а саме:
плату Arduino Nano, LED-стрічку з адресацією, блок живлення, резистор,
дроти, usb type-b кабель та трошки навичок використання паяльника.
Звісно, за допомогою Arduino IDE можна буде завантажити нашу программу
до мікроконтролера та дослідити роботу пристрою на практиці.

Опис завдання
Розробити пристрій для контролю адресної ленти з ПК на базі Arduino Nano
та стрічки з світлодіодами WS2812. Пристрій повинен змінювати яскравість
та колір на окремих світлодіодах та реагувати на зміни на екрани
комп’ютера, для чого ми використаємо програму AmbiBox.

3
Елементи проекту
1. Плата Arduino Nano 328P (без додаткових “пінів”).
2. LED-стрічка з адресацією на WS2812 світлодіодах.
3. Блок живлення 5V -- 2A
4. Резистор MF-25 (С2-23) 0.25 Вт, 300 Ом,
5. USB-Type B toMini-USB

3.1 Плата Arduino Nano 328P

Рис. 1 Arduino Nano 328P

Проаналізувавши вибір плат Arduino, було обрано Arduino Nano 328P,


оскільки вона має всі необхідні компоненти для побудови пристрою, та може
витримати необхідне живлення. Також вона більш компактна ніж Arduino
UNO та не має зайвих “пінів”, які нам не потрібні.
Характеристики
 Мікроконтроллер: ATmega 328p
 Тип корпусу: TQFP-32.
 Цифрових входів / виходів: 14 (з яких 6 можуть бути використані як
ШІМ)
 Аналогових входів: 8.
 Робоча напруга: 5В
 Вхідна напруга (рекомендована): 7-12В

4
 Пам'ять: 32 кБ з яких 2кб використовується бутлоадер
 SRAM: 2 кБ
 EEPROM: 1 кБ
 Частота: 16МГц

Програмна модель ATmega328p

На рисунку 3.1.2 дображена програмну модель AVR ахітектури, яка є блок-


діаграмою доступних ресурсів. Центральний блок представляє собою
регістровий файл з 32 оперативних регістрів (R0-R31) - регістр загального
призначення (РОН). Усі РОН є доступними для ALU (Arithmetic Logic Unit).
Старші регістри об’єднані парами и утворюють три 16-розрядних регістри,
які використовуються для непрямої адресації осередків пам’яті.

Регістровий файл, оперативна пам’ять та блок регістрів вводу-виводу


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

Всі арифметичні і логічні операції, а також частина операцій роботи з бітами


виконуються в АЛП тільки над вмістом РОН. Слід звернути увагу, що
команди, які в якості другого операнда мають константу (SUBI, SBCI, ANDI,
ORI, SBR, CBR), можуть використовувати в якості першого операнда лише
регістри з другої половини РОН (R16-R31). Команди 16-розрядного
складання з константою ADIW і віднімання константи SBIW в якості
першого операнда використовують тільки регістри R24, R26, R28, R30.

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


бітами АЛУ формує ті чи інші ознаки результату операції, тобто встановлює
або скидає біти в регістрі стану SREG (Status Register).

Ознаки результату операції можуть бути потім використані в програмі для


виконання подальших арифметико-логічних операцій або команд умовних
переходів.

5
Рис. 2 Діаграма архітектури AVR

6
Рис. 3 Місцезнаходження сигналів вводу-виводу

Рис. 4 Розміри плати у дюймах

7
Рис. 5 Схема плати

Рис. 6 Опис елементів плати Arduino Nano 3.0

8
3.2 LED-стрічка з адресацією

Рис. 7 Вигляд LED стрічки з адресацією

Стрічка з адресацією відрізняються від звичайних, можливістю передавати


керуючий сигнал

Характеристики

 Кількість світлодіодів 60 LED/m


 Вхідна напруга 5V

Рис. 8 Вигляд LED-схема

9
3.3 Резистор

Рис. 9 Вигляд резистора

Для підключення фоторезистору до Arduino, безпосередньо потрібно


підключать через резистор, оскільки нам потрібно обмежити струм і подати
потрібне нам напругу для коректної роботи PGM5659D (обмежений струм
для різкого зменшення опору; утворення напруги для передбачуваних
значень на аналоговом порті)

Характеристики

 Вид резистору: металоплівковий резистор


 Опір: 10 Ком
 Потужність: 0.6 Вт
 Напруга: 350 В
 Допустиме відхилення: 1%
 Робочі температури: -55ºC … +155ºC

10
Загальна схема проекту

Рис. 10 Загальна схема проекту

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


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

11
Блок схема алгоритму

12
Рис. 11 Блок схема алгоритму

13
Приклад роботи пристрою

Рис. 12 Arduino з припаяними проводами

Рис. 13 LED стрічка з адресацією


14
Рис. 14 Приклад роботи з одним кольором

Висновок
У роботі було розглянуто будову Arduino Nano 3.0 328p та спроектовано
пристрій для управлінням LED стрічкою з можливістю контролювати окремі
світлодіоди.

15
Використана література

1. Характеристики Arduino
https://arduino.ua/prod166-arduino-nano-v3-0-avr-atmega328p-s-raspaya
nnimi-razemami
2. Програмна модель та архітектура
https://pdf1.alldatasheet.com/datasheet-pdf/view/422609/ATMEL/ATME
GA328.html
3. Схеми Arduino
https://components101.com/microcontrollers/arduino-nano
4. Опис елементів плати
https://micro-pi.ru/arduino-nano-v3-0-%D0%BE%D0%B1%D0%B7%D
0%BE%D1%80-%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0
%B5%D1%80%D0%B0/

5. WS2818 схема
https://pdf1.alldatasheet.com/datasheet-pdf/view/1134589/
WORLDSEMI /WS2818A.html

16
Код програми
/*

Controlling LED WS2812 with PC and

Fomenko project DA-21

*/

//----------------------Settings-----------------------

#define NUM_LEDS 98 // Number of lamps in LED

#define DI_PIN 13 // PIN connected to LED

#define OFF_TIME 10 // Time in seconds when LED goes off if signal is missing

#define CURRENT_LIMIT 2000 // Power limit mA (0 - Turn off)

#define START_FLASHES 0 // Checking LED on start (1 - On, 2 - Off)

#define AUTO_BRIGHT 1 // Automatic brightness (1 - On, 2 - Off)

#define MAX_BRIGHT 255 // Maximum brightness (0 - 255)

#define MIN_BRIGHT 50 // Minimum brightness (0 - 255)

#define BRIGHT_CONSTANT 500 // Const for making LED smoother when changing brightness
(less-faster) (0 - 1023)

#define COEF 0.9 // Filtering (0.0 - 1.0), bigger - slower changing brightness

//----------------------Settings-----------------------

int new_bright, new_bright_f;

unsigned long bright_timer, off_timer;

#define serialRate 115200 // Speed Connection to PC 21

uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i; // Code Word Ada For connection

#include // Library to handle LED CRGB leds[NUM_LEDS]; // Creating LED

boolean led_state = true; // LED STATE

void setup()

17
FastLED.addLeds(leds, NUM_LEDS); // Initilizin LEDs

if (CURRENT_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT);

// Flashing on start (if turned on)

if (START_FLASHES) {

LEDS.showColor(CRGB(255, 0, 0));

delay(500);

LEDS.showColor(CRGB(0, 255, 0));

delay(500);

LEDS.showColor(CRGB(0, 0, 255));

delay(500); LEDS.showColor(CRGB(0, 0, 0));

Serial.begin(serialRate);

Serial.print("Ada\n"); // Connect to PC

void check_connection() {

if (led_state) {

if (millis() - off_timer > (OFF_TIME * 1000)) {

led_state = false;

FastLED.clear();

FastLED.show();

void loop() {

if (!led_state) led_state = true;

off_timer = millis();

for (i = 0; i < sizeof prefix; ++i) {

waitLoop: while (!Serial.available()) check_connection();;

if (prefix[i] == Serial.read()) continue;

i = 0;

18
goto waitLoop;

while (!Serial.available()) check_connection();;

hi = Serial.read(); while (!Serial.available()) check_connection();;

lo = Serial.read(); while (!Serial.available()) check_connection();;

chk = Serial.read();

if (chk != (hi ^ lo ^ 0x55))

i = 0;

goto waitLoop;

memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));

for (uint8_t i = 0; i < NUM_LEDS; i++) {

byte r, g, b;

// Read for every Colour

while (!Serial.available()) check_connection();

r = Serial.read();

while (!Serial.available()) check_connection();

g = Serial.read();

while (!Serial.available()) check_connection();

b = Serial.read();

leds[i].r = r;

leds[i].g = g;

leds[i].b = b;

FastLED.show(); // Show colours on LED

19

You might also like