Подключение дальномера к Orange Pi / Raspberry Pi и им подобным
Берём апельсинку и ултразвуковой дальномер HC-SR04. Если апельсинки у Вас нет, ничего страшного, подойдёт и малинка (Raspberry Pi).
Сразу хочу отметить, что номера GPIO и WiringPi отличаются. Чтобы понять что и куда подключать, введём команду:
sudo gpio readall
Результат на картинке ниже. Там Вы увидите 2 столба: wPi и Physical, то есть WiringPi и реальный.
В результате wPi=0, а Physical=11; wPi=1, а Physical=12 и тому подобное. Чтобы подключить датчик, я воспользовался пинами 12 и 16, питание, конечно, 5 Вольт.
Советую сделать вольтаж по-меньше от Trig. Для этого поставьте делитель напряжение с двумя резисторами. Смотрите следующую картинку.
Но если Вы не поставите делитель, работать тоже будет, я тестил на своей Orange Pi.
Далее исходники программы на С/С++.
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;
}
Если Вы всё сделали правильно, то должны увидеть это:
07.09.2019 в 23:39, Просмотров: 5203