#include<Wire.h>
const int MPU_addr = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
#define RPMS 300.0
#define STEP_PIN 9
#define DIRECTION_PIN 8
#define GO_PIN_L 3
#define GO_PIN_R 4
#define STEPS_PER_REV 200
#define MICROSTEPS_PER_STEP 8
#define MICROSECONDS_PER_MICROSTEP (1000000/(STEPS_PER_REV *
MICROSTEPS_PER_STEP)/(RPMS / 60))
uint32_t LastStepTime = 0;
uint32_t CurrentTime = 0;
int Distance = 0;
void setup() {
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIRECTION_PIN, OUTPUT);
digitalWrite(STEP_PIN, LOW);
digitalWrite(DIRECTION_PIN, LOW);
pinMode(GO_PIN_L, INPUT);
pinMode(GO_PIN_R, INPUT);
}
void loop() {
Distance = Distance + 1; // record this step
if (digitalRead(GO_PIN_L) == LOW)
{
CurrentTime = micros();
digitalWrite(8, LOW);
if ((CurrentTime - LastStepTime) > MICROSECONDS_PER_MICROSTEP)
{
LastStepTime = CurrentTime;
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9) / 2);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9) / 2);
}
}
if (digitalRead(GO_PIN_R) == LOW)
{
CurrentTime = micros();
digitalWrite(8, HIGH);
if ((CurrentTime - LastStepTime) > MICROSECONDS_PER_MICROSTEP)
{
LastStepTime = CurrentTime;
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9) / 2);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds((MICROSECONDS_PER_MICROSTEP * 0.9) / 2);
}
}
// Wire.beginTransmission(MPU_addr);
// Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
// Wire.endTransmission(false);
// Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers
// float AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) &
0x3C (ACCEL_XOUT_L)
// float AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) &
0x3E (ACCEL_YOUT_L)
// float AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) &
0x40 (ACCEL_ZOUT_L)
// Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42
(TEMP_OUT_L)
// // GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44
(GYRO_XOUT_L)
// // GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46
(GYRO_YOUT_L)
// // GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48
(GYRO_ZOUT_L)
// Serial.print("AcX = "); Serial.println(AcX / 16384);
// Serial.print(" AcY = "); Serial.println(AcY / 16384);
// Serial.print(" AcZ = "); Serial.println(AcZ / 16384);
// Serial.print(" Tmp = "); Serial.print(Tmp / 340.00 + 36.53);
// Serial.println("");
// // Serial.print(" | GyX = "); Serial.print(GyX);
// // Serial.print(" | GyY = "); Serial.print(GyY);
// // Serial.print(" | GyZ = "); Serial.println(GyZ);
// delay(333);
}
Does anyone of you have a clue how this could be done so that both devices (the motor with EasyDriver v 4.4 and the accelerometer) could run simultaneously since there can't be 2 void loops? I don't know how I could timewise separate their individual codes, since I need to monitor the motor with the accelerometer... Kind regards,