PDA

View Full Version : Cảm biến siêu âm


falleaf
27-06-2005, 10:33 AM
Xử lý hiện tượng đọc chéo của siêu âm, toàn bộ kết quả được thực hiện dựa trên phương pháp của Borenstein và sử dụng cảm biến Polaroid 6500

Các bạn download tại đây (http://picvietnam.com/download/Crosstalk.pdf)

xuanhau
26-10-2005, 10:06 AM
Tôi tính làm một dụng cụ đo vận tốc khí, lưu lượng khí bằng siêu âm. Nhưng ko biết dùng loại cảm biến nào và mua ở đâu? Xin các bạn cho lời khuyên. cám ơn nhiều

mickey_technologies
14-11-2005, 08:13 AM
Tôi đang làm tiểu luận tìm hiểu nguyên lí và ứng dụng cảm biến laser và siêu âm mà chưa biết tham khảo tài liêu ở đâu,mong anh em chỉ giúp!!!

falleaf
14-11-2005, 10:34 AM
Cảm biến laser thì tôi chưa dùng, nhưng cảm biến siêu âm thì bạn cứ đặt câu hỏi, nếu trong phạm vi hiểu biết tôi sẽ giúp.

Chúc vui.

chuabietgi
09-12-2005, 09:15 AM
Thanks!May cai nay rat hay!

solo123
17-03-2006, 10:26 PM
chào các anh, em muốn làm một bộ cảm biến âm thanh để dò đường cho robot, các anh có thể cung cấp sơ đồ cho em ko ạ, nếu được cám ơn mấy anh nhiều lắm, hiện tại em đang dùng pic 16F84, em mới làm quen với nó thôi

falleaf
19-03-2006, 06:35 PM
Bạn cần có cái cảm biến siêu âm đó, và bạn phải nói nó nó là hãng nào, và loại nào. Như vậy thì mới có thể giúp bạn được.

Loại siêu âm thông dụng tại VN hiện này là SRF0x, bởi vì nó của Singapore sản xuất, cho nên dễ nhập về VN. Loại này đường điều khiển dòng thấp. Còn với Polaroid như tôi dùng thì dòng kích lên tới 2A, sẽ hơi phiền cho bạn nếu dùng nhiều siêu âm.

Chúc vui.

aichacha_fighting
27-05-2006, 11:52 PM
Anh falleaf cho em hoi muon mua cam bien do o dau vay?Va` em co the dung cam bien do' gan len robo de tranh vat can dc ko ah.

falleaf
28-05-2006, 01:10 PM
Được,

Em có thể mua ở nhiều nơi khác nhau, em muốn mua chính xác loại nào?
Em phải tìm hiểu sơ về siêu âm cái đã, để hiểu đặc tính siêu âm, hoạt động của siêu âm

solo123
18-06-2006, 05:13 PM
PIC bang chủ ơi, em muốn hỏi là mua mấy cái bộ cảm biến siêu âm ở đâu vậy? em đang cần loại đơn giản thôi, với lại cho em hỏi luôn nơi nào bán các loại động cơ bước vậy? loại bự hơn mấy cái động cơ DC một chút, và một mạch nạp cho con PIC loại 16F84 và 16F84A nhờ anh chỉ giùm em, em ở HCM, cám ơn anh nhiều lắm

falleaf
18-06-2006, 07:12 PM
Hiện nay có một em sinh viên PFIEV đang thực hiện đề tài làm siêu âm, em có thể liên hệ với em này qua nick polaris2511bk để hỏi mua lại đầu cảm biến nếu cần.

Còn nếu em muốn mua cả bộ cảm biến, bao gồm transducer và mạch điều khiển, ở đây có một số trang để em tham khảo

http://www.picvietnam.com/forum/showthread.php?t=476

Ngay trong box Cảm biến này mà, nhớ đọc kỹ các bài chú ý, vì các bài chú ý anh phải chọn lọc rất kỹ, và thường xuyên sửa chữa, xoá bài, để đảm báo tính chất cô đọng của nó.

Chúc vui

polaris2511bk
28-06-2006, 01:08 AM
Bây h em trình bày lại toàn bộ ý kiến của em... anh xem rồi góp ý cho em với....
Mục đích của em là làm một thiết bị để dò đường, nói đúng hơn là phát hiện vật cản.
Nguyên tắc: dựa trên sự phát và thu sóng siêu âm phản hồi, thời gian sóng truyền đi và nhận lại/2 x vận tốc sóng trong không khí = khoảng cách từ đầu dò đến vật cản.
Bây giờ em muốn làm dạng 2 kênh: hoặc 2 con fat và 2 con thu, hoặc 2 con fat và 1 con thu.
Gọi con fat la T, con thu là R
Vấn đề :
1/ 2 con fat T dc đặt với nhau như thế nào? R đc đặt ở vị trí nào ạ?
2/ làm cách nào để R nhận ra dc tín hiệu quay trở về nào là tín hiệu của T1 hay T2???
Theo em nghĩ có các trường hợp sau xảy ra:
a)nếu fat lần lượt T1 trước, tín hiệu fan hồi trở về của T1 đc nhận thì T2 mới dc fat, nhu vay thoi gian là qua nhiều, xử lý chậm...=> ko dat dc yeu cau
b)nếu phát T1, sau đó phat tiep T2, tín hiệu quay về sẽ có 2 trường hợp:
*)nếu d1>d2( d= khoảng cách từ đầu fat đến vật cản) thì tín hiệu fan hồi của T2 sẽ về trc, hoặc cùng lúc với T1=> cross talk?, nếu R chỉ làm nhiệm vụ thu, việc phân biệt các tín hiệu thu về là của vi xử lý thì vi xử lý có phân biệt được không ạ?
*) d1<= d2, fan hồi của T1 đến trc T2, tín hiệu sẽ đươc xử lý lần lượt=> xử lý chậm...
c) nếu fat T1 và T2 cùng lúc, tín hiệu quay về cùng lúc, tin hiệu quay về trc sau...cũng sẽ xử lý và phân biệt như thế nào ạ?
3/ khi thu đc tín hiệu fan hồi là tín hiệu dạng xung, bằng tính toán, ta tính dc khoảng cách đến vật cản=> đưa vào vi xử lý thì có cách nào để xuất khoảng cách đó ra bằng tiếng nói ko?dung loại vi xử lý nào? Dùng pic đc ko anh?
Đó là vân đề em đang suy nghĩ hiện nay...nếu mà dùng thuật toán thì đó là thuật toán nào ạ? Anh có thể hướng dẫn cho em đc ko ạ?
bây h em đang làm bài toán tính thời gian phát xung mà em không biết phải làm thế nào? Thời gian thế nào là hợp lý?...
Em cảm ơn anh ạ!

polaris2511bk
28-06-2006, 02:29 PM
1) Vấn đề xử lý hoàn toàn không đơn giản. Phần này xử lý crosstalk hoàn toàn là một bài toán khó, và không phải đơn giản như em nghĩ.

2) Vấn đề bố trí siêu âm, chỉ cần em bố trí hai siêu âm nằm gần nhau là được, giống như trường hợp mà cái hình anh đưa cho em, đặt con thu ở giữa, đặt 2 con phát ở bên ngoài, và nhớ rằng tạo thành một góc nghiên nhỏ.
__
/ \

Đặt 3 con như thế này, nhưng mà góc nghiêng nhỏ thôi, vì trong này anh không thể vẽ được cái góc nhỏ hơn. Nghĩa là hai cạnh bên của nó trong trường hợp anh vẽ thế này nó là góc nhọn, nhưng em làm sao nó trở thành góc tù lớn. Nghĩa là gần như chỉ hơi xiên một chút xíu khoảng 15 độ so với mặt nằm ngang. Nghĩa là 3 con siêu âm TRT gần như đặt thẳng hàng. Nhưng TR nghiêng khoảng 7.5 độ, RT nghiêng khoảng 7.5 độ nữa.

Không phải chụm vào nhau, mà hướng ra bên ngoài. Nghĩa là như cái hình anh vẽ thì nó phát theo hướng từ dưới lên trên.

3) Dùng PIC có thể làm việc với siêu âm vô tư, vì tốc độ siêu âm chậm, khoảng 40KHz - 50KHz, PIC làm việc tốt.

4) Thuật toán để đọc siêu âm, em phải đọc thêm phần crosstalk. Crosstalk chính là để đọc làm sao cho nó nhanh, chứ nếu phát từng con rồi đọc từng con, thì cần crosstalk để làm gì. Đọc hiểu cái đó đã rồi hỏi tiếp.
Thế nhé.

DOAN Hiep

techpro
09-09-2006, 12:22 PM
Tôi đang làm tiểu luận tìm hiểu nguyên lí và ứng dụng cảm biến laser và siêu âm mà chưa biết tham khảo tài liêu ở đâu,mong anh em chỉ giúp!!!
Bạn hãy liên hệ với tôi. Bên tôi cung cấp sensor laser của hãng Sick-Optex Japan. Nếu cần tài liệu tôi sẽ cung cấp cho bạn. Hãy liên hệ qua E-mail: techamaco@yahoo.com.vn, DĐ: 09.83.84.85.45

techpro
09-09-2006, 12:29 PM
Anh falleaf cho em hoi muon mua cam bien do o dau vay?Va` em co the dung cam bien do' gan len robo de tranh vat can dc ko ah.

Bạn có thể dùng Photosensor VD-300T của hãng Optex. Đây là thiết bị tích hợp sẵn cả đầu phát và đầu thu. VD-300T phát hiện được vật thể trong khoảng cách 3 mét. Đầu ra relay cho phép chỉnh On-delay, Off-delay để phát hiện vật thể có kích thước nhỏ và chống nhiễu.

bacbaphi
11-10-2006, 05:50 PM
vay co ai biet may cai cam bien sieu am ban' o dau khong?

polaris2511bk
12-10-2006, 06:32 AM
đặt ở nước ngoài theo kiểu đặt hàng trên mạng( cái này thì đắt, áp dụng chủ yếu với loại SRFxx), nếu ở TP HCM, thử qua cửa hàng Tương lai trên 3/2( ngay góc Su van hanh nối dài- 3/2) xem người ta đã nhận về để bán chưa.
Chúc vui.

fluidmech
29-01-2007, 09:22 AM
Minh co 4 loai SRF04, SRF08, SRF10, SRF235 cua Devantech, ban nao thich thi lien lac voi minh: fluidmech1@yahoo.com
So qua ve 4 loai sensor nay:

SRF04: thong dung, tan so 40kHz, tam xa 3m, mua online gia 24,5USD chua ke ship ( minh ban gia 400k/c)

SRF08: cuc manh, tan so 40kHz, tam xa 6m, online gia 54USD chua ke ship ( minh ban gia 800k/c)

SRF10: sieu nho, tan so 40kHz, tam xa 3m, online gia 56USD chua ke ship (minh ban gia 820k/c)

SRF235: xin nhat cua devantech, tan so 235kHz, rat it nhieu, goc quet cuc nho 15 do, tam xa 3m, online gia 140USD chua ke ship ( minh ban gia 1 trieu 700k/c)
Gia da bao gom chi phi van chuyen.
Minh co loai da dung roi, van con tot, ban nao muon mua thi minh de gia re cho.
P/S: cac bac thong cam, khong hieu sao em khong go duoc tieng Viet.

namqn: diễn đàn đang đặt trên server tạm, một số client không load được bộ gõ tiếng Việt (máy của tôi cũng bị vậy), bạn nào không dùng được bộ gõ của diễn đàn thì hãy dùng bộ gõ ngoài (Unikey chẳng hạn).

khangcodt
27-03-2007, 08:56 AM
Bác F cho em hỏi cái cảm biến siêu âm nó truyền được khoảng cách tối đa là bao nhiêu mét vậy? Có đến cỡ 100m hoặc hơn ko. (ý em là nếu tăng thời gian phát lên tối đa có thể, tất nhiên là ko thể lớn cỡ hàng giờ...hì hì)
Em đang có ý định làm mạch với CB siêu âm để đo khoảng cách, thu và phát trên cùng bo mạch, 1 thu 1 phát chắc ko có nhiễu (ko rõ vì chưa làm với siêu âm bao giờ).

falleaf
27-03-2007, 02:01 PM
Không thể được, mỗi loại đầu dò có công suất phát khác nhau, có những loại lên tới cả trăm mét, nhưng những loại đó cực đắt là một, nếu mà làm lên tới cả trăm mét, thì người ta dùng sang cảm biến laser.

Cảm biến hồng ngoại hoạt động trong vòng cm, cảm biến siêu âm hoạt động trong vòng chục cm tới chục mét, cảm biến laser hoạt động từ chục mét tới km,... Phải sử dụng đúng mục đích và nguyên lý của nó.

Chúc vui

falleaf
03-04-2007, 05:55 PM
Tài liệu sơ lược về cảm biến siêu âm.

viettronics
06-04-2007, 04:22 PM
Chào các bác
Em mới được giao bài tập lớn là chế tạo một thiết bị đo sử dụng siêu âm với khoảng đo từ 3m đến 15m.
Bác nào biết có thể chỉ cho em biết em có thể sử dụng con cảm biến nào phù hợp. Các bác post cả tài liệu nếu có nhé!
Best regards!

falleaf
06-04-2007, 04:40 PM
Đo từ 3 đến 12m thì có của Devantech. Nhưng còn tới 15m thì chịu. Cần phải mua của Polaroid thôi. Loại này rất đắt tiền.

Xem thông tin tại: www.vieltek.com

Chúc vui.

scentoflove
02-08-2007, 05:04 PM
Anh F trong tài liệu Ultrasonic Sensors của anh có nêu công thức tính góc đặt cảm biến. Arc(d) và Len(teta) là gì vậy a. Góc teta đó là góc xác định tại vật thì góc đặt cảm biến là bao nhiêu. Em đọc ko rõ lắm anh giải thích thêm

scentoflove
11-09-2007, 12:37 AM
Em đang xài SRF 10 của devantech, con này giao tiếp I2C đọc kết quả nên phải đọc lần lượt từng con. Hiện em đang gắn cảm biến vào mobile robot để dò vật cản. Kíck thước mobile robot 30x40cm. Mọi người có thể chỉ em cách gắn sonar hiệu quả.

falleaf
11-09-2007, 03:52 AM
Tuỳ theo thuật toán mà bạn sử dụng là thuật toán gì. Bạn hoàn toàn có thể đọc siêu âm liên tục nếu bạn xử lý tốt hiện tượng crosstalk.

Góc đặt cảm biến sao cho búp hướng của cảm biến ở tại điểm giao nhau thường gặp (tức là ở mức đo của bạn) là khoảng 10%, thì bạn sẽ xác định được rõ vật nhất. Vì khi đó nếu xác định được một vật, thì bạn gần như xác định được vật nằm trên 1/10 của cung tròn (có dải sai số lặp).

Trong slide của F có phân tích việc góc đặt hai cảm biến siêu âm, thế nào là tốt, thế nào là không tốt. (góc theta1 và góc theta2 - Bố trí cảm biến)

Như vậy, rõ ràng việc bố trí cảm biến phụ thuộc vào búp hướng của cảm biến. Từ búp hướng sẽ tính ra được góc đặt phù hợp.

Chúc vui

scentoflove
11-09-2007, 08:08 AM
Trong Slide của anh F có nói tới arc(d)/len(tetha)<1/10 đièu này có ý nghĩa gì. Giã sư
Với búp hướng của polaroid như slide anh F đưa thì sóng sonar sẽ là 1 cung từ -15độ - 15độ. Từ đó ta tính ra góc tetha. Ko biết em nói vậy có đúng ko

falleaf
11-09-2007, 12:02 PM
Arc(d) chính là độ dài cung tròn ở khoảng cách d. Mà khoảng cách d ở đây là gì? Là một khoảng cách bất kỳ mà bạn có thể đo được sự tồn tại của vật.

Độ dày 10cm ở đây chính là khoảng sai số lặp mà bạn không thể biết được của siêu âm. Theta ở đây là gõc giữa hai cảm biến khi cảm biến nhận ra chướng ngại vật. Chúng ta mong muốn góc này càng lớn càng tốt. Vậy góc này nhỏ nhất khi nào?

Giả sử hai cung không chắc chắn của cảm biến giao nhau, thì chỗ nào là chỗ xảy ra diện tích giao nhau lớn nhất?

Bạn chỉ cần đảm bảo cái công thức cuối cùng của F ở mọi điểm mà vật có thể xuất hiện là coi như oki.

Chúc vui.

ntung
27-10-2007, 02:05 PM
em dabg muon dung con cam bien luu luong lam dau vao tin hieu cho PLC nhung em chua biet cach chuyen tin hieu tuong tu thanh so de .cac bac co th giup em ko ah

tranminhtung
05-12-2007, 05:00 PM
Em cũng đang phải chiến đấu với cả đống sensor có cả sensor siêu âm

picthanh
28-03-2008, 02:50 PM
em đang dùng SRF05 + PIC16F877A do khoảng cách nhưng công lực còn yếu quá mong các bác có công lực thâm hậu chỉ em với .
về phần cứng cụ thể như sau : con srf05 có hai chế độ hoạt động đó là :
-MOde1 : kết nối 2 chân trigger và echo vào 2 chân i/o của VDK
-Mode2 : sử dụng chân của VDK để gửi tín hiệu trigger và nhận tín hiệu echo từ con srf05
em sư dụng chế độ Mode 2.kết nối chân RB0 với chân trigger/echo của con srf05. trên con srf05 chân mode nối với GND (0v).

em dùng timer 1 để đếm độ rộng xung echo do con srf05 gởi phản hồi.
sau đó lấy độ rộng xung/ 72 để đổi khoang cách tính toán ra đơn vị cm.
đây là code của em , các bác xem qua chỉ em giúp em chỗ nào ko ổn.

#include "D:\PIC PROGRAM\16F877A\SRF05\main.h"
#include <LCD.C>

#define TrgEch RB0
#define TrgDir TRISB0


unsigned int value=0;

int get_srf05(void);
void outlcd(unsigned int kcach);
void setup(void);

/*
#int_EXT
void EXT_isr(void)
{

}

*/

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
setup();
// enable_interrupts(INT_EXT);
// enable_interrupts(GLOBAL);

while (1)
{

value=get_srf05();
// printf("\n\rvalue= %u",value);

outlcd(value);
TMR1H = 0; // 52mS delay - this is so that the srf05 ranging is not too rapid
TMR1L = 0; // and the previous pulse has faded away before we start the next one
T1CON = 0x21; // 1:4 prescale and running
TMR1IF = 0;
while(!TMR1IF); // wait for delay time
TMR1ON = 0; // stop timer
}

}

unsigned int get_srf05(void)
{
TMR1H = 0xff; // prepare timer for 10uS pulse
TMR1L = -14;
T1CON = 0x21; // 1:4 prescale and running
TMR1IF = 0;
TrgDir = 0; //TRISB=0 // make trigger/echo pin an output
TrgEch = 1; //RB0=1 // start trigger pulse
while(!TMR1IF); // wait 10uS
TrgEch = 0; //RB0=0; // end trigger pulse
TMR1ON = 0; // stop timer
TrgDir = 1; //TRISB=0; // make trigger/echo pin an input

TMR1H = 0; // prepare timer to measure echo pulse
TMR1L = 0;
T1CON = 0x20; // 1:4 prescale but not running yet
TMR1IF = 0;
while(!TrgEch && !TMR1IF); // wait for echo pulse to start (go high)
TMR1ON = 1; // start timer to measure pulse
while(TrgEch && !TMR1IF); //Wait RB0=0 // wait for echo pulse to stop (go low)
TMR1ON = 0; // stop timer
TrgDir = 0; //TRISB=0 // make trigger/echo pin an output again
return (TMR1H<<8)+TMR1L; // TMR1H:TMR1L contains flight time of the pulse in 0.8uS units
}

void outlcd(unsigned int kcach)
{
unsigned char tram=0,chuc=0,donvi=0;
unsigned int ra=0;
ra=kcach/72;
lcd_gotoxy(1,1);
tram=ra/100+48;lcd_putc(tram);
chuc=(ra%100/10)+48;lcd_putc(chuc);
donvi=(ra%100%10)+48;lcd_putc(donvi);
}

void setup(void)
{
unsigned long x;

PORTB = 0xfe; // RB0 (trig) is output
TRISB = 0xfe; // and starts low

TRISC = 0xff;
PORTC = 0xff;

SSPSTAT = 0x80;
SSPCON = 0x38;
SSPCON2 = 0x00;
SSPADD = 50; // SCL = 91khz with 20Mhz Osc

/// for(x=0; x<300000L; x++); // wait for LCD03 to initialise
}




đây là file main.h

#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)

// register definitions

#define W 0
#define F 1

// register files
#byte INDF =0x00
#byte TMR0 =0x01
#byte PCL =0x02
#byte STATUS =0x03
#byte FSR =0x04
#byte PORTA =0x05
#byte PORTB =0x06
#byte PORTC =0x07
#byte PORTD =0x08
#byte PORTE =0x09

#byte EEDATA =0x10C
#byte EEADR =0x10D
#byte EEDATH =0x10E
#byte EEADRH =0x10F
#byte ADCON0 =0x1F
#byte ADCON1 =0x9F
#byte ADRESH =0x9F
#byte ADSESL =0x9F

#byte PCLATH =0x0a
#byte INTCON =0x0b
#byte PIR1 =0x0c
#byte PIR2 =0x0d
#byte PIE1 =0x8c
#byte PIE2 =0x8d

#byte OPTION_REG =0x81
#byte TRISA =0x85
#byte TRISB =0x86
#byte TRISC =0x87
#byte TRISD =0x88
#byte TRISE =0x89

#byte EECON1 =0x18C
#byte EECON2 =0x18D

//dinh nghia timer

#byte TMR1H =0x0F
#byte TMR1L =0x0E
#byte T1CON =0x10
#byte SSPSTAT =0x94
#byte SSPCON =0x14
#byte SSPCON2 =0x91
#byte SSPADD =0x93
//dinh nghia bit

#bit TMR1IF = 0x0c.0
#bit TRISB0 = 0x86.0
#bit RB0 = 0x06.0
#bit TMR1ON = 0x10.0

em gặp fai vấn đề sau :
lcd của em em chỉ hiện giá trị 000-003, và nó dao động liên tục trong khoảng này. em cũng chưa thật hiểu cách làm việc của cảm biến siêu âm lắm,mong các bác tư vấn thêm.
bác nào giúp em với .........

jean
31-03-2008, 03:43 PM
Trong giải thuật hạn chế nhiễu do hiện tượng đọc chéo của Borenstein, khi sai lệch giữa hai giá trị đọc liện tiếp trên cảm biến y (cảm biến thu tín hiệu echo do một cảm biến khác phát ra) lớn hơn T_delta thì chắc chắn đã xảy ra hiện tượng crosstalk. Tuy nhiên có một vấn đề mong các bạn trao đổi để làm sáng tỏ.

Khi sai lệch giữa hai giá trị đọc liên tiếp lớn hơn T_delta thì có crosstalk, vậy thì ta loại giá trị nào? giá trị trước hay sau? Nếu như loại giá trị sau, thì chuyện gì sẽ xảy ra khi ngay từ lần đọc đầu tiên cảm biến y đã thu được tín hiệu echo sai (do crosstalk), trong quá trình thí nghệm, vị trí các cảm biến không đổi (tức là đường đọc chéo không thay đổi). Do đó, cảm biến y sẽ liên tục nhận được tìn hiệu echo sai.(Các bạn xem hình đính kèm) Theo giải thuật này thì các giá trị đọc sau sẽ bị loại. Cảm biến y sẽ không nhận được tín hiệu echo do chính y phát ra.

falleaf
31-03-2008, 08:43 PM
Trong giải thuật hạn chế nhiễu do hiện tượng đọc chéo của Borenstein, khi sai lệch giữa hai giá trị đọc liện tiếp trên cảm biến y (cảm biến thu tín hiệu echo do một cảm biến khác phát ra) lớn hơn T_delta thì chắc chắn đã xảy ra hiện tượng crosstalk. Tuy nhiên có một vấn đề mong các bạn trao đổi để làm sáng tỏ.

Khi sai lệch giữa hai giá trị đọc liên tiếp lớn hơn T_delta thì có crosstalk, vậy thì ta loại giá trị nào? giá trị trước hay sau? Nếu như loại giá trị sau, thì chuyện gì sẽ xảy ra khi ngay từ lần đọc đầu tiên cảm biến y đã thu được tín hiệu echo sai (do crosstalk), trong quá trình thí nghệm, vị trí các cảm biến không đổi (tức là đường đọc chéo không thay đổi). Do đó, cảm biến y sẽ liên tục nhận được tìn hiệu echo sai.(Các bạn xem hình đính kèm) Theo giải thuật này thì các giá trị đọc sau sẽ bị loại. Cảm biến y sẽ không nhận được tín hiệu echo do chính y phát ra.

Tại lần đọc thứ n+1 sẽ lấy kết quả tại lần đọc thứ n để tính. Như vậy nếu xảy ra hiện tượng đọc chéo, thì loại ngay kết quả đọc thứ n. Kết quả đọc của lần đọc thứ n+1 sẽ được lấy để tính tiếp cho lần đọc thứ n+2.

Như vậy rõ ràng, không nhận kết quả nào cả. Chỉ khi nào kết quả n và n+1 khẳng định là đúng thì lúc đó ta mới khẳng định rằng n là đúng, rồi lại lấy n+1 tính tiếp cho n+2...

Cái này hiểu nó rất là vui đấy. Nếu các bạn làm xong kết quả thực nghiệm, các bạn có thể cung cấp lên cho mọi người cùng xem. Cần phải có nhiều kết quả tham khảo hơn, chứ mấy năm nay rồi F nghe nói các đồng chí làm lại vẫn chưa làm thành công.

Chúc vui

anh_gioi
25-08-2008, 02:16 PM
mọi người ơi.
cho tớ hỏi cái mạch cảm biến này với???
cho tớ hỏi mạch này nguyên lý hoạt động của nó ?
to thay 2 con tran trên bằng A1015 và C1815 thì thấy 2 con tran này nóng lắm.
thứ hai là: khi lắp xong ,tín hiệu đầu ra luôn ở mức cao(7v) mặc dù tớ đã cách li phần thu và phát và tinh chỉnh triết áp.????
thanks very much !!!

lion
27-08-2008, 09:48 AM
2 con tran T1 & T2 mắc theo kiểu đẩy kéo dùng nguồn ko đối xứng . Sơ đồ trên dùng loa thanh áp nên ko cần tụ xuất loa, nếu dùng loa điện động thì khi mắc vơi loa thì phải có thêm tụ ngăn dòng 1 chiều qua loa

lion
27-08-2008, 09:55 AM
do tần số siêu âm cao nên dùng tụ 103 PF

anh_gioi
31-08-2008, 09:03 PM
do tần số siêu âm cao nên dùng tụ 103 PF

cám ơn cậu.
nhưng đấy là phần bên phát, nhưng khi chưa có phần phát thì phần thu ở đầu ra luôn luôn có 1 điện áp cố định??
ko hiểu tại sao???
bạn làm về siêu âm bạn có thể cho tơ ít tài liệu được ko? to đang làm cái này....
thanks!!

lion
31-08-2008, 11:31 PM
Tầng cuối cùng of mạch thu siêu âm (N3) là mạch so sánh đảo pha .ở chế độ tĩnh (chưa có tín hiệu siêu âm ) thì đầu vào âm được nối Dương nguồn qua trở R11 (4.7M) . vì vậy đầu ra có điện áp Dương , muốn triệt điện áp này bạn chi cần hạ con trở R12 (390K) xuống còn 39K , hoặc nhỏ hơn , điều chỉnh thêm cả chiết áp VR2 nữa

chúc thành công.

anh_gioi
02-09-2008, 04:42 PM
tớ hỏi câu hơi gà chút(nhưng không hỏi thì chẳng biết khi nào hiểu được)..
1.mọi người có thể chỉ bảo tớ giải thuật cách xử lý sóng siêu âm với phần điều khiển được không??? khi có sóng siêu âm vào chân điều khiển thì phần điều khiển nó sẽ xử lý thế nào để nhận biết được khoảng cách?
2. tín hiệu ra của bộ siêu âm chỉ có 2 mức 0 và 1 à?

lion
02-09-2008, 05:17 PM
tài liệu siêu âm :

anh_gioi
25-09-2008, 06:50 PM
Các bác cho em hỏi :

#define SRF05_IN PIN_C2
#define SRF05_OUT PIN_C3

// Clockrate/(4 clocks per instruction * T1_DIV_BY_4) * 1000000 us per second
#define CONVERT_TO_MICROSECONDS (20000000/((4*4)*1000000))

//
// The way the srf05 works is that we send it a 10 us high pulse it then sends
// out does it's mojo. Then it reports back a high pulse telling you how long
// the ultrasonic echo took. Divide that by a magic 148 and you convert that
// time into inches.
//

int16 ultrasonic_checkDepth()
{
int16 time;

output_high(SRF05_IN);
delay_us(10);
output_low(SRF05_IN);

setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);

while(!input(SRF05_OUT)) {} // Wait for senser output to go high;

set_timer1(0);
while(input(SRF05_OUT)) {}

time = get_timer1();

time = time/CONVERT_TO_MICROSECONDS;

if(time >= 240000)
{
// No object found
return 0;
}
else
{
return time/148; // convert time into inches
}
}


nghĩa là khi ban đầu tắt time để dò tìm vật cản, sau khi xác định được vật cản thì bật timer . có phải không ạ??

thứ 2 em hỏi LCD03 là LCD1602 à? hay nó là loại nào???

anh_gioi
26-09-2008, 04:47 PM
em đang dùng SRF05 + PIC16F877A do khoảng cách nhưng công lực còn yếu quá mong các bác có công lực thâm hậu chỉ em với .
về phần cứng cụ thể như sau : con srf05 có hai chế độ hoạt động đó là :
-MOde1 : kết nối 2 chân trigger và echo vào 2 chân i/o của VDK
-Mode2 : sử dụng chân của VDK để gửi tín hiệu trigger và nhận tín hiệu echo từ con srf05
em sư dụng chế độ Mode 2.kết nối chân RB0 với chân trigger/echo của con srf05. trên con srf05 chân mode nối với GND (0v).

em dùng timer 1 để đếm độ rộng xung echo do con srf05 gởi phản hồi.
sau đó lấy độ rộng xung/ 72 để đổi khoang cách tính toán ra đơn vị cm.
đây là code của em , các bác xem qua chỉ em giúp em chỗ nào ko ổn.

#include "D:\PIC PROGRAM\16F877A\SRF05\main.h"
#include <LCD.C>

#define TrgEch RB0
#define TrgDir TRISB0


unsigned int value=0;

int get_srf05(void);
void outlcd(unsigned int kcach);
void setup(void);

/*
#int_EXT
void EXT_isr(void)
{

}

*/

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
setup();
// enable_interrupts(INT_EXT);
// enable_interrupts(GLOBAL);

while (1)
{

value=get_srf05();
// printf("\n\rvalue= %u",value);

outlcd(value);
TMR1H = 0; // 52mS delay - this is so that the srf05 ranging is not too rapid
TMR1L = 0; // and the previous pulse has faded away before we start the next one
T1CON = 0x21; // 1:4 prescale and running
TMR1IF = 0;
while(!TMR1IF); // wait for delay time
TMR1ON = 0; // stop timer
}

}

unsigned int get_srf05(void)
{
TMR1H = 0xff; // prepare timer for 10uS pulse
TMR1L = -14;
T1CON = 0x21; // 1:4 prescale and running
TMR1IF = 0;
TrgDir = 0; //TRISB=0 // make trigger/echo pin an output
TrgEch = 1; //RB0=1 // start trigger pulse
while(!TMR1IF); // wait 10uS
TrgEch = 0; //RB0=0; // end trigger pulse
TMR1ON = 0; // stop timer
TrgDir = 1; //TRISB=0; // make trigger/echo pin an input

TMR1H = 0; // prepare timer to measure echo pulse
TMR1L = 0;
T1CON = 0x20; // 1:4 prescale but not running yet
TMR1IF = 0;
while(!TrgEch && !TMR1IF); // wait for echo pulse to start (go high)
TMR1ON = 1; // start timer to measure pulse
while(TrgEch && !TMR1IF); //Wait RB0=0 // wait for echo pulse to stop (go low)
TMR1ON = 0; // stop timer
TrgDir = 0; //TRISB=0 // make trigger/echo pin an output again
return (TMR1H<<8)+TMR1L; // TMR1H:TMR1L contains flight time of the pulse in 0.8uS units
}

void outlcd(unsigned int kcach)
{
unsigned char tram=0,chuc=0,donvi=0;
unsigned int ra=0;
ra=kcach/72;
lcd_gotoxy(1,1);
tram=ra/100+48;lcd_putc(tram);
chuc=(ra%100/10)+48;lcd_putc(chuc);
donvi=(ra%100%10)+48;lcd_putc(donvi);
}

void setup(void)
{
unsigned long x;

PORTB = 0xfe; // RB0 (trig) is output
TRISB = 0xfe; // and starts low

TRISC = 0xff;
PORTC = 0xff;

SSPSTAT = 0x80;
SSPCON = 0x38;
SSPCON2 = 0x00;
SSPADD = 50; // SCL = 91khz with 20Mhz Osc

/// for(x=0; x<300000L; x++); // wait for LCD03 to initialise
}




đây là file main.h

#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)

// register definitions

#define W 0
#define F 1

// register files
#byte INDF =0x00
#byte TMR0 =0x01
#byte PCL =0x02
#byte STATUS =0x03
#byte FSR =0x04
#byte PORTA =0x05
#byte PORTB =0x06
#byte PORTC =0x07
#byte PORTD =0x08
#byte PORTE =0x09

#byte EEDATA =0x10C
#byte EEADR =0x10D
#byte EEDATH =0x10E
#byte EEADRH =0x10F
#byte ADCON0 =0x1F
#byte ADCON1 =0x9F
#byte ADRESH =0x9F
#byte ADSESL =0x9F

#byte PCLATH =0x0a
#byte INTCON =0x0b
#byte PIR1 =0x0c
#byte PIR2 =0x0d
#byte PIE1 =0x8c
#byte PIE2 =0x8d

#byte OPTION_REG =0x81
#byte TRISA =0x85
#byte TRISB =0x86
#byte TRISC =0x87
#byte TRISD =0x88
#byte TRISE =0x89

#byte EECON1 =0x18C
#byte EECON2 =0x18D

//dinh nghia timer

#byte TMR1H =0x0F
#byte TMR1L =0x0E
#byte T1CON =0x10
#byte SSPSTAT =0x94
#byte SSPCON =0x14
#byte SSPCON2 =0x91
#byte SSPADD =0x93
//dinh nghia bit

#bit TMR1IF = 0x0c.0
#bit TRISB0 = 0x86.0
#bit RB0 = 0x06.0
#bit TMR1ON = 0x10.0

em gặp fai vấn đề sau :
lcd của em em chỉ hiện giá trị 000-003, và nó dao động liên tục trong khoảng này. em cũng chưa thật hiểu cách làm việc của cảm biến siêu âm lắm,mong các bác tư vấn thêm.
bác nào giúp em với .........

bạn này ơi, bạn làm siêu âm này đến đâu rồi, cậu dùng ccs lập trình cho nó à? nếu được rồi chỉ tớ vơi, thank!

ngoductho
05-11-2008, 06:18 PM
e cần một số tài liệu về các loại cảm biến nhưng e kiếm ko được! mong mọi người cho e link dowload.e cảm ơn!

manhha2799
05-11-2008, 06:47 PM
Đây là code cảm biến siêu âm, lâu quá mình ko nhớ tải ở đâu bạn xem thử nhé, được thì bấm phát cảm ơn nhé

Nguyenbinhdk3
29-11-2008, 07:19 AM
các bạn có thể giúp mình cái này được ko?"mạch cảm biến vị trí sử dụng sóng siêu âm". Thầy cho cái đề mà mình chưa biết làm thế nào? Có bạn nào biết chỉ giáo giùm nha. Thanks nhiều!

tinhgiac_vp
19-12-2008, 11:43 PM
anh F trước đây làm về mobile robot hả? không biết anh có rành về automobile robot và bài toán tìm đường đi ngắn nhất cho nó không? nếu mục tiêu là cố định thì có vẻ dễ hơn, còn mục tiêu di động thì không biết sao? mong nhận được sự giúp đỡ của anh.

namnp2007
11-08-2009, 09:41 AM
Tôi muốn dùng cảm biến siêu âm để giữ một khoảng cách nhất định đén một vật thể. Cụ thể là cho đầu dò tiến đến gần vật thể( khoảng cách trong vòng < 50mm, có thể dùng dẫn động bằng khí nén), có nút chỉnh để coi đó là vị trí Zero, sau đó nếu vật thể di chuyển ra khỏi vị trí đó một khoảng nào đó( khoảng này cũng do ta qui định, có thể chỉ khoảng 0.1mm) thì bộ cảm biến thông qua bỏad mạch sẽ xuất tín hiệu điều khiển cho hệ khí nén, chiều chuyển động của khi nén sẽ tuỳ thuộc vào chiều của di chuyển của vật thể( khi vật thể ra xa thì khí nén đi vào, khi vật thể lại gần thì khí nén đi ra, chủ ý là để giữ khoảng cách "Zero" không đổi). Nhờ Mr. F hoặc anh em nào có cao kiến gì thì giúp đỡ giùm với, còn nếu nhận thực hiện luôn thì rất hoan nghênh. Liên lạc lại với tôi: Ngô Phương Nam, 098 388 1845 hoặc namnp2007@gmail.com. Cám ơn.

falleaf
11-08-2009, 10:55 AM
Tôi muốn dùng cảm biến siêu âm để giữ một khoảng cách nhất định đén một vật thể. Cụ thể là cho đầu dò tiến đến gần vật thể( khoảng cách trong vòng < 50mm, có thể dùng dẫn động bằng khí nén), có nút chỉnh để coi đó là vị trí Zero, sau đó nếu vật thể di chuyển ra khỏi vị trí đó một khoảng nào đó( khoảng này cũng do ta qui định, có thể chỉ khoảng 0.1mm) thì bộ cảm biến thông qua bỏad mạch sẽ xuất tín hiệu điều khiển cho hệ khí nén, chiều chuyển động của khi nén sẽ tuỳ thuộc vào chiều của di chuyển của vật thể( khi vật thể ra xa thì khí nén đi vào, khi vật thể lại gần thì khí nén đi ra, chủ ý là để giữ khoảng cách "Zero" không đổi). Nhờ Mr. F hoặc anh em nào có cao kiến gì thì giúp đỡ giùm với, còn nếu nhận thực hiện luôn thì rất hoan nghênh. Liên lạc lại với tôi: Ngô Phương Nam, 098 388 1845 hoặc namnp2007@gmail.com. Cám ơn.

Nếu làm việc ở khoảng cách <50mm, bạn cần sử dụng cảm biến hồng ngoại, cảm biến siêu âm làm việc ở khoảng cách này cho độ chính xác không được cao lắm.

Bạn có thể thử nghiệm cảm biến hồng ngoại GP2D12 của Sharp (R&P có bán) hoặc cảm biến siêu âm SRF05 (R&P có). Nhưng giải pháp bằng hồng ngoại với bài toán của bạn có vẻ tốt hơn (đỡ tốn năng lượng hơn, kích thước nhỏ gọn hơn, độ chính xác cao hơn vì nó hoạt động trong tầm 10cm - 80cm, so với khoảng cách hoạt động của siêu âm là 1cm - 4m).

Chúc vui

namnp2007
11-08-2009, 01:38 PM
@Mr. F.
Thanks, tôi sẽ liên lạc với đại lý RP tại TP HCM( ở Nguyễn Minh Hoàng phải không?).

falleaf
11-08-2009, 06:09 PM
@Mr. F.
Thanks, tôi sẽ liên lạc với đại lý RP tại TP HCM( ở Nguyễn Minh Hoàng phải không?).

Đã có trao đổi với anh, về vấn đề của anh đặt ra nếu ở mức dịch chuyển nhỏ hơn mm thì tốt nhất là sử dụng cảm biến laser, hoặc LVDT (tiếp xúc). Ngoại trừ hai loại này, thực sự là rất khó để xác định khoảng cách ở mức đó.

Cảm biến hồng ngoại hay cảm biến siêu âm thì khả năng đều thua trong vụ này.

Tham khảo thông tin về cảm biến hồng ngoại GP2D12 mà em giới thiệu tại đây:
http://document.sharpsma.com/files/GP2D12-DATA-SHEET.PDF

Khoảng cách đo từ 10cm - 80cm ứng với mức 2.6V - 0.4V. Coi như là một nửa dải đo. Nếu dùng ADC 10-bit, đo trên dải 0 - 5V. Xem như ta còn 9-bit trên nửa dải này.

9-bit tương ứng với 512 mức. Láy (80cm - 10cm)/512 mức = 700mm/512mức. Như vậy mỗi mức chỉ đo được hơn 1mm - 2mm. Như vậy không thể nào đạt được mức anh yêu cầu.

Nếu sử dụng ADC 12-bit thì có thể đo được với 11-bit, có khả năng lấy được khoảng 0.5mm (đây là tính toán giả định bằng sơ bộ trung bình, lưu ý là độ dốc của đồ thị trong datasheet là không tuyến tính). Nếu anh đo ở khoảng 45-55mm thì gần như GP2D12 chịu thua.

Do vậy, em khuyên anh không nên đi sâu vào giải pháp này, vì nó không phù hợp với yêu cầu thực tế của anh.

Chúc vui

falleaf
11-08-2009, 06:18 PM
http://sensor.baumerelectric.com/productnavigator/scripts/level2.php?cat=CONFUltraschall_Sensoren&psg=&pid=Ultraschall_Analogausgang_UNDK_10_Sd_200_mm&language=en&country=CH&header=%3Cspan%3ESchweiz%20/%20Baumer%20Electric%20AG%3C/span%3E

Sai số loại này lên tới 0.5mm (sai số tuyệt đối). Nếu cần thì em có thể tư vấn cho anh các loại sai số ở mức 0.01mm. Nhưng giải pháp này cực kỳ đắt tiền.

Chúc vui.

namnp2007
11-08-2009, 06:43 PM
Rất cám ơn bang chủ đã có công giải thích, có thể mình sẽ chọn loại UNDK 10 này. Mr. F. có thể cho biết sơ về giá của nó không ?
Do thực tế mình chỉ muốn giữ khoảng cách từ đầu cắt của máy cắt plasma ( CNC) đến tấm sản phẩm đang được cắt, khoảng cách tốt nhất là khoảng 2-3mm, nếu lớn hơn thì mạch cắt xấu, nếu quá nhỏ (< 1mm) sẽ không cắt được, nên nếu sai số thực tế là 0,5mm thì vẫn còn trong dung sai cho phép, giờ chỉ còn điều kiện kinh tế có cho phép nữa hay không mà thôi , hì hì.

falleaf
11-08-2009, 08:12 PM
Vậy tạm ngưng thảo luận về vấn đề này tại đây, có thể em kiểm tra một số thông tin thì sẽ mở luồng mới về cảm biến laser để thảo luận.

Anh có thể lên google để tìm với từ khóa: laser range finder thì sẽ tìm được rất nhiều loại cảm biến tương tự như thế này.

Em còn có trong tay danh sách khá nhiều loại cảm biến laser vì trước em là dân Cơ Điện Tử, và chuyên ngành Robotics, cho nên em đi lùng mấy thứ kiểu kiểu thế này. Tuy nhiên, hiện tại em không làm về nó nữa, nên nếu anh cần giải pháp thì giải pháp này ở mức khoảng vài trăm USD - 1000 USD hoặc thậm chí cao hơn nếu cần độ chính xác cao hơn.

Trên thực tế, về mặt điều khiển, thì lúc đó anh cần có một bộ điều khiển, có thể cần phải áp luật điều khiển, có thể là PI hoặc PID vào đó, vì với dịch chuyển quá nhỏ, độ nhạy quá cao của cảm biến, thì bộ điều khiển sẽ phải làm việc khá vất vả.

Em tạm trao đổi tới đây thôi, nếu cần thêm gì chắc anh ghé công ty em trao đổi thêm, vì giải pháp kiểu như thế này, quan trọng là anh ước lượng mức chi phí, còn một cảm biến laser thì đạt mức sai số 0.5mm tương đối nhiều. Loại 0.01mm thì mới khó. Tất nhiên sẽ còn nhiều vấn đề nữa mới giải quyết được bài toán của anh.

Các loại cảm biến đều có thể cho giá trị ra 4mA - 25mA hoặc ra dải điện áp 0 - 2.5V hoặc 0-5V, hoặc cho ra RS232 hoặc RS485. Như vậy, để sử dụng thì mua luôn loại ra RS232 cắm vào phát là chạy luôn, cắm con MCU nào cũng được, bộ điều khiển PID cũng đơn giản.

Chúc vui

namnp2007
13-08-2009, 09:58 AM
Ok, thanks. mình sẽ ghé công ty.

arthasherovu
15-04-2010, 12:21 AM
anh F cho em hỏi tại sao tầm của cảm biến siêu âm SRF05 ko thể nhỏ hơn 10cm được zay, và trong Robot tránh vật cản có cần thêm cảm biến hồng ngoại để phát hiện vật cản ở gần hơn 10 cm ko
thanks !!!

vanondnc
18-04-2010, 09:50 AM
Cảm biến laser thì tôi chưa dùng, nhưng cảm biến siêu âm thì bạn cứ đặt câu hỏi, nếu trong phạm vi hiểu biết tôi sẽ giúp.

Chúc vui.

anh cho em hỏi em làm con srf05+pic16f877a+lcd ma em bắt cạnh lên và cạnh xuống chưa được, anh xem giúp em doạn code với, cảm ơn anh nhiều:
#include <16F877.h>
#include <defs_16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device *=16
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#define led1 pin_E1
#define button pin_B1
#define TRIGGER pin_B4// chan phat song sieu am
//chan ECHO nhan tin hieu ve noi vao RC2
#BYTE TRISC=0X87
#BYTE PORTC=0X07
#BIT RC2=0X7.2
float dist,getvar ;
int1 has_echo=0,echo=0;

////////////////////////////////////////////////

#int_CCP1
void ccp1_isr()
{
setup_ccp1(CCP_CAPTURE_RE);//thiet lap Capture CCP1 do xung canh len
enable_interrupts(INT_CCP1);//cho phep ngat khi ccp1 co tin hieu
enable_interrupts(GLOBAL);
if(pin_c2)
set_timer1(1000); //reset timer1 ve 0
setup_ccp1(CCP_CAPTURE_FE); //chuyen sang do xung canh xuong
if(!pin_c2);//khi co xung canh xuong
getvar=get_timer1(); //doc gia tri timer1 ngay khi co xung echo canh xuong
dist=(getvar-485)/28.3; //so lieu dua theo ket qua do thuc te
dist=getvar;
}
//----10us cho trigger----
void trig()
{
output_high(TRIGGER);
delay_us(10);
output_low(TRIGGER);
}
void main()
{
SET_TRIS_A(0x00); // Port A output
SET_TRIS_B(0X00);
SET_TRIS_E(0x00);
SET_TRIS_C(0xff);
SET_TRIS_D(0b00000011);
lcd_init();

while(1)
{
trig();
ccp1_isr();
lcd_putcmd(0x01);
printf(lcd_putchar,"dist=%6.1f",dist);
lcd_putchar("cm");
delay_ms(1000);
}
}

lcd chỉ hiển thị số 0. em chưa biêt sai chỗ nào cả

0944911982
30-05-2010, 01:53 PM
ban nao co biet cam bien sieu am TR40-16 ko?va co ai biet cho nao ban ko?xin chgi minh giup huu_nghia17@yahoo.com

sit_alone76816
04-06-2010, 10:29 AM
anh cho em hỏi em làm con srf05+pic16f877a+lcd ma em bắt cạnh lên và cạnh xuống chưa được, anh xem giúp em doạn code với, cảm ơn anh nhiều:
#include <16F877.h>
#include <defs_16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device *=16
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#define led1 pin_E1
#define button pin_B1
#define TRIGGER pin_B4// chan phat song sieu am
//chan ECHO nhan tin hieu ve noi vao RC2
#BYTE TRISC=0X87
#BYTE PORTC=0X07
#BIT RC2=0X7.2
float dist,getvar ;
int1 has_echo=0,echo=0;

////////////////////////////////////////////////

#int_CCP1
void ccp1_isr()
{
setup_ccp1(CCP_CAPTURE_RE);//thiet lap Capture CCP1 do xung canh len
enable_interrupts(INT_CCP1);//cho phep ngat khi ccp1 co tin hieu
enable_interrupts(GLOBAL);
if(pin_c2)
set_timer1(1000); //reset timer1 ve 0
setup_ccp1(CCP_CAPTURE_FE); //chuyen sang do xung canh xuong
if(!pin_c2);//khi co xung canh xuong
getvar=get_timer1(); //doc gia tri timer1 ngay khi co xung echo canh xuong
dist=(getvar-485)/28.3; //so lieu dua theo ket qua do thuc te
dist=getvar;
}
//----10us cho trigger----
void trig()
{
output_high(TRIGGER);
delay_us(10);
output_low(TRIGGER);
}
void main()
{
SET_TRIS_A(0x00); // Port A output
SET_TRIS_B(0X00);
SET_TRIS_E(0x00);
SET_TRIS_C(0xff);
SET_TRIS_D(0b00000011);
lcd_init();

while(1)
{
trig();
ccp1_isr();
lcd_putcmd(0x01);
printf(lcd_putchar,"dist=%6.1f",dist);
lcd_putchar("cm");
delay_ms(1000);
}
}

lcd chỉ hiển thị số 0. em chưa biêt sai chỗ nào cả

Bạn đã đọc kỹ data sheet của con SRF05 này chưa vậy ? Về chương trình ngắt của bạn mình chưa nói đến là đúng hay sai vì mình không dùng CCS, nhưng mình thấy có 1 số vấn đề như sau :
+ Điều trước hết là bạn phải cho xem cái mạch của bạn, để biết rằng bạn đang sử dụng Mode nào, và có mắc đúng hay chưa ?
+ Điều thứ 2: là con SRF05 này cần xung Trigger >=10uS, vậy thì bạn cho nó 50us hay 100us cho chắc chắn, không vấn đề gì hết.
+ Thứ 3 là bạn có chắc cái chương trình ngắt của bạn có đúng không ? Con SRF05 còn hoạt động không ?
+ Bạn tính khoảng cách theo công thức gì vậy, bởi vì trong datasheet của nó có nói, thời gian xung đo được là uS, lấy kết quả đó chia cho 58 thì ra khoảng cách là cm, vậy tại sao công thức bạn kỳ vậy ?

langtul42
27-10-2010, 07:12 PM
co ai biet cho nao ban cam bien sieu am srf05 hay khong chi jup minh voi!thank!

fidel
20-11-2010, 07:13 PM
Chào các bạn.


Về câu hỏi của bạn Vanondnc, hàm ccp1_isr của bạn viết sai logic. Mình giải thích như thế này: sau khi phát xung đến chân trigger, cảm biến phát siêu âm ra, và sau 1 thời gian thì sóng này mới quay lại, đến lúc đó thì chân ECHO mới "high". Trong thời gian đó con PIC của bạn đã chạy xong hàm ccp1_isr, và if(pin_c2) luôn trả về sai (do chân ECHO trong thời gian đó vẫn low).

Theo mình biết mỗi lần phát siêu âm thì con SRF05 sẽ chờ xung về trong 30ms, nếu sau 30ms mà chưa có xung về thì xem như "over time". Dựa vào đó bạn nên viết hàm ccp1_isr lại theo hướng này:
+ phát trigger 10us (10 là đủ, không cần phát lâu hơn)
+ set chạy timer
+ chạy hàm while(ECHO low VÀ timer < 30ms) //đây là thời gian chờ xung về, trong hàm while này để trống không làm gì cả.
+ sau khi thoát khỏi vòng while trên, bạn ktra (bằng if) xem timer đã đạt 30ms chưa, nếu đạt rồi thì nghĩa là over time, không có vật cản trong phạm vi dò, nếu chưa thì nghĩa là có vật cản làm cho ECHO high.
+ set lại timer về 0
+ chạy tiếp 1 hàm while(ECHO high)
+ sau khi thoát ra khỏi hàm while này (nghĩa là ECHO về low), tắt và đọc giá trị timer, tính ra khoảng cách.


Mình cũng mới mua 2 con SRF05 về, đang nối dây để xài thử. Tí nữa nối dây xong mình sẽ code và nếu chạy được thì sẽ gửi code mẫu cho bạn.

fidel
21-11-2010, 04:33 AM
Đây là code của mình, SRF05/mode1/Atmega128.



#define F_CPU 14745600UL
#define STOP_CLK 0x08 // Stop clock
#define START_CLK 0x0A // Start clock with 1:8 prescaler CTC mode
#define START_CLK_N 0x02 // Start clock running 1:8 prescaler in normal mode
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>
#include "knihovnaLCD.c"

float s;
char buffer [50];
void setup(void)
{
DDRA = 0x00; // Port A asIN
DDRC = 0xFF; // Port C as OUT
TCCR1A = 0x00; // Set timer up in CTC mode
TCCR1B = 0x08;
TWBR = 0x20; // 100MHz I2C clock frequency
}
void waitForTimer(void)
{
while(!(TIFR&0x10)); // wait for timer to set compare match flag
TCCR1B = STOP_CLK; // Stop the timer
}
void startTimer(unsigned int time)
{
OCR1A = time; // Time set to count to
TIFR = 0x10; // Clear timer campare match flag
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK; // Start timer running 1:8 prescaler
}

unsigned int getEcho(void)
{
unsigned int range;

TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N;
while(bit_is_clear(PINA,0) && TCNT1 < 0xC350) // Wait for echo pin to go high, this indicates the start of the incoming pulse
{
}
if (TCNT1 > 0xC300) //Time over
{
TCCR1B = STOP_CLK;
return(999);
}
TCCR1B = STOP_CLK;
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N; // Start timer running 1:8 prescaler in normal mode
while(bit_is_set(PINA,0)); // Echo pin goes high
{ // Just wait
}
TCCR1B = STOP_CLK; // Echo pin has just fallen down. Stop the timer
range = TCNT1/107; // Read back value in the timer counter register
return(range);
}

int main(void)
{
setup();
startTimer(0xFFFF);
waitForTimer();
LCD_Init();
LCD_Clear();

while (1)
{
PORTC=255;
_delay_us(10);
PORTC=0;
s = getEcho();
sprintf (buffer, "s =%u ", (int)s);
LCD_Position(1 , 1);
LCD_WriteString(buffer);
_delay_ms(100);
};
}

navy
21-12-2011, 05:18 PM
Đây là code của mình, SRF05/mode1/Atmega128.



#define F_CPU 14745600UL
#define STOP_CLK 0x08 // Stop clock
#define START_CLK 0x0A // Start clock with 1:8 prescaler CTC mode
#define START_CLK_N 0x02 // Start clock running 1:8 prescaler in normal mode
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>
#include "knihovnaLCD.c"

float s;
char buffer [50];
void setup(void)
{
DDRA = 0x00; // Port A asIN
DDRC = 0xFF; // Port C as OUT
TCCR1A = 0x00; // Set timer up in CTC mode
TCCR1B = 0x08;
TWBR = 0x20; // 100MHz I2C clock frequency
}
void waitForTimer(void)
{
while(!(TIFR&0x10)); // wait for timer to set compare match flag
TCCR1B = STOP_CLK; // Stop the timer
}
void startTimer(unsigned int time)
{
OCR1A = time; // Time set to count to
TIFR = 0x10; // Clear timer campare match flag
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK; // Start timer running 1:8 prescaler
}

unsigned int getEcho(void)
{
unsigned int range;

TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N;
while(bit_is_clear(PINA,0) && TCNT1 < 0xC350) // Wait for echo pin to go high, this indicates the start of the incoming pulse
{
}
if (TCNT1 > 0xC300) //Time over
{
TCCR1B = STOP_CLK;
return(999);
}
TCCR1B = STOP_CLK;
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N; // Start timer running 1:8 prescaler in normal mode
while(bit_is_set(PINA,0)); // Echo pin goes high
{ // Just wait
}
TCCR1B = STOP_CLK; // Echo pin has just fallen down. Stop the timer
range = TCNT1/107; // Read back value in the timer counter register
return(range);
}

int main(void)
{
setup();
startTimer(0xFFFF);
waitForTimer();
LCD_Init();
LCD_Clear();

while (1)
{
PORTC=255;
_delay_us(10);
PORTC=0;
s = getEcho();
sprintf (buffer, "s =%u ", (int)s);
LCD_Position(1 , 1);
LCD_WriteString(buffer);
_delay_ms(100);
};
}

Không biết Topic này có chuyển sang Forum nào không mà không thấy tiếp tục? Bạn có thể cho mình địa chỉ mail để liên lạc hỏi về vấn đề này nhé? Mình đang quan tâm! Thanks!

spkt_kdd95
08-04-2012, 05:51 PM
Mình đang muốn làm con robo dùng cảm biến siêu âm Sr04 để tìm vật cản, mà viết code hoài mà nó không chạy theo ý muốn mong các sư huynh chỉ giúp. Đây là code mình viết.

;================================================= =======
; Ten chuong trinh : Mach phat xung 10us-Dung Cho Cam Bien Sieu Am Hc-SR04
; Nguoi thuc hien : Duong Van Bong
; Ngay thuc hien : 04/03/2012
; Phien ban : 1.0
; Mo ta phan cung : Dung PIC16F84A - thach anh 16MHz
; : HC-SR04 giao tiep voi PORTB
; : RB0 - RB7 la cac chan output
;----------------------------------------------------------------
; Ngay hoan thanh : 04/03/2012
; Ngay kiem tra : 04/03/2012
; Nguoi kiem tra : Duong Van Bong
;----------------------------------------------------------------
; Chu thich : Dung Pic tao xung cho cam bien
; :
;================================================= =======
TITLE "Mach phat xung 10us"
PROCESSOR P16F84A
INCLUDE <P16F84A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
;================================================= ======
; Phan Dat Bien
;-------------------------------------
; Bien o bang 0
;-------------------------------------
ORG 0x020
Delay_reg1 EQU 0x020
Delay_reg2 EQU 0x021
Delay_reg3 EQU 0x022
Delay_reg4 EQU 0x023
Delay_reg5 EQU 0x024
Rb1 EQU 1
;------------------------------------
; Bien o bang 1
;------------------------------------
ORG 0x0A0
;------------------------------------
; Bien o bang 2
;------------------------------------
ORG 0x120
;================================================= ========================
; Phâ`n chuong trình chính
;================================================= ========================
ORG 0x0000
GOTO MAIN
ORG 0x0005
MAIN
BANKSEL TRISB ; bank select
MOVLW b'00000010'
MOVWF TRISB
CLRF TRISA ; trisa = 00000000
CLRF PORTA ; porta = output
BCF STATUS,RP0
LOOP BSF PORTB,0 ; rb0 = 1
CALL DELAY_10US ; Delay times 10us
BCF PORTB,0 ; Rb0=0
CALL DELAY_1740US ; Delay times 1740us
MOVFW PORTB
BTFSS PORTB,Rb1
CALL BONG
BTFSC PORTB,Rb1
GOTO $-1
GOTO LOOP
;================================================= ============================
; Các chuong trình con
;================================================= ============================
DELAY_10US
MOVLW d'13'
MOVWF Delay_reg1
LOOP1 DECFSZ Delay_reg1
GOTO LOOP1
RETURN
;------------------------------------
DELAY_1740US
MOVLW d'3'
MOVWF Delay_reg2
MOVLW d'25'
MOVWF Delay_reg3
LOOP2 DECFSZ Delay_reg2
GOTO LOOP3
GOTO EXIT
LOOP3 DECFSZ Delay_reg3
GOTO LOOP3
GOTO LOOP2
EXIT
RETURN
;------------------------------------
DELAY_50MS
MOVLW d'17'
MOVWF Delay_reg4
MOVLW d'232'
MOVWF Delay_reg5
LOOP4 DECFSZ Delay_reg4
GOTO LOOP5
GOTO EXIT_1
LOOP5 DECFSZ Delay_reg5
GOTO LOOP5
GOTO LOOP4
EXIT_1
RETURN
;------------------------------------
BONG
BSF PORTA,0
CALL DELAY_50MS
BCF PORTA,0
RETURN
;------------------------------------
END
;================================================= ==================
duongvanbong@yahoo.com
Mong các sư huynh chỉ giúp

fire_dragon
11-01-2014, 07:48 PM
Hiện giờ, anh Hùng có bán loại cảm biến siêu âm SRF05 còn mới.
Giá bộ cảm biến 550000 VND. Liên hệ anh Hùng qua email:
hungmn30@yahoo.com

matong999
09-03-2014, 03:54 PM
cảm biến này hay thật