Программа для микроконтроллера.

Так как в статье я хочу рассказать как управлять цепями через USB с помощью готового модуля, то я не буду объяснять как работает программа микроконтроллера, снизу можете скачать исходники и посмотреть, там много комментов. Здесь я напишу просто об идентификаторах устройства.

Итак, в исходниках находится файл usbconfig.h, в нем есть строки

#define USB_CFG_VENDOR_ID 0x10, 0x00 #define USB_CFG_DEVICE_ID 0x01, 0x00   #define USB_CFG_VENDOR_NAME ‘k’,’i’,’b’,’e’,’r’,’m’,’a’,’s’,’t’,’e’,’r’,’.’,’p’,’l’,’.’,’u’,’a’ #define USB_CFG_VENDOR_NAME_LEN 17   #define USB_CFG_DEVICE_NAME ‘U’,’S’,’B’,’-‘,’C’,’o’,’n’,’t’,’r’,’o’,’l’ #define USB_CFG_DEVICE_NAME_LEN 11  

Первые две строчки – это ID устройства и ID продукта, такие есть у каждого USB устройства, только в этом файл указывается сначала младший байт, потом старший, в проге под комп – наоборот. Дальше идет имя производителя (вендора) и название устройства, также указывается длина строки в байтах. Программа ПК сначала будет искать устройств по ID и потом, среди найденных, будет искать по имени.

Прошивка устройства.

В скачанных файлах в папке MCUusb_bootloader найдите файл main.hex – это usb-bootloader, его нужно залить в МК с помощью внешнего программатора. После заливки также нужно правильно установить фьюзы, в окне программатора STK500 должно выглядеть так:

Программа для микроконтроллера. - student2.ru

Рисунок 12 прошивка устройства через универсальную плату STK500

Если вы пользуетесь другой программой, то можете просто ввести значения фьюз-битов HIGH и LOW (смотрите на скрин).

После удачной прошивки, можно попробовать прошить устройство через бутлоадер. Как он работает? При включении МК (просто при подаче питания, или после ресета) сразу запускается бутлоадер, он проверяет условие, если оно истинно, то запускается инициализация бутлоадера (комп при этом находит устройство). В качестве условия у нас будет «Логический вход 1 = 0″, то есть, чтобы запустить бутлоадер, нужно замкнуть Логический вход 1 на GND и нажать на устройстве кнопку RESET, в диспетчере устройство должно появиться новое HID устройство, так же не требующее драйверов:

Программа для микроконтроллера. - student2.ru

Рисунок 13 отображение устройства в диспетчере устройств

Такс, теперь в папке MCUUSB_Controldefault запускаем файл boot.bat, должно выскочить окошко, в котором будут бегать циферки:

Программа для микроконтроллера. - student2.ru

Рисунок 14 рабочее окно boot.bat

Если окно сразу же закрылось, тогда вы сделали что то не правильно. Если же все ок, тогда внешний программатор для этого устройства Вам уже не понадобится. Теперь можете отключить Логический вход 1 от GND. И на всякий случай, нажмите RESET. В диспетчере устройств так же должно появиться HID устройство (комп напишет что найдено новое). Убедитесь, что в диспетчере появилось именно это устройство.

Программа для микроконтроллера. - student2.ru

Рисунок 15 Окно свойств HID-совместимого устройства

Хост – это то, что будет управлять устройством, в нашем случае – компьютер. Управление устройством с ПК я опишу более подробно.

Для программистов Delphi написать прогу управления HIDом не составит проблем так как в инете куча инфы. А вот программистам C++ Builder не все так сладко, но, как оказалось, не так все и плохо))). В инете я нарыл библиотеку hidlibrary.h, вот с ее помощью мы будет работать с HID устройством.

Скачайте исходники и запустите USB Control.cbproj (C++ Builder 2010).

В файле hidlibrary.h в самом верху есть строка

const char idstring[] = “vid_0010&pid_0001”;

Да-да, это те же самые ID, которые мы указывали в usbconfig.h. Если будете менять VID and PID, то не забывайте отредактировать эту строку. Кроме данной строки в файле hidlibrary.h нам больше ничего редактировать не нужно, можете его закрыть.

Открываем main.cpp, вверху указан относительный адрес к файлу usbconfig.h», это нужно чтобы библиотека HID знала имя вендора и продукта.

#include “../MCU/USB_Control/usbdrv/usbconfig.h”

Создадим форму, на форме будет один CheckListBox для управления логическими выходами, 2 ScrollBar для управления ШИМ каналами, один ListBox для отображения логических входов, один Label для отображения состояния АЦП и один таймер. Должно получиться вот такое:

Программа для микроконтроллера. - student2.ru

Рисунок 16 рабочее окно программы для создания формы CheckListBox

Переименуйте СкрулБары в ScrollBar_PWM1 и ScrollBar_PWM2, в их свойствах установите Max=1023.

Создадим структуру

#pragma pack (push, 1) structstatus_t{ unsigned char logical_outputs; unsigned char logical_inputs; unsigned char ADC_DATA; unsigned short int PWM1; unsigned short int PWM2; } ; structstatus_t DeviceStatus; #pragmapack( pop)

#pragmapackнужна чтобы компилятор не выравнивал структуру. В logical_outputs хранятся состояние всех логических выходов, в побитном режиме, то есть, первый бит хранит состояние первого выхода, второй – второго и так до седьмого. Аналогично logical_inputs хранит состояние логических входов. В ADC_DATA хранится состояние АЦП, минимальное значение 0, максимальное – 255. В PWM1 хранится состояние первого ШИМ выхода (плавная регулировка напряжения), в PWM2 – состояние второго, минимальное значение 0, максимальное – 1023.

В программе ПК нужно считать с микроконтроллера эту структуру, ну и далее обработать принятые данные. Чтобы установить новые значения выходов, нужно сначала записать в структуру новые значения, а потом отправить измененную структуру на микроконтроллер. При установке новых значений нужно редактировать только первый, 4 и 5 элементы, редактирование остальных двух не даст никакого эффекта.

Далее создаем экземпляр класса

HIDLibrary<status_t>hid;

И добавляем функцию connect().

intconnect(void) { inti, n, res=0; string exampleDeviceName = “”;   exampleDeviceName += vendorName; exampleDeviceName += “ “; exampleDeviceName += productName;   n = hid.EnumerateHIDDevices();   for (i=0; i<n; i++) // ищем наше устройство { hid.Connect(i);   // GetConnectedDeviceName() возвращает string, // где через пробел указаныvendor и productName. // Сравниваем, если совпало – значить устройство наше if ( hid.GetConnectedDeviceName() == exampleDeviceName ) { res = 1; break; } } returnres; }

Теперь данные с HID-устройства можно запросить с помощью функции hid.ReceiveData, указав в качестве параметра указатель на структуру, только перед запросом нужно проверить, подключено ли устройство:

if ( connect() ) hid.ReceiveData(&DeviceStatus);

Аналогично можно передать данные в устройство:

if ( connect() ) hid.SendData(&DeviceStatus);

А теперь давайте допишем нашу программу (или просто скачайте исходники, там все готовое))).

Добавьте где нить в коде (лучше сразу после структуры) эти строки:

char vendorName[] = {USB_CFG_VENDOR_NAME, 0}; char productName[] = {USB_CFG_DEVICE_NAME, 0};

Так как нужно будет работать с отдельными битами, объявим несколько дефайнов:

#define sbi(reg,bit) reg |= (1<<bit) // установитьбит #define cbi(reg,bit) reg&= ~(1<<bit) // сброситьбит #define ibi(reg,bit) reg ^= (1<<bit) // инвентироватьбит #define CheckBit(reg,bit) (reg&(1<<bit)) // проверитьбит

В свойствах таймера укажите Enabled = True, Interval = 500. Щелкните по нем дважды и в обработчике напишите

if (!connect()) return; // Выходим, если устройство не подключено   hid.ReceiveData(&DeviceStatus); // Читаем данные с устройства   for (char i = 0; i< 7; i++) CheckListBox_LogOuts->Checked[i] = CheckBit(DeviceStatus.logical_outputs, i);   ScrollBar_PWM1->Position = DeviceStatus.PWM1; ScrollBar_PWM2->Position = DeviceStatus.PWM2;   ListBox_LogInputs->Clear(); for (char i = 0; i< 7; i++) ListBox_LogInputs->Items->Add(“ Лог. Вход “+IntToStr(i+1)+” = “ +BoolToStr(CheckBit(DeviceStatus.logical_inputs, i))); Label_ADC->Caption = DeviceStatus.ADC_DATA;

Думаю, тут все понятно и объяснений не требует.

Кликните дважды по CheckListBox, в обработчике напишите

for (char i = 0; i< 7; i++) { if (CheckListBox_LogOuts->Checked[i]) sbi(DeviceStatus.logical_outputs, i); else cbi(DeviceStatus.logical_outputs, i); } if ( connect() ) hid.SendData(&DeviceStatus);

Тут копируется состояние чекбоксов в элемент структуры, после чего структура отправляется в МК.

Осталось сделать управление ШИМ выходами. Кликните один раз по ScrollBar_PWM1, зажмите Shift и выбирите ScrollBar_PWM2, короче нужна выделить 2 скрулбара, слева откройте события (Events) и в OnChange укажите тот же обработчик, что и в CheckListBox, а в обработчике пред последней строкой добавьте:

DeviceStatus.PWM1 = ScrollBar_PWM1->Position; DeviceStatus.PWM2 = ScrollBar_PWM2->Position;

Все, можно компилировать!

Тест-драйв.

Итак, все готово: устройство собрано, микроконтроллер прошит, программа для компа создана, можно протестировать.

Подключите устройство к ПК, запустите программу. Слева в листбоксе отображается состояние всех логических входов, если, к примеру, Логический вход 1 не замкнут на GND, тогда будет написано «Лог. Вход 1 = -1″, если подключен, то «Лог. Вход 1 = 0″. Вот скрин:

Программа для микроконтроллера. - student2.ru

Рисунок 17 отображение логических входов при подключении устрйства к ПК

Под этим листбоксом отображается результат преобразования АЦП. Замкните вход АЦП на минус, тогда результат будет равен 0, замкните на + питания, результат будет 255. Можно подключить сюда потенциономер, или еще что. Напряжение на ножке АЦП можно вычислить по формуле:Напряжение_ИОН/255*результат_АЦП.

Теперь подключите какую то маленькую нагрузку к Логическом выходу 1 (светодиод или просто вольтметр). Поставьте галочку возле «Лог. Выход 1″ – светодиод загорится.

Подключите вольтметр к первому ШИМ каналу, покрутите ползунок – напряжение будет меняться.

Завершение.

Теперь можете сделать на основе этого модуля управление освещением или ещё какими то электроприборами. К логическим входам можно подключить кнопку дверного звонка или какой то другой ключ. К входу АЦП можете подключить аналоговый датчик влажности, термодатчик или фоторезистор (будете занать, ночь на улице или день).

3.2 Схема управления

Программа для микроконтроллера. - student2.ru

Рисунок 18 схема устройства электрической цепи на плате микроконтроллера Atmega8

ЭКОНОМИЧЕСКАЯ ЧАСТЬ

4.1 Экономическая эффективность использования разработанной информационной системы и расчет разработки ИС.

Экономическую эффективность определяют с помощью трудовых и стоимостных показателей. Основным при расчетах является метод сопоставления данных при ручной и автоматизированной обработке информации. Экономическая эффективность разработки программного продукта образуется за счет экономии времени необходимого на обработку того же объема документа вручную. Расчет состоит из этапов:

· расчет трудоемкости разработки ИС

· расчет экономии от внедрения ИС

Наши рекомендации