61 a.Hệ mở 1 1 2 2 1 ( ( ) cos ) m a e m a m K rR U b K K R r mgl J J r
Điều kiện đầu: 0; 0
*bai6jj.m function xdot=baijj6(t,x); %dong co Ke=1;Km=1;Ra=1;Jm=0.001; %tay may m=2;J=1;l=0.4;g=9.81; b=0.001;
%hop giam toc
r=2; V=24; xdot=zeros(2,1); xdot(1)=x(2); xdot(2)=(1/(J+Jm*r^2))*((Km*r/Ra)*V-((b+Km*Ke/Ra)*r^2)*x(2)+m*g*l*cos(x(1))); end *Vẽ: [t,x]=ode45('bai6jj',[0:0.1:10],[0,0]); clf; figure(1);
plot(t,x(:,1)),xlabel('t[s]'),ylabel('q[rad]'), figure(2);
62
plot(t,x(:,2)),xlabel('t[s]'),ylabel('w[rad]'),
Hình 4.12: Kết quả điều khiển vị trí (rad)
63 b.Hệ phản hồi *Vị trí: function xdot=bai6jj(t,x); %dong co Ke=1;Km=1;Ra=1;Jm=0.001; %tay may m=2;J=1;l=0.4;g=9.81; b=0.001;
%hop giam toc
r=2; Kp=6000;Kd=50; V=-Kp*(x(1)-1.57)-Kd*(x(2)); xdot=zeros(2,1); xdot(1)=x(2); xdot(2)=(1/(J+Jm*r^2))*((Km*r/Ra)*V-((b+Km*Ke/Ra)*r^2)*x(2)+m*g*l*cos(x(1))); End In kết quả: [t,x]=ode45('bai6jj',[0:0.1:10],[0,0]); clf; figure(1);
plot(t,x(:,1)),xlabel('t[s]'),ylabel('q[rad]'), figure(2);
64 Hình 4.14: Kết quả vị trí *Vận tốc: function xdot=bai6jj(t,x); %dong co Ke=1;Km=1;Ra=1;Jm=0.001; %tay may m=2;J=1;l=0.4;g=9.81; b=0.001;
%hop giam toc
r=2;
Kp=6000;Kd=50;
65 xdot=zeros(2,1); xdot(1)=x(2); xdot(2)=(1/(J+Jm*r^2))*((Km*r/Ra)*V-((b+Km*Ke/Ra)*r^2)*x(2)+m*g*l*cos(x(1))); end Hình 4.15: Kết quả vận tốc *Bám quỹ đạo: function xdot=bai6jj(t,x); %dong co Ke=1;Km=1;Ra=1;Jm=0.001;
66
%tay may
m=2;J=1;l=0.4;g=9.81; b=0.001;
%hop giam toc
r=2; Kp=6000;Kd=50; V=-Kp*(x(1)-1.57*sin(10*t))-Kd*(x(2)-15.7*cos(10*t)); xdot=zeros(2,1); xdot(1)=x(2); xdot(2)=(1/(J+Jm*r^2))*((Km*r/Ra)*V- ((b+Km*Ke/Ra)*r^2)*x(2)+m*g*l*cos(x(1))); end
67
Chương 5: Ý tưởng phát triển
Một hệ thống Arduino có thể cung cấp cho bạn rất nhiều sự tương tác với môi trường xung quanh với:
Hệ thống cảm biến đa dạng về chủng loại (đo đạc nhiệt độ, độ ẩm, gia tốc, vận tốc, cường độ ánh sáng, màu sắc vật thể, lưu lượng nước, phát hiện chuyển động, phát hiện kim loại, khí độc,…),…
Các thiết bị hiển thị (màn hình LCD, đèn LED,…).
Các module chức năng (shield) hỗ trợ kêt nối có dây với các thiết bị khác hoặc các kết nối không dây thông dụng (3G, GPRS, Wifi, Bluetooth, 315/433Mhz, 2.4Ghz,…), …
Định vị GPS, nhắn tin SMS,…
Arduino sẽ giúp bạn làm một dãy LED chớp tắt, một chiếc xe tự động tránh vật cản, một cánh tay robot gắp hay bất cứ thứ gì bạn muốn điều khiển một cách tự động.
68
Hình 5.2: Cánh tay robot viết chữ
69
Nếu bạn muốn điều khiển động cơ, sẽ có các mạch công suất tương thích hoàn toàn với Arduino. Nếu bạn muốn điều khiển qua mạng Internet, cũng có một mạch Ethernet/Wifi tương thích hoàn toàn với Arduino. Và còn rất nhiều thứ khác nữa. Mấy cái mạch gắn thêm mình đang nói đến các extension shield (mạch mở rộng). Các shield này giúp tăng tính linh hoạt của Arduino.
Các shield sẽ chồng lên Arduino sẽ trông như thế này:
Hình 5.4: Các shield
Arduino rất đơn giản, dễ sử dụng, dễ code (ngôn ngữ tương tự như C++). Một trong những cái hay nhất của Arduino là nó hỗ trợ rất nhiều thư viện, rất tiện lợi.
Bạn muốn điều khiển động cơ servo, rất đơn giản, cắm 3 dây của servo vào 3 lỗ trên Arduino, mở chương trình lên, open thư viện có sẵn, sửa lại theo ý mình là xong.
Bạn muốn điều khiển động cơ bước, nối dây vào, open thư viện, sửa dòng code như sau để điều khiển động cơ bước: Stepper1.step(100, FORWARD, DOUBLE), trong đó 100 là số bước bạn muốn, FORWARD là hướng quay, DOUBLE là quay full step. Hãy nghĩ đến việc bạn điều khiển động cơ bước trong MPLAB sẽ thế nào.
Arduino cũng có rất nhiều kích thước khác nhau, phù hợp cho nhiều mục đích sử dụng. Thông dụng nhất hiện nay là Arduino Uno.
70
2. Ứng dụng nền tảng Arduino trong một số sản phẩm.
Cột đèn tiết kiệm năng lượng.
Ta sử dụng bo mạch Arduino Mega 2560 để điều khiển toàn bộ phần điện tử. Tín hiệu từ cảm biến ánh sáng được truyền vào bo mạch Arduino. Thông qua thuật toán xử lý chống nhiễu, hệ thống biết được thời điểm nào là phù hợp để quyết định bật đèn và tắt đèn, giúp tiết kiệm năng lượng một cách thông minh. Ngoài ra, bo mạch Arduino còn nhận các tín hiệu điện áp từ Ắc quy, các tín hiệu về vận tốc gió từ encoder gắn trên trục turbine và xuất tín hiệu ra bảng LED 7 thanh để hiện thị tức thời vận tốc gió cũng như điện năng dự trữ còn trong Ắc quy.
Hình 5.5. Sử dụng bo mạch Arduino điều khiển bật đèn tiết kiệm năng lượng và hiển thị thông tin tốc độ gió, điện năng trong ắc quy.
Việc sử dụng bo mạch sẵn Arduino trong sản phẩm này đảm bảo phần vi điều khiển hoạt động ổn định, không bị ảnh hưởng bởi sự chấn động rung lắc cơ học do gió gây nên.
Số hóa sách giấy
Ta sử dụng bo mạch Arduino Mega 2560 như là một thiết bị slave cho phần điều khiển trung tâm. Các tín hiệu từ 5 cảm biến được đọc qua các chân của Arduino và truyền về phần điều khiển trung tâm thông qua cổng COM (theo chuẩn RS232). Các lệnh điều khiển từ phần điều khiển trung tâm được truyền thông qua cổng COM tới bo mạch Arduino để điều khiển động cơ (thông qua kết nối với module L298), điều khiển quạt hút trang, quạt thổi trang và đèn LED chiếu sáng thông qua đóng ngắt (bằng modul relay).
71
Hình 5.7. Sử dụng bo mạch Arduino giao tiếp máy tính và điều khiển thiết bị ngoại vi . Ngoài ra trong việc xây dựng giao diện điều khiển, chúng em cũng đã nghĩ them về cách thiết kế giao diện trên C#.
72
Hình 5.8: Thiết kế giao diện trên C#
C# có khó khăn hơn Megunolink khá nhiều. Nó đòi hỏi người thiết kế phải có kiến thức lập trình C#. Và mọi thao tác đều được lập trình trên C#. Không giống như Megunolink là lập trình vẫn làm trên Arduino IDE.
73
KẾT LUẬN
Để thiết kế chế tạo một sản phẩm công nghệ hiện nay đòi hỏi sự tìm hiểu trên nhiều lĩnh vực khác nhau. Arduino được sử dụng rộng rãi trên khắp thế giới để giúp việc đó dễ dàng hơn rất nhiều. Qua bài viết về môn học thực tập kĩ thuật chúng em đạt được những điều như sau:
- Xây dựng mô hình cơ điện điều khiển động cơ DC- Encoder - Thực hiện mô phỏng hệ cơ điện trên Matlab
- Thiết kế giao diện điều khiển trên máy tính bằng Megunolink
Em xin chân thành cảm ơn thầy Đỗ Đăng Khoa đã giúp đỡ chúng em học được rất nhiều điều. Bài viết không tránh khỏi những thiết sót, rất mong được sự góp ý của thầy và các bạn để chúng em làm tốt hơn.
74
Tài liệu tham khảo
1. Michael Margolis and Nicholas Weldin, Arduino Cookbook, O’Reilly Media, Inc, 2011.
2. Michael McRoberts, Beginning Arduino, O’Reilly Media, 2013. 3. Lý thuyết điều khiển tuyến tính -Nguyễn Doãn Phước
4. Bài giảng phần mềm mô phỏng hệ động lực có điều khiển- Nguyễn Quang Hoàng 5. Nguyễn Trung Tín, Hướng dẫn sử dụng cơ bản Arduino, 2014
6. http://arduino.cc/ truy nhập ngày cuối 1/6/2015
7. http://hocavr.com/ truy nhập ngày cuối 1/6/2015
8. http://megunolink.com/ truy nhập ngày cuối 1/6/2015
75
Phụ lục
Code Arduino IDE:
#include "MegunoLink.h" // khai bao thu vien giao dien
#include "CommandHandler.h"
int menu = 3; // 3 mode (vi tri, toc do,tat dong co)
int x=0,y=0,z=0,w=0;
CommandHandler<> SerialCommandHandler; void datmenu(CommandParameter &Parameters) {
menu=Parameters.NextParameterAsInteger(); }
void gocbandau(CommandParameter &Parameters) {
w=Parameters.NextParameterAsInteger(); }
void gocdat(CommandParameter &Parameters) {
x=Parameters.NextParameterAsInteger();
x=x/0.8; // doi tu don vi tu giao dien dat
}
void tanso(CommandParameter &Parameters) {
76
y=y/57.3; // doi don vi
}
void vantoc(CommandParameter &Parameters) {
z=Parameters.NextParameterAsInteger(); z=z/5.357; // doi don vi
}
TimePlot Plot("vantoc"); // ve do thi van toc
TimePlot MyPlot("goc"); // ve do thi goc
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 6,5, 4, 3); #include <Timer.h> // khai bao timer
Timer t0; // dung timer t0
#define motorPin1 8 // L293D Input 1 (chan dieu khien chieu quay)
#define motorPin2 7 // L293D Input 2 (chan dieu khien chieu quay)
#define speedPin 9 // L293D enable chân 1 ( bam xung dieu khien toc do )
int dau=0,dem=0;
float v=0,time=0.025,inv=40,U = 0,t=0; // time=0.025 thoi gian lay mau , inv =40 ngich dao time
long int a=0,b=0,c=0,qold=0,qnew=0,eold=0,enew=0,ipart=0; // q vi tri , e sai so , ipart tinh ki
void setup() { lcd.begin(16, 2); Serial.begin(9600);
77
SerialCommandHandler.AddCommand(F("setmenu"), datmenu); // khai bao goi chuong trinh con
SerialCommandHandler.AddCommand(F("setgocbandau"), gocbandau); SerialCommandHandler.AddCommand(F("setgocdat"), gocdat);
SerialCommandHandler.AddCommand(F("settanso"), tanso); SerialCommandHandler.AddCommand(F("setvantoc"), vantoc);
MyPlot.SetTitle("goc"); // khai bao do thi
MyPlot.SetXlabel("thoigian"); MyPlot.SetYlabel("goc");
MyPlot.SetSeriesProperties("goc", Plot::Blue, Plot::Solid, 2, Plot::Square);
Plot.SetTitle("vantoc"); Plot.SetXlabel("thoigian"); Plot.SetYlabel("vantocgoc");
Plot.SetSeriesProperties("vantoc", Plot::Blue, Plot::Solid, 2, Plot::Square);
pinMode(2, INPUT_PULLUP); // dung kenh A cua encoder
pinMode(13, INPUT); // dung kenh B cua encoder
attachInterrupt(0, dao, FALLING); // khai bao ngat ngoai khi xung di xuong goi chuong trinh "dao" (ngat)
78
pinMode(motorPin2, OUTPUT); // du lieu ra chan dieu khien chieu quay
pinMode(speedPin, OUTPUT); // du lieu ra chan bam xung
t0.every(time*1000, pid); // sau 25 ms thuc hien 1 lan vong pid
}
void loop() {
SerialCommandHandler.Process(); // kiem tra giao tiep voi mat tinh
t0.update();
if(menu==3) U=0; if(w==0) {a=0;w=1;}
analogWrite (speedPin, U); // viet gia tri ra chan bam xung
if (dau) { // u>0 dau = 0, u<0 dau =1 , dau the hien chieu quay
digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); } else { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); } if(dem==20) {lcd.clear(); lcd.setCursor(0,0);
lcd.print(qnew); // in ra vi tri moi tren LCD (dang xung)
lcd.setCursor(8,0);
lcd.print(v); // in ra van toc tren LCD (dang xung)
79
if(menu==0)MyPlot.SendData(F("goc"),a*0.8); // ve do thi goc v/p megunolink
}
void dao() // chương trình con ngắt, khi có ngắt xảy ra sẽ thực hiện chương trình này.
{
c=digitalRead(2); b=digitalRead(13);
if (c==b) a=a-1; // tru bot xung A (nghich)
else a=a+1; // cong them xung cua A (thuan)
}
void pid() {
qnew=a; // dat goc moi = a if(menu==0){
t=t+time; // tang thoi gian dem
enew=x*sin(y*t+1.57)-a; ipart+=0.05*(enew-eold)*time; U=0.21*enew+ipart; } if(menu==1) {
enew=z-abs(qold-qnew); //enew sai so van toc z xung dat tuong ung voi van to dat
U+=0.21*enew; //ki=021
v=(qnew-qold); } // van toc dang xung in ra man hinh
qold=qnew; // dat vi tri cu = vi tri moi cho vong lap moi
80 dem++; if (U<0) {U=-U; dau=1; } else dau=0; if (U>255) U=255;
if(U<90 && menu==0 && abs(enew)>5)U=90; }