Hi Guys. I am new here and this is my first time to post a topic. ![]()
Thank you for any help.
I am working on do two thing together in arduino mega.
- Read from two vl6180x sensors through TCA9548A I2C multiplexer.
- Control 4 stepper motors with 4 TB6600 sepratly.
They are running good independently, but when combine them in a sketch, a problem happened.
When the arduino read analog signal from the sensor, the stepper will "block" at that moment and then re-rotate. Sensor is read once per second, and the steppers "brake" once per second.
In my opinion, it may because reading from vl6180x take too much time, it brings a "delay" to disturb the running of stepper. But I do not know how to solve it and make the stepper running smoothly. Please give me some help.
#include <Wire.h>
#include "Adafruit_VL6180X.h"
#include <AccelStepper.h>
int speed1 = 1000;
int speed2 = 1000;
int speed3 = 1000;
int speed4 = 1000;
unsigned long currentMillis = 0;
int sensor_Interval = 1000; //SensorDelay
unsigned long pre_distancesensorMillis1 = 500;
unsigned long pre_distancesensorMillis2 = 700;
////----------------------------------------------------------------preset::Distancesensor
#define TCAADDR 0x70
Adafruit_VL6180X sensor = Adafruit_VL6180X();
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
uint8_t range1 = 0;
uint8_t range11 = 0;
uint8_t range111 = 0;
int range1avg = 0;
uint8_t status1 = 0;
uint8_t range2 = 0;
uint8_t range22 = 0;
uint8_t range222 = 0;
int range2avg = 0;
uint8_t status2 = 0;
//--------------------------------------------------------------------preset::Steppermotor
# define stepper1pul 5
# define stepper1dir 7
# define stepper2pul 51
# define stepper2dir 52
# define stepper3pul 4
# define stepper3dir 6
# define stepper4pul 53
# define stepper4dir 50
AccelStepper stepper1(1, stepper1pul, stepper1dir);
AccelStepper stepper2(1, stepper2pul, stepper2dir);
AccelStepper stepper3(1, stepper3pul, stepper3dir);
AccelStepper stepper4(1, stepper4pul, stepper4dir);
void setup() {
// put your setup code here, to run once:
Wire.begin();
Serial.begin(115200);
// ------------------------------------------------------------------ setup::Distancesensor
// Wire.begin();
// Serial.println("\nTCA9548A with two sensor6180X sensors demo.");
tcaselect(1); // now talking to sensor6180X on 2
sensor.begin(); // init sensor
tcaselect(2); // now talking to sensor6180X on 4
sensor.begin(); // init sensor
// ------------------------------------------------------------------ setup::Steppermotor
pinMode (stepper1pul ,OUTPUT);
pinMode (stepper1dir ,OUTPUT);
pinMode (stepper2pul ,OUTPUT);
pinMode (stepper2dir ,OUTPUT);
stepper1.setMaxSpeed(2000);
stepper1.setAcceleration(20);
stepper1.setSpeed(speed1);
stepper2.setMaxSpeed(2000);
stepper2.setAcceleration(20);
stepper2.setSpeed(speed2);
stepper3.setMaxSpeed(1250);
stepper3.setAcceleration(20);
stepper3.setSpeed(speed3);
stepper4.setMaxSpeed(1250);
stepper4.setAcceleration(20);
stepper4.setSpeed(speed4);
delay(1000);
}
void loop() {
currentMillis = millis();
Steppermotor();
Distancesensor();
}
void Steppermotor(){
stepper1.setSpeed(speed1);
stepper2.setSpeed(speed2);
stepper3.setSpeed(speed3);
stepper4.setSpeed(speed4);
stepper1.runSpeed();
stepper2.runSpeed();
stepper3.runSpeed();
stepper4.runSpeed();
}
void Distancesensor() {
if (currentMillis - pre_distancesensorMillis1 >= sensor_Interval){
tcaselect(1);
range1 = sensor.readRange();
range11 = sensor.readRange();
range111 = sensor.readRange();
range1avg = int((range1+range1+range111)/3.0+0.5);
status1 = sensor.readRangeStatus();
if (status1 == 0) {
Serial.print("sensor6180X on port #1: ");
Serial.println(range1avg);
}
else{
Serial.println("System error");
}
pre_distancesensorMillis1 = millis();
}
if (currentMillis - pre_distancesensorMillis2 >= sensor_Interval){
tcaselect(2);
range2 = sensor.readRange();
range22 = sensor.readRange();
range222 = sensor.readRange();
range2avg = int((range2+range22+range222)/3.0+0.5);
status2 = sensor.readRangeStatus();
if (status2 == 0) {
Serial.print("sensor6180X on port #2: ");
Serial.println(range2avg);
}
else{
Serial.println("System error");
}
pre_distancesensorMillis2 = millis();
}
}