Система дистанційного управління електричним засобом транспортування на базі ОС Android

 

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Чорноморський державний університет імені Петра Могили

Факультет компютерних наук

Кафедра інформаційних технологій та програмних систем











Дипломна робота

на тему: «Система дистанційного управління електричним засобом

транспортування на базі ОС Android»




Виконав:

Новосельцев Д.С.







м. Миколаїв - 2014 рік

Анотація


до бакалаврської роботи «Система дистанційного управління електричним засобом транспортування на базі ОС Android» Бакалавр: Новосельцев Дмитро Сергійович Керівник: в. о. доцент, Ромакін Володимир Вікторович

Бакалаврська робота присвячена дослідженню та розробці програмно апаратного комплексу для вирішення задачі дистанційного управління електричними транспортними засобами, використовуючи пристрій керування на базі ОС Android.

Обєкт дослідження - електричний транспорт з дистанційним управлянням.

Мета роботи - створення системи дистанційного управляння транспортними засобами для подальшого їх використання в різних сферах життя людини.

Практичне значення дипломної роботи полягає у розробці універсального пристрою дистанційного керування електричними транспортними засобами.

Дипломна робота складається з основної частини і спеціальної частини з охорони праці та безпеки в надзвичайних ситуаціях.

Пояснювальна записка до бакалаврської роботи складається зі вступу, трьох розділів, висновків.

У вступі визначається актуальність теми та проводиться короткий огляд поставленої задачі.

У першому розділі розглядаються існуючі аналоги дистанційно керованих електричних транспортних засобів. Також розглянуто галузі використання дистанційного керованих машин. Розглянуто різні види ОС під якими працюють системи дистанційного управління. Проаналізовані використовуванні канали звязку для передачі даних від пульта керування до керуючою машиною. Проаналізовано їх недоліки саме в системі управлянні.

У другому розділі проводиться розробка як апаратної частини транспортного засобу так програмної частини (системи дистанційного управляння).

У третьому розділі йдеться про забезпечення вимог охорони праці при ремонті та експлуатації електротранспортних засобів.

У висновках проводиться аналіз проведеної роботи та отриманих результатів.

Бакалаврська робота містить сторінок (без додатків), 33 рисунків, 6 таблиці, 65 джерел, 2 додатка.


Зміст


Перелік скорочення

Вступ

1. Аналітична частина

1.1 Загальна проблема, що розглядається

1.2 Галузі застосування електричних транспортних засобів з дистанційним управлінням

1.2.1 Військове озброєння

1.2.2 Ліквідація аварій

1.2.3 Засоби пересування для інших планет

1.2.4 Демонтажні роботи

1.2.5 Тягачі та електрокари

1.3 Дистанційне керування

1.4 Канали звязку

1.4.1 Оптоволоконний кабель

1.4.2 Bluetooth

1.4.3 Wi-Fi

1.4.4 GSM

1.5 Операційні системи

1.5.1 Ballista OC

1.5.2 Android

1.5.3 Windows

1.5.4 IOS

2. Креативна частина

2.1 Постановка задачі дипломного проекту

2.2 Загальна схема підключення електричних компонентів

2.3 Принцип роботи

2.4 Апаратна частина

2.4.1 Arduino Nano

2.4.2 Драйвер L298N

2.4.3 Bluetooth-модуль HC-06

2.4.4 Ультразвуковий датчик вимірювання відстані HC-SR04

2.5 Розроблене ПЗ

2.5.1 Реалізація програмного коду для Arduino Nano

2.5.2 Створення Android-додатку

2.6 Демонстрація

3. Охорона праці

3.1 Сучасний розвиток електротранспорту та галузі використання

3.2 Автоматизація процесів і дистанційне управління як засіб підвищення безпеки праці

3.3 Забезпечення вимог охорони праці при експлуатації та ремонті електричних транспортних засобів

Висновки

Перелік посилань

Додаток А. Код програми для Arduino Nano

Додаток Б. Код програми для Android-додатку


Перелік скорочення


EEPROM-Electrically Erasable Programmable Read-Only Memory (укр. постійний запам'ятовувальний пристрій)General Packet Radio Service (укр. загальний сервіс пакетної радіопередачі)Global System for Mobile Communications (укр. глобальний стандарт цифрового мобільного зв'язку)LIght Detection and Ranging (укр. світлове визначення дальності)Open Systems Interconnection Basic Reference Model (укр. базова еталонна модель взаємодії відкритих систем)

АЕС-атомна електростанція

БА-безпілотні апарати

БПЛА-безпілотними літальними апаратами

ВОЛЗ-волоконно-оптичні лінії зв'язку

ГЕС-гідроелектростанція

ДВЗ-двигун внутрішнього згорання

ДКМ-дистанційно керована машина

ДУ-дистанційне управління

ЕОМ-електронно обчислювальна машина

ОС-операційна система

ПЗ-програмне забезпечення

ТО-технічне обслуговування

ШІМ-широтно-імпульсна модуляція

електричний транспортний управління програмний

Вступ


У всі часи і у всіх народів транспорт відігравав важливу роль. На сучасному етапі значення його незмірно зросла. Сьогодні існування будь-якої держави немислимо без потужного транспорту.

У ХХ ст. і особливо в другій його половині відбулися гігантські перетворення у всіх частинах світу і областях людської діяльності. Зростання населення, збільшення споживання матеріальних ресурсів, урбанізація, науково-технічна революція, а також природно-географічні, економічні, політичні, соціальні та інші фундаментальні чинники призвели до того, що транспорт світу отримав небачене розвиток як в масштабному (кількісному), так і в якісному відносинах. Поряд із зростанням протяжності мережі шляхів сполучення традиційні види транспорту зазнали корінний реконструкції: значно збільшився парк рухомого складу, у багато разів піднялася його провізна здатність, підвищилася швидкість руху. У той же час на перший план вийшли транспортні проблеми. Ці проблеми по перевазі відносяться до міст і обумовлені надмірним розвиток автомобілебудування. Гіпертрофований автомобільний парк великих міст Європи, Азії та Америки викликає постійні пробки на вулицях і позбавляє себе переваг швидкого і маневреного транспорту. Він же серйозно погіршує екологічну обстановку.

Електромобіль - транспортний засіб, провідні колеса якого наводяться від електромотора, що живиться від акумуляторних батарей. Вперше з'явився він в Англії і у Франції на початку 80-х років ХIХ ст., тобто раніше автомобілів з двигунами внутрішнього згоряння. Тяговий електродвигун в таких машинах отримував живлення від батарей свинцевих акумуляторів. Загалом, щоб живити двигун потужністю в 20 кВт протягом години, був потрібний свинцевий акумулятор масою в 1 тонну. Тому з винаходом ДВЗ автомобілів стало стрімко набирати обертів, а про електромобілі забули до виникнення серйозних екологічних проблем. По-перше, розвиток парникового ефекту з подальшим незворотнім зміною клімату і, по-друге, зниження імунітету багатьох людей внаслідок порушення основ генетичної спадковості.

Вчені, провівши ряд досліджень, намітили декілька напрямків вирішення перерахованих завдань, однією з яких є виробництво електромобілів. Це, по суті, перша технологія, офіційно отримала статус нульового викиду і вона вже представлена на ринку.

Чим привабливий електромобіль, напевно, представляє кожен. У першу чергу, він майже не дає викиду шкідливих речовин. Отруйних газів, що потрапляють в атмосферу при зарядці і розрядці акумуляторних батарей, незрівнянно менше, ніж при роботі ДВЗ. Щоб опалювати електромобілі взимку, на них встановлюють автономні обігрівачі, споживають бензин чи дизельне паливо. Але вони, зрозуміло, не забруднюють атмосферу так сильно, як ДВЗ.

Друга перевага - простота пристрою. Електродвигун має дуже привабливою для транспортних засобів характеристикою: на малих швидкостях обертання у нього великий крутячий момент, що дуже важливо, коли потрібно рушити з місця або подолати важку ділянку дороги. ДВЗ ж розвиває максимальний обертовий момент при середніх оборотах, тому, якщо потрібне велике зусилля на малих, його доводиться збільшувати за допомогою коробки передач. Тролейбуси, наприклад, в такому агрегаті не потребують. Не потрібно він і електромобілю, тому управляти їм простіше, ніж автомобілем з механічною коробкою передач.

Третя перевага випливає з другого. Електромобіль не вимагає настільки ретельного догляду, як звичайне авто: менше регулювань, не споживає багато мастил, простіше система охолодження, а паливна (якщо не вважати обігрівач) взагалі відсутня.

І все ж електромобіль влаштований не так просто, як може здатися: йому необхідні складні перетворювачі напруги і багато важких і громіздких акумуляторів, які важко розмістити. Головний же недолік, який стримує впровадження електромобілів - мала енергоємність батарей.

Порівняння з автомобілів з електродвигуном і ДВЗ. До преваг транспорту с електродвигуном можна віднести:

?відсутність шкідливих вихлопів в місці знаходження автомобіля. Більш висока екологічність через відсутність необхідності застосування нафтового палива, антифриз, моторних мастил, а також фільтрів для цих рідин;

?простота техобслуговування, великий міжсервісний пробіг, дешевизна ТО.

?низька пожежо-і вибухонебезпечність при аварії;

?простота конструкції (простота електродвигуна і трансмісії; відсутність необхідності в перемиканні передач зважаючи на високу пристосовності крутного моменту до змін зовнішнього навантаження, низькою стійкої частоти обертання вала електродвигуна, можливості його реверсування) і управління, висока надійність і довговічність екіпажної частини (до 25 років) порівняно із звичайним автомобілем;

?ДВЗ є джерелом виникнення динамічних навантажень і крутильних коливань у трансмісії автомобіля і джерелом вібрацій, що передаються несучої конструкції автомобіля;

?можливість підзарядки від побутової електричної мережі (розетки), але такий спосіб в 10 разів довше, ніж від спеціального високовольтного зарядного пристрою;

?автомобіль з електроприводом - єдиний варіант застосування на легковому автотранспорті дешевої (порівняно з нафтовим або водневим паливом) енергії, що виробляється АЕС, ГЕС;

?масове застосування електромобілів змогло б допомогти у вирішенні проблеми «енергетичного піку» за рахунок підзарядки акумуляторів в нічний час;

?менший шум за рахунок меншої кількості рухомих частин і механічних передач;

?висока плавність ходу з широким інтервалом зміни частоти обертання вала двигуна;

?можливість підзарядки акумуляторів під час рекуперативного гальмування;

?можливість гальмування самим електродвигуном (режим електромагнітного гальма) без використання механічних гальм - відсутність тертя і, відповідно, зносу гальм. Проста можливість реалізації повного приводу і гальмування шляхом застосування схеми «мотор-колесо», що дозволяє, крім іншого, легко реалізувати систему повороту всіх чотирьох коліс, аж до положення, перпендикулярного кузову електромобіля.

До недоліків електродвигуна в порівняні з ДВЗ можна віднести:

?акумулятори за півтора століття еволюції так і не досягли щільності енергії та вартості, порівнянної з пальним паливом, однак і цього вже достатньо, щоб майже на рівних конкурувати з автомобілями на бензині;

?проблемою є виробництво та утилізація акумуляторів, які часто містять отруйні компоненти (наприклад, свинець або літій) і кислоти;

?частина енергії акумуляторів витрачається на охолодження або обігрів салону автомобіля, а також харчування інших бортових енергоспоживачів (наприклад, світло або повітряний компресор);

?для масового застосування електромобілів потрібне створення відповідної інфраструктури для підзарядки акумуляторів;

?при масової зарядці електромобілів від побутової мережі зростають перевантаження електричних мереж «останньої милі», що загрожує зниженням якості енергопостачання і ризиком локальних аварій мережі;

?тривалий час зарядки акумуляторів в порівнянні з заправкою паливом.

Роблячи висновок можна сказати, що електротранспорт на даному етапі його розробок є одним з найбільш перспективних напрямків в розвитку людства. Тому було б доцільно спробувати модернізувати існуючі моделі (прототипи) шляхом додавання можливості дистанційного керування транспортним засобом (автомобілем) або масове використання безпілотних автомобілів.

Одним з прикладів безпілотних автомобілів є автомобіль Google. Система використовує інформацію, зібрану сервісом Google Street View, відеокамери, датчик LIDAR, встановлений на даху, радари в передній частині авто і датчик, підключений до одного із задніх коліс, який допомагає визначити позицію автомобіля на карті.

У реальних умовах, без участі людини, автомобіль проїхав близько 1600 км повністю автономно і ще 225 ÷ 308 км з частковою участю людини.

У 2012 році компанія Google повідомила в своєму блозі про те, що їхні автомобілі проїхали вже 300 тисяч миль (більше 480 тис. км) з мінімальною участю людини. Це дозволило компанії знизити екіпаж автомобілів до однієї людини.

Аналоги в сфері безпілотних автомобілів вже існують, але відсутні будь-які концепції дистанційного управляння електричними транспортними засобами. Дана технологія дасть змогу зменшити кількість робочих міст працівників на фізично та екологічно важких територія або відділах.


1. Аналітична частина


.1 Загальна проблема, що розглядається


Головна тенденція світового транспортного ринку полягає у тому, що електричні засоби пересування людей та вантажів стають все більш затребуваним, завдяки їхнім незаперечним перевагам: електротранспорт екологічно чистий вид транспорту, він більш економічний, ніж бензиновий аналог і завдяки технічним характеристикам, їм легше управляти, як на промисловості, так і в місті [1].

На думку екологів, головна причина поганої екологічної обстановки сучасного міста - автотранспорт. В наш час все більше уваги приділяється екологічності транспортних засобів, ефективності роботи двигуна. Транспортні засоби мають змогу працювати, як на відкритому повітрі, так і в закритому приміщенні (підприємство, складське приміщення, лікарня і т.д.).

Сучасний електротранспорт працює завдяки електродвигуну, який потребує додаткової підзарядці акумуляторів, але є екологічно чистим і не потребує нафтопродуктів, як двигуни внутрішнього згоряння. Екологи застерігають суспільство про катастрофічну шкоду, яку заподіюють викиди бензинових парів в атмосферу [2].

Розвиток електротранспорту є загальносвітовим трендом. Практично всі великі автовиробники ведуть розробки в цій області, а передові країни світу, такі як: США, Китай, Японія, Німеччина, Великобританія - мають довгострокові програми підтримки розвитку електротранспорту та стимулювання споживачів. Враховуючи, що на сьогоднішній день висока ціна - один із стримуючих факторів розвитку електротранспорту, участь і підтримка держави в цьому питанні набуває особливого значення. Серед пропонованих механізмів: субсидії, пільгові схеми кредитування, скасування транспортного податку [3].

На даний момент великою проблемою є соціальна потреба у невеликих за розміром електричних транспортних засобах [4], які відповідають наступним вимогам:

?маневреність, тобто можливість швидко змінювати швидкість і напрямок руху на місцевості в залежності від складності обстановки;

?наявність ДУ, тобто управління технологічними об'єктами і системами на відстані шляхом передачі до них каналами зв'язку сигналів для увімкнення відповідних пристроїв. ДУ застосовується в системах безлюдного керування об'єктами, наприклад в умовах шкідливих, небезпечних, а то й недоступних для людини: розмінування [5, 6], військова справа [7, 8, 9], гасіння пожеж [10], космічні дослідження [11, 12, 13], аварійні роботи [14], тощо;

?універсальність застосування, тобто швидке дообладнання базового технічного рішення з метою використання в різних галузях людської діяльності. Загальна платформа може працювати, в промисловості (перевезення вантажів), лікарнях (перевезення хворих, доставка хворого до палати або кабінету, без керування людиною), працювати на аварійних роботах (знешкодження мін, гасіння пожеж, замір радіаційного фону, знешкодження залишків вогнетривких елементів, радіаційно небезпечних предметів і т. д. для можливості подальшої роботи).

Розглянемо існуючі галузі застосування електричних транспортних засобів з ДУ.


.2 Галузі застосування електричних транспортних засобів з дистанційним управлінням


.2.1 Військове озброєння

Для останнього десятиліття характерним є зростання уваги до проблем створення автоматизованих компактних систем військового призначення. Це обумовлюється, по-перше, намаганням зберегти життя солдата в бою. По-друге, експерти вважають, що війни майбутнього будуть переважно вестись в міських умовах, де потрібні маневрені засоби, якими керують на відстані. По-третє, ця тенденція пояснюється стрімким розвитком новітніх технологій в інформаційній сфері, тобто автоматизація різноманітних напрямів діяльності людини, зокрема, військової сфери, цілком логічно відповідає змісту сучасних концепцій постіндустріального суспільства [15].

Більшість наземних роботизованих машин раніше використовувалися для розвідувальних операцій і виявлення вибухових пристроїв. Проте вже зараз завершуються розробки декількох варіантів збройних ДКМ.

В США до недавнього часу найбільш значущою програмою розвитку збройних сил на найближчі десятиліття, аж до 2030 р., була програма «Бойова система майбутнього» (Future Combat System - FCS), в рамках якої передбачено створення декількох типів наземних військових роботизованих рухомих засобів [16].

Зокрема, четверта підгрупа програми FCS - «наземні ДКМ» - UGV (Unmanned Ground Vehicles - дослівно, «безекіпажні наземні машини») передбачає розробку:

?збройних роботизованих машин - Armed Robotic Vehicle (ARV) - розвідувальної (Reconnaissance, Surveillance and Target Acquisition - RSTA) і штурмової (Assault);

?багатофункціональних машин підтримки - Multifunctional Utility Logistics and Equipment platform (MULE) - розвідувальні, саперні та транспортні;

?малогабаритної БА - Small Unmanned Ground Vehicle (SUGV).

Багатоцільова ДКМ MULE (рис. 1.1) розробляється корпорацією «Локхід-Мартін» на базі легкої шестиколісний платформи в трьох варіантах: транспортному, штурмовому і протимінному.

Рисунок 1.1 - Зовнішній вигляд MULE


Наземний малогабаритний переносний ДКМ SVGV розроблений американською компанією «iRobot» призначений для знешкодження вибухових пристроїв, розвідки й виявлення противника в важкодоступних місцях - будівлях, тунелях, колекторах, печерах.

ДУМ MAARS (Modular Advanced Armed Robotic System) - модульна модернізована роботизована система з озброєнням. Модульна конструкція нової ДКМ дозволяє використовувати одні й ті ж вузли для створення систем різного призначення, що знижує загальну вартість виробництва і робить таку платформу більш привабливою для замовника [17].


1.2.2 Ліквідація аварій

Існування різних середовищ, потенційно небезпечних для людини, визначило необхідність у розробці машин, придатних для дистанційного маніпулювання і керованих людиною-оператором, що перебуває в безпечному середовищі. Розробки такого роду становлять значний інтерес для дослідження роботехників, бо вони демонструють потребу в роботах і крім того, ті зразки механізмів, які були розроблені, можуть дати хороший орієнтир при створенні автоматично керованих кінцівок для автономних роботів.

Зменшити ступінь участі людини при проведенні робіт у небезпечних умовах можна, використовуючи ДУ обладнання. У зв'язку з цим досить актуальним є створення комплексів з ДУ, призначених для проведення робіт з попередження або ліквідації наслідків позаштатних ситуацій.

В даний час підрозділи робототехнічних засобів оснащені ДКМ BROKK, MV-3 і MV-4, крім того, планується прийняти на постачання мобільні засоби МРК-25М і МРК-46М [18].

Такі засоби призначені для:

?виконання робіт у небезпечних зонах (розвідка, взяття проб, земляні роботи);

?виконання робіт при ліквідації наслідків надзвичайних ситуацій (огляд місць аварій, маніпуляції з радіоактивними та сильнодіючими отруйними речовинами, боротьба з вогнем);

?проведення вибухотехнічних робіт (знешкодження або знищення вибухонебезпечних предметів і боєприпасів; вибухові роботи).і MV-4 (рис. 1.2) розроблені для розвідки та ліквідації наслідків локальних аварій на підприємствах ядерного циклу. До складу MV-3 входять транспортний модуль, маніпулятор, пульт управління.


Рисунок 1.2 - ДУМ «MV-3»

330 являє собою самохідну, ДУ гусеничну, електрогідравлічну полноповоротного машину, оснащену маніпулятором, системою управління і комплектом змінного обладнання та інструменту (рис. 1.3).

Рисунок 1.3 - ДУМ «BROKK 330»


Компактний BROKK Mini Cut (рис. 1.4) призначений для проведення аварійних робіт в основному в закритих приміщеннях.


Рисунок 1.4 - ДУМ «BROKK Mini Cut»


В останні роки наука в області пожежогасіння помітно зробила крок вперед, так звані, роботизовані комплекси, застосовувані для рятувальних робіт та пожежогасіння на небезпечних об'єктах, як у приміщенні, так і на відкритому повітрі.

МРК-РП (рис. 1.5) - протипожежний робототехнічний комплекс, що відноситься до легкого класу. Він ідеально підходить для проведення протипожежних дій в умовах високо теплового впливу і великого рівня радіації. Робот оснащений системами відео контролю.

Рисунок 1.5 - Зовнішній вигляд «МРК-РП»


Роботи «Ялина-4» і «Ялина-10» - це ДКМ, призначені для ведення розвідки, боротьби з вогонь і розбору завалів. Широко застосовуються для протипожежних робіт при техногенних аваріях, що характеризуються високим рівнем радіації, присутністю шкідливих і небезпечних для людини речовин.(рис. 1.6) - ДУ мобільна установка пожежогасіння. Застосовується при пожежогасінні, як на відкритій місцевості, так і в приміщеннях, незамінна при ліквідації загорянь, що виникають в залізничних і автодорожніх тунелях, гаражах [19].

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


Рисунок 1.6 - мобільна установка пожежогасіння LUF-60

1.2.3 Засоби пересування для інших планет

Космонавтика служитиме трампліном у створенні універсальних антропоморфних роботів багатосерійного виробництва.

Повністю антропоморфний робот на сьогоднішньому етапі дуже складний для багатосерійного виробництва. Основні труднощі пов'язані зі способом пересування на двох кінцівках. Нижні антропоморфні кінцівки можна замінити більш дешевими і працездатними традиційними засобами пересування.

«Кентавр» (рис. 1.7) - це універсальна машина, здатна вести на поверхні місяця різноманітні роботи, пов'язані з розвідкою, будівництвом, видобутком ресурсів, монтажем та обслуговуванням устаткування. Завдяки поєднанню антропоморфного торсу і шасі в одному виробі, кентавр здатний виконувати завдання транспортного засобу.


Рисунок 1.7 - «Кентавр»


Для управління кентавром повинен використовуватися пульт, що передає руху рук оператора на маніпулятори робота. Робот буде в точності копіювати рухи рук оператора вставлені в механічні рукавички з датчиками. Датчики маніпуляторів, так само повинні передавати відчуття дотиків «пальців», робота і навантаження на «руки», що дозволить оператору відчувати машину [20].

1.2.4 Демонтажні роботи

Компактні ДКМ знаходять застосування як при демонтажі будівель і споруд, так і при новому будівництві та реконструкції об'єктів.

ДКМ для демонтажу та руйнування виробництва Husqvarna і Brokk можуть виконувати небезпечні для людини види робіт: руйнування конструкцій; стін; демонтаж металоконструкцій в заражених токсичними речовинами небезпечних зонах, хімічних виробництвах, сховищах, радіоактивно небезпечних ділянках [21, 22].


.2.5 Тягачі та електрокари

Електричні тягачі та електрокари (рис. 1.8) - це спеціальна техніка, яка служить для переміщення будь-яких колісних засобів, візків, буксирувати вантажі на території виробничого підприємства. Компактні розміри і велика тягове зусилля дозволяють використовувати електрокари і тягачі для виконання широкого спектра логістичних/транспортних робіт [23].


Рисунок 1.8 - Електричні тягачі


Переваги електричних тягачів і електрокарів:

?універсальність і всепогодне використання;

?економія часу та робочої сили при переміщенні вантажів. Безперервність роботи тягача до 20 годин без перезарядки;

?різноманіття варіантів стикування і захоплення;

?переміщення візків і вантажів мають велику масу.

Ще одним типом транспортного засобу є електровізок [24]. Він має певні переваги:

?екологічність - абсолютна відсутність шкідливих викидів в атмосферу;

?знижений рівень шуму - за рахунок меншої кількості рухомих частин і механічних передач;

?можливість вирішення проблеми «енергетичного піку» за рахунок підзарядки акумулятора в нічний час;

?низька пожежо- і вибухонебезпечність при аварії.

?разом із цим, електровізок, як конструктивне рішення, має певні недоліки:

?висока собівартість - за рахунок унікальності на ринку і в залежності від ваги що вони можуть перевозити;

?травмо небезпечність - як для самого оператору що нею керує так і для інших працівників підприємства або установи;

?неповороткі - для повноцінної роботи потрібна великі розміри приміщення (не можливо виконати поворот, переміщення «вантажу» в вузьких «коридорах»);

?фізичні та нервові навантаження оператора - за для виконання роботи електровізком потрібна наявність людини, що буде частково виконувати фізичні навантаження. Постійна увага з боку особи, що керує, особливо в умовах постійного маневрування, може призвести до передчасної втоми та аварійної ситуації;

?відсутність ДУ - неможливо в процесі руху відійти вперед або вбік для детального контролю руху.


1.3 Дистанційне керування


ДУ автономним транспортним засобом надає йому додаткові переваги:

?можливість експлуатації у небезпечних для людини або агресивних (хімічна, радіаційна, вибухова, пожежна загроза) умовах;

?ергономічність і простота експлуатації (оператор може легко переміщати тягач на 360 °, чітко бачити і контролювати весь процес);

?універсальність і всепогодне використання (можна використовувати як у критих приміщеннях з хорошим покриттям, так і в складних умовах: на піску, снігу, гравії і т. д.);

?безпека (оператор управляє без фізичних навантажень, підвищена маневреність зменшує ризик дрібних пошкоджень при транспортуванні, кнопка екстреного гальмування моментально зупиняє тягач і включає зворотний хід при необхідності);

?економія часу та робочої сили при переміщенні вантажів;

?компактність за рахунок відсутності місця для водія дозволяє легко вміщають засіб у багажник легкового автомобіля;

?можливість одночасного керування декількома засобами, запобігати їхньому зіткненню, обєднанню у групи тощо.

ДУ - передача керуючого впливу від оператора до об'єкта управління, що знаходиться на відстані, через неможливість передати сигнал безпосередньо, якщо об'єкт рухається, знаходиться на значній відстані або в агресивному середовищі і т.д. [25].

Системи ДУ застосовуються як в газовій і нафтовій, так і в хімічній і металургійній промисловості, в енергетиці та на транспорті, а також в інших галузях промисловості з шкідливими умовами праці [26].

Система ДУ виконує за допомогою своїх засобів (виборчого індивідуального або групового управління) передачу впливів оператора на виконавчі механізми, віддалених від центрального пункту управління [27].

ДУ супроводжується дистанційним контролем - зворотної передачею на пульт управління сигналів про виконання переданих команд. Системи ДУ використовують для передачі як дискретної, так і безперервної інформації.

Кожен керований об'єкт в системах ДУ зазвичай характеризується двома станами (наприклад, відкрито - закрито, включено - вимкнено і т.д.), тому і керуюча інформація має в цьому випадку бінарну структуру. У більшості систем ДУ прийнятий двоступінчастий спосіб передачі сигналі: спочатку передається адреса об'єкта, потім, після підтвердження правильності адреси, керуюча команда. При передачі аналогової інформації системи ДУ складають групу систем телерегулювання. При управлінні об'єктами з певним жорстким програмами ДУ часто доповнюють спеціальними автоматичними пристроями для реалізації цих програм. При цьому у функції оператора входить вибір потрібної програми і запуск системи ДУ.

При ДУ складними технічними об'єктами контрольну інформацію обробляють за допомогою ЕОМ. Зазвичай передача керуючої інформації здійснюється (з диспетчерського пункту або пункту управління) за допомогою комбінованої системи телеуправління і телесигналізації або комплексної телемеханічної системи. Основні вимоги, пропоновані до засобів ДУ: висока точність передачі вимірюваних величин, неприпустимість запізнювання сигналів, висока надійність передачі керуючих команд, високий ступінь автоматизації збору та використання керуючої інформації централізована обробка інформації [28].

На сьогодні перед розробником все частіше виникає завдання організації системи розподіленого управління, збору інформації з віддалених об'єктів (рис. 1.9). В основному для таких завдань використовують спеціальні виділені провідні канали, але частка об'єктів які не мають дротових каналів або мають невигідне для прокладки розташування. Для таких об'єктів набагато вигідніше застосувати безпровідний канал передачі інформації.

Рисунок 1.9 - ДУ на базі GSM


Переваги використання саме такого рішення полягають в наступному:

?повна мобільність в зоні покриття оператором;

?невисока вартість послуг;

?немає необхідності оформлення дозволу на використання радіочастот;

?не треба закуповувати дороге приймально-передавальне обладнання;

?за рахунок низького енергоспоживання GSM-терміналів можливість створення портативних пристроїв з власним джерелом живлення;

?можливість організації швидкісного цифрового каналу;

?підтримка TCP/IP.

Сучасним рішенням є використання GSM/GPRS модулів. Дані модулі включають в себе всі необхідні функції для роботи в GSM каналі, підтримують аналогічний принцип управління, як і для мобільного телефону, однак виконуються за промисловими стандартами, мають мініатюрні габарити, а також деякі додаткові функції. Крім того ціна нового GSM/GPRS модуля нижче ніж у нового мобільного телефону [29].

З урахуванням комплексного зниження цін на GSM технологію, використання GSM каналу стало можливим у багатьох сегментах електронних пристрої:

?системи моніторингу для переміщуваних об'єктів із застосуванням GPS-навігації;

?охоронні системи для віддалених або перемащеннях об'єктів;

?системи віддаленого контролю (світлофори, дистанційні датчики тощо)

?автономні платіжні термінали (заправки, переносні касові апарати);

?системи відео-та аудіо спостереження.


.4 Канали звязку


Канал звязку - частина комунікаційної системи, яка зв'язує між собою джерело та приймач повідомлень.

Канал поширення сигналу може бути штучним, природним і комбінованим. У першому і (або) третьому випадку - це сукупність технічних засобів та середовища розповсюдження, що забезпечує передавання повідомлень від відправника до одержувача [30].

Системи ДУ різняться насамперед по типу каналу зв'язку:

?механічний канал. Використовується там, де об'єкти віддалені один від одного на порівняно невелику відстань або потрібно забезпечити миттєву неспотворену реакцію, (наприклад, управління літальними апаратами, автомобілями) [31];

?електричний канал;

?провідний канал - використовується там, де немає можливості застосувати бездротові канали. Такий канал використовується, головним чином, для управління системами мобільних об'єктів, обладнанням виробничих об'єктів, лабораторій, або спеціальних об'єктів (військового та іншого призначення);

?радіоканал - використовується, головним чином, для управління рухомими об'єктами - радіокерованими спортивними моделями та іграшками, обладнанням для надзвичайних ситуацій (роботи і т. д.), БПЛА, військовими мобільними об'єктами; або в ситуаціях, коли передавач і приймач не можуть перебувати в зоні прямої видимості;

?ультразвукової канал - використовується рідко, для управління мобільними та стаціонарними об'єктами на порівняно невеликій відстані;

?інфрачервоний канал - використовується, як правило, для побутової електроніки.

Найбільш широко використовуваними в створенні систем ДУ використовують наступні технології:

?оптоволоконний кабель;

?Bluetooth;

?Wi-Fi;

?GSM;


.4.1 Оптоволоконний кабель

Оптоволоконний зв'язок - зв'язок, побудований на базі оптоволоконних кабелів [32].

Широко використовується в техніці передач мультиплексора з поділом часу дозволяє збільшити швидкість передачі до 10 Гбіт/с. Сучасні швидкодіючі оптоволоконні системи пропонують такі стандарти швидкості передач наведені в табл. 1.1


Таблиця 1.1 - Стандарти в оптоволоконних системах

Стандарт SONETСтандарт SDHШвидкість передачіOC 151,84 Мб/сOC 3STM 1155,52 Мб/сOC 12STM 4622,08 Мб/сOC 48STM 162,4 Гб/сOC 192STM 649,95 Гб/с

Переваги оптоволоконного типу зв'язку:

?широкополостність оптичних сигналів, обумовлена надзвичайно високою частотою несучої. Це означає, що по оптоволоконної лінії можна передавати інформацію зі швидкістю близько 10 Гбіт/с;

?дуже мале загасання світлового сигналу у волокні, що дозволяє будувати оптоволоконні лінії зв'язку довжиною до 100 км і більше без регенерації сигналів;

?стійкість до електромагнітних перешкод з боку оточуючих мідних кабельних систем, електричного обладнання (лінії електропередачі, електродвигунні установки і т. д.) і погодних умов;

?захист від несанкціонованого доступу;

?електробезпека;

?довговічність ВОЛЗ - термін служби оптоволоконних ліній зв'язку становить не менше 25 років.

Недоліки оптоволоконного типу зв'язку:

?відносно висока вартість активних елементів лінії, що перетворюють електричні сигнали в світ і світло в електричні сигнали;

?відносно висока вартість зварювання оптичного волокна.


.4.2 Bluetooth- виробнича специфікація бездротових персональних мереж (Wireless personal area network, WPAN). Bluetooth дозволяє пристроям повідомлятися, коли вони знаходяться в радіусі до 100 метрів один від одного (дальність сильно залежить від перешкод і перешкод), навіть у різних приміщеннях.

Інтерфейс Bluetooth дозволяє передавати як голос (зі швидкістю 64 Кбіт/с), так і дані. Для передачі даних можуть бути використані асиметричний (721 Кбіт/с в одному напрямку і 57,6 Кбіт/с в іншому) і симетричний методи (432,6 Кбіт/с в обох напрямках. Що працює на частоті 2,4 ГГц приймач, яким є Bluetooth-чіп, дозволяє залежно від ступеня потужності встановлювати зв'язок у межах 10 або 100 метрів. Різниця у відстані, безумовно, велика, однак з'єднання в межах 10 м дозволяє зберегти низьке енергоспоживання, компактний розмір і досить невисоку вартість компонентів. Так, малопотужний передавач споживає всього 0,3 мА в режимі Standby і в середньому 30 мА при обміні інформацією [33].

До переваг можна віднести:

?Bluetooth не вимагає прямої видимості між пристроями для синхронізації;

?технологія не вимагає проводів та кабелів зробило її настільки популярною (максимальна дальність, передачі через Bluetooth складає 100 метрів);

?одне з головних переваг Bluetooth є його простота у використанні;

?шанс на втручання інших бездротових мереж в мережі Bluetooth дуже низька. Це через малої потужності бездротових сигналів і стрибкоподібної перебудови частоти. Bluetooth працює в тому ж частотному діапазоні, що і Wi-Fi 2,4 Ггц [34].

Недоліки Bluetooth-технології:

?головним недоліком Bluetooth є низька ступінь захисту;

?знос батареї протягом однієї передачі через Bluetooth не значна, але є деякі люди, які залишають Bluetooth включеним у своїх пристроях;

Зрештою, переваги технології легко переважують будь-які негативні аспекти. Bluetooth широко використовується мільйонами людей в усьому світі і це з'єднання набуває все більшого поширення. Незабаром кожен електронний пристрій в нашому будинку буде оснащене технологією Bluetooth, це лише питання часу [35].


.4.3 Wi-FiFi - торгова марка Wi-Fi Alliance для бездротових мереж на базі стандарту IEEE 802.11. Технологія Wi-Fi постійно вдосконалюється, що дозволяє передавати більший потік даних, забезпечує більш надійний зв'язок і захист. Останнім часом Wi-Fi технологіями забезпечуються ноутбуки, мобільні телефони, КПК, ігрові приставки і навіть комп'ютерні миші [36].

Переваги технології Wi-Fi:

?Wi-Fi - пристрої широко поширені на ринку. А пристрої різних виробників можуть взаємодіяти на базовому рівні сервісів;

?пристрої Wi-Fi невеликі за розмірами і прості в експлуатації: базова станція розміром з книгу, плата-антена для ноутбука - менше кредитної картки. Ясна річ, що при організації внутрішньо офісної мережі набагато швидше і зручніше встановити пару точок доступу і забезпечити комп'ютери відповідними Wi-Fi картами, ніж свердлити стіни і тягнути через приміщення сотні метрів проводів, а потім ще й стежити за працездатністю всього цього господарства. До того ж ціна комплекту Wi-Fi порівнянна з витратами, необхідними на організацію звичайної внутрішньо офісної комп'ютерної мережі;

?Wi-Fi мережі підтримують роумінг, тому клієнтська станція може переміщатися в просторі, переходячи від однієї точки доступу до іншої;

?Wi-Fi - це набір глобальних стандартів. На відміну від стільникових телефонів, Wi-Fi обладнання може працювати в різних країнах по всьому світу [37].

Недоліки Wi-Fi:

?у діапазоні 2,4 ГГц працює безліч пристроїв, таких як пристрої, що підтримують Bluetooth і навіть мікрохвильові печі, що погіршує електромагнітну сумісність;

?виробниками обладнання вказується швидкість на L1 (OSI), в результаті чого створюється ілюзія, що виробник обладнання завищує швидкість, але насправді в Wi-Fi вельми високі службові «накладні витрати». Виходить, що швидкість передачі даних на L2 (OSI) в Wi-Fi мережі завжди нижче заявленої швидкості на L1 (OSI). Реальна швидкість залежить від частки службового трафіку, яка залежить вже від наявності між пристроями фізичних перешкод (меблі, стіни), наявності перешкод від інших бездротових пристроїв або електронної апаратури, розташування пристроїв відносно один одного і т. д. [38];

?частотний діапазон і експлуатаційні обмеження в різних країнах не однакові;

?стандарт шифрування WEP може бути відносно легко зламаний навіть при правильній конфігурації (через слабку стійкість алгоритму). Нові пристрої підтримують більш досконалі протоколи шифрування даних WPA і WPA2. Прийняття стандарту IEEE 802.11i (WPA2) в червні 2004 року зробило можливим застосування більш безпечною схеми зв'язку яка доступна в новому устаткуванні. Обидві схеми вимагають стійкіший пароль, ніж ті, які зазвичай призначаються користувачами. Багато організацій використовують додаткове шифрування (наприклад VPN) для захисту від вторгнення. На даний момент основним методом злому WPA2 є підбір пароля, тому рекомендується використовувати складні цифро-буквені паролі для того, щоб максимально ускладнити завдання підбору пароля;

?у режимі точка-точка (Ad-hoc) стандарт наказує лише реалізувати швидкість 11 Мбіт/с (802.11b).


.4.4 GSM

Стандарт GSM - глобальний цифровий стандарт для мобільного стільникового зв'язку другого покоління, з поділом каналу за принципом TDMA та високим ступенем безпеки завдяки шифруванню з відкритим ключем. Розроблений під егідою Європейського інституту стандартизації електрозв'язку (ETSI) наприкінці 80-х років.

Стандарт GSM є цифровим і забезпечує високу якість і конфіденційність зв'язку і надає абонентам великий набір послуг: автоматичний роумінг, прийом/передача даних, SMS-сервіс, голосова та факсимільна пошта [39].

Переваги стандарту GSM:

?менші порівняно з аналоговими стандартами (NMT-450, AMPS-800) розміри і вага телефонних апаратів при більшому часу роботи без підзарядки акумулятора. Це досягається в основному за рахунок апаратури базової станції, яка постійно аналізує рівень сигналу, що приймається від апарату абонента. У тих випадках, коли він вище необхідного, на стільниковий телефон автоматично подається команда знизити випромінену потужність;

?хороша якість зв'язку при достатній щільності розміщення базових станцій;

?велика ємність мережі, можливість великого числа одночасних з'єднань;

?низький рівень індустріальних перешкод в даних частотних діапазонах;

?покращена (в порівнянні з аналоговими системами) захист від підслуховування і нелегального використання, що досягається шляхом застосування алгоритмів шифрування з розділяються ключем.

?ефективне кодування мови. EFR - промисловий стандарт кодування/декодування для технології GSM;

?широке поширення, особливо в Європі, великий вибір обладнання. На сьогоднішній день стандарт GSM підтримують 228 операторів, офіційно зареєстрованих в Асоціації операторів GSM з 110 країн;

?можливість роумінгу. Це означає, що абонент однієї з мереж GSM може користуватися стільниковим телефонним номером по всьому світу переходячи з однієї мережі в іншу не розлучаючись зі своїм абонентським номером. Процес переходу з мережі в мережу відбувається автоматично і користувачеві телефону GSM немає необхідності заздалегідь повідомляти оператора [40].


.5 Операційні системи

ОС - це програма, що забезпечує можливість раціонального використання устаткування комп'ютера зручним для користувача образом.


1.5.1 Ballista OC

БА в повітрі, на землі і під водою - один із пріоритетних напрямків розвитку американської армії. Як тільки використання роботів набуло масового характеру, військові зіткнулися з проблемою: безліч пристроїв від різних виробників має несумісні інтерфейси і органи управління.

Компанія DreamHammer пропонує вирішити цю проблему раз і назавжди, створивши спеціальну операційну систему, яка працюватиме на будь-яких комп'ютерах, включаючи звичайні планшети і смартфони, і дасть можливість керувати роботами будь-якого типу через однаковий інтерфейс, що нагадує комп'ютерну гру.

Військові вже виділили півтора мільйона доларів на тестування Ballista OC (рис. 1.10). Стандартна архітектура для управління всіма роботами і БА зробить їх життя набагато легше. Універсальний інтерфейс дозволить одному оператору управляти відразу декількома пристроями і легко перемикатися між стратегічним управлінням місією в цілому і маневрами окремих машин [41].


Рисунок 1.10 - Ballista OC


Це частина нової мобільної стратегії Пентагону, мета якої - використовувати потенціал цивільних пристроїв в якості універсальних контролерів, засобів зв'язку і доступу до інформаційних систем. Це дозволить заощадити мільйони доларів, адже замість безлічі дорогих спеціалізованих приладів можна буде використовувати програмне забезпечення. Нова стратегія передбачає створення Framework для написання військових додатків і системи сертифікації, що забезпечує необхідну безпеку і дотримання секретності [42].


.5.2 Android- операційна система, заснована на ядрі Linux і власної реалізації Java від Google. Спочатку розроблялася компанією Android Inc., яку потім купила Google. Згодом Google ініціювала створення альянсу Open Handset Alliance (OHA), який зараз займається підтримкою і подальшим розвитком платформи. Android дозволяє створювати Java-додатки, що керують пристроєм через розроблені Google-бібліотеки [43].

На відкритті конференції розробників Google I/O 2011 поряд з іншими важливими анонсами компанія представила Android Open Accessory - API для створення широкого спектра аксесуарів, що працюють з Android допомогою порту USB. Аксесуарами можу виступати абсолютно різноманітні пристрої. Наприклад, Google продемонструвала велотренажер, за допомогою якого оператор може керувати грою CardioQuest, використовуючи як засоби управління швидкість обертання педалей.

Іншим прикладом під час доповіді Google стала фізична дошка-лабіринт, управління рухом кульки на якій здійснювалося за допомогою підключеного до неї планшета Motorola Xoom. Android Open Accessory підтримує платформи Android 3.1 і Android 2.3.4 [44].

Також широко використовуються для ДУ: фотоапаратів, відеокамер, розумним домом.


.5.3 WindowsWindows - сімейство пропрієтарних операційних систем корпорації Microsof, орієнтованих на застосуванні графічного інтерфейсу при управлінні. За даними ресурсу NetMarketShare (.Net Applications) працює близько 90 % персональних комп'ютерів.

Компанія Modularis, яка спеціалізується на технологіях цифрової безпеки, представила унікальне мобільний додаток MVP, призначене для централізованого управління поліцейськими автомобілями. Програму характеризує той факт, що вона надає можливість управління всім, що відбувається на машині. У першу чергу рядових користувачів цікавлять такі речі як відкривання дверей (не просто відмикання замків, а буквально відкривання дверей), включення і відключення проблискових маячків і сирени.

Додаток MVP призначено для роботи на новій платформі Windows 8 з інтерфейсом Metro, але він підтримує не тільки класичний сенсорний інтерфейс, а й просунуте голосове управління. Тобто команди, що віддаються природною промовою. А для забезпечення додаткової безпеки розробники з Modularis реалізували роботу системи через хмарну платформу Windows Azure. Це дозволяє контролювати кожну машину централізовано з диспетчерської в поліцейського відділку.


.5.4 IOS

В майбутньому Apple може вийти на автомобільний ринок. В рамках WWDC 2013 вона представила нову функцію «iOS in the Car», а тепер отримала патент на технологію (рис. 1.11).


Рисунок 1.11 - «iOS in the Car»

У червні поточного року компанія Apple подала в Європейське патентне відомство заявку на реєстрацію унікальної системи. У ній детально описана технологія, що дозволяє здійснювати ДУ деякими функціями автомобіля за допомогою iPhone або iPad. Зокрема, віддалено можна автоматично розблоковують двері машини, відкривати багажник, включати підігрів крісел і управляти клімат-контролем і можливостями мультимедійної системи [45].


2. Креативна частина


.1 Постановка задачі дипломного проекту


Проаналізувавши існуючі електричні транспортні засоби, можна зробити висновок, що вони мають суттєві недоліки: висока собівартість, травматичність, неповороткість, відсутність дистанційного управління, фізичні та нервові навантаження оператора.

Тому основним завдання дипломної роботи є створення системи дистанційного управління електричним засобом транспортування на базі ОС Android, яка дозволить уникнути недоліків, що перелічені.

Прототип транспортного засобу, що буде створений в результаті виконання дипломного проекту повинен відповідати наступним критеріям:

?екологічність конструкції, якої буде досягнуто за рахунок застосування електричних засобів руху та відповідного управління;

?комфортне дистанційне управління засобом операторам, забезпечення нешкідливих умов праці. Надати можливість віддалено керувати транспортним засобом;

?безпека перевезення вантажу, тобто забезпечити можливість сканування перешкод на шляху електричного транспортного засобу, за допомогою ультразвукових датчиків. Якщо перед транспортним засобом знаходиться перешкода, він повинен самостійно знаходити шляхи для її обїзду;

?технологічність. Для швидкого ремонту транспортного засобу слід передбачити його модульність. Кожен модуль системи управління повинен бути окремим і не залежати від інших, що дасть можливість швидкої заміни.

На даний час в якості головного управляючого органу найбільш відповідає таким вимогам стандартна платформа Arduino. Унікальна за різноманіттям номенклатура зовнішніх приладів та дешевизна і технологічність самої платформи, наявність засобів розробки програмування та відлагодження призвела до вибору саме Arduino для побудови управляючого транспортним засобом.

В якості головного управляючого органу системи дистанційного транспортного засобу було використано Arduino Nano. Такий вибір обумовлений такими перевагами:

?низька собівартість самої плати - це є головним критерієм при розробці масових систем дистанційного управління;

?модульність - повна відсутність пайки елементів, що дає змогу швидкої заміни одного з елементів системи (не потрібно наявність спеціаліста для заміни окремого елемента);

?малі розміри плати;

В якості каналу звязку було використано Bluetooth-модуль HC-06, тому що:

?Bluetooth-технологія дуже розвинута і майже всі сучасні пристрої підтримують її, що дає змогу для розробників створювати ПЗ для великої різноманітності пристроїв (Android, iOS, Windows Phone і т.д.).

?модульність елементу, що дає змогу швидкої заміни;

?малі габаритні розміри.

Для керування рухом двигунів в електричному транспортному засобі було використано драйвер L298N, який має певні переваги серед аналогічних приладів:

?модульність конструкції;

?широкий діапазон напруги живлення;

?достатній вихідний струм;

?низька напруга насичення;

?захист від перегріву;

?висока перешкодозахищеність.

В якості аналізатора відстані до перешкоди було використано ультразвуковий датчик HC-SR04. Основними завданнями, що на нього полягають є:

?розрахунок відстані до перешкоди, при малій відстані до перешкоди подать сигнал до Arduino Nano, щоб та в свою використала потрібний алгоритм для обїзду перешкоди;

?при потраплянні транспортного засобу в глухий кут, датчик вимірювання відстані повинен подати сигнал для активізації алгоритму для виїзду з глухого кута.


.2 Загальна схема підключення електричних компонентів


На рис. 2.1 наведено схему підключення електричних компонентів:

?Arduino Nano V3;

?драйвера L298N для управління двигунами;

?Bluetooth-модуль HC-06;

?два електричних двигуна;

?ультразвуковий датчик вимірювання відстані HC-SR04;

?живлення від акумуляторних батарей на 4,5 В і 6 В.


Рисунок 2.1 - Загальна схема

2.3 Принцип роботи


Управління електричним транспортним засобом здійснюється шляхом нахилу Android-пристрої. Тобто нахилили вперед - рух транспортного засобу вперед, нахилили вліво - поворот на ліво і т. д.. Причому швидкість руху або повороту залежить від ступеня нахилу пристрою. Чутливість і величина нахилу встановлюється в настройках Android-додатку. Даний спосіб управління досягається за рахунок доступу з програми до вбудованого акселерометру (який зараз є у всіх сучасних Android-смартфонах і планшетах).

Реалізовано також гібридний спосіб управління: газ - за допомогою повзунка на екрані, а поворот транспортного засобу - за допомогою повороту Android-пристрою (як віртуальне кермо). Для заднього ходу - окрема кнопка.

Передбачений і звичайний спосіб управління від кнопок на екрані, але він менш функціональний і в основному служить для налагодження та перевірки працездатності.

Дані обробляються і передаються по Bluetooth-каналу на дистанційну систему управляння транспортним засобом, який в свою чергу через драйвер управляє двигунами.

В Android-пристрої формуються команди переміщення транспортного засобу залежно від нахилу смартфона/планшета, або від натиснутої кнопки. Усі розрахунки здійснюються в Android-додатку і відразу ж обчислюються значення ШІМ для лівого і правого двигунів. Додаток має велику кількість налаштувань, таких як діапазон ШІМ, чутливість нахилу, мінімальний поріг ШІМ та ін. На Bluetooth-модуль передаються команди на систему управляння транспортним засобом у такому вигляді (2.1):

\rR-145\r, (2.1)


де L - команда для управляння лівим двигуном (мінус - рух назад),- команда для управляння правим двигуном (мінус - рух назад),

- число ШІМ, для Arduino це максимальна швидкість обертання, - кінець команди.

За цієї команди транспортний засіб буде рухатися назад і трохи повертати в праву сторону, тому правий двигун буде обертатися повільніше лівого.

За наступної команди лівий двигун буде обертатися вперед, а правий назад, що змусить машинку обертатися навколо своєї осі проти годинникової стрілки (2.2):

\rR-255\r. (2.2)


Для того, щоб зручно налаштувати управління, передбачена можливість задавати символи команд L, R і H в настройках Android-додатку.

Для підвищення безпеки транспортного засобу було зроблено наступне, у програмі контролера передбачений таймер, який відключає двигуни, якщо остання команда була отримана більш, ніж n секунд. Встановлення кількості секунд зберігається в EEPROM-пам'яті контролера і може бути змінена з Android-пристрою. Діапазон даної настройки становить від 0,1 ÷ 99,9 с. Також, настройку можна зовсім відключити. Але тоді, при втраті зв'язку транспортний засіб буде продовжувати рух, поки не буде вимкнено живлення. Навіть при наявності втрати сигналу від Android-пристрою транспортний засіб зупиниться для запобігання аварійної ситуації.

Для роботи з пам'яттю мікроконтролера передбачені команди Fr - читання значень і Fw - запис значень.

При русі транспортного засобу відбуваються постійне вимірювання відстані до можливих перешкод. При зустрічі перешкоди на шляху транспортний засіб самостійно шукає можливі шляхи обїзду перешкоди для продовження руху. В разі якщо транспортний засіб потрапляє в «глухий кут», також відбувається процес знаходження варіанту для виїзду з «глухого кута», шляхом повороту вліво навколо своєї осі, поки не буде знайдено вихід.


.4 Апаратна частина


.4.1 Arduino Nano- апаратна обчислювальна платформа, основними компонентами якої є проста плата введення/виводу і середу розробки мовою Processing/Wiring [46].- це інструмент для проектування електронних пристроїв (електронний конструктор) більш щільно взаємодіючих з навколишнім фізичним середовищем, ніж стандартні персональні комп'ютери, які фактично не виходять за рамки віртуальності. Це платформа, призначена для «фізичного обчислення» з відкритим програмним кодом, побудована на простій друкованій платі з сучасною середовищем для написання ПЗ.застосовується для створення електронних пристроїв з можливістю прийому сигналів від різних цифрових і аналогових датчиків, які можуть бути підключені до нього, і управління різними виконавчими пристроями. Проекти пристроїв, засновані на Arduino, можуть працювати самостійно або взаємодіяти з ПЗ на комп'ютері. Плати можуть бути зібрані користувачем самостійно або куплені в зборі. Середовище розробки ПЗ з відкритим вихідним текстом доступна для безкоштовного скачування.

Мова програмування Arduino є реалізацією підключення, схожої платформи для «фізичного обчислення», заснованої на мультимедійної середовищі програмування обробки.дозволяє комп'ютеру вийти за рамки віртуального світу у фізичний і взаємодіяти з ним. Пристрої на базі Arduino можуть отримувати інформацію про довкілля допомогою різних датчиків, а також можуть управляти різними виконавчими пристроями [47].

Мікроконтролер на платі програмується за допомогою мови Arduino (заснований на мові Wiring) і середовища розробки Arduino (заснована на середовищі Processing). Проекти пристроїв, засновані на Arduino, можуть працювати самостійно, або ж взаємодіяти з ПЗ на комп'ютері. Плати можуть бути зібрані користувачем самостійно або куплені в зборі. ПЗ доступне для безкоштовного скачування. Вихідні креслення схем (файли CAD) є загальнодоступними, користувачі можуть застосовувати їх на свій розсуд.

Платформа Arduino Nano (рис. 2.2), побудована на мікроконтролері ATmega328 (Arduino Nano 3.0) або ATmega168 (Arduino Nano 2.x), має невеликі розміри і може використовуватися в лабораторних роботах. Вона має схожу з Arduino Duemilanove функціональність, однак відрізняється складанням. Відмінність полягає у відсутності силового роз'єму постійного струму і роботі через кабель Mini-B USB [48].


Рисунок 2.2 - Зовнішній вигляд Arduino Nano


Основні характеристики Arduino Nano наведено в табл. 2.1.

Таблиця 2.1 - Основні характеристики Arduino Nano

ХарактеристикаЗначенняМікроконтролерAtmel ATmega168 або ATmega328Робоча напруга5 ВВхідна напруга7 ÷ 12 ВЦифрові входи/виходи14 (6 з яких можуть використовуватися як виходи ШІМ)Аналогові входи8Постійний струм через вхід/вихід40 мАФлеш-пам'ять16 КБ (ATmega168) або 32 КБ (ATmega328) при цьому 2 КБ використовуються для програматораОЗУ1 КБ (ATmega168) або 2 КБ (ATmega328)EEPROM512 байт (ATmega168) або 1 КБ (ATmega328)Тактова частота16 МГцРозміри, см1,85 х 4,2Nano може отримувати живлення через підключення Mini-B USB, або від нерегульованого 6 ÷ 20 В, або регульованого 5 В, зовнішнього джерела живлення. Автоматично вибирається джерело з найвищим напругою.

Мікросхема FTDI FT232RL отримує живлення, тільки якщо сама платформа підключена до USB-кабелю. Таким чином при роботі від зовнішнього джерела, буде відсутня напруга 3,3 В, що генерується мікросхемою FTDI, при цьому світлодіоди RX і TX блимаю тільки при наявність сигналу високого рівня.

Мікроконтролер ATmega168 має 16 КБ флеш-пам'яті для зберігання коду програми, а мікроконтролер ATmega328, в свою чергу, має 32 КБ (в обох випадках 2 КБ використовується для зберігання завантажувача). ATmega168 має 1 КБ ОЗУ і 512 байт EEPROM (яка зчитається і записується за допомогою бібліотеки EEPROM), а ATmega328 - 2 КБ ОЗУ і 1 КБ EEPROM [49].

Кожен з 14 цифрових портів Nano (рис. 2.3), використовуючи функції pinMode (), digitalWrite (), digitalRead (), може налаштовуватися як на вхід або вихід. Порти працюють при напрузі 5 В. Кожен порт має навантажувальний резистор 20 ÷ 50 кОм і може пропускати до 40 мА. Деякі порти мають особливі функції:

?послідовна шина: 0 (RX) і 1 (TX). Порти використовуються для отримання (RX) і передачі (TX) даних TTL. Дані порти підключені до відповідних портів мікросхеми послідовної шини FTDI USB-TTL;

?зовнішнє переривання: 2 і 3 Дані порти можуть бути налаштовані на виклик переривання або на молодшому значенні, або на передньому чи задньому фронті, або при зміні значення. Детальна інформація знаходиться в описі функції attachInterrupt ();

?ШІМ: 3, 5, 6, 9, 10, і 11. Будь-який з портів забезпечує ШІМ з роздільною здатністю 8 біт за допомогою функції analogWrite ();

?SPI: 10 (СС), 11 (MOSI), 12 (MISO), 13 (СХК). За допомогою даних отриманих з портів здійснюється зв'язок SPI, яка, хоч і підтримується апаратною частиною, не включена в мову Arduino;

?LED: 13. Вбудований світлодіод, підключений до цифрового порту 13, якщо значення на порту котрий має високий потенціал, то світлодіод горить.

На платформі Nano встановлені 8 аналогових входів, кожен дозволом 10 біт (тобто може приймати 1024 різних значення). Стандартно порти мають діапазон вимірювання до 5 В відносно землі, проте є можливість змінити верхню межу допомогою функції analogReference (). Деякі порти мають додаткові функції:

?I2C: 4 (SDA) і 5 (SCL). За допомогою портів здійснюється зв'язок I2C (TWI). Для створення використовується бібліотека Wire (інформація на сайті Wiring) [50].

Додаткова пара портів платформи:

?AREF. Опорна напруга для аналогових входів. Використовується з функцією analogReference ().

?RESET. Низький рівень сигналу на виведення перезавантажує мікроконтролер. Звичайно застосовується для підключення кнопки перезавантаження на платі розширення, що закриває доступ до кнопки на самій платі Arduino.

?

Рисунок 2.3 - Схематичні особливості Arduino Nano


На платформі Arduino Nano встановлено кілька пристроїв для здійснення зв'язку з комп'ютером, іншими пристроями Arduino або мікроконтролерами. ATmega168 та ATmega328 підтримують послідовний інтерфейс UART TTL (5 В), здійснюваний портами 0 (RX) і 1 (TX). Встановлена на платі мікросхема FTDI FT232RL направляє даний інтерфейс через USB, а драйвери FTDI (включені в програму Arduino) надають віртуальний COM-порт програмі на комп'ютері. Моніторинг послідовної шини (Serial Monitor) програми Arduino дозволяє посилати і отримувати текстові дані при підключенні до платформи. Світлодіоди RX і TX на платформі будуть мигати при передачі даних через мікросхему FTDI або USB підключення (але не при використанні послідовної передачі через порти «0» і «1»).

Бібліотекою SoftwareSerial можливо створити послідовну передачу даних через будь-який з цифрових портів Arduino Nano.та ATmega328 підтримують інтерфейси I2C (TWI) і SPI. У Arduino включена бібліотека Wire для зручності використання шини I2C. Більш детальна інформація знаходиться в документації. Для використання інтерфейсу SPI зверніться до технічних даних мікроконтролерів ATmega168 та ATmega328.

Існує безліч мікроконтролерів і платформ для здійснення «фізичних обчислень». Paralax Basic Stamp, Netmedia в BX-24, Phidgets, Handyboard Массачусетського технологічного інститут і багато інших пропонують схожу функціональність. Всі ці пристрої об'єднують розрізнену інформацію про програмування і укладають її в просту у використанні збірку. Arduino, в свою чергу, теж спрощує процес роботи з мікроконтролера, проте має ряд переваг перед іншими пристроями:

?низька вартість - плати Arduino відносно дешеві в порівнянні з іншими платформами. Сама недорога версія модуля Arduino може бути зібрана в ручну;

?крос-платформенность - ПЗ Arduino працює під ОС Windows, Macintosh OS X і Linux. Більшість мікроконтролерів обмежується ОС Windows;

?проста і зрозуміла середовище програмування - середа Arduino підходить як для початківців користувачів, так і для досвідчених. Arduino заснована на середовищі програмування обробки;

?ПЗ з можливістю розширення і відкритим вихідним текстом - ПЗ Arduino випускається як інструмент, який може бути доповнений досвідченими користувачами. Мова може доповнюватися бібліотеками C++. Користувачі, які бажають зрозуміти технічні нюанси, мають можливість перейти на мову AVR C на якому заснований C++. Відповідно, є можливість додати код з середовища AVR-C в програму Arduino.

Апаратні засоби з можливістю розширення і відкритими принциповими схемами - мікроконтролери ATMEGA8 і ATMEGA168 є основою Arduino. Схеми модулів випускаються з ліцензією Creative Commons, а значить, досвідчені інженери мають можливість створення власних версій модулів, розширюючи і доповнюючи їх. [51].

2.4.2 Драйвер L298N

Мікросхема L298N (рис. 2.4) являє собою здвоєний мостовий драйвер двигунів і призначена для управління DC і кроковими двигунами. Дана мікросхема знаходить дуже широке застосування в створенні робототехнічних засобів. Одна мікросхема L298N здатна керувати двома двигунами і забезпечує максимальне навантаження до 2 А на кожен двигун, а якщо задіяти паралельне включення для одного двигуна, то можна підняти максимальний струм до 4 А.


Рисунок 2.4 - Зовнішній вигляд драйверу L298N

N являє собою інтегровану монолітну схему в 15 портовому Multiwatt і PowerSO20 корпусі. Ці подвійні полномостові драйвери призначені для роботи на високій напрузі і великому струмі і розраховані на обробку логічних сигналів стандартного TTL-рівня. Драйвери L298N застосовні для управління індуктивними навантаженнями, таких, як реле, соленоїди, двигуни постійного струму і крокових двигунів. Два входи дозволяють управляти включенням і відключенням пристрою, незалежно від вхідних сигналів. Емітери нижніх транзисторів кожного моста зєднані між собою, і відповідний зовнішній висновок може бути використаний для підключення зовнішнього резистора. Додатковий вхід живлення здійснюється таким чином, щоб логіка працювала при більш низькій напрузі [52].

Особливості L298N-драйвера:

?номінальна напруга живлення до 46 В;

?загальний вихідний струм до 4 А;

?низька напруга насичення;

?захист від перегріву;

?логічний «0» при вхідному напрузі до 1,5V (висока перешкодозахищеність) [53].

Драйвер L298N має наступні порти підключення (рис. 2.5):

?Vcc - підключення зовнішнього живлення двигунів;

?+5 В - живлення логіки;

?Gnd - загальне заземлення;

?IN1, IN2, IN3, IN4 (роз'єм P4 на схемі) - входи керування двигунами;

?OUT1, OUT2 (роз'єм Р2 на схемі) - вихід першого двигуна;

?ВИХ3, ВИХ4 (роз'єм Р3 на схемі) - вихід другого двигуна;

?вимикач S1 служить для перемикання живлення логічної частини мікросхеми. Тобто при включеному S1 живлення логічної частини береться від внутрішнього перетворювача модуля. При вимкненому S1 живлення береться від зовнішнього джерела.

На модулях також присутні перемички ЕСА і ENB для дозволу включення двигунів. Якщо необхідно, їх можна також підключити до Arduino і задіяти, але це зайві 2 дроти і в цих входах немає особливого сенсу [54].


Рисунок 2.5 - Порти підключення L298N

Основні характеристики L298N наведено в табл. 2.2.


Таблиця 2.2 - Основні характеристики драйверу L298N

ХарактеристикаЗначенняНапруга для живлення двигунівдо 50 ВНапруга живлення мікросхеми7 ВМаксимальний піковий струм ключів3 АСередній (постійний) струм ключів2 АСпоживаний мікросхемою струмне більше 70 мАРозсіювальна потужність25 ВтВхідний рівень (логічний 0)менш 1,5 ВВхідний рівень (Балка 1)2,3 ВПадіння напруги на ключах при струмі 1 А не більше 1,7 ВПадіння напруги на ключах при струмі 2 А не більше 2,7 В

Схема підключення L298N до контролера Arduino (рис. 2.6).


Рисунок 2.6 - підключення L298N до Arduino


.4.3 Bluetooth-модуль HC-06вже давно і міцно увійшов у наше життя в якості зручного протоколу зв'язку різних пристроїв: мобільних телефонів, ноутбуків, КПК, гарнітур, клавіатури і т. д.

Зазвичай цю технологію інтегрують у свої продукти великі виробники електроніки у вигляді малесенької мікросхеми в корпусі BGA або QFN. Для використання при розробці роботонічних засобів доцільно використовувати Bluetooth-модуль HC-06 (рис. 2.7).

Рисунок 2.7 - Зовнішній вигляд Bluetooth-модуля HC-06


Основні характеристики Bluetooth-модуля HC-06 наведенні в табл. 2.3 [55].


Таблиця 2.3 - Основні характеристики Bluetooth-модуля HC-06

ХарактеристикаЗначенняПротоколBluetooth v2.0 + EDRЧастота 2,4 ГГц (ISM полоса)МодуляціяGFSK (гаусівська частотна маніпуляція)Потужність випромінювання? 4dBm, клас 2Чутливість? -84 мдБ на 0,1% BERШвидкістьасинхронний: 2.1 кбіт/с, 160 кбіт/с, синхронний: 1 Мбіт/с, 1 Мбіт/сБезпекаавтентифікація і шифруванняПрофільпослідовний портНапруга живлення3,3 В постійного струму 50 мАРобоча температура-20 ÷ +75 °CРозміри, мм26,9 х 13 х 2,2

Схема підключення Bluetooth-модуля HC-06 до Arduino наведено на рис. 2.8.


Рисунок 2.8 - Підключення Bluetooth-модуля HC-06 до Arduino

2.4.4 Ультразвуковий датчик вимірювання відстані HC-SR04SR04 (рис. 2.9) - це ультразвуковий датчик, що дозволяє вимірювати відстань до перепони в діапазоні від 2 ÷ 400 см. Він являє собою плату, на якій розміщені випромінювач і приймач ультразвуку, і керуюча електронна схема. Може бути використаний в якості датчика присутності в розумному будинку або охоронній системі, а також для всяких роботизованих пристроях. Також на ньому можна зробити парктронік для машини, тільки у вуличних умовах він швидко забрудниться [56].


Рисунок 2.9 - Зовнішній вигляд HC-SR04


Плата датчика має 4 порта [57]:

?Vcc - напруга живлення 5 В;

?Trig - вхід запускають імпульсів для процесу вимірювання;

?Echo - вихід імпульсу тривалість якого пропорційна відстані;

?GND - загальний провід живлення.

Сенсор випромінює короткий ультразвуковий імпульс (в момент часу 0), який відбивається від об'єкта і приймається сенсором. Відстань розраховується виходячи з часу до отримання Echo-сигналу і швидкості звуку в повітрі (рис. 2.10).


Рисунок 2.10 - Діаграма розрахунку відстані


Таким чином, сенсор отримує сигнал луни, і видає відстань, яку кодується тривалістю електричного сигнал на виході датчика (Echo).

Наступний імпульс може бути випромінюючи, тільки після зникнення Echo-сигналу від попереднього. Цей час називається періодом циклу (період циклу). Рекомендований період між імпульсами повинен бути не менше 50 мс.

Якщо на сигнальний порт (Trig) подається імпульс тривалістю 10 мкс, то ультразвукової модуль буде випромінювати вісім пачок ультразвукового сигналу з частотою 40кГц і виявляти їх луна. Виміряна відстань до об'єкту пропорційне ширині Echo-сигналу і може бути розраховане за формулою, наведеною на графіку вище [58].

Основні характеристики ультразвуковий датчик вимірювання відстані HC-SR04 наведено в табл. 2.4.


Таблиця 2.4 - Основні характеристики HC-SR04

ХарактеристикаЗначенняРобоча напруга5 ВРобочий струм15 мАРобоча частота40 ГцМаксимальна відстань400 смМінімальна відстань2 смКут дії15 °Розміри, мм45 х 20 х 15

Схема підключення ультразвукового датчика вимірювання відстані HC-SR04 до Arduino наведено на рис. 2.11.


Рисунок 2.11 - Підключення HC-SR04 до Arduino


.5 Розроблене ПЗ


.5.1 Реалізація програмного коду для Arduino Nano

Програмний код для Arduino Nano наведено в додатку А.

Основними функціями в програмному коді для Arduino Nano є:

?void setup () - викликається при запуску плати Arduino. Використовується для ініціалізації змінних, визначення роботи портів, початок використання бібліотеки і т. д. Функція виконується тільки один раз, після кожного включення живлення або скидання плати Arduino;

?loop () - після виконання базових налаштувань за допомогою функції setup (),котра і встановлює початкові значення для функція loop (). Дана функція є аналогом безкінечного циклу, що дає змогу платі працювати без зупину и виконувати поставлені задачі;

?Timer_init () - основним завданням даної функції є контроль за таймером втрати звязку з пристроям керування для зупинення транспортного засобу;

?Control_dum () - в даній функції відбуваються безпосередню керування транспортним засобом: швидкість, напрямок руху;

?Flash_Op () - функція відповідає за роботу з EEPROM-памяттю Arduino Nano.

Блок схема роботи алгоритму наведено на рис. 2.12.


Рисунок 2.12


.5.2 Створення Android-додатку

Програмний код Android-додатку наведено в додатку Б.Case - це текстовий опис сукупності сценаріїв, що виконуються користувачем при роботі з системою для досягнення певної мети [59].

Сценарій - послідовність дій при взаємодії користувача з системою для виконання певної операції.

Опис сценаріїв роботи Android-додатку наведено на рис. 2.13.


Рисунок 2.13 - Use Case діаграма


Головний екран Android-додатку наведено на рис. 2.14.


Рисунок 2.14 - Головний екран Android-додатку


Керування транспортним засобом за допомогою акселерометра (рис. 2.15).

Рисунок 2.15 - Керування за допомогою акселерометра


Гібридний спосіб керування транспортним засобом: швидкість визначаються за допомогою повзунка на екрані, а повороти і рух за допомогою нахилу Android-пристрою (рис. 2.16).


Рисунок 2.16 - Гібридний спосіб керування


Керування транспортним засобом за допомогою «кнопок»: вперед, назад, вліво, вправо (рис. 2.17).

Рисунок 2.17 - Керування за допомогою кнопок


Управляння транспортним засобом шляхом використання мультитачу Android-пристрою (рис. 2.18).


Рисунок 2.18 - Використання мультитачу Android-пристрою


Дистанційне налаштування роботи програми на Arduino Nano (рис. 2.19).

Рисунок 2.19 - Налаштування Arduino Nano


Глобальні налаштування Android-додатку (рис. 2.20).


Рисунок 2.20 - Налаштування Android-додатку


.6 Демонстрація


Зовнішній вигляд макету електричного транспортного засобу наведено на рис. 2.21 - 2.22.

Рисунок 2.21 - Вигляд зверху


Рисунок 2.22 - Вигляд збоку


При користуванні прототипом електротранспортним засобом було отримано наступні особливості експлуатації котрі наведенні в табл. 2.5.


Таблиця 2.5 - Експлуатаційні особливості

ХарактеристикаЗначенняМінімальний радіус для виконання повороту30 смМінімальне відстань до перешкоди50 смЧас роботи від акумуляторних батарей8 годМаксимальна швидкість8 км/год

3. Охорона праці


.1 Сучасний розвиток електротранспорту та галузі використання


Один з варіантів вирішення проблеми викидів (CO2) - використання електротранспорту, не виділяє ніяких викидів. ДВЗ замінюють електродвигуном, що працює на акумуляторах, а не на бензині або іншому пальному паливі. У довгостроковому періоді мета отримати електрику з екологічно чистого джерела, щоб електротранспорт робив ще менше викидів.

Електричний транспорт розробляється дуже давно. Акумуляторні технології завжди становили велику проблему. Сучасні моделі можуть проїхати 80 ÷ 160 км без підзарядки. Однак автовиробники бачать за електромобілями майбутнє, звичайно відразу після вирішення проблем з акумуляторами [60].

Електротранспорт - вид транспорту, що використовує як джерело енергії електрика, а в приводі використовується - тяговий електродвигун. Його основними перевагами перед транспортом з двигунами зовнішнього або внутрішнього згоряння є більш висока продуктивність і екологічність [61].

Енергія, що приводить в рух транспортний засіб, може бути отримана з декількох джерел:

?з хімічної енергії бортових акумуляторів (електромобіль, електробус);

?спільно з бортового акумулятора і паливної силової установки (гібридний автомобіль);

?вироблятися на борту, використовуючи бензиновий двигун або дизельний двигун (тепловоз, кар'єрний самоскид);

?вироблятися на борту, використовуючи паливні елементи;

?вироблятися на борту, використовуючи атомну енергію (атомний підводний човен, авіаносець);

?з більш екзотичних джерел, таких як маховики, вітер і сонце (гіробуси, електромобілі на сонячних батареях);

?шляхом прямого підключення до наземної електростанції через підстанції (трамвай, тролейбус, монорельсові, метро, електропоїзд, електровоз).

Одним з основних факторів, що визначають поява зручного для споживача електротранспорту, є енергетична установка, основою якої є джерело струму.

Основними галузями використання є:

?пасажирський електротранспорт (рис. 3.1). У розвинених країнах електротранспорт є основним перевізником пасажирів всередині міста, на його частку припадає понад 50 % перевезень. У країнах відсоток перевезень електротранспортом у містах становить від 15 %. Основними засобами міського пасажирського електротранспорту є трамваї, тролейбуси, метрополітен, електропоїзди, застосовуються так само монорельсові, фунікулери;

?вантажний електротранспорт (рис. 3.2) застосовується у перевезеннях, що вимагають великого ККД транспортного засобу, наприклад вантажні тролейбуси застосовуються на відкритих кар'єрах, а електропоїзди і електровози постійного і змінного струму використовуються на залізницях. Також до вантажного електротранспорту належать електрокари, електровізки, електротягачі, електронавантажувачі, деякі види самохідних кранів та екскаваторів;

?інші види електротранспорту (рис. 3.3). Практично будь неелектричних двигун можна замінити електричним. Відповідно будь-який транспортний засіб використовує для руху неелектричних двигун (ДВЗ, дизельний двигун, паровий двигун та інші) може використовувати як тяги і електричний двигун. Існують у вигляді розробок, дрібних копій або серій різні електротранспорт засоби: літаки на електричній тязі, електромобілі, гіробуси, електробуси, електричні підводні човни.

Рисунок 3.1 - Трамвай «71-605РМ»


Рисунок 3.2 - Електрокара «Балканкар ЕП 001»


Рисунок 3.3 - Електромобіль «Tesla Model S»


Переваги використання електротранспорту:

?екологічність - абсолютна відсутність шкідливих викидів в атмосферу;

?знижений рівень шуму - за рахунок меншої кількості рухомих частин і механічних передач;

?можливість вирішення проблеми «енергетичного піку» за рахунок підзарядки акумулятора в нічний час;

?низька пожежо- і вибухонебезпечність при аварії.

Найбільш широко в даний час використовується промисловий електротранспорт. Це обумовлено рядом вимог, що пред'являються до промислових виробництв (особливо в сфері харчової промисловості), а також тим, що в даному випадку джерело струму завжди під рукою.

За статистикою 2002-2004 років в Європі частка електронавантажувачів серед всіх використовуваних навантажувачів склала трохи менше половини. За оцінками Амброджіо Болліні, президента Федерації європейських виробників підйомного устаткування FEM, в минулому році у всьому світі було продано в цілому близько 350 тис. навантажувачів з противагою.

Статистичні дані продажів в Європі свідчать про те, що за останні 20 років їх частка збільшилася майже на 10 % (з 37,5 % у 1994 р. до 49,5 % у 2014 р.; в наступні роки виробництво навантажувачів у зв'язку з несприятливою економічною ситуацією дещо знизилося). Ситуація в світі в цілому дещо інша: ринок навантажувачів з ДВЗ приблизно вдвічі більше ринку електроприводних машин. В Японії та США частка електронавантажувачів складає поки лише 30 % всього ринку вилкових навантажувачів з противагою (у всій Азії - приблизно 26 %), але й тут спостерігається тенденція до поступового збільшення споживання техніки з електроприводом.

Крім того, сучасний електротранспорт, крім очевидної екологічності має і економічні переваги. Виходячи з сьогоднішніх цін на бензин, витрати на паливо/енергію у електробуса в 5,5 разів менше ніж у традиційного автобуса з ДВЗ.

Технічне обслуговування електробуса також дешевше, ніж у аналогічного автобуса з ДВЗ: у електробуса відсутній ДВЗ, немає необхідності його обслуговування, заміни масла, фільтрів, свічок внутрішнього згоряння. Електробус має більш високу початкову вартість у порівнянні з автобусом з ДВЗ, але за рахунок більш низьких експлуатаційних витрат, термін окупності у них однаковий.


.2 Автоматизація процесів і дистанційне управління як засіб підвищення безпеки праці


У затверджених Міністерством праці та соціального розвитку України рекомендаціях з планування заходів з охорони праці впровадження систем (пристроїв) автоматичного і дистанційного регулювання виробничого обладнання, технологічних процесів, підйомних і транспортних пристроїв, застосування промислових роботів в небезпечних і шкідливих виробництвах відповідно до вимог стандартів - одна з першочергових заходів у забезпеченні безпеки працюючих.

Автоматизація виробничих процесів передбачає використання таких засобів управління роботою машин і устаткування, за допомогою яких можна виконувати технологічний процес за заздалегідь заданим режимом, в певній послідовності і з встановленою продуктивністю без фізичних зусиль людини, але в основному під його контролем.

Розрізняють часткову, комплексну і повну автоматизацію. Автоматизацію однієї або декількох не зв'язаних операцій виробничого процесу називають частковою. Її застосовують у випадках, коли безпосереднє управління складним швидкоплинним процесом стає практично недоступним для людини або коли процес ведеться в умовах, небезпечних для життя.

При комплексної автоматизації всі ланки виробничого процесу діють в автоматичному режимі як єдине ціле, а людина контролює їх роботу.

При повній автоматизації присутність людини виключено з процесу управління виробництвом і його функції виконують машини. У цьому випадку помилки, які може допустити оператор, виключаються.

Дистанційне керування призначене для керування технологічними процесами або виробничим обладнанням з робочих місць, розташованих за межами небезпечної зони. При цьому оператор спостерігає за ходом виконання робіт візуально або за допомогою засобів сигналізації. Пристрої дистанційного керування виготовляють в стаціонарному та пересувному варіантах. За принципом дії їх поділяють на механічні, гідравлічні, пневматичні, електричні і комбіновані. Їх вибирають з урахуванням конструкції обладнання, ступеня небезпеки виробничого фактору, необхідності точного дотримання дистанції та ін. Механічні пристрої використовують при розташуванні обладнання на відносно невеликій відстані від пульта управління. Найбільш поширені електричні системи дистанційного керування через простоту їх влаштування та без інерційних. У сільському господарстві застосовують дистанційне управління на самохідних зернозбиральних комбайнах, при експлуатації зерноочисного, кормороздавачів, доїльних установок, а також при виконанні процесів, пов'язаних з використанням легкозаймистих, вибухонебезпечних і токсичних речовин (при забарвленні машин, нанесенні захисних покриттів, протравлюваних насіння та ін.) [62].


.3 Забезпечення вимог охорони праці при експлуатації та ремонті електричних транспортних засобів


Через широке використання електротранспорту слід приділити дуже важливе значення щодо охорони праці і техніки безпеки працівників, що їх експлуатують та ремонтують.

Охорона праці та техніка безпеки при ремонті та експлуатації акумуляторних батарей. При обслуговуванні та ремонті акумуляторних батарей доводиться мати справу зі свинцем і його сполуками, що представляють собою повільно діючі отрути. Отруйна дія на організм свинцевої пилу, парів свинцю і його сполук, подразнюючу дію сірчаної кислоти на слизову оболонку і дихальні шляхи, опіки, заподіяні сірчаної кислотою при попаданні її на шкіру, вибухонебезпечність гримучого газу - все це вимагає від робочого акумуляторної майстерні суворого дотримання правил техніки безпеки.

Робочі акумуляторної майстерні повинні знати безпечні методи праці, для чого при вступі на роботу вони проходять вступний інструктаж, потім інструктаж на робочому місці і навчання основам техніки безпеки. Усі працівники акумуляторної майстерні незалежно від їх кваліфікації та стажу роботи не рідше одного разу на шість місяців проходять повторний інструктаж.

Для робочих акумуляторної майстерні дотримання правил техніки безпеки має особливо велике значення. Виділяється в процесі заряду батарей водень при певній концентрації утворює з киснем повітря «гримучий газ», який вибухає навіть від невеликої іскри.

При огляді акумуляторної батареї під час обслуговування можна використовувати тільки електричні переносні лампи із запобіжною сіткою щоб уникнути вибуху гримучого газу. Перед постановкою акумуляторної батареї на заряд необхідно прочистити вентиляційні отвори і вивернути пробки, щоб не допустити скупчення усередині елементів великої кількості гримучого газу, що приводить до розриву кришок акумуляторів [63].

При плавці свинцю оксиди, що утворюються на його поверхні, потрібно видаляти металевої шумівкою і скидати в ящик з щільно закритою кришкою. Відкривати кришку слід тільки під час скидання оксидів. Працювати мокрим черпаком або заливати свинець у сирі, непрогріті форми забороняється.

При литві свинцевих деталей охолоджувати їх водою категорично забороняється, тому що вода, потрапляючи в розплавлений свинець, інтенсивно випаровується і захоплює за собою частки свинцю, які при попаданні на шкіру можуть заподіяти опіки. Для захисту від опіків при роботі з розплавленим свинцем робітник повинен надягати захисний гумовий фартух, гумові рукавички, гумові напівчоботи і захисні окуляри.

Для поліпшення загальних умов праці приміщення майстерні має бути обладнане добре працюючою вентиляцією з обов'язковим пристроєм відсмоктувачів на кожному робочому місці, де виконуються виробничі операції, пов'язані з виділенням пилу, свинцю і його оксидів. Швидкість всмоктування повітря в прийомних отворах витяжних пристроїв повинна бути 1,5 ÷ 4 м/с; вентиляція повинна забезпечувати в приміщенні шести - восьмикратний обмін повітря в одну годину.

Особливо активно виділяються пари при розплавлені свинцю електричною дугою. Всі роботи необхідно проводити в респіраторі. На робочих місцях з ремонту електродів, литві свинцевих деталей і збірці акумуляторних батарей слід користуватися респіратором марок РПГ-67, У-2К, Ф-62Ш, «Лепесток-200».

При заміні пластин одяг і руки робочого постійно забруднюються сполуками свинцю, тому необхідно працювати в бавовняному костюмі з кислотостійкої просоченням, гумовому фартухі і рукавичках.

При приготуванні заливальної мастики і при роботі з нею треба побоюватися опіків. Крім того, від постійного зіткнення з маслом, що входять до складу мастики, з'являються шкірні захворювання, тому перед початком роботи необхідно змащувати руки вазеліном.

При свердлильних операціях можна користуватися тільки електродрилі, які розраховані на напругу не вище 220 В. До роботи з електродрилем можуть бути допущені тільки ті робітники, які засвоїли правила техніки безпеки при роботі з електроінструментами. Ручка електродрилі та введення живильних проводів повинні бути надійно ізольовані, а вимикач повинен знаходитися тільки на електродрилі. Корпус електродрилі повинен бути заземлений ізольованим проводом перерізом не менше 2,5 см2. При роботі з електродрилем слід застосовувати захисні засоби: гумові рукавички, калоші, гумовий килимок або ізолюючу підставку (при напрузі, рівному 36 В, користуватися калошами або рукавичками слід тільки при роботі в сирих приміщеннях). Користуючись електродрилем, не можна допускати перевантаження двигуна і перекосу свердла.

Якщо електродриль розрахована на напругу 36 В, то для зниження напруги потрібно застосовувати тільки двох обмотувальний трансформатор; використовувати в цьому випадку автотрансформатори або реостати забороняється. Металевий корпус трансформатора і один з висновків обмотки з боку низької напруги повинні бути заземлені.

Штепсельне з'єднання мережі напругою 36 В і нижче повинно виключати можливість включення його в ланцюг більш високої напруги.

Акумуляторні батареї, підготовлені до заряду, повинні бути з'єднані за допомогою щільно прилеглих затискачів або наконечників, що забезпечують надійний електричний контакт і виключають можливість іскріння. Забороняється з'єднувати акумуляторні батареї дротом, так як іскра, що утворилася в результаті поганого контакту, може викликати вибух газів, що виділяються при заряді батарей. При вибуху електроліт розбризкується і може потрапити на шкіру або одяг. При заряді батарей необхідно відкривати заливальні отвори.

Стан акумуляторної батареї слід перевіряти тільки вилкою навантаження і денсиметром. Перевіряти батареї коротким замиканням категорично забороняється.

При роботі з вилкою навантаження, щоб уникнути опіку не слід торкатися до опору вилки. Забороняється заміряти напругу на клемах акумулятора вилкою навантаження при заряді через можливе іскріння і вибуху газів.

Приєднувати і від'єднувати акумуляторні батареї при заряді дозволяється тільки після відключення зарядної мережі. Заряд акумуляторних батарей повинен здійснюватися тільки при працюючій витяжної вентиляції.

Транспортувати акумуляторні батареї необхідно тільки на спеціальних візках.

У приміщеннях зарядного відділення забороняється палити та користуватися відкритим вогнем.

Охорона праці та техніка безпеки при виконанні авто-слюсарських робіт. Охорона праці автослюсаря - це комплекс заходів, спрямований на забезпечення безпеки співробітника в ході виконання ним посадових обов'язків. Існуючі вимоги закріплені в документації, затвердженої на державному рівні.

Слюсар повинен дотримуватися вимог інструкції з охорони праці, розроблених з урахуванням вимог, викладених у типових інструкціях з охорони праці:

?при вивішуванні електротранспорту і роботі під ним;

?при знятті і установці коліс електротранспорту;

?при пересуванні по території та виробничих приміщень автотранспортного підприємства;

?щодо попередження пожеж та запобігання опіків. Помітивши порушення вимог безпеки іншим працівником слюсар повинен попередити його про необхідність їх дотримання.

Слюсар повинен виконувати також вказівки представника спільного комітету (комісії) з охорони праці або уповноваженого (довіреної) особи з охорони праці профспілкового комітету.

Слюсар повинен знати і вміти надавати до лікарську допомогу потерпілому відповідно до типовою інструкцією з надання до лікарської допомоги при нещасних випадках [64].

Слюсар не приступить до виконання разових робіт, не пов'язаних з прямими обов'язками за фахом без отримання цільового інструктажу.

У процесі роботи слюсар зобов'язаний:

?виконувати тільки ту роботу, яка доручена адміністрацією;

?не приступали до нової (незнайомої) роботі без отримання від майстра інструктажу про безпечні способи її виконання;

?користуватися належної за нормам спецодягом, спецвзуттям, а при необхідності засобами індивідуального захисту (окулярами, маскою, респіраторами тощо). Не працювати в легкому взутті (тапочках, сандалях);

?утримувати в чистоті і порядку своє робоче місце - під ногами не повинно бути масла, деталей, заготовок, стружок, обрізків та інших відходів, не захаращувати проходи, проїзди; заготовки, вироби укладати в спеціально відведених місцях в стійкому положенні на прокладках і стелажах, при цьому висота штабелів повинна бути не більше 1 м;

?під час роботи бути уважним, не відволікатися і не відволікати інших;

?не допускати на робоче місце осіб, що не мають відношення до даної роботи. Без дозволу майстра не довіряти свою роботу іншому робітникові;

?помітивши порушення інструкції іншими робітниками чи небезпеку для оточуючих, не залишатися байдужими, а попередити робітника про небезпеку або про необхідність дотримання правил техніки безпеки;

?не мити руки в маслі, гасі і не витирати їх обтиральними матеріалами (дрантям), забрудненими стружкою. Використаний обтиральний матеріал зберігати в спеціально призначених для цього металевих ящиках.

Забороняється залучати до ремонту, обслуговування та запуску двигуна машин і устаткування осіб, що не мають до цього відношення.

Особам, які не мають прав керування автомобілем, трактором та іншими машинами на базі, перегонка всередині господарства, установка їх на пост технічного обслуговування та ремонту, а також перевірка гальм на ходу забороняється. Для цього необхідно викликати основного або чергового водія.

Перед ремонтом машини необхідно її очистити від пилу, бруду, кіптяви, масла, снігу. Збирання, очищення, ремонт і обслуговування машин і обладнання проводити при непрацюючому двигуні, за винятком регулювання системи живлення, перевірки електрообладнання двигуна, випробування гальм та перевірки роботи двигуна.

Злив масла, охолоджуючої рідини (води, антифризу) проводити лише в спеціальну тару. Тара для зливу та зберігання антифризу повинна мати чіткий напис «ЯД» і встановлений знак для отруйних речовин.

Для підйому, зняття, установки і транспортування важких (масою більше 20 кг) агрегатів, вузлів, деталей користуватися підйомно-транспортним устаткуванням і допоміжними пристосуваннями відповідної вантажопідйомності, на якому вам дозволено працювати.

Перед зняттям, установкою і викочуванням агрегатів і вузлів (задні і передні мости, ресори, колеса) підняти раму автомобіля або іншого транспортного устаткування до повного розвантаження ресор і встановити під раму спеціальні металеві упори (козелки) або ж викласти клітку з інвентарних брусів довжиною не менше 1 м.

Металеві упори (козелки) повинні мати достатню міцність, надійністю і стійкістю. Ніжки упорів повинні бути жорстко пов'язані між собою і мати на кінцях опорні площадки.

Охорона праці та техніка безпеки при експлуатації електротранспортних засобів. До робіт на наземному електротранспорті допускаються особи не молодші 18 років, що пройшли медичний огляд, вступний інструктаж, інструктаж і навчання на робочому місці, перевірку знань з охорони праці відповідно до положення про порядок навчання та перевірки знань з охорони праці керівників, спеціалістів і робітників підприємств, установ і організацій зв'язку, які мають групу з електробезпеки не нижче III. Керівник робіт повинен мати групу з електробезпеки не нижче IV.

У кожному конкретному випадку кількісний склад бригади визначає керівник робіт. Роботи виконуються за нарядом.

Кожен працівник повинен бути забезпечений спеціальним одягом та засобами індивідуального захисту відповідно до «Типових галузевих норм безплатної видачі спеціального одягу, спеціального взуття та інших засобів індивідуального захисту».

Прийняти транспортні засоби, провести їх детальний огляд, перевірити справність, наявність огороджень, надійне функціонування пускових, гальмових, запірних пристроїв, сигналізації тощо.

Ознайомитися із записом у журналі про стан транспортних засобів. Якщо виявлено недоліки, зробити запис у журналі і до їх усунення до роботи не приступати.

До роботи в якості водія електротранспорту допускаються особи які досягли віку 21 рік, які пройшли медичну комісію, навчання у встановленому порядку і мають свідоцтво про присвоєння кваліфікації водія тролейбуса, посвідчення водія на право керування електротранспортом, посвідчення про присвоєння ІІІ групи з електробезпеки на право самостійної роботи в електроустановках до 1000 В.

Забороняється:

?передавати управління електрокаром або електронавантажувачем іншій особі, що не має відповідного права і без дозволу адміністрації;

?перевозити на електрокарі і електронавантажувачі людей;

?працювати на несправному електрокарі або електронавантажувачі;

?торкатися до оголених струмоведучих частин (клем акумуляторної батареї, щитка);

?класти дроти акумулятора на корпус електронавантажувача або електрокара;

?експлуатувати електронавантажувачі або електрокари на нерівних і не мають твердого покриття (бетон, асфальтобетон, дощата підлога) проїздах.

Отримати під розписку транспортні засоби та завдання на виконання роботи. Одягнути спецодяг і привести її в порядок.

Ретельно оглянути електрокар або електронавантажувачів, перевіряти правильність переключення швидкостей, справність звукового сигналу, електрозамку, рульового управління, гальм, напруга (переносним вольтметром) і надійність контактів акумуляторної батареї [65].

Перевірити:

?чи немає течі з акумуляторної батареї, з гідросистеми нахилу і підйому, з картера ведучого моста, з гідравлічного приводу гальмівної системи;

?наявність діелектричного килимка на майданчику водія, що не пошкоджена чи ізоляція рукояток важеля управління, чи є запобіжні скоби на важелях і огорожах для захисту ніг;

?роботу механізму підйому і нахилу. при виявленні недостатньої кількості рідини в гальмівному циліндрі додати гальмівну рідину того ж складу. Слід пам'ятати, що добавка найменшого кількості мінерального масла в гальмівну систему виведе з ладу всі гумові деталі;

?справність дії гальм. Електронавантажувач або електрокар з робочим навантаженням повинні зупинятися на наступному відстані від початку гальмування: при швидкості до 5 км/год - 1,5 м; до 3,5 км/год - 1 м; до 1,5 км/год - 0,5 м.

Після перевірки закрити щільно всі огорожі, пробки і кришки. Повідомити адміністрації про неправильну роботу гальма (неповне гальмування або бездіяльність), іскрінні двигуна, контролера, відсутності сигналу, про несправності рульового управління і будь-яких інших систем і до усунення неполадок до роботи не приступати.


Висновки


У результаті виконанні дипломної роботи було досягнути такі результати:

?проведено аналіз галузей можливого використання автономних транспортних засобів;

?виконаний аналізу галузь використання ДУМ;

?виявлені переваги та недоліки існуючих розробок у цій сфері;

?сформульовані головні задачі створення про типу ДУМ у рамках дипломного проекту;

?аналіз і вибір апаратної частини, каналу звязку і ОС для керування ДУМ;

?сформовані основні вимоги до програмного забезпечення.

Проведено аналіз галузей можливого використання електричних транспортних засобів з ДУМ. Електромобілі з ДУ дуже широко використовуються в військовому озброєнні, перевезення вантажів, на виробництві, при ліквідацій аварій і гасінні пожеж, а також широко використовуються для вивчення космлсу і інших планет.

В даний час за ДУМ використовують для: дотставка вантажу та озброєння, гасіння пожеж, ліквідація пожеж, ліквідація вибухонебезпечни речовин, ліквідація радіаційного пилу і небезпечних речовин, розмінування мін, демонтаж споруд і т. д..

Проаналізувавши існуючі аналоги можна сказати, що вони мають велику кількість як переваг так і недоліків. До переваг можна віднести:

?наявність пульту ДУ, що дає змогу як керувати ДУМ на відстані так і зберегти життя людини-оператора.

До недоліків можна віднести:

?відсутність маневреності, в основному дані машини є неповороткими, що не дає їм змогу працювати м невеликих приміщеннях;

?універсальність застосування, більшість проаналізованих ДУМ є вузько спеціалізованими, що накладує велику проблему в їх використанні;

?висока собівартість виробництва і подальшої експлуатації;

?екологічність, тобто велика кількість ДУМ працюють на ДВЗ, що є одним з найбільших забрудників атмосферного повітря. Вирішення є використання транспортних засобів з електродвигунами;

Було сформульовано основні вимоги до майбутнього транспортного засобу:

?маневреність, можливість швидко змінювати швидкість і напрямок руху на місцевості;

?наявність ДК, управління технологічними об'єктами і системами на відстані шляхом передачі до них каналами зв'язку сигналів для увімкнення відповідних пристроїв;

?універсальність застосування, тобто швидке дообладнання базового технічного рішення з метою використання в різних галузях людської діяльності.

Після формування основних вимог було здійснено вибір апаратної частини майбутнього про типу електричного транспортного засобу. В якості головної керуючої плати для системи дистанційного звязку було використано платформу Arduino Nano. Для передачі команд від керуючого пристрою до ДУМ було вирішено використовувати бездротову технологію Bluetooth, на базі Bluetooth-модуля HC-06. Для управління двигунами, швидкістю і напрямком руху ДУМ використано L298N-драйвер.

Також було розроблено ПЗ для системи дистанційного управління, котре включає в себе Android-додаток і програму для Arduino Nano. Дане ПЗ можу виконувати: вибір найкращого способу дистанційного управління, направлення руху транспортного засобу, швидкість, налаштування час руху транспортного засобу після втрати звязку.

Перелік посилань


1.Электрический Транспорт (Электротранспорт) - Основные Виды. // Electrikpro [Електронний ресурс]. - Режим доступу: URL: #"justify">Додаток А. Код програми для Arduino Nano


#include "EEPROM.h"

#define D1 2

#define M1 3

#define D2 4

#define M2 5

#define HORN 13

#define autoOFF 2500

#define cmdL 'L'

#define cmdR 'R'

#define cmdH 'H'

#define cmdF 'F'

#define cmdr 'r'

#define cmdw 'w'incomingByte;L_Data[4];L_index = 0;R_Data[4];R_index = 0;H_Data[1];H_index = 0;F_Data[8];F_index = 0;command;long currentTime, lastTimeCommand, autoOFF;setup()

{.begin(9600);(HORN, OUTPUT);(D1, OUTPUT);(D2, OUTPUT);.write(0,255);.write(1,255);.write(2,255);.write(3,255);_init();

}Timer_init()

{_t sw_autoOFF = EEPROM.read(0);(sw_autoOFF == '1')

{var_Data[3];_Data[0] = EEPROM.read(1);_Data[1] = EEPROM.read(2);_Data[2] = EEPROM.read(3);= atoi(var_Data)*100;if(sw_autoOFF == '0')= 999999;if(sw_autoOFF == 255)= 2500;= millis();loop()(Serial.available() > 0)= Serial.read();(incomingByte == cmdL)

{= cmdL;(L_Data,0,sizeof(L_Data));_index = 0;

}if(incomingByte == cmdR)

{= cmdR;(R_Data,0,sizeof(R_Data));_index = 0;

}if(incomingByte == cmdH)

{= cmdH;(H_Data,0,sizeof(H_Data));_index = 0;

}if(incomingByte == cmdF)

{= cmdF;(F_Data,0,sizeof(F_Data));_index = 0;

}if(incomingByte == '\r') command = 'e';if(incomingByte == '\t') command = 't';(command == cmdL && incomingByte != cmdL)

{_Data[L_index] = incomingByte;_index++;

}if(command == cmdR && incomingByte != cmdR)

{_Data[R_index] = incomingByte;_index++;

}if(command == cmdH && incomingByte != cmdH)_Data[H_index] = incomingByte;_index++;if(command == cmdF && incomingByte != cmdF)

{_Data[F_index] = incomingByte;_index++;

}if(command == 'e')_dum (atoi(L_Data),atoi(R_Data),atoi(H_Data));(10);if(command == 't')_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);= millis();(millis() >= (lastTimeCommand + autoOFF))_dum(0,0,0);Control_dum (int mLeft, int mRight, uint8_t Horn)

{directionL, directionR;valueL, valueR;(mLeft > 0)

{= mLeft;= 0;if(mLeft < 0)= 255 - abs(mLeft);= 1;

{= 0;= 0;(mRight > 0)= mRight;= 0;if(mRight < 0)= 255 - abs(mRight);= 1;= 0;= 0;

}(M1, valueL);(M2, valueR);(D1, directionL);(D2, directionR);(HORN, Horn);

}Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4)

{(FCMD == cmdr).print("FData:");.write(EEPROM.read(0));.write(EEPROM.read(1));.write(EEPROM.read(2));.write(EEPROM.read(3));.print("\r\n");

}if(FCMD == cmdw)

{.write(0,z1);.write(1,z2);.write(2,z3);.write(3,z4);_init();.print("FWOK\r\n");

}


Додаток Б Код програми для Android-додатку

.javacom.dum_car;android.app.Activity;android.os.Bundle;android.text.Html;android.text.method.LinkMovementMethod;android.widget.TextView;class ActivityAbout extends Activity

{

@Overridevoid onCreate(Bundle savedInstanceState)

{.onCreate(savedInstanceState);(R.layout.activity_about);tv = (TextView) findViewById(R.id.textView2);.setText(Html.fromHtml(getString(R.string.text_about)));.setMovementMethod(LinkMovementMethod.getInstance());

}

@Overridevoid onResume()

{.onResume();

@Overridevoid onPause()

{.onPause();

}.javacom.dum_car;com.dum_car.R;java.lang.ref.WeakReference;java.util.Locale;com.dum_car.cBluetooth;android.os.Bundle;android.os.Handler;android.os.Message;android.app.Activity;android.bluetooth.BluetoothAdapter;android.content.Context;android.content.Intent;android.hardware.Sensor;android.hardware.SensorEvent;android.hardware.SensorEventListener;android.hardware.SensorManager;android.util.Log;android.view.View;android.view.View.OnClickListener;android.widget.TextView;android.widget.Toast;android.widget.ToggleButton;android.content.SharedPreferences;android.preference.PreferenceManager;class ActivityAccelerometer extends Activity implements SensorEventListener

{SensorManager mSensorManager;Sensor mAccel;cBluetooth bl = null;ToggleButton LightButton;int xAxis = 0;int yAxis = 0;int motorLeft = 0;int motorRight = 0;String address;boolean show_Debug;boolean BT_is_connect;int xMax;int yMax;int yThreshold;int pwmMax;int xR;String commandLeft;String commandRight;String commandHorn;

@Overridevoid onCreate(Bundle savedInstanceState)

{.onCreate(savedInstanceState);(R.layout.activity_accelerometer);= (String) getResources().getText(R.string.default_MAC);= Integer.parseInt((String) getResources().getText(R.string.default_xMax));= Integer.parseInt((String) getResources().getText(R.string.default_xR));= Integer.parseInt((String) getResources().getText(R.string.default_yMax));= Integer.parseInt((String) getResources().getText(R.string.default_yThreshold));= Integer.parseInt((String) getResources().getText(R.string.default_pwmMax));= (String) getResources().getText(R.string.default_commandLeft);= (String) getResources().getText(R.string.default_commandRight);= (String) getResources().getText(R.string.default_commandHorn);();= (SensorManager) getSystemService(Context.SENSOR_SERVICE);= mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);= new cBluetooth(this, mHandler);.checkBTState();= (ToggleButton) findViewById(R.id.LightButton);.setOnClickListener(new OnClickListener()

{void onClick(View v)(LightButton.isChecked())

if(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"1\r"));

else

if(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"0\r"));

}.postDelayed(sRunnable, 600000);

}static class MyHandler extends Handlerfinal WeakReference<ActivityAccelerometer> mActivity;MyHandler(ActivityAccelerometer activity)

{= new WeakReference<ActivityAccelerometer>(activity);

}

@Overridevoid handleMessage(Message msg)activity = mActivity.get();(activity != null)(msg.what)cBluetooth.BL_NOT_AVAILABLE:.d(cBluetooth.TAG, "Bluetooth is not available. Exit");.makeText(activity.getBaseContext(), "Bluetooth is not available", Toast.LENGTH_SHORT).show();.finish();;cBluetooth.BL_INCORRECT_ADDRESS:.d(cBluetooth.TAG, "Incorrect MAC address");.makeText(activity.getBaseContext(), "Incorrect Bluetooth address", Toast.LENGTH_SHORT).show();;cBluetooth.BL_REQUEST_ENABLE:.d(cBluetooth.TAG, "Request Bluetooth Enable");.getDefaultAdapter();enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);.startActivityForResult(enableBtIntent, 1);;cBluetooth.BL_SOCKET_FAILED:.makeText(activity.getBaseContext(), "Socket failed", Toast.LENGTH_SHORT).show();;

}final MyHandler mHandler = new MyHandler(this);final static Runnable sRunnable = new Runnable()void run() { }

};void onSensorChanged(SensorEvent e)

{directionL = "";directionR = "";cmdSendL,cmdSendR;= Math.round(e.values[0]*pwmMax/xR);= Math.round(e.values[1]*pwmMax/yMax);(xAxis > pwmMax) xAxis = pwmMax;if(xAxis < -pwmMax) xAxis = -pwmMax;(yAxis > pwmMax) yAxis = pwmMax;if(yAxis < -pwmMax) yAxis = -pwmMax;if(yAxis >= 0 && yAxis < yThreshold) yAxis = 0;if(yAxis < 0 && yAxis > -yThreshold) yAxis = 0;(xAxis > 0)

{= yAxis;(Math.abs(Math.round(e.values[0])) > xR)= Math.round((e.values[0]-xR)*pwmMax/(xMax-xR));= Math.round(-motorLeft * yAxis/pwmMax);

}motorLeft = yAxis - yAxis*xAxis/pwmMax;if(xAxis < 0)

{= yAxis;(Math.abs(Math.round(e.values[0])) > xR)= Math.round((Math.abs(e.values[0])-xR)*pwmMax/(xMax-xR));= Math.round(-motorRight * yAxis/pwmMax);motorRight = yAxis - yAxis*Math.abs(xAxis)/pwmMax;if(xAxis == 0)= yAxis;= yAxis;(motorLeft > 0)= "-";

}(motorRight > 0)= "-";= Math.abs(motorLeft);= Math.abs(motorRight);(motorLeft > pwmMax) motorLeft = pwmMax;(motorRight > pwmMax) motorRight = pwmMax;= String.valueOf(commandLeft+directionL+motorLeft+"\r");= String.valueOf(commandRight+directionR+motorRight+"\r");(BT_is_connect) bl.sendData(cmdSendL+cmdSendR);textX = (TextView) findViewById(R.id.textViewX);textY = (TextView) findViewById(R.id.textViewY);mLeft = (TextView) findViewById(R.id.mLeft);mRight = (TextView) findViewById(R.id.mRight);textCmdSend = (TextView) findViewById(R.id.textViewCmdSend);(show_Debug)

{.setText(String.valueOf("X:" + String.format("%.1f",e.values[0]) + "; xPWM:"+xAxis));.setText(String.valueOf("Y:" + String.format("%.1f",e.values[1]) + "; yPWM:"+yAxis)).setText(String.valueOf("MotorL:" + directionL + "." + motorLeft)).setText(String.valueOf("MotorR:" + directionR + "." + motorRight));.setText(String.valueOf("Send:" + cmdSendL.toUpperCase(Locale.getDefault()) + cmdSendR.toUpperCase(Locale.getDefault())));

}

{.setText("");.setText("");.setText("");.setText("");.setText("");

}void loadPref()

{mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);= mySharedPreferences.getString("pref_MAC_address", address);= Integer.parseInt(mySharedPreferences.getString("pref_xMax", String.valueOf(xMax)));= Integer.parseInt(mySharedPreferences.getString("pref_xR", String.valueOf(xR)));= Integer.parseInt(mySharedPreferences.getString("pref_yMax", String.valueOf(yMax)));= Integer.parseInt(mySharedPreferences.getString("pref_yThreshold", String.valueOf(yThreshold)));= Integer.parseInt(mySharedPreferences.getString("pref_pwmMax", String.valueOf(pwmMax)));_Debug = mySharedPreferences.getBoolean("pref_Debug", false);= mySharedPreferences.getString("pref_commandLeft", commandLeft);= mySharedPreferences.getString("pref_commandRight", commandRight);= mySharedPreferences.getString("pref_commandHorn", commandHorn);

}

@Overridevoid onResume()

{.onResume();_is_connect = bl.BT_Connect(address, false);.registerListener(this, mAccel, SensorManager.SENSOR_DELAY_NORMAL);

}

@Overridevoid onPause()

{.onPause();.BT_onPause();.unregisterListener(this);

}

@Overridevoid onActivityResult(int requestCode, int resultCode, Intent data)

{();void onAccuracyChanged(Sensor arg0, int arg1) { }

}.javacom.dum_car;com.dum_car.cBluetooth;com.dum_car.R;java.lang.ref.WeakReference;android.app.Activity;android.bluetooth.BluetoothAdapter;android.content.Intent;android.content.SharedPreferences;android.os.Bundle;android.os.Handler;android.os.Message;android.preference.PreferenceManager;android.util.Log;android.view.View;android.view.View.OnClickListener;android.view.View.OnTouchListener;android.view.MotionEvent;android.widget.Button;android.widget.Toast;android.widget.ToggleButton;class ActivityButtons extends Activity

{cBluetooth bl = null;ToggleButton LightButton;Button btn_forward, btn_backward, btn_left, btn_right;int motorLeft = 0;int motorRight = 0;String address;int pwmBtnMotorLeft;int pwmBtnMotorRight;String commandLeft;String commandRight;String commandHorn;boolean BT_is_connect;

@Overridevoid onCreate(Bundle savedInstanceState)

{.onCreate(savedInstanceState);(R.layout.activity_buttons);= (String) getResources().getText(R.string.default_MAC);= nteger.parseInt((String)getResources().getText(R.string.default_pwmBtnMotorLeft));= Integer.parseInt((String)getResources().getText(R.string.default_pwmBtnMotorRight));= (String) getResources().getText(R.string.default_commandLeft);= (String) getResources().getText(R.string.default_commandRight);= (String) getResources().getText(R.string.default_commandHorn);();= new cBluetooth(this, mHandler);.checkBTState();_forward = (Button) findViewById(R.id.forward);_backward = (Button) findViewById(R.id.backward);_left = (Button) findViewById(R.id.left);_right = (Button) findViewById(R.id.right);_forward.setOnTouchListener(new OnTouchListener()

{boolean onTouch(View v, MotionEvent event)(event.getAction() == MotionEvent.ACTION_MOVE)= pwmBtnMotorLeft;= pwmBtnMotorRight;(BT_is_connect) bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));

}if (event.getAction() == MotionEvent.ACTION_UP)

{= 0;= 0;(BT_is_connect)bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));

}false;_left.setOnTouchListener(new OnTouchListener()

{boolean onTouch(View v, MotionEvent event)(event.getAction() == MotionEvent.ACTION_MOVE)= -pwmBtnMotorLeft;= pwmBtnMotorRight;(BT_is_connect) bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));if (event.getAction() == MotionEvent.ACTION_UP)

{= 0;= 0;(BT_is_connect) bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));false;

}_right.setOnTouchListener(new OnTouchListener()

{boolean onTouch(View v, MotionEvent event)(event.getAction() == MotionEvent.ACTION_MOVE)= pwmBtnMotorLeft;= -pwmBtnMotorRight;(BT_is_connect) bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));

}if (event.getAction() == MotionEvent.ACTION_UP)

{= 0;= 0;(BT_is_connect) bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));false;_backward.setOnTouchListener(new OnTouchListener()

{boolean onTouch(View v, MotionEvent event)(event.getAction() == MotionEvent.ACTION_MOVE)= -pwmBtnMotorLeft;= -pwmBtnMotorRight;(BT_is_connect) bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));

}if (event.getAction() == MotionEvent.ACTION_UP)= 0;= 0;(BT_is_connect) bl.sendData(String.valueOf(commandLeft+motorLeft+"\r"+commandRight+motorRight+"\r"));false;= (ToggleButton) findViewById(R.id.LightButton);.setOnClickListener(new OnClickListener()

{void onClick(View v)(LightButton.isChecked())(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"1\r"));

}(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"0\r"));.postDelayed(sRunnable, 600000);static class MyHandler extends Handler

{final WeakReference<ActivityButtons> mActivity;MyHandler(ActivityButtons activity)= new WeakReference<ActivityButtons>(activity);

}

@Overridevoid handleMessage(Message msg)

{activity = mActivity.get();(activity != null)(msg.what)cBluetooth.BL_NOT_AVAILABLE:.d(cBluetooth.TAG, "Bluetooth is not available. Exit");.makeText(activity.getBaseContext(), "Bluetooth is not available", Toast.LENGTH_SHORT).show();.finish();;cBluetooth.BL_INCORRECT_ADDRESS:.d(cBluetooth.TAG, "Incorrect MAC address");.makeText(activity.getBaseContext(), "Incorrect Bluetooth address", Toast.LENGTH_SHORT).show();;cBluetooth.BL_REQUEST_ENABLE:.d(cBluetooth.TAG, "Request Bluetooth Enable");.getDefaultAdapter();enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);.startActivityForResult(enableBtIntent, 1);;cBluetooth.BL_SOCKET_FAILED:.makeText(activity.getBaseContext(), "Socket failed", Toast.LENGTH_SHORT).show();;

}final MyHandler mHandler = new MyHandler(this);final static Runnable sRunnable = new Runnable()

{void run() { }

};void loadPref()

{mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);= mySharedPreferences.getString("pref_MAC_address", address);=Integer.parseInt(mySharedPreferences.getString("pref_pwmBtnMotorLeft",String.valueOf(pwmBtnMotorLeft)));= Integer.parseInt(mySharedPreferences.getString("pref_pwmBtnMotorRight", String.valueOf(pwmBtnMotorRight)));= mySharedPreferences.getString("pref_commandLeft", commandLeft);= mySharedPreferences.getString("pref_commandRight", commandRight);= mySharedPreferences.getString("pref_commandHorn", commandHorn);

}

@Overridevoid onResume()

{.onResume();_is_connect = bl.BT_Connect(address, false);

}

@Overridevoid onPause()

{.onPause();.BT_onPause();

}

@Overridevoid onActivityResult(int requestCode, int resultCode, Intent data)

{();

}.javacom.dum_car;java.lang.ref.WeakReference;java.text.DecimalFormat;android.app.Activity;android.bluetooth.BluetoothAdapter;android.content.Intent;android.content.SharedPreferences;android.os.Bundle;android.os.Handler;android.os.Message;android.preference.PreferenceManager;android.util.Log;android.view.View;android.view.View.OnClickListener;android.widget.Button;android.widget.CheckBox;android.widget.CompoundButton;android.widget.EditText;android.widget.Toast;class ActivityMCU extends Activity

{cBluetooth bl = null;Button btn_flash_Read, btn_flash_Write;static CheckBox cb_AutoOFF;static EditText edit_AutoOFF;static String flash_success;static String error_get_data;String address;static StringBuilder sb = new StringBuilder();

@Overridevoid onCreate(Bundle savedInstanceState)

{.onCreate(savedInstanceState);(R.layout.activity_mcu);= (String) getResources().getText(R.string.default_MAC);_flash_Read = (Button) findViewById(R.id.flash_Read);_flash_Write = (Button) findViewById(R.id.flash_Write);_AutoOFF = (CheckBox) findViewById(R.id.cBox_AutoOFF);_AutoOFF = (EditText) findViewById(R.id.AutoOFF);_success = (String) getResources().getText(R.string.flash_success);_get_data = (String) getResources().getText(R.string.error_get_data);();= new cBluetooth(this, mHandler);.checkBTState();_AutoOFF.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()

{void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

{(isChecked) edit_AutoOFF.setEnabled(true);if (!isChecked) edit_AutoOFF.setEnabled(false);

}_flash_Read.setOnClickListener(new OnClickListener()

{void onClick(View v).sendData(String.valueOf("Fr\t"));

}_flash_Write.setOnClickListener(new OnClickListener()

{void onClick(View v)num1 = 0;str_to_send = "Fw";(cb_AutoOFF.isChecked())_to_send += "1";

}str_to_send += "0";

{= Float.parseFloat(edit_AutoOFF.getText().toString());(NumberFormatException e)err_data_entry = getString(R.string.err_data_entry); .makeText(getBaseContext(), err_data_entry, Toast.LENGTH_SHORT).show();

}(num1 > 0 && num1 < 100)

{myFormatter = new DecimalFormat("00.0");output = myFormatter.format(num1);_to_send+=String.valueOf(output.charAt(0))+String.valueOf(output.charAt(1)) +String.valueOf(output.charAt(3));_to_send += "\t";.d(cBluetooth.TAG, "Send Flash Op:" + str_to_send);.sendData(str_to_send);

}

{err_range = getString(R.string.mcu_error_range); .makeText(getBaseContext(), err_range, Toast.LENGTH_SHORT).show();

}.postDelayed(sRunnable, 600000);

}static class MyHandler extends Handler

{final WeakReference<ActivityMCU> mActivity;MyHandler(ActivityMCU activity) {= new WeakReference<ActivityMCU>(activity);

}

@Overridevoid handleMessage(Message msg)

{activity = mActivity.get();(activity != null)

{(msg.what)

{cBluetooth.BL_NOT_AVAILABLE:.d(cBluetooth.TAG, "Bluetooth is not available. Exit");.makeText(activity.getBaseContext(), "Bluetooth is not available", Toast.LENGTH_SHORT).show();.finish();;cBluetooth.BL_INCORRECT_ADDRESS:.d(cBluetooth.TAG, "Incorrect MAC address");.makeText(activity.getBaseContext(), "Incorrect Bluetooth address", Toast.LENGTH_SHORT).show();;cBluetooth.BL_REQUEST_ENABLE:.d(cBluetooth.TAG, "Request Bluetooth Enable");.getDefaultAdapter();enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);.startActivityForResult(enableBtIntent, 1);;cBluetooth.BL_SOCKET_FAILED:.makeText(activity.getBaseContext(), "Socket failed", Toast.LENGTH_SHORT).show();.finish();;cBluetooth.RECIEVE_MESSAGE:[] readBuf = (byte[]) msg.obj;strIncom = new String(readBuf, 0, msg.arg1);.append(strIncom);FDataLineIndex = sb.indexOf("FData:");FWOKLineIndex = sb.indexOf("FWOK");endOfLineIndex = sb.indexOf("\r\n");(FDataLineIndex >= 0 && endOfLineIndex > 0 && endOfLineIndex > FDataLineIndex)

{sbprint = sb.substring("FData:".length(), endOfLineIndex);(sbprint.substring(0, 1).equals("1")) cb_AutoOFF.setChecked(true);cb_AutoOFF.setChecked(false);edit_data_AutoOFF = Float.parseFloat(sbprint.substring(1, 4))/10;_AutoOFF.setText(String.valueOf(edit_data_AutoOFF));.delete(0, sb.length());

}if (FWOKLineIndex >= 0 && endOfLineIndex > 0 && endOfLineIndex > FWOKLineIndex) {.makeText(activity.getBaseContext(), flash_success, Toast.LENGTH_SHORT).show();.delete(0, sb.length());

}if(endOfLineIndex > 0)

{.makeText(activity.getBaseContext(), error_get_data, Toast.LENGTH_SHORT).show();.delete(0, sb.length());

};

}final MyHandler mHandler = new MyHandler(this);final static Runnable sRunnable = new Runnable()

{void run() { }

};void loadPref()

{mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);= mySharedPreferences.getString("pref_MAC_address", address);

}

@Overridevoid onResume()

{.onResume();(cb_AutoOFF.isChecked()) edit_AutoOFF.setEnabled(true);edit_AutoOFF.setEnabled(false);.BT_Connect(address, true);

}

@Overridevoid onPause()

{.onPause();.BT_onPause();

}

@Overridevoid onActivityResult(int requestCode, int resultCode, Intent data)

{();

}.javacom.dum_car;com.dum_car.cBluetooth;com.dum_car.R;java.lang.ref.WeakReference;android.app.Activity;android.bluetooth.BluetoothAdapter;android.content.Context;android.content.Intent;android.content.SharedPreferences;android.graphics.Canvas;android.graphics.Color;android.graphics.Paint;android.graphics.Paint.Style;android.os.Bundle;android.os.Handler;android.os.Message;android.preference.PreferenceManager;android.util.Log;android.view.MotionEvent;android.view.View;android.view.View.OnClickListener;android.view.ViewGroup.LayoutParams;android.widget.Toast;android.widget.ToggleButton;class ActivityTouch extends Activity {cBluetooth bl = null;final static int BIG_CIRCLE_SIZE = 120;final static int FINGER_CIRCLE_SIZE = 20;int motorLeft = 0;int motorRight = 0;

private String address;

private boolean show_Debug;

private boolean BT_is_connect;

private int xRperc;

private int pwmMax;

private String commandLeft;

private String commandRight;

private String commandHorn;

private String cmdSendL,cmdSendR;

@Overridevoid onCreate(Bundle savedInstanceState) {.onCreate(savedInstanceState);v1 = new MyView(this);(v1); = (String) getResources().getText(R.string.default_MAC);= Integer.parseInt((String) getResources().getText(R.string.default_xRperc));= Integer.parseInt((String) getResources().getText(R.string.default_pwmMax));= (String) getResources().getText(R.string.default_commandLeft);= (String) getResources().getText(R.string.default_commandRight);= (String) getResources().getText(R.string.default_commandHorn); (); = new cBluetooth(this, mHandler);.checkBTState(); ToggleButton myLightButton = new ToggleButton(this);(myLightButton, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));.setOnClickListener(new OnClickListener() {void onClick(View v) {(myLightButton.isChecked()){(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"1\r"));

}else{(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"0\r"));

}.postDelayed(sRunnable, 600000);

}static class MyHandler extends Handler {final WeakReference<ActivityTouch> mActivity;MyHandler(ActivityTouch activity) {= new WeakReference<ActivityTouch>(activity);

}

@Overridevoid handleMessage(Message msg) {activity = mActivity.get();(activity != null) {(msg.what) {

case cBluetooth.BL_NOT_AVAILABLE:

Log.d(cBluetooth.TAG, "Bluetooth is not available. Exit");

Toast.makeText(activity.getBaseContext(), "Bluetooth is not available", Toast.LENGTH_SHORT).show();

activity.finish();

break;

case cBluetooth.BL_INCORRECT_ADDRESS:

Log.d(cBluetooth.TAG, "Incorrect MAC address");

Toast.makeText(activity.getBaseContext(), "Incorrect Bluetooth address", Toast.LENGTH_SHORT).show();

break;

case cBluetooth.BL_REQUEST_ENABLE:

Log.d(cBluetooth.TAG, "Request Bluetooth Enable");

BluetoothAdapter.getDefaultAdapter();

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

activity.startActivityForResult(enableBtIntent, 1);

break;

case cBluetooth.BL_SOCKET_FAILED:

Toast.makeText(activity.getBaseContext(), "Socket failed", Toast.LENGTH_SHORT).show();

break;

}final MyHandler mHandler = new MyHandler(this);final static Runnable sRunnable = new Runnable() {void run() { }

};MyView extends View {fingerPaint, borderPaint, textPaint;dispWidth;dispHeight;x;y;xcirc;ycirc;directionL = "";directionR = "";drag = false;dragX = 0;dragY = 0;MyView(Context context) {(context);= new Paint();.setAntiAlias(true);.setColor(Color.RED);= new Paint();.setColor(Color.BLUE);.setAntiAlias(true);.setStyle(Style.STROKE);.setStrokeWidth(3);= new Paint();

textPaint.setColor(Color.WHITE);

textPaint.setStyle(Style.FILL);

textPaint.setColor(Color.BLACK);

textPaint.setTextSize(14);

}void onDraw(Canvas canvas) {= (int) Math.round((this.getRight()-this.getLeft())/3.5);= (int) Math.round((this.getBottom()-this.getTop())/1.7);(!drag){= dispWidth;= dispHeight;.setColor(Color.RED);

}.drawCircle(x, y, FINGER_CIRCLE_SIZE, fingerPaint); .drawCircle(dispWidth, dispHeight, BIG_CIRCLE_SIZE, borderPaint);(show_Debug){

canvas.drawText(String.valueOf("X:"+xcirc), 10, 75, textPaint);

canvas.drawText(String.valueOf("Y:"+(-ycirc)), 10, 95, textPaint);

canvas.drawText(String.valueOf("Motor:"+cmdSendL+cmdSendR), 10, 115, textPaint);

}

@Overrideboolean onTouchEvent(MotionEvent event) {evX = event.getX();evY = event.getY();= event.getX() - dispWidth;= event.getY() - dispHeight;radius = (float) Math.sqrt(Math.pow(Math.abs(xcirc),2)+Math.pow(Math.abs(ycirc),2));(event.getAction()) {MotionEvent.ACTION_DOWN: (radius >= 0 && radius <= BIG_CIRCLE_SIZE){= evX;= evY;.setColor(Color.GREEN);(xcirc,ycirc);();= true;

};MotionEvent.ACTION_MOVE:(drag && radius >= 0 && radius <= BIG_CIRCLE_SIZE) {= evX;= evY;.setColor(Color.GREEN);(xcirc,ycirc);();

};MotionEvent.ACTION_UP:= 0;= 0; = false;(xcirc,ycirc);();;

}true;

}void CalcMotor(float calc_x, float calc_y){directionL = "";directionR = "";_x = -calc_x;xAxis = Math.round(calc_x*pwmMax/BIG_CIRCLE_SIZE);yAxis = Math.round(calc_y*pwmMax/BIG_CIRCLE_SIZE);xR = Math.round(BIG_CIRCLE_SIZE*xRperc/100); (xAxis > 0) {= yAxis;(Math.abs(Math.round(calc_x)) > xR){= Math.round((calc_x-xR)*pwmMax/(BIG_CIRCLE_SIZE-xR));= Math.round(-motorLeft * yAxis/pwmMax);

}motorLeft = yAxis - yAxis*xAxis/pwmMax;

}if(xAxis < 0) {= yAxis;(Math.abs(Math.round(calc_x)) > xR){= Math.round((Math.abs(calc_x)-xR)*pwmMax/(BIG_CIRCLE_SIZE-xR));= Math.round(-motorRight * yAxis/pwmMax);

}motorRight = yAxis - yAxis*Math.abs(xAxis)/pwmMax;

}if(xAxis == 0) {= yAxis;= yAxis;

}(motorLeft > 0) {= "-";

} (motorRight > 0) {= "-";

}= Math.abs(motorLeft);= Math.abs(motorRight);(motorLeft > pwmMax) motorLeft = pwmMax;(motorRight > pwmMax) motorRight = pwmMax;= String.valueOf(commandLeft+directionL+motorLeft+"\r");= String.valueOf(commandRight+directionR+motorRight+"\r");(BT_is_connect) bl.sendData(cmdSendL + cmdSendR);

}

@Overridevoid onActivityResult(int requestCode, int resultCode, Intent data) {();

}

@Overridevoid onResume() {.onResume();_is_connect = bl.BT_Connect(address, false);

}

@Overridevoid onPause() {.onPause();.BT_onPause();

}void loadPref(){mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); = mySharedPreferences.getString("pref_MAC_address", address); xRperc = Integer.parseInt(mySharedPreferences.getString("pref_xRperc", String.valueOf(xRperc)));= Integer.parseInt(mySharedPreferences.getString("pref_pwmMax", String.valueOf(pwmMax)));_Debug = mySharedPreferences.getBoolean("pref_Debug", false);= mySharedPreferences.getString("pref_commandLeft", commandLeft);= mySharedPreferences.getString("pref_commandRight", commandRight);= mySharedPreferences.getString("pref_commandHorn", commandHorn);

}

АctivityWheel.javacom.dum_car;java.lang.ref.WeakReference;java.util.Locale;com.dum_car.cBluetooth;com.dum_car.R;android.os.Bundle;android.os.Handler;android.os.Message;android.app.Activity;android.bluetooth.BluetoothAdapter;android.content.Context;android.content.Intent;android.hardware.Sensor;android.hardware.SensorEvent;android.hardware.SensorEventListener;android.hardware.SensorManager;android.util.Log;android.view.MotionEvent;android.view.View;android.view.View.OnClickListener;android.view.View.OnTouchListener;android.widget.Button;android.widget.SeekBar;android.widget.TextView;android.widget.Toast;android.widget.ToggleButton;android.content.SharedPreferences;android.preference.PreferenceManager;class ActivityWheel extends Activity implements SensorEventListener {SensorManager mSensorManager;Sensor mAccel;cBluetooth bl = null;ToggleButton LightButton;Button btn_Rear;VerticalSeekBar VSeekBar;int xAxis = 0;int yAxis = 0;int motorLeft = 0;int motorRight = 0;float xgl = 0;boolean isRear = false;String address;boolean show_Debug;boolean BT_is_connect;int xMax; int yMax; int yThreshold; )int pwmMax; int xR;String commandLeft;String commandRight;String commandHorn;

@Overridevoid onCreate(Bundle savedInstanceState) {.onCreate(savedInstanceState);(R.layout.activity_wheel);= (String) getResources().getText(R.string.default_MAC);= Integer.parseInt((String) getResources().getText(R.string.default_xMax));= Integer.parseInt((String) getResources().getText(R.string.default_xR));= Integer.parseInt((String) getResources().getText(R.string.default_yMax));= Integer.parseInt((String) getResources().getText(R.string.default_yThreshold));= Integer.parseInt((String) getResources().getText(R.string.default_pwmMax));= (String) getResources().getText(R.string.default_commandLeft);= (String) getResources().getText(R.string.default_commandRight);= (String) getResources().getText(R.string.default_commandHorn);();= (SensorManager) getSystemService(Context.SENSOR_SERVICE);= mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); = new cBluetooth(this, mHandler);.checkBTState();= (VerticalSeekBar) findViewById(R.id.calcVerticalSeekBar); .setMaximum(pwmMax);= (ToggleButton) findViewById(R.id.LightButton);_Rear = (Button) findViewById(R.id.btnRear);.setOnClickListener(new OnClickListener() {void onClick(View v) {(LightButton.isChecked()){(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"1\r"));

}else{(BT_is_connect) bl.sendData(String.valueOf(commandHorn+"0\r"));

}_Rear.setOnTouchListener(new OnTouchListener() {boolean onTouch(View v, MotionEvent event) {

if(event.getAction() == MotionEvent.ACTION_MOVE) {

isRear = true;

} else if (event.getAction() == MotionEvent.ACTION_UP) {

isRear = false;

}false;.setOnSeekBarChangeListener(new VerticalSeekBar.OnSeekBarChangeListener() {void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {(xgl,progress);

}void onStartTrackingTouch(SeekBar seekBar) { }void onStopTrackingTouch(SeekBar seekBar) {.setProgressAndThumb(0);

}.postDelayed(sRunnable, 600000);

}static class MyHandler extends Handler {final WeakReference<ActivityWheel> mActivity;MyHandler(ActivityWheel activity) {= new WeakReference<ActivityWheel>(activity);

}

@Overridevoid handleMessage(Message msg) {activity = mActivity.get();(activity != null) {(msg.what) {

case cBluetooth.BL_NOT_AVAILABLE:

Log.d(cBluetooth.TAG, "Bluetooth is not available. Exit");

Toast.makeText(activity.getBaseContext(), "Bluetooth is not available", Toast.LENGTH_SHORT).show();

activity.finish();

break;

case cBluetooth.BL_INCORRECT_ADDRESS:

Log.d(cBluetooth.TAG, "Incorrect MAC address");

Toast.makeText(activity.getBaseContext(), "Incorrect Bluetooth address", Toast.LENGTH_SHORT).show();

break;

case cBluetooth.BL_REQUEST_ENABLE:

Log.d(cBluetooth.TAG, "Request Bluetooth Enable");

BluetoothAdapter.getDefaultAdapter();

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

activity.startActivityForResult(enableBtIntent, 1);

break;

case cBluetooth.BL_SOCKET_FAILED:

Toast.makeText(activity.getBaseContext(), "Socket failed", Toast.LENGTH_SHORT).show();

break;

}final MyHandler mHandler = new MyHandler(this);final static Runnable sRunnable = new Runnable() {void run() { }

};void onSensorChanged(SensorEvent e) {(e.values[0],VSeekBar.getProgress());= e.values[0];

}void MotionChanged(float x, int y) {directionL = "";directionR = "";cmdSendL,cmdSendR;.d(cBluetooth.TAG, Math.round(x)+" "+y);= Math.round(x*pwmMax/xR);(isRear) yAxis = y;yAxis = -y;(xAxis > pwmMax) xAxis = pwmMax;if(xAxis < -pwmMax) xAxis = -pwmMax; (yAxis > pwmMax) yAxis = pwmMax;if(yAxis < -pwmMax) yAxis = -pwmMax;if(yAxis >= 0 && yAxis < yThreshold) yAxis = 0;if(yAxis < 0 && yAxis > -yThreshold) yAxis = 0;(xAxis > 0) {= yAxis;(Math.abs(Math.round(x)) > xR){= Math.round((x-xR)*pwmMax/(xMax-xR));= Math.round(-motorLeft * yAxis/pwmMax);

}motorLeft = yAxis - yAxis*xAxis/pwmMax;

}if(xAxis < 0) {= yAxis;(Math.abs(Math.round(x)) > xR){= Math.round((Math.abs(x)-xR)*pwmMax/(xMax-xR));= Math.round(-motorRight * yAxis/pwmMax);motorRight = yAxis - yAxis*Math.abs(xAxis)/pwmMax;if(xAxis == 0) {= yAxis;= yAxis;(motorLeft > 0) {= "-";

} (motorRight > 0) {= "-";

}= Math.abs(motorLeft);= Math.abs(motorRight);(motorLeft > pwmMax) motorLeft = pwmMax;(motorRight > pwmMax) motorRight = pwmMax;= String.valueOf(commandLeft+directionL+motorLeft+"\r");= String.valueOf(commandRight+directionR+motorRight+"\r");(BT_is_connect) bl.sendData(cmdSendL+cmdSendR);textX = (TextView) findViewById(R.id.textViewX);textY = (TextView) findViewById(R.id.textViewY);mLeft = (TextView) findViewById(R.id.mLeft);mRight = (TextView) findViewById(R.id.mRight);textCmdSend = (TextView) findViewById(R.id.textViewCmdSend); (show_Debug){.setText(String.valueOf("X:" + String.format("%.1f",x) + "; xPWM:"+xAxis));

textY.setText(String.valueOf("Y:" + String.valueOf(y) + "; yPWM:"+yAxis));

mLeft.setText(String.valueOf("MotorL:" + directionL + "." + motorLeft));

mRight.setText(String.valueOf("MotorR:" + directionR + "." + motorRight));

textCmdSend.setText(String.valueOf("Send:" + cmdSendL.toUpperCase(Locale.getDefault()) + cmdSendR.toUpperCase(Locale.getDefault())));

}{.setText("");.setText("");.setText("");.setText("");.setText("");

}void loadPref(){mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); = mySharedPreferences.getString("pref_MAC_address", address); xMax = Integer.parseInt(mySharedPreferences.getString("pref_xMax", String.valueOf(xMax)));= Integer.parseInt(mySharedPreferences.getString("pref_xR", String.valueOf(xR)));= Integer.parseInt(mySharedPreferences.getString("pref_yMax", String.valueOf(yMax)));= Integer.parseInt(mySharedPreferences.getString("pref_yThreshold", String.valueOf(yThreshold)));= Integer.parseInt(mySharedPreferences.getString("pref_pwmMax", String.valueOf(pwmMax)));_Debug = mySharedPreferences.getBoolean("pref_Debug", false);= mySharedPreferences.getString("pref_commandLeft", commandLeft);= mySharedPreferences.getString("pref_commandRight", commandRight);= mySharedPreferences.getString("pref_commandHorn", commandHorn);

}

@Overridevoid onResume() {.onResume();_is_connect = bl.BT_Connect(address, false);.registerListener(this, mAccel, SensorManager.SENSOR_DELAY_NORMAL);

}

@Overridevoid onPause() {.onPause();.BT_onPause();.unregisterListener(this);

}

@Overridevoid onActivityResult(int requestCode, int resultCode, Intent data) {();

}void onAccuracyChanged(Sensor arg0, int arg1) { }

}.javacom.dum_car;java.io.IOException;java.io.InputStream;java.io.OutputStream;java.lang.reflect.Method;java.util.UUID;android.bluetooth.BluetoothAdapter;android.bluetooth.BluetoothDevice;android.bluetooth.BluetoothSocket;android.content.Context;android.os.Build;android.os.Handler;android.util.Log;class cBluetooth{final static String TAG = "BL_4WD";static BluetoothAdapter btAdapter = null;BluetoothSocket btSocket = null;OutputStream outStream = null;ConnectedThread mConnectedThread;static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");final Handler mHandler;final static int BL_NOT_AVAILABLE = 1; final static int BL_INCORRECT_ADDRESS = 2;final static int BL_REQUEST_ENABLE = 3;final static int BL_SOCKET_FAILED = 4;final static int RECIEVE_MESSAGE = 5;(Context context, Handler handler){= BluetoothAdapter.getDefaultAdapter();= handler;(btAdapter == null) {.sendEmptyMessage(BL_NOT_AVAILABLE);;

}void checkBTState() {(btAdapter == null) { .sendEmptyMessage(BL_NOT_AVAILABLE);

} else {(btAdapter.isEnabled()) {.d(TAG, "Bluetooth ON");

} else {.sendEmptyMessage(BL_REQUEST_ENABLE);

}BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {(Build.VERSION.SDK_INT >= 10){{Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });(BluetoothSocket) m.invoke(device, MY_UUID);

} catch (Exception e) {.e(TAG, "Could not create Insecure RFComm Connection",e);

}device.createRfcommSocketToServiceRecord(MY_UUID);boolean BT_Connect(String address, boolean listen_InStream) { .d(TAG, "...On Resume..."); connected = false;(!BluetoothAdapter.checkBluetoothAddress(address)){.sendEmptyMessage(BL_INCORRECT_ADDRESS);false;

}{device = btAdapter.getRemoteDevice(address);{= createBluetoothSocket(device);

} catch (IOException e1) {

Log.e(TAG, "In BT_Connect() socket create failed: " + e1.getMessage());

mHandler.sendEmptyMessage(BL_SOCKET_FAILED);

return false;

}

btAdapter.cancelDiscovery();.d(TAG, "...Connecting...");

try {

btSocket.connect();

Log.d(TAG, "...Connection ok...");

} catch (IOException e) {

try {

btSocket.close();

} catch (IOException e2) {

Log.e(TAG, "In BT_Connect() unable to close socket during connection failure" + e2.getMessage());

mHandler.sendEmptyMessage(BL_SOCKET_FAILED);

return false;

}.d(TAG, "...Create Socket...");{

outStream = btSocket.getOutputStream();

connected = true;

} catch (IOException e) {

Log.e(TAG, "In BT_Connect() output stream creation failed:" + e.getMessage());

mHandler.sendEmptyMessage(BL_SOCKET_FAILED);

return false;

}(listen_InStream) {= new ConnectedThread();

mConnectedThread.start();

}connected;

}void BT_onPause() {.d(TAG, "...On Pause...");(outStream != null) {{

outStream.flush();

} catch (IOException e) {

Log.e(TAG, "In onPause() and failed to flush output stream: " + e.getMessage());

mHandler.sendEmptyMessage(BL_SOCKET_FAILED);

return;

}(btSocket != null) {

try {

btSocket.close();

} catch (IOException e2) {

Log.e(TAG, "In onPause() and failed to close socket." + e2.getMessage());

mHandler.sendEmptyMessage(BL_SOCKET_FAILED);

return;

}void sendData(String message) {[] msgBuffer = message.getBytes();.i(TAG, "Send data: " + message);(outStream != null) {

try {

outStream.write(msgBuffer);

} catch (IOException e) {

Log.e(TAG, "In onResume() exception occurred during write: " + e.getMessage());

mHandler.sendEmptyMessage(BL_SOCKET_FAILED);

return;

} else Log.e(TAG, "Error Send data: outStream is Null");

}class ConnectedThread extends Thread {final InputStream mmInStream;ConnectedThread() {tmpIn = null;{= btSocket.getInputStream();

} catch (IOException e) {.e(TAG, "In ConnectedThread() error getInputStream(): " + e.getMessage());

}= tmpIn;

}void run() {[] buffer = new byte[256]; bytes; (true) {{= mmInStream.read(buffer);.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();

} catch (IOException e) {;

}.javacom.dum_car;android.app.Activity;android.content.Intent;android.graphics.Color;android.os.Bundle;android.view.Menu;android.view.MenuItem;android.view.View;android.view.View.OnClickListener;android.widget.Button;android.widget.TextView;class MainActivity extends Activity implements OnClickListener {btnActAccelerometer, btnActWheel, btnActButtons, btnActMCU, btnActTouch, btnActAbout;

@Overridevoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView textv = (TextView) findViewById(R.id.textView1);

textv.setShadowLayer(1, 3, 3, Color.GRAY);

btnActAccelerometer = (Button) findViewById(R.id.button_accel);

btnActAccelerometer.setOnClickListener(this);

btnActWheel = (Button) findViewById(R.id.button_wheel);

btnActWheel.setOnClickListener(this);

btnActButtons = (Button) findViewById(R.id.button_buttons);

btnActButtons.setOnClickListener(this);

btnActMCU = (Button) findViewById(R.id.button_mcu);

btnActMCU.setOnClickListener(this);

btnActTouch = (Button) findViewById(R.id.button_touch);

btnActTouch.setOnClickListener(this);

btnActAbout = (Button) findViewById(R.id.button_about);

btnActAbout.setOnClickListener(this);

}void onClick(View v) {(v.getId()) {

case R.id.button_accel:

Intent intent_accel = new Intent(this, ActivityAccelerometer.class);

startActivity(intent_accel);

break;

case R.id.button_wheel:

Intent intent_wheel = new Intent(this, ActivityWheel.class);

startActivity(intent_wheel);

break;

case R.id.button_buttons:

Intent intent_buttons = new Intent(this, ActivityButtons.class);

startActivity(intent_buttons);

break;

case R.id.button_mcu:

Intent intent_mcu = new Intent(this, ActivityMCU.class);

startActivity(intent_mcu);

break;

case R.id.button_touch:

Intent intent_touch = new Intent(this, ActivityTouch.class);

startActivity(intent_touch);

break;

case R.id.button_about:

Intent intent_about = new Intent(this, ActivityAbout.class);

startActivity(intent_about);

break;

default:

break;

}

@Overrideboolean onCreateOptionsMenu(Menu menu) {().inflate(R.menu.activity_main, menu);true;

}

@Overrideboolean onOptionsItemSelected(MenuItem item) {

intent = new Intent();.setClass(MainActivity.this, SetPreferenceActivity.class);(intent, 0); true;

}.javacom.dum_car;android.os.Bundle;android.preference.PreferenceFragment;class PrefsFragment extends PreferenceFragment {

@Overridevoid onCreate(Bundle savedInstanceState) {.onCreate(savedInstanceState); (R.xml.pref);

}.javacom.dum_car;android.app.Activity;android.os.Bundle;class SetPreferenceActivity extends Activity {

@Overridevoid onCreate(Bundle savedInstanceState) {.onCreate(savedInstanceState);().beginTransaction().replace(android.R.id.content,PrefsFragment()).commit();

}.javacom.dum_car;android.content.Context;android.graphics.Canvas;android.util.AttributeSet;android.view.MotionEvent;android.widget.SeekBar;class VerticalSeekBar extends SeekBar {VerticalSeekBar(Context context) {(context);

}VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {(context, attrs, defStyle);

}VerticalSeekBar(Context context, AttributeSet attrs) {(context, attrs);

}void onSizeChanged(int w, int h, int oldw, int oldh) {.onSizeChanged(h, w, oldh, oldw);

}

@Overridesynchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {.onMeasure(heightMeasureSpec, widthMeasureSpec);(getMeasuredHeight(), getMeasuredWidth());

}void onDraw(Canvas c) {.rotate(-90);.translate(-getHeight(), 0);.onDraw(c);

}OnSeekBarChangeListener onChangeListener;

@Overridevoid setOnSeekBarChangeListener(OnSeekBarChangeListener onChangeListener){.onChangeListener = onChangeListener;

}int lastProgress = 0;

@Overrideboolean onTouchEvent(MotionEvent event) {(!isEnabled()) {false;

}(event.getAction()) {MotionEvent.ACTION_DOWN:.onStartTrackingTouch(this);(true);(true);;MotionEvent.ACTION_MOVE:.onTouchEvent(event);progress = getMax() - (int) (getMax() * event.getY() / getHeight());(progress < 0) {progress = 0;}(progress > getMax()) {progress = getMax();}(progress);(progress != lastProgress) {= progress;.onProgressChanged(this, progress, true);

}(getWidth(), getHeight(), 0, 0);(true);(true);;MotionEvent.ACTION_UP:.onStopTrackingTouch(this);(false);(false);;MotionEvent.ACTION_CANCEL:.onTouchEvent(event);(false);(false);;

}true;synchronized void setProgressAndThumb(int progress) {(progress);(getWidth(), getHeight(), 0, 0);(progress != lastProgress) {= progress;.onProgressChanged(this, progress, true);synchronized void setMaximum(int maximum) {(maximum);synchronized int getMaximum() {getMax();

}


МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ Чорноморський державний університет імені Петра Могили Факультет компютерних наук Кафедра інформаційних технологій

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2018 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ