Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/SFRRangerReader

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Считывание данных с ультразвукового дальномера Devantech при помощи библиотеки Wire [1]

Этот пример демонстрирует, как при помощи Arduino-библиотеки Wire считывать данные с Devantech SRFxx, ультразвукового дальномера, коммуницирующего через синхронный последовательный протокол I2C.

В протоколе I2C для отправки и передачи данных используется два контакта: Serial Clock (SCL), через который Arduino отбивает тактовый импульс, и Serial Data (SDA), по которому и проходит обмен данными между девайсами.

Если тактовый импульс меняется с LOW на HIGH (этот сценарий известен как «положительный фронт тактового сигнала»), Arduino через SDA-линию отсылает I2C-девайсу бит информации, содержащий адрес конкретного устройства, а также запрос на отправку данных. Если тактовый импульс меняется с HIGH на LOW («отрицательный фронт тактового сигнала»), «разбуженный» I2C-девайс в ответ на запрос отсылает Arduino необходимые данные по той же SDA-линии.

Поскольку I2C-протокол позволяет всем подключенным девайсам иметь свой уникальный адрес, а оба устройства (и ведущее, и ведомое) обмениваются информацией по одной и той же линии, Arduino может коммуницировать с несколькими девайсами (но по очереди), при этом используя лишь два контакта микроконтроллера.

Необходимое оборудование

  • Плата Arduino;
  • Ультразвуковой дальномер Devantech SRFxx (модели SRF02, SRF08 или SRF10);
  • Конденсатор на 1100 микрофарад;
  • Макетная плата Breadboard;
  • Провода-перемычки;

Цепь

SDA-контакт дальномера подключите к 4-ому аналоговому контакту Arduino, а SCL-контакт – к 5-ому аналоговому контакту. Чтобы запитать дальномер, подсоедините его к 5V на Arduino, но с параллельным подключением через конденсатор на 1100 микрофарад, чтобы смягчить подаваемую для питания мощность.

SRFxx bb.png

Схема

SRFxx sch.png

Код

Если вы используете на одной и той же линии не один, а два дальномера, убедитесь, что они не используют один и тот же адрес. Инструкцию по переадресовке ультразвуковых дальномеров можно найти в нижней части кода, приложенного ниже:

  1. // Пример с ультразвуковым дальномером Devantech SRF10 или SRF08, работающим через I2C,
  2. // от Николаса Замбетти (Nicholas Zambetti, http://www.zambetti.com)
  3. // и Джеймса Тиченора (James Tichenor, http://www.jamestichenor.net).
  4.  
  5. // Демонстрирует использование библиотеки Wire. Считывает данные от
  6. // ультразвукового дальномера Devantech SFR08 и SFR10.
  7.  
  8. // Создан 29 апреля 2006.
  9.  
  10. // Этот код не защищен авторским правом.
  11.  
  12. #include <Wire.h>
  13.  
  14. void setup()
  15. {
  16.   Wire.begin();                // подключаем шину I2C (для ведущего устройства адрес опционален)
  17.   Serial.begin(9600);          // запускаем последовательную передачу данных на скорости 9600 бит в секунду
  18. }
  19.  
  20. int reading = 0;
  21.  
  22. void loop()
  23. {
  24.   // Шаг 1. Инструктируем датчик о том, как ему считывать эхо:
  25.   Wire.beginTransmission(112); // передаем девайсу #112 (0x70);
  26.                                // адрес, указанный в «даташите» – это 224 (0xE0),
  27.                                // но в I2C используются «верхние» 7 бит, так что получается «112»
  28.   Wire.write(byte(0x00));      // настраиваем регистровый указатель на командный регистр (0x00)
  29.   Wire.write(byte(0x50));      // приказываем датчику измерять в «дюймах» (0x50)
  30.                                // для сантиметров используйте 0x51
  31.                                // для микросекунд используйте 0x52
  32.   Wire.endTransmission();      // останавливаем передачу данных
  33.  
  34.   // Шаг 2. Ждем, когда начнется считывание:
  35.   delay(70);                   // в «даташите» указано, что нужно как минимум 65 миллисекунд
  36.  
  37.   // Шаг 3. Инструктируем датчик о том, как возвращать считанное эхо:
  38.   Wire.beginTransmission(112); // передаем данные девайсу #112
  39.   Wire.write(byte(0x02));      // отправляем байт с инструкцией
  40.   Wire.endTransmission();      // останавливаем передачу данных
  41.  
  42.   // Шаг 4. Запрашиваем у датчика считанные данные:
  43.   Wire.requestFrom(112, 2);    // запрашиваем 2 байта у ведомого устройства с адресом #112
  44.  
  45.   // Шаг 5. Получаем данные от датчика:
  46.   if(2 <= Wire.available())    // если было получено два байта
  47.   {
  48.     reading = Wire.read();     // принимаем «верхний» байт (он перезапишет предыдущее считывание)
  49.     reading = reading << 8;    // «верхним» байтом будут «верхние» 8 бит
  50.     reading |= Wire.read();    // принимаем «нижний» байт, как «нижние» 8 бит
  51.     Serial.println(reading);   // выводим считанные данные на Serial Monitor
  52.   }
  53.  
  54.   delay(250);                  // пользователь – не робот :) поэтому немного ждем, чтобы он успел прочитать то, что мы показали на Serial Monitor
  55. }
  56.  
  57. /*
  58.  
  59. // Нижеследующий код меняет адрес ультразвукового дальномера Devantech (SRF10 или SRF08).
  60. // Пример использования – changeAddress(0x70, 0xE6);
  61.  
  62. void changeAddress(byte oldAddress, byte newAddress)
  63. {
  64.   Wire.beginTransmission(oldAddress);
  65.   Wire.write(byte(0x00));
  66.   Wire.write(byte(0xA0));
  67.   Wire.endTransmission();
  68.  
  69.   Wire.beginTransmission(oldAddress);
  70.   Wire.write(byte(0x00));
  71.   Wire.write(byte(0xAA));
  72.   Wire.endTransmission();
  73.  
  74.   Wire.beginTransmission(oldAddress);
  75.   Wire.write(byte(0x00));
  76.   Wire.write(byte(0xA5));
  77.   Wire.endTransmission();
  78.  
  79.   Wire.beginTransmission(oldAddress);
  80.   Wire.write(byte(0x00));
  81.   Wire.write(newAddress);
  82.   Wire.endTransmission();
  83. }
  84. */

См.также

  1. [Reference/WireBegin | Wire.begin()]]
  2. Wire.beginTransmission()
  3. Wire.endTransmission()
  4. Wire.send()
  5. Wire.RequestFrom()
  6. Wire.receive()
  7. Wire Library
  8. digital_potentiometer
  9. Master Reader/Slave Writer
  10. Master Writer/Slave receiver

Внешние ссылки

  1. SRFxx Sonic Range Finder Reader