Một trong những bài toán đầu tiên khi tham gia robocon là dùng cảm biến dò đường, mặc dù bây giờ có thể nhiều đội sử dụng những công nghệ hiện đại, không cần dò line vẫn chạy vèo vèo, thậm chí còn chính xác và ít lỗi hơn dò line. Tuy nhiên, đây là bài toán cơ bản. Cũng như những bạn từng tham gia robocon, mình đã vướng nhiều khó khăn trong việc sử dụng quang trở làm cảm biến dò đường, đặc biệt nếu dùng thủ công với IC LM339. Sau khi đã sử dụng các module cảm biến dò đường của TME, HLAB,…Mình quyết định tự chế riêng một module ADC dò đường, chạy tương đối ổn. Bây giờ thì không còn duyên với robocon nên mình share lại project này, hi vọng sẽ có bạn làm được cái gì đó với những chia sẻ của mình.
Đây là video test mạch, còn thực tế thì module này đã trinh chiến nhiều trong các cuộc thi robocon của trường SQTT rồi, đảm bảo ngon, bổ, rẻ, học được nhiều thứ ( Cách khai báo, đọc ADC trên AVR, đọc, ghi vào ROM của AVR,…)
Video Robot trường Đại học thông tin liên lạc- Nha Trang năm 2017, sử dụng dò line qua ADC và bộ cảm biến góc do ad tự ráp bằng MPU6050 và Arduino Promini
Trong bài, mình share cho các bạn file mô phỏng trên Proteus, dùng ATmega8. Còn mạch thực tế thì như trong video.
Trong phần thiết kế này, các linh kiện chính được sử dụng như sau:
+ Chip Atmega8, 8Mhz
+ 8 biến trở ( mô phỏng cho 8 mắt cảm biến sử dụng quang trở)
+ 2 nút nhấn cho sử dụng lấy mẫu sân
+ 8 led cho hiển thị báo lấy mẫu và trong quá trình đọc vạch trên sân
Trong các thành phần trên, 8 biến trở được đưa vào 8 chân của PORTC, 8 led được nối vào PORTD, 2 nút nhấn nối lần lượt PB0/PORTB và PB1/PORTB
Cách chạy mo phỏng trên Proteus các bạn tham khảo video dưới đây:
- Cách sử dụng file mô phỏng:
+ Đầu tiên cần chọn nguồn xung clock 8Mhz, chọn file hex sau khi đã biên dịch
+ Chọn nút RUN trên proteus
+ Điều chỉnh quang trở về vị trí thấp nhất ( gần với GND) tương đương với việc chúng ta đưa mắt cảm biến về phía đường line. Nhấn vào swicth bên phải, sẽ thấy hàng led sáng chạy lần lượt từ phải qua trái, lúc này module đã lấy được giá trị về ngưỡng sáng tại line
+ Tiếp tục điều chỉnh quang trở về chính giữa, tượng trưng cho việc chúng ta để mắt cảm biến vào toàn bộ nền sân xanh hoặc đỏ. Nhấn nút còn lại, ta sẽ thấy đèn led sáng chạy từ trái qua phải và nhấp nháy. Vậy là ok.
+ Test bằng cách kéo vị trí quang trở lại về phía GND, đèn LED tương ứng với quang trở sẽ sáng, biểu diễn cho ta mắt quang trở đã nhận thành công đường line.
- chú ý: Tất cả thao tác dùng biến trở trên sẽ không làm trên mạch thật, lúc này chỉ cần đưa mắt cảm biến vào các vị trí tương ứng và nhấn nút.
Mã nguồn cho phần mô phỏng
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
//============================================== Telecommunications University=================== // Author : DoNgocTuan / Department of Telecommunication Technology // Email: ngoctuansqtt@gmail.com // Phone: xxxxxxxxxx // Date : 21/12/2016 // Version: 1.1 // Description: This module is used to detect the white line on many background colors // ============================================== make myselft=================================== #include <stdio.h> #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/eeprom.h> #include <util/delay.h> #define ADC_VREF_TYPE 0x20 uint8_t eeprom_read_byte (const uint8_t *addr) ; #define AREF_MODE 0 //dien ap tham chieu ngoai, dien ap tren chan Vref #define AVCC_MODE (1<<REFS0) //dung dien ap chan AVcc lam dien ap tham chieu, //chan Vref gan voi 1 tu dien #define INT_MODE (1<<REFS1)|(1<<REFS0) //dung dien ap tham chieu noi 2.56V, //chan Vref gan voi 1 tu dien #define ADC_VREF_TYPE AVCC_MODE //dinh nghia dien ap tham chieu #define sbi(sfr,bit) sfr|=_BV(bit) // các macro cho set bit và clear bit #define cbi(sfr,bit) sfr&=~(_BV(bit)) // các macro cho set bit và clear bit uint16_t read_adc(unsigned char adc_channel) //chuong trinh con doc ADC theo tung channel { ADMUX=adc_channel|ADC_VREF_TYPE; ADCSRA|=(1<<ADSC); //bat dau chuyen doi loop_until_bit_is_set(ADCSRA,ADIF); //cho den khi nao bit ADIF==1 return ADCW; } uint16_t ADC_val[8]; unsigned char w[8] = {1,2,4,8,16,32,64,128}; unsigned int sensor; uint16_t temp_adc[8]={0,0,0,0,0,0,0,0} ; // mang rom luu gia tri lay ma so sanh uint16_t mau_adc[8]={0,0,0,0,0,0,0,0} ; // mang rom luu gia tri lay ma so sanh uint16_t value_rom[8]={0,0,0,0,0,0,0,0} ; uint16_t value_trang[8]={0,0,0,0,0,0,0,0} ; void value_trang_luu() // lấy giá trị adc hiện tại lưu vào mảng { char j; for(j=0;j<8;j++) { value_trang[j]= read_adc(j); } } void ghi_adc_in_rom (void) // chuong trinh thuc hien ghi ADC vao ROM { uint8_t i,x; for(i=0;i<8;i++) { x=46+2*i; // lấy giá trị địa chỉ value_rom[i]= (ADC_val[i]+ value_trang[i])/2; // Giá trị lưu để so sánh là trung bình cộng //của giá trị lấy mẫu vạch trắng và giá trị lấy mẫu nền sân eeprom_write_word((uint16_t *)x,value_rom[i] ); _delay_ms(10); // thuc hien tre thoi gian ghi } } void doc_rom(void) // thuc hien viec doc { uint8_t j,x; for(j=0;j<8;j++) { x=46+2*j; ADC_val[j] = read_adc(j); temp_adc[j] = eeprom_read_word((uint16_t *)x) ; mau_adc[j]= temp_adc[j]; } return mau_adc; } // ha void doc_adc(void) // thuc hien viec doc { uint8_t j; sensor = 0x00; for(j=0;j<8;j++) { ADC_val[j] = read_adc(j); if((mau_adc[j]) < ADC_val[j]) // kiem tra so sanh voi gia tri ADC mau { char t; for(t=0;t<5;t++) { _delay_ms(1); // chống nhiễu if((mau_adc[j]) >= ADC_val[j]) goto exit_t; } sensor |= w[7-j]; // thuc hien cong don gia tri exit_t: ; } else sensor |= 0; } PORTD=sensor; } // hàm báo hiệu lưu ROM bằng chạy led void led_save_rom() { PORTD=0xFF; char i; for(i=0;i<8;i++) { cbi(PORTD,i); _delay_ms(50); } PORTD=0xFF; for(i=0;i<3;i++) { PORTD=0; _delay_ms(50); PORTD=0xFF; _delay_ms(50); } } void led_save_value_trang() { PORTD=0xFF; char i; for(i=8;i>1;i--) { cbi(PORTD,i); _delay_ms(50); } PORTD=0xFF; } // ham luu gia tri vao ROM void save_rom() { _delay_ms(2); if(bit_is_set(PINB,0)) goto out_noise; _delay_ms(2); if(bit_is_set(PINB,0)) goto out_noise; _delay_ms(2); if(bit_is_set(PINB,0)) goto out_noise; _delay_ms(2); if(bit_is_set(PINB,0)) goto out_noise; _delay_ms(2); if(bit_is_set(PINB,0)) goto out_noise; while(bit_is_clear(PINB,0)); ghi_adc_in_rom(); led_save_rom(); out_noise: ; } int main(void) { //start ADC=============// ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); //enable ADC, khong dung interrupt ADMUX=ADC_VREF_TYPE; //chon kieu dien ap tham chieu //======================// PORTC = 0X00; // PORT nhan ADC DDRC = 0x00; // PORT nhan ADC PORTD = 0xFF; // PORT xuat tin hieu den MCU DDRD = 0xFF; // PORT xuat tin hieu den MCU PORTB = 0xFF; // PORT nhan nut nhan DDRB =0; doc_rom(); while (1) { if(bit_is_clear(PINB,0)) // Nhấn nút này để so sánh với nền sân và lưu giá cần dùng vào ROM { save_rom(); _delay_ms(100); doc_rom(); } if(bit_is_clear(PINB,1)) // Nhấn nút này để lưu giá trị vạch { while (bit_is_clear(PINB,1)); value_trang_luu(); led_save_value_trang(); } doc_adc(); } } // main |
Toàn bộ source code trên được viết và biên dịch trên AVR Studio4
Vì đây là phiên bản 1, và cũng chưa có cơ hội dùng thêm để nâng cấp thuật toán, nên phần tính toán ngưỡng so sánh chỉ là một việc đơn giản đó là lấy trung bình cộng của giá trị tại line trắng và giá trị tại nền sân xanh/đỏ.
File Schematic và PCB Altium module này dowload 3 file theo link dưới đây:
File mã nguồn C và project AvrStudio4
File hướng dẫn set fulse bit
*** Cần chú ý về thanh cảm biến của mình, theo kinh nghiệm thì quang trở đặt cao bằng 1 nửa con led trắng. Đồng thời các bạn mua ống GEN hơ lửa ( loại mà các bạn hay dùng để bọc mối nối dây điện) bọc vào con đèn LED trắng, để cho ánh sáng không tỏa ra xung quanh, chỉ hướng xuống dưới thôi, như vậy sẽ tránh được nhiễu ánh sáng, làm mạch hoạt động không chính xác ***
- Bài viết chia sẻ về thiết kế mắt cảm biến cho robot
- Hướng dẫn thiết lập fulse bit, đấu nối với cảm biến và boar mạch điều khiển
anh ơi cho em xin file Schematic và PCB Altium với ạ
Email của bạn là gì nhỉ?
Đã gửi nhé!
a cho e xin file PCB và schematic với a. email: amencrazy99@gmail.com
Sent!
E cảm ơn a. E đã làm xong mạch in và test. Nhưng trong các điều kiện ánh sáng khác nhau thì dò line sẽ bị lỗi do con quang trở. A có thể cho e xin kinh nghiệm fix lỗi này không ạ. E cảm ơn a
chào bạn, với điều kiện ánh sáng trên sân thi đấu thì thực sự là điều rất lo ngại với người làm robot. tuy nhiên điều kiện thay đổi độ sáng trên sân thi đấu có lẽ rất ít, trừ khi bạn đi vào các vùng có nền sân sơn màu chưa đều. Còn trước đây mình chỉ dùng một cách khắc phục đó là làm hộp che cảm biến, tránh ánh sáng phía trên hắt xuống. mình cố gắng để quang trở chỉ nhận ánh sáng từ led trắng thôi.
Bạn cũng cần chú ý về thanh cảm biến của mình, theo kinh nghiệm thì quang trở của mình đặt cao bằng 1 nửa con led trắng. Đồng thời các bạn mua ống GEN hơ lửa ( loại mà các bạn hay dùng để bọc mối nối dây điện) bọc vào con đèn LED trắng, để cho ánh sáng không tỏa ra xung quang, chỉ hướng xuống dưới thôi.
mạch này anh có bán full không ạ
MÌnh ko còn làm mạch nữa nên tất cả file thiết kế và code sử dụng mình đã post hết trong bài rồi, bạn chịu khó đọc và lấy link download nhé.
Cho em xin file Sch vs PCB vs ạ
sondamde98@gmail.com
Sent!
Ad cho e xin file sch và pcb với ạ.
Em xin sch với pcb với ạ
Hoanganhthao16031998@gmail.com
Sent!
Cho e xin file sch và pcb vơi ạ
làm.danh30@yahoo.com
Sent!
cho em xin sch vs pcb vs ạ
phamhuongabc98@gmail.com
Sent!
Mạch nạp cho con chip dán này thế nào ạ
mạch nạp này dùng STK500 nhé, trong thiết kế đã có chân cắm để cắm thẳng vào STK500 không cần cáp
cho e với ạ ad
ddien0502@gmail.com
Sent!
Cho e xin file PCB kenztran1999@gmail.com
Cho em xin với à. mạch này nạp có phải set bit gì không anh nhỉ?
congtrangskv@gmail.com
Có nhé, nhưng do bài viết dài quá nên anh sẽ post phần set fulse bit bài khác, sắp thôi. PCB sent!
dạ, em cảm ơn anh ạ
Anh ơi cho em xin với ạ, mail em là leduyhiep31509@gmail.com ạ, em cám ơn anh ạ
Sent! Các hướng dẫn và cách sử dụng bạn tìm trong mục Điện tử Robot nhé!
cho em xin với ạ gmail: lienytu@gmail.com
Sent!
Anh ơi cho em xin với ạ, email em là wolfram161@gmail.com ạ, em cám ơn anh rất nhiều.
Sent!
Anh ơi cho e file sch vs pcb với ạ em xin cảm ơn ạ
Zing9001@gmail.com
Đã gửi nhé!
Anh ơi , cho em xin file sch vs pcb với.
Em cảm ơn!
languyentst@gmail.com
Ok, Sent!
Cho em xin file sch và pcb với ạ. Em xin cảm ơn
Anh đưa link tải vào cuối bài viết rồi mà em!
Anh cho em xin thư viện pcb và thư viện sch với ạ, em cảm ơn.
lightninglance.vpa@gmail.com