Wednesday, May 4, 2016

Hướng dẫn kiểm tra dung lượng pin

        Một điều mà ta rất quan tâm khi sử dụng cell cũ là dung lượng thực của pin. 

        Chỉ với vài con điện trở cùng phép tính tích phân, một chút kiên nhẫn, ta đã có thể xác định chính xác giá trị dung lượng pin.
       
        Sơ đồ kết nối:
      Ở đây ta sử dụng:
  1. 2 điện trở 5.1 Ohm 10W
  2. 1 điện trở 0.22 Ohm 5W
  3. 1 điện trở 330 Ohm và led 
  4. Mạch sạc và bảo vệ pin Li-ion.
  5. Một mạch Arduino
Hình ảnh thực tế:



      Mã nguồn cho Arduino:
long tong=0,timer=0,pre_time=0;
float Ip=0,dung_luong=0;
  int i=0;
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(115200);
  
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  //Serial.println(sensorValue);
  
  // print out the value you read:
       if (i<1000)
       {
            tong=tong+sensorValue;
            i++;
       }
       else
       {     
            tong=tong/1000;
            Ip= ((tong*5000)/1024)/0.22;
            Serial.print(Ip);
            Serial.print(" mA  ");
            timer=millis()-pre_time;
            dung_luong+=(Ip*timer)/3600000;
            Serial.print(dung_luong);
            Serial.println(" mAh");
            tong=0;
            i=0;
            pre_time=millis();
       }
}
       Hướng dẫn sử dụng:
  • Sau khi các bạn nạp code cho arduino, bật Terminal, chỉnh baudrate 115200
  • Đóng khóa K
  • Theo dõi thông số dong và dung lương tiêu hao trên màn hình
  • Vì chúng ta có sử dụng mạch bảo vệ nên khi pin còn khoản 2.8v, led báo sẽ tự tắt, dòng đo được bằng 0
  • Lúc này dung lượng đã tiêu hao chính bằng dung lượng thực của pin
  • Thời gian nhận được giá trị cuối cùng phụ thuộc dung lượng pin.
      Nguyên lý hoạt động:
            Dung lượng A=I.t
Đồ thị biểu thị mối quan hệ của dòng điện I theo thời gian
           Để xác định dung lượng thực của pin, ta cần tính diện tích của phần đồ thị như đã vẽ ở trên. Chúng ta sẽ sử dụng phương pháp tích phân số. Chia nhỏ diện tích ra thành các hình chữ nhật nhỏ. Tính tổng diện tích các hình chủ nhật đó sẽ cho ta dung lượng thực của pin.
     Chúc các bạn thành công!
     Nếu có bất kỳ thắc mắc gì, các bạn vui lòng để lại bình luận ở đây, hoặc trên Facebook.
     Cám ơn các bạn đã theo dõi.

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);
}

inmoov finger voice test

Inmoov finger voice test