Подключение дальномера HC-SR04 к Orange Pi PC

Как подключить ультразвуковой датчик измерения расстояния HC-SR04 к Orange Pi PC, Banana Pi или Raspberry Pi используя WiringOP, BPI-WiringPi или WiringPi соответственно

Сегодня мы подключим датчик измерения расстояния HC-SR04 к Orange Pi PC. Использовал апельсинку PC, так как она у меня есть. Но, данный пример можно использовать с тем же успехом на Banana Pi и Raspberry Pi, так что не расстраивайтесь. Для работы с периферией я использую: язык программирования C/C++, Python не нравится, никогда на нём не писал; Code::Blocks IDE и WiringPi. Как всё это правильно установить и настроить можно узнать переходя по ссылкам ниже.

Смотрите ещё:
HC-SR04 — ультразвуковой датчик расстояния
Установка и настройка WiringOP/WiringPi на Orange Pi PC
Установка и настройка BPI-WiringPi/WiringPi на Banana Pi
Установка и настройка Code::blocks на Banana Pi, Orange PI и Raspberry Pi под Ubuntu

Схема подключения датчика движения HC-SR04 к Orange Pi PC, Banana Pi или Raspberry Pi с GPIO на 40 выводов

Сперва разберёмся с GPIO и WiringPi, ибо номера выводов с GPIO не совпадают с номерами в WiringPi.
Сперва выполняем команду в терминале:

sudo gpio readall

GPIO Подключение дальномера HC-SR04 к Orange Pi PC, Banana Pi, Raspberry Pi
В таблице мы видим два столбца: wPi и Physical, т.е. WiringPi и физический.
Orange Pi PC GPIOИ так что мы видим: wPi=0, а Physical=11; wPi=1, а Physical=12 и так далее. Для начала я тоже не знал что да как, а потом случайно увидел в данной таблице, что всё очень просто и нету никаких тайн и не надо проверять методом научного тыка.
Для подключения я использовал выводы 12 и 16, питал от 5 В.
Схема подключения датчика движения HC-SR04 к Orange Pi PC, Banana Pi или Raspberry Pi с GPIO на 40 выводов
Рекомендуется уменьшить напряжение от Trig и делается это очень просто, используя делитель напряжения состоящий из двух резисторов, как указано на картинке ниже. Я же этого не делал, так как включил несколько раз и ничего апельсинке не будет.
hc-sr04 raspberry

Код программы на языке C/C++

#include <iostream>
#include <stdexcept>
#include <stdlib.h>
#include <wiringPi.h>

using namespace std;

float getDistanceCm(int TRIG, int ECHO) {
  long ping = 0;
  long pong = 0;
  float distance = 0;
  long timeout = 500000; // 0.5 сек ~ 171 м
  
  // генерирует исключение в случае ошибки при инициализации wiringPi
  if (wiringPiSetup() == -1) {
    throw logic_error("WiringPi Setup ERROR");
  }

  // установка вывода TRIG как выход
  pinMode(TRIG, OUTPUT);
  // установка вывода ECHO как вход
  pinMode(ECHO, INPUT);

  // генерация импульса длительностью 12 мкс
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(12);
  digitalWrite(TRIG, LOW);

  // ждём первый ответ датчика или тайм аут.
  while (digitalRead(ECHO) == LOW && micros() < timeout);

  // генерирует исключение в случае тайм аута.
  if (micros() > timeout) {
      throw logic_error("Out of range");
  }

  ping = micros();

  // ждём второй ответ датчика или тайм аут
  while (digitalRead(ECHO) == HIGH && micros() < timeout);

  // генерирует исключение в случае тайм аута.
  if (micros() > timeout) {
      throw logic_error("Out of range");
  }

  pong = micros();

  // вычисления расстояний
  distance = (float) (pong - ping) * 0.017150;

  return distance;
}

int main() {
  int TRIG = 1;
  int ECHO = 4;

  cout << "Подключение дальномера HC-SR04 к Orange Pi PC." << endl;

  while(true) {
    try {
      cout << "растояние = " << getDistanceCm(TRIG, ECHO) << "см" << endl;
    } catch(exception& e) {
      cout << e.what() << endl;
    }
    delay(500);
  }
  return 0;
}

Скачать проект Code::Blocks HC-SR04 Orange Pi PC.tar.gz

Результат

Подключение дальномера HC-SR04 к Orange Pi PC, Banana Pi, Raspberry Pi (1)
Подключение дальномера HC-SR04 к Orange Pi PC, Banana Pi, Raspberry Pi

Материалы

rpi-hc-sr04 — github

Купить HC-SR04 на AliExpress


Купить Orange Pi PC на Aliexpress

Похожие записи

Комментарии 17

  • Ничегошеньки не пАнимаю.
    1) «Для подключения я использовал выводы 12 и 18, питал от 5 В.»
    а по схеме 12 и 16
    2) «wPi=1, а Physical=12» и «wPi=4, а Physical=16″
    А в коде
    » int TRIG = 1;
    int ECHO = 4;»
    Пора определяться с вЫводами )

  • Вадим, для начала нужно внимательно читать)))
    1) » «Для подключения я использовал выводы 12 и 18, питал от 5 В.»
    а по схеме 12 и 16 » — вообще то там написано 12 и 16, а не 12 и 18.
    2) » «wPi=1, а Physical=12» и «wPi=4, а Physical=16″
    А в коде
    » int TRIG = 1;
    int ECHO = 4;» » — в коде использовано выводы 1 и 4 потому, что автор использует WiringPi (wPi). wPi=1 аналогична Physical=12 и wPi=4 аналогична Physical=16

  • пример академический к жизни не имеет никакого отношения , т.к. ждать цикл измерения «вися» 12 мс …это негодно.если у вас 10 датчиков то ваш процессор будет просто «висеть» ожидая измерений.

    • Да, вы правы, но это не так уж и страшно, т.к. тут висит 12 микросекунд, а не 12 миллисекунд.
      во вторых — тут есть более болезненные циклы, это:

        // ждём первый ответ датчика или тайм аут.
        while (digitalRead(ECHO) == LOW && micros() < timeout);
      

      и

        // ждём второй ответ датчика или тайм аут
        while (digitalRead(ECHO) == HIGH && micros() < timeout);
      

      С прерываниями тут "голяк" благодаря ОС и, конечно, можно сделать лучше, но тут уже зависит от конкретной задачи.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *