我正在尝试制作一个太阳能电池板,通过比较4个光敏电阻的电阻来跟踪太阳。我已经编码了决定光敏电阻电阻的部分(我目前只用2测试),但我正在努力使伺服运动部分正确。我不知道太阳在天空中的确切位置,我只知道伺服系统需要移动什么方向才能使太阳能电池板面对太阳。我需要告诉伺服在一个特定的方向上移动,直到光敏电阻的电阻在一定的范围内(我已经创建了这个)。有人知道怎么做吗?
这是我所拥有的。
const int sensorPin = A0;
const int sensorPin1 = A1;
int sensorValue = 0;
int sensorValue1 = 0;
float Vin = 5;
float Vout = 0;
float Vout1 = 0;
float Rref = 2180;
float R = 0;
float R1 = 0;
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup() {
Serial.begin(9600);
myservo.attach(9);
}
void loop() {
sensorValue = analogRead(sensorPin);
Vout = (Vin * sensorValue) / 1023;
R = Rref * (1 / ((Vin / Vout) - 1));
Serial.print("R: ");
Serial.println(R);
delay(500);
sensorValue1 = analogRead(sensorPin1);
Vout1 = (Vin * sensorValue1) / 1023;
R1 = Rref * (1 / ((Vin / Vout1) -1));
Serial.print("R1: ");
Serial.println(R1);
delay(500);
if ((R1 > R) && ((R1 -R) > 1000)){
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}
}
if ((R > R1) && ((R -R1) > 1000)) {
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
}
我还看了GreatScott的一个视频!(链接:https://www.youtube.com/watch?v=_6QIutZfsFs)他做这件事的地方。他的设计与我的不同,但我想看看他的代码。他没有展示所有的内容,但这是我设法复制的。我对C++了解不多,所以我真的不知道他在做什么。有人能给我解释一下吗?
int topleft = 0;
int topright = 0;
int bottomleft = 0;
int bottomright = 0;
void setup() {
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
TCCR1A = 0;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = 0;
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
ICR1 = 40000;
OCR1A = 3000;
OCR1B = 3600;
}
void loop() {
topleft = analogRead(A0);
topright = analogRead(A1);
bottomleft = analogRead(A2);
bottomright = analogRead(A3);
if (topleft > topright) {
OCR1A = OCR1A + 1;
delay(15);
}
if (bottomleft > bottomright) {
OCR1A = OCR1A + 1;
delay(15);
}
if (topleft < topright) {
OCR1A = OCR1A - 1;
delay(15);
}
if (bottomleft < bottomright) {
OCR1A = OCR1A - 1;
delay(15);
}
if (OCR1A > 4000) {
OCR1A = 4000;
}
if (OCR1A < 2000) {
OCR1A = 2000;
}
}
发布于 2020-12-22 09:42:49
您不需要一次性知道(或找出)伺服的pos
;您只需将其移动到越来越接近每个回路中所需的位置,直到太阳能电池板正确对齐。
你可以尝试这样的东西,这也是将你引用的最底层的代码粗略地翻译成你的程序术语。
注意:非常粗糙的代码,并不是所有的细节都被处理了,而且它是未经测试的,但你可以理解它的想法。
const int sensorPin0 = A0;
const int sensorPin1 = A1;
int pos = 90; // Start with centered servo
void setup() {
Serial.begin(9600);
myservo.attach(9);
}
void loop() {
analogRead(sensorPin0); // Do measurements twice and use second one
sensorValue0 = analogRead(sensorPin0); // No need to calculate R values;
analogRead(sensorPin1); // the raw values can also be used.
sensorValue1 = analogRead(sensorPin1);
if (sensorValue0 > sensorValue1) { // If value 0 > value 1, then
pos++; // move one degree towards 180 degrees
if (pos > 180) pos = 180; // Limit pos to 0 - 180
}
if (sensorValue0 < sensorValue1) { // If value 0 < value 1, then
pos--; // move one degree towards 0 degrees
if (pos < 0) pos = 0; // Limit pos to 0 - 180
}
myservo.write(pos); // Let servo go to pos
delay(200); // Wait a bit and do it all again
}
在每个回路中,伺服装置将向正确对准的太阳能电池板移动1度。只要两个LDR显示相同的值,它就会一直存在。
请注意,LDR的速度很慢,而且为了获得良好的区分,您可能需要在它们上放置小的防护罩或管子,以防止它们总是获得相同的太阳量。
发布于 2020-12-21 17:39:18
你可以将Servo在计算的方向上移动一点,再次检查灯光是否在该方向上变得更强,然后再次移动……直到光线变暗,然后往回走。
https://stackoverflow.com/questions/65388044
复制相似问题