Робот собирает кубик Рубика- проблема соединения ардуино с андроидом по блютусу.
- Войдите на сайт для отправки комментариев
Здравствуйте прошу помощи в проверке скетча.Сам новичок. Проект это я в версии для компьютера собрал. Проект взят отсюда https://forum.arduino.cc/index.php?topic=271827.0
Моя версия проекта видео-https://drive.google.com/open?id=1sAy-wWc2d0Zay0D1325K9Gn9OlWEZPlI
Скетч для ардуино уно используется или для содинения ардуино по USB с компом или для соединения с телефоном(с использованием приложения RubikCubeV120.apk ·ссылка для скачивания https://www.dropbox.com/s/pj2jw52ypws5gzt/RubikCubeV120.apk?dl=0
С компьютером проблем нет робот работает о чем свидетельствует видео выше-то есть скетч в части алгоритма сборки все ок ,а в части сединения по блютуму молчание - ардуино молчит.
Сам скетч
#define VERSION "Cube Mover V1.3 @kas2014\n" // V1.3: added reseat(), slight overshot in xxArmCW() - Maker faire 2017 release // V1.2: refactored using Cube class - Posted // V1.1: replaced Servo with VarSpeedServo library // V1.0: initial release //Exposure: //Si Jaune reconnu comme blanc ou orange reconnu comme jaune: diminuer l'expo (-4 >> -6) //Si Jaune reconnu comme orange: augmenter l'expo (-6 >> -4) #include <VarSpeedServo.h> #include "cube.h" // ---------- user adjustments ------------------- #define DOWN_CLOSE 107 #define DOWN_OPEN 159 #define DOWN_CW 9 #define DOWN_MID 89 #define DOWN_CCW 172 #define BACK_CLOSE 111 #define BACK_OPEN 163 #define BACK_CW 2 #define BACK_MID 87 #define BACK_CCW 171 #define LOW_SPEED 50 #define HI_SPEED 100 // ----------------------------------------------- #define downPinchPin 9 #define downRotPin 10 #define backPinchPin 5 #define backRotPin 6 #define bipPin 11 // buzzer #define myRX 23 #define myTX 3 #define STX 0x02 // serial data frame delimiters #define ETX 0x03 boolean DEBUG_SERIAL = false; Cube myCube(downPinchPin, downRotPin, backPinchPin, backRotPin); char cmd[128]; // bytes received buffer void setup() { Serial.begin(57600); if (DEBUG_SERIAL) Serial.println(VERSION); pinMode(bipPin, OUTPUT); myCube.begin(HI_SPEED); // set HIGH servo's speed myCube.downSetLimits(DOWN_CLOSE, DOWN_OPEN, DOWN_CW,DOWN_MID, DOWN_CCW); // set limits for pinch and rotation servo's myCube.backSetLimits(BACK_CLOSE, BACK_OPEN, BACK_CW, BACK_MID, BACK_CCW); myCube.seize(); bip(20, 2); // bip } void loop() { // myCube.downArmOpen(); // uncomment for checking moves // myCube.backArmOpen(); // delay(8000); // myCube.downArmClose(); // myCube.backArmClose(); // delay(8000); if (DEBUG_SERIAL) { if(getSerialMonitor()) parseData(); // obtain commands from Serial Monitor } else { if(getSerialData()) parseData(); // obtain commands through Bluetooth } } // --------------------------- boolean getSerialData() { if(Serial.available()) { // data received from smartphone delay(2); cmd[0] = Serial.read(); if(cmd[0] == STX) { int i=1; while(Serial.available()) { delay(1); cmd[i] = Serial.read(); if(cmd[i]>'u' || i>124) {bip(100, 2); return false;} // Communication error XXX reinitialiser à zero <<< if((cmd[i]==ETX)) {bip(200, 1); return true; } i++; } } else {bip(100, 3); return false;} } return false; } boolean getSerialMonitor() { // Serial Monitor setting: Newline if(Serial.available()) { for(int i=0; i<124; i++) cmd[i] = 0; int n = Serial.readBytesUntil('\n', cmd, 124); cmd[n+1] = ETX; return true; } return false; } void parseData() { // parseData(cmd) int i = 0; String progress = ""; while (cmd[i] != ETX) { // mySerial.print(cmd[i]); mySerial.print(" "); switch(cmd[i]) { // Test commands -------------------------------------------------------------- // 1: downArmOpen 6: backArmOpen // 2: downArmClose 7: backArmClose // 3: downArmCW 8: backArmCW // 4: downArmCenter 9: backArmCenter // 5: downArmCCW 0: backArmCCW // T: seize release gripper pressure // R L U D B F T // case '1': // downArmOpen // myCube.downArmOpen(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("downArmOpen"); // break; // case '2': // downArmClose // myCube.downArmClose(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("downArmClose"); // break; // case '3': // downArmCW // myCube.downArmCW(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("downArmCW"); // break; // case '4': // downArmCenter // myCube.downArmCenter(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("downArmCenter"); // break; // case '5': // downArmCCW // myCube.downArmCCW(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("downArmCCW"); // break; // // case '6': // backArmOpen // myCube.backArmOpen(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("backArmOpen"); // break; // case '7': // backArmClose // myCube.backArmClose(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("backArmClose"); // break; // case '8': // backArmCW // myCube.backArmCW(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("backArmCW"); // break; // case '9': // backArmCenter // myCube.backArmCenter(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("backArmCenter"); // break; // case '0': // backArmCCW // myCube.backArmCCW(); // bip(40, 2); // if (DEBUG_SERIAL) Serial.print("backArmCCW"); // break; // // Move commands ------------------------------------------------------------ case 'R': // 'R' moves switch(cmd[i+1]) { case '2': if (DEBUG_SERIAL) Serial.print("R2 "); myCube.R2(); break; case 39: // ASCII 39: apostrophe character if (DEBUG_SERIAL) Serial.print("R' "); myCube.Rp(); break; default: if (DEBUG_SERIAL) Serial.print("R "); myCube.R(); break; } break; case 'L': // 'L' moves switch(cmd[i+1]) { case '2': if (DEBUG_SERIAL) Serial.print("L2 "); myCube.L2(); break; case 39: if (DEBUG_SERIAL) Serial.print("L' "); myCube.Lp(); break; default: if (DEBUG_SERIAL) Serial.print("L "); myCube.L(); break; } break; case 'U': // 'U' moves switch(cmd[i+1]) { case '2': if (DEBUG_SERIAL) Serial.print("U2 "); myCube.U2(); break; case 39: if (DEBUG_SERIAL) Serial.print("U' "); myCube.Up(); break; default: if (DEBUG_SERIAL) ; Serial.print("U "); myCube.U(); break; } break; case 'D': // 'D' moves switch(cmd[i+1]) { case '2': if (DEBUG_SERIAL) Serial.print("D2 "); myCube.D2(); break; case 39: if (DEBUG_SERIAL) Serial.print("D' "); myCube.Dp(); break; default: if (DEBUG_SERIAL) Serial.print("D "); myCube.D(); break; } break; case 'F': // 'F' moves switch(cmd[i+1]) { case '2': if (DEBUG_SERIAL) Serial.print("F2 "); myCube.Fr2(); break; case 39: if (DEBUG_SERIAL) Serial.print("F' "); myCube.Frp(); break; default: if (DEBUG_SERIAL) Serial.print("F "); myCube.Fr(); break; } break; case 'B': // 'B' moves switch(cmd[i+1]) { case '2': if (DEBUG_SERIAL) Serial.print("B2 "); myCube.B2(); break; case 39: if (DEBUG_SERIAL) Serial.print("B' "); myCube.Bp(); break; default: if (DEBUG_SERIAL) Serial.print("B "); myCube.B(); break; } break; // Scan commands ----------------------------------------------------------- case 'f': // Scan Front side myCube.scanFront(); Serial.println("OKf"); break; case 'r': // Scan Right side myCube.scanRight(); Serial.println("OKr"); break; case 'b': // Scan Back side myCube.scanBack(); Serial.println("OKb"); break; case 'l': // Scan Right side myCube.scanLeft(); Serial.println("OKl"); break; case 'u': // Scan Up side myCube.scanUp(); Serial.println("OKu"); break; case 'd': // Scan Down side myCube.scanDown(); Serial.println("OKd"); break; case 'g': // back to Front side myCube.scanFront2(); Serial.println("OKg"); break; // Other commands -------------------------------------------------------------- case 'T': // release gripper pressure myCube.seize(); bip(40, 2); if (DEBUG_SERIAL) Serial.print("seize"); break; case 'S': // change move speed switch(cmd[i+1]) { case '2': myCube.setSpeed(HI_SPEED); if (DEBUG_SERIAL) Serial.print("High Speed"); break; case '1': myCube.setSpeed(LOW_SPEED); if (DEBUG_SERIAL) Serial.print("Low Speed"); break; } break; case 'V': // bips switch(cmd[i+1]) { case '4': bip(80, 4); if (DEBUG_SERIAL) Serial.print("bip (4)"); break; case '2': bip(80, 2); if (DEBUG_SERIAL) Serial.print("bip (2)"); break; default: bip(80, 1); if (DEBUG_SERIAL) Serial.print("bip "); break; } break; default: break; } i++; } if (DEBUG_SERIAL) Serial.println(); bip(20, 2); } void bip(int duration, int n) { // Bip piezo: duration in ms, n repeats for(int i=0; i<n; i++) { digitalWrite(bipPin, HIGH); delay(duration); digitalWrite(bipPin, LOW); delay(75); } }
Телефон находит блютус на ардуине сондиняется но дальше тишина.
Сама работа блютуса ардуино и телефона проверены демонстрационным скетчем показывающим алгоритм работы.Для телефона используется тоже демонстрацинное приложение Джойстик Bluetooth Commander: V5.5 ссылка для ск. https://play.google.com/store/apps/details?id=org.projectproto.btjoystick&feature=search_result
Скетч демонстрационный AndroTest.ino демонстрационный эскиз: V2.0
#define VERSION "\n\nAndroTest V2.0 - @kas2014\ndemo for V5.X App (6 button version)" // V2.0 changed to pure ASCII Communication Protocol ** not backward compatible ** // V1.4 improved communication errors handling // V1.3 renamed for publishing, posted on 09/05/2014 // V1.2 Text display ** not backward compatible ** // V1.1 Integer display // V1.0 6 buttons + 4 data char implemented // Demo setup: // Button #1 controls pin #13 LED // Button #4 toggle datafield display rate // Button #5 configured as "push" button (momentary) // Other buttons display demo message // Arduino pin#2 to TX BlueTooth module // Arduino pin#3 to RX BlueTooth module // make sure your BT board is set @57600 bps // better remove SoftSerial for PWM based projects // For Mega 2560: // remove #include "SoftwareSerial.h", SoftwareSerial mySerial(2,3); // search/replace mySerial >> Serial1 // pin#18 to RX bluetooth module, pin#19 to TX bluetooth module #include "SoftwareSerial.h" #define STX 0x02 #define ETX 0x03 #define ledPin 13 #define SLOW 750 // Datafields refresh rate (ms) #define FAST 250 // Datafields refresh rate (ms) SoftwareSerial mySerial(2,3); // BlueTooth module: pin#2=TX pin#3=RX byte cmd[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // bytes received byte buttonStatus = 0; // first Byte sent to Android device long previousMillis = 0; // will store last time Buttons status was updated long sendInterval = SLOW; // interval between Buttons status transmission (milliseconds) String displayStatus = "xxxx"; // message to Android device void setup() { Serial.begin(57600); mySerial.begin(57600); // 57600 = max value for softserial pinMode(ledPin, OUTPUT); Serial.println(VERSION); while(mySerial.available()) mySerial.read(); // empty RX buffer } void loop() { if(mySerial.available()) { // data received from smartphone delay(2); cmd[0] = mySerial.read(); if(cmd[0] == STX) { int i=1; while(mySerial.available()) { delay(1); cmd[i] = mySerial.read(); if(cmd[i]>127 || i>7) break; // Communication error if((cmd[i]==ETX) && (i==2 || i==7)) break; // Button or Joystick data i++; } if (i==2) getButtonState(cmd[1]); // 3 Bytes ex: < STX "C" ETX > else if(i==7) getJoystickState(cmd); // 6 Bytes ex: < STX "200" "180" ETX > } } sendBlueToothData(); } void sendBlueToothData() { static long previousMillis = 0; long currentMillis = millis(); if(currentMillis - previousMillis > sendInterval) { // send data back to smartphone previousMillis = currentMillis; // Data frame transmitted back from Arduino to Android device: // < 0X02 Buttons state 0X01 DataField#1 0x04 DataField#2 0x05 DataField#3 0x03 > // < 0X02 "01011" 0X01 "120.00" 0x04 "-4500" 0x05 "Motor enabled" 0x03 > // example mySerial.print((char)STX); // Start of Transmission mySerial.print(getButtonStatusString()); mySerial.print((char)0x1); // buttons status feedback mySerial.print(GetdataInt1()); mySerial.print((char)0x4); // datafield #1 mySerial.print(GetdataFloat2()); mySerial.print((char)0x5); // datafield #2 mySerial.print(displayStatus); // datafield #3 mySerial.print((char)ETX); // End of Transmission } } String getButtonStatusString() { String bStatus = ""; for(int i=0; i<6; i++) { if(buttonStatus & (B100000 >>i)) bStatus += "1"; else bStatus += "0"; } return bStatus; } int GetdataInt1() { // Data dummy values sent to Android device for demo purpose static int i= -30; // Replace with your own code i ++; if(i >0) i = -30; return i; } float GetdataFloat2() { // Data dummy values sent to Android device for demo purpose static float i=50; // Replace with your own code i-=.5; if(i <-50) i = 50; return i; } void getJoystickState(byte data[8]) { int joyX = (data[1]-48)*100 + (data[2]-48)*10 + (data[3]-48); // obtain the Int from the ASCII representation int joyY = (data[4]-48)*100 + (data[5]-48)*10 + (data[6]-48); joyX = joyX - 200; // Offset to avoid joyY = joyY - 200; // transmitting negative numbers if(joyX<-100 || joyX>100 || joyY<-100 || joyY>100) return; // commmunication error // Your code here ... Serial.print("Joystick position: "); Serial.print(joyX); Serial.print(", "); Serial.println(joyY); } void getButtonState(int bStatus) { switch (bStatus) { // ----------------- BUTTON #1 ----------------------- case 'A': buttonStatus |= B000001; // ON Serial.println("\n** Button_1: ON **"); // your code... displayStatus = "LED <ON>"; Serial.println(displayStatus); digitalWrite(ledPin, HIGH); break; case 'B': buttonStatus &= B111110; // OFF Serial.println("\n** Button_1: OFF **"); // your code... displayStatus = "LED <OFF>"; Serial.println(displayStatus); digitalWrite(ledPin, LOW); break; // ----------------- BUTTON #2 ----------------------- case 'C': buttonStatus |= B000010; // ON Serial.println("\n** Button_2: ON **"); // your code... displayStatus = "Button2 <ON>"; Serial.println(displayStatus); break; case 'D': buttonStatus &= B111101; // OFF Serial.println("\n** Button_2: OFF **"); // your code... displayStatus = "Button2 <OFF>"; Serial.println(displayStatus); break; // ----------------- BUTTON #3 ----------------------- case 'E': buttonStatus |= B000100; // ON Serial.println("\n** Button_3: ON **"); // your code... displayStatus = "Motor #1 enabled"; // Demo text message Serial.println(displayStatus); break; case 'F': buttonStatus &= B111011; // OFF Serial.println("\n** Button_3: OFF **"); // your code... displayStatus = "Motor #1 stopped"; Serial.println(displayStatus); break; // ----------------- BUTTON #4 ----------------------- case 'G': buttonStatus |= B001000; // ON Serial.println("\n** Button_4: ON **"); // your code... displayStatus = "Datafield update <FAST>"; Serial.println(displayStatus); sendInterval = FAST; break; case 'H': buttonStatus &= B110111; // OFF Serial.println("\n** Button_4: OFF **"); // your code... displayStatus = "Datafield update <SLOW>"; Serial.println(displayStatus); sendInterval = SLOW; break; // ----------------- BUTTON #5 ----------------------- case 'I': // configured as momentary button // buttonStatus |= B010000; // ON Serial.println("\n** Button_5: ++ pushed ++ **"); // your code... displayStatus = "Button5: <pushed>"; break; // case 'J': // buttonStatus &= B101111; // OFF // // your code... // break; // ----------------- BUTTON #6 ----------------------- case 'K': buttonStatus |= B100000; // ON Serial.println("\n** Button_6: ON **"); // your code... displayStatus = "Button6 <ON>"; // Demo text message break; case 'L': buttonStatus &= B011111; // OFF Serial.println("\n** Button_6: OFF **"); // your code... displayStatus = "Button6 <OFF>"; break; } // --------------------------------------------------------------- }
С этим скетчем по сериал порту ардуино видно данные и светодиоды на ардуино моргают -тоесть пины ардуино рабочие контакт везде есть ардуино и телефон данными обмениваются.Пины в обоих скетчах выбраны одинаковые.
Тоесть железо проверено , алгоритм работы первого скетча проверен,но нет только соединения ардуино по блютусу с телефоном ни с приложением RubikCubeV120.apk ни с приложением демонстрационным Джойстик Bluetooth Commander: V5.5 .
Может в первом скетче в части соединения по блютусу ошибка ?
Оба скетча в моём верхнем сообщении имеют одинаковый алгоритм соединения телефона по блютусу с ардуино.