Arduino и ультразвуковой дальномер

AlexSMG95
Offline
Зарегистрирован: 28.02.2013

Всем доброго времени суток!
Вообщев вот в чем дело!
Решил я собрать автономный танк, и столкнулся с проблеммой.

Когда приобрел дальномеры Maxbotix LV-MaxSonar EZ1 попробовал с них считать показания!
Вообщем все было удачно! Но я решил считать дистанцию по больше метра 4 и у меня он выдал отрицательные значения и начал считывать всякую ерунду 
 вообщем вот скрины.

Вот значится скрин до ближней стены! А вот до дальней!А вот и собственно код которым я считываю показания

const int anPin = 1;
const int sens1 = 11;
long anVolt, inches, cm;
int sum=0;
int avgrange=60;

void setup()
 {
    pinMode(sens1, OUTPUT);
    Serial.begin(9600);
}
void loop()
 {
     digitalWrite(sens1, HIGH);
     pinMode(anPin, INPUT);
      for(int i = 0; i < avgrange ; i++)
      {
       anVolt = analogRead(anPin)/2;
       sum += anVolt;
      }  
  inches = sum/avgrange;
  cm = inches * 2.54;
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm + 5);
  Serial.print("cm     ");
  Serial.println();
  sum = 0;
}

Подскажите может где в коде ошибся! или это дальномеры такие?

leshak
Offline
Зарегистрирован: 29.09.2011

sum сделайте unsigned long

или уменьшите avgrange до 30 и ниже

P.S.  И вот тут http://arduino.ru/Reference почитайте раздел "Типы данных". Ознакомтесь с каждым типом, что куда влазит. Что-бы в дальнейшем осознанно выбирать подходящий тип.

P.S.S. Логи из Serial - тоже можно вставлять сюда как код. Так гораздо легче читать, чем пытатся разглядеть на скриншоте.

leshak
Offline
Зарегистрирован: 29.09.2011

и pinMode обычно выставляют один раз в setup(), а не loop().

Проблемм не будет, просто процессор на каждом проходе делает не нужную работу.

AlexSMG95
Offline
Зарегистрирован: 28.02.2013

Всем спасибо кто откликнулся! в итоге пришел у такому коду!

const int anPin1 = 2;
const int sens1 = 11;
const int anPin2 = 1;
const int sens2 = 12;
long anVolt1, anVolt2, dist1, dist2;
int i;
void setup()
 {
    digitalWrite(sens1, HIGH);
    digitalWrite(sens2, HIGH);
    pinMode(anPin1, INPUT);
    pinMode(sens1, OUTPUT);
    pinMode(anPin2, INPUT);
    pinMode(sens2, OUTPUT);
    Serial.begin(9600);
}
void loop()
 {
   for(i = 0; i < 20; i++)
   { 
     anVolt1 = analogRead(anPin1);
     dist1 = anVolt1 + 6;
     delay(2);
   }
    for(i = 0; i < 20; i++)
   { 
    anVolt2 = analogRead(anPin2);
    dist2 = anVolt2 + 6;
    delay(2);
   }
   Serial.print(dist1);
   Serial.print("   ");
   Serial.println(dist2);
  }

Но вылезла другая не маловажная проблемка!
заключается она вот в чем! Сонар через определенный промежуток времени выдает большую помеху либо теряет сигнал!

Вот лог с COM порта:

140   141
140   141
140   141
140   141
141   141
141   141
141   140
141   140
139   140
140   107
137   140
137   140
141   141
140   141
135   139
137   141
140   131
141   117
31   113
42   100
55   88
66   77
73   69
85   57
98   43
110   31
124   128
140   136
29   128
23   125
33   104
44   101
52   88
65   76
79   62
90   51
104   40
116   31
127   23
140   139
140   140
141   140
141   102
140   140
141   140
140   127
140   110
141   140
141   140
141   140
140   140
141   141
141   139
141   140
141   140
141   141
141   141
140   140
141   140
141   140
141   141
140   141
140   141
140   141
140   141
141   141
140   141
140   141
140   141
112   141
140   141
140   140
141   103
27   103
34   103
44   97
58   85
57   76
74   67
87   53
100   41
112   30
126   98
134   103
26   108
30   104
41   103
52   92
62   80
75   68
86   54
99   43
112   34
124   25
138   140
140   140
140   141
141   141
135   104
140   140
140   140
141   140
140   141
141   141
140   141
140   140
141   141
140   141
141   1

P.S

1-ый столбик это один сонар

2-ой столбик другой сонар 

как видите помехи на обоих сонарах. 

Подскажите пожалуйста как избавиться от той проблемки!

Заранее спасибо!

leshak
Offline
Зарегистрирован: 29.09.2011

А с типами так и не разобрались. Используете по принципу "вроде работает и ладно". В C/C++ без этого вас ожидают грабли бесконечные. Поверте, их и без этого хватает.

Почему anVolt1, anVolt2, dist1, dist2 у вас стали long?  У вас бывают отрицательные расстояния?  analogRead научился возвращать что-то большее 1024?  Дистанция не бывает дробной?

 

Помехи... ну ведь у вас дальномеры в руках, а не у форумчан. Да игры с ардуиной это "поиски, выдвижение версий и их проверки".

Что может давать помеху на дальномер? Чисто из банальной логики? Попробует пофантазировать:

1. Сосед с перфоратором
2. Налоговый инспектор (не знаю как, но они всем мешают)
3. Кошка
4. Переотражения сигнала
5. Помехи (или нехватка) в питании
5. Какие-то источники сигнала в комнате
 

Какой вариант по вашему наиболее вероятен? Или даже нет. Возмите вариант который проще всего проверить и проверте.

1. Сосед с перфоратором - пойти вырубить ему щиток, если пропали помехи - он причина.
2. Инспектор - заглянуть под диван
3. Кошка - выставить за двери
4. Переотражение..... немного сложновато, можно на потом отложить (в другую комнату, с другими материалами и т.п.)
5. Тоже пока отложим, есть более простые версии
6. Источники ультразвукового сигнала.... повырубать все технику в комнате...хотя..... ведь есть же еще один источник, как раз ультразвуковых сигналов, правда? Вы как раз недавно купили его...  ведь не сложно проверить "он виновник торжества или нет". Если подтвердиться - тогда думать что с этим делать.

leshak
Offline
Зарегистрирован: 29.09.2011

Кстати, о питании... 

Лучше сначала выставлять режим порта (pinMode), а уж потом выводить в него  значение (digitalWrite). 

 

Werm
Offline
Зарегистрирован: 25.03.2014

Вполне возможно характерисики превышины или брак устройства.... напреиер мой HC-SR04 после 200 см начинает врать... измерял линейкой =)

 

nick_shl
Offline
Зарегистрирован: 25.03.2014

AlexSMG95 пишет:
1-ый столбик это один сонар

2-ой столбик другой сонар

Шикарно! А кто управляет сонарами? Я конечно пробежал  по документации бегло, но не увидел в ней аналога Trig как у HC-SR04. Не увидел подобного и в Вашей программе. Делаю вывод, что сонар работает всегда. А у Вас их ДВА!!! И пуляют они импульсы как захотят,  и определить где чей - НЕ МОГУТ!!!

Попробуйте подключать сонары к питанию по очереди и посмотреть на показания.

Werm
Offline
Зарегистрирован: 25.03.2014

в среднию цифру их =) впринцепе да... а зачем два сонара в одну точку напровлять ?

Бакшаев Александр
Offline
Зарегистрирован: 29.05.2016

ПОМОГИТЕ! ДЕЛАЛ РОБОТА НА УЛЬТРОЗВУКОВОМ ДАЛЬНОМЕРЕ (НА ОДНОМ ПРОСТО ЧТО БЫ РОБОТ ПРИ ПРИБЛИЖЕНИИ   К ПРЕМПЯТСТВИЮ ПОВОРАЧИВАЛ НА ПРАВО И ЕХАЛ ВПРАВО) . УЛЬТОЗВУКОВОЙ ДАЛЬНОМЕР ПЕРЕСТАЛ РАБОТАТЬ ПРИ ПОДКЛЮЧЕНИИ ДРАЙВЕРА УПРАВЛЕНИЯ МОТОРОМ ПЕРЕСТАЛ РАБОТАТЬ ( РОБОТ ПРОСТО ПОВОРАЧИВАЛ ВПРАВО ).