ARDUINO Прошивка умной мусорки, помощь со скетчем

Xhunt8r

✩✩✩✩✩✩✩
8 Окт 2023
14
0
Оформи код соответствующим тэгом
На эскизе должно быть сделано так, чтобы: когда ультразвуковой датчик видит объект на расстоянии менее 50 сантиметров, он поворачивает сервопривод на 90 градусов, а через 3 секунды он возвращается к 0. Но код работает не так, как надо, сервопривод просто вращается, не обнаруживая объект или вообще неизвестно как. Пожалуйста, не могли бы вы помочь с этой проблемой?
Сам скетч:
#include <Servo.h>
Servo servo;
int trig=3;
int echo=2;
void setup() {


Serial.begin(9600);
servo.attach(5);
servo.write(0);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);


}
void loop()
{

digitalWrite(trig,LOW);
delayMicroseconds(5);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
int a =pulseIn(echo,HIGH);
int distance = a*0.0343/2;
Serial.println(distance);
if (distance <= 50)
{
servo.write(90);
delay(3000);
servo.write(0);

delay(500);
}

}
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@Xhunt8r, самое простое это использовать переменную a в исходном значении для операции сравнения.
То есть, у вас должно быть примерно следующее if (a <= 2915)
 

Xhunt8r

✩✩✩✩✩✩✩
8 Окт 2023
14
0
@Геннадий П, не помогло, серво крутиться. когда объект в диапазоне,то серво останавливается на секунду после возобновляет работу. Надо как то изменит этот скетч для умной мусорки, что бы он работал как я выше описал. Можете написать как преобразовать эти значения дальнометра в сантиметры, чтобы условие выполнялось
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
527
86
@Xhunt8r, int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 т.е.целочисленными . Оформи код правильно тегом.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@Xhunt8r, ну вот прям бросается в глаза. int distance = a*0.0343/2; Переменная distance должна иметь тип float, раз уж вы пытаетесь проводить вычисления с вещественными числами. Иначе, при приведении результата к типу int, дробная часть будет утеряна. И это я ещё остальной код не смотрел. ;) :)
 

Xhunt8r

✩✩✩✩✩✩✩
8 Окт 2023
14
0
@PiratFox, Проблема в том что теперь, сервопривод постоянно крутиться и только когда объект в диапазоне он останавливается буквально на секунду, после чего опять вращается не смотря на нужный угол вращения, да и требования в целом. int заменил на float. float distance = a*0.0343/2;
 

Xhunt8r

✩✩✩✩✩✩✩
8 Окт 2023
14
0
@Геннадий П, Об этом я не подумал, я использую сервопривод MG90S, какой это тип вращения и какие есть серво подходящие для этой задачи

@Геннадий П, Скорее всего в моем коде все верно, просто сервопривод не тот. Ну вот в чем вопрос? Как отключать сервопривод? + на +5v, gnd на gnd, ну и дата на D5 пин, есть какая-нибудь команда и так далее? Или вообще надо перепаять?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
619
148
При использовании сервопривода постоянного вращения значение 90 используется для неподвижного состояния. Значение 0 для максимальной скорости кручения в одну сторону, а 180 для максимальной скорости кручения в другую сторону. Для проверки сервопривода можно взять скетч из примеров и "потыкать в него палочкой".