Датчик расстояния для робота "флиппер"

Pozzzitron

✩✩✩✩✩✩✩
31 Июл 2018
3
0
Всем привет!
Занимаюсь боями роботов, участвую в соревнованиях, в этом году собрал робота типа "флиппер" весовой категории 110кг.
Иногда не хватает скорости реакции или не видно, что соперник наехал на "клюв" и была идея поставить датчик расстояния.
Купил jsn-sr04t, а так же e18-d80nk
Но не уверен в стабильности их работы
Можете подсказать какой нибудь датчик?
 

Вложения

Pozzzitron

✩✩✩✩✩✩✩
31 Июл 2018
3
0

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва

@Pozzzitron,
Он ставится на квадрокоптеры тряска там небольшая но есть. Диапазон лазерного свечения у него указан- работает в ИК диапазоне. Как будет вести себя на арене я не могу сказать.
Ваши же датчики работают по ультразвуку.
Но не уверен в стабильности их работы
В чем неуверенность то заключается ? Было бы проще что то советовать.
Может поставить пару датчиков ?
Может принцип другой какой использовать, а не измерение расстояния ?

Есть еще оптические датчики препятствий, можно просто попробовать разместить фоторезистор (или несколько) в клюве (если это возможно) и ловить затемнение.
 

Pozzzitron

✩✩✩✩✩✩✩
31 Июл 2018
3
0
Оформи код соответствующим тэгом, см. Правила
Странно, прошлый пост удалили что ли
В общем, поставил датчик vl53l0x, хотел поставить выше, чтобы считать расстояние до соперника, но значения слишком прыгают
Поставил в прорезь снизу, но не могу добиться стабильности срабатывания

#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_NeoPixel.h> // Подключение бибилиотеки для управления светодиодами

#define LED_ON 1 // 1 is on, 0 is off
#define LED_SIGNAL 7
#define NUMPIXELS 13 // Кол-во диодов
struct RGB {
uint8_t r;
uint8_t g;
uint8_t b;
};

uint16_t distance_old;

VL53L0X sensor;
unsigned long previousTime = 0;
#if LED_ON
Adafruit_NeoPixel pixels(NUMPIXELS, LED_SIGNAL, NEO_GRB + NEO_KHZ800);
uint32_t color;
RGB color1 = {255, 0, 0}; // Цвет минимума
RGB color2 = {0, 255, 0}; // Цвет максимума
#endif
// +- zero is 40
#define ZERO 40;
const int outputPin = 13; // Номер выходного пина
const int minDistance = 10; // Минимальное расстояние в мм
const int maxDistance = 48; // Максимальное расстояние в мм
const int readingsRequired = 2; // Количество подряд измерений в диапазоне
int consecutiveCount = 0;



RGB gradientColor(RGB color1, RGB color2, int value) {
// Ограничиваем значение value в диапазоне от 0 до 1000
if (value < 0) value = 0;
if (value > 1000) value = 500;
// Вычисляем коэффициент t от 0.0 до 1.0
float t = value / 1000.0f;
// Интерполируем каждый компонент цвета
RGB result;
result.r = (uint8_t)(color1.r + (color2.r - color1.r) * t);
result.g = (uint8_t)(color1.g + (color2.g - color1.g) * t);
result.b = (uint8_t)(color1.b + (color2.b - color1.b) * t);
return result;
}



void setup() {
#if LED_ON
pixels.begin(); //Инициализация обьекта управления диодами
#endif
Serial.begin(115200);

Wire.begin();
pinMode(outputPin, OUTPUT);
sensor.setTimeout(500);
if (!sensor.init()) {
Serial.println("Не удалось обнаружить датчик VL53L0X!");
while (1);
}
sensor.setMeasurementTimingBudget(20000);
}
void loop() {

unsigned long currentTime = micros();
uint16_t distance = sensor.readRangeSingleMillimeters()-ZERO;
unsigned long deltaTime = currentTime - previousTime;
previousTime = currentTime;
if (sensor.timeoutOccurred()) {
Serial.println("Превышено время ожидания измерения!");
} else {
//Serial.print("Расстояние: ");
Serial.println(distance);
// Serial.print(" мм, Время между измерениями: ");
// Serial.print(deltaTime);
// Serial.println(" мкс");

// Проверяем, попадает ли расстояние в заданный диапазон
if (distance >= minDistance && distance <= maxDistance) {
consecutiveCount++;
} else {
consecutiveCount = 0;
}
// Управляем выходным пином на основе количества подряд измерений
if (consecutiveCount >= readingsRequired) {
digitalWrite(outputPin, HIGH);
//Serial.println("Fire");
} else {
digitalWrite(outputPin, LOW);
//Serial.println("clear");
}
#if LED_ON
if(abs(distance_old-distance)>10)
{
RGB resultColor = gradientColor(color1, color2, distance);
color=pixels.Color(resultColor.r, resultColor.g, resultColor.b);
pixels.fill(color);
pixels.show();
}
distance_old=distance;
#endif
}
}
 

Вложения

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Выложенный код надо оформлять с помощью соответствующего тега (на панели ответа он есть)
Тут скорее всего логика не вернон работает, надо сначала написать такую прошивку, что бы просто выводило непрерывно расстояние в монитор порта. Тут видно , что вывод идете 1 раз через 2, а что в эти 2 раза выводиться ? скорее всего сообщение о таймауте. Но что то медленно все работает тогда.