ИК дальномер
- Войдите на сайт для отправки комментариев
Чт, 03/09/2015 - 16:41
Всем привет я хотела обратиться за помощью к Вам по скетчу я заметила совсем не давно что ИК дальномер работает не совсем правильно(или точно) он как бы срабатывает с опозданиями, или даже бывает что остановится в 10см от препятствия замиряет растояния и тут же едит в стенку и только тогда уже начинает разворачиватся.
#include <Servo.h> #include <LMotorShield.h> LMotorShield lms; int gp2; int gp3; int gp4; int gp5; void setup() { Serial.begin(9600); lms.begin(LMS_SERVOS); pinMode(3,OUTPUT); // Motor A1 pinMode(7,OUTPUT); // Motor A2 pinMode(11,OUTPUT);// Motor B1 pinMode(8,OUTPUT); // Motor B2 } void Forward() { // Подпрограмма движения робота вперед digitalWrite(3,HIGH); digitalWrite(7,LOW); digitalWrite(11,HIGH); digitalWrite(8,LOW); } void Backward(){ // Подпрограмма движения робота назад digitalWrite(3,LOW); digitalWrite(7,HIGH); digitalWrite(11,LOW); digitalWrite(8,HIGH); } void motorStop(){ // Подпрограмма остановки мотора digitalWrite(3,LOW); digitalWrite(7,LOW); digitalWrite(11,LOW); digitalWrite(8,LOW); } void Spin_Left(){ // Вращение в лево digitalWrite(3,LOW); digitalWrite(7,HIGH); digitalWrite(11,HIGH); digitalWrite(8,LOW); } void Spin_Right(){ // Вращение в право digitalWrite(3,HIGH); digitalWrite(7,LOW); digitalWrite(11,LOW); digitalWrite(8,HIGH); } void loop() { int i; for (i=0;i<5;i++){ // Повторить 5 раз для фильтрации шума gp2=analogRead(0); Serial.println(gp2); if (gp2>430){ motorStop(); lms.servoWrite(1,80); delay(500); lms.servoWrite(1,10); delay(500); for (i=0;i<5;i++){ // Повторить 5 раз для фильтрации шума gp4=analogRead(0); Serial.println(gp4); lms.servoWrite(1,175); delay(500); for (i=0;i<5;i++){ // Повторить 5 раз для фильтрации шума gp5=analogRead(0); Serial.println(gp5); lms.servoWrite(1,80); delay(500); if (gp4>350&&gp5>350){ Backward(); delay(1000); Spin_Left(); delay(1118); } else { if (gp4>350){ Forward(); delay(350); Spin_Left(); //300 delay(569); } if (gp5>350){ Forward(); delay(350); //300 Spin_Right(); delay(569); } if (gp4<350&&gp5<350){ Spin_Left(); delay(569); } } } } } else { Forward(); // Двигаться вперед } } }
Дальномер не может ехать в стенку - у него для этого нет колес.
А вообще, если уж говорить р характеристиках именно дальномера, то их нужно измерять отдельно от робота, а не пытаться догадаться, как работает дальномер, судя по поведению робота.
Напишите в сктче ТОЛЬКО опрос дальномера и вывод результата в консоль. Тогда можно будет о чем-то говорить.
Что же касается 10 см, то тут у инфракрасного дальномера есть одна особенность - на расстояние 7-10 см у него приходится максимум отдачи. При более близких расстояниях он выдает такой же сигнал, как если бы расстояние было больше 10 см. А если поднести препятствие вплотную, сигнал будет как при удалении на бесконесность. Что, в принципе, вполне предсказуемо - свет из источника совсем не попадает в приемник.
Так что если есть подозрение, что где-то есть задержка, лучше бы установить границу, после которой робот начинает отъезжать или объезжать препятствие побольше, чтобы даже если он проскочит по инерции, расстояние оставалось всегда больше 10 см, и, соответственно, дальномер работал на монотонном участке характеристики.
Глядя на код, создается впечатление, что Вы забывали по ходу ставить закрывающие скобки в циклах и собрали их все в конце процедуры.
Дальномер не может ехать в стенку - у него для этого нет колес.
А вообще, если уж говорить р характеристиках именно дальномера, то их нужно измерять отдельно от робота, а не пытаться догадаться, как работает дальномер, судя по поведению робота.
Напишите в сктче ТОЛЬКО опрос дальномера и вывод результата в консоль. Тогда можно будет о чем-то говорить.
Что же касается 10 см, то тут у инфракрасного дальномера есть одна особенность - на расстояние 7-10 см у него приходится максимум отдачи. При более близких расстояниях он выдает такой же сигнал, как если бы расстояние было больше 10 см. А если поднести препятствие вплотную, сигнал будет как при удалении на бесконесность. Что, в принципе, вполне предсказуемо - свет из источника совсем не попадает в приемник.
Так что если есть подозрение, что где-то есть задержка, лучше бы установить границу, после которой робот начинает отъезжать или объезжать препятствие побольше, чтобы даже если он проскочит по инерции, расстояние оставалось всегда больше 10 см, и, соответственно, дальномер работал на монотонном участке характеристики.
Глядя на код, создается впечатление, что Вы забывали по ходу ставить закрывающие скобки в циклах и собрали их все в конце процедуры.
Спасибо за ваш отзыв ошибку я уже сама нашла) Я просто заменила движение вперёд на движение назад после обнаружения препятствия и все)