Skocz do zawartości

marcin9453

Użytkownicy
  • Zawartość

    8
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O marcin9453

  • Ranga
    2/10
  1. Witam, robię manipulator 5 osiowy, który składa się z 6 serwomechanizmów. Robot ma być sterowany z Arduino UNO przez bluetooth z wykorzystaniem modułu HC-05. Serwa są na oddzielnym zasilaczu 6V 20A (taki duży ze względu na serwo głównego ramienia o mocy 35kg/cm przy 6v). Mój problem polega na tym, że przy sterowaniu ramieniem przez telefon gdy zmieniam wartość suwakiem jednego serwa wszystkie szarpią. Na początku myślałem, że jest to wina źle wysłanego info do arduino. Wyczytałem jednak, że biblioteki SoftwareSerial i Servo korzystają z tych samych timerów i dochodzi do jakiegoś konfliktu między nimi. Podobno stąd te szarpanie. Czy ktoś potrafiłby mi z tym pomóc ? Znalazłem kilka tematów na zagranicznych forach jednak nikt porządnie nie napisał jak rozwiązać problem... Poniżej kod programu #include <SoftwareSerial.h> #include <Servo.h> ServoTimer2 servo01; ServoTimer2 servo02; ServoTimer2 servo03; ServoTimer2 servo04; ServoTimer2 servo05; ServoTimer2 servo06; SoftwareSerial Bluetooth(9, 10); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps int speedDelay = 20; int index = 0; String dataIn = ""; void setup() { servo01.attach(3); servo02.attach(5); servo03.attach(6); servo04.attach(7); servo05.attach(8); servo06.attach(9); Bluetooth.begin(9600); // Default baud rate of the Bluetooth module Bluetooth.setTimeout(10); delay(20); // Robot arm initial position servo1PPos = 90; servo01.write(servo1PPos); servo2PPos = 90; servo02.write(servo2PPos); servo3PPos = 90; servo03.write(servo3PPos); servo4PPos = 90; servo04.write(servo4PPos); servo5PPos = 90; servo05.write(servo5PPos); servo6PPos = 90; servo06.write(servo6PPos); } void loop() { // Check for incoming data if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); // Read the data as string // If "Waist" slider has changed value - Move Servo 1 to position if (dataIn.startsWith("s1")) { String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120" servo1Pos = dataInS.toInt(); // Convert the string into integer // We use for loops so we can control the speed of the servo // If previous position is bigger then current position if (servo1PPos > servo1Pos) { for ( int j = servo1PPos; j >= servo1Pos; j--) { // Run servo down servo01.write(j); delay(20); // defines the speed at which the servo rotates } } // If previous position is smaller then current position if (servo1PPos < servo1Pos) { for ( int j = servo1PPos; j <= servo1Pos; j++) { // Run servo up servo01.write(j); delay(20); } } servo1PPos = servo1Pos; // set current position as previous position } // Move Servo 2 if (dataIn.startsWith("s2")) { String dataInS = dataIn.substring(2, dataIn.length()); servo2Pos = dataInS.toInt(); if (servo2PPos > servo2Pos) { for ( int j = servo2PPos; j >= servo2Pos; j--) { servo02.write(j); delay(50); } } if (servo2PPos < servo2Pos) { for ( int j = servo2PPos; j <= servo2Pos; j++) { servo02.write(j); delay(50); } } servo2PPos = servo2Pos; } // Move Servo 3 if (dataIn.startsWith("s3")) { String dataInS = dataIn.substring(2, dataIn.length()); servo3Pos = dataInS.toInt(); if (servo3PPos > servo3Pos) { for ( int j = servo3PPos; j >= servo3Pos; j--) { servo03.write(j); delay(30); } } if (servo3PPos < servo3Pos) { for ( int j = servo3PPos; j <= servo3Pos; j++) { servo03.write(j); delay(30); } } servo3PPos = servo3Pos; } // Move Servo 4 if (dataIn.startsWith("s4")) { String dataInS = dataIn.substring(2, dataIn.length()); servo4Pos = dataInS.toInt(); if (servo4PPos > servo4Pos) { for ( int j = servo4PPos; j >= servo4Pos; j--) { servo04.write(j); delay(30); } } if (servo4PPos < servo4Pos) { for ( int j = servo4PPos; j <= servo4Pos; j++) { servo04.write(j); delay(30); } } servo4PPos = servo4Pos; } // Move Servo 5 if (dataIn.startsWith("s5")) { String dataInS = dataIn.substring(2, dataIn.length()); servo5Pos = dataInS.toInt(); if (servo5PPos > servo5Pos) { for ( int j = servo5PPos; j >= servo5Pos; j--) { servo05.write(j); delay(30); } } if (servo5PPos < servo5Pos) { for ( int j = servo5PPos; j <= servo5Pos; j++) { servo05.write(j); delay(30); } } servo5PPos = servo5Pos; } // Move Servo 6 if (dataIn.startsWith("s6")) { String dataInS = dataIn.substring(2, dataIn.length()); servo6Pos = dataInS.toInt(); if (servo6PPos > servo6Pos) { for ( int j = servo6PPos; j >= servo6Pos; j--) { servo06.write(j); delay(30); } } if (servo6PPos < servo6Pos) { for ( int j = servo6PPos; j <= servo6Pos; j++) { servo06.write(j); delay(30); } } servo6PPos = servo6Pos; } // If button "SAVE" is pressed if (dataIn.startsWith("SAVE")) { servo01SP[index] = servo1PPos; // save position into the array servo02SP[index] = servo2PPos; servo03SP[index] = servo3PPos; servo04SP[index] = servo4PPos; servo05SP[index] = servo5PPos; servo06SP[index] = servo6PPos; index++; // Increase the array index } // If button "RUN" is pressed if (dataIn.startsWith("RUN")) { runservo(); // Automatic mode - run the saved steps } // If button "RESET" is pressed if ( dataIn == "RESET") { memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0 memset(servo02SP, 0, sizeof(servo02SP)); memset(servo03SP, 0, sizeof(servo03SP)); memset(servo04SP, 0, sizeof(servo04SP)); memset(servo05SP, 0, sizeof(servo05SP)); memset(servo06SP, 0, sizeof(servo06SP)); index = 0; // Index to 0 } } } // Automatic mode custom function - run the saved steps void runservo() { while (dataIn != "RESET") { // Run the steps over and over again until "RESET" button is pressed for (int i = 0; i <= index - 2; i++) { // Run through all steps(index) if (Bluetooth.available() > 0) { // Check for incomding data dataIn = Bluetooth.readString(); if ( dataIn == "PAUSE") { // If button "PAUSE" is pressed while (dataIn != "RUN") { // Wait until "RUN" is pressed again if (Bluetooth.available() > 0) { dataIn = Bluetooth.readString(); if ( dataIn == "RESET") { break; } } } } // If speed slider is changed if (dataIn.startsWith("ss")) { String dataInS = dataIn.substring(2, dataIn.length()); speedDelay = dataInS.toInt(); // Change servo speed (delay time) } } // Servo 1 if (servo01SP[i] == servo01SP[i + 1]) { } if (servo01SP[i] > servo01SP[i + 1]) { for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) { servo01.write(j); delay(speedDelay); } } if (servo01SP[i] < servo01SP[i + 1]) { for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) { servo01.write(j); delay(speedDelay); } } // Servo 2 if (servo02SP[i] == servo02SP[i + 1]) { } if (servo02SP[i] > servo02SP[i + 1]) { for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) { servo02.write(j); delay(speedDelay); } } if (servo02SP[i] < servo02SP[i + 1]) { for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) { servo02.write(j); delay(speedDelay); } } // Servo 3 if (servo03SP[i] == servo03SP[i + 1]) { } if (servo03SP[i] > servo03SP[i + 1]) { for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) { servo03.write(j); delay(speedDelay); } } if (servo03SP[i] < servo03SP[i + 1]) { for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) { servo03.write(j); delay(speedDelay); } } // Servo 4 if (servo04SP[i] == servo04SP[i + 1]) { } if (servo04SP[i] > servo04SP[i + 1]) { for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) { servo04.write(j); delay(speedDelay); } } if (servo04SP[i] < servo04SP[i + 1]) { for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) { servo04.write(j); delay(speedDelay); } } // Servo 5 if (servo05SP[i] == servo05SP[i + 1]) { } if (servo05SP[i] > servo05SP[i + 1]) { for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) { servo05.write(j); delay(speedDelay); } } if (servo05SP[i] < servo05SP[i + 1]) { for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) { servo05.write(j); delay(speedDelay); } } // Servo 6 if (servo06SP[i] == servo06SP[i + 1]) { } if (servo06SP[i] > servo06SP[i + 1]) { for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) { servo06.write(j); delay(speedDelay); } } if (servo06SP[i] < servo06SP[i + 1]) { for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) { servo06.write(j); delay(speedDelay); } } } } }
  2. Działa lecz za mały udźwig. Kupiłem zasilacz impulsowy 6V 20A z aliexpress. Jeśli będzie ok to powinien podołać
  3. Wiem, że można zasilać te serwo napięciem 7,4 V. Nie chcę używać akumulatorów. Serwo będzie jako napęd glownego ramienia robota (manipulatora) i dlatego chcę użyć ATXa
  4. Witam, chciałbym się poradzić w sprawie zasilania do serwa Power HD 1235. Posiadam stary zasilacz ATX i zastanawiam się jak go przerobić żeby na wyjsciu otrzymać 6v i możliwie duży prąd. Podłączyłem przez przetwornice step down 300W jednak nie radzi sobie.
  5. Ok jeszcze jedno pytanie. Czy do obrotu podstawy i obrotu drugiego ramienia wystarczy serwo mg995? Dodam że człony będą dobrze ułożyskowane.
  6. Myślę, że serwo ok 50kg powinno swobodnie machać tym ramieniem z racji tego że masa jest rozłożona. Postaram się jak najbardziej odchudzić co się da Deshipu co sądzisz- lepiej kupić serwa 2x 30kg*cm czy jedno 60kg*cm?
  7. Całe ramię ok 2,5kg. Długość 440mm. Posiadam serwo Jx pdi 6225 i zastanawiam się czy kupić takie drugie
  8. Witam, Buduję manipulator 5 osiowy jako pracę inż. Robot będzie budowany na podobe Niryo One z tym, że do wszystkich napędów chcę użyć serwa. Chciałbym się poradzić czy na główne ramie (dolne) lepiej dać dwa serwa po 25kg*cm czy jedno 50kg*cm
×
×
  • Utwórz nowe...