Радар на arduino

в 14:11, , рубрики: arduino, diy или сделай сам, Песочница

Случилось так, что попалась мне на глаза arduino с некоторым количеством сенсоров. Наигравшись с blink-ами и analog ридами, разумеется, пришел к мысли о покупке собственной платы. Пробежавшись беглым взглядом по списку готовых шилдов, открыл ебей и заказал Funduino Mega2560 (аналог arduino mega 2560), и некоторое количество дополнительных девайсов к нему.

Среди самых интересных заказанных шидов был цветной TFT дисплей с разрешением 320x240, имеющий 16 битную шину и резестивный тачскрин. Как оказалось впоследствии, дисплей нужно было подключать к Mega через переходной шилд, однако упустив этот момент, переходник заказан не был, а жажда приключений заставила взять в руки паяльник и перепаять коннектор «папы», на «маму». В результате, при помощи серьезной кучи проводов и некоторого количества нервных клеток, дисплей завелся, стандартная библиотека подхватилась и начались эксперименты. Собственно о результатах последнего и пойдет речь.

image
Теперь это «мама»

Имея на руках ультразвуковой датчик расстояния и цветной дисплей, заниматься исключительно выводом цифро-буквенных значений расстояний совсем грустно, посему идея графической реализации «увиденного» датчиком, была лишь вопросом времени. Современные промышленные радиолокационные станции, для разверстки в 2D пространстве, антенну размещают на платформе, способной вращаться вокруг своей оси. Ничего иного я придумывать не стал, а просто приклеил на термоклей ультразвуковой датчик, к тяге сервы.

image
Еще бы лазер на 10мВт и — бойтесь мухи!!!

Дабы моя РЛС УЛС была более устойчивой, получившийся агрегат было решено приклеить к стеклянной подставке под стаканы. Для экспериментов оказалось более чем достаточно ну и повторяемость хорошая. Итак, еще раз принцип работы. Сервомашинка вращает влево-вправо установленный на ней датчик расстояний. Каждый момент изменения угла сервы, сопровождается рабочими импульсами датчика. Иными словами, каждому углу сервы, соответствует свои показания датчика. Далее, эти данные переводятся в читабельный вид библиотекой УЗ датчика и в соответствии с углом и показаниями датчика, на дисплее рисуется точка.
Небольшая анимашка иллюстрирующая принцип работы.
image

Сам код я максимально упростил. Однако в более стабильном варианте, добавлен корректор ошибок датчика. Периодически, УЗ выдает запредельные данные, скажем, прибавляет к настоящему значению 2000мм. причем предыдущее и последующее значения находятся в пределах нормы. Вот и анализируя соседние данные, код исправляет ошибку.

#include <UTFT.h>//Загрузка библиотеки экрана
#include <Servo.h>//Загрузка библиотеки сервы
#include <Ultrasonic.h>//Загрузка библиотеки датчика
Servo servoMain; // Инициализация сервы
Ultrasonic ultrasonic(5, 6);//Инициализация контактов датчика
UTFT        myGLCD(ITDB32S, 38,39,40,41);//Инициализация дисплея
int i = 0; //Переменная отвечающая за положение сервы
int dist_cm = 0;//Переменная для хранениия данных датчика
boolean trig = false; //Направление вращения
void setup()
{
  servoMain.attach(3); // Сарва присоединена к 3 выводу
  myGLCD.InitLCD(); //Создаем обьект дисплея
  myGLCD.clrScr();//Очищаем дисплей
  Serial.begin(9600);//Инициализируем канал вывода данных. Необязательно
}
 
void loop()
{
  if(!trig){i++;}//Если trig false увеличиваем i на еденицу каждую итерацию
  if(trig){i--;}//Если trig true уменьшаем i на еденицу каждую итерацию
  dist_cm = ultrasonic.Ranging(CM);  //Записываем в переменную данные датчика
  myGLCD.setColor(55,255,55); //Устанавливаем цвет рисования обьекта на экране
  myGLCD.fillCircle(i, (99 - dist_cm)*2, 2);//Рисуем круг радиусом 2 пикселя, в координатах x = i, y = данные датчика
  if(i==319) //Если i достигла края экрана
  {
    trig = true;//Меняем значение trig на true
    myGLCD.clrScr();//Очищаем экран
  }
  if(i==0)
  {
    trig = false;//Меняем значение trig на false
    myGLCD.clrScr();//Очищаем экран
  }
  delay(5);//Задержка в 5мс. Необходима для исключения влияния помех сервы на датчик
  servoMain.write(i/2);	//Поворачиваем серву на значение i/2
  delay(5);//Задержка в 5мс. Необходима для исключения влияния помех сервы на датчик
}

Однако не обошлось без проблем. Оказалось что тока выдаваемого USB ну никак не достаточно для полноценной запитки только arduino и дисплея, не говоря уже о серве с УЗ датчиком. Пришлось дополнительно запитать плату от 9 вольтового БП. Однако даже в этом случае УЗ выдавал не верные данные, а его предел измерения ограничивался 50 см в глубину. И это не считая массы помех, подмешиваемых в окончательные данные с датчика. Источником помех, как оказалось, являлась сервомашинка, которая при вращении давала серьезные наводки на УЗ датчик. В результате серву, я запитал от второго блока питания, соединив только минусовой провод с общей цепью. Несмотря на все принятые меры, наводки частично остались, что заметно как на данных с датчика, так и на изображении с дисплея.

Автор: Mulin

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js