Мазмуну:
- 1 -кадам: Компоненттер жана инструменттер
- 2 -кадам: ZenWheels Android тиркемесин тескөө [милдеттүү эмес]
- 3 -кадам: Компоненттер
- 4 -кадам: Ассамблея
- 5-кадам: HC-05 Bluetoothун Microcar менен жупташтырыңыз
- 6 -кадам: Код жана колдонуу
- 7 -кадам: Альтернативалар
Video: ZenWheels Microcar үчүн Hackable Remote Control: 7 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:39
Бул үйрөткүчтө биз 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 менен жупташтырыңыз
Бул үчүн сизге 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 аркылуу машинаны башкаруу сыяктуу мүмкүн:)
Долбоор сизге жакты деп ишенем жана төмөндө комментарий калтырыңыз!
Сунушталууда:
Drone Fishing Super Remote үчүн Remote Servo Dropper: 7 кадам
Drone Fishing Super Remot үчүн друпер аларга шар
Hayward ColorLogic үчүн Wi-Fi Remote Control: 3 кадам
Hayward ColorLogic үчүн Wi-Fi Remote Control: Hayward ColorLogic-бул бассейндерге, курортторго, көлмөлөргө жана башка суу өзгөчөлүктөрүнө таанымал кошумча. Ар бир жарык ондогон катуу түстөрдү жана жарык көрсөтүүлөрдү берүү үчүн жаркыраган LED диапазонун камтыйт. Бул агрегаттар 12 VAC кубатын колдонушат, бул
LoRa Remote Control Messenger 1,8 "TFT менен 8 кмге чейинки аралыктар үчүн: 8 кадам
LoRa Remote Control Messenger 1,8 дюймдук аралыктар үчүн 8 кмге чейин: Долбоорду ноутбукка же телефонуңузга туташтырыңыз, андан кийин LoRa аркылуу интернетсиз же SMSсиз түзмөктөрдүн ортосунда баарлашыңыз. ПХБда дисплей жана 4 баскыч бар, аларды алыстан башкаруу катары колдонсо болот
ESP8266 RGB LED STRIP WIFI Control - NODEMCU Wifi аркылуу башкарылган LED тилкеси үчүн IR алыстан башкаруу пулу катары - RGB LED STRIP Smartphone Control: 4 кадам
ESP8266 RGB LED STRIP WIFI Control | NODEMCU Wifi аркылуу башкарылган LED тилкеси үчүн IR алыстан башкаруу пулу катары | RGB LED STRIP смартфонду көзөмөлдөө: Салам балдар бул окуу куралында биз nodemcu же esp8266ды IR пульту катары RGB LED тилкесин башкаруу үчүн колдонууну үйрөнөбүз жана Nodemcu смартфону WiFi аркылуу башкарылат. Ошентип, негизинен сиз RGB LED STRIPти смартфонуңуз менен башкара аласыз
Жөнөкөй Remote Control Kit Төрт каналдуу RC Toy Remote Controlго айланды: 4 кадам
Жөнөкөй Remote Control Kit төрт каналдуу RC оюнчуктун пультуна айланды: 如何 通用 遥控 器 套件 转换 为 玩具 中 中 使用 采用 采用 采用 6 2262 和 2272 和 433 个改造 方法 简单。 只需