Arduino UNO đặt lại khi lái servo


7

Tôi đang cố gắng điều khiển hai động cơ cùng một lúc bằng Arduino UNO và Arduino Motor Shield. Các servo của tôi được sửa đổi, để chúng có thể hoạt động với chuyển động liên tục.

Khi tôi gửi đơn đặt hàng đầu tiên myservoP.write(180);(tốc độ tối đa) nó hoạt động tốt; tuy nhiên, khi tôi cố gắng ra lệnh cho servo của mình thay đổi hướng ( myservoP.write(0);), ngay lập tức Arduino của tôi gặp sự cố và đặt lại.

Lúc đầu tôi mặc dù có thể có vấn đề với nguồn điện, nhưng sau khi thử nghiệm nó với chương trình của tôi (được liệt kê bên dưới), tôi bắt đầu nghĩ rằng đó là vấn đề với bộ đệm hoặc bộ nhớ. Không chậm trễ, Arduino gặp sự cố sau khoảng 10 lần lặp. Với độ trễ (10), nó sẽ sập sau khoảng 90 lần lặp. Với độ trễ (20), Arduino có thể lặp lại toàn bộ chu kỳ 5 lần, từ đầu đến cuối. Trong lần thử thứ 6, nó lại bị rơi.

Đây là mã của tôi:

#include <Servo.h> 

Servo myservoL;  
Servo myservoP;
int i; 

void setup() 
{ 
 delay(2000);
 myservoL.attach(9);   // attaches the servo on pin 9 to the servo object 
 myservoP.attach(10);  // attaches the servo on pin 10 to the servo object 
 Serial.begin(9600);
} 
void loop() 
{ 
  for(i=180; i>=0; i--)
  {
    delay(20);
    Serial.println(i);
    myservoP.write(i);
    myservoL.write(i);
  }
  for(i=0; i<=190; i++)
  {
    delay(20);
    Serial.println(i);
    myservoP.write(i);
    myservoL.write(i);
  }

4
Một thử nghiệm rõ ràng sẽ là chạy chương trình mà không cần kết nối servo. Nếu điều đó ngăn nó khỏi sự cố, có thể đó là tiếng ồn điện hoặc tải cung cấp từ servo bị lỗi. Nhưng nếu nó vẫn gặp sự cố, đó có thể là một lỗi trong chương trình của bạn.
Chris Stratton

Đồng ý. Vì vậy, tôi đã kiểm tra và tôi CÓ THỂ sử dụng hai servo cùng một lúc. Và tôi chạy chương trình thử nghiệm của mình mà không có servo và nó đã không bị hỏng. Vì vậy, điện của nó ... Tôi phải tìm ra cách kiểm tra những gì gây ra vấn đề ... Thx để được giúp đỡ, các bạn.
Marcin

Bạn có thể muốn xem xét một nguồn cung cấp năng lượng bên ngoài cho các servo hoặc ít nhất là không chạy chúng ra khỏi USB thông qua Uno.
Chris Stratton

Tôi thực sự đã cắm 4 chiếc AA tốt hơn và nó vẫn chưa đủ.
Marcin

Yeee. 4 pin là đủ. Tôi đã phải vặn cái gì đó bằng các chân servo arduino, vì khi tôi cắm servo của mình vào 5v và GND thông thường trên tàu, và báo hiệu cho pin kỹ thuật số thông thường, nó bắt đầu hoạt động! (Tất nhiên là 4 pin này tôi cắm vào nguồn điện bên ngoài trên tấm chắn arot morduino.)
Marcin

Câu trả lời:


5

Nếu Arduino không thiết lập lại khi các servo không được cắm vào, thì có khả năng những gì đang xảy ra là các servo thu được rất nhiều dòng điện và do đó điện áp pin giảm đủ để Arduino đặt lại.

Hãy thử sử dụng hai bộ pin riêng biệt: một để cấp nguồn cho Arduino và cái còn lại để cấp nguồn cho động cơ (đảm bảo kết nối các căn cứ của hai bộ pin với nhau).


1

Bổ sung cho câu trả lời của Nate: nếu bạn muốn giữ một pin cho cả động cơ và arduino, bạn nên hạn chế dòng điện được vẽ bởi các servo bằng cách sử dụng một số loại dốc xuống trước khi thay đổi hướng, ví dụ như một nửa tốc độ sau 20ms, 0 vòng / phút sau 20ms nữa, trước khi đổi hướng. Nếu bạn đang thay đổi hướng của cả hai động cơ cùng một lúc, bạn nên trì hoãn một lần bằng cách nói, 20ms để giảm thêm dòng điện cực đại.

Trước khi thực hiện, bạn có thể theo dõi điện áp của nguồn cung cấp arduino, tốt nhất là với phạm vi 'được đặt thành "đơn", kích hoạt độ dốc xuống ~ 4,5V. Điều đó sẽ cho bạn biết nếu nguồn cung của arduino giảm khi động cơ thay đổi hướng.


0

cố gắng tăng thời gian trễ lên 5000 thay vì 20, để các servo có thể mất đủ thời gian để hoàn thành vòng quay:

#include <Servo.h> 

 Servo myservoL;  
 Servo myservoP;
 int i; 

 void setup() 
 { 
 delay(2000);
 myservoL.attach(9);   // attaches the servo on pin 9 to the servo object 
 myservoP.attach(10);  // attaches the servo on pin 10 to the servo object 
 Serial.begin(9600);
  } 
void loop() 
 { 
for(i=180; i>=0; i--)
 {
   delay(5000 );
  Serial.println(i);
   myservoP.write(i);
   myservoL.write(i);
    }
    for(i=0; i<=190; i++)
    {
    delay(5000 );
     Serial.println(i);
    myservoP.write(i);
    myservoL.write(i);
     }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.