Cảm biến siêu âm SRF08 có độ chính xác cao hơn SEN136B5B nhưng phức tạp hơn. Để kết nối với bo Arduino, ta phải sử dụng chuẩn kết nối I2C chứ không phải chỉ dùng 1 dây như SEN136B5B.
Chuẩn I2C sử dụng 2 dây để truyền và nhận dữ liệu: dây cấp xung SCL và dây tín hiệu SDA. Khi có sườn xung lên của SCL, 1 bit thông tin được truyền trên đường SDA. Khi thông tin được truyền đi, thiết bị nào được yêu cầu sẽ kết nối và giao tiếp với bộ vi điều khiển. Mỗi thiết bị dùng chuẩn I2C đều có 1 địa chỉ riêng, các thiết bị trao đổi thông tin lần lượt (đơn công) nên bo Arduino có thể giao tiếp với nhiều thiết bị chỉ với 2 dây SCL và SDA.
Kết nối I2C cũng có thể được dùng để kết nối với cảm biến SRF02, phiên bản thấp hơn của SRF08.
- Sơ đồ kết nối dây với SRF08
- Sơ đồ kết nối với SRF02
- Chương trình sử dụng thư viện WIRE có sẵn để kết nối I2C.
// I2C SRF10 or SRF08 Devantech Ultrasonic Ranger Finder // This example code is in the public domain. // Khai báo thư viện #include <Wire.h> void setup() { Wire.begin(); // kết nối I2C Serial.begin(9600); // truyền về máy tính } int reading = 0; void loop() { // B1: yêu cầu cảm biến đọc Wire.beginTransmission(112); // địa chỉ thiết bị #112(0x70) // theo nhà sản xuất là #224 (0xE0) // nhưng I2C dùng 7 bits cao nên viết thành (0x70) Wire.write(byte(0x00)); // chỉ về thanh ghi lệnh (0x00) Wire.write(byte(0x50)); // đọc giá trị theo cm (0x51) // dùng 0x50 đọc theo inch // còn 0x52 bắn xung ms Wire.endTransmission(); // kết thúc truyền lệnh // B2: chờ cảm biến đọc delay(70); // ít nhất 65ms // B3: yêu cầu cảm biến trả về giá trị cần thiết Wire.beginTransmission(112); // địa chỉ thiết bị #112 Wire.write(byte(0x02)); // chỉ đến thang ghi #1 (0x02) Wire.endTransmission(); // dừng truyền lệnh // B4: yêu cầu lấy giá trị Wire.requestFrom(112, 2); // đọc 2 byte từ thiết bị #112 // B5: đọc giá trị if (2 <= Wire.available()) { // nếu nhận đủ 2 byte reading = Wire.read(); // đọc byte cao (đè lên dữ liệu cũ) reading = reading << 8; // dịch byte cao sang 8 bits reading |= Wire.read(); // cộng thêm byte thấp Serial.println(reading); // gửi về máy tính } delay(250); // chờ kết quả hiển thị ổn định } /* // Lệnh để đổi địa chỉ thiết bị cũ và mới // Devantech Ultrasonic Range Finder (SRF10 or SRF08) // ví dụ: changeAddress(0x70, 0xE6); void changeAddress(byte oldAddress, byte newAddress) { Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xA0)); Wire.endTransmission(); Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xAA)); Wire.endTransmission(); Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(byte(0xA5)); Wire.endTransmission(); Wire.beginTransmission(oldAddress); Wire.write(byte(0x00)); Wire.write(newAddress); Wire.endTransmission(); } */