PIC Vietnam

Go Back   PIC Vietnam > Robotics > Cảm biến

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cảm biến Camera, siêu âm, hồng ngoại, gyro, la bàn...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 30-09-2008, 12:07 AM   #1
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
SRF05 and PIC6F877A !

chào mọi người , đây là em viết chương trình cho cảm biến siêu âm SRF05 + PIC6F877A + LCD1602.
Trích:
// RC2--ECHO
// RD1 --TRIGGER
#include "F:\NCKH 2009\PIC 16\count_timer2\count_timer2.h"
#include <lcd_lib_4bit.c>
#include <F:\NCKH 2009\PIC 16\count_timer2\def_877a.h>
#define CONVERT_TO_MICROSECONDS (20000000/((4*4)*1000000))
//BOOLEAN CCP1Captured;
int8 tram,chuc,donvi,nghin;
void convert_bcd(int8 x)
{
donvi=x%10; //chia lay phan du, so hang don vi
tram=x/100; //tach hang tram va hang chuc
chuc=x/10%10;
nghin = x/1000;
tram = tram + 0x30;
chuc = chuc + 0x30;
donvi = donvi + 0x30;
nghin = nghin +0x30;
}
/////////

void main()
{
int8 x;
int16 time;
LCD_init();
convert_bcd(x);
trisd = 0x02;
trisc = 0x04;
//---hien thi LCD---
LCD_putchar("anh_gioi");
LCD_putcmd(0xC0);
LCD_putchar("T = ");
LCD_putcmd(0xC9);
LCD_putchar(" uS");
//-- khai bao timer-capture ----
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
while(true)
{
//---- 10uS cho trgger ----
output_high(pin_d1);
delay_us(10);
output_low(pin_d1);
//-- Wait for senser output to go high ----
while(!input(pin_c2)) {}
set_timer1(0);
convert_bcd(time);//
while(input(pin_c2)) {}
time = get_timer1(); //doc thoi gian
time = time/CONVERT_TO_MICROSECONDS; //chuyen doi ra mcrogiay
convert_bcd(time);
///// hien thi len gia tri LCD//////
LCD_putcmd(0xC4);
LCD_putchar(nghin);
LCD_putcmd(0xC5);
LCD_putchar(tram);
LCD_putcmd(0x6);
LCD_putchar(chuc);
LCD_putcmd(0xC7);
LCD_putchar(donvi);


}
}
chương trình của em muốn hiển thị thời gian mà SRF thu được khi gặp vật cản.
nhưng giá trị time của em không hiển thị lên LCD được. Em nghi lập trình nhưng khi thay tín hiệu ECHO (pin_c2) bằng nút bấm (buttom) thì giá trị được hiểnthị lên LCD.
em không hiểu tại sao ? ---> nên em suy ra không bít có phải do SRF05 mà em mới mua không?
các bác chỉ em với ?????
Hình Kèm Theo
File Type: jpg SRF05 and PIC16F877A.JPG (80.8 KB, 603 lần tải)
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-09-2008, 03:51 PM   #2
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Em viết thế này thì sóng siêu âm đã tắt ngay cái chỗ

convert_bcd(time);//

thì làm sao em đo được giá trị nữa. Hơn nữa, đã có capture thì em đọc giá trị từ capture ra, chứ cần gì phải đặt timer tùm lum như vậy.

Chỉ cần khi có xung lên/xuông em bật capture thì giá trị timer nó nằm trong capture đấy. Chỉ cần kiểm tra khi nào là xung lên, khi nào là xung xuống. Nếu là xung xuống thì lưu lại timer là xong.

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-09-2008, 05:32 PM   #3
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
may quá có anh trả lời, em đang lo ko có ai trả lời em.
anh ạ ,anh xem hộ em lại với ạ, em đã sửa lại:
Trích:
// RC2--ECHO
// RD1 --TRIGGER
#include "F:\NCKH 2009\PIC 16\count_timer2\count_timer2.h"
#include <lcd_lib_4bit.c>
#include <F:\NCKH 2009\PIC 16\count_timer2\def_877a.h>
#define CONVERT_TO_MICROSECONDS (20000000/((4*4)*1000000))
//BOOLEAN CCP1Captured;
int8 tram,chuc,donvi,nghin;
void convert_bcd(int8 x)
{
donvi=x%10; //chia lay phan du, so hang don vi
tram=x/100; //tach hang tram va hang chuc
chuc=x/10%10;
nghin = x/1000;
tram = tram + 0x30;
chuc = chuc + 0x30;
donvi = donvi + 0x30;
nghin = nghin +0x30;
}
/////////
#int_ccp1
void main()
{
int8 x,s;
int16 t;
LCD_init();
convert_bcd(x);
trisd = 0x02;
trisc = 0x04;

//---hien thi LCD---
LCD_putchar("anh_gioi");
LCD_putcmd(0xC0);
LCD_putchar("S = ");
LCD_putcmd(0xC9);
LCD_putchar(" Cm");

//-- khai bao timer-capture ----
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
while(true)
{

//---- 10uS cho trgger ----
output_high(pin_d1);
delay_us(10);
output_low(pin_d1);
//-- Wait for senser output to go high ----

if(input(pin_c2)==0)
{
t = 0;
set_timer1(0);
LCD_putcmd(0xCE);
LCD_putchar("NO");
}


else
{

t = CCP_1; //doc thoi gian khi co xung cao
s = t/58;
convert_bcd(s);
//time = get_timer1();
LCD_putcmd(0xCE);
LCD_putchar("CO");
//time = time/CONVERT_TO_MICROSECONDS; //chuyen doi ra mcrogiay
}

///// hien thi len gia tri LCD//////
LCD_putcmd(0xC4);
LCD_putchar(nghin);
LCD_putcmd(0xC5);
LCD_putchar(tram);
LCD_putcmd(0x6);
LCD_putchar(chuc);
LCD_putcmd(0xC7);
LCD_putchar(donvi);
}
}
nhưng trên LCD chỉ hiển thị 4 số 0 ?
em không biết lệnh đọc capture trênc ó đùng không nữa vì em lấy vidu trong help CCS ??
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-10-2008, 02:02 AM   #4
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
các bác ơi, giải thích hộ em cái.
mấy ngày hôm nay mò mẫn mà chẳng có kết quả gì, chán quá....
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-10-2008, 02:13 AM   #5
embsys
Nhập môn đệ tử
 
embsys's Avatar
 
Tham gia ngày: Jun 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 1
:
Bác ơi bác lập trình cái món này sao rồi đã chạy tốt chưa. Em đang tìm hiểu cái này thấy hay quá mà chưa biết thế nào
embsys vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-10-2008, 01:20 AM   #6
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
tớ đã tạm ổn việc giao tiếp SRF05- PIC- LCD, nhưng hiện giờ SRF05 ko chạy. tó đang nghi nó có vấn đề.
hức..nó mà hỏng thì toi công cốc.
khi phát xung 10us vào trigger thì nó chỉ nháy đúng 1 lần(đã ở trong while()), ko bít tại sao.nếu ko được chắc phải đặt thêm cái nữa..nhưng hiện tại hết tìn rùi ..ai có hảo tâm cho mượn hoặc bán rẻ cho anh em cái phát để em tiếp tục nghiên cứu tiếp ..hức...
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-10-2008, 01:39 PM   #7
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Chân MODE em đang đặt ở mức nào?

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-10-2008, 07:59 PM   #8
lion
Đệ tử 6 túi
 
lion's Avatar
 
Tham gia ngày: May 2007
Bài gửi: 127
:
tìm hiểu cái này rùi , nhưng chưa có money đầu tư . ko biết Hà nội chỗ nào bán hả các bác , giá cả bao nhiêu ???
lion vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-10-2008, 08:54 PM   #9
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
Trích:
Nguyên văn bởi falleaf View Post
Chân MODE em đang đặt ở mức nào?

Chúc vui
vâng, anh ạ.
lúc trước em "gà" quá. nó không nhận tín hiệu từ SRF là do em để mode xuống đất mà em lại dùng ở chế độ 1.
bây giò em để mode treo (không nối), lúc đầu nhận tín hiệu từ SRF nhưng sau khoảng 10 lần nạp cho chip thì SRF có vấn đề như em nạp 10us cho nó đáng ra nó phải nhấp nháy led(trên SRF), nhưng giờ ko nháy nữa ạ--> ko có tín hiệu để đọc ạ.
giờ em ko biết làm sao. em đang nghi nó hỏng ko biết có phải không?
mong anh trả lời giúp em ạ?
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-10-2008, 08:56 PM   #10
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
Trích:
Nguyên văn bởi lion View Post
tìm hiểu cái này rùi , nhưng chưa có money đầu tư . ko biết Hà nội chỗ nào bán hả các bác , giá cả bao nhiêu ???
giá à? tớ vừa đưịơc báo giá SRF05 là 550k(gồ phí vận chuyển) --> chắc USD mới tăng ..!

thay đổi nội dung bởi: anh_gioi, 26-10-2008 lúc 09:15 PM.
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2008, 02:10 AM   #11
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Em nối mạch thế nào, gửi lên cho mọi người xem. Bỏ hết code phần LCD đi chỉ viết code cho phần SRF thôi.

Nối một con LED vào chân ECHO. Xuất xung 10us trên chân TRIGGER, xem thử xem con LED trên chân ECHO có nháy không. Nếu nháy thì nó vẫn còn sống.

Quan sát kỹ vì có thể con LED nháy một tí thôi. Nhớ để cảm biến ra khoảng trống để thời gian nháy của LED vào khoảng 30ms (xa nhất). Không cần điện trở nối tiếp LED. Nếu có OSC thì cắm vào chân ECHO đo thử, nếu không có thì mang lên RP test thử.

Trường hợp em nối sai MODE, không đặt ngõ vào và ngõ ra đúng rất nguy hiểm, vì lúc đó cả 2 con PIC đều đặt là ngõ ra, mà một bên đặt mức cao, một bên đặt mức thấp, rất nguy hiểm. Có khả năng con PIC bị toi. Nếu may mắn là con PIC của em toi, còn xui xẻo thì con PIC trên SRF toi.

Con PIC trên SRF toi thì kể như xong phim. Tìm cái OSC để kiểm tra, hoặc mang tới RP để kiểm tra bằng OSC.

Tụi em làm thí nghiệm phải đọc kỹ tài liệu hướng dẫn, và phải làm rất cẩn thận, không thì lãng phí tiền bạc chỉ vì cái "thích vọc" của mình đấy.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2008, 08:12 PM   #12
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
Trích:
Nguyên văn bởi falleaf View Post
Em nối mạch thế nào, gửi lên cho mọi người xem. Bỏ hết code phần LCD đi chỉ viết code cho phần SRF thôi.

Nối một con LED vào chân ECHO. Xuất xung 10us trên chân TRIGGER, xem thử xem con LED trên chân ECHO có nháy không. Nếu nháy thì nó vẫn còn sống.

Quan sát kỹ vì có thể con LED nháy một tí thôi. Nhớ để cảm biến ra khoảng trống để thời gian nháy của LED vào khoảng 30ms (xa nhất). Không cần điện trở nối tiếp LED. Nếu có OSC thì cắm vào chân ECHO đo thử, nếu không có thì mang lên RP test thử.

Trường hợp em nối sai MODE, không đặt ngõ vào và ngõ ra đúng rất nguy hiểm, vì lúc đó cả 2 con PIC đều đặt là ngõ ra, mà một bên đặt mức cao, một bên đặt mức thấp, rất nguy hiểm. Có khả năng con PIC bị toi. Nếu may mắn là con PIC của em toi, còn xui xẻo thì con PIC trên SRF toi.

Con PIC trên SRF toi thì kể như xong phim. Tìm cái OSC để kiểm tra, hoặc mang tới RP để kiểm tra bằng OSC.

Tụi em làm thí nghiệm phải đọc kỹ tài liệu hướng dẫn, và phải làm rất cẩn thận, không thì lãng phí tiền bạc chỉ vì cái "thích vọc" của mình đấy.

Chúc vui.
ôi, cám ơn anh đã chỉ bảo em kiểm tra. em kiểm tra xong rùi, kết quả là SRF05 ko toi, kiểm tra chân PIC cũng ko sao? lạ ghê.. nhưng em thấy nó không sao là em vui lắm rồi. em nạp cho nó đoạn code này ạ, mong anh xem qua giúp em:
Trích:
#include "F:\NCKH 2009\PIC 16\capture---\cpture----.h"
#bit TMR1IF = 0x0C.0
#include <F:\NCKH 2009\PIC 16\count_timer2\LCD_lib_4bit.c>
int8 tram,chuc,donvi;
int8 count;
int16 CCP1Value; // Gia tri CCP hien tai
int16 CCP1OldValue; // Gia tri CCP truoc do
BOOLEAN CCP1Captured;

void Init_ccp(void)
{
setup_ccp1(CCP_CAPTURE_RE);;
setup_timer_1(T1_INTERNAL); // Start timer 1
CCP1Value = 0;
CCP1OldValue = 0;
CCP1Captured = TRUE;
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
}

#int_CCP1
void CCP1_isr()
{

if(TMR1IF)
{
CCP1Value = CCP_1 +(65535-CCP1OldValue);
CCP1OldValue = CCP_1;
TMR1IF=0;

}
else
{
CCP1Value = CCP_1 - CCP1OldValue;
CCP1OldValue = CCP_1;
}
CCP1Captured = TRUE;

}

void convert_bcd(int8 x)
{

donvi=(((x%1000)%100)%10) + 0x30; //chia lay phan du, so hang don vi
tram=((x%1000)/100) + 0x30; //tach hang tram va hang chuc
chuc=((x%1000)%100)/10 + 0x30;
///// hien thi len gia tri LCD//////
LCD_putcmd(0xC5);
LCD_putchar(tram);
LCD_putcmd(0xc6);
LCD_putchar(chuc);
LCD_putcmd(0xC7);
LCD_putchar(donvi);
}

void main()
{
Init_ccp();
LCD_init();
CCP1_isr();
//---hien thi LCD---
LCD_putcmd(0x85);
LCD_putchar("anh_gioi");

while(1)
{
output_high(pin_d0);
delay_us(10);
output_low(pin_d0);

count = CCP1Value;
convert_bcd(count);
delay_ms(100);
}
}
thì trên LCD của em báo con số từ 230-245 ạ.
khi em di chuyển đầu SRF ra xa hơn(hay gần đi ) thì chỉ số vẫn không thay đổi, không biết em sai chỗ nào ạ?(em dò trên 1 mặt phẳng)
thứ hai: em dùng thạch anh 20MHZ với timer1 (setup_timer_1(T1_INTERNAL); ) thì tính thời gian thế nào ạ? em thấy 1 số đoạn code tính khác nhau nên em chưa hỉu lắm?
Hình Kèm Theo
File Type: jpg capture.JPG (80.4 KB, 72 lần tải)
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2008, 08:18 PM   #13
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Dạo này anh rất bận, nên không thể giúp em xem code. Hy vọng rằng các bạn thành viên có thể giúp em về vấn đề coding.

Ý tưởng chỉ đơn giản như vậy. Trước mắt em nên đọc 8 bit, sau đó cho xuất ra LED để xem giá trị thay đổi khi em di chuyển xa và gần.

Cảm biến siêu âm có một điều cần quan tâm, đó là bước sóng của nó, sau khi em tính ra, em sẽ thấy bước sóng của nó bằng bao nhiêu đó.

Em so với chiều dày của tường, nếu bề dày của mặt phản xạ nhỏ hơn chiều dài bước sóng, thì có khả năng bị mất phản xạ. Tính thử đi thì sẽ hiểu hơn về sóng siêu âm, chứ nếu không cứ thấy đo được là được thì ....

Đọc tài liệu về cảm biến siêu âm mà anh đã up lên mạng. Tài liệu đó tóm tắt khá nhiều thứ về siêu âm đấy.

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-10-2008, 08:31 PM   #14
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
CCP1_isr();

Tại sao trong main lại chạy interrupt nhỉ?

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-11-2008, 10:23 PM   #15
anh_gioi
Đệ tử 6 túi
 
Tham gia ngày: Oct 2006
Bài gửi: 147
:
Trích:
Nguyên văn bởi falleaf View Post
Dạo này anh rất bận, nên không thể giúp em xem code. Hy vọng rằng các bạn thành viên có thể giúp em về vấn đề coding.

Ý tưởng chỉ đơn giản như vậy. Trước mắt em nên đọc 8 bit, sau đó cho xuất ra LED để xem giá trị thay đổi khi em di chuyển xa và gần.

Cảm biến siêu âm có một điều cần quan tâm, đó là bước sóng của nó, sau khi em tính ra, em sẽ thấy bước sóng của nó bằng bao nhiêu đó.

Em so với chiều dày của tường, nếu bề dày của mặt phản xạ nhỏ hơn chiều dài bước sóng, thì có khả năng bị mất phản xạ. Tính thử đi thì sẽ hiểu hơn về sóng siêu âm, chứ nếu không cứ thấy đo được là được thì ....

Đọc tài liệu về cảm biến siêu âm mà anh đã up lên mạng. Tài liệu đó tóm tắt khá nhiều thứ về siêu âm đấy.

Chúc vui
bây giờ nếu xuất ra LED thì em phải dùng 1 chân điều xung ạ?
vì chân điều xung chỉ có thể thay đổi được giá trị thôi ạ.khi có tín hiệu ra, ta sẽ cho qua chân điều xung để xuất ra LED.
anh_gioi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 07:40 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam