首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Arduino:如何在不知道伺服需要移动到的确切位置的情况下移动伺服

Arduino:如何在不知道伺服需要移动到的确切位置的情况下移动伺服
EN

Stack Overflow用户
提问于 2020-12-21 13:47:04
回答 2查看 70关注 0票数 1

我正在尝试制作一个太阳能电池板,通过比较4个光敏电阻的电阻来跟踪太阳。我已经编码了决定光敏电阻电阻的部分(我目前只用2测试),但我正在努力使伺服运动部分正确。我不知道太阳在天空中的确切位置,我只知道伺服系统需要移动什么方向才能使太阳能电池板面对太阳。我需要告诉伺服在一个特定的方向上移动,直到光敏电阻的电阻在一定的范围内(我已经创建了这个)。有人知道怎么做吗?

这是我所拥有的。

代码语言:javascript
运行
复制
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++了解不多,所以我真的不知道他在做什么。有人能给我解释一下吗?

代码语言:javascript
运行
复制
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;
    }
   
}
EN

回答 2

Stack Overflow用户

发布于 2020-12-22 09:42:49

您不需要一次性知道(或找出)伺服的pos;您只需将其移动到越来越接近每个回路中所需的位置,直到太阳能电池板正确对齐。

你可以尝试这样的东西,这也是将你引用的最底层的代码粗略地翻译成你的程序术语。

注意:非常粗糙的代码,并不是所有的细节都被处理了,而且它是未经测试的,但你可以理解它的想法。

代码语言:javascript
运行
复制
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的速度很慢,而且为了获得良好的区分,您可能需要在它们上放置小的防护罩或管子,以防止它们总是获得相同的太阳量。

票数 1
EN

Stack Overflow用户

发布于 2020-12-21 17:39:18

你可以将Servo在计算的方向上移动一点,再次检查灯光是否在该方向上变得更强,然后再次移动……直到光线变暗,然后往回走。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65388044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档