Файл: Методические указания к выполнению лабораторных работ по дисциплине Основы электротехники в робототехнике.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.11.2023

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

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

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


  delay(2);  // задержка на 2 мс
}


// метод проверки состояния кнопки
// flagPress= true  - нажата 
//  flagPress= false - отжата
//  flagClick= true - была нажата (клик)
void Button::scanState() {


 if ( flagPress == (! digitalRead(_pin)) ) {
     // состояние сигнала осталось прежним 
     _buttonCount= 0;  // сброс счетчика состояния сигнала
  }
  else {
     // состояние сигнала изменилось
     _buttonCount++;   // +1 к счетчику состояния сигнала


     if ( _buttonCount >= _timeButton ) {
      // состояние сигнала не менялось заданное время
      // состояние сигнала стало устойчивым
      flagPress= ! flagPress; // инверсия признака состояния
      _buttonCount= 0;  // сброс счетчика состояния сигнала


      if ( flagPress == true ) flagClick= true; // признак клика на нажатие      
     }    
  }
}


// метод установки номера вывода и времени подтверждения
void Button::setPinTime(byte pin, byte timeButton)  {


  _pin= pin;
  _timeButton= timeButton;
  pinMode(_pin, INPUT_PULLUP);  // 
определяем вывод как вход
}

Конструкторы класса в программах Ардуино.
Конструкторы класса это функция, которая автоматически вызывается при создании объекта этого класса.

Конструктор является членом класса;

не имеет типа возвращаемого значения, даже void;

имеет то же имя, что и класс.
В нашем классе Button мы можем создать конструктор для того, чтобы не делать лишний вызов метода setPinTime(12, 15). А установку параметров производить при создании объекта button1.

Для этого добавим в описание класса описание конструктора.
Button(byte pin, byte timeButton);  // описание конструктора

И в конце программы напишем код конструктора очень похожий на метод  setPinTime.

// описание конструктора класса Button
Button::Button(byte pin, byte timeButton) {


  _pin= pin;
  _timeButton= timeButton;
  pinMode(_pin, INPUT_PULLUP);  // 
определяем вывод как вход
}

Теперь мы можем установить параметры pin и timeButton при создании объекта.

Button button1(BUTTON_1_PIN, 15);  // создание объекта для кнопки 1 с параметрами BUTTON_1_PIN и 15

Использовать метод setPinTime необязательно. Хотя лучше его оставить, чтобы программа могла менять параметры после создания объекта.

Полный вариант кода программы с конструктором в следующем разделе.

Проверим работу программы с двумя объектами (кнопками).

Добавим в схему еще одну кнопку и один светодиод. Подключим их к плате Ардуино по схеме.



Все это выглядит так.


Первая кнопка меняет состояние светодиода на плате Ардуино, а вторая – светодиода на макетной плате.

Создаем в программе два объекта button1 и button2 с использованием параметров конструктора.

В бесконечном цикле вызываем методы scanState для обоих объектов.

В бесконечном цикле проверяем флаги обоих объектов и управляем светодиодом.

Вот текст программы.
/*  Программа sketch_7_2 урока 7 
 *  Подключены две кнопки и светодиод
 *  Каждое нажатие кнопки 1 инвертирует состояние светодиода на плате Ардуино
 *  Каждое нажатие кнопки 2 инвертирует состояние светодиода на макетной плате */


#define LED_1_PIN 13     // номер вывода светодиода 1 равен 13
#define BUTTON_1_PIN 12  // номер вывода кнопки 1 равен 12
#define BUTTON_2_PIN 11  // номер вывода кнопки 2 равен 11
#define LED_2_PIN 10     // номер вывода светодиода 2 равен 10


// Описание класса обработки сигналов кнопок
class Button {
  public:
    Button(byte pin, byte timeButton);  // описание конструктора
    boolean flagPress;    // признак кнопка сейчас нажата
    boolean flagClick;    // признак кнопка была нажата (клик)
    void scanState();     // метод проверки состояние сигнала
void setPinTime(byte pin, byte timeButton); // метод установки номера вывода и времени (числа) подтверждения
  private:
    byte  _buttonCount;    // счетчик подтверждений стабильного состояния   
    byte _timeButton;      // время подтверждения состояния кнопки
    byte _pin;             // номер вывода
};


boolean ledState1;         // переменная состояния светодиода 1
boolean ledState2;         // переменная состояния светодиода 2


Button button1(BUTTON_1_PIN, 15);  // создание объекта для кнопки 1
Button button2(BUTTON_2_PIN, 15);  // создание объекта для кнопки 2
   
void setup() {
  pinMode(LED_1_PIN, OUTPUT);           // определяем вывод светодиода 1 как выход
  pinMode(LED_2_PIN, OUTPUT);           // определяем вывод светодиода 2 как выход
}


// бесконечный цикл с периодом 2 мс
void loop() {


  button1.scanState();  // вызов метода сканирования сигнала кнопки 1
  button2.scanState();  // вызов метода сканирования сигнала кнопки 2
  
  // блок управления светодиодом 1
  if ( button1.flagClick == true ) {
    // было нажатие кнопки
    button1.flagClick= false;         // сброс признака клика
    ledState1= ! ledState1;             // инверсия состояния светодиода 1
    digitalWrite(LED_1_PIN, ledState1);  // вывод состояния светодиода 1    
  }



  // блок управления светодиодом 2
  if ( button2.flagClick == true ) {
    // было нажатие кнопки
    button2.flagClick= false;         // сброс признака клика
    ledState2= ! ledState2;             // инверсия состояние светодиода 2
    digitalWrite(LED_2_PIN, ledState2);  // вывод состояния светодиода 2    
  }


  delay(2);  // задержка на 2 мс
}


// метод проверки состояния кнопки
// flagPress= true  - нажата 
//  flagPress= false - отжата
//  flagClick= true - была нажата (клик)
void Button::scanState() {


 if ( flagPress == (! digitalRead(_pin)) ) {
     // состояние сигнала осталось прежним 
     _buttonCount= 0;  // сброс счетчика состояния сигнала
}
  else {
     // состояние сигнала изменилось
     _buttonCount++;   // +1 к счетчику состояния сигнала


     if ( _buttonCount >= _timeButton ) {
      // состояние сигнала не менялось заданное время
      // состояние сигнала стало устойчивым
      flagPress= ! flagPress; // инверсия признака состояния
_buttonCount= 0;  // сброс счетчика состояния сигнала


 

      if ( flagPress == true ) flagClick= true; // признак клика на нажатие      
     }    
  }
}


// метод установки номера вывода и времени подтверждения
void Button::setPinTime(byte pin, byte timeButton)  {


  _pin= pin;
  _timeButton= timeButton;
  pinMode(_pin, INPUT_PULLUP);  // 
определяем вывод как вход
}


// описание конструктора класса Button
Button::Button(byte pin, byte timeButton) {


  _pin= pin;
  _timeButton= timeButton;
  pinMode(_pin, INPUT_PULLUP);  // 
определяем вывод как вход
}


3 Лабораторная работа 2


Тема: Подключение 7-сегментногоиндикатора напрямую через I2C. Подключение ЖК дисплея

Цель: Научиться подключать индикаторы разных типов и программировать вывод информации на дисплей индикатора.

Задание

1 Для каждого типа индикатора осуществить подключение к плате.

2 Запрограммировать вывод информации на дисплей.

3 Оформить отчет.

3.1 Подключение семисегментного индикатора


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



Необходимые компоненты:

• контроллер Arduino UNO R3;
• плата для прототипирования;
• одноразрядный семисегментный индикатор;
• резистор 510 Ом – 7 штук;
 • провода папа-папа.




Светодиодный семисегментный индикатор представляет собой группу светодиодов, расположенных в определенном порядке и объединенных конструктивно. Светодиодные контакты промаркированы метками от a до g (и дополнительно dp – для отображения десятичной точки), и один общий вывод, который определяет тип подключения индикатора (схема с общим анодом ОА, или общим катодом ОК). Зажигая одновременно несколько светодиодов, можно формировать на индикаторе символы цифр. Схема одноразрядного семисегментного индикатора показана на рис. 6.1.




Рис. 6.1. Схема одноразрядного семисегментного индикатора


Для подключения одноразрядного светодиодного индикатора к Arduino будем задействовать 7 цифровых выводов, каждый из контактов a–g индикатора подключается к выводу Arduino через ограничительный резистор 470 Ом. В нашем эксперименте мы используем семисегментный индикатор с общим катодом ОК, общий провод подсоединяем к земле. На рис. 6.2 показана схема подключения одноразрядного семисегментного индикатора к плате Arduino.




Рис. 6.2. Схема подключения семисегментного индикатора к Arduino


Приступим к написанию скетча. Мы будем на семисегментный индикатор в цикле выводить цифры от 0 до 9 с паузой 1 секунда. Сформируем массив значений для цифр 0–9, где старший разряд байта соответствует метке сегмента a индикатора, а младший – сегменту g.



byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};

Для преобразования значения цифры в данные для вывода значения на выводы Arduino будем использовать битовые операции языка Arduino:



bitRead(x,n); // получение значения n разряда байта x

Скетч эксперимента представлен в листинге 6.1.

// список выводов Arduino для подключения к разрядам a-g

// семисегментного индикатора
int pins[7]={2,3,4,5,6,7,8};

// значения для вывода цифр 0-9

byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11100110};

// переменная для хранения значения текущей цифры

int number=0;

void setup()

{

// Сконфигурировать контакты как выходы

for(int i=0;i<7;i++)

pinMode(pins[i],OUTPUT);

}

void loop()

{

showNumber(number);

delay(1000);

number=(number+1)%10;

}

// функция вывода цифры на семисегментный индикатор

void showNumber(int num)

{

for(int i=0;i<7;i++)

{

if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент

digitalWrite(pins[i],HIGH);

else // потушить сегмент

digitalWrite(pins[i],LOW);

}

}


Порядок подключения:

1.
Подключаем семисегментный индикатор по схеме на рис. 6.2.
2. Загружаем в плату Arduino скетч из листинга 6.1.
3. Наблюдаем вывод цифр на экран семисегментного индикатора.

Справочно: Двухзнаковый семисегментый индикатор