- 1 Как подключить ультразвуковой датчик измерения расстояния HC-SR04 к Orange Pi PC, Banana Pi или Raspberry Pi используя WiringOP, BPI-WiringPi или WiringPi соответственно
- 2 Схема подключения датчика движения HC-SR04 к Orange Pi PC, Banana Pi или Raspberry Pi с GPIO на 40 выводов
- 3 Код программы на языке C/C++
- 4 Результат
- 5 Материалы
- 6 Купить HC-SR04 на AliExpress
- 7 Купить Orange Pi PC на Aliexpress
- 8 Похожие записи
Как подключить ультразвуковой датчик измерения расстояния 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
В таблице мы видим два столбца: wPi и Physical, т.е. WiringPi и физический.
И так что мы видим: wPi=0, а Physical=11; wPi=1, а Physical=12 и так далее. Для начала я тоже не знал что да как, а потом случайно увидел в данной таблице, что всё очень просто и нету никаких тайн и не надо проверять методом научного тыка.
Для подключения я использовал выводы 12 и 16, питал от 5 В.
Рекомендуется уменьшить напряжение от Trig и делается это очень просто, используя делитель напряжения состоящий из двух резисторов, как указано на картинке ниже. Я же этого не делал, так как включил несколько раз и ничего апельсинке не будет.
Код программы на языке 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
Ничегошеньки не пАнимаю.
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
по поводу пинов 16 и 18, это была опечатка и я её исправил
пример академический к жизни не имеет никакого отношения , т.к. ждать цикл измерения «вися» 12 мс …это негодно.если у вас 10 датчиков то ваш процессор будет просто «висеть» ожидая измерений.
Да, вы правы, но это не так уж и страшно, т.к. тут висит 12 микросекунд, а не 12 миллисекунд.
во вторых — тут есть более болезненные циклы, это:
и
С прерываниями тут "голяк" благодаря ОС и, конечно, можно сделать лучше, но тут уже зависит от конкретной задачи.
Главные новости мира https://ua-vestnik.com и страны: политика, экономика, спорт, культура, технологии. Оперативная информация, аналитика и эксклюзивные материалы для тех, кто следит за событиями в реальном времени.