Het bijhouden van een lichtbron met een Actuator (5 / 6 stap)

Stap 5: Volg dat bureaulamp!

OK, dus misschien is er een betere toepassing dan het bijhouden van een bureaulamp... :)

Als u uploadt de code dat volgt op de Arduino, u moet kunnen reproduceren de resultaten in de video.

 /* This script moves an actuator until maximum analog input is acheived. While it's example application is to track a light source with a solar cell that is attached to the end of the actuator, it could be used to track maximum input of anything attached to the LIGHT_SENSOR_PIN. maybe like sound source tracking too? :) */ #define ACTUATOR_AMP_SENSOR_PIN A5 #define ACTUATOR_PWM_PIN 11 #define ACTUATOR_DIR_PIN 12 #define LIGHT_SENSOR_PIN A4 // MAX speed is 255 - this is the value that gets written // to the ACTUATOR_PWM_PIN. Note do not change or limit // detection will no work #define ACTUATOR_SPEED 255 // when the amp sensor analog value is between these, it is // considered to be at rest (no current being drawn). #define ZEROAMP_RANGE_LOW 505 #define ZEROAMP_RANGE_HIGH 520 // directions for the actuator (value gets set to ACTUATOR_DIR_PIN) #define RETRACT 0 #define EXTEND 1 // don't move if sampled light input value is within // STILL_TOLERANCE of g_lastInputValue #define STILL_TOLERANCE 2 // move actuator until drop from max is less than #define SEEK_TOLERANCE 2 // minimum number of milliseconds delay between sampling the ACS712 // recommended in manufacturer sample source #define SAMPLING_DELAY 1 int g_currentDirection = EXTEND; int g_lastInputValue = 0; // limited to 255 char strings void serialPrintf(char const *format, ...) { char buffer[255]; va_list args; va_start(args, format); vsprintf(buffer, format, args); va_end(args); Serial.println(buffer); } boolean isActuatorMoving() { int val = analogRead(ACTUATOR_AMP_SENSOR_PIN); // serialPrintf("Amp sensor reading: %d", val); return val < ZEROAMP_RANGE_LOW || val > ZEROAMP_RANGE_HIGH; } void stopActuator() { analogWrite(ACTUATOR_PWM_PIN, 0); } boolean almostEqual(int a, int b, int tolerance) { return a >= b - tolerance && a <= b + tolerance; } // mSeconds = optionally move in direction for n milliseconds and then stop // returns false if mSeconds != 0 and at end of travel boolean moveActuator(int direction, int mSeconds=0) { serialPrintf("moving actuator direction=%d", direction); analogWrite(ACTUATOR_PWM_PIN, ACTUATOR_SPEED); digitalWrite(ACTUATOR_DIR_PIN, direction); if(mSeconds > 0){ delay(mSeconds); boolean stillMoving = isActuatorMoving(); stopActuator(); return stillMoving; } return true; } // returns the number of milliseconds taken unsigned long moveActuatorToEnd(int direction) { long startMs = millis(); moveActuator(direction); while (isActuatorMoving()){ delay(SAMPLING_DELAY); // slight delay between sampling the ACS712 module is recommended } stopActuator(); long endMs = millis(); return endMs - startMs; } void changeDirection(int direction = -1) { if (direction == -1) direction = g_currentDirection + 1; // mask to single bit - 0 or 1, so 0 + 1 becomes 1 and 1 + 1 becomes 0 g_currentDirection = direction & 1; } // finds the max input by moving through the full range of motion void calibrate() { moveActuatorToEnd(EXTEND); // start fully extended long tMaxInput = 0; // time elapsed while retracting that max input was achieved int maxInput = 0; // what was the input long startMs = millis(); moveActuator(RETRACT); while (isActuatorMoving()) { int inputValue = analogRead(LIGHT_SENSOR_PIN); if (inputValue > maxInput) { maxInput = inputValue; tMaxInput = millis() - startMs; delay(SAMPLING_DELAY); } } long endMs = millis(); // move back to point in time when at max moveActuator(EXTEND, endMs - startMs - tMaxInput); } // returns false if at end of travel boolean seekHighInput(int pin, int direction, int inputValue) { int nextInputValue = inputValue; int maxInputValue = inputValue; boolean stillMoving; boolean atMax; serialPrintf("seeking to high input in direction %d. inputValue=%d", direction, inputValue); moveActuator(direction); do { 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); } while (stillMoving && atMax); stopActuator(); return stillMoving; } void seekToLight() { boolean stillMovable; int inputValue = analogRead(LIGHT_SENSOR_PIN); int initialValue = inputValue; if (almostEqual(inputValue, g_lastInputValue, STILL_TOLERANCE)) { return; } stillMovable = seekHighInput(LIGHT_SENSOR_PIN, g_currentDirection, inputValue); inputValue = analogRead(LIGHT_SENSOR_PIN); boolean lessThanAtStart = inputValue < initialValue - STILL_TOLERANCE; if (!stillMovable || lessThanAtStart ) { changeDirection(); } // if we are receiving less input than at start of this call, changeDirection // and go back to max if (lessThanAtStart) { seekHighInput(LIGHT_SENSOR_PIN, g_currentDirection, inputValue); } g_lastInputValue = inputValue; } // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); pinMode(ACTUATOR_PWM_PIN, OUTPUT); pinMode(ACTUATOR_DIR_PIN, OUTPUT); pinMode(ACTUATOR_AMP_SENSOR_PIN, INPUT); pinMode(LIGHT_SENSOR_PIN, INPUT); // we really don't need to calibrate anything, the seek algorithm should handle // variance in the ranges of inputs to the light sensor. // // the scan of the range of movement for highest input source that calibrate() // performs may come in handy in high ambient light environments where it's hard // to distinguish a singular source. The seek algorithm may need to be iterated // on to better support high ambient light environments // //calibrate(); serialPrintf("setup complete"); } // the loop routine runs over and over again forever: void loop() { seekToLight(); } 

Gerelateerde Artikelen

Hoe het bouwen van een garage uit de grond omhoog

Hoe het bouwen van een garage uit de grond omhoog

wat workshop ruimte, een vesting van eenzaamheid, of een plaats om huis van uw bier koelkast nodig? Een nieuwe ruime garage is het antwoord, en dit is de Instructable mogelijk te maken. Als een nieuwe huiseigenaar en fervent DIY type kerel was ik teg
Circuit Planning: Het maken van een Dual LED Circuit schicht voort Protoboard met 555 Timer

Circuit Planning: Het maken van een Dual LED Circuit schicht voort Protoboard met 555 Timer

Het doel voor dit DIY-project is om u door alle stadia van ontwikkeling van circuit dat een bedrijf zou meestal doorlopen wanneer prototyping een product; niet alleen een eenvoudige "how-to".Dit omvat:Kaart brengen van de elektronicaOntwerpen va
Controle van de positie van een Actuator met een analoge Sensor

Controle van de positie van een Actuator met een analoge Sensor

In dit Instructable, zullen we leren hoe met een analoge sensor de positie van een actuator bepalen. In dit voorbeeld zullen we met behulp van een potentiometer, maar u kunt een analoge sensor. U kunt een lichtsensor om te verplaatsen van een actuato
Het maken van een DIY borstelloze Gimbal met Arduino

Het maken van een DIY borstelloze Gimbal met Arduino

Dit is een verhaal van mijn derde project met goedkope gyro en Arduino.Na de eerdere twee projecten, Gemakkelijk omgekeerd slinger en 3D kalligrafie, ik gedacht heb van het maken van Camera Gimbal met Arduino. Dan had ik drie beleidsregels voor het p
Bijhouden van uw auto met een Arduino gebaseerde Lojack

Bijhouden van uw auto met een Arduino gebaseerde Lojack

De autodiefstal van de is een echte slepen! Verhoog uw kansen van het herstellen van uw auto door het installeren van deze eenvoudige Arduino gebaseerde tracker in uw auto.Dit project is vrij eenvoudig, en zou een goed project voor een nieuwe Arduino
Hoe levensduur van kleding en het bijhouden van het gebruik ervan in een kleine kast

Hoe levensduur van kleding en het bijhouden van het gebruik ervan in een kleine kast

soms je draagt iets en je niet zweet. U kunt het opnieuw dragen zonder te wassen. Het is beter voor het milieu, het bespaart u geld, het zal ook zorgen dat uw kleding laatst een beetje langer. Hier is een gemakkelijke manier om het bijhouden van arti
Beginner's Guide to 3D printen met de Objet Connex 500: hoe het bouwen van een Tank raket draagraket (en reinigen van de puinhoop die u hebt gemaakt in het proces)

Beginner's Guide to 3D printen met de Objet Connex 500: hoe het bouwen van een Tank raket draagraket (en reinigen van de puinhoop die u hebt gemaakt in het proces)

de Objet Connex 500 3D Printer... een geheimzinnige, magie en verbazingwekkende Hi-Tech meesterwerk, staat van 3D-printen van hoog gedetailleerde prototypes. Weten over het werken met dit prachtige apparaat is een geheim alleen worden bekend door een
Renoveren van het zadel van een fiets met lederen

Renoveren van het zadel van een fiets met lederen

vreemd als u wilt dat een harde fiets zadel heb je te besteden meer geld dan voor een zachte... ook lederen zadels zijn erg duur.In dit instructable ik zal je laten zien hoe om te renoveren een oude zadel in een mooi leren, ook heel moeilijk als je w
Hoe gemakkelijk het uitbenen van een kip (met dodelijke kip recept)

Hoe gemakkelijk het uitbenen van een kip (met dodelijke kip recept)

waarschuwing: levendige afbeeldingen van een yucky, dood, gevilde, knippen van gallus domesticus, dat wil zeggen, de kipbevatten.Er zijn vele manieren om dit te doen. Na het lezen van dit, zult u starten met een hele kip en eind met ongeveer tien stu
Hoe het bouwen van een blokhut met Zwaluwstaart inkepingen

Hoe het bouwen van een blokhut met Zwaluwstaart inkepingen

is natuurlijk het eerste ding u moet Logboeken. Een goede bron mogelijk iemand die een draagbare zagerij in uw omgeving heeft. Neem contact op met woodmizer zagerijen om een lijst met eigenaren in uw buurt.Hebt u uw eigen bomen, iemand zag ze voor u
Het maken van een perfecte cirkel. MET EEN TABEL ZAGEN!

Het maken van een perfecte cirkel. MET EEN TABEL ZAGEN!

Er lijken een heleboel vierkanten in deze wereld, vooral in hout werken. Het probleem is, soms moet je gewoon een cirkel. "Maar ik heb een cirkel dispenser!" zou je kunnen zeggen. Die moet een andere slechte lintzaag snijden cirkel. Je zag tabel
Bruids juwelen op het maken van een ketting Parel bruiloft met lint

Bruids juwelen op het maken van een ketting Parel bruiloft met lint

Dit is een lint en parelsnoer voor bruiloft, kun je je eigen Parel bruiloft kettingen door middel van deze tutorial.Stap 1: Materialen op hoe maak je een bruiloft ketting4 witte mm parel kralenparel kralen 6mm witparel kralen 8mm wit6mm wit kristal k
Instructies op het maken van een groene vilt blad-broche met knoppen en parels versierd gratis

Instructies op het maken van een groene vilt blad-broche met knoppen en parels versierd gratis

Dit is een eenvoudige DIY ambacht voor volwassenen en ooit voor kinderen om te proberen! Als u interesse in deze groene vilt blad-broche met knoppen en parels versierd zijn, doe het dan nu!Stap 1: Leveringen in het maken van de groene vilt blad-broch
Hoe het bouwen van een 8 x 8 x 8 LED kubus en controle met een Arduino

Hoe het bouwen van een 8 x 8 x 8 LED kubus en controle met een Arduino

er zijn een heleboel LED kubussen op Instructables, dus waarom doen andere? De meeste zijn voor kleine blokjes, bestaande uit 27 of 64 LEDs, zelden groter, omdat ze beperkt tot het aantal uitgangen beschikbaar op de microcontroller zijn. Deze kubus i