Paso 5: Siga desklamp!
OK, así que tal vez es una mejor aplicación de seguimiento un desklamp... :)
Si subes el código que sigue a la Arduino, usted debe poder reproducir los resultados en el video.
/ * Este script mueve un actuador hasta que se logra de entrada analógica máxima. Mientras que la aplicación de ejemplo es una fuente de luz con una célula solar que se adjunta al final del actuador de la pista, podría utilizarse para rastrear la entrada máxima de nada a la LIGHT_SENSOR_PIN. ¿tal vez suena como fuente de seguimiento también? :) * / #define ACTUATOR_AMP_SENSOR_PIN A5 #define ACTUATOR_PWM_PIN 11 #define ACTUATOR_DIR_PIN 12 #define LIGHT_SENSOR_PIN A4 / / velocidad máxima es de 255 - este es el valor que se escribe / / a la ACTUATOR_PWM_PIN. Nota no cambie ni limitar / / detección trabajará no #define ACTUATOR_SPEED 255 / cuando el valor analógico del sensor amp es entre estos, es / / considerado como en reposo (no corriente absorbida). #define ZEROAMP_RANGE_LOW 505 #define ZEROAMP_RANGE_HIGH 520 / / instrucciones para el actuador (el valor se establece a ACTUATOR_DIR_PIN) #define retraer 0 #define extender 1 / / no te muevas si muestra valor de entrada de luz está dentro de / / STILL_TOLERANCE de g_lastInputValue #define STILL_TOLERANCE 2 / / mover el actuador hasta que la caída del máximo es menor que #define SEEK_TOLERANCE 2 / mínimo número de milisegundos de retardo entre toma de muestras el ACS712 / recomienda en fabricante muestra fuente #define SAMPLING_DELAY 1 int g_currentDirection = extender; int g_lastInputValue = 0; limitado a 255 char cadenas void serialPrintf (char const * formato,...) {buffer char [255], args va_list va_start (formato, args); vsprintf (almacenador intermediario, formato, args); va_end(args); Serial.println(buffer); } boolean isActuatorMoving() {int val = analogRead(ACTUATOR_AMP_SENSOR_PIN); / / serialPrintf ("lectura del sensor de Amp: %d", val); volver val < ZEROAMP_RANGE_LOW || val > ZEROAMP_RANGE_HIGH;} void stopActuator() {analogWrite (ACTUATOR_PWM_PIN, 0);} boolean almostEqual (int a, int b, int tolerancia) {volver un > = b - tolerancia & & a < = b + tolerancia;} / / msegundos = opcionalmente avanzar en dirección de números milisegundos y luego parar / / devuelve false si msegundos! = 0 y final de viaje boolean moveActuator (int dirección int msegundos = 0) {serialPrintf ("dirección del actuador de movimiento = %d", dirección); analogWrite (ACTUATOR_PWM_PIN, ACTUATOR_SPEED); digitalWrite (ACTUATOR_DIR_PIN, dirección); if(mSeconds > 0) {delay(mSeconds); boolean stillMoving = isActuatorMoving(); stopActuator(); return stillMoving;} verdaderas;} / / devuelve el número de milisegundos tomada moveActuatorToEnd largo sin signo (dirección int) {startMs largo = millis(); moveActuator(direction); mientras que (isActuatorMoving()) {delay(SAMPLING_DELAY); / ligero retraso entre el ACS712 módulo de muestreo se recomienda} stopActuator(); endMs largo = millis(); volver endMs - startMs;} void changeDirection (int Dirección = -1) {si (Dirección == -1) dirección = g_currentDirection + 1; máscara de bit único - 0 o 1, 0 + 1 en 1 y 1 + 1 se convierte en g_currentDirection 0 = dirección & 1; } / considera el máximo entrada moviéndose a través de toda la gama de movimiento vacío calibrate() {moveActuatorToEnd(EXTEND); / arranca tMaxInput largo totalmente extendido = 0; / / tiempo transcurrido mientras que retraer esa entrada máxima fue alcanzada int maxInput = 0; / / lo que fue la entrada startMs largo = millis(); moveActuator(RETRACT); mientras que (isActuatorMoving()) {int inputValue = analogRead(LIGHT_SENSOR_PIN); si (inputValue > maxInput) {maxInput = inputValue; tMaxInput = millis() - startMs; delay(SAMPLING_DELAY);}} endMs largo = millis(); / / volver al punto en el tiempo cuando a max moveActuator (extensión endMs - startMs - tMaxInput); } / / devuelve false si al final del viaje boolean seekHighInput (int pin, dirección de int, int inputValue) {int nextInputValue = inputValue; int maxInputValue = inputValue, boolean stillMoving, boolean atMax; serialPrintf ("buscando a la entrada en dirección % d. inputValue = %d", dirección, inputValue); moveActuator(direction); hacer {delay(SAMPLING_DELAY); stillMoving = isActuatorMoving(); if (nextInputValue > maxInputValue) maxInputValue = nextInputValue; nextInputValue = analogRead(pin); serialPrintf ("stillMoving = %d nextInputValue = %d", stillMoving, nextInputValue); atMax = almostEqual (nextInputValue maxInputValue, SEEK_TOLERANCE); } mientras que (stillMoving & & atMax); stopActuator(); volver stillMoving; } void seekToLight() {boolean stillMovable; int inputValue = analogRead(LIGHT_SENSOR_PIN); int initialValue = inputValue; si (almostEqual (inputValue, g_lastInputValue, STILL_TOLERANCE)) {vuelta;} stillMovable = seekHighInput (LIGHT_SENSOR_PIN, g_currentDirection, inputValue); inputValue = analogRead(LIGHT_SENSOR_PIN); lessThanAtStart booleano = inputValue < initialValue - STILL_TOLERANCE; si ()! stillMovable || lessThanAtStart) {changeDirection();} / / si estamos recibiendo menos insumos que al inicio de esta convocatoria, changeDirection / / y volver a max if (lessThanAtStart) {seekHighInput (LIGHT_SENSOR_PIN, g_currentDirection, inputValue);} g_lastInputValue = inputValue; } / / la rutina de instalación se ejecuta una vez al presionar reset: void setup() {/ / inicializar la comunicación serial a 9600 bits por segundo: Serial.begin(9600) pinMode (ACTUATOR_PWM_PIN, salida) pinMode (ACTUATOR_DIR_PIN, salida); pinMode (ACTUATOR_AMP_SENSOR_PIN, entrada); pinMode (LIGHT_SENSOR_PIN, entrada); / / no necesitamos calibrar nada, debe manejar el algoritmo de búsqueda / / variación en los rangos de entradas para el sensor de luz. / / / / la exploración de la gama del movimiento para la entrada más alta de la fuente eso calibrate() / / realiza mayo vienen en mano en altos ambientes de la luz ambiente donde es difícil / / para distinguir una fuente singular. El algoritmo de búsqueda deba ser iterado / a mejor soporte entornos de luz ambiente alta / / / / calibrate(); serialPrintf ("instalación completa"); } / / la rutina del bucle se ejecuta una y otra vez para siempre: void loop() {seekToLight();}