Neko, зависит от места расположения и траектории движения Солнце. В некоторых местах не целесообразно. В некоторых это имеет смысл по одной или 2м осям.
Какие компоненты используются в качестве датчиков освещения? Можешь такой вот скетч попробовать запустить. Сделано под фототранзисторы. #define LIGHT_SENSOR_0_PIN A0//YOUR right sensor pin #define LIGHT_SENSOR_1_PIN A1//YOUR left sensor pin #include <Servo.h> int light_sensor_0_value=0, light_sensor_1_value=0; float k=0.25, u=90, err=0; int servo_oldval=0, servo_now=0; Servo yaw_servo; void setup() { pinMode(LIGHT_SENSOR_0_PIN,INPUT); pinMode(LIGHT_SENSOR_1_PIN,INPUT); yaw_servo.attach(3); //YOUR servo pin }
void loop () { aim(); servo_now=servo_oldval+u; if (servo_now<1)servo_now=1; if (servo_now>179)servo_now=179; if(abs(u)>3)yaw_servo.write(servo_now); delay(5); } void sensorread() { light_sensor_0_value=analogRead(LIGHT_SENSOR_0_PIN); light_sensor_1_value=analogRead(LIGHT_SENSOR_1_PIN); } void aim() { servo_oldval=u; sensorread(); err=light_sensor_0_value-light_sensor_1_value; u=k*err; } Я хз честно, не уверен что заработает без отладки. Косяки лень искать. Решил что-то покодить немного :)
[id183195138|Василий], простейший трекер на фоторезисторах. /* Arduino Light Tracker
Author: David M. Auld Date: 22nd September 2010 Version: 1.0
This is the simple example of a differential gap controller which tracks light across a horizontal plane e.g. follows the Sun East/West.
It uses the following Hardware; 2 x Photoresistors for East / West Light 2 x 10kOhm resistors 1 x 5V servo 1 x Arduino
Built and tested on Arduino Duemilanove.
Change Log ********** V1: 22nd September 2010 —--------------------— Initial Release
*/
#include <Servo.h>
//IO Pins int pinL = 5; //Left Sensor IO Pin int pinR = 4; //Right Sensor IO Pin int pinServo = 11; //Servo PWM pin
int leftValue = 0; //The left Sensor Value int rightValue = 0; //The right Sensor Value int error =0; //The Deviation between the 2 sensors int errorAVG = 0; //Error Average - Rolling 2 Point
int deadband = 10; //Range for which to do nothing with output 10 = -10 to +10
//Servo Stuff Servo hServo; //The servo object int Position = 45; //Position to write out
int minPos = 5; //Min Position int maxPos = 150; //Max Position
float output = (maxPos - minPos) /2; //Initial output Position
void setup() { Serial.begin(9600);
hServo.attach(pinServo);
//Set Servo to Centre for Alignment Purpose Serial.println("Moving Servo to Minimum Position"); hServo.write(minPos); delay(5000); Serial.println("Moving Servo to Maximum Position"); hServo.write(maxPos); delay(5000); Serial.println("Moving Servo to Mid-Point"); hServo.write(output); delay(5000); Serial.println("Going Live................"); }
if (errorAVG < (deadband * -1)) { return 1; } else { if (errorAVG > deadband) { return -1; } else { //Do not move within deadband return 0; } } }
Сейчас, вот, учусь подключать по несколько устройств к аппаратному sip, одно из которых дисплей, 5110, второе - радиомодуль nrf24i01. Долго подбирал библиотеку поддерживающую работу дисплея на аппаратном sip (Adafruit_PCD8544, Adafruit_GFX). Пока подбирал, что-то накосячил с радиомодулями, и теперь даже "здравствуй мир" не работает... А потом, я пошел спать. Вообще, непосредственно Ардуиной я занялся в этот понедельник. Нужна была игрушка, чтоб чем-то себя занять, и что меня не убьёт.
#define LIGHT_SENSOR_0_PIN A0//YOUR right sensor pin
#define LIGHT_SENSOR_1_PIN A1//YOUR left sensor pin
#include <Servo.h>
int light_sensor_0_value=0, light_sensor_1_value=0;
float k=0.25, u=90, err=0;
int servo_oldval=0, servo_now=0;
Servo yaw_servo;
void setup()
{
pinMode(LIGHT_SENSOR_0_PIN,INPUT);
pinMode(LIGHT_SENSOR_1_PIN,INPUT);
yaw_servo.attach(3); //YOUR servo pin
}
void loop ()
{
aim();
servo_now=servo_oldval+u;
if (servo_now<1)servo_now=1;
if (servo_now>179)servo_now=179;
if(abs(u)>3)yaw_servo.write(servo_now);
delay(5);
}
void sensorread()
{
light_sensor_0_value=analogRead(LIGHT_SENSOR_0_PIN);
light_sensor_1_value=analogRead(LIGHT_SENSOR_1_PIN);
}
void aim()
{
servo_oldval=u;
sensorread();
err=light_sensor_0_value-light_sensor_1_value;
u=k*err;
}
Я хз честно, не уверен что заработает без отладки. Косяки лень искать. Решил что-то покодить немного :)
/*
Arduino Light Tracker
Author: David M. Auld
Date: 22nd September 2010
Version: 1.0
This is the simple example of a differential gap controller which tracks light across a
horizontal plane e.g. follows the Sun East/West.
It uses the following Hardware;
2 x Photoresistors for East / West Light
2 x 10kOhm resistors
1 x 5V servo
1 x Arduino
Built and tested on Arduino Duemilanove.
Change Log
**********
V1: 22nd September 2010
—--------------------—
Initial Release
*/
#include <Servo.h>
//IO Pins
int pinL = 5; //Left Sensor IO Pin
int pinR = 4; //Right Sensor IO Pin
int pinServo = 11; //Servo PWM pin
int leftValue = 0; //The left Sensor Value
int rightValue = 0; //The right Sensor Value
int error =0; //The Deviation between the 2 sensors
int errorAVG = 0; //Error Average - Rolling 2 Point
int deadband = 10; //Range for which to do nothing with output 10 = -10 to +10
//Servo Stuff
Servo hServo; //The servo object
int Position = 45; //Position to write out
int minPos = 5; //Min Position
int maxPos = 150; //Max Position
float output = (maxPos - minPos) /2; //Initial output Position
void setup()
{
Serial.begin(9600);
hServo.attach(pinServo);
//Set Servo to Centre for Alignment Purpose
Serial.println("Moving Servo to Minimum Position");
hServo.write(minPos);
delay(5000);
Serial.println("Moving Servo to Maximum Position");
hServo.write(maxPos);
delay(5000);
Serial.println("Moving Servo to Mid-Point");
hServo.write(output);
delay(5000);
Serial.println("Going Live................");
}
void loop()
{
//Input Reading
leftValue = analogRead(pinL);
rightValue = analogRead(pinR);
Serial.print("L = "); Serial.print(leftValue); Serial.print(" | ");
Serial.print("R = "); Serial.print(rightValue); Serial.print(" | ");
Serial.print("E = "); Serial.print(error); Serial.print(" | ");
Serial.print("Eavg = "); Serial.print(errorAVG);
Serial.println();
//Calculate
error = leftValue - rightValue;
errorAVG = (errorAVG + error) / 2;
float newOutput = output + getTravel();
if (newOutput > maxPos)
{
Serial.println("At Upper Limit");
newOutput = maxPos;
}
else
{
if (newOutput < minPos)
{
Serial.println("At Lower Limit");
newOutput = minPos;
}
}
Serial.println("Writing output");
//Output Writing
hServo.write(newOutput);
output = newOutput;
}
int getTravel()
{
// -1 = Left; +1 = Right
if (errorAVG < (deadband * -1))
{
return 1;
}
else
{
if (errorAVG > deadband)
{
return -1;
}
else
{
//Do not move within deadband
return 0;
}
}
}
Сейчас, вот, учусь подключать по несколько устройств к аппаратному sip, одно из которых дисплей, 5110, второе - радиомодуль nrf24i01. Долго подбирал библиотеку поддерживающую работу дисплея на аппаратном sip (Adafruit_PCD8544, Adafruit_GFX). Пока подбирал, что-то накосячил с радиомодулями, и теперь даже "здравствуй мир" не работает... А потом, я пошел спать.
Вообще, непосредственно Ардуиной я занялся в этот понедельник. Нужна была игрушка, чтоб чем-то себя занять, и что меня не убьёт.