Thursday, December 17, 2015

Hướng dẫn chọn bộ 3 hệ số cho PID, phục vụ cho Robot cân bằng

      Như chúng ta đã biết, PID là một bộ điều khiển có hồi tiếp siêu kinh điển được sử dụng rất nhiều vào những năm 70 của thế kỉ trước. Mặc dù đã cũ nhưng nó vẫn tỏ ra rất hiệu quả.
      Cũng giống như các bộ điều khiển khác, để sử dụng được PID, ta cần tìm ra được 3 hệ số Kp, Ki, Kd. Vậy Kp, Ki, Kd dùng để làm gì? Và chọn như thế nào?
      Kp là hệ số của khâu tỉ lệ, tỉ lệ với sai số. Ta cần chọn Kp sao cho hệ đáp ứng đủ nhanh.
      Kd là hệ số của khâu vi phân. Khi hệ của ta đáp ứng đủ nhanh, sẽ sinh ra vọt lố, cần tăng Kd từ từ sao cho giảm độ vọt lố. Khi đó sẽ sinh ra tính ì, tức là khi sai số quá nhỏ, hệ không đạt được giá trị đặt.
      Ki là hệ số của khâu tích phân, là khâu cộng dồn. Khi hệ xuất hiện tượng ì, ta tăng dần Ki để loại bỏ hiện tượng đó. Khi Ki đủ lớn, vọt lố lại xuất hiện, giảm Ki xuống và hệ đi vào ổn định.


     Trên đây là một cách để "mò" hệ số PID (gọi là mò nhưng ta cần hiểu bản chất mới mò được! Và cũng không dễ để đạt được hệ ổn định). Ngoài ra ta còn có nhiều phương pháp để tìm hệ số PID như auto turning, các công cụ phần mềm, Cohen-Coon, Ziegler-Nichols... Trong đó phương pháp Ziegler-Nichols khá đơn giản, và mình đã áp dụng có hiệu quả. 
     Trong phương pháp Ziegler-Nichols ta cần tìm hai hệ số Ku và Pu. Trong đó Ku là hệ số liên quan đến tốc độ đáp ứng của hệ, Pu là chu kì dao động của hệ. Từ Ku và Pu ta tìm được bộ ba hệ số Kp, Ki, Kd theo công thức cho trong bảng.


     Cụ thể với robot cân bằng của chúng ta. Để tìm nhanh hệ số Ku và Pu, ta làm như sau: 
       - Đặt robot thẳng đứng. Dùng tay trái, để tay trái thành hình chữ U. Cho robot dao động trong lòng bàn tay trái (làm sao cũng được, miễn là robot giao động và không ngã, nhưng vẫn đảm bảo đủ không gian cho robot dao động).
       - Tăng dần hệ số Ku (tăng mạnh tay vào) cho đến khi robot dao động đủ nhanh và dao động tuần hoàn, khi đó ta được Ku.
       - Khi hệ dao động với một chu kỳ xác định, ta tiến hành xác định thời gian dao động của hệ. Thông thường ta dùng phương pháp đồ thị. Nhưng ở đây, chúng ta không có điều kiện để vẽ đồ thị. Vì vậy ta sẽ đoán. Kinh nghiệm, thời gian dao động của hệ sẽ nhỏ hơn 0.5s. Giảm từ từ Tu cho đến khi hệ ổn định.
       Đến đây ta đã có một con robot cân bằng cơ bản đứng được!
      
       Một số bạn làm có hiện tượng: robot chạy về một phía. Nguyên nhân là do cơ khí chưa tốt, khiến hệ bị nghiêng một góc. Ta hoàn toàn có thể giải quyết vấn đề này bằng phương pháp phần mềm: Bạn thấy robot của bạn nghiêng về hướng nào thì cho giá trị góc đặt ngược lại (khác 0 độ). Thử một vài lần thì robot của bạn đã có thể đứng được.
      
      Để đạt hiệu quả qua trong tính toán, ta nên đặt code tính toán PID trong ngắt timer. Vì arduino dùng các timer cho một vài công việc, nên ta sẽ chỉ dùng được timer2. Thư viện Mstimer2: http://playground.arduino.cc/Main/MsTimer2

       Đoạn mã tính PID:
       
  actual_position=ypr[1] * 180/M_PI;
  error = setpoint - actual_position;
  integral = integral + (error*dt);
  derivative = (error - previous_error)/dt;
  output = (Kp*error) + (Ki*integral) + (Kd*derivative);
       Đoạn mã tính hệ số Kp, Ki, Kd:

  Kp=0.6*Ku;
  Ki=2*(Kp/Pu);
  Kd=(Kp*Pu)/8;
      Các biến, các bạn nên để kiểu float cho kết quả tính chính xác.

      Mọi thắc mắc, vui lòng để lại ở phần bình luận. Hoặc liên hệ facebook.

      Chúc các bạn thành công và qua môn!
      Chào thân ái và quyết thắng.

      Tài liệu tham khảo:
http://nvtienanh.com/blog/bo-dieu-khien-pid-so-27-02-2014.html
https://vi.wikipedia.org/wiki/B%E1%BB%99_%C4%91i%E1%BB%81u_khi%E1%BB%83n_PID
https://www.youtube.com/watch?v=37EdWnIFiWg



      

Tuesday, June 9, 2015

Hướng Dẫn Sửa Lỗi Không Nhận Driver PL2303 trên win 8/8.1



Bước 1: Các bạn download file driver tại địa chỉ: Profilic_Win8_x64_x86.zip

Bước 2: Giải nén, ta được thư mục như hình:

Bước 3: Click phải vào File ser2pl.inf, chọn Install:
Lúc này xuất hiện hộp thoại cảnh báo (hoặc không). Nếu có chọn Open

Bước 4: Click phải vào This PC, chọn manage:
Chọn tiếp Device Manager:
Ở đây xuất hiện cảnh báo lỗi ở cổng Com ảo: Prolific USB-to-Serial Comm Port (COM bao nhiêu là tùy thuộc vào máy của bạn)

Bước 6: Click phải Prolific USB-to-Serial Comm Port, chọn Update Driver Software, xuất hiện hộp thoại như hình:

Chọn Browse my computer for software:

Xuất hiện hộp thoại như hình, chọn tiếp Let me pick from....

Chọn Prolific USB - to -Serial... (9/24/2008) rồi Next:

Đợi một lúc, hiện thông báo như hình là ok:

 Chọn Close, và kết quả không còn báo lỗi nữa:

Giờ thì các bạn có thể sử dụng như bình thường.

Chúc các bạn thành công!

Monday, May 4, 2015

code cảm biến siêu âm SRF 05 cho Arduino

 code cảm biến siêu âm SRF 05 cho Arduino



const int TRIGER = 7;//chân TRIGER
const int ECHO= 8;//chân ECHO

void setup()
{
  Serial.begin(9600);//giao tiếp Serial với baudrate 9600
  pinMode(TRIGER,OUTPUT);//khai báochân trig sẽ xuất tín hiệu
  pinMode(ECHO,INPUT);//khai báo chân echo sẽ nhận tín hiệu
}

void loop()
{
  unsigned long pulse_length ;//biến đo thời gian mức cao chân echo
  int distance;//biến lưu khoảng cách
  /* phát xung 10 us từ chân trig */
  digitalWrite(TRIGER,HIGH);//đưa chân triger lên mưc cao
  delayMicroseconds(10);
  digitalWrite(ECHO,LOW);// đưa chân triger xuống mức thấp


  /*tính toán thời gian*/
  pulse_length  = pulseIn(ECHO,HIGH);//đo độ rộng xung HIGH ở chân echo
  distance = int(pulse_length/58);//tính khoảng cách đến vật theo cm
  /*in kết quả */
  Serial.print(distance);
  Serial.println("cm");
  delay(300);
}

Monday, April 20, 2015

Giao tiếp LCD với avr atmega8 bằng 3 dây tín hiệu sử dụng 74hc595

Giao tiếp LCD với avr atmega8 bằng 3 dây tín hiệu sử dụng 74hc595


Hệ thống đa tác vụ và thời gian thực với vi điều khiển Pic (phần 4)

Ví dụ 10.3 Đo điện áp và xuất đến cổng RS232
Trong ví dụ này, có nhiều phức tạp hơn hai ví dụ trước, điện áp đọc bằng cách sử dụng bộ chuyển đổi A/D gửi đến máy tính thông qua cổng nối tiếp. Ví dụ này sử dụng ba tác vụ: LiveGet_voltage, và To_RS232
Task Live chạy mỗi 20 ms, nhấp nháy đèn led kết nối đến port RD7 của vi điều khiển để báo rằng hệ thống đang hoạt động.

Hệ thống đa tác vụ và thời gian thực với vi điều khiển Pic (phần 3)

Ví dụ 10.1 - LEDs
Ví dụ đơn giản dựa trên RTOS, bốn LED đơn kết nối 4 chân thấp PORTB của vi điều khiển PIC18F452. Phần mềm bao gồm 4 tác vụ, mỗi tác vụ có nhiệm vụ điều khiển nhấp nháy một đèn led với tốc độ khác nhau
Tác vụ 1 , gọi task_B0, nhấp nháy led kết nối đến port RB0 tại tốc độ 250ms
Tác vụ 2 , gọi task_B1, nhấp nháy led kết nối đến port RB1 tại tốc độ 500ms
Tác vụ 3, gọi task_B2, nhấp nháy led kết nối đến port RB2 mỗi một giây
Tác vụ 4, gọi task_B3, nhấp nháy led kết nối đến port RB3 mỗi 2 giây
Hình 10.7 sơ đồ kết nối . Mạch sử dụng thạch anh 4 MHZ các led nối với chân RB0-RB3 thông qua điện trở hạn dòng 

Hệ thống đa tác vụ và thời gian thực với vi điều khiển Pic (phần 2)

Trong một hệ thống thời gian thực một tác vụ có thể rơi vào một trong các trạng thái sau đây (xem hình 10.6):
- Sẵn sàng để chạy.
Chạy.Bị chặn.
     Khi một tác vụ lúc đầu được tạo ra, nó thường ở trạng thái sẵn sàng để chạy  được nhập vào trong danh sách tác vụTừ trạng thái này, tùy thuộc vào các thuật toán lập lịch trình, nhiệm vụ có thể trở thànhmột nhiệm vụ đang chạy. Theo các điều kiện của lịch ưu tiên, nhiệm vụ sẽ chạy nếu nó  nhiệm vụ ưu tiên cao nhất trong hệ thống và không phải đợi một nguồn tài nguyên. Một nhiệm vụ chạy trở thành một nhiệm vụ chặn nếu nó cần một nguồn tài nguyên chưa có sẵn. Ví dụ, một tác vụ có thể cần dữ liệu từ một bộ chuyển đổi  A/D (bộ chuyển đổi từ tương tự sang số)  và bị chặn cho đến khi bộ chuyển đổi A/D hoàn tấtMột khi các nguồn tài nguyên có thể được truy suất, các nhiệm vụ bị chặn trở thành một nhiệm vụ chạy nếu nó là nhiệm vụ ưu tiên cao nhất trong hệ thống, nếu không nó chuyển sang trạng thái sẵn sàng.Chỉ một nhiệm vụ đang chạy có thể bị chặn. Một nhiệm vụ sẵn sàng chạy không thể bị chặn.
     
Khi một nhiệm vụ chuyển từ trạng thái này sang trạng thái khác, bộ vi xử lý lưu bối cảnh của nhiệm vụ đang chạy vào trong bộ nhớ, nạp bối cảnh nhiệm vụ mới từ bộ nhớ,  sau đó thực thi lệnh mới như yêu cầu.


inmoov finger voice test

Inmoov finger voice test