Характеристика
|
Значення
|
Мінімальний радіус
для виконання повороту
|
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:
http://electrikpro.ru/eltranspeltranosnvidrrp.html. - Загол. з екрану.
.Автомобиль и экология // Автоновичок [Електронний
ресурс]. - Режим доступу: URL: http://www.avtonov.svoi.info/euro.php. - Загол.
з екрану.
.Электротранспорт / Сферы применения / Лиотех. Литий -
ионные технологии. // Лиотех [Електронний ресурс]. - Режим доступу: URL:
http://liotech.ru/ev. - Загол. З екрану.
.Екологічно чистий транспорт - Вікіпедія // Вікіпедія
[Електронний ресурс]. - Режим доступу: URL:
http://uk.wikipedia.org/wiki/Екологічно_чистий_транспорт. - Загол. з екрану.
.Дистанционно управляемые средства для гуманитарного
разминирования // Loi [Електронний ресурс]. - Режим доступу: URL:
http://loi.sscc.ru/bdm/bigdog/mina.htm. - Загол. з екрану.
.США: вместо солдат роботы? // Голос Америки
[Електронний ресурс]. - Режим доступу: URL:
http://www.golos-ameriki.ru/content/soldiersrobots/1836528.html. - Загол. з
екрану.
.Американские наземные малогабаритные дистанционно
управляемые машины (2012) - 2000 - настоящий момент - Материалы посвящены - Top
secret - Pentagonus // Pentagonus [Електронний ресурс]. - Режим доступу: URL:
http://pentagonus.ru/publ/materialy_posvjashheny/2000_nastojashhij_moment/amerikanskie_nazemnye_malogabaritnye_distancionno_upravljaemye_mashiny_2012/122-1-0-2115.
- Загол. з екрану.
.Робототехнические комплексы для обеспечения
специальных операций. // Техника для спецслужб [Електронний ресурс]. - Режим
доступу: URL: http://www.bnti.ru/showart.asp?aid=456&lvl=02.01.02.02.. -
Загол. з екрану.
.Концепция разработки наземной дистанционно
управляемой машины с ограниченными автономными возможностями - Технические
науки - Fundamental Researc // Технические науки [Електронний ресурс]. - Режим
доступу: URL:
http://www.rae.ru/upfs/?section=content&op=show_article&article_id=4495&lng=en.
- Загол. з екрану.
.Робототехнические комплексы для применения в условиях
чрезвычайных ситуаций. // Техника для спецслужб [Електронний ресурс]. - Режим
доступу: URL: http://www.bnti.ru/showart.asp?aid=464&lvl=04.03.. - Загол. з
екрану.
.Компьютерра: Curiosity провёл изучение радиационной
обстановки на Марсе // Компьютерра [Електронний ресурс]. - Режим доступу: URL:
http://www.computerra.ru/45055/curiosity-provyol-izuchenie-radiatsionnoy-obsta/.
- Загол. з екрану.
.Компьютерра: Новый марсоход, который разрабатывают в
Канаде, разгадает тайну марсианского метана // Компьютерра [Електронний
ресурс]. - Режим доступу: URL: http://www.computerra.ru/39865/v-universitete-toronto-razrabatyivayu/.
- Загол. з екрану.
.Компьютерра: Посмотрите, как устроен марсоход
Curiosity: реактор, компьютер и прочие детали // Компьютерра [Електронний
ресурс]. - Режим доступу: URL: http://www.computerra.ru/36157/. - Загол. з
екрану.
.Аварийные работы на АЭС «Фукусима - Дайичи « |
Российское атомное сообщество Atomic - Energy.ru // Atomic - Energy
[Електронний ресурс]. - Режим доступу: URL:
http://www.atomic-energy.ru/photo/21104. - Загол. з екрану.
.old.niss.gov.ua/book/StrPryor/St_pr5/27_Shugurov.pdf
// Nis [Електронний ресурс]. - Режим доступу: URL:
http://old.niss.gov.ua/book/StrPryor/St_pr5/27_Shugurov.pdf. - Загол. з екрану.
.http://www.rand.org/content/dam/rand/pubs/monographs/2012/RAND_MG1206.pdf
// RAND [Електронний ресурс]. - Режим доступу: URL:
http://www.rand.org/content/dam/rand/pubs/monographs/2012/RAND_MG1206.pdf. -
Загол. з екрану.
.ArtOfWar. Щенников Владимир Витальевич.
Радиоуправляемые машины разминирования. Невероятные приключения немцев в
Афгане.... (часть 6 - я) // ArtOfWar [Електронний ресурс]. - Режим доступу:
URL: http://artofwar.ru/s/shennikow_w_w/text_0360.shtml. - Загол. з екрану.
.Робототехнические комплексы для применения в условиях
чрезвычайных ситуаций. // Бюро технических находок [Електронний ресурс]. -
Режим доступу: URL: http://www.bnti.ru/showart.asp?aid=464&lvl=04.03.. -
Загол. з екрану.
.Роботы - пожарные - эффективность новейших
технологий! | Пожарные автомобили // Pozhavto [Електронний ресурс]. - Режим
доступу: URL:
http://www.pozhavto.ru/роботы-пожарные---эффективность-новейших-технологий. -
Загол. з екрану.
.Концепция дистанционно управляемых роботов широкого
применения «Кентавр и Торс «. - Мои статьи - Каталог статей - Персональный сайт
// SpaceExpansion [Електронний ресурс]. - Режим доступу: URL:
http://spaceexpansion.ucoz.ru/publ/koncepcija_distancionno_upravljaemykh_robotov_shirokogo_primenenija_quot_kentavr_i_tors_quot/1-1-0-21.
- Загол. з екрану.
.Робот для демонтажа Husqvarna DXR 250 // Diamondtool
[Електронний ресурс]. - Режим доступу: URL:
http://www.diamondtool.ru/catalog/product/robot-dlya-demontazha-dxr-250. -
Загол. з екрану.
.Brokk AB - BROKK // Строй Тех [Електронний ресурс]. -
Режим доступу: URL: http://www.stroyteh.ru/company/BROKK. - Загол. з екрану.
.Multi - Mover - компактные электрические тягачи и
электрокары, электротележки. Выгодно купить электрокар, мини тягач или
электрическую тележку можно в компании Suffecta // Suffecta [Електронний
ресурс]. - Режим доступу: URL: http://suffecta.ru/catalog/multi-mover-kompaktnye-elektrogidravlicheskie-tyagachi/.
- Загол. з екрану.
.Электротележка - электротележки фирмы Crown // Crown
[Електронний ресурс]. - Режим доступу: URL:
http://www.crown.com/ru/pogruzchiki/elektrotelezhki.html. - Загол. з екрану.
.Миль Гюнтен Электронное дистанционное управление
моделями [Текст] / М. Гютен - ДОСААФ, 1980. - 416 с.
.Козловский Ю. Е. Производственная культура и эстетика
[Текст] / Ю. Е. Козловский - Недра, 1970. - 79 с.
.Рыжкин В. Я. - Тепловые электрические станции [Текст]
/ В. Я. Рыжкин - Энергоатомиздат, 1987. - 400 с.
.Дистанционное управление - Горная энциклопедия //
Горная энциклопедия [Електронний ресурс]. - Режим доступу: URL:
http://www.mining-enc.ru/d/distancionnoe-upravlenie/. - Загол. з екрану.
.Дистанционное управление GSM.Телеметрия. // Icm - tec
[Електронний ресурс]. - Режим доступу: URL: http://icm-tec.com/system.htm. -
Загол. з екрану.
Додаток А. Код програми для 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 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();
}