Автор: Пользователь скрыл имя, 19 Февраля 2013 в 02:43, курсовая работа
Значні досягнення у галузях обробки інформації, машинного зору, теорії керування та цифрової обробки сигналів як на апаратному, так і на програмному рівнях дають можливість представлення, аналізу та розуміння динамічно змінюваних дорожніх умов, а також реагування на ці умови автономних транспортних засобів. Розробка систем керування автономними транспортними засобами є актуальною задачею тому що забезпечує значно більшу безпеку та зручність ніж ручне керування..
Рисунок 2.6 – Транспортний засіб segway
Діаметр колеса був вибраний не надто великий для більшої стійкості але й не надто малий для допустимої маневреності. Потрібно враховувати що під час руху робота по лінії велику роль грає відстань між колесами. Чим більша відстань тим більший радіус повороту. Датчик відстані що закріплений на самій верхівці робота, має декоративне призначення, проте при незначних змінах може додатково використовуватись для координації руху.
Рисунок 3.1 – Алгоритм керування
Спочатку ми фіксуємо мотор, що підключений до порту А. Далі через одну секунду вмикається датчик світла. Наступний крок – цикл, умовою виходу з якого є нерівність 100<x<-100, де x – керуючий сигнал. Якщо умова не виконується програма завершує свою роботу. Якщо ж керуючий сигнал задовольняє умові, отримуємо початкове значення датчику світла. Після цього подаємо звуковий сигнал, що підтверджує початок роботи програми. Далі отримуємо поточне значення датчику і вираховуємо різницю між початковим і поточним. Задаємо коефіцієнти і формуємо керуючий сигнал. Наступне що робить програма, перевіряє результат порівняння поточного і початкового значень. Якщо вони рівні, ми переходимо на цикл, що відповідає за рух сігвея вздовж чорної лінії. Якщо початкове значення більше за поточне, подаємо керуючий сигнал на мотори С і В, інакше ми подаємо реверсний сигнал. Після чого переходимо до циклу що відповідає за рух вздовж чорної лінії. Умовою якого є реакція датчику дотику. Доки він не спрацював ми повторюємо формувати керуючий сигнал і подавати його на двигуни, інакше знову переходимо на цикл, що відповідає за рівновагу.
Програмне забезпечення LEGO® MINDSTORMS® NXT дозволяє програмувати ваших NXT роботів і завантажувати програми NXT через USB або Bluetooth з'єднання. Інтуїтивне Mac і PC сумісне програмне забезпечення ,на базі National Instruments LabVIEW, постачається з інструкціями зборки та керівництв з програмування. Тому почати програмування з MINDSTORMS NXT досить легко.
Програма RoboLab фірми LEGO Dacta A / S дозволяємо зсередини вивчити робототехніку на основі NXT навчиться конструювати розумні керовані машини.
Програма RoboLab заснована на більш потужною програмою LabView - це потужна середовище програмування, що використовується інженерами і вченими в дослідницьких інститутах і промисловості.
У 1997 році, коли NASA розсекретила свою програму SOJOURNER ROVER'S, з'ясувалося, що для забезпечення орієнтації, приземлення і функціонування космічних апаратів застосовувалася програма LabVIEW National Instruments (Техас, США).
Програму розробили три гіганти:
Tufts University College of Engineering
LEGO Group
National Instruments LabVIEW
RoboLab - це спрощена модель
для програмування ЛЕГО-комп'
Він чимось нагадує Бейсік, Фортран або Сі, але головна відмінність RoboLab в тому, що він базується на графіку замість текстових рядків. Це означає, що LabVIEW заснований на логічному узгодженні уявлень і абсолютно не залежить від писемної мови.
У RoboLab ви зможете схематично будувати схеми і проводити розрахунки, після чого тестувати їх і переносити схему в програму NXT-G.
LabVIEW (англ. Laboratory Virtual Instrumentation Engineering Workbench) - це середовище розробки і платформа для виконання програм, створених на графічній мові програмування «G» фірми National Instruments (США). Перша версія LabVIEW була випущена в 1986 році для Apple Macintosh, в даний час існують версії для UNIX, Linux, Mac OS і пр., а найбільш розвиненими і популярними є версії для Microsoft Windows.
LabVIEW використовується в системах збору й обробки даних, а також для управління технічними об'єктами і технологічними процесами. Ідеологічно LabVIEW дуже близька до SCADA-системам, але на відміну від них більшою мірою орієнтована на вирішення завдань не стільки в області АСУ ТП, скільки в області АСНІ.
На рис. 3.2 зображена програма керування яка була розроблена у середовищі LabView. Окрім якого нам довелося використати плагін LabVIEW Toolkit.
Рисунок 3.2 – Программа керування
LEGO® MINDSTORMS® NXT Software 1.0 використовує графічний мову програмування NXT-G, це мова програмування на основі National Instruments LabVIEW 7.1. На високому рівні програмування блоків в NXT-G блок-схеми побудовані з більш низького рівня блок діаграми LabVIEW.
У кінцевому рахунку, NXT-G блоки це просто особливий вид VI, розроблені для використання з MINDSTORMS.
Використання LabVIEW Toolkit для Lego Mindstorms NXT з LabVIEW дозволяє обхід високого рівня обмежень, що накладаються NXT-G. Це інструмент дозволяє створювати передові програм з використанням ВП і завантажити їх на NXT. Крім того, LabVIEW надає більш розширені можливості редагування навколишнього середовища, ніж Lego Mindstorms NXT Software 1.0.
Для завантаження нашої програми потрібно ввімкнути мікрокомп’ютер NXT і відкрити нашу програму в середовищі LabView. Підключимо NXT через USB-порт або ввімкнемо Bluetooth.
Далі потрібно відкрити NXT Terminal, що знаходиться в Tools->NXT Tools->NXT Terminal.
Рисунок 3.3 – NXT Terminal
У з’явившомуся вікні потрібно вибрати Find NXT. Для того щоб знайти і підключити ваш NXT. Потрібно враховувати що при підключенні по Bluetooth пошук може зайняти досить тривалий період часу. Після того як всі пристрої будуть знайдені, потрібно виділити необхідний і натиснути Connect.
В NXT Terminal буде відображено інформацію про підключений мікрокомп’ютер. Після чого можна запускати програму в режимі відладки, або за допомогою команди File->Target to NXT ви зможете компілювати і завантажувати програми безпосередньо на NXT.
Рисунок 3.4 – Find NXT
Під час розробки даної програми ми використали деякі не стандартні для LabView блоки з тулкіту NXT:
- Це блок двигуна. У випадаючому списку якого можна призначити дію. У даному випадку це повна зупинка. Також до цього блоку потрібно підвести порт до якого підключений двигун. На малюнку він зазначений синьою лінією.
- Це датчик світла. До нього потрібно підвести порт (клема зверху), а також можна отримати значення(нижня клема справа).
-Цей блок відображає затримку.
Інтервал якої можна задати
числовим значенням під’
-Блок звукового супроводження.
Висновки
В результаті роботи над даним проектом, ми розробили алгоритм і програму для управління нестійкою транспортною системою Segway. В процесі розробки був використаний датчик світла для стабілізації об’єкту керування. Це є досить не типово на відміну від гіроскопа, але значно дешевше та простіше. Завдяки досягненням у галузях обробки інформації, машинного зору, теорії керування та цифрової обробки сигналів як на апаратному, так і на програмному рівнях ми змогли розробити систему яка може аналізувати та реагувати на динамічні зміни дорожніх умов. Розробка систем керування автономними транспортними засобами є актуальною задачею тому що забезпечує значно більшу безпеку та зручність ніж ручне керування.
Перелік посилань
Додаток А
Лістинг вихідного коду програми
Unit1.h
//----------------------------
#ifndef Unit1H
#define Unit1H
//----------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <Dialogs.hpp>
//----------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TLabel *Label1;
TComboBox *ComboBox1;
TLabel *Label2;
TComboBox *ComboBox2;
TSpeedButton *SpeedButton1;
TButton *Button3;
TButton *ButtonTest;
TButton *ButtonStop;
TEdit *EditSpeed;
TButton *ButtonMinus;
TButton *ButtonPlus;
TButton *ButtonReset;
TComboBox *ComboBoxShip;
TCheckBox *CheckBoxRevers;
TMemo *Memo2;
void __fastcall SpeedButton1Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall ButtonMinusClick(TObject *Sender);
void __fastcall ButtonPlusClick(TObject *Sender);
void __fastcall ButtonResetClick(TObject *Sender);
void __fastcall ComboBoxShipChange(TObject *Sender);
void __fastcall ButtonTestClick(TObject *Sender);
void __fastcall ButtonStopClick(TObject *Sender);
void __fastcall CheckBoxReversClick(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//----------------------------
extern PACKAGE TForm1 *Form1;
//----------------------------
#endif
Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#define BUFSIZE 255 //ёмкость буфера
unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE]; //приёмный и передающий буферы
//----------------------------
HANDLE COMport; //дескриптор порта
//структура OVERLAPPED необходима для асинхронных операций, при этом для операции чтения и записи нужно объявить разные структуры
//эти структуры необходимо
OVERLAPPED overlapped; //будем использовать для операций чтения (см. поток ReadThread)
OVERLAPPED overlappedwr; //будем использовать для операций записи (см. поток WriteThread)
bool fl=0; //флаг, указывающий на успешность операций записи (1 - успешно, 0 - не успешно)
bool bPortOpen = false;
unsigned long counter; //счётчик принятых байтов, обнуляется при каждом открытии порта
void COMOpen(void); //открыть порт
void COMClose(void); //закрыть порт
HANDLE reader; //дескриптор потока чтения из порта
HANDLE writer; //дескриптор потока записи в порт
DWORD WINAPI ReadThread(LPVOID);
DWORD WINAPI WriteThread(LPVOID);
void ReadPrinting(void);
//----------------------------
//главная функция потока, реализует приём байтов из COM-порта
DWORD WINAPI ReadThread(LPVOID)
{
COMSTAT comstat; //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
DWORD btr, temp, mask, signal; //переменная temp используется в качестве заглушки
overlapped.hEvent = CreateEvent(NULL, true, true, NULL); //создать сигнальный объект-событие для асинхронных операций
SetCommMask(COMport, EV_RXCHAR); //установить маску на срабатывание по событию приёма байта в порт
while(1) //пока поток не будет прерван, выполняем цикл
{
WaitCommEvent(COMport, &mask, &overlapped); //ожидать события приёма байта (это и есть перекрываемая операция)
signal = WaitForSingleObject(
if(signal == WAIT_OBJECT_0) //если событие прихода байта произошло
{
if(GetOverlappedResult(
if((mask & EV_RXCHAR)!=0) //если произошло именно событие прихода байта
{
ClearCommError(COMport, &temp, &comstat); //нужно заполнить структуру COMSTAT
btr = comstat.cbInQue; //и получить из неё количество принятых байтов
if(btr)
{
ReadFile(COMport, bufrd, btr, &temp, &overlapped); //прочитать байты из порта в буфер программы
counter+=btr;
ReadPrinting();
}
}
}
}
}
void ReadPrinting()
{
memset(bufrd, 0, BUFSIZE); //очистить буфер (чтобы данные не накладывались друг на друга)
}
DWORD WINAPI WriteThread(LPVOID)
{
DWORD temp, signal; //temp - переменная-заглушка
overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL); //создать событие
while(1)
{WriteFile(COMport, bufwr, 1, &temp, &overlappedwr); //записать байты в порт (перекрываемая операция!)
signal = WaitForSingleObject(
SuspendThread(writer);
}
}
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//----------------------------
//обработчик нажатия на кнопку "Открыть порт"
void __fastcall TForm1::SpeedButton1Click(
{
if(SpeedButton1->Down)
{
COMOpen(); //если кнопка нажата - открыть порт
//показать/спрятать элементы на форме
Информация о работе Додаток призначений для передачі керуючих команд на МК