Después de algunas búsquedas en línea, puedo ejecutar un motor de CC de 2 hilos de manera sinusoidal. Es un carro de impresora deconstruido que se maneja con el controlador de motor arduino uno y L298N. Usando un potenciómetro para controlar la frecuencia. El código funciona bien pero necesito ayuda con algunas cosas.
-
¿Existe una manera fácil de controlar la frecuencia a la que se ejecuta? ¿Es posible algo como configurarlo en 1.5, 1.6, 1.7, ... etc, hertz, y hacer que funcione la función seno? Actualmente estoy midiendo el hertz, pero no puedo hacer que se ejecute con precisión en intervalos
-
¿Hay una forma más elegante de controlar la inversión de la dirección? Me estoy invirtiendo cuando la onda del pecado alcanza su mínimo. Pero a frecuencias más bajas, se mantendrá en el mínimo para algunas muestras y, a veces, mi método no funciona ... Actualmente estoy contando las muestras a ciertas velocidades y con codificación dura que cuenta para invertir.
#define enA 9 #define in1 6 #define in2 7 #define INTERVAL 1000 // time between reads //#define LEN_SINE_ARRAY 64 //uint16_t sin_wave[LEN_SINE_ARRAY]; int val; int dir; int count; unsigned long lastRead = 0; int frequency = 0; int times = 0; int sample_count = 0; int sensorPin = 0; // The potentiometer is connected to // analog pin 0 void setup() { pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); // Set initial rotation direction digitalWrite(in1, LOW); digitalWrite(in2, HIGH); Serial.begin(9600); } void reverseMotor(int pwnOutput) { /* reserse the motor direction * uses the pwm outpur from the sine function */ if (dir == 0) { Serial.println("LEFT <<<<<<<<<<<<<<<<<<<<<<<<<"); digitalWrite(in1, HIGH); digitalWrite(in2, LOW); dir = 1; } else if (dir == 1) { Serial.println("RIGHT >>>>>>>>>>>>>>>>>>>>>>>>"); digitalWrite(in1, LOW); digitalWrite(in2, HIGH); dir = 0; } analogWrite(enA, pwnOutput); sample_count++; } void runMotor(int pwnOutput) { analogWrite(enA, pwnOutput); sample_count++; } void loop(){ static uint16_t phase; int sensorValue; int adjusting_speed; int reverse_fix; sensorValue = analogRead(sensorPin); phase = (map(sensorValue, 0, 1023, 1, 256)); uint16_t sin_wave[phase]; for (int16_t i = 0; i < (phase); i++) { float angle = TWO_PI * i / phase; int16_t val = sin(angle) * (1024 - 1); int pwmOutput; int dir; val += 1024; sin_wave[i] = val; pwmOutput = map(val, 0, 2047, 100, 255); // mapping higher than // 0 to ensure motor is // still moving, Serial.println(pwmOutput); //Serial.println(phase); //Serial.println(val); if(pwmOutput != 100){ runMotor(pwmOutput); count = 0; } else{ count++; // THERE HAS GOT TO BE A BETTER WAY TO DO THIS if (phase >= 1 && phase <= 32) { reverse_fix = 1; } if (phase >= 33 && phase <= 54) { reverse_fix = 2; } if (phase >= 55 && phase <= 72) { reverse_fix = 3; } if (phase >= 73 && phase <= 91) { reverse_fix = 4; } if (phase >= 92 && phase <= 109) { reverse_fix = 5; } if (phase >= 110 && phase <= 127) { reverse_fix = 6; } if (phase >= 128 && phase <= 156) { reverse_fix = 7; } if (phase >= 157 && phase <= 174) { reverse_fix = 8; } if (phase >= 175 && phase <= 193) { reverse_fix = 9; } if (phase >= 194 && phase <= 207) { reverse_fix = 10; } if (phase >= 208 && phase <= 233) { reverse_fix = 11; } if (phase >= 234 && phase <= 256) { reverse_fix = 12; } if (count >= reverse_fix){ reverseMotor(pwmOutput); } } } if (millis() - lastRead >= INTERVAL){ // if INTERVAL has passed /* * Counting and measuring hertz */ val = frequency; times++; float vals = val/times; float hertz = float(sample_count)/float(phase); lastRead = millis(); Serial.println(); Serial.println("Hz:"); Serial.println(hertz); Serial.println(); sample_count = 0; } }
Soy más nuevo en arduino, así que aprecio cualquier ayuda o consejo