Дальномер VL6180 привязать показания к действию

Romkung
Offline
Зарегистрирован: 06.01.2022

Доброго времени суток, возникла потребность привязать работу шаговика к дальномеру. Информацию с дальномера получаю, отдельно шаговик работает, но не получается связать их вместе.. Я пока только начинаю изучат всё это, не всё понимаю :)

Спасибо за ответы

 

 

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

начните с того, что вставьте код правильно

Romkung
Offline
Зарегистрирован: 06.01.2022

Извеняюсь, не нашел как редактировать первое сообщение, код:

 #include <Wire.h>
#include <SparkFun_VL6180X.h>
#define VL6180X_ADDRESS 0x29
VL6180x sensor(VL6180X_ADDRESS);
const int dirPin = 2; 
const int stepPin = 3; 
int inPin = 11;
boolean val = LOW;
boolean vx = 0;
 
void setup() {
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode(inPin, INPUT);
  delay(5000);
  Serial.begin(9600);
  while (sensor.VL6180xInit()) {
    Serial.println("Failed to initalize");
    delay(1000);
  }
sensor.VL6180xDefautSettings();
  delay(1000);
}
void loop() 
{
  Serial.print(sensor.getDistance() );
  Serial.println(" mm");
  vx = sensor.getDistance();
  if (vx>40)
  {
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(100);
digitalWrite(stepPin,LOW);
delayMicroseconds(100);
  }
  else {};
}

 

Upper
Offline
Зарегистрирован: 23.06.2020

Из очевидного, вы не тот тип данных назначили для vx, посмотрите в примерах к библиотеке какой должен быть

boolean vx = 0;
vx = sensor.getDistance();
if (vx>40)
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А прокомментировать код нельзя? Где тут что и что с чем нужно "связывать"?

Romkung
Offline
Зарегистрирован: 06.01.2022

ЕвгенийП пишет:

А прокомментировать код нельзя? Где тут что и что с чем нужно "связывать"?

Извиняюсь :-)

  Serial.print(sensor.getDistance() );
  Serial.println(" mm");

Вывожу данные с датчика в монитор порта, что бы смотреть данные с датчика

vx = sensor.getDistance();

Тут делаю переменную vx что бы в нее записывалось цифровое значение с датчика

if (vx>40)

Если значение переменной больше 40, то

digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(100);
digitalWrite(stepPin,LOW);
delayMicroseconds(100);

начинает работать шаговый мотор,

 else {};

иначе нечего не происходит.

Соответственно сейчас мотор не крутится, так как в переменную vx не чего не записывается с датчика на сколько я понял

Romkung
Offline
Зарегистрирован: 06.01.2022

Upper пишет:

Из очевидного, вы не тот тип данных назначили для vx, посмотрите в примерах к библиотеке какой должен быть

boolean vx = 0;
vx = sensor.getDistance();
if (vx>40)

Попробывал другую библиотеку, взял данные из нее, я так понял получилось тоже самое, но вид с боку

#include <Adafruit_VL6180X.h>
#include <Wire.h>
Adafruit_VL6180X vl = Adafruit_VL6180X();
const int dirPin = 2; // Direction
const int stepPin = 3; // Step
int inPin = 11;   // кнопка подсоединена к цифровому выходу 11

void setup() {
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode(inPin, INPUT);      // конфигурируем цифровой вывод 11 как вход
  delay(5000);
  // открываем монитор Serial-порта
  Serial.begin(9600);
   while (!Serial) {
    delay(1);
  }
    Serial.println("Adafruit VL6180x test!");
  if (! vl.begin()) {
    Serial.println("Failed to find sensor");
    while (1);
  }
  Serial.println("Sensor found!");
  delay(1000);
}
void loop() 
{
uint8_t range = vl.readRange(); //задаем переменную range
  Serial.println(range); // выводим с переменной range данные в монитор порта (выводится)
  delay (500);
  if (range>40)  // сравниваем переменную с условием
  {       // крутим шаговик
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(100);
digitalWrite(stepPin,LOW);
delayMicroseconds(100);
  }
  else {};
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строке №9 vx описана как boolean. Т.е. она может принимать значения 0 или 1. С какого бодуна она будет > 40? Она всегда меньше. ВОт ничего у Вас и не происходит.

Кстати, Вам это уже сказали,

Upper пишет:

не тот тип данных назначили для vx

только Вы не поняли ничего, насколько я могу судить.

Romkung
Offline
Зарегистрирован: 06.01.2022

ЕвгенийП пишет:

В строке №9 vx описана как boolean. Т.е. она может принимать значения 0 или 1. С какого бодуна она будет > 40? Она всегда меньше. ВОт ничего у Вас и не происходит.

Кстати, Вам это уже сказали,

Upper пишет:

не тот тип данных назначили для vx

только Вы не поняли ничего, насколько я могу судить.

Изменил на uint8_t ( от 1 до 255), вот что Вышло:

#include <Adafruit_VL6180X.h>
#include <Wire.h>
Adafruit_VL6180X vl = Adafruit_VL6180X();
const int dirPin = 2; // Direction
const int stepPin = 3; // Step
int inPin = 11;   // кнопка подсоединена к цифровому выходу 11

void setup() {
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode(inPin, INPUT);      // конфигурируем цифровой вывод 11 как вход
  delay(5000);
  // открываем монитор Serial-порта
  Serial.begin(9600);
   while (!Serial) {
    delay(1);
  }
    Serial.println("Adafruit VL6180x test!");
  if (! vl.begin()) {
    Serial.println("Failed to find sensor");
    while (1);
  }
  Serial.println("Sensor found!");
  delay(1000);
}
void loop()
{
uint8_t range = vl.readRange(); //задаем переменную range
  Serial.println(range); // выводим с переменной range данные в монитор порта (выводится)
  delay (500);
  if (range>40)  // сравниваем переменную с условием
  {       // крутим шаговик
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(100);
digitalWrite(stepPin,LOW);
delayMicroseconds(100);
  }
  else {};
}

Но не чего не изменилось в плане кручения шаговика

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Romkung пишет:

Изменил на uint8_t ( от 1 до 255)

Ну, да, только зачем-то Вы вдобавок заменили библиотеку. Нахрена? Непонятно. Но Вы её только заменили, но при этом не переписали код под неё, в итоге, используете её неправильно.

Вам сказали, что тип неверный, чего у Вас руки чешутся библиотеку менять? Теперь Вам говорить, что сейчас неправильно, чтобы Вы ещё третью взяли и опять накосячили?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Romkung пишет:

Но не чего не изменилось в плане кручения шаговика

"не чего не изменилось" или "ничего не изменилось"?

Похоже, главная Ваша проблема в том, что Вы сами не понимаете, что пишете (это относится как к русскому, так и к Си).

Romkung
Offline
Зарегистрирован: 06.01.2022

ЕвгенийП пишет:

Romkung пишет:

Изменил на uint8_t ( от 1 до 255)

Ну, да, только зачем-то Вы вдобавок заменили библиотеку. Нахрена? Непонятно. Но Вы её только заменили, но при этом не переписали код под неё, в итоге, используете её неправильно.

Вам сказали, что тип неверный, чего у Вас руки чешутся библиотеку менять? Теперь Вам говорить, что сейчас неправильно, чтобы Вы ещё третью взяли и опять накосячили?

Изменил в старом коде на uint8 и всё завелось, всем спасибо за наводки, еще разбираться и разбираться:)

Есть еще вопрос, касаемо использования нескольких таких датчиков приближения на одной ардуино, нашел тему на форуме но так до конца решения не было.. Лучше там продолжить тему что бы не плодить?

Romkung
Offline
Зарегистрирован: 06.01.2022

Проблема что не понимаю пока до конца всё, это верно. Но для того и создан форум на мой взгляд.. А за правописание не цепляйтесь, что написано, то написано, не хотел никого обидеть

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Romkung пишет:

Есть еще вопрос, касаемо использования нескольких таких датчиков приближения на одной ардуино, нашел тему на форуме но так до конца решения не было.

А вопрос-то в чём? Вот в этом:

Romkung пишет:
Лучше там продолжить тему что бы не плодить?

Всегда лучше создать новую и внятно задать вопрос, обозначив тему разговора, а то в этой постоянно будут вылазить ошмётки старой темы.

Romkung пишет:

для того и создан форум на мой взгляд.

Нет, не для этого.

Romkung
Offline
Зарегистрирован: 06.01.2022

Надо подключить 3 таких датчика на 1 ардуино, софтово я так понимаю это не удалось сделать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не знаю, что и как Вы понимаете. Также не знаю, кому удалось это сделать, а кому - нет. Сделать это возможно, но вполне допускаю, что кому-то не удалось.

Чтобы подключить несколько таких устройств, нужно во всех, кроме одного, прописать уникальный 7-битовый адрес по адресу I2C_SLAVE__DEVICE_ADDRESS (0х212), который вступит в силу после переподачи питания. Тогда датчики с уникальными адресами можно будет использовать на одной шине. Проблем никаких. А кому что удалось или не удалось - это Вы у них и спрашивайте.

Romkung
Offline
Зарегистрирован: 06.01.2022

Понял, спасибо, тему можно закрывать