Файл: Лабораторная работа 2 (Формирование управляющих воздействий).pdf

Добавлен: 15.11.2018

Просмотров: 1248

Скачиваний: 11

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

11 

 

 

//Переключать состояние СИД согласно порядку обхода куба соседних чисел 

  switch (cntClick)  
  
    case 0: digitalWrite(BLED_PIN, HIGH); break; 

//Состояние 7 - Выключены

 

    case 1: digitalWrite(RLED_PIN, LOW); break;  

//Состояние 3 - Красный

 

    case 2: digitalWrite(GLED_PIN, LOW); break;  

//Состояние 1 - Жёлтый

 

    case 3: digitalWrite(RLED_PIN, HIGH); break; 

//Состояние 5 - Зелёный

 

    case 4: digitalWrite(BLED_PIN, LOW); break;  

//Состояние 4 - Голубой

 

    case 5: digitalWrite(RLED_PIN, LOW); break;  

//Состояние 0 - Белый

 

    case 6: digitalWrite(GLED_PIN, HIGH); break; 

//Состояние 2 - Фиолетовый

 

    case 7: digitalWrite(RLED_PIN, HIGH); break; 

//Состояние 6 - Синий

 

  
  delay(50); 

//Задержка программы длительностью 50 мс

 

Используйте другие способы обхода куба соседних чисел. 

Управление RGB-светодиодом с общим анодом через аналоговые порты 

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

через  аналоговые  выходы  контроллера  Arduino.  Роль  исполнительного  устройства  (а 
точнее  трёх)  будет  по-прежнему  играть  RGB-светодиод  с  общим  анодом  на  печатной 
плате (рисунок 7а). В качестве датчика будем использовать энкодер  на печатной плате с 
токоограничивающими резисторами (рисунок 10). Энкодер имеет 20 положений  на один 
полный оборот с шагом 18°. 

 

Рисунок 10

 

– Внешний вид печатной платы с энкодером 

Электрическая схема подключения RGB-светодиода с общим анодом и энкодера к 

Arduino показана на рисунке 11, а код программы приведён в листинге 4. 

 

Рисунок 11

 

– Электрическая схема подключения RGB-светодиода с общим анодом 

и энкодера к Arduino 


background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

12 

 

Листинг 4 – Управление тремя исполнительным устройством на примере 

RGB-светодиода с общим анодом через аналоговые выходы 

#define SW_PIN 2     

//SW - кнопка энкодера

 

#define CLK_A_PIN 7  

//CLK - сигнал A энкодера

 

#define DAT_B_PIN 4  

//DT - сигнал B энкодера

 

#define R_PIN 3      

//Номер порта для подключения красного светодиода

 

#define G_PIN 5      

//Номер порта для подключения зелёного светодиода

 

#define B_PIN 6      

//Номер порта для подключения синего светодиода

 

 

int swState = 0;     

//Состояние кнопки (нажата/не нажата)

 

bool clkAPre = HIGH; 

//Предыдущее значение сигнала на линии A энкодера

 

bool clkACur = LOW;  

//Текущее значение сигнала на линии A энкодера 

int rgbLed[3] = {255, 255, 255}; 

//0 - максимальная яркость, 255 - погашены

 

 
void setup() 

  

// put your setup code here, to run once: 

  pinMode(SW_PIN, INPUT); 

//Настроить порт кнопки на ввод дискретного сигнала

 

  digitalWrite(SW_PIN, HIGH); 

//Подключить внутренний подтягивающий резистор

 

  pinMode(CLK_A_PIN, INPUT);  

//Сигнал A энкодера

 

  pinMode(DAT_B_PIN, INPUT);  

//Сигнал B энкодера

 

  analogWrite(R_PIN, rgbLed[0]); 

//Погасить все

 

  analogWrite(G_PIN, rgbLed[1]); 

//светодиоды

 

  analogWrite(B_PIN, rgbLed[2]); 

//триады

 


 
void loop() 

 

// put your main code here, to run repeatedly: 

  if (digitalRead(SW_PIN) == LOW) 

//Если кнопка нажата, то...

 

  { 
    while (digitalRead(SW_PIN) == LOW); 

//...ждать, пока кнопка не отпущена

 

    swState++; 

//Теперь можно сосчитать нажатие на кнопку

 

    if (swState > 2) swState = 0; 

//Если это 3-е нажатие, считать его нулевым

 

  } 
   
  clkACur = digitalRead(CLK_A_PIN); 

//Считать текущее значение сигнала A

 

 

//Если предыдущий уровень на линии A был низким, а сейчас стал высоким, ... 

  if ((clkAPre == LOW) && (clkACur == HIGH)) 
  { 
   

//...и, если сигнал B низкого уровня, то...

 

    if (digitalRead(DAT_B_PIN) == LOW) 

 

    { 
     

//...значит энкодер вращается по часовой стрелке, ... 

      rgbLed[swState]--; 

//Прибавить яркость выбранного кнопкой светодиода

 

     

//Яркость RGB-светодиода растёт при уменьшении скважности ШИМ 

      if (rgbLed[swState] < 230) rgbLed[swState] = 230; 

//Ограничить яркость

 

    } else 
    { 
     

//...а иначе - против часовой стрелки 

      rgbLed[swState]++; 

//Убавить яркость выбранного кнопкой светодиода

 

     

//Яркость RGB-светодиода уменьшается при увеличении скважности ШИМ 

      if (rgbLed[swState] > 255) rgbLed[swState] = 255; 

//Погасить светодиод

 

    } 
    analogWrite(R_PIN, rgbLed[0]); 

//Установить яркость красного светодиода

 

    analogWrite(G_PIN, rgbLed[1]); 

//Установить яркость зелёного светодиода

 

    analogWrite(B_PIN, rgbLed[2]); 

//Установить яркость синего светодиода

 

  } 
  clkAPre = clkACur; 

//Сохранить текущее значение сигнала на линии A энкодера

 


background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

13 

 

Подключите  RGB-светодиод  с  общим  катодом  и  измените  программу  так,  чтобы 

она работала правильно. 

Задания по вариантам 

Напишите программу для Arduino, где: 

1)  Светодиод  зажигается  и  гаснет,  если  держать  нажатой  кнопку  в  течение  1 

секунды. 

2)  Светодиод зажигается и гаснет двойным нажатием на кнопку. 
3)  Пока  кнопка  нажата  цвета  меняются,  а  при  отпускании  –  остаётся  последний 

цвет. 

4)  При одинарном нажатии кнопки зажигается красный светодиод, при двойном – 

зелёный, а при тройном – синий. Через 2 секунды светодиод гаснет. 

5)  Для  включения  и  выключения  светодиода  нужно  держать  кнопку  нажатой  в 

течение 1 секунды. 

6)  При  нажатии  кнопки  светодиод  плавно  зажигается.  При  повторном  нажатии 

кнопки сразу выключается. 

7)  Пока  кнопка  нажата  яркость  светодиода  плавно  нарастает,  после  отпускания 

кнопки светодиод плавно гаснет. 

8)  При  одинарном  нажатии  кнопки  светодиод  загорается  сразу,  а  при  двойном  – 

плавно. Через 5 секунд светодиод выключается. 

9)  При  одинарном  нажатии  кнопки  красный  светодиод  загорается  плавно,  при 

двойном  нажатии  –  плавно  зелёный,  а  при  тройном  нажатии  –  плавно  синий. 
Через 5 секунд светодиод гаснет. 

10)  При первом нажатии и удержании кнопки плавно возрастает яркость красного 

светодиода,  а  после  отпускания  кнопки  яркость  запоминается.  При  втором 
нажатии  кнопки  плавно  возрастает  яркость  синего  светодиода,  а  после 
отпускания  кнопки  яркость  запоминается.  При  третьем  нажатии  получается 
результирующий цвет, а при четвёртом – светодиод гаснет. 

11)  При  вращении  энкодера  по  часовой  стрелке  меняются  цвета  от  красного  до 

фиолетового, а против часовой – наоборот. 

12)  При  вращении  энкодера  светодиод  мигает  с  частотой,  пропорциональной 

скорости вращения. 

13)  При  вращении  энкодера  светодиод  светит  с  яркостью,  пропорциональной 

скорости вращения энкодера. 

14)  При низкой скорости вращения энкодера  загорается зелёный светодиод,  а при 

высокой – красный. 

15)  При  вращении  энкодера  по  часовой  стрелке  частота  мигания  светодиода 

возрастает, а при вращении против часовой стрелки – уменьшается. 

16)  При  вращении  энкодера  выбирается  яркость  красного  светодиода,  после 

нажатия  кнопки  –  синего,  ещё  после  нажатия  появляется  результирующий 
цвет. 

17)  Сейфовый замок на энкодере: светодиод зажигается, если энкодер повёрнут на 

два шага по часовой стрелке, затем на три – против, и затем на четыре опять по 
часовой  стрелке.  Через  5  секунд  светодиод  гаснет.  При  нажатии  на  кнопку 
состояние сбрасывается. 


background image

Ст. преп. каф. ИТАС Фёдоров Андрей Борисович 

 

версия документа 2018-04-21 

 

14 

 

Требования к содержанию отчета 

Отчет по лабораторной работе должен содержать следующие пункты: 
1)  Цель и задачи лабораторной работы. 
2)  Краткие теоретические сведения. 
3)  Управление RGB-светодиодом с общим катодом через дискретные порты. 
4)  Управление RGB-светодиодом с общим анодом через дискретные порты. 
5)  Управление RGB-светодиодом с общим анодом через аналоговые порты. 
6)  Задание согласно своему варианту. 
7)  Ответы на контрольные вопросы. 
8)  Вывод по лабораторной работе. 

Контрольные вопросы 

1)  Какое количество дискретных выходов доступно  у  Arduino  Uno? Перечислите 

их. 

2)  Какое  количество  аналоговых  выходов  доступно  у  Arduino  Uno?  Перечислите 

их. 

3)  Приведите классификацию цифро-аналоговых преобразователей. 
4)  Назовите основные характеристики ЦАП. 
5)  Перечислите  преимущества  и  недостатки  ЦАП  с  широтно-импульсной 

модуляцией. 

6)  Перечислите  преимущества  и  недостатки  последовательных  ЦАП  на 

переключаемых конденсаторах. 

7)  Назовите виды параллельных ЦАП. 
8)  Где используются дельта-сигма ЦАП? 

Список использованных источников 

1)  Аппаратная  платформа  Arduino  (Arduino  Uno)  [Электронный  ресурс].  URL: 

http://arduino.ru/Hardware/ArduinoBoardUno (дата обращения: 01.09.2017) 

2)  Цифро-аналоговые 

преобразователи 

[Электронный 

ресурс]. 

URL: 

http://www.limi.ru/dacs/dacsindex.htm (дата обращения: 01.09.2017) 

3)  Терминология ЦАП [Электронный ресурс]. URL: http://www.lcard.ru/lexicon/dac 

(дата обращения: 01.09.2017) 

4)  Электроника 

НТБ  -  научно-технический  журнал;  цифроаналоговые 

преобразователи 

[Электронный 

ресурс]. 

URL: 

http://www.electronics.ru/journal/article/319 (дата обращения: 01.09.2017)