Arduino и ультразвуковой дальномер
- Войдите на сайт для отправки комментариев
Чт, 28/02/2013 - 06:25
Всем доброго времени суток!
Вообщев вот в чем дело!
Решил я собрать автономный танк, и столкнулся с проблеммой.
Когда приобрел дальномеры 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;
}
Подскажите может где в коде ошибся! или это дальномеры такие?
sum сделайте unsigned long
или уменьшите avgrange до 30 и ниже
P.S. И вот тут http://arduino.ru/Reference почитайте раздел "Типы данных". Ознакомтесь с каждым типом, что куда влазит. Что-бы в дальнейшем осознанно выбирать подходящий тип.
P.S.S. Логи из Serial - тоже можно вставлять сюда как код. Так гораздо легче читать, чем пытатся разглядеть на скриншоте.
и pinMode обычно выставляют один раз в setup(), а не loop().
Проблемм не будет, просто процессор на каждом проходе делает не нужную работу.
Всем спасибо кто откликнулся! в итоге пришел у такому коду!
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 порта:
P.S
1-ый столбик это один сонар
2-ой столбик другой сонар
как видите помехи на обоих сонарах.
Подскажите пожалуйста как избавиться от той проблемки!
Заранее спасибо!
А с типами так и не разобрались. Используете по принципу "вроде работает и ладно". В C/C++ без этого вас ожидают грабли бесконечные. Поверте, их и без этого хватает.
Почему anVolt1, anVolt2, dist1, dist2 у вас стали long? У вас бывают отрицательные расстояния? analogRead научился возвращать что-то большее 1024? Дистанция не бывает дробной?
Помехи... ну ведь у вас дальномеры в руках, а не у форумчан. Да игры с ардуиной это "поиски, выдвижение версий и их проверки".
Что может давать помеху на дальномер? Чисто из банальной логики? Попробует пофантазировать:
1. Сосед с перфоратором
2. Налоговый инспектор (не знаю как, но они всем мешают)
3. Кошка
4. Переотражения сигнала
5. Помехи (или нехватка) в питании
5. Какие-то источники сигнала в комнате
Какой вариант по вашему наиболее вероятен? Или даже нет. Возмите вариант который проще всего проверить и проверте.
1. Сосед с перфоратором - пойти вырубить ему щиток, если пропали помехи - он причина.
2. Инспектор - заглянуть под диван
3. Кошка - выставить за двери
4. Переотражение..... немного сложновато, можно на потом отложить (в другую комнату, с другими материалами и т.п.)
5. Тоже пока отложим, есть более простые версии
6. Источники ультразвукового сигнала.... повырубать все технику в комнате...хотя..... ведь есть же еще один источник, как раз ультразвуковых сигналов, правда? Вы как раз недавно купили его... ведь не сложно проверить "он виновник торжества или нет". Если подтвердиться - тогда думать что с этим делать.
Кстати, о питании...
Лучше сначала выставлять режим порта (pinMode), а уж потом выводить в него значение (digitalWrite).
Вполне возможно характерисики превышины или брак устройства.... напреиер мой HC-SR04 после 200 см начинает врать... измерял линейкой =)
2-ой столбик другой сонар
Попробуйте подключать сонары к питанию по очереди и посмотреть на показания.
в среднию цифру их =) впринцепе да... а зачем два сонара в одну точку напровлять ?
ПОМОГИТЕ! ДЕЛАЛ РОБОТА НА УЛЬТРОЗВУКОВОМ ДАЛЬНОМЕРЕ (НА ОДНОМ ПРОСТО ЧТО БЫ РОБОТ ПРИ ПРИБЛИЖЕНИИ К ПРЕМПЯТСТВИЮ ПОВОРАЧИВАЛ НА ПРАВО И ЕХАЛ ВПРАВО) . УЛЬТОЗВУКОВОЙ ДАЛЬНОМЕР ПЕРЕСТАЛ РАБОТАТЬ ПРИ ПОДКЛЮЧЕНИИ ДРАЙВЕРА УПРАВЛЕНИЯ МОТОРОМ ПЕРЕСТАЛ РАБОТАТЬ ( РОБОТ ПРОСТО ПОВОРАЧИВАЛ ВПРАВО ).