В предыдущей статье на нашем сайте мы рассмотрели основы работой с платой MSP430G2 LaunchPad от компании Texas Instruments с помощью Energia IDE и мигание одним светодиодом с ее помощью. В данной статье мы рассмотрим функции чтения и записи цифровых контактов платы MSP430G2 чтобы считывать состояние внешних устройств (например, кнопки) и управлять несколькими цифровыми выходами, к которым в нашем проекте будут подключены светодиоды.
Ранее на нашем сайте мы рассматривали мигание последовательностью светодиодов с помощью микроконтроллера PIC.
Необходимые компоненты
- Плата MSP430G2 LaunchPad (купить на AliExpress).
- Светодиод любого цвета – 8 шт. (купить на AliExpress).
- Кнопка – 2 шт.
- Резистор 1 кОм – 8 шт. (купить на AliExpress).
- Соединительные провода.
Схема проекта
В нашей предыдущей статье мы рассматривали мигание только одним светодиодом, встроенным в плату MSP430G2. В этой же статье мы рассмотрим зажигание 8 светодиодов в определенной последовательности при нажатии первой кнопки. При нажатии второй кнопки последовательность включения светодиодов будет другой.
Схема нашего проекта управления последовательностью светодиодов с помощью платы MSP430G2 представлена на следующем рисунке.
Итого в схеме мы имеем 8 светодиодов, подключенных к контактам с P1.0 до P2.1 и 2 кнопки, подключенные к контактам P2.4 и P2.3.
Катоды светодиодов подключены к общему проводу схемы (земле), а аноды через токоограничивающие резисторы – к контактам ввода/вывода (I/O pins) платы. К слову сказать, токоограничивающие резисторы не являются обязательными для подключения светодиодов к микроконтроллеру MSP430 потому что максимальный ток для его контактов составляет всего 6mA, а напряжение – 3.6V. Тем не менее, использование токоограничивающих резисторов является хорошей практикой даже в этом случае.
У кнопок один провод подключен к общему проводу (земле), а другой – к контактам P2.3 и P2.4 соответственно. Это значит, что при нажатии кнопок на эти контакты будет подаваться земля.
Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Сначала в функции void setup() мы зададим режимы работы контактов, к которым подключены светодиоды, на вывод данных. Для контактов, к которым подключены кнопки, мы зададим режим работы на ввод данных с использованием внутренних подтягивающих резисторов. Светодиоды подключены к контактам с P1.0 до P2.1, что соответствует их номерам на плате с 2 по 9. Кнопки подключены к контактам P2.3 и P2.4 – на плате они имеют номера 11 и 12 соответственно.
1 2 3 4 5 6 7 8 9 10 |
void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } for (int i = 2; i <= 9; i++) { digitalWrite(i, LOW); } pinMode (11, INPUT_PULLUP); pinMode (12, INPUT_PULLUP); } |
В функции void loop() мы будем проверять нажаты кнопки или нет, а если нажата какая либо из кнопок, мы должны начать последовательно зажигать светодиоды. Для проверки того, нажата ли кнопка, будет использоваться команда:
1 |
if (digitalRead(12) == LOW) |
Функция digitalRead() будет считывать состояние указанного контакта и возвращать HIGH (1) если на нем напряжение определенного уровня и LOW (0) если контакт замкнут на землю. В нашем случае на контакте будет уровень LOW только при нажатии кнопки, все остальное время на нем будет уровень HIGH за счет использования подтягивающего резистора.
Если кнопка нажата мы будем попадать в бесконечный цикл while, в нем мы последовательно будем мигать светодиодами. Цикл будет исполняться бесконечно до тех пор пока внутри него не исполнится инструкция break.
1 2 |
while(1){ } |
Внутри этого бесконечного цикла мы будем проверять состояние второй кнопки, подключенной к контакту 11.
При нажатии одной кнопки мы будем мигать светодиодами в одной последовательности, а при нажатии другой кнопки – в другой.
1 2 3 4 5 6 7 8 9 10 |
if (digitalRead(11) == LOW) { for (int i = 2; i <= 9; i++) { digitalWrite(i, HIGH); delay(100); } for (int i = 2; i <= 9; i++) digitalWrite(i, LOW); } |
Для мигания светодиодами в другой последовательности мы также будем использовать цикл loop, но в данном случае мы будем использовать небольшую задержку в 100 миллисекунд с помощью функции delay(100) чтобы заметить что светодиод зажегся. Чтобы у нас горел только один светодиод мы будем использовать еще один цикл для того чтобы выключить все светодиоды. Затем мы будем включать другой светодиод, а все другие выключать. И так будет продолжаться в цикле бесконечно пока не будет нажата другая кнопка.
При нажатии другой кнопки мы будем изменять алгоритм включения светодиодов.
1 2 3 4 5 6 7 8 9 10 |
else { for (int i = 9; i >= 2; i--) { digitalWrite(i, HIGH); delay(100); } for (int i = 2; i <= 9; i++) digitalWrite(i, LOW); } |
Как видите, в прошлом цикле мы изменяли номер светодиода со 2 по 9, а в этом – в обратной последовательности, с 9 по 2.
Сборка конструкции проекта
Схема проекта достаточно проста и ее можно собрать на макетной плате. Но мы для большей устойчивости использовали перфорированную плату, на которую припаяли компоненты нашей схемы. Внешний вид получившейся у нас перфорированной платы показан на следующем рисунке.
Выходные контакты светодиодов и кнопок подключены к коннекторам, поэтому, используя соединительные провода мама-мама, их можно легко подключить к плате MSP430 LaunchPad. Внешний вид получившейся у нас конструкции проекта показан на следующем рисунке.
Тестирование работы проекта
После того как сборка аппаратной части проекта будет закончена, подключите плату MSP430 к вашему компьютеру, откройте Energia IDE и скопируйте в нее код программы нашего проекта (приведен в конце статьи). Убедитесь, что в настройках Energia IDE вы правильно выбрали тип платы и COM порт, к которому она подключена, затем нажмите на кнопку Upload. После этого программа должна успешно скомпилироваться и загрузиться в плату, а внизу окна Energia IDE должно появиться сообщение “Done Uploading” (загрузка завершена).
Теперь, если вы нажмете на кнопку 1, то светодиоды должны начать зажигаться в последовательности, показанной на следующем рисунке.
Для смены алгоритма включения светодиодов нажмите другую кнопку. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/* TUTORIAL 2 - Learning to use I/O This program will control 8 LEDs based ont he input from two push button LED should be connected form P1.0 to P2.1 (pin 2 to 7) Switch is connected to P2.3 and P2.4 (pin 8 and 9) More info: www.circuitdigest.com */ void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } for (int i = 2; i <= 9; i++) { digitalWrite(i, LOW); } pinMode (11, INPUT_PULLUP); pinMode (12, INPUT_PULLUP); } // the loop routine runs over and over again forever: void loop() { if (digitalRead(12) == LOW) { while (1) { if (digitalRead(11) == LOW) { for (int i = 2; i <= 9; i++) { digitalWrite(i, HIGH); delay(100); } for (int i = 2; i <= 9; i++) digitalWrite(i, LOW); } else { for (int i = 9; i >= 2; i--) { digitalWrite(i, HIGH); delay(100); } for (int i = 2; i <= 9; i++) digitalWrite(i, LOW); } } } } |