|
Пояснительная записка. Дипломная работа разработка аппаратнопрограммного комплекса для изучения распределенных систем передачи данных и управления
В разрабатываемом устройстве есть два элемента, предъявляющих требования к схемам питания - микроконтроллер и МикроРС. Наш аппаратно-программный комплекс для изучения распределенных систем передачи данных и управления имеет несколько способов питания:
1) Через блок питания на 5V, поставляемый в комплекте с МикроРС;
2) Через USB-кабель от компьютера.
В свою очередь, набор разработчика на базе комплекта MSP430G2xx (Launchpad) можно запитать от батарейки на 9V, это очень удобная возможность использовать его там, где нет доступа к персональному компьютеру (для этого дополнительно потребуется стабилизатор напряжения, его можно собрать самому или купить).
Также питание потребуется для выходных реле, к которым в свою очередь можно подключить сторонние устройства. Кроме того, при работе от источника питания требуется обеспечить малое энергопотребление.
3.5. Средства разработки и отладки в процессе разработки В процессе разработки программного обеспечения было решено использовать отладочный комплект для разработчика MK MSP EXP430G2xx (LaunchPad) для отладки программы микроконтроллера.
3.5.1. Отладочная плата Launchpad MSP430G2xx Плата LaunchPad MSP430G2xx предназначена для использования при разработке устройств на базе микроконтроллеров. При этом микроконтроллер находится на отдельной плате, которая вставляется в слот на основной плате, в результате чего возможно использование различных типов микроконтроллеров. Плата кроме микроконтроллера также имеет все необходимые цепи для его работы и вшитый эмулятор/программатор.
Ко всем микроконтроллерам прилагается программатор, разработанный фирмой Texas Instruments, подключаемый по USB. На компьютере должна быть установлена специальная программа и драйвер.
К каждому выводу микроконтроллера подключается кнопка для подачи на него логического нуля или единицы, и могут быть подключены светодиоды, показывающие состояние вывода и подтягивающие резисторы. Каждый порт выведен на отдельный разъём, который позволяет подключать к нему любые внешние схемы.
Также в составе отладочной платы имеется большое количество различной периферии:
• 2 микроконтроллера в комплекте:
- MSP430G2553IN20 – 16kB Flash, 512B SRAM, 10 GPIO, 1x 16-разрядный таймер, WDT, BOR, Comparator A+;
- MSP430G2452IN20 – 8kB Flash, 256B SRAM, 10 GPIO, 1x 16-разрядный таймер, WDT, BOR, 1x USI (I2C/SPI) 8-канальный 10-разрядный АЦП;
• интегрированный на плату эмулятор/программатор;
• пользовательская кнопка;
• кнопка сброса;
• пользовательские светодиоды.
В процессе разработки плата использовалась совместно с МикроРС, работающем на ОС Android. Использование данных отладочных плат при разработке позволило отказаться от изготовления прототипов устройства до момента окончательной разработки программы и большей части схемы. Кроме того наличие встроенного отладчика/программатора у микроконтроллера сильно облегчило отладку программы. Для связи контроллера с МикроРС (одноплатным компьютером) используется стандартный порт-USB, также для связи может использоваться кабель (конвертер cp2101, cp2102) USB-UART.
3.5.3. Разработка ПО для контроллера В качестве IDE, для разработки прошивок для своих контроллеров, TI предлагает Code Composer Studio (основана на Eclipse) и IAR Embedded Workbench KickStart (имеются бесплатные версии для загрузки).
Но, как и Maple, для большего удобства поклонников Arduino, TI сделал форк (использование кодовой базы программного проекта в качестве старта для другого). Arduino IDE 1.0 специально для MSP430 и назвала его IDE Energia LaunchPad. Собственно в нем и была написана программа (прошивка, или правильнее ее назвать sketch) под нашу плату. Программа написана на языке C++.
Sketch:
byte inByte = 0; //Байт данных для UART int status[12]; // Для статуса пинов
void setup() { Serial.begin(9600); // конфигурируем UART, устанавливаем скорость обмена 9600бит/сек pinMode(GREEN_LED, OUTPUT); // конфигурируем зеленый диод на получение выходного значения pinMode(RED_LED, OUTPUT); // конфигурируем красный диод на получение выходного значения pinMode(6, OUTPUT); // конфигурируем 6 пин на получение выходного значения pinMode(7, OUTPUT); // конфигурируем 7 пин на получение выходного значения pinMode(8, OUTPUT); // конфигурируем 8 пин на получение выходного значения pinMode(9, OUTPUT); // конфигурируем 9 пин на получение выходного значения pinMode(10, OUTPUT); // конфигурируем 10 пин на получение выходного значения pinMode(11, OUTPUT); // конфигурируем 11 пин на получение выходного значения pinMode(12, OUTPUT); // конфигурируем 12 пин на получение выходного значения pinMode(13, OUTPUT); // конфигурируем 13 пин на получение выходного значения pinMode(15, OUTPUT); // конфигурируем 15 пин на получение выходного значения digitalWrite(GREEN_LED, LOW); // команда - выключение зеленого диода digitalWrite(RED_LED, LOW); // команда - выключение красного диода digitalWrite(6, LOW); // команда - выключение 6 пина digitalWrite(7, LOW); // команда - выключение 7 пина digitalWrite(8, LOW); // команда - выключение 8 пина digitalWrite(9, LOW); // команда - выключение 9 пина digitalWrite(10, LOW); // команда - выключение 10 пина digitalWrite(11, LOW); // команда - выключение 11 пина digitalWrite(12, LOW); // команда - выключение 12 пина digitalWrite(13, LOW); // команда - выключение 13 пина digitalWrite(15, LOW); // команда - выключение 15 пина status[1] = 0; // статус - выключен status[2] = 0; // статус - выключен status[3] = 0; // статус - выключен status[4] = 0; // статус - выключен status[5] = 0; // статус - выключен status[6] = 0; // статус - выключен status[7] = 0; // статус - выключен status[8] = 0; // статус - выключен status[9] = 0; // статус - выключен status[10] = 0; // статус - выключен status[11] = 0; // статус - выключен }
void loop() { if (Serial.available() > 0) { // Если в буфере есть данные, то здесь должен быть прием и обработка данных inByte = Serial.read(); // читаем байт switch (inByte){ // и выполняем действие в зависимости от того, какой байт пришел case 's': // если пришел байт “s”, то показываем статистику какой из портов включен, а какой выключен Serial.print("RED_LED:"); // выводим красный светодиод Serial.println(status[10]); // выдает значение 10, делает перенос строки Serial.print("GREEN_LED:"); // выводим зеленый светодиод Serial.println(status[11]); // выдает значение 11, делает перенос строки Serial.print("PIN_1:"); // выводим 1 пин Serial.println(status[1]); // выдает значение 1, делает перенос строки Serial.print("PIN_2:"); // выводим 2 пин Serial.println(status[2]); // выдает значение 2, делает перенос строки Serial.print("PIN_3:"); // выводим 3 пин Serial.println(status[3]); // выдает значение 3, делает перенос строки Serial.print("PIN_4:"); // выводим 4 пин Serial.println(status[4]); // выдает значение 4, делает перенос строки Serial.print("PIN_5:"); // выводим 5 пин Serial.println(status[5]); // выдает значение 5, делает перенос строки Serial.print("PIN_6:"); // выводим 6 пин Serial.println(status[6]); // выдает значение 6, делает перенос строки Serial.print("PIN_7:"); // выводим 7 пин Serial.println(status[7]); // выдает значение 7, делает перенос строки Serial.print("PIN_8:"); // выводим 8 пин Serial.println(status[8]); // выдает значение 8, делает перенос строки Serial.print("PIN_9:"); // выводит 9 пин Serial.println(status[9]); // выдает значение 9, делает перенос строки Serial.println(); // выдает пробел break;
case 'n': // если пришел байт “n”, то все пины на плате включаются digitalWrite(GREEN_LED, HIGH); // включение зеленого диода digitalWrite(RED_LED, HIGH); // включение красного диода digitalWrite(6, HIGH); // включение 6 пина digitalWrite(7, HIGH); // включение 7 пина digitalWrite(8, HIGH); // включение 8 пина digitalWrite(9, HIGH); // включение 9 пина digitalWrite(10, HIGH); // включение 10 пина digitalWrite(11, HIGH); // включение 11 пина digitalWrite(12, HIGH); // включение 12 пина digitalWrite(13, HIGH); // включение 13 пина digitalWrite(15, HIGH); // включение 15 пина status[1] = 1; // статус - включен status[2] = 1; // статус - включен status[3] = 1; // статус - включен status[4] = 1; // статус - включен status[5] = 1; // статус - включен status[6] = 1; // статус - включен status[7] = 1; // статус - включен status[8] = 1; // статус - включен status[9] = 1; // статус - включен status[10] = 1; // статус - включен status[11] = 1; // статус - включен break;
case 'f': // если пришел байт “f”, то все пины на плате выключаются digitalWrite(GREEN_LED, LOW); // выключение зеленого диода digitalWrite(RED_LED, LOW); // выключение красного диода digitalWrite(6, LOW); // выключение 6 пина digitalWrite(7, LOW); // выключение 7 пина digitalWrite(8, LOW); // выключение 8 пина digitalWrite(9, LOW); // выключение 9 пина digitalWrite(10, LOW); // выключение 10 пина digitalWrite(11, LOW); // выключение 11 пина digitalWrite(12, LOW); // выключение 12 пина digitalWrite(13, LOW); // выключение 13 пина digitalWrite(15, LOW); // выключение 15 пина status[1] = 0; // статус - выключен status[2] = 0; // статус - выключен status[3] = 0; // статус - выключен status[4] = 0; // статус - выключен status[5] = 0; // статус - выключен status[6] = 0; // статус - выключен status[7] = 0; // статус - выключен status[8] = 0; // статус - выключен status[9] = 0; // статус - выключен status[10] = 0; // статус - выключен status[11] = 0; // статус - выключен break;
case 'r': // если приходит байт “r” - красный светодиод, if (status[10] == 0) { // то проверяем статус, и в зависимости от него, digitalWrite(RED_LED, HIGH); // либо включаем диод status[10] = 1; } // статус - включен else { digitalWrite(RED_LED, LOW); // либо выключаем диод status[10] = 0; } // статус - выключен break; // также и с зеленыйм светодиодом case 'g': // если приходит байт “g” - зеленый светодиод, if (status[11] == 0) { // то проверяем статус, и в зависимости от него, digitalWrite(GREEN_LED, HIGH); // включаем диод status[11] = 1; } // статус - включен else { digitalWrite(GREEN_LED, LOW); // выключаем диод status[11] = 0; } // статус - выключен break;
case '1': // если приходит байт “1” - 6 пин, if (status[1] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(6, HIGH); // подаем значение 1 на 6 пин status[1] = 1; } // 1 есть на 6 пине else { digitalWrite(6, LOW); // подаем значение 0 на 6 пин status[1] = 0; } // 0 на 6 пине break;
case '2': // если приходит байт “2” - 7 пин if (status[2] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(7, HIGH); // подаем значение 1 на 7 пин status[2] = 1; } // 1 есть на 7 пине else { digitalWrite(7, LOW); // подаем значение 0 на 7 пин status[2] = 0; } // 0 на 7 пине
break; case '3': // если приходит байт “3” - 8 пин if (status[3] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(8, HIGH); // подаем значение 1 на 8 пин status[3] = 1; } // 1 есть на 8 пине else { digitalWrite(8, LOW); // подаем значение 0 на 8 пин status[3] = 0; } // 0 на 8 пине break;
break; case '4': // если приходит байт “4” - 9 пин if (status[4] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(9, HIGH); // подаем значение 1 на 9 пин status[4] = 1; } // 1 есть на 9 пине else { digitalWrite(9, LOW); // подаем значение 0 на 9 пин status[4] = 0; } // 0 на 9 пине break;
break; case '5': // если приходит байт “5” - 10 пин if (status[5] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(10, HIGH); // подаем значение 1 на пин 1.0 status[5] = 1; } // 1 есть на пине 1.0 else { digitalWrite(10, LOW); // подаем значение 0 на пин 1.0 status[5] = 0; } // 0 на пине 1.0 break;
break; case '6': // если приходит байт “6” - пин 1.1 if (status[6] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(11, HIGH); // подаем значение 1 на пин 1.1 status[6] = 1; } // 1 есть на пине 1.1 else { digitalWrite(11, LOW); // подаем значение 0 на пин 1.1 status[6] = 0; } 0 на пине 1.1 break;
break; case '7': // если приходит байт “7” - пин 1.2 if (status[7] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(12, HIGH); // подаем значение 1 на пин 1.2 status[7] = 1; } 1 есть на пине 1.2 else { digitalWrite(12, LOW); // подаем значение 0 на пин 1.2 status[7] = 0; } 0 на пине 1.2 break;
break; case '8': // если приходит байт “8” - пин 1.3 if (status[8] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(13, HIGH); // подаем значение 1 на пин 1.3 status[8] = 1; } 1 есть на пине 1.3 else { digitalWrite(13, LOW); // подаем значение 0 на пин 1.3 status[8] = 0; } 0 на пине 1.3 break;
break; case '9': // если приходит байт “9” - пин 1.5 if (status[9] == 0) { // то проверяем статус, и в зависимости от него digitalWrite(15, HIGH); // подаем значение 1 на пине 1.5 status[9] = 1; } 1 есть на пине 1.5 else { digitalWrite(15, LOW); // подаем значение 0 на пин 1.5 status[9] = 0; } 0 на пине 1.5 break; } } }
|
Также этот код совместим с микроконтроллером Arduino и будет работать точно также как и на msp430G2xx (LaunchPad). Разница лишь в том, что нужно будет переименовать названия выходов и поменять выходные значения.
Еще, в ходе работы был написан простенький интерфейс в виде HTML-странички с кнопками управления. Для этого нужно зайти на наш МикроРС, создать на нем каталог, в который мы положим конфигурацию веб-сервера, скрипт и нашу страничку с кнопками:
http.cfg (файл конфигурации): 1. *.html:/system/bin/sh - которая означает, что все html-файлы надо выполнять интерпретатором sh, а не просто отдавать пользователю.
|
sh-скрипт (назовем его starthttpd): 1. insmod /sdcard/www/cp210x.ko >/dev/null 2>&1 — строчка, которая загружает в ядро драйвер конвертера(чтоб не делать это каждый раз вручную), и не ругается, если он там есть.
2. httpd -p12 -h /sdcard/www -c /sdcard/www/http.cfg — запускает сервер на порту 12(кто то занял 80), с корневой папкой /sdcard/www, и конфигурацией, которую мы сделали ранее.
3. stty -F /dev/ttyUSB0 9600 #конфигурируем порт, устанавливаем скорость обмена 4. /system/bin/echo $QUERY_STRING >/dev/ttyUSB0 #отправляем в порт символы, которые мы получили GET-ом.
|
-h /sdcard/www — корневая директория
|
|
|