Làm mạch điều khiển 20 servos bằng board arduino uno.

Hôm nay mình sẽ chia sẻ với các bạn Project của bác Lamja để làm mạch điều khiển 20 servos (không có serial) hoặc 18 servos đi kèm với serial.

Code chỉ sử dụng cho Arduino uno hoặc nano (vđk atmega 328) xuất xung trực tiếp từ chân IO. Sai số theo như lời tác giả là khá ấn tượng, chỉ khoảng 2ns. Bạn có thể điều khiển nhiều servo cùng 1 lúc, có thể điều khiển tốc độ quay nhanh hay chậm. Rất thích hợp để làm robot cần sử dụng nhiều servo như robot nhện 4,6 chân, robot người...Code này không thích hợp nếu bạn chỉ cần điều khiển 1- 4 servo vì sẽ lãng phí nhiều tài nguyên.

Source code và License xem tại: http://www.lamja.com/?p=504

Bạn vào phần New version 2016.04.24 , copy toàn bộ code dán vào Arduino IDE => upload là chạy đc.

Hướng dẫn sử dụng. Project có 2 chế độ:

1. Chế độ 18 servos

(Sửa dòng "#define HDServoMode 20" thành "#define HDServoMode 18" để sử dụng)

18 chân IO đc sử dụng để đk, 2 chân còn lại sử dụng cho giao tiếp serial. Bạn sẽ gửi lệnh qua serial (Baud rate 115200) để thay đổi góc quay của servo:

// Channels tương ứng vs pins:

Ch0=Pin2, Ch1=Pin3, Ch2=Pin4, Ch3=Pin5, Ch4=Pin6, Ch5=Pin7, Ch6=Pin8, Ch7=Pin9, Ch8=Pin10, Ch9=Pin11

Ch10=Pin12, Ch11=Pin13, Ch12=PinA0, Ch13=PinA1, Ch14=PinA2, Ch15=PinA3, Ch16=PinA4, Ch17=PinA5, Ch18=Pin0, Ch19=Pin1

  • #0 P1500 T1000<cr> – Move Servo 0 to 1500 μs in 1 second.
  • #0 p24000 T1000<cr> – Move Servo 0 to 1500 μs in 1 second.
  • #0 p40000 S100<cr> – Move Servo 0 to 2500us in 100u μs/s speed
  • #0 P1000 #1 P2000 T2000<cr> – Move Servo 0 and servo at the same time from current pos to 1000 μs and 2000 μs in 2 second.
  • #0 P2400 S100<cr> – Move servo 0 to 2400 μs at speed 100us/s
  • #0 P1000 #1 P1200 S500 #2 P1400 T1000<cr> – Move servo 0, 1 and 2 at the same time, but the one that takes longes S500 or T1000 will be used.
  • #0 PO100 #1 PO-100<cr> – Will set 100 μs offset to servo 0 and -100 μs ofset to servo 1
  • #0 Po1600 #1 Po-1600<cr> – Will set 100 μs offset to servo 0 and -100 μs ofset to servo 1

Lưu ý kết thúc lệnh phải có kí tự <carry and return> (\r\n). Góc gửi xuống phải ở dạng us (với lệnh #0 P1500 T1000<cr>) hoặc us*16 (với lệnh #0 p24000 T1000<cr>).

2. Chế độ 20 servos

("#define HDServoMode 20" và xóa hết code trong hàm void loop() để sử dụng)

Tất cả chân IO đều được sử dung (cả cổng serial) bạn chỉ có thể chạy code viết sẵn trên chíp.

Sử dụng câu lệnh sau để điều khiển  void ServoMove(int Channel, long PulseHD, long SpeedHD, long Time)

VD:  ServoMove(0, (long)1500*16, 0, 2000);  // chuyển sv 0 về 1500us trong vòng 2s

Lưu ý. do tác giả đã screwed up timer 0 nên bạn không thể sử dụng được hàm delay() và hiện tại vẫn chưa có hàm delay() thay thế.

VD: 

void loop()
{
    ServoMove(0, (long)1500 * 16, 0, 2000); // đk servo 0 góc 1500us

    for (int i = 0; i < 3000; i++) {
        delay(10);
    } //delay khoảng 3s do hàm delay không thực sự làm việc

    Serial.println("**********");

    ServoMove(0, (long)2500 * 16, 0, 2000);

    for (int i = 0; i < 3000; i++) {
        delay(100);
    }

    Serial.println("**********");

    ServoMove(0, (long)600 * 16, 0, 2000);

    for (int i = 0; i < 3000; i++) {
        delay(100);
    }

    Serial.println("**********");
}

Nếu có thắc mắc xin để lại comment phía dưới.

Youtube: 
Bài viết truyền cảm hứng: 
lên
6 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results