Quiero crear un código que mueva un motor y que obtenga datos de dos sensores y enviarlos al ordenador para que me cree una grafica, la idea es que cada cierto tiempo envíe un array con varios datos de cada sensor para que se creen nubes de puntos y si es posible no moleste el movimiento del motor en gran medida. En total en cada envio se enviaría 21 datos de 4 bytes cada uno, y la frecuencia de envio pues entre 100-500 ms. El problema es que da igual que utilice Serial.Write o Serial.Print que el tiempo que tarda en enviar los datos es bastante significativo (a ojo unos 200ms) y se aprecia en el movimiento del motor (ya se por como funciona Arduino no puede hacer multitarea y siempre se va a notar). Mi pregunta es si sabéis cual es el problema y si conocéis alguna solución.
Dejo por aqui los codigos:
#include "HX711.h"
// Pines del motor
const int STEP_PIN = 3; // Pin de pasos
const int DIR_PIN = 4; // Pin de dirección
// Pines del HX711
const int HX711_DT = 2; // Pin DT del HX711
const int HX711_SCK = 5; // Pin SCK del HX711
// Variables de control
long motorPosition = 0; // Posición virtual del motor en pasos
unsigned long lastStepTime = 0; // Tiempo de la última transmisión del motor
int stepDelay = 500; // Retardo inicial entre pasos (en µs)
unsigned long lastSerialTime = 0; // Tiempo de la última transmisión serial
int serialInterval = 200; // Intervalo de transmisión serial (ms)
bool stepState = LOW;
// Instancia del HX711
HX711 scale;
// Número de lecturas del sensor
const int numReadings = 3;
long hx711Values[numReadings];
void setup() {
// Configuración de pines del motor
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
digitalWrite(DIR_PIN, HIGH); // Configuramos dirección inicial
// Inicialización de la comunicación serial
Serial.begin(2000000);
// Inicialización del sensor HX711
scale.begin(HX711_DT, HX711_SCK);
Serial.println("Iniciando HX711...");
delay(1000);
if (!scale.is_ready()) {
Serial.println("ERROR: HX711 no está listo.");
while (1);
}
Serial.println("HX711 listo.");
}
void loop() {
// Tiempo actual
unsigned long currentTime = micros();
// Movimiento del motor
if (currentTime - lastStepTime >= stepDelay) {
lastStepTime = currentTime;
stepMotor();
}
// Enviar datos por Serial cada 300 ms
if (millis() - lastSerialTime >= serialInterval) {
//lastSerialTime = millis();
// Leer valores del sensor HX711
for (int i = 0; i < numReadings; i++) {
hx711Values[i] = scale.read();
}
// Enviar datos
sendDataa();
lastSerialTime = millis();
}
}
void stepMotor() {
stepState = !stepState; // Alternar entre HIGH y LOW
digitalWrite(STEP_PIN, stepState);
if (stepState == LOW) {
motorPosition++; // Incrementar la posición virtual del motor
}
}
void sendData() {
// Enviar un delimitador para indicar el inicio de un nuevo paquete de datos
Serial.write(0xFF);
// Enviar la posición del motor (4 bytes)
Serial.write((byte*)&motorPosition, 4);
//sizeof(motorPosition)
// Enviar los valores del sensor HX711 (10 lecturas de 4 bytes cada una)
for (int i = 0; i < numReadings; i++) {
Serial.write((byte*)hx711Values[i], 4);
}
//sizeof(hx711Values[i])
}
void sendDataa() {
// Enviar un delimitador para indicar el inicio de un nuevo paquete de datos
Serial.write(0xFF);
// Enviar la posición del motor (4 bytes)
Serial.write((byte*)&motorPosition, sizeof(motorPosition));
// Enviar los valores del sensor HX711 (10 lecturas de 4 bytes cada una)
Serial.write((byte*)hx711Values, sizeof(hx711Values));
}
El otro codigo, solo cambia la parte del "sendData"
#include "HX711.h"
// Pines del motor
const int STEP_PIN = 3; // Pin de pasos
const int DIR_PIN = 4; // Pin de dirección
// Pines del HX711
const int HX711_DT = 2; // Pin DT del HX711
const int HX711_SCK = 5; // Pin SCK del HX711
// Variables de control
long motorPosition = 0; // Posición virtual del motor en pasos
unsigned long lastStepTime = 0; // Tiempo de la última transmisión motor
int stepDelay = 500; // Delay inicial entre pasos (en µs)
unsigned long lastSerialTime = 0; // Tiempo de la última transmisión serial
int serialInterval = 100; // Intervalo de transmisión serial (ms)
bool stepState = LOW;
// Instancia del HX711
HX711 scale;
// Array para almacenar los valores del sensor
const int numReadings = 1;
long hx711Values[numReadings];
int currentReading = 0;
void setup() {
// Configuración de pines del motor
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
digitalWrite(DIR_PIN, HIGH); // Configuramos dirección inicial
// Inicialización de la comunicación serial
Serial.begin(2000000);
// Inicialización del sensor HX711
scale.begin(HX711_DT, HX711_SCK);
Serial.println("Iniciando HX711...");
delay(1000);
if (!scale.is_ready()) {
Serial.println("ERROR: HX711 no está listo.");
while (1);
}
Serial.println("HX711 listo.");
}
void loop() {
// Tiempo actual
unsigned long currentTime = micros();
// Movimiento del motor
if (currentTime - lastStepTime >= stepDelay) {
lastStepTime = currentTime;
stepMotor();
}
// Lectura del sensor HX711 ----------------- ---------------
/*
if (scale.is_ready()) {
hx711Values[currentReading] = scale.read();
currentReading = (currentReading + 1) % numReadings;
} else {
Serial.println("HX711 no está listo.");
}
*/
// Enviar datos por Serial
if (millis() - lastSerialTime >= serialInterval) {
//lastSerialTime = millis();
for (int i = 0; i < numReadings; i++) {
hx711Values[i] = scale.read();
}
sendData();
lastSerialTime = millis();
}
}
void stepMotor() {
stepState = !stepState; // Alternar entre HIGH y LOW
digitalWrite(STEP_PIN, stepState);
if (stepState == LOW) {
motorPosition++; // Incrementar la posición virtual del motor
}
/*
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(10); // Duración del pulso
digitalWrite(STEP_PIN, LOW);
motorPosition++; // Actualizamos la posición
*/
}
void sendData() {
// Enviar posición del motor
//Serial.print("Posicion (pasos): ");
Serial.println(motorPosition); // Enviamos la posición con 4 decimales
// Enviar valores del sensor HX711
//Serial.print("Valores HX711: ");
for (int i = 0; i < numReadings; i++) {
Serial.print(hx711Values[i]);
//if (i < numReadings - 1) {
// Serial.print(", ");
//}
}
//Serial.println();
Serial.println();
}