Мазмуну:

ZenWheels Microcar үчүн Hackable Remote Control: 7 кадам
ZenWheels Microcar үчүн Hackable Remote Control: 7 кадам

Video: ZenWheels Microcar үчүн Hackable Remote Control: 7 кадам

Video: ZenWheels Microcar үчүн Hackable Remote Control: 7 кадам
Video: Үй жыйноо эрежелери / Аруузат / 08.02.21 2024, Июнь
Anonim
Image
Image
Ассамблея
Ассамблея

Бул үйрөткүчтө биз ZenWheels микрокарына ыңгайлаштырылган алыстан башкарууну курабыз. ZenWheels микрокарабы - бул 5 см оюнчук машина, аны Android же Iphone тиркемеси аркылуу башкарса болот. Мен сизге Android тиркемесин кантип тескөө керектигин, байланыш протоколу жана ардуино менен гироскоптун жардамы менен алыстан башкарууну кантип курууга болорун көрсөтөм.

1 -кадам: Компоненттер жана инструменттер

Бөлүктөр:

1. ZenWheels микрокар

2. Arduino pro mini 328p

3. Нан тактасы

4. MPU6050 гироскопу

5. кубат булагы <= 5 v (нанга тактай ала турган кээ бир батареялар)

6. U формасындагы секирүүчү кабелдер (милдеттүү эмес). Мен бул секирүүчү кабелдерди колдонгом, анткени алар нан тактасында жакшы көрүнөт. Анын ордуна кадимки секирүүчү кабелдерди колдонсо болот

7. HC-05 bluetooth модулу (AT режимине кирүү баскычы менен)

Куралдар:

1. USB Arduino pro mini программалуу FTDI адаптерине FT232RL

2. Arduino IDE

3. Android телефону

4. Android Studio [Милдеттүү эмес]

2 -кадам: ZenWheels Android тиркемесин тескөө [милдеттүү эмес]

Бул бөлүктү түшүнүү үчүн Java жана Android боюнча кээ бир билимдер талап кылынат.

Долбоордун максаты - микрокараны гироскоптун жардамы менен башкаруу. Бул үчүн биз бул оюнчук менен андроид тиркемесинин ортосундагы Bluetooth байланышы жөнүндө көбүрөөк билишибиз керек.

Бул кадамда мен микрокар менен андроид тиркемесинин ортосундагы байланыш протоколун кантип артка кайтарууну түшүндүрөм. Эгерде сиз жөн гана алыстан курууну кааласаңыз, бул кадамдын кереги жок. Протоколду табуунун бир жолу - булак кодун карап көрүү. Хмм, бирок бул түз эмес, андроид тиркемелери түзүлөт жана Google Play аркылуу APK орнотсо болот.

Ошентип, мен муну кылуу үчүн негизги көрсөтмө бердим:

1. APK жүктөп алыңыз. An Android Package Kit (APK for short) - мобилдик тиркемелерди жайылтуу жана орнотуу үчүн Android операциялык тутуму тарабынан колдонулган пакет файл форматы.

Алгач Google Play дүкөнүнөн тиркемени издеңиз, биздин учурда "zenwheels" издеңиз жана сиз колдонмонун шилтемесин аласыз

Андан кийин Googleдан "онлайн apk жүктөөчү" издеп, аны жүктөп алуу үчүн аны колдонуңуз. Көбүнчө алар колдонмонун шилтемесин сурашат (биз мурда алган), андан кийин биз жүктөө баскычын басып, аны компьютерибизде сактайбыз.

2. APKни декомпиляцияла. Биздин жагдайдагы декомпилятор - бул APKди алып, Java булак кодун чыгаруучу курал.

Эң жөнөкөй чечим - бул жумушту аткаруу үчүн онлайн декомпиляторду колдонуу. Мен гуглдан "онлайн декомпиляторун" издедим жана https://www.javadecompilers.com/ тандадым. Сиз буга чейин алган APK'ди жүктөшүңүз керек

декомпиляны басыңыз. Андан кийин булактарды жүктөп алыңыз.

3. Кодду карап инженерди артка кайтарууга аракет кылыңыз

Долбоорду ачуу үчүн сизге текст редактору же жакшыраак IDE (комплекстүү өнүктүрүү чөйрөсү) керек. Android долбоорлору үчүн демейки IDE - Android Studio (https://developer.android.com/studio). Android Studio орнотулгандан кийин, долбоордун папкасын ачыңыз.

Биздин унаа блютуз менен башкарылгандыктан, мен издөөнү "bluetooth" ачкыч сөзү менен коддон издөөнү баштадым, "BluetoothSerialService" байланыштын колунда экенин байкадым. Эгерде бул класс байланышты башкарса, анда жөнөтүү буйругунун ыкмасы болушу керек. Көрсө, маалыматты Bluetooth каналы аркылуу жөнөтүүчү бир жазуу ыкмасы бар экен:

жалпы жараксыз жазуу (байт чыгаруу)

Бул жакшы башталыш, мен.write издеп көрдүм (колдонулган ыкма жана "BluetoothSerialServiceибизди" кеңейтүүчү "ZenWheelsMicrocar" классы бар. Бул класс Bluetooth аркылуу баарлашуубуздун логикасынын көпчүлүгүн камтыйт. Башка бөлүгү логика контроллерлерде: BaseController жана StandardController.

BaseControllerде бизде кызматтын инициализациясы, ошондой эле рулду жана дроссель каналдарынын аныктамалары бар, каналдар чындыгында буйруктун кайсы бир түрү аткарыларын аныктоо үчүн командалык префикстер:

корголгон ZenWheelsMicrocar microcar = жаңы ZenWheelsMicrocar (бул, бул.btHandler);

корголгон ChannelOutput чыгышы = {жаңы TrimChannelOutput (ZenWheelsMicrocar. STEERING_CHANNEL), жаңы TrimChannelOutput (ZenWheelsMicrocar. THROTTLE_CHANNEL)};

StandardControllerде рулду башкарат:

public void handleSteering (TouchEvent touchEvent) {

… This.microcar.setChannel (steeringOutput.channel, steeringOutput.resolveValue ()); }

Методду талдап, steeringOutput.channel 129 мааниге ээ (руль үчүн колдонулган канал) жана steeringOutput.resolveValue () -90 менен 90 ортосунда мааниге ээ болушу мүмкүн. Каналдын мааниси (129) түз жөнөтүлөт жана рулду өзгөртүү биттик операцияларды колдонуу менен:

жеке акыркы int value_convert_out (int мааниси) {

логикалык терс = жалган; if (мааниси <0) {терс = f6D; } int value2 = маани & 63; if (терс) {return value2 | 64; } return value2; }

Аттуу StandardControllerде ушундай эле ыкма бар

коомдук боштук туткасы Throttle (TouchEvent touchEvent)

3 -кадам: Компоненттер

Бөлүктөр:

1. Arduino pro mini 328p 2 $

2. Breadboard

3. MPU6050 гироскопу 1,2 $

4. HC-05 мастер-кул 6 пин модулу 3 $

5. 4 батарейка менен 4 х АА батарейка

6. U формасындагы секирүүчү кабелдер (милдеттүү эмес). Мен бул секирүүчү кабелдерди колдондум, анткени алар нан тактасында жакшыраак көрүнөт, жана леддер ушундай көрүнөт. Эгерде сизде бул кабелдер жок болсо, анда аларды дюпонт зымдарга алмаштырсаңыз болот.

Жогорудагы баалар eBayден алынган.

Куралдар:

1. USB сериялык FTDI адаптерине FT232RL arduino pro mini программасы үчүн

2. Arduino IDE

3. Android Studio (эгер сиз өзүңүздү тескери инженер кылгыңыз келсе, милдеттүү эмес)

4 -кадам: Ассамблея

Ассамблея
Ассамблея

Кураштыруу абдан жөнөкөй, анткени биз аны нан тактасында жасап жатабыз:)

- адегенде биз компоненттерибизди нан тактасына жайгаштырабыз: микроконтроллер, bluetooth модулу жана гироскоп

- HC-05 bluetooth RX жана TX казыктарын arduino 10 жана 11 казыктарына туташтырыңыз. Гироскоп SDA жана SCL arduino A4 жана A5 казыктарына туташтырылышы керек

- электр казыктарын bluetooth, гиро жана arduino менен туташтырыңыз. казыктар + жана - нан тактасынын тарабына туташтырылышы керек

- акыркы жолу электр менен камсыздоону туташтырыңыз (3.3Vтан 5Vга чейин), мен кичинекей LiPo бир клеткалуу батареяны колдондум, бирок анын диапазонунда болгондо баары жасалат.

Көбүрөөк маалымат алуу үчүн жогорудагы сүрөттөрдү текшериңиз

5-кадам: HC-05 Bluetoothун Microcar менен жупташтырыңыз

HC-05 Bluetoothну Microcar менен жупташтырыңыз
HC-05 Bluetoothну Microcar менен жупташтырыңыз
HC-05 Bluetoothну Microcar менен жупташтырыңыз
HC-05 Bluetoothну Microcar менен жупташтырыңыз
HC-05 Bluetoothну Microcar менен жупташтырыңыз
HC-05 Bluetoothну Microcar менен жупташтырыңыз

Бул үчүн сизге Android телефону, bluetooth HC-05 модулу жана зымдары бар сериялык FTDI адаптери керек. Ошондой эле биз Bluetooth модулу менен байланышуу үчүн Arduino IDE колдонобуз.

Биринчиден, биз microcar bluetooth дарегин билишибиз керек:

- телефонуңузда Bluetooth'ду иштетүү

- машинаны күйгүзүңүз жана Androidдеги жөндөөлөрүңүздүн bluetooth бөлүмүнө өтүңүз

- жаңы түзмөктөрдү издөө жана "Microcar" деп аталган кээ бир түзмөк пайда болушу керек

- бул түзмөк менен жупташуу

- андан кийин Bluetooth MAC алуу үчүн, мен бул колдонмону google play Serial Bluetooth Terminalден колдоном

Бул колдонмону орноткондон кийин, менюга өтүңүз -> түзмөктөр жана ошол жерде сизде бардык Bluetooth жупташкан түзүлүштөрү бар тизме болот. Бизди "Microcar" шахтасынын астындагы код гана кызыктырат 00: 06: 66: 49: A0: 4B

Кийинки, FTDI адаптерин Bluetooth модулуна туташтырыңыз. Алгач VCC жана GROUND төөнөгүчтөрү, андан кийин bluetooth TXке FTDI RX жана bluetooth RXке FTDI TX. Ошондой эле, VCCге туташуу керек болгон Bluetooth модулунда пин болушу керек. Бул үчүн Bluetooth модулу "программалоочу режимге" кирет. Менин модулумда VCCди атайын пинге туташтырган баскыч бар. FTDIди USBге туташтырганыңызда, бул атайын программалоочу режимге кирүү үчүн басылган пин / баскычы болушу керек. Bluetooth бул иштөө режимине киргендигин ырастайт, ар бир 2 секундда акырын ирмелет.

Arduino IDEде сериялык портту тандап, андан кийин сериялык мониторду ачыңыз (NL да, CR да 9600 байдын ылдамдыгы менен). AT териңиз жана модуль "OK" менен ырасташыңыз керек.

Модулду башкы режимге коюу үчүн "AT+ROLE = 1" териңиз. Bluetooh модулуңуз менен жупташуу үчүн: "AT+BIND = 0006, 66, 49A04B" деп жазыңыз, биздин "00: 06: 66: 49: A0: 4B" кантип "0006, 66, 49A04B" болуп өзгөргөнүнө көңүл буруңуз. Ооба, сиз блютух MAC үчүн ошол эле трансформацияны жасашыңыз керек.

Эми Zenwheels машинасын күйгүзүңүз, андан кийин FTDIди ажыратыңыз жана баскычты баспастан / атайын пин туташтырбастан кайра туташтырыңыз. Бир аздан кийин ал унаага туташуусу керек жана сиз унаанын белгилүү бир байланыш ийгиликтүү үн чыгарып жатканын байкайсыз.

Мүчүлүштүктөрдү оңдоо:

- Менде болгон бардык Bluetooth модулдарынын ичинен бир баскычы бар гана мастер болуп иштегенин көрдүм!

- машинанын толук заряддалышын камсыз кылуу

- машине телефонго туташпаганын текшериңиз

- эгерде Bluetooth AT режимине кирсе (акырын көзүн ирмейт), бирок ал буйрукка жооп бербесе, анда BOTH NL & CR бар экениңизди жана башка BAUD ставкалары менен эксперимент кылыңыз.

- RX TXке туташканын жана тескерисинче эки жолу текшерүү

- бул үйрөткүчтү колдонуп көрүңүз

6 -кадам: Код жана колдонуу

Алгач эки китепкананы жүктөп алып, орнотушуңуз керек:

1. Гироскоп үчүн MPU6050 китепканасы

2. I2CDev китепканасынын булагы

Андан кийин бул жерден менин китепканамды жүктөп алып, орнотуңуз же төмөндөн көчүрүңүз:

/** * Китепканалар: * https://github.com/jrowberg/i2cdevlib * https://github.com/jrowberg/i2cdevlib */#include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h "#incluse" SoftwareSerial.h"

const int MAX_ANGLE = 45;

const byte commandStering = 129; const байт commandSpeed = 130;

bool initialization = false; // DMP init ийгиликтүү болсо, чындыкты коюңуз

uint8_t mpuIntStatus; // MPU uint8_t devStatusтан чыныгы үзгүлтүк статусунун байтына ээ; // ар бир түзмөк операциясынан кийин статусун кайтаруу (0 = ийгилик,! 0 = ката) uint16_t packetSize; // күтүлгөн DMP пакетинин өлчөмү (демейки 42 байт) uint16_t fifoCount; // учурда FIFO uint8_t fifoBufferдеги бардык байттардын саны [64]; // FIFO сактоо буфери Quaternion q; // [w, x, y, z] төрттүк контейнери VectorFloat гравитациясы; // [x, y, z] гравитациялык вектор float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll контейнери жана тартылуу вектору туруксуз бол mpuInterrupt = false; // MPU үзгүлтүк пининин жогору болгонун көрсөтөт

белгисиз узак lastPrintTime, lastMoveTime = 0;

SoftwareSerial BTserial (10, 11);

MPU6050 мпу;

жараксыз орнотуу ()

{Serial.begin (9600); BTserial.begin (38400); Serial.println ("Программа башталды"); инициализация = initializeGyroscope (); }

void loop () {

if (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); кайтуу; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& гравитация, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); башкаруу (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }}

/*

* 0дөн 180ге чейинки бурчту алат, бул жерде 0 максималдуу сол жана 180 эң оңго * -90дон 90го чейин ылдамдыкты алат, мында -90 эң артка жана 90 эң алдыга */ боштукту жылдырууZwheelsCar (байт бурчу, int ылдамдыгы) {if (millis () - lastMoveTime = 90) {resultAngle = карта (бурч, 91, 180, 1, 60); } else if (0 бурчу) {resultSpeed = карта (ылдамдык, 0, 90, 0, 60); } else if (ылдамдык <0) {resultSpeed = карта (ылдамдык, 0, -90, 120, 60); } Serial.print ("actualAngle ="); Serial.print (бурч); Serial.print (";"); Serial.print ("actualSpeed ="); Serial.print (resultSpeed); Serial.println (";"); BTserial.write (commandStering); BTserial.write (resultAngle); BTserial.write (commandSpeed); BTserial.write ((байт) resultSpeed); lastMoveTime = миллис (); }

жараксыз руль (int x, int y, int z)

{x = чектөө (x, -1 * MAX_ANGLE, MAX_ANGLE); y = чектөө (y, -1 * MAX_ANGLE, MAX_ANGLE); z = чектөө (z, -MAX_ANGLE, MAX_ANGLE); int бурчу = карта (y, -MAX_ANGLE, MAX_ANGLE, 0, 180); int ылдамдыгы = карта (z, -MAX_ANGLE, MAX_ANGLE, 90, -90); printDebug (x, y, z, бурч, ылдамдык); moveZwheelsCar (бурч, ылдамдык); }

void printDebug (int x, int y, int z, int бурчу, int ылдамдыгы)

{if (millis () - lastPrintTime <1000) {кайтаруу; } Serial.print ("z ="); Serial.print (x); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.print (";"); Serial.print ("бурч ="); Serial.print (бурч); Serial.print (";"); Serial.print ("speed ="); Serial.print (speed); Serial.println (";"); lastPrintTime = миллис (); }

bool initializeGyroscope ()

{Wire.begin (); mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 туташуусу ийгиликтүү"): F ("MPU6050 туташуусу ишке ашпай калды")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP Initialization failed (code"))); Serial.println (devStatus); false false;} mpu.setDMPEnabled (true); Serial.println (F ("Иштетүү) үзгүлтүктү аныктоо (Arduino тышкы үзгүлтүк 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP даяр! Биринчи үзүлүүнү күтүүдө… ")); packetSize = mpu.dmpGetFIFOPacketSize (); чындыкты кайтаруу;}

жараксыз dmpDataReady ()

{mpuInterrupt = true; }

логикалык hasFifoOverflown (int mpuIntStatus, int fifoCount)

{return mpuIntStatus & 0x10 || fifoCount == 1024; }

FTDI адаптерин колдонуп кодду arduinoго жүктөңүз, андан кийин батареяларды туташтырыңыз.

Алыстан башкаруу пультун колдонуу:

Ардуино күйгүзүлгөндөн кийин, машинаны да күйгүзүңүз. HC-05 модулу унаага туташуусу керек, бул болгондо унаа үн чыгарат. Эгер ал иштебесе, мурунку кадамды жана көйгөйлөрдү чечүү бөлүмүн текшериңиз.

Эгерде сиз нанды алдыга эңкейтип койсоңуз, машина алдыга, оңго жана машина оңго жылышы керек. Ал ошондой эле бара -бара кыймылдарды аткарат, бул учурда бир аз алдыга жана бир аз солго ийилүү, бул учурда унаа акырындык менен солго кетет.

Эгерде машина нанды башка жакка буруп кетсе, адегенде нанды ар кандай багытта кармаңыз.

Бул кантип иштейт:

Эскиз гироскоптун координаттарын 100 мс сайын алат, эсептөөлөрдү жүргүзөт, андан кийин машинанын буйруктарын Bluetooth аркылуу өткөрүп берет. Биринчиден, чийки x, y жана z бурчтары менен чакырылган "рид" ыкмасы бар. Бул ыкма рулду 0ден 180 градуска, ылдамдатууну -90 менен 90го айлантат. Бул ыкма чакырат

void moveZwheelsCar (байт бурчу, int ылдамдыгы) рулду жана ылдамдатууну ZenWheels спецификациясына айландырат жана андан кийин Bluetooth аркылуу буйруктарды өткөрүп берет.

Трансформацияны эки этапта жасаганымдын себеби, кайра колдонууга болот. Эгерде мен бул эскизди алыстан башкарууга ылайыкташтырышым керек болсо, мен ылдамдыкты жана рулду башка пайдалуу баалуулуктарга карта кылган "руль" базалык методунан баштамакмын.

7 -кадам: Альтернативалар

"Реверс инженериясына" альтернатива. Мен Android тиркемесинен баштап долбоорду кантип тескери инженер кылуу керектиги жөнүндө сүйлөштүм. Бирок буга альтернатива бар, сиз сериялык FTDI + bluetooth кулун орното аласыз (башкы жөндөөлөрдү көрсөтпөстөн кадимки HC-05). Андан кийин ZenWheels колдонмосунан "микрокарттын" ордуна HC-05ке туташыңыз.

Буйруктарды декоддоо үчүн рулду кандайдыр бир абалда кармашыңыз керек, андан кийин питон скриптин колдонуп сериялык байланышты талдаңыз. Мен питон сценарийин сунуштайм, анткени басып чыгарылбаган белгилер бар жана Arduino IDE бул үчүн ылайыктуу эмес. Сиз рулду бир абалда кармасаңыз, колдонмо үзгүлтүксүз ошол эле эки байтты өткөрүп берерин байкайсыз. Эгер дөңгөлөктүн ордун өзгөртсөңүз, мушт байт ошол бойдон калат, экинчиси өзгөрөт. Көптөгөн сыноолордон кийин сиз рулду башкаруунун алгоритмин ойлоп таба аласыз, андан кийин тескери инженер дроссели ж.

Arduino негизиндеги пультка альтернатива RaspberryPi пульту болмок. Малина пи камтылган bluetooth модулуна ээ, аны "мастер" режиминде орнотуу оорутпайт жана питон Bluetooth китепканасы тумар сыяктуу иштейт. Дагы бир нече кызыктуу долбоорлор Alexa echo аркылуу машинаны башкаруу сыяктуу мүмкүн:)

Долбоор сизге жакты деп ишенем жана төмөндө комментарий калтырыңыз!

Сунушталууда: