Работа IR приёмника и дальномеров VL53L0X

Buran
Offline
Зарегистрирован: 04.11.2019

Всем привет! Мучаюсь сейчас с таким вопросом. На Arduino Nano подключил IR приёмник с помощью библиотеки RC5. Все работает, все прекрасно. Затем подключил 6 дальномеров VL53L0X при помощи одноименной библиотеки, все так же работает замечательно, но когда я объединил в одну программу, loop виснет и нечего не работает. Не могу найти проблему

Вот собственно код

#include <VL53L0X.h>
#include <Wire.h>
#include <RC5.h>

#define IR_PIN 11

RC5 rc5(IR_PIN);
unsigned char toggle;
unsigned char address;
unsigned char command;
unsigned char ID_IR;

int p_front_left, p_front, p_front_right, p_left, p_backside, p_right;

#define PR_FRONT_LEFT  2
#define PR_FRONT       3
#define PR_FRONT_RIGHT 4
#define PR_LEFT        5
#define PR_BACKSIDE    6
#define PR_RIGHT       7

#define LED_RED       1
#define LED_YELLOW    14 

VL53L0X prep_front_left;
VL53L0X prep_front;
VL53L0X prep_front_right;
VL53L0X prep_left;
VL53L0X prep_backside;
VL53L0X prep_right;

void setup()
{
  Serial.begin(9600);
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(PR_FRONT_LEFT, OUTPUT); 
  pinMode(PR_FRONT,  OUTPUT); 
  pinMode(PR_FRONT_RIGHT,  OUTPUT); 
  pinMode(PR_LEFT,  OUTPUT);  
  pinMode(PR_BACKSIDE,  OUTPUT);  
  pinMode(PR_RIGHT,  OUTPUT);  
  digitalWrite(PR_FRONT_LEFT, LOW);
  digitalWrite(PR_FRONT, LOW);
  digitalWrite(PR_FRONT_RIGHT, LOW);
  digitalWrite(PR_LEFT, LOW);
  digitalWrite(PR_BACKSIDE, LOW);
  digitalWrite(PR_RIGHT, LOW);
  
  delay(500);
  Wire.begin();
     
  digitalWrite(PR_FRONT_LEFT, HIGH);  
  delay(150);
  prep_front_left.init(true);
  delay(100);
  prep_front_left.setAddress((uint8_t)22);

  digitalWrite(PR_FRONT, HIGH);
  delay(150);
  prep_front.init(true);
  delay(100);
  prep_front.setAddress((uint8_t)23);
 
  digitalWrite(PR_FRONT_RIGHT, HIGH);
  delay(150);
  prep_front_right.init(true);
  delay(100);
  prep_front_right.setAddress((uint8_t)24);
 
  digitalWrite(PR_LEFT, HIGH);
  delay(150);
  prep_left.init(true);
  delay(100);
  prep_left.setAddress((uint8_t)26);
 
  digitalWrite(PR_BACKSIDE, HIGH);
  delay(150);
  prep_backside.init(true);
  delay(100);
  prep_backside.setAddress((uint8_t)27);
  
  digitalWrite(PR_RIGHT, HIGH);
  delay(150);
  prep_right.init(true);
  delay(100);
  prep_right.setAddress((uint8_t)25);
}

void loop()
{
   if (rc5.read(&toggle, &address, &command))
   {
     Serial.println(address);
   }
    if(address == 11)
    {
      ID_IR=command;
      digitalWrite(LED_YELLOW, HIGH);
      delay(200);
      digitalWrite(LED_YELLOW, LOW);
      delay(200);
      digitalWrite(LED_YELLOW, HIGH);
      delay(200);
      digitalWrite(LED_YELLOW, LOW);
      delay(200);
      address=111;
    }
  p_front_left = prep_front_left.readRangeSingleMillimeters();
  p_front = prep_front.readRangeSingleMillimeters();
  p_front_right = prep_front_right.readRangeSingleMillimeters();
  p_left = prep_left.readRangeSingleMillimeters();
  p_backside = prep_backside.readRangeSingleMillimeters();
  p_right = prep_right.readRangeSingleMillimeters();
  digitalWrite(LED_RED, LOW);
  
  if(p_front<400)
  {digitalWrite(LED_RED, HIGH); digitalWrite(LED_YELLOW, LOW);}
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

На какой строке виснет?

Buran
Offline
Зарегистрирован: 04.11.2019

Сейчас еще раз протестировал. Прошу прощения, не так написал. Не виснет, а просто ИК приёмник не работает. Если закомментировать со 109 по 114 строки, то ИК приёмник начинает работать. Очень странно, ведь эти строки рабочие.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, наверное, пореже надо читать шесть дальномеров? Сколько времени у них Single Range Reading идёт? Умножьте это число на 6. Вот всё это время ардуина не может принимать и обрабатывать биты с IR.

Buran
Offline
Зарегистрирован: 04.11.2019

Хорошо, попробую, спасибо большое

Buran
Offline
Зарегистрирован: 04.11.2019

Да, Вы были правы, все заработало