Eğitimler
SFRRangerReader
Bu örnek, Arduino'nun Tel Kütüphanesi kullanılarak I2C senkron seri protokolü üzerinden iletişim kuran bir ultra-sonik telemetre olan Devantech SRFxx'in nasıl okunacağını gösterir.
I2C protokolü veri göndermek ve almak için iki hat kullanılmasını içerir: Arduino veya Genuino Master kartının düzenli aralıklarla attığı bir seri saat pimi (SCL) ve iki cihaz arasında verinin gönderildiği bir seri veri pimi (SDA) . Saat çizgisi alçaktan yükseğe değiştiğinde (saat darbesinin yükselen kenarı olarak bilinir), belirli bir cihazın adresini ve aa komutunu veya verilerini sırayla oluşturacak olan tek bir bilgi biti karttan SDA hattı üzerinden I2C cihazı. Bu bilgiler - bit bitinden sonra - gönderildiğinde, çağrılan cihaz isteği yürütür ve gerekirse, zamanlama olarak SCL'de Master tarafından üretilen saat sinyalini kullanarak aynı satır üzerinden verilerini geri gönderir.
I2C protokolü, etkinleştirilmiş her cihazın kendine özgü bir adrese sahip olmasına izin verdiği ve hem ana hem de bağımlı cihazların tek bir hat üzerinden iletişim kurmasına izin verdiği için, Arduino'nuzun sadece kullanırken birçok cihazla (sırayla) iletişim kurması mümkündür. Mikrodenetleyicinizin iki pimi.
Gerekli Donanım
- Arduino veya Genuino Kurulu
- Devantech SRFxx Mesafe Bulucu ( SRF02 , SRF08 veya SRF10 modelleri, karşılaştırmak için tıklayın)
- 100 uf kapasitör
- bağlantı telleri
- breadboard
Devre
SRFxx'nizin SDA pinini kartınızın analog pin 4'üne ve SCL pinini analog pin 5'e takın . SRFxx'nizi güç kaynağını düzeltmek için menzil bulucusuna paralel olarak 100 uf kapasitör ekleyerek 5V'den besleyin.
Şematik
Kod
Aynı satırda iki SRFxx kullanıyorsanız, bunların aynı adresi paylaşmadığından emin olmalısınız. Mesafe bulucuları yeniden adresleme talimatları aşağıdaki kodun altında bulunabilir.
// by Nicholas Zambetti <http://www.zambetti.com>
// and James Tichenor <http://www.jamestichenor.net>
// Demonstrates use of the Wire library reading data from the
// Devantech Utrasonic Rangers SFR08 and SFR10
// Created 29 April 2006
// This example code is in the public domain.
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial communication at 9600bps
}
int reading = 0;
void loop() {
// step 1: instruct sensor to read echoes
Wire.beginTransmission(112); // transmit to device #112 (0x70)
// the address specified in the datasheet is 224 (0xE0)
// but i2c adressing uses the high 7 bits so it's 112
Wire.write(byte(0x00)); // sets register pointer to the command register (0x00)
Wire.write(byte(0x50)); // command sensor to measure in "inches" (0x50)
// use 0x51 for centimeters
// use 0x52 for ping microseconds
Wire.endTransmission(); // stop transmitting
// step 2: wait for readings to happen
delay(70); // datasheet suggests at least 65 milliseconds
// step 3: instruct sensor to return a particular echo reading
Wire.beginTransmission(112); // transmit to device #112
Wire.write(byte(0x02)); // sets register pointer to echo #1 register (0x02)
Wire.endTransmission(); // stop transmitting
// step 4: request reading from sensor
Wire.requestFrom(112, 2); // request 2 bytes from slave device #112
// step 5: receive reading from sensor
if (2 <= Wire.available()) { // if two bytes were received
reading = Wire.read(); // receive high byte (overwrites previous reading)
reading = reading << 8; // shift high byte to be high 8 bits
reading |= Wire.read(); // receive low byte as lower 8 bits
Serial.println(reading); // print the reading
}
delay(250); // wait a bit since people have to read the output :)
}
/*
// The following code changes the address of a Devantech Ultrasonic Range Finder (SRF10 or SRF08)
// usage: 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();
}
*/
See Also
- Wire.begin()
- Wire.beginTransmission()
- Wire.endTransmission()
- Wire.send()
- Wire.RequestFrom()
- Wire.receive()
- Wire Library- Tel Kütüphanesi için referansınız.
- DigitalPotentiometer- Analog Aygıtlar AD5171 Dijital Potansiyometre nasıl kontrol edilir.
- Master Reader/Slave Writer- İki Arduino, I2C aracılığıyla bir Master Reader / Slave Sender yapılandırmasında birbirleriyle iletişim kuracak şekilde programlanmıştır.
- Master Writer/Slave receiver- İki Arduino, I2C aracılığıyla bir Master Writer / Slave Receiver yapılandırmasında iletişim kuracak şekilde programlanmıştır.