Отчёт по практике Arduino. Отчет. Программирование микроконтроллеров в среде Arduino
Скачать 2.74 Mb.
|
2. Какой результат работы устройства будет получен, если свет от светодиода будет падать на фоторезистор? Ответ: светодиод начнет мигать. 3. Если все же фоторезистор установлен между аналоговым входом иземлей (как сказано в первом вопросе), то каким образом нужно изменитьпрограмму, чтобы устройство работало верно? Ответ: изменитьстрочку: intlightness = 1023 - analogRead(LDR_PIN); 4. Допустим, у нас есть код if (условие) {действие;}В каких случаях будет выполнено действие? Ответ: действие будет выполнено, если условие является истинным. 5. При каких значениях y выражение x+y>0 будет истинным, еслиx>0? Ответ: у> -x 6. Обязательно ли указывать, какие инструкции выполнять, если условие в операторе if ложно? Ответ: если условие всегда ложно, то достаточно написать код из ветки else. 7. Чем отличается оператор == от оператора =? Ответ: первый логическое равно, второй присвоение. 8. Если используется конструкцияif (условие) действие1;else действие2;может ли быть ситуация, когда ни одно из действий не выполнится?Почему? Ответ: нет так как логическое условие может быть истиной или ложью. Вывод: Сегодня я научилсяуправлять включением светодиода, подключенного к платеArduino, в зависимости от уровня освещенности фоторезистора и порога,заданного потенциометром Упражнение №6. Пульсар Цель: программное управление яркостью свечения светодиодной шкалы, подключенного к плате Arduino через транзистор. На рисунке 6.1 представлена схема электрическая принципиальная. Рисунок 6.1 – Схема электрическая принципиальная На рисунке 6.2 представлена схема, собранная в программной среде SimulIDE. Рисунок 6.2 – Схема, собранная в программной среде SimulIDE 1. Изменена программа так, чтобы яркость шкалы росла только до половины от максимальной. #defineCONTROL_PIN 9 int brightness = 0; voidsetup() {pinMode(CONTROL_PIN, OUTPUT);} voidloop() { brightness = (brightness + 1) % 128; analogWrite(CONTROL_PIN, brightness); delay(10);} Листинг 6.2 – Листинг программы 2. Изменена программа так, чтобы шкала становилась максимально яркой в три раза быстрее, без изменения функции delay(). #defineCONTROL_PIN 9 int brightness = 0; voidsetup() {pinMode(CONTROL_PIN, OUTPUT);} voidloop() { brightness = (brightness + 3) % 256; analogWrite(CONTROL_PIN, brightness); delay(10);} Листинг 6.3 – Листинг программы 3. Изменена программа так, чтобы такой же результат был получен без использования операции %. #defineCONTROL_PIN 9 int brightness = 0; voidsetup() {pinMode(CONTROL_PIN, OUTPUT);} voidloop() { brightness = (brightness<256) ? (brightness + 1) : 0; analogWrite(CONTROL_PIN, brightness); delay(10);} Листинг 6.4 – Листинг программы Ответы на вопросы: 1. Почему у светодиодной шкалы на 10 сегментов 20 ножек? Ответ: потому что это 10 анодов и 10 катодов 2. Зачем в схеме биполярный транзистор? Какой он проводимости? Ответ: Без транзистора такое количество светодиодов будет потреблять больше тока, чем 40 мА, которые может себе позволить цифровой порт платы, на который установлен БТ, для управления большим током с помощью малого. 3. За счет чего увеличивается яркость шкалы? Ответ: за счет использования ШИМ на 9 пине. 4. Почему после достижения значения 255 переменная brightnessобнуляется? Ответ: analogWrite принимает значение в диапазоне от 0 до 255, поэтому мы получаем остаток от деления на 256. Вывод: Я освоил программное управление яркостью свечения светодиодной шкалы, подключенного к плате Arduino через транзистор Упражнение №7. Бегущий огонек Цель: организация эффекта «бегущий огонь» на светодиодной шкале,подключенной к плате Arduino. На рисунке 7.1 представлена схема электрическая принципиальная. Рисунок 7.1 – Схема электрическая принципиальная На рисунке 7.2 представлена схема, собранная в программной среде SimulIDE. Рисунок 7.2 – Схема, собранная в программной среде SimulIDE 1. Код изменён так, чтобы светодиоды переключались раз в секунду. #defineFIRST_LED_PIN 2 #defineLAST_LED_PIN 11 voidsetup() {for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++) pinMode(pin, OUTPUT);} voidloop() { unsignedint ms = millis(); int pin = FIRST_LED_PIN + (ms / 1000) % 10; digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW);} Листинг 7.2 – Листинг программы 2. Без выключения портов сделано так, чтобы огонек бежал только по средним четырем делениям шкалы. #defineFIRST_LED_PIN 2 #defineLAST_LED_PIN 11 voidsetup(){ for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++)pinMode(pin, OUTPUT);} voidloop() { unsignedint ms = millis(); int pin = (ms / 120) % 4 + 5; digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW);} Листинг 7.3 – Листинг программы 3. Программа изменена: вместо intpin = FIRST_LED_PIN + (ms / 120) % 10 перемещением огонька управляет цикл for. #defineFIRST_LED_PIN 2 #defineLAST_LED_PIN 11 voidsetup() { for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++) pinMode(pin, OUTPUT);} voidloop() { for (int pin = 2; pin<12; pin++) { digitalWrite(pin, HIGH); delay(120); digitalWrite(pin, LOW); }} Листинг 7.4 – Листинг программы 4. Неменяяместамипровода, изменена программатак, чтобы огонек бегал в обратном направлении. #defineFIRST_LED_PIN 2 #defineLAST_LED_PIN 11 voidsetup(){ for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++) pinMode(pin, OUTPUT);} voidloop() { unsignedint ms = millis(); int pin = LAST_LED_PIN - (ms / 120) % 10; digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW);} Листинг 7.5 – Листинг программы Ответы на вопросы: 1. Почему в данном упражнении светодиодная шкала подключается безиспользования транзистора? Ответ: потому что здесь для каждого светодиода мы используем собственный пин. 2. Если бы светодиоды были бы подключены только к портам 5, 6, 7, 8и 9, что нужно было бы изменить в программе? Ответ: #defineFIRST_LED_PIN 5 #defineLAST_LED_PIN 9 3. С помощью какой другой инструкции можно выполнить действие,эквивалентное ++pin? Ответ: pin = pin + 1 4. В чем разница между переменными типов int и unsigned int? Ответ: они имеют одинаковую размерность, но разный диапазон, так как второй тип является беззнаковым. 5. Что возвращает функция millis()? Ответ: время в миллисекундах, прошедшее с момента включения микроконтроллера 6. Как в данном упражнении вычисляется номер порта, на которомнужно включить светодиод? Ответ: int pin = FIRST_LED_PIN + (ms / 120) % 10; Вывод: Произведенаорганизация эффекта «бегущий огонь» на светодиодной шкале,подключенной к плате Arduino Упражнение №8. Мерзкое пианино Цель: управление частотой пьезодинамика в зависимости от нажатойкнопки. Рисунок 8.1 – Схема электрическая принципиальная Рисунок 8.2 – Схема, собранная в программной среде SimulIDE 1. Пианино звучит в диапазоне от 2 кГц до 5 кГц. #defineBUZZER_PIN 13 #defineFIRST_KEY_PIN 7 #defineKEY_COUNT 3 voidsetup(){pinMode(BUZZER_PIN, OUTPUT);} voidloop(){for (int i = 0; i int keyPin = i + FIRST_KEY_PIN; boolean keyUp = digitalRead(keyPin); if(!keyUp) {int frequency = 2000 + i * 1500; tone(BUZZER_PIN, frequency, 20); }}} Листинг 8.2 – Листингпрограммы 2. Добавлено еще 2 кнопки и изменена программатак, чтобы можно было извлечь 5 различных нот. #defineBUZZER_PIN 13 #defineFIRST_KEY_PIN 7 #defineKEY_COUNT 5 voidsetup(){pinMode(BUZZER_PIN, OUTPUT);} voidloop(){ for (int i = 0; i int keyPin = i + FIRST_KEY_PIN; boolean keyUp = digitalRead(keyPin); if(!keyUp) { int frequency = 2000 + i * 500; tone(BUZZER_PIN, frequency, 20); }}} Листинг 8.3 – Листингпрограммы Рисунок 8.3 – Схема, собранная в программной среде SimulIDE 3. Подключены кнопки по схеме с подтягивающим к земле резистором. Рисунок 8.4 – Схема, собранная в программной среде SimulIDE #defineBUZZER_PIN 13 #defineFIRST_KEY_PIN 7 #defineKEY_COUNT5 voidsetup(){pinMode(BUZZER_PIN, OUTPUT);} voidloop() { for (int i = 0; i int keyPin = i + FIRST_KEY_PIN; boolean keyUp = digitalRead(keyPin); if (keyUp) { int frequency = 2000 + i * 500; tone(BUZZER_PIN, frequency, 20);}}} Листинг 8.3 – Листингпрограммы Ответы на вопросы: 1. Почему порты, к которым подключены кнопки, не настраивались какINPUT, но устройство работает? Ответ: потому что, они по умолчанию INPUTдля digitalRead. 2. Каким образом удалось избежать написания отдельного кода длячтения каждой кнопки? Ответ: благодаря использованию цикла, который «проходит» по всем кнопкам от FIRST_KEY_PIN до KEY_COUNT 3. Почему разные «ноты», издаваемые пьезодинамиком, звучат с разной громкостью? Ответ: у нот разные частоты, а чем выше частота, тем громче она звучит. 4. С какой целью в этом упражнении используется оператор логического отрицания !? Ответ: Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на соответствующем порте 0. Вывод: Теперь я умею реализовыватьуправление частотой пьезодинамика в зависимости от нажатойкнопки. Упражнение №9. Миксер Цель: создать модель миксера с двумя скоростями работы на основеплаты Arduino. Рисунок 9.1 – Схема электрическая принципиальная Рисунок 9.2 – Схема, собранная в программной среде TinkerCAD #defineMOTOR_PIN 9 #defineFIRST_BUTTON_PIN 5 #defineBUTTON_COUNT 3 #defineSPEED_STEP (255 / (BUTTON_COUNT - 1)) voidsetup() { pinMode(MOTOR_PIN, OUTPUT); for (int i = 0; i pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP); } voidloop() { for (int i = 0; i if (digitalRead(i + FIRST_BUTTON_PIN)) continue; int speed = i * SPEED_STEP; analogWrite(MOTOR_PIN, speed); } } Листинг 9.1 – Листингпрограммы 1. Внесено единственное изменение в программу, после которого максимальная скорость вращения мотора составит половину от возможной. #defineMOTOR_PIN 9 #defineFIRST_BUTTON_PIN 5 #defineBUTTON_COUNT 3 #defineSPEED_STEP (127 / (BUTTON_COUNT - 1)) voidsetup() { pinMode(MOTOR_PIN, OUTPUT); for (int i = 0; i pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP); } voidloop() { for (int i = 0; i < BUTTON_COUNT; ++i) { if (digitalRead(i + FIRST_BUTTON_PIN)) continue; int speed = i * SPEED_STEP; analogWrite(MOTOR_PIN, speed); } } Листинг 9.2 – Листингпрограммы 2. Переписана программа без использования инструкции continue. #defineMOTOR_PIN 9 #defineFIRST_BUTTON_PIN 5 #defineBUTTON_COUNT 3 #defineSPEED_STEP(127 / (BUTTON_COUNT - 1)) voidsetup() { pinMode(MOTOR_PIN, OUTPUT); for (int i = 0; i pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP); } voidloop() { for (int i = 0; i if(!digitalRead(i + FIRST_BUTTON_PIN)) { int speed = i * SPEED_STEP; analogWrite(MOTOR_PIN, speed); } } } Листинг 9.3 – Листингпрограммы 3. Добавлена в схему еще одну кнопка, у миксера теперь три режима. Рисунок 9.3 – Схема, собранная в программной среде TinkerCad #defineMOTOR_PIN 9 #defineFIRST_BUTTON_PIN 4 #defineBUTTON_COUNT 4 #defineSPEED_STEP (255 / (BUTTON_COUNT - 1)) voidsetup() { pinMode(MOTOR_PIN, OUTPUT); for (int i = 0; i pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP); } voidloop() { for (int i = 0; i if (digitalRead(i + FIRST_BUTTON_PIN)) continue; int speed = i * SPEED_STEP; analogWrite(MOTOR_PIN, speed); } } Листинг 9.4 – Листингпрограммы 1. Зачем в схеме использован диод? Ответ: Защитный диод в цепи транзистора нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь поинерции, не вывел транзистор из строя. 2. Почему использован полевой MOSFET-транзистор, а не биполярный? Ответ: полевые транзисторы обладают высоким входным сопротивлением по постоянному току, и даже управление на высокой частоте не приводит к значительным затратам энергии. 3. Почему между портом Arduino и затвором транзистора не установлен резистор? Ответ: потому что использован режим работы портов: INPUT_PULLUP 4. Как работает инструкция continue, использованная в цикле for? Ответ: continue – оператор безусловного перехода к следующей итерации цикла for. Вывод:Создана модель миксера с двумя скоростями работы на основеплаты Arduino. Упражнение №10. Кнопочныйпереключатель Цель: программная реализация триггера с предотвращением эффекта«дребезга контактов» кнопки, подключенной к плате Arduino. Рисунок 10.1 – Схема электрическая принципиальная Рисунок 10.2 – Схема, собранная в программной среде SimulIDE Код изменён: светодиод переключается толькопосле отпускания кнопки. #defineBUTTON_PIN 3 #defineLED_PIN 13 boolean buttonWasUp = true; boolean ledEnabled = false; voidsetup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP);} voidloop() { boolean buttonIsUp = digitalRead(BUTTON_PIN); if(!buttonWasUp&& buttonIsUp) {delay(10); buttonIsUp = digitalRead(BUTTON_PIN); if (buttonIsUp) {ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled);}} buttonWasUp = buttonIsUp;} Листинг 10.2 – Листинг программы 2. В схему добавлена еще одна кнопка, чтобы светодиод зажигается только при нажатии обеих кнопок. Рисунок 10.3 – Схема, собранная в программной среде SimulIDE #define BUTTON_PIN3 #define BUTTON_PIN25 #define LED_PIN13 boolean buttonWasUp = true; boolean button2WasUp = true; boolean ledEnabled = false; boolean button1 = false; boolean button2 = false; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(BUTTON_PIN2, INPUT_PULLUP); } void loop() { boolean buttonIsUp = digitalRead(BUTTON_PIN); boolean button2IsUp = digitalRead(BUTTON_PIN2); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(BUTTON_PIN); if (!buttonIsUp) button1 = !button1; } if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(BUTTON_PIN2); if (!button2IsUp) button2 = !button2; } if ((button1 * button2) ==1) { ledEnabled = true; digitalWrite(LED_PIN, ledEnabled); } else ledEnabled = false; digitalWrite(LED_PIN, ledEnabled); buttonWasUp = buttonIsUp; button2WasUp = button2IsUp; } Листинг 10.3 – Листингпрограммы Ответы на вопросы: |