В этом проекте мы создадим программируемый таймер обратного отсчета, который будем использовать для запуска ракеты. Когда отсчет достигнет о, мы пережжем плавкий предохранитель и запустим ракету.
Компоненты
- Плата Arduino
- Макетная плата
- Перемычки
- Четырехразрядный семисегментный последовательный индикатор
- Пьезоизлучатель
- 2 тактовые четырехконтактные кнопки
- Потенциометр с сопротивлением 50 кОм
- 3 светодиода (красный, зеленый, желтый)
- Лампочка от елочной гирлянды (опционально)
- 3 резистора с сопротивлением 220 Ом
Библиотеки
- SoftwareSerial
Мы будем использовать четырехразрядный семисегментный последовательный индикатор, который имеет встроенную интегральную схему для управления светодиодами и может быть подключен к Arduino всего тремя проводами. При выборе индикатора убедитесь, что он оборудован входом RX, позволяющим управлять индикатором через один провод.
Принцип работы
Вы можете использовать подобный таймер, чтобы создать некое устройство, требующее подачи питания, например сервопривод, светодиодный индикатор или будильник. Вы будете использовать потенциометр для выбора продолжительности обратного отсчета (в диапазоне от 5 до 60 секунд). Светодиодный индикатор при этом отобразит число, чтобы вы могли видеть, до какого значения настраиваете обратный отсчет. Еще будет добавлено две кнопки: готовности и запуска. После того, как вы выбрали длительность обратного отсчета, нажмите кнопку готовности, чтобы подготовить таймер. Красный светодиод оповещает о готовности к запуску. (Кнопка готовности — это специальный узел безопасности, который предотвращает случайное срабатывание ракетной установки.) После того, как вы водрузили ракету, нажмите кнопку запуска, чтобы начать обратный отсчет. Зеленый светодиод оповещает об успешной подготовке к запуску и начале обратного отсчета.
THE BUILD
1. Подключите контакт RX семисегментного последовательного индикатора к контакту 3 платы Arduino, а контакты VCC и GND — к шинам питания и заземления соответственно макетной платы, как показано на рис. 17.1.

2. Установите потенциометр на макетную плату и подключите его левую ножку к шине питания 5 В, центральную — непосредственно к контакту А0 платы Arduino, а правую — к шине заземления, как показано на рис. 17.2.

3. Подключите красный провод пьезоизлучателя к контакту 4 платы Arduino, а черный — к контакту GND, как показано на рис. 17.3.

4. Установите две кнопки на макетную плату, с контактами А и В с одной стороны от канавки, и контактами D и С с другой, следуя схеме, показанной на рис. 17.4.

5. Затем подключите кнопки, как показано на рис. 17.5. Чтобы создать кнопку готовности, подключите ножку С первой кнопки к контакту GND, а ножку D — к контакту 5 платы Arduino. Чтобы создать кнопку запуска, подключите ножку С второй кнопки к контакту GND, а ножку D — к контакту 6 платы Arduino.

6. Установите красный светодиод на макетную плату так, чтобы короткая ножка (катод) была подключена к контакту В кнопки готовности. Подключите другую ножку (анод) к резистору с сопротивлением 220 Ом. Вторую ножку резистора подключите к шине питания 5 В. Затем установите зеленый светодиод так, чтобы короткая ножка (катод) была подключена к контакту В кнопки запуска. Подключите другую ножку (анод) к резистору с сопротивлением 220 Ом. Вторую ножку резистора подключите к шине питания 5 В.

7. Подключите воспламенитель. В примере мы используем желтый светодиод в качестве индикатора воспламенителя. Установите его на макетную плату так, чтобы короткая ножка (катод) была подключена к контакту GND платы Arduino, а длинная (анод) — через резистор с сопротивлением 220 Ом к контакту 7 платы Arduino. (См. раздел «Создание рабочего предохранителя» далее в этом проекте, чтобы узнать, как сделать свой собственный плавкий предохранитель.)

Когда обратный отсчет достигнет 0, контакт 7 переводится в режим HIGH и запускает воспламенитель. Вместо того, чтобы по-настоящему пережечь предохранитель, мы зажигаем желтый светодиод, имитирующий воспламенение.
8. Убедитесь, что ваша цепь соответствует схеме, показанной на рис. 17.6, и загрузите в память Arduino код скетча, приведенный в разделе «Скетч» далее в этом проекте.

Скетч
Сначала в коде скетча определяется каждый компонент и его подключение к Arduino. Библиотека SoftwareSerial управляет четырехразрядным семисегментным последовательным светодиодным индикатором, а потенциометр изменяет время отсчета в диапазоне от 5 до 60 секунд.
Кнопка готовности работает как цифровой переключатель и функция безопасности, допускающая нажатие кнопки запуска. Если во время обратного отсчета нажать кнопку готовности, обратный отсчет прекращается и значение на индикаторе сбрасывается.
Инструкции tone в скетче заставляют пьезоизлучатель звучать во время обратного отсчета. Когда обратный отсчет достигает 0, контакт воспламенителя (в данном случае, подключенный к светодиоду) переводится в режим HIGH и включает светодиод.
#define FuseTIME 1500 // Duration of fuse current in ms #include <SoftwareSerial.h> // Call the SoftwareSerial library #define Fuse 7 // Pin connected to fuse (your LED or igniter) #define GoButt 6 // Pin connected to Launch button #define ArmButt 5 // Pin connected to Arm button #define BuzzPin 4 // Pin connected to piezo buzzer #define TXdata 3 // Pin connected to RX of display #define RXdata 2 // Not used #define SetPot 0 // Analog pin connected to potentiometer SoftwareSerial mySerialPort(RXdata, TXdata); void setup() { pinMode(TXdata, OUTPUT); pinMode(RXdata, INPUT); pinMode(Fuse, OUTPUT); pinMode(ArmButt, INPUT); // Set Arm button pin to input pinMode(GoButt, INPUT); // Set Launch button pin to input digitalWrite(Fuse, LOW); // Open igniter circuit digitalWrite(ArmButt, HIGH); // Turn on resistor digitalWrite(GoButt, HIGH); // Turn on resistor mySerialPort.begin(9600); delay(10); // Wait for serial display startup mySerialPort.print("v"); // Reset the serial display mySerialPort.print("z"); // Brightness mySerialPort.write(0x40); // 3/4 intensity mySerialPort.print("w"); // Decimal point control mySerialPort.write(0x10); // Turn on colon in serial display } int DownCntr; // Countdown (1/10 seconds) int Go = 0; // Stopped void loop() { if (!digitalRead(GoButt) || !digitalRead(ArmButt)) { Go = 0; // Abort the countdown tone(BuzzPin, 440, 1500); delay(1500); } if (Go == 0) { WaitARM(); WaitGO(); } ShowTimer(); if (DownCntr > 50) { if (DownCntr % 10 == 0)tone(BuzzPin, 1000, 50); // One beep/sec } else if (DownCntr % 2 == 0)tone(BuzzPin, 1000, 50); // Beep faster if (DownCntr == 0) { tone(BuzzPin, 440, FuseTIME); // Launch tone digitalWrite(Fuse, HIGH); // Close the fuse circuit delay(FuseTIME); digitalWrite(Fuse, LOW); // Open the fuse circuit Go = 0; } while (millis() % 100); // Wait 50 ms delay(50); DownCntr--; } void WaitGO() { ShowTimer(); while (digitalRead(GoButt)); Go = 1; delay(20); while (!digitalRead(GoButt)); // Debounce Launch button } void ReadTimer() { DownCntr = map(analogRead(SetPot), 0, 1023, 5, 60); DownCntr *= 10; } void ShowTimer() { String seconds = String (DownCntr, DEC); while (seconds.length() < 3)seconds = "0" + seconds; // Format to // 3 numbers mySerialPort.print(seconds); // Write to serial display mySerialPort.print(" "); // Last digit off } void WaitARM() { while (digitalRead(ArmButt) == 1) { ReadTimer(); delay(50); ReadTimer(); ShowTimer(); delay(150); } Go = 0; ShowTimer(); tone(BuzzPin, 2000, 150); delay(200); tone(BuzzPin, 2000, 150); delay(200); tone(BuzzPin, 2000, 150); delay(20); while (!digitalRead(ArmButt)); // Debounce Arm button }
Теги: #проект