Chatbox

Các bạn vui lòng dùng từ ngữ lịch sự và có văn hóa,sử dụng Tiếng Việt có dấu chuẩn. Chúc các bạn vui vẻ!
18/10/2010 23:10 # 1
RETURN
Cấp độ: 2 - Kỹ năng: 2

Kinh nghiệm: 4/20 (20%)
Kĩ năng: 13/20 (65%)
Ngày gia nhập: 23/09/2010
Bài gởi: 14
Được cảm ơn: 23
Topic Hỏi Đáp Kiến Thức ROBOCON


Chào các bạn!
Hiện tại mùa Robocon 2010 đã bắt đầu nóng lên từng ngày, các bạn có tự tin về một mùa Robocon mới không? Một điều mà những thành viên cũ như tôi trăn trở là liệu các bạn mới tham gia đã biết những gì về Robocon? Muốn tìm hiểu gì về Robocon? Chưa thấy một câu hỏi nào về các phần lập trình,điện tử hay cơ khí nhưng tôi nghĩ có thể các bạn không biết hỏi ở đâu? Nay tôi lập topic này để có một nơi để các bạn đang và sẽ tham gia Robocon ( hoặc muốn đi con đường lập trình Robocon ) trong đội học hỏi, trao đổi kiến thức toàn bộ về Robocon với nhau.

Đây là bài đầu tiên của topic nên tôi xin nói sơ qua về Robocon Duy Tân:

- Thành lập năm 2007, đã trải qua 4 năm tham gia thi đấu, năm nay là năm thứ 5.
-  Năm đầu tiên (2007) tham gia 1 đội (DT_BOLIDE), các năm 2008 (DT_BOLIDE & DTIT), 2009 (DT_BOLIDE & DT_AIBO)đều tham gia 2 đội, năm 2010 một đội (DT_NEXT). Năm nay Duy Tân tham gia 4 đội (DT_RETURN, DT_SPEED, DT_MAX, DT_14TVT)
-  Thành tích : Giải Nhì khu vực Đà Nẵng (2008), Giải Ba khu vực Đà Nẵng (2009), đi đến vòng 3/3 miền Trung (2009), một trong 12 đội mạnh nhất khu vực miền Trung – Tây Nguyên.
-  Con người : Đều là các sinh viên trong khoa CNTT và ĐĐT. Với các thành viên đến từ các lớp ĐH. CĐ trong trường ĐH Duy Tân.

Xin nói ngắn gọn vậy thôi, năm nay Robocon Duy Tân sẽ đi xa hơn, ít nhất là vào được vòng toàn quốc, tôi tin là vậy!

Xin trình bày với các bạn một số thông tin cơ bản cần nắm khi tham gia topic này:

 

-          Robot bằng tay chỉ có lập trình thao tác các động cơ.

-          Hai robot tự động ngoài lập trình thao tác bằng động cơ còn có các phần dò đường, encoder, cảm biến vật thể…

-          Ngôn ngữ sử dụng là C (hoặc Asembly), tôi thì dùng C (do Asembly chỉ biết lõm bõm, C dễ tái sử dụng…

-       Năm nay cả 3 robot tham gia thi đấu đều phải được lập trình(1 con bằng tay và 2 con tự động)

-          Bổ sung sau…

Mong các bạn tham gia topic với tinh thần học hỏi, chia sẻ kiến thức. Riêng các bạn đã nằm trong danh sách thành viên của 4 đội Robocon Duy Tân 2011, tôi muốn các bạn phải tham gia thường xuyên (đặt câu hỏi về bất cứ vấn đề gì thắc mắc lên quan đến Robocon 2010). Sự tham gia của các bạn trên topic này cũng là một chỉ tiêu khi chọn các thành viên chính thức trong đội hình tham gia chế tạo và thi đấu! (Các bạn tham gia thường xuyên chính là những người có đủ kiến thức để làm việc)

Chúc cho Robocon Duy Tân ngày càng phát triển hơn!

 

P/S :
1. Các bạn là Mod trong box Robocon thường xuyên theo dõi có comment nào sai quy định forum, không liên quan đến Robocon thì xử lý nhé. Cám ơn các bạn!
 2. Các câu hỏi trong topic sẽ được những người đi trước giải đáp, hi vọng các cựu thành viên Robocon Duy Tân cũng tham gia topic thường xuyên nhằm giúp các bạn mới có hiểu biết nhất định về Robocon.



 
Các thành viên đã Thank RETURN vì Bài viết có ích:
23/10/2010 00:10 # 2
loy_krathong
Cấp độ: 4 - Kỹ năng: 3

Kinh nghiệm: 20/40 (50%)
Kĩ năng: 5/30 (17%)
Ngày gia nhập: 22/09/2010
Bài gởi: 80
Được cảm ơn: 35
Topic Hỏi Đáp Kiến Thức ROBOCON


đã 4 ngày trôi qua nhưng chưa thấy bạn nào lên hỏi, thắc mắc hay ý kiến gì cả?
các bạn mới tham gia năm nay đã có sự chuẩn bị trước chăng, như mình lần đầu tiên tham gia lo lắng và thắc mắc rất nhiều. nhưng năm nay chẳng thấy ai hỏi hay thắc mắc gì, có lẽ các bạn đã khá hơn các anh đi trước, hy vọng các bạn sẽ là những người đưa Robocon DTU đi lên.



không phải là mình  không làm được
mà là mình chưa làm được.

tất cả vì  ROBOCON DTU

.......................



 
01/11/2010 10:11 # 3
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


Thứ nhất là Mục đích của diễn đàn không những chỉ để có người hỏi rồi mới có người trả lời mà còn là nơi để đưa lên các bài hướng dẫn chi tiết (tutorial). Vì vậy bạn thắc mắc không có người hỏi đó là điều rất bình thường, đơn giản vì người ta chưa biết gì để mà hỏi

Thứ hai là: Mình xin có một số ý kiến như thế này. Robocon Duy Tân chỉ mới 4 năm thôi, năm này mới là năm thứ năm, trong khi cuộc thi robocon đã trải qua 9 năm rồi, (năm nay là năm thứ 10 của cuộc thi robocon Châu Á). 4 năm tham gia có thể nói Duy Tân đã vượt qua cái ngưỡng là "thành viên mới" nhưng cũng chưa thể coi là thành viên kỳ cựu bởi chưa một lần góp mặt vào vòng quốc gia. Nguyên nhân chủ yếu thì có lẽ nằm ở phần lực lượng, phải nói là lực lượng quá mỏng vì năm nào cũng chỉ có khoa CNTT tham gia, riêng năm 2010 thì có cả khoa điện tử nhưng lại quá mới lạ. Số lượng thành viên ít lại không được trang bị đầy đủ các kỹ năng về cơ khí chế tạo, hay điện tử.Tuy nhiên không thể đổ lỗi hoàn toàn về việc đó bởi vì một số trường cũng không có đầy đủ các yếu tố đó cũng đạt được một số thành công nhất định.
Vậy vấn đề đặt ra cho các bạn là gì? Đó là đào tạo đội ngũ kế cận có đủ khả năng để tham gia cuộc chơi này. Các kỹ năng đó thì ai cũng biết là bao gồm cơ khí, điện tử, lập trình.


- Về cơ khí thì mình không muốn bàn ở đây, vì đối với trường ta thì nó dựa trên kinh nghiêm và tay nghề là chính. Ai cũng có thể làm nhưng mà làm tốt hay không còn phụ thuộc vào tính tình của người đó nữa. Hehe
(Có chịu khó hay không, cần cù bù khả năng ý mà)

- Về điện tử, năm nay các thành viên chủ yếu thuộc khoa điện tử, vậy các bạn phải tự tay thiết kế mạch chứ không thể sữ dụng lại các module mạch như các năm trước nữa. Có thể nói thẳng ra ở đây là mạch robocon do các bạn thiết kế  (có thể chỉ một vài bạn tập trung làm việc với nhau) sẽ là mạch dùng chung cho tất cả các đội. Phần đào tạo đội ngũ cho nhóm điện tử mình cũng chưa bàn ở đây vì quá trình thiết kế mạch không phải đơn giản mà cần phải được đào tạo bài bản từ nhà trường từ các môn học .v.v. Mình chỉ yêu cầu là nhóm thiết kế mạch phải chỉ ra được các tính năng, cách sử dụng các module của mạch để hổ trợ cho nhóm lập trình biết và khắc phục các sự cố về mạch.

 - Có lẽ mục đích chính của bài viết này là đào tạo đội ngũ cho nhóm lập trình năm nay và cho những năm sau. Theo mình thì đây mới là vấn đề tuy không chủ chốt nhưng lại mang tính cấp bách. Các bạn thử tưởng tượng xem (chỉ cần tưởng tượng thôi) Các bạn làm ra 10 chú robot, các bạn hoàn toàn có thể dùng một mạch điện tử tối ưu nhất, nhưng các bạn không thể dụng chung một chương trình tối ưu nhất cho tất cả các chú robot. Có thể lý giải điều này như sau: Các robot các bạn chế tạo ra khác nhau về hình dạng kích thước lẫn chức năng, ngay cả khi làm ra hai robot giống hệt nhau thì các thông số khi chạy cũng khác nhau, chưa kể đến việc thi công mạch điện cũng có sai số nhất định. Qua đó ta có thể thấy việc đào tạo thành viên tham gia nhóm lập trình là rất cần thiết. Theo mình biết CLB robocon mới chỉ có một vài thành viên lập trình robot thành thạo vì đã qua mấy năm kinh nghiệm, nhưng thử hỏi các bạn có đủ sức để lập trình tất cả robot cho đội của mình không?

-->Vậy vấn đề đặt ra là đào tạo như thế nào?

Trả lời

  • Chọn vào một số thành viên có đam mê với lập trìnnh chẳng hạn, hoặc là kỹ năng về cơ khí yếu ít gia công các chi tiết quan trọng...
  • Đầu tiên tất nhiên là phải học hỏi lẫn nhau, các thành viên cũ đào tạo các thành viên mới
  • Vừa tham gia chế tạo vừa học.
  •  Đào tạo ngay từ bây giờ,(Các thành viên cũ đặt ra câu hỏi là mình cần mất bao nhiêu thời gian để lập trình robocon từ cơ bản đến thành thạo thì cũng cần ít nhất số thời gian đó để đào tạo cho các thành viên mới, riêng mình thì mất gần 3 năm lập trình mà vẫn thấy chưa thành thạo lắm(do khả năng thôi)
  • Tổ chức thành lớp học bài bản.

Đó là một số ý kiến rất chi là riêng tư của mình, không biết có giúp ích được gì cho robocon Duy Tân không, có gì không đúng hay không phải thì các bạn comment lại cho mình biết nha

 



 

 


 
Các thành viên đã Thank nghien_rbc vì Bài viết có ích:
18/11/2010 23:11 # 4
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


 Tâm Phong Hoà  nhanh chóng cập nhật các thành viên của nhóm lập trình lên diễn đàn nha, đã đến lúc bắt đầu rồi, năm nay lập trình chắc chắn sẽ khó hơn mọi năm, thậm chí còn khó hơn năm 2009 đó. KHẨN CẤP


 

 


 
19/11/2010 23:11 # 5
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


 Hôm nay rảnh rỗi mình tranh thủ post một ít tài liệu liên quan tới phần lập trình robocon lên đây. Bao gồm các thuật toán thường được sử dụng trong robot, gồm sơ đồ khối và code, tài liệu cất trong máy một chặp cũng bị virus nó xơi thôi, các bạn nào thích lập trình thì tham khảo nha, có thể hơi cũ nhưng chắc cũng còn đôi chút giá trị. hì.

Cụ thể sẽ bao gồm một số thao tác sau:
- Thao tác với phím bấm
- Thao tác với các cơ cấu chấp hành
- Do đường
- Đếm encoder.
- Thao tác chọn chương trình.
........


 

 


 
19/11/2010 23:11 # 6
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


 THUẬT TOÁN CHỌN CHƯƠNG TRÌNH.

Cách lập trình cho công tắc hành trình và nút nhấn.

        Để hiểu cách lập trình cho nút nhấn và công tắc hành trình ta có thể lấy một ví dụ nhỏ thế này:
Ta muốn robot chạy thẳng tới một bức tường và dừng tại đó khi chạm vào bức tường, ta phải biết khi nào thì robot chạm phải tường để dừng lại, để làm được điều đó ta có thể đo quảng đường từ robot đến tường và cho robot chạy trong quảng đường đó, nhưng cách làm này khá vất vả, cách đơn giản hơn là ta dùng một công tắc hành trình ở trạng thái thường hở lắp vào , khi robot chạy chạm vào tường công tắc hành trình bị tác động sẻ chuyển về trạng thái đóng, Vi điều khiển trung tâm sẽ liên tục kiểm tra trạng thái của công tắc hành trình nếu thấy sự thay đổi vi điều khiển sẻ xữ lý robot dừng lại bằng cách dừng động cơ. Một nút nhấn hay công tắc hành trình có hai trạng thái đóng mở và tương ứng là hai giá trị 0 hoặc 1. Vi điều khiển chỉ cần so sánh nút nhấn với hai giá trị 0 hoặc 1 là có thể kiểm tra được trạng thái đóng mở của nút nhấn và công tắc hành trình.

        Chức năng: Chọn các chương trình khác nhau trên các nút nhấn. Trong mỗi trận đấu với mỗi đối thủ khác nhau ta phải có những chiến thuật khác nhau. Để có thể thay đổi các chiến thuật đã lập trình trước thì ta phải chọn chương trình, chương trình được chọn thông qua việc điều khiển trên nút nhấn chọn chương trình. Ví dụ: Nếu chọn chương trình 1 thì nhất nút 1, muốn chọn chương trình 2 thì nhấn phím 2… mỗi lần nhấn phím ta có thể hiển thị giá trị số của phím đó lên các led 7 đoạn.

 

Lưu đồ thuật toán thể hiện ở hình dưới:

-         đây là lưu đồ kết hợp giửa việc nhấn phím chọn chương trình và việc điều khiển các cơ cấu robot trước khi chạy.

-         Ta thấy robot chỉ thực hiện chương trình khi nút start được nhấn

-         Nếu các nút từ 0 đến 9 được nhấn thì hiển thị các số từ 0 đến 9

-         Nếu nút nhấn thao tác được nhấn thì kiểm tra số đang hiển thị để thực hiện thao tác với các cơ cấu tương ứng.

-         Nếu không có nút nào được nhấn thì tắt toàn bộ động cơ.

-         Sau khi nhấn nút start thuật toán chọn chương trình kết thúc vì robot đã hoạt động một cách tự động với chương trình đã lập trình trước tương ứng với nút nhấn đã chọn.



Chương trình:

void chon_chuong_trinh(void)

{

   while(start==1)                                              // trong khi chưa nhấn start

     {

            if(NUT0==0)                           // nếu nhấn nút 0

                        MODE=0;

            else if(NUT1==0)                     // nếu nhấn nút 1

                        MODE=1;

            else if(NUT2==0)                     // nếu nhấn nút 2          

                        MODE=2;

            else if(NUT3==0)                     // nếu nhấn nút 3          

                        MODE=3;

            else if(NUT4==0)                     // nếu nhấn nút 4          

                        MODE=4;

            else if(NUT5==0)                     // nếu nhấn nút 5          

                        MODE=5;

            else if(NUT6==0)                     // nếu nhấn nút 6          

                        MODE=6;

            else if(NUT7==0)                     // nếu nhấn nút 7          

                        MODE=7;

            else if(NUT8==0)                     // nếu nhấn nút 8          

                        MODE=8;

            else if(NUT9==0)                     // nếu nhấn nút 9          

                        MODE=9;

            else if(BAMTHAOTAC==0)   // nếu nhấn nút bấm thao tác

              {                   

                        if(MODE==0)                          // TRUOT RA

                        {

                                    TRUOT_ROLE=1;

                                    if(CT_TRUOTRA==1)

                                                TRUOT_MOTOR=150;

                                    else

                                                TRUOT_MOTOR=0;

                        }

else if(MODE==1)                   // TRUOT VAO

                        {

                                    TRUOT_ROLE=0;

                                    if(CT_TRUOTVAO==1)

                                                 TRUOT_MOTOR=150;

                                    else

                                                 TRUOT_MOTOR=0;

                        }         

else if(MODE==2)                   // KEP QUA

                        {

                                    KEP_ROLE=1;

                                    if(CT_KEPQUA==1)

                                                KEP_MOTOR=250;

                                    else

                                                KEP_MOTOR=0;

                        }

else if(MODE==3)                   // NHA QUA

                                    {         

                                    KEP_ROLE=0;

                                    KEP_MOTOR=150;

                        }

else if(MODE==4)                     // KEO LEN

                        {         

                                     KEO_ROLE=1;

                                    if(CT_KEOLEN==1)

                                                KEO_MOTOR=150;

                                    else

                                                KEO_MOTOR=0;

                        }

else if(MODE==5)                     // KEO XUONG

                        {

                                    KEO_ROLE=0;

                                    if(CT_KEOXUONG==1)

                                                 KEO_MOTOR=150;

                                    else

                                                 KEO_MOTOR=0;

                        }

else if(MODE==6)                     //KEO LEN GIUA

                        {

                                    KEO_ROLE=1;

                                    if(CT_GIUATRU==1)

                                                KEO_MOTOR=150;

                                    else

                                                KEO_MOTOR=0;

                        }

                        }

                        else

                        {

                                    TRUOT_MOTOR=0;                

                                    KEO_MOTOR=0;

                                    KEP_MOTOR=0;

                        }

}

}



 

 


 
19/11/2010 23:11 # 7
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


THUẬT TOÁN HIỂN THỊ

Cách lập trình cho module hiển thị gồm 4 led 7 đoạn:

Sơ đồ nguyên lý module hiển thị 4 led 7 đoạn như hình dưới.

 

Để lập trình được Module hiển thị này, đầu tiên các bạn phải nắm rõ Module hiển thị căn bản 7447 + Led 7 đoạn ( anod chung), và phương pháp quét nhiều led 7 đoạn.

Mạch Robot sử dụng Module mạch như trên dùng phương pháp quét led sử dụng ic 74164, Chuyển dử liệu nối tiếp vi điều khiển thành dử liệu song song, mỗi lần xuất dử liệu hiển thị 1 led, và 4 lần như vậy sẽ hiển thị 4 led, do tần số quét nhanh hay số lần lưu ảnh trên võng mạc trên 1 giây là đủ lớn nên mắt thấy 4 led hiển thị cùng 1 lúc.

Ví dụ:

    Chúng ta muốn cho mạch trên hiển thị 1 lúc 4 số 1234: Đầu tiên, vi điều khiển xuất dử liệu hiển thị số 1 trên led1 sẽ là: 10000001. Lần 2: vi điều khiển xuất dử liệu hiển thị số 2 trên led2 sẽ là: 01000010. Lần 3: vi điều khiển xuất dử liệu hiển thị số 3 trên led3 sẽ là:  00100011. Lần 4: vi điều khiển xuất dử liệu hiển thị số 4 trên led4 sẽ là: 00010100 .  Dựa vào tính chất  lưu ảnh 24hình/s của mỗi led, ta tính thời gian trể hợp lí giữa các lần hiển thị led. Lần 5 lại hiển thị số 1 …

                                                                                                                

Các bạn có thể tham khảo các bài lập trình về led 7 đoạn trên diển đàn này, các hiệu ứng sáng led, dồn số .v.v.

Chức năng:

-         Hiển thị các chương trình khi nhấn các nút nhấn tương ứng

-         Hiển thị giá trị của encoder.

-         Hiển thị một số giá trị khác nhau tùy theo người lập trình có tác dụng kiểm tra tính đúng đắn trong quá trình lập trình, chẳng hạn như kiểm tra số ngã tư mà robot đã đi qua.

Chương trình: hiển thị số 1234

void hien_thi_so(void)

{

      while(1)     // vòng lặp mãi mãi

           {

SBUF = 0x81;             // 0x81 = 10000001 sáng số 1 tại led 1

delay_ms(300);            // tạo khoảng thời gian trễ cho hiệu ứng lưu ảnh

SBUF = 0x42;             // 0x81 = 01000010 sáng số 2 tại led 2

delay_ms(300)             // tạo khoảng thời gian trễ cho hiệu ứng lưu ảnh

SBUF = 0x23;             // 0x81 = 00100011 sáng số 3 tại led 3

delay_ms(300);            // tạo khoảng thời gian trễ cho hiệu ứng lưu ảnh

SBUF = 0x14;             // 0x81 = 00010100 sáng số 4 tại led 4

delay_ms(300);            // tạo khoảng thời gian trễ cho hiệu ứng lưu ảnh

            }

}

SBUF là bộ đệm chứa dữ liệu nối tiếp, khi đưa giá trị 10000001 vào SBUF thì ic 74164 sẻ chuyển dữ liệu nối tiếp này sang dữ liệu song song và cùng xuất ra các chân từ O0 đến O7.

Các ngỏ ra từ O0 đến O3 điều khiển cấp nguồn cho led tương ứng nối tại ngỏ ra đó.

Các ngỏ ra tư O4 đến O7 đồng thời xuất dữ liệu ra cho các led 7 đoạn.

Vậy với giá trị SBUF là 10000001 thì đèn ở vị trí O0 sáng và giá trị sáng là 1.



 

 


 
Các thành viên đã Thank nghien_rbc vì Bài viết có ích:
19/11/2010 23:11 # 8
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


 những bài này đã từng post trên diễn đàn it của trường nhưng giờ nó đã ra đi rồi, giờ post ở đây với mong muốn đóng góp chút ít kinh nghiệm bản thân vào phong trào robocon của trường, vì là những bài viết tự biên tự diễn ên không thể tránh thiếu sót, mong các bạn đóng góp ý kiến để hoàn thiện hơn bài viết.
Thôi muộn rồi ngáy đã mai pot tiếp.


 

 


 
21/11/2010 21:11 # 9
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


  THUẬT TOÁN DÒ ĐƯỜNG

Mục đích của việc dò đường: giúp cho robot di chuyển trên các vạch trắng có sẳn trên sân thi đấu để đến các mục tiêu và ghi điểm. Việc dò đường hay còn gọi là dò line làm tăng độ chính xác khi di chuyển của robot.

Cách lập trình dò đường:

- Dựa vào sự thay đổi trạng thái trên các cảm biến dò đường. Cảm biến dò đường được giới thiệu rất kỹ trong các tài liệu đã post trên diễn đàn. Nhưng có thể khái quát như sau:

Một cảm biến của robot thường gồm một con phát và một con thu như hình dưới, khi cấp nguồn thì con phát phát sáng. Mỗi khi đi qua vạch trắng ánh sáng phát từ con phát sẻ phản xạ xuống vạch trắng lên con thu, con thu nhận ánh sáng sẻ thay đổi mức điện áp từ 0v tương ứng với mức 0 thành 5v tương ứng với mức 1. Còn khi ở trên sân có các màu tối ánh sáng không phản xạ lên nên con thu luôn ở mức 0. Như vậy vi điều khiển sẻ liên tuc kiểm tra mức trạng thái có trên mỗi cảm biến thu để xác định được robot có đang ở trên vạch trắng hay không và xác định được độ lệch tương đối của robot so với vạch trắng dựa vào cách bố trí các cảm biến.

- Từ các giá trị của cảm biến đưa về vi điều khiển sẻ điều khiển tốc độ các động cơ dò đường một cách phù hợp nhất để đưa robot chạy vào giửa đường line nhằm đảm bảo độ chính xác khi di chuyển.

* Dưới đây là một số hình ảnh minh hoạ cho thuật toán dò đường theo vạch trắng.

Robot ở trạng thái lý tưởng trong quá trình dò đường.

 

Hình Các trường hợp dò đường

a.       Robot đang bị lệch phải, trường hợp này xử lý bằng cách nạp tốc độ bánh phải lớn tốc độ hơn bánh trái.

b.      Robot đang bị lệch trái, trường hợp này xử lý bằng cách nạp tốc độ bánh trái lớn hơn tốc độ bánh phải.

Các bước để có một chương trình dò đường:

Xác định các trường hợp mà các cảm biến có thể nhận trong quá trình dò đường.

-         Ứng với mỗi giá trị từ module cảm biến, xác định vị trí lệch của robot so với vạch trắng.

Ví dụ:

8 cảm biến được nối vào 8 chân của vi điều khiển ở cổng P0 của vi điều khiển theo trình bày ở hình dưới:

Nếu giá trị tại cổng P0 là 00011000 thì giá trị tương ứng của mắt trái 1 và mắt phải 1 bằng 1, tức là hai mắt giửa của robot nhận được vạch trắng và có mức điện áp bằng 1, do đó ta biết được là robot đang nằm ở chính giửa vạch trắng.

Nếu giá trị tại cổng P0 là 11000000 thì giá trị tương ứng của mắt trái 4 và mắt trái 3 bằng 1, tức là hai mắt ngoài cùng bên trái của robot nhận được vạch trắng và có mức điện áp bằng 1, do đó ta biết được là robot đang nằm lệch nhiều về phía bên phải của vạch trắng.

Tương tự, nếu giá trị tại cổng P0 là 00000011 thì giá trị tương ứng của mắt phải 4 và mắt phải 3 bằng 1, tức là hai mắt ngoài cùng bên phải của robot nhận được vạch trắng và có mức điện áp bằng 1, do đó ta biết được là robot đang nằm lệch nhiều về phía bên trái của vạch trắng.

            Có khá nhiều các vị trí tương đối của cảm biến so với vạch trắng và với mỗi vị trí đó ta hoàn toàn có thể xác định độ lệch của robot trên vạch trắng và từ đó điều khiển tốc độ của hai động cơ dò đường cho phù hợp để đưa robot về chính giữa vạch trắng nhằm đảm bảo độ chính xác cho robot di chuyển tới mục tiêu.

           

-         như vậy sau khi đã xác định được các trường hợp mà khi dò đường robot có thể gặp phải, ta nhận giá trị của cảm biến và so sánh với các trường hợp đã thiết lập, nếu các cảm biến đang rơi vào trường hợp nào thì ta điều khiển động cơ cho từng trường hợp đó.

Chương trình dò đường đơn giản như sau:

void do_duong(void)

{

       while(1)

     {

            ACC=P0;  // nhận giá trị cảm biến từ cổng P0 vào thanh ghi đa chức năng ACC

if(ACC==11000000)                           // MT4 và MT3 nhận -> lệch phải nhiều

{         

                        RMOTOR=200;                      // bánh trái chạy chậm hơn bánh phải

                        LMOTOR=50;                        // để điều chỉnh robot vào giửa line

}

if(ACC==01100000)                           // MT3 và MT2 nhận -> lệch phải vừa

{         

                        RMOTOR=200;

                        LMOTOR=100;

}

if(ACC==00110000)                           // MT2 và MT1 nhận -> lệch phải ít

{         

                        RMOTOR=200;

                        LMOTOR=50;

}

if(ACC==00011000)                           // hai mắt giữa nhận -> không lệch

{         

                        RMOTOR=200;

                        LMOTOR=200;

}

 

if(ACC==00001100)                           // MP1 và MP2 nhận -> lệch trái ít

{         

                        RMOTOR=50;

                        LMOTOR=200;

}

if(ACC==00000110)                           // MP2 và MP3 nhận -> lệch trái vừa

{         

                        RMOTOR=100;

                        LMOTOR=200;

}

if(ACC==00000011)                           // MP3 và MP4 nhận -> lệch trái nhiều

{         

                        RMOTOR=150;                      // bánh phải chạy chậm hơn bánh trái

                        LMOTOR=200;                      // để điều chỉnh robot vào giửa line

}

     }

}

 

 

 

 

 

 

 

Chương trình này chỉ chứa một số trường hợp đơn giản, vẫn còn khá nhiều trường hợp và nhiều giải thuật khác hay hơn, mình chỉ đưa ra một ví dụ đơn giản để các bạn có thể phát triển tối ưu hơn



 

 


 
21/11/2010 21:11 # 10
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


 THUẬT TOÁN THAO TÁC CÁC CƠ CẤU

Chức năng: điều khiển các cơ cấu của robot thực hiện các thao tác nhằm ghi điểm với các cấu kiện.

            Ví dụ: khi robot muốn đặt cấu kiện vào kim tự tháp chẳng hạn, nó phải thực hiện một số thao tác như, đẩy cấu kiện và đúng vị trí, đặt cấu kiện xuống.v.v.

Ở đây ta mô phỏng thao tác kéo xuống để đưa cấu kiện xuông.

Thuật toán:

Giải thích cho thuật toán:

-         Chọn chiều thao tác: muốn robot thao tác kéo lên hay xuống thì đầu tiên là chọn chiều quay của động cơ.

-         Nạp thời gian thực hiện thao tác: Thông thường để kiểm tra một thao tác thực hiện được kết thúc khi nào thf người ta sử dụng các công tắc hành trình như đã nói ở trên, nhưng để an toàn hơn trong trường hợp công tắc hành trình có thể hỏng do va đập nhiều, ta có thể tính toán khoảng thời gian thực hiện thao tác để kết thúc thao tác trong trường hợp công tắc bị hỏng. Khoảng thời gian tính toán phải đủ để lớn hơn thời gian chạm công tắc hành trình, vì ưu tiên kiểm tra công tắc hành trình trước.

-         Chạy cơ cấu: Cấp nguồn cho động cơ thực hiện thao tác hạ cơ cấu để bỏ cấu kiện vào vị trí.

-         Giảm thời gian thực hiện: đồng thời với việc thao tác, giảm thời gian thực hiện xuống.

-         Kiểm tra : Nếu đã chạm công tắc hành trình: tức là cơ cấu đã đưa cấu kiện đến đúng vị trí cần để, nạp thời gian thực hiện về 0 và kết thúc thao tác. Nếu chưa chạm công tắc thì kiểm tra thời gian thực hiện.

-         Kiểm tra : Nếu thời gian thực hiện đã bằng 0 thì dừng thao tác và kết thúc. Nếu thời gian thực hiện còn lớn hơn 0 thì tiếp tục thực hiện bước chạy cơ cấu.

Chương trình cho một thao tác:

void keo_xuong(void)

{

 KEO_ROLE=0;                                   // chọn chiều động cơ

 KEO_MOTOR=80;                              // nạp tốc độ động cơ

 CT_KEOXUONG=1; 

int thoi_gian_thuc_hien=1000;            // nạp thời gian thực hiện

while(thoi_gian_thuc_hien!=0)            // trong khi chua het thoi gian   

    {

     if(CT_KEOXUONG==1)                  // đã chạm công tắc hành trình

           {

thoi_gian_thuc_hien==0;

                            // nạp thời gian thực hiện bằng 0 để kết thúc thao tác

           }

      else                                             

          thoi_gian_thuc_hien--;          // giảm thời gian thực hiện xuống 

               }

      KEO_MOTOR=0;                          // dừng động cơ

}




 

 


 
21/11/2010 21:11 # 11
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


Thuật toán nhận biết ngã tư và đếm ngã tư:

Ý nghĩa thuật toán:

Khi robot do đường trên sân thi đấu nó không chỉ đi thẳng mà còn rẻ phải rẻ trái .v.v. Khi robot chuyển hướng thì thường nó phải tìm một ngã tư để tiếp tục dò đường sau khi quay. Vậy làm sao để robot nhận biết được nó đang đứng tại một ngã tư và ngã tư đó là ngã tư thứ mấy? Ta có thuật toán đếm ngã tư.

 

Nhìn vào hình vẻ này ta thấy muốn robot nhận biết được ngã tư thì số cảm biến dò đường nằm trên vạch trắng sẻ lớn hơn 3, vì vạch trắng theo chiều dọc chỉ đủ để chứa 2 cảm biến, robot gặp ngã tư tức là các cảm biến cùng nằm trong vạch trắng ngang.

 

Vậy để kiểm tra robot có nằm trên ngã tư không ta chỉ cần kiểm tra một tổ hợp trên 3 cảm biến trong 8 cảm biến nhận vạch trắng.

Ví dụ: Nếu cổng P0 được nối tới các cảm biến thì ta kiểm tra giá trị cổng P0, nếu P0 = 00011100 tức là có ba cảm biến nhận vạch trắng như vậy robot đã bắt được 1 ngã tư. Ta dùng một biến để kiểm tra ngã tư là co_nga_tu.

Nếu muốn di chuyển tới ngã tư thứ mấy thì ta dùng một biến để lưu số ngã tư đã đi qua, mỗi lần qua ngã tư thì biến này tăng lên 1 chẳng hạn, và chỉ cần kiểm tra biến này bằng bao nhiêu thì ta xác định được ngã tư robot đang đến là ngã tư thứ mấy.

Chương trình kiểm tra ngã tư đơn giản: kiểm tra tổ hợp 3 trên 4 cảm biến ở giửa của robot.

void kt_nga_tu(void)

{

  ACC=P0;                              // Nhận giá trị cảm biến ở cổng P0 vào thanh ghi ACC

  if(ACC==00111000)             // trường hợp 3 mắt nhận

    {

co_nga_tu=1;               // đã có ngã tư 

    }

  else if(ACC==00110100)      // trường hợp 3 mắt nhận

    {

            co_nga_tu=1;

    }

  else if(ACC==00101100)      // trường hợp 3 mắt nhận

    {

            co_nga_tu=1;

    }

  else if(ACC==00011100)      // trường hợp 3 mắt nhận

    {

            co_nga_tu=1;

    }

  else if(ACC==00111100)      // trường hợp 4 mắt nhận

    {

            co_nga_tu=1;

    }

   else

     do_duong();                        // nếu không gặp ngã tư thì gọi hàm dò đường trên vạch //trắng dọc

}

 

Chương trình chính của chúng ta sẻ như sau: Chẳng hạn ta viết chương trình cho robot chạy tới ngả tư thứ 3 rồi thực hiện thao tác rẻ trái.

void main(void)

{

  bit dem_so_nga_tu=0;                        // khai bao bien đếm ngã tư

  bit co_nga_tu=0;                                // khai báo biến cờ ngã tư =0

 while(dem_nga_tu!=3)             // trong khi chưa đủ 3 ngã tư

  {

     kt_nga_tu();                         // gọi hàm kiểm tra ngã tư để kiểm tra ngã tư

     if(co_nga_tu==1)                             // nếu đã gặp ngả tư

    dem_so_nga_tu++;                           // tăng giá trị đếm ngã tư lên

 

  }

    re_trai();                                           // gọi hàm rẻ trái để thực hiện thao tác rẻ trái

}

 



 

 


 
21/11/2010 21:11 # 12
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


   THUẬT TOÁN ĐO QUẢNG ĐƯỜNG BẰNG ENCODER.

Encoder là gì:

Encoder là thiết bị thường được sử dụng để đo và tính các khoảng cách dựa trên việc đếm số lổ trên encoder.

Có nhiều loại encoder nhưng chúng chỉ khác nhau về số lỗ. Có loại chỉ có 50 lỗ, 100 lỗ nhưng có loại lên đến vài ngàn lỗ.

Cấu tạo:

Encoder thường gồm một tấm tròn được khoét các lỗ cách đều nhau. Encoder 100 lỗ tức là trên tấm đĩa tròn có 100 lỗ. tấm đĩa đó được giử ở trong thân encoder và được nối với trục quay của encoder. Một bên tấm đĩa gắn một con LED phát sáng, bên còn lại gắn một con cảm biến ánh sáng (tương tự như là cảm biến dò đường vậy). Con led phát sáng và con cảm biến ánh sáng nằm cố định khi encoder quay.

Nguyên lý hoạt động của encoder dùng để đếm số lỗ có thể hiểu đơn giản như sau:

-         Khi trục encoder quay, tấm đĩa gắn với trục quay nên cùng quay với trục quay.

-         Con led phát sáng liên tục khi cấp nguồn và chiếu vào tấm đĩa, phía bên kia cứ mỗi lần ánh sáng từ con led chiếu qua 1 lỗ của tấm đĩa thì con cảm biến ánh sáng thu nhận được và xác định tương ứng 1 lỗ. Như vậy nếu trục encoder quay đúng 1 vòng thì tương ứng con cảm biến ánh sáng cũng phát hiện ra đúng số lỗ của encoder đó.

Ví dụ:

Muốn đo quảng đường 1 mét bằng cách sử dụng encoder 100 lỗ và trục của encoder được gắn vào trục quay của bánh xe ta thực hiện như sau:

-         Xác định chu vi của bánh xe (chẳng hạn là 25 cm)

-         Cứ 1 vòng quay của encoder thì bánh xe quay được một vòng, tức là:

Cứ 100 lỗ robot-> chạy được 25 cm

? lỗ                   -> chạy được 100 cm

Vậy ta có số lỗ cần thiết của encoder để robot chạy được 1m bằng 100*100/25=400(lỗ)

Thuật toán sử dụng encoder.

 

 

Chương trình sử dụng ngắt ngoài để đếm số lổ encoder:

 

void EX0_int0(void) interrupt 0

{

      ACC=encoder_low;                            

      if(ACC==0)

      {

       ACC=encoder_high;                                      

      if(ACC==0)

         EX0=0;           

        else

         {

          encoder_high=encoder_high-1;

          encoder_low=255;

         }

         }

    else       

    encoder_low=encoder_low-1;

}

 



 

 


 
21/11/2010 21:11 # 13
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


 Trên đây mình đã giới thiệu khá đầy đủ các thuật toán thường dùng trong robocon. Nhưng trước khi đi vào lập trình cho robocon thì các bạn cũng cần nắm qua về tổng quan chương trình robocon. Đáng lẽ cái này mình định post trước mà quên mất.


TỔNG QUAN VỀ CHƯƠNG TRÌNH CỦA ROBOCON.

 

Chương trình cho robocon là một chương trình được viết để điều khiển robot thực hiện một số chức năng nhất định tùy theo chiến thuật thi đấu của đội thông qua việc lập trình cho các thiết bị linh kiện tích hợp trên mạch điện tử. Trung tâm của mạch điện tử điều khiển robot là một vi điều khiển có chức năng điều khiển các module khác của mạch như module cảm biến , module hiển thị, module công suất với các cơ cấu chấp hành, module điều chỉnh với các công tắc hành trình và nút nhấn cùng các module khác.

 

 

Nhìn vào hình vẻ trên ta có thể thấy việc thực thi của một chương trình robot đó là:

Module vi điều khiển sẻ nhận thông tin từ các module có chức năng làm đầu vào là module điều chỉnh và module cảm biến sau đó thực hiện xử lý thông tin và đáp ứng ra các module có chức năng làm đầu ra như module hiển thị và module chấp hành.

Có thể nói robot cũng như một máy tính vậy. Có thể so sánh các module đầu vào của robot như là các thiết bị input của một máy tính như bàn phím chuột hay máy fax, các module đầu ra của robot như là màn hình hay máy in, và khối vi điều khiển của mạch điều khiển như là khối xử lý trung tâm CPU của máy tính vậy. Và tất nhiên là lập trình cho robot cũng bao gồm các công việc mà bất kỳ một chương trình lập trình nào cũng phải có là : input -> processing -> output. Sau này đi vào các thuật toán cơ bản các bạn sẻ hiểu rỏ hơn về các module input hay output của robot.

Nhưng bây giờ là một ví dụ cụ thể: Theo yêu cầu của luật thi năm nay, các robot tự động phải mang quà tới đặt vào các kim tự tháp, để làm được công việc đó thì mỗi robot được lập trình dò đường để ghi điểm phải có một số thao tác nhất định như:

-         Khởi động bằng một nút nhấn (liên quan tới thuật toán chọn chương trình) tức là chọn đầu vào cho robot xử lý.

-         Dò đường tới gần kim tự tháp để ghi điểm (liên quan đến thuật toán dò đường)

-         Điều khiển cơ cấu chấp hành đặt cấu kiện xuống kim tự tháp để ghi điểm (liên quan đến thuật toán điều khiển động cơ)

            Trước khi đi vào các giải thuật thì các bạn nên nắm vững cách lập trình cho các thiết bị hay linh kiện có chức năng input, output hay là chức năng điều khiển.

 

Input: Nút nhấn, công tắc hành trình, cảm biến dò đường, encoder.

Về cảm biến dò đường các bạn có thể tham khảo trên các tài liệu đã post trên diển đàn, các tài liệu đã chỉ dẫn rất rỏ ràng.

Output: Led 7 đoạn, động cơ

Cách lập trình cho mỗi thiết bị này đã được trình bày rỏ trong mỗi thuật toán ở trên.



 

 


 
21/11/2010 21:11 # 14
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


 Ngoài ra còn một chương trình không thể thiếu được là chương trình delay

Chương trình delay:

Chương trình delay trong lập trình robot nói riêng và lập trình nhúng nói chung là rất quan trọng, delay là chương trình để tạo ra khoảng thời gian trể, có nhiều cách để tạo ra một hàm delay, thường thì người ta dùng vòng lặp hoặc dùng bộ định thời. ở đây mình giới thiệu một hàm delay bằng cách sử dụng vòng lặp vì các bộ định thời của vi điều khiển đã được sử dụng trên các ngắt rồi. hehe

Chương trình như sau:

 

void delay_ms(unsigned int x){

unsigned int TGIAN_TRE1;     

      while(x!=0)

        {    

         TGIAN_TRE1=121;

         while(TGIAN_TRE1!=0)

         {          

                  TGIAN_TRE1=TGIAN_TRE1-1;

         }

         x=x-1;

      }

}

Để tạo ra chương trình delay này ta phải biết khoảng thời gian thực hiện một lệnh trong chương trình tốn bao nhiêu thời gian, chương trình trể là chương trình thực hiện các lệnh và không có tác dụng điều khiển robot như các lệnh lặp for, while .v.v. Chẳng hạn lệnh TGIAN_TRE1=TGIAN_TRE1-1; chỉ tốn 1 hay 2 micro giây gì đó(lâu rồi quên nhưng chỉ cần tính ngược lại là được vì chương trình mình đã thử và chạy khá chính xác), thời gian của chương trình trể bằng tổng thời gian thực hiện các lệnh có trong chương trình.

 

Với chương trình này ta sử dụng như sau:

Muốn trể 1 mili giây ta gọi hàm: delay_ms(1);

Muốn trể 100 mili giây ta gọi hàm: delay_ms(100);

Muốn trể 1 giây ta gọi hàm: delay_ms(1000);

 

Ta có một thao tác như sau:

Void main(void)

{

  keo_len();

  for(int i=0;i<10;i++)                      // lặp 10 lần
  delay_ms(1000);                      // trể 1 giây
  keo_xuong();

}

Như vậy chương trình trên thực hiện thao tác kéo lên sau đó trể 10 giây rồi kéo xuống.



 

 


 
21/11/2010 21:11 # 15
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Topic Hỏi Đáp Kiến Thức ROBOCON


Tất cả các bài viết trên mình cho nó vào cái file đính kèm này
File đính kèm Bạn phải đăng nhập mới thấy link download


 

 


 
22/11/2010 08:11 # 16
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


sao diễn đàn không có cái tag code để mình đưa code vào cho dễ nhìn nhỉ


 

 


 
16/05/2011 09:05 # 17
Lequyhue
Cấp độ: 1 - Kỹ năng: 1

Kinh nghiệm: 1/10 (10%)
Kĩ năng: 0/10 (0%)
Ngày gia nhập: 16/05/2011
Bài gởi: 1
Được cảm ơn: 0
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


Cam on



 
16/05/2011 10:05 # 18
linhqb
Cấp độ: 4 - Kỹ năng: 3

Kinh nghiệm: 2/40 (5%)
Kĩ năng: 6/30 (20%)
Ngày gia nhập: 01/11/2010
Bài gởi: 62
Được cảm ơn: 36
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


hi vọng rbc DTU sẽ có được thành công vào năm sau



(¯`°•.¸¯`°•phận làm trai gõ phím bình thiên hạ´¯¸.•°´¯)
(¯`°•.¸¯`°•.Thân anh hùng click chụt định giang sang´¯¸.•°´¯)


 
Các thành viên đã Thank linhqb vì Bài viết có ích:
05/07/2011 23:07 # 19
vubangtvu
Cấp độ: 1 - Kỹ năng: 1

Kinh nghiệm: 1/10 (10%)
Kĩ năng: 0/10 (0%)
Ngày gia nhập: 05/07/2011
Bài gởi: 1
Được cảm ơn: 0
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


Tài liệu hay đấy!!!!thanks bác nhiều nha!!!!



 
07/07/2011 23:07 # 20
nghien_rbc
Cấp độ: 6 - Kỹ năng: 5

Kinh nghiệm: 4/60 (7%)
Kĩ năng: 0/50 (0%)
Ngày gia nhập: 16/03/2010
Bài gởi: 154
Được cảm ơn: 100
Phản hồi: Topic Hỏi Đáp Kiến Thức ROBOCON


 Tạm thôi. Mấy cái này cũ quá rồi, không theo kịp thời đại rồi. Công nghệ lỗi thời rồi. Mấy bác nào có công nghệ chi hay post lên đây cho anh chị em học tập với.


 

 


 
Copyright© Đại học Duy Tân 2010 - 2024