Cara Buat Robot Arm Arduino 4 Servo: Kuasa Berasingan dan Kod Joystick

Cartoon of a four-joint robot arm made from bright translucent-blue SG90 micro servos on a light-brown cardboard frame gripping an orange cube, with two black joystick modules, a black four-cell AA battery case, and a blue Arduino board cropped at the edge

Pin 5 V Arduino Uno mampu tanggung lebih kurang satu SG90 tanpa beban β€” bukan empat. Empat servo mikro menarik 0.4–1 A ketika lengan bergerak dan sehingga 2.8 A bila kesemuanya menyentak ke kedudukan serentak, berbanding lebih kurang 450 mA sahaja atas USB. Beri servo itu pack 4×AA mereka sendiri, satukan ground, dan pandu setiap joint secara incremental supaya lengan itu kekal pada kedudukannya bila anda lepaskan joystick.

Bekalan kuasa sendiri dan kawalan yang boleh memegang kedudukan β€” dua perkara itulah yang dipaksa oleh lengan empat-joint, dan yang pan-tilt dua servo tidak pernah paksa. Selebihnya kadbod dan kesabaran. Tiada apa di sini berjalan melebihi 6 V, jadi tiada risiko renjatan β€” yang akan cedera ialah servo yang stall, yang akan masak, dan gear train nylon, yang akan gondol giginya.

Berapa banyak servo SG90 yang rel 5V Arduino Uno sebenarnya mampu tanggung?

Arduino Uno boleh mengalamatkan dua belas servo dan menguasakan lebih kurang satu. Isyarat hampir tidak berharga: library Servo merampas satu timer 16-bit dan berkongsi timer itu merentas sehingga dua belas servo, menghantar pulse 544–2400 Β΅s kepada setiap satu setiap 20 ms. ATmega328P hanya ada satu timer 16-bit, iaitu Timer1, dan itulah sebabnya dua belas menjadi siling dan sebabnya analogWrite() berhenti berfungsi pada pin 9 dan 10 sebaik sahaja sebuah servo di-attach β€” library itu telah ambil timer mereka. Semuanya ada dalam fail Servo.h library berkenaan.

Arus pula ialah bajet yang menggigit. Elektronik sebuah SG90 hanya makan sekitar 10 mA ketika diam, tetapi di belakangnya duduk sebuah motor DC berus dan gearbox nylon, dan berapa yang mereka tarik bergantung pada berapa kuat mereka bekerja:

Apa yang servo sedang buat Satu SG90 Empat serentak
Berkuasa, memegang kedudukan tanpa apa-apa untuk diangkat ~10 mA ~40 mA
Menggerakkan lengan kadbod yang ringan 100–250 mA 0.4–1 A
Stall β€” tersekat, terlebih beban, atau menyentak ke kedudukan ketika baru dihidupkan 350–700 mA 1.4–2.8 A

Stall ialah satu julat, bukan satu angka datasheet: data sheet SG90 yang diterbitkan memberi tork, kelajuan dan lebar pulse tetapi tiada langsung angka arus, jadi saiz bekalan anda ikut hujung tertinggi julat itu. Dua komponen yang menghadkan apa yang Uno mampu tawarkan terhadap permintaan itu:

Uno dikuasakan melalui Apa yang mengehadkan rel 5V Apa yang rel 5V mampu beri
Port USB 2.0 Polyfuse 500 mA pada input USB ~500 mA, lebih kurang 450 mA sahaja tinggal selepas board itu ambil bahagiannya
Barrel jack pada 9 V Haba dalam regulator linear SOT-223 ~270 mA
Barrel jack pada 12 V Regulator yang sama, jatuh voltan lebih besar ~155 mA

Angka barrel jack itu ialah aritmetik yang anda boleh semak sendiri. Kuasa 5 V pada Uno datang daripada regulator linear kelas 1117 dalam pakej SOT-223, dan regulator linear tidak menukar voltan lebihan β€” ia membakarnya, pada (Vin − 5) × arus watt. Sesebuah pakej mampu buang (TJ(maks) − suhu sekeliling) ÷ ΞΈJA watt sebelum thermal shutdown: had junction 125 Β°C, angka 88 Β°C/W bagi SOT-223 dan meja kerja pada 30 Β°C memberi lebih kurang 1.08 W. Pada 9 V jatuh voltannya 4 V, jadi 1.08 W ÷ 4 V ≈ 270 mA; pada 12 V jatuhnya 7 V dan watt yang sama hanya membeli 155 mA. Voltan input yang lebih tinggi memberi arus 5 V yang lebih sedikit, bukan lebih banyak.

Detik power-up yang paling kerap menangkap orang: attach() dan write() pertama membuatkan setiap servo menyentak ke sudut yang diarahkan serentak, hampir pada arus stall. Polyfuse itu peranti PTC β€” ia memanas dan rintangannya naik, jadi rel itu melendut dan bukannya terputus. Biar lendutan itu melepasi ambang brown-out ATmega328P, cip itu reset, setup() berjalan semula, servo menyentak semula: satu lengan yang berkedut dalam gelung reset dan nampak persis macam bug kod.

Pilihan β€” untuk lengan yang melentur, bekalan mains di meja, atau lebih banyak joint

ItemPriceQty
SG90 MG90 Tower Pro Micro Servo Motor 9g 180 360 Servo Motor for Arduino Robotic - MG90- 180Β°SG90 MG90 Tower Pro Micro Servo Motor 9g 180 360 Servo Motor for Arduino Robotic - MG90- 180Β°MG90180RM11.55
Power Supply Adapter DC Universal AC to DC Converter PSU 5V2A 5V3A 9V2A 12V2A - P.S. ADAPTOR (5V3A)Power Supply Adapter DC Universal AC to DC Converter PSU 5V2A 5V3A 9V2A 12V2A - P.S. ADAPTOR (5V3A)PSA0503RM12.95
5.5x2.1mm DC Power Male Connector Plug Jack Adapter for Arduino DIY Electronics Projects - 5.5x2.1 DC CONNECTOR (F)5.5x2.1mm DC Power Male Connector Plug Jack Adapter for Arduino DIY Electronics Projects - 5.5x2.1 DC CONNECTOR (F)5521DCFRM1.20
16 Channel PWM Servo Motor Driver PCA9685 16 PWM Output with I2C Communication For Arduino Robotic16 Channel PWM Servo Motor Driver PCA9685 16 PWM Output with I2C Communication For Arduino RoboticPCA9685RM18.95

Servo metal-gear MG90 untuk base dan shoulder kalau lengan itu melentur bawah beratnya sendiri; adapter 5V 3A berserta pigtail barrel jack sebagai alternatif meja kerja yang lebih kemas berbanding bateri; pemacu PCA9685 pula hanya bila anda sudah melebihi empat pin terus.

Bagaimana anda beri empat servo bekalan kuasa mereka sendiri?

Bekas bateri 4×AA ialah jawapan betul yang paling mudah, dan voltannya mendarat tepat di tempat yang sepatutnya: empat sel alkali memberi 6.0 V nominal, empat sel NiMH 4.8 V, kedua-duanya di dalam tetingkap 4.8–6 V yang dikadarkan untuk SG90 dan kedua-duanya mampu mengeluarkan amp. Sel alkali baru membaca lebih hampir 1.6 V setiap satu tanpa beban, jadi pack baru boleh meter sekitar 6.4 V β€” tidak memudaratkan, sebab rintangan dalamannya menarik bacaan itu balik ke dalam tetingkap sebaik sahaja servo mula menarik arus, dan itu juga sebab jangan capai apa-apa yang lebih besar, kerana pack 7.2 V tiada ruang untuk melendut.

Bawa lead merah pack itu ke rel merah breadboard dan lead hitamnya ke rel biru β€” lead terdampar akan mengembang dalam lubang breadboard, jadi tin hujungnya atau pintal setiap satu pada sebatang pin jumper male. Meter kedua-dua rel itu sebelum satu servo pun masuk: SG90 tiada diod perlindungan songsang, jadi satu pasangan yang tersilap terbalik membunuh keempat-empatnya serentak dan tanpa sebarang bunyi. Selepas itu kesemua empat wayar merah servo pergi ke rel merah, kesemua empat wayar perang ke rel biru.

Kemudian satukan ground. Inilah langkah yang selalu terlepas. Sebuah servo tidak membaca pulse anda sebagai “pulse” yang abstrak β€” ia membaca voltan pada wayar oren relatif kepada wayar perangnya sendiri. Kalau negatif bateri dan ground Uno bukan nod elektrik yang sama, kedua-dua rujukan itu hanyut berjauhan dan servo nampak isyarat yang tidak mampu ia terjemah: lengan bergegar, merayap, atau langsung tidak bergerak. Satu jumper hitam dari header GND Uno ke rel biru menyelesaikannya.

Jangan sekali-kali sambung pack itu ke pin 5V Uno. Pin itu duduk selepas regulator, berwayar terus kepada ATmega328P yang dispesifikasikan untuk voltan operasi maksimum 5.5 V dan maksimum mutlak 6.0 V. Pack alkali yang baru duduk tepat atas siling itu, dan dengan USB masih tercucuk anda menolaknya balik ke dalam port komputer anda juga. VIN gagal dengan cara lain pula: regulator linear perlukan lebih kurang satu volt headroom, jadi 6 V masuk tidak mampu menahan 5 V keluar. Biarkan Uno atas USB. Kalau mahu bekalan meja kerja dari mains dan bukan sel bateri, adapter 5 V 3 A dengan pigtail barrel jack masuk ke rel breadboard sudah cukup untuk empat servo yang stall serentak.

Untuk menjalankan lengan itu jauh daripada laptop, suap board itu melalui barrel jacknya pula: pack 7–12 V atau bateri PP3 9 V selesa di situ, sebab Uno dan dua joystick bersama-sama duduk jauh di bawah 270 mA tadi. Larangan itu untuk rel servo, bukan untuk board.

Bagaimana empat joint dan dua joystick disambung?

Sebuah robot arm Arduino yang minimum ada empat joint: putaran base pada paksi menegak, shoulder yang mengangkat lengan atas, elbow yang melipat lengan bawah, dan sebuah gripper. Dua modul joystick memberi tepat empat paksi analog β€” stick kiri untuk base dan shoulder, stick kanan untuk elbow dan gripper.

Kartun pandangan sisi sebuah robot arm kadbod yang dibina atas empat servo mikro biru lut sinar terang, dengan anak panah melengkung berwarna navy menunjukkan putaran base, angkatan shoulder, lipatan elbow dan bukaan-tutup gripper
Empat joint sebuah lengan minimum: putaran base, shoulder, elbow, gripper. Dua joystick memberi tepat empat paksi analog β€” satu untuk setiap joint.

Lead setiap SG90 berakhir dengan soket female tiga pin berwarna hitam, jadi jumper male-to-male yang mencapai header female Uno dan rel breadboard. Joystick pula jantina bertentangan β€” pin male bersudut tepat β€” jadi ia mengambil jumper male-to-female; panduan wayar jumper kami menerangkan hujung mana kena dengan apa.

Dari Ke Nota
Oren servo (isyarat) ×4 D9 base, D10 shoulder, D11 elbow, D3 gripper Mana-mana pin digital boleh; library Servo tetap ambil PWM pada 9 dan 10
Merah servo ×4 Rel merah breadboard Dari bateri β€” jangan sekali-kali dari Uno
Perang servo ×4 Rel biru breadboard
Bateri + / − Rel merah / rel biru Suis pada bekas bateri itulah kill switch anda
GND Uno Rel biru breadboard Ground sepunya β€” wajib
5V Uno Rel merah di tepi breadboard yang sebelah lagi Rel logik β€” joystick sahaja, jangan servo
Dua-dua rel biru Disambung dengan satu jumper Bateri, Uno dan joystick atas satu ground
Joystick 1: +5V, GND, VRx, VRy Rel merah logik, rel biru, A0, A1 Base dan shoulder
Joystick 2: +5V, GND, VRx, VRy Rel merah logik, rel biru, A2, A3 Elbow dan gripper
Joystick 2: SW D2 Butang park, guna pull-up dalaman

Joystick boleh mengambil 5 V daripada Uno, dan hanya merekalah yang boleh: setiap modul HW-504 ialah dua potensiometer 10 kΞ© merentas rel, lebih kurang setengah miliamp bagi setiap paksi. VRx dan VRy ialah paksi analognya; SW pula suis tekan yang memintas ke ground, bukan paksi ketiga, jadi ia perlukan pull-up.

Arah aturan itu sama pentingnya dengan aturan itu sendiri. Joystick ialah potensiometer, jadi VRx ialah pecahan daripada apa jua voltan yang menyuapnya, dan analogRead() mengukur pecahan itu terhadap 5 V Uno sendiri sebagai skala penuh: jalankan stick daripada pack 6 V dan paksi yang berada di tengah akan membaca sekitar 614 dan bukan 512, yang dibaca oleh sketch sebagai stick yang ditolak kekal ke satu arah β€” joint pun hanyut sendiri. Uno hanya ada satu pin 5 V sedangkan dua stick masing-masing mahukan 5 V dan GND, jadi berikan tepi panjang breadboard yang sebelah lagi tugas itu: satu jumper dari 5V Uno ke rel merah itu, kedua-dua pin +5V stick masuk ke situ, pin GND mereka pada rel biru di sebelahnya, dan satu jumper mengikat rel biru itu merentas ke rel biru bateri. Dua bekalan itu berkongsi ground, tidak pernah berkongsi positif.

Kenapa joystick kena tetapkan kelajuan dan bukan sudut?

Joystick analog bersepring: lepaskan ia dan ia kembali ke tengah, di mana analogRead() melaporkan lebih kurang 512 daripada 1023. Petakan bacaan itu terus kepada sudut β€” pendekatan yang betul untuk kepala pan-tilt, seperti dalam panduan pan-tilt joystick kami β€” dan tengah bermakna 90Β°. Jadi saat anda lepaskan tangan, setiap joint diarahkan balik ke 90Β° dan lengan itu pun terlipat jatuh.

Kawalan incremental menyongsangkan perkara itu: pesongan menetapkan kelajuan, bukan kedudukan. Setiap 20 ms sketch mengukur berapa jauh stick duduk daripada tengah dan menambah sekeping darjah yang berkadaran kepada satu sudut sasaran yang disimpan. Tolak separuh jalan dan joint merayap; tolak penuh dan ia bergerak lebih kurang 60 Β°/s; biar ia kembali ke tengah dan tiada apa yang ditambah, jadi lengan itu kekal di tempatnya.

Tiga perincian yang membuatkan ia berkelakuan baik. Satu deadband sekitar 40 count di kiri dan kanan 512 ditolak dahulu sebelum apa-apa ditambah, sebab stick yang sedang rehat tidak pernah membaca 512 yang bersih β€” pusat mekanikal pot dan bunyi bising ADC merayau beberapa count, dan tanpa deadband lengan itu akan merayap sendiri. constrain() mengapit setiap sasaran antara had setiap joint, supaya sesebuah joint tidak boleh dipandu masuk ke dalam rangkanya sendiri. Dan sasaran itu jenis float, jadi tolakan lembut mengumpul pecahan darjah dan bukannya dibundarkan menjadi sifar. Tick 20 ms itu sendiri ialah satu frame refresh servo β€” library mengeluarkan satu pulse bagi setiap servo bagi setiap frame, jadi sasaran yang dikemas kini lebih laju daripada itu tidak akan sampai ke motor.

Perbandingan kartun sebuah robot arm kadbod atas servo biru lut sinar terang yang jatuh terlipat bila joystick di tengah dipetakan terus kepada sudut, berbanding lengan yang sama mengekalkan posisi terangkatnya di bawah kawalan incremental
Joystick yang sama dilepaskan, dua sketch berbeza. Pemetaan sudut terus menghantar setiap joint balik ke 90Β° dan lengan itu jatuh terlipat; kawalan incremental tidak menambah apa-apa bila stick di tengah, jadi kedudukannya kekal.

Macam mana rupa kod robot arm Arduino itu?

Sketch ini hanya perlukan library Servo yang datang sekali dengan Arduino IDE, dan ia dikompil menjadi 5162 bait flash (16% sebuah Uno) dan 282 bait RAM. Set dahulu array had mengikut julat sebenar lengan anda. AXIS_PIN menentukan stick mana memandu joint mana dan INVERT menentukan arah putarannya: tukar satu entri INVERT untuk joint yang bergerak terbalik, tukar dua entri AXIS_PIN kalau joint yang salah pula bergerak.

// Robot arm 4 servo atas Arduino Uno, dipandu oleh dua joystick analog.
// Stick menetapkan KELAJUAN, bukan sudut: tolak dan joint merayap ke arah itu,
// lepaskan dan joint kekal tepat di tempatnya. Itulah yang membolehkan lengan
// memegang kedudukannya - pemetaan analogRead terus kepada sudut akan
// menjatuhkan lengan sebaik stick itu melantun balik ke tengah.
//
// KUASA SERVO TIDAK DATANG DARIPADA UNO. Empat wayar merah servo pergi ke
// pack 4xAA yang berasingan (atau bekalan 5V); hanya ground yang dikongsi.

#include <Servo.h>

Servo joint[4];                                     // base, shoulder, elbow, gripper

const uint8_t  SERVO_PIN[4] = {  9,  10,  11,   3 };  // pin isyarat (wayar oren servo)
const uint8_t  AXIS_PIN[4]  = { A0,  A1,  A2,  A3 };  // stick 1 VRx/VRy, stick 2 VRx/VRy
const bool     INVERT[4]    = { false, true, false, false };
const uint8_t  MIN_DEG[4]   = { 10,  30,  20,  25 };  // had mekanikal - ukur lengan ANDA
const uint8_t  MAX_DEG[4]   = { 170, 150, 160,  90 };
const uint8_t  HOME_DEG[4]  = { 90,  90,  90,  60 };  // kedudukan park

const uint8_t  PARK_BUTTON  = 2;                    // pin SW stick 2, berwayar ke D2
const int      CENTRE       = 512;                  // analogRead() ketika rehat, 0..1023
const int      DEADBAND     = 40;                   // abaikan sebanyak ini goyangan sekitar tengah
const float    MAX_STEP     = 1.2;                  // darjah setiap tick pada pesongan penuh
const unsigned long TICK_MS = 20;                   // satu tick bagi satu frame refresh servo

float target[4];                                    // kedudukan yang kita arahkan, dalam darjah
unsigned long lastTick = 0;

void setup() {
  Serial.begin(9600);
  pinMode(PARK_BUTTON, INPUT_PULLUP);               // SW memintas ke GND bila ditekan

  for (uint8_t i = 0; i < 4; i++) {
    target[i] = HOME_DEG[i];
    joint[i].attach(SERVO_PIN[i]);
    joint[i].write(HOME_DEG[i]);
    delay(400);                                     // satu joint pada satu masa: empat servo
  }                                                 // menyentak serentak ialah lonjakan arus
                                                    // paling teruk yang lengan ini akan tarik
  Serial.println(F("Arm parked. Servos must run from their own supply."));
}

void loop() {
  unsigned long now = millis();
  if (now - lastTick < TICK_MS) return;             // tiada apa nak buat antara frame
  lastTick = now;

  bool parking = (digitalRead(PARK_BUTTON) == LOW);

  for (uint8_t i = 0; i < 4; i++) {
    if (parking) {
      // Merangkak balik ke kedudukan park pada kelajuan yang sama seperti tolakan stick penuh.
      if (target[i] < HOME_DEG[i]) target[i] = min(target[i] + MAX_STEP, (float)HOME_DEG[i]);
      else                         target[i] = max(target[i] - MAX_STEP, (float)HOME_DEG[i]);
    } else {
      int offset = analogRead(AXIS_PIN[i]) - CENTRE;
      if (abs(offset) <= DEADBAND) continue;        // stick rehat: tiada write, joint kekal

      // Tolak deadband supaya joint bermula dari kelajuan sifar, bukan satu lompatan.
      offset += (offset > 0) ? -DEADBAND : DEADBAND;

      float step = (float)offset * MAX_STEP / (float)(CENTRE - DEADBAND);
      if (INVERT[i]) step = -step;

      target[i] = constrain(target[i] + step, (float)MIN_DEG[i], (float)MAX_DEG[i]);
    }
    joint[i].write((int)(target[i] + 0.5));         // bundarkan, kemudian hantar sudut frame ini
  }
}

Dua baris membawa lebih daripada rupanya: delay(400) menyusun servo supaya mereka sampai ke home satu demi satu, menukar lonjakan arus paling teruk sesi itu menjadi empat lonjakan kecil, dan continue pula melangkau write() β€” servo yang tidak dihantar apa-apa akan memegang sudut terakhirnya, jadi tidak buat apa-apa itulah pegangannya.

Rangka lengan itu dibuat daripada apa?

Kami menjual elektroniknya, bukan rangkanya β€” tiada casis lengan atau bahagian cetakan dalam katalog kami. Itu kurang bermakna daripada bunyinya: kadbod beralun, dipotong dengan pisau craft dan dilekat dengan hot glue, ialah bahan yang betul untuk versi pertama, sebab anda akan mereka semula geometrinya tiga kali. Akrilik atau plywood 3 mm ialah naik tarafnya.

Tork yang menentukan geometri itu. SG90 kami dikadarkan 1.3 kg/cm pada 4.8 V β€” 1.3 kg dipegang satu sentimeter dari shaft, jadi lebih kurang 130 g pada sepuluh sentimeter, tolak berat lengan itu sendiri. Kekalkan setiap segmen pada 10–12 cm, pastikan gripper ringan, dan jangkakan shoulder yang mengalah dahulu β€” ia mengangkat lengan bawah, servo elbow, gripper dan bebannya sekali gus, atas tuas terpanjang dalam lengan itu. MG90 ialah jawapan pasang-terus: tapak dan lead yang sama, 2.2 kg/cm pada 6 V, gear logam menggantikan nylon.

Beri setiap joint satu pivot di sebelah bertentangan dengan servo β€” sebatang bolt, atau skru menembusi washer kadbod, betul-betul atas paksi joint itu. Output SG90 ialah spline nylon kecil di atas gear train nylon, dibuat untuk memusing beban dan bukan untuk memikulnya, jadi lengan bawah yang tergantung padanya seorang diri memaksa setiap daya lenturan masuk ke dalam gear itu. Beratkan plat base juga, kalau tidak servo base akan memusingkan base dan bukan lengan.

Pasang horn paling akhir. Biar setiap joint sampai ke sudut homenya sebelum anda ketatkan skru horn, kemudian pasang setiap horn pada pertengahan perjalanannya: pasang servo pada satu hujung julatnya dan separuh pergerakan anda hilang ke dalam rangka. Panduan servo 180Β° vs 270Β° vs 360Β° kami membincangkan horn dan julat sudut β€” sebuah lengan mahukan unit posisi 180Β°, bukan unit continuous-rotation. Menonton rangka empat-joint dipasang membantu di sini:

Bila anda sudah melebihi empat pin terus?

Tiga perkara menolak anda ke arah pemacu 16-channel PCA9685: joint lebih banyak daripada pin yang senang dicapai; mahukan pin 9 dan 10 balik untuk analogWrite(); atau library yang menyekat interrupt untuk tempoh yang panjang β€” kad SD, sesetengah paparan β€” yang membuatkan pulse janaan timer bergegar, sedangkan PCA9685 mengeluarkan pulsenya daripada osilator sendiri tanpa peduli. Panduan PCA9685 kami membincangkan langkah itu. Apa yang ia tidak buat ialah menciptakan arus: terminal skru V+ nya tetap perlukan bekalan luaran yang sama.

Kesilapan biasa yang kami lihat

Membuktikan ia berfungsi dengan satu servo atas pin 5 V Uno. Satu SG90 memang betul-betul boleh jalan dari pin itu, jadi ujian pertama lulus dan pendawaian nampak macam sudah selesai. Dua pun selalunya nampak elok β€” kemudian joint ketiga atau keempat menjatuhkan rel itu, semuanya gagal serentak, dan perubahan terakhir yang dibuat pula yang disalahkan, bukan bekalan kuasa.

Membiarkan ground berasingan. Bateri disambung betul kepada servo tetapi tiada apa-apa antara rel negatifnya dengan GND Uno: pendawaian nampak betul dan lengan berkelakuan rawak. Semak perkara ini sebelum menulis semula kod.

Meneka had joint. Servo yang diarahkan melepasi apa yang rangka benarkan tidak akan mengalah β€” ia duduk pada stall, menarik arus maksimum dan memanas, sampai ada sesuatu yang gondol. Itulah yang dicegah oleh MIN_DEG dan MAX_DEG β€” mulakan setiap joint dengan malu-malu pada 60–120Β° dan luaskan lima darjah pada satu masa, sebab sudut di mana sesebuah joint mula berdengung ialah sudut di mana ia bertemu hentiannya. Gripper perlukan penjagaan yang sama atas sebab berbeza: had tutupnya bukan satu hentian, tetapi sudut di mana jarinya baru sahaja bertemu objek, dan satu darjah melepasi itu bermakna stall selagi anda pegang beban itu.

Membaca dengungan sebagai kerosakan. Servo posisi ialah gelung tertutup: ia membandingkan potensiometer dalamannya dengan pulse yang anda hantar dan memandu motor sampai kedua-duanya bersetuju. Di bawah beban ia tidak pernah benar-benar bersetuju, jadi ia bergetar sedikit di sekitar sasaran β€” dengungan halus itu ialah bunyi joint sedang bekerja. Dengungan yang cukup kuat sampai menggegarkan rangka pula bermakna joint itu sudah di had toknya: pendekkan segmen, ringankan ia, atau pasang MG90.

Mencapai bateri 9 V untuk servo. Salah dua kali: 9 V melebihi siling 6 V SG90, dan sel kecil dalam PP3 melendut teruk di bawah arus yang empat servo perlukan.

FAQ

Boleh tak Arduino Uno kuasakan 4 servo SG90?

Tidak boleh. Empat SG90 menarik 0.4–1 A ketika bergerak dan sehingga 2.8 A pada stall; rel Uno pula hanya menawarkan lebih kurang 450 mA atas USB. Ia memandu empat wayar isyarat itu dengan baik β€” arusnya yang perlukan pack sendiri.

Kenapa Arduino saya reset bila robot arm bergerak?

Servo sedang menarik rel 5 V turun melepasi ambang brown-out ATmega328P. Cip itu reset, servo menyentak balik ke home, rel itu runtuh sekali lagi. Beri mereka bekalan kuasa sendiri dan satukan ground.

Bateri apa patut saya guna untuk robot arm Arduino?

Empat sel AA: 6.0 V alkali atau 4.8 V NiMH, kedua-duanya di dalam tetingkap 4.8–6 V SG90 dan kedua-duanya mampu mengeluarkan amp. Adapter 5 V 3 A ialah alternatif yang lebih kemas. Jauhkan bateri PP3 9 V daripada rel servo β€” atas barrel jack Uno sendiri ia tiada masalah.

Kenapa robot arm saya jatuh bila saya lepaskan joystick?

Sebab sketch itu memetakan bacaan stick terus kepada sudut, dan stick yang dilepaskan membaca sekitar 512 daripada 1023 β€” yang menjadi 90Β° pada setiap joint. Tambah sekeping darjah setiap tick berkadaran dengan pesongan sebaliknya, dan tiada apa ditambah bila ia di tengah.

Perlukah saya pemacu PCA9685 untuk robot arm 4 servo?

Tidak perlu. Empat servo boleh jalan terus dari empat pin digital Uno. PCA9685 berbaloi bila anda perlukan channel lebih banyak daripada pin, mahu pin 9 dan 10 balik untuk analogWrite(), atau menjalankan library yang mengganggu pulse timer. Ia tidak membekalkan sebarang arus.

Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.

Leave a Reply

Your email address will not be published. Required fields are marked *