求助arduino舵机和LED灯的联动问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3271|回复: 10

[未解决] 求助arduino舵机和LED灯的联动问题

[复制链接]
发表于 2021-11-5 09:05 | 显示全部楼层 |阅读模式
控制一到两个舵机,每个舵机分配6个LED灯,舵机每转动30度就亮起一个灯,每回转30度就熄灭一个灯,现在遇到困难了,希望有高手帮帮忙,万分感谢!
发表于 2021-11-12 16:10 | 显示全部楼层
本帖最后由 lwq1947 于 2021-11-12 16:29 编辑
貌似皇帝 发表于 2021-11-12 15:02
不好意思仓促了,这是完整的:#include
const int LED1=5;
const int LED2=3;

#include <Servo.h>
const int LED1=5;
const int LED2=3;
const int LED3=6;
const int LED4=9;
const int LED5=10;
Servo myservo;
int pos=0;
  
void setup() {
  myservo.attach(11);
  myservo.write(0);
   delay(1000);
}
void loop()
{              
    myservo.write(pos=30);
analogWrite(LED1,500);
  delay(2000);
    myservo.write(pos=60);
      analogWrite(LED2,500);   
  delay(2000);
    myservo.write(pos=90);
      analogWrite(LED3,500);      
  delay(2000);
    myservo.write(pos=120);
      analogWrite(LED4,500);
   delay(2000);
    myservo.write(pos=150);
      analogWrite(LED5,500);
   delay(2000);
    myservo.write(pos=120);   
      analogWrite(LED5,0);   
  delay(2000);   
myservo.write(pos=90);
      analogWrite(LED4,0);  
   delay(2000);        
myservo.write(pos=60);  
      analogWrite(LED3,0);
   delay(2000);            
myservo.write(pos=30);
      analogWrite(LED2,0);
   delay(2000);      
myservo.write(pos=0);
      analogWrite(LED1,0);
    delay(1000);
    }        
发表于 2021-11-5 11:20 | 显示全部楼层
for (pos = 0; pos <= 180; pos += 1) {
    myservo.write(pos);              
    delay(15);                     
  }
在循环中加6个if语句来判断pos值是否等于30,60....来控制LED灯的相应端口.
 楼主| 发表于 2021-11-10 09:55 | 显示全部楼层

谢谢,抱歉这么晚回复,我试了你的代码后,舵机一转LED灯就亮了怎么回事,方便指导一下吗?感谢!
发表于 2021-11-10 12:42 | 显示全部楼层
貌似皇帝 发表于 2021-11-10 09:55
谢谢,抱歉这么晚回复,我试了你的代码后,舵机一转LED灯就亮了怎么回事,方便指导一下吗?感谢! ...



#include <Servo.h>

Servo myservo;  

int pos = 0;   

void setup() {
  myservo.attach(9);
   pinMode(7,OUTPUT);
digitalWrite(7,LOW);
  pinMode(6,OUTPUT);
digitalWrite(6,LOW);

void loop() {
  for (pos = 0; pos <= 30; pos += 1) {
    myservo.write(pos);  
   delay(15);                     
  }  
   digitalWrite(6,HIGH);
   for (pos = 31; pos <= 120; pos += 1) {
    myservo.write(pos);  
   delay(15);                     
  }  
   digitalWrite(7,HIGH);
for (pos = 120; pos <= 180; pos += 1) {
    myservo.write(pos);  
   delay(15);                     
  }  
  for (pos = 180; pos >= 120; pos -= 1) {
    myservo.write(pos);
     delay(15);                     
  }
    digitalWrite(7,LOW);
     for (pos = 119; pos >= 30; pos -= 1) {
    myservo.write(pos);
     delay(15);                       
  }
    digitalWrite(6,LOW);
    for (pos = 29; pos >= 0; pos -= 1) {
    myservo.write(pos);
     delay(15);                       
  }
   
}
这是两个LED灯的,你自己参照增加LED灯的数量.
 楼主| 发表于 2021-11-12 08:38 | 显示全部楼层
lwq1947 发表于 2021-11-10 12:42
#include

Servo myservo;  

好的,谢谢,这个问题解决了,最后还有一个问题,我把舵机正转一次,再反转一遍后,第二遍循环时正转直接就转到最大角度,不再像我事先设定好的一步一步转,这是怎么回事?代码如下:
void loop()
{
  

for (pos = 0; pos <= 150; pos += 1) {
    myservo.write(pos=30);
  delay(0);
analogWrite(LED1,500);
  
  delay(2000);
for (pos =30; pos <= 150; pos += 1) {
    myservo.write(pos=60);
  delay(0);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      
  delay(2000);
  for (pos = 60; pos <= 150; pos += 1) {
    myservo.write(pos=90);
  delay(0);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      
  delay(2000);
  for (pos = 90; pos <= 150; pos += 1) {
    myservo.write(pos=120);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      analogWrite(LED4,500);
   delay(2000);
for (pos = 120; pos <= 150; pos += 1) {
    myservo.write(pos=150);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      analogWrite(LED4,500);
      analogWrite(LED5,500);
   delay(2000);
      for(pos = 150; pos>=120; pos-=1) //从150度到120度运动
{
     myservo.write(pos=120); // 指定舵机转向的角度
    delay(1); // 等待15ms让舵机到达指定位置
      
       analogWrite(LED5,0);
      
  delay(2000);
         for(pos = 120; pos>=90; pos-=1) //从120度到90度运动
{
myservo.write(pos=90); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED4,0);
      analogWrite(LED5,0);
     
   delay(2000);
            for(pos = 90; pos>=60; pos-=1) //从90度到60度运动
{
myservo.write(pos=60); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      
      analogWrite(LED3,0);
      analogWrite(LED4,0);
      analogWrite(LED5,0);
     
   delay(2000);
               for(pos = 60; pos>=30; pos-=1) //从60度到0度运动
{
myservo.write(pos=30); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED2,0);
      analogWrite(LED3,0);
      analogWrite(LED4,0);     
      analogWrite(LED5,0);

   delay(2000);
               for(pos = 30; pos>=0; pos-=1) //从30度到0度运动
{
myservo.write(pos=0); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED1,0);
      analogWrite(LED2,0);
      analogWrite(LED3,0);
      analogWrite(LED4,0);
      analogWrite(LED5,0);
      delay(1000);
发表于 2021-11-12 11:10 | 显示全部楼层
貌似皇帝 发表于 2021-11-12 08:38
好的,谢谢,这个问题解决了,最后还有一个问题,我把舵机正转一次,再反转一遍后,第二遍循环时正转直接 ...

这是你的正确程序吗,缺了那么多},舵机能转动吗?
 楼主| 发表于 2021-11-12 15:02 | 显示全部楼层
lwq1947 发表于 2021-11-12 11:10
这是你的正确程序吗,缺了那么多},舵机能转动吗?

不好意思仓促了,这是完整的:#include <Servo.h>
const int LED1=5;
const int LED2=3;
const int LED3=6;
const int LED4=9;
const int LED5=10;
Servo myservo;
int pos=0;


void setup() {
  myservo.attach(11);
  
}

void loop()
{
   
                  {for (pos = 0; pos <= 150; pos += 1) {
    myservo.write(pos=30);
  delay(1);
analogWrite(LED1,500);
  
  delay(2000);
for (pos =30; pos <= 150; pos += 1) {
    myservo.write(pos=60);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      
  delay(2000);
  for (pos = 60; pos <= 150; pos += 1) {
    myservo.write(pos=90);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      
  delay(2000);
  for (pos = 90; pos <= 150; pos += 1) {
    myservo.write(pos=120);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      analogWrite(LED4,500);
   delay(2000);
for (pos = 120; pos <= 150; pos += 1) {
    myservo.write(pos=150);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      analogWrite(LED4,500);
      analogWrite(LED5,500);
   delay(2000);
      for(pos = 150; pos>=120; pos-=1) //从150度到120度运动
{
     myservo.write(pos=120); // 指定舵机转向的角度
    delay(1); // 等待15ms让舵机到达指定位置
      
       analogWrite(LED5,0);
      
  delay(2000);
         for(pos = 120; pos>=90; pos-=1) //从120度到90度运动
{
myservo.write(pos=90); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED4,0);
      analogWrite(LED5,0);
     
   delay(2000);
            for(pos = 90; pos>=60; pos-=1) //从90度到60度运动
{
myservo.write(pos=60); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      
      analogWrite(LED3,0);
      analogWrite(LED4,0);
      analogWrite(LED5,0);
     
   delay(2000);
               for(pos = 60; pos>=30; pos-=1) //从60度到0度运动
{
myservo.write(pos=30); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED2,0);
      analogWrite(LED3,0);
      analogWrite(LED4,0);     
      analogWrite(LED5,0);

   delay(2000);
               for(pos = 30; pos>=0; pos-=1) //从30度到0度运动
{
myservo.write(pos=0); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED1,0);
      analogWrite(LED2,0);
      analogWrite(LED3,0);
      analogWrite(LED4,0);
      analogWrite(LED5,0);
      delay(1000);
           
                 
                 for (pos = 0; pos <= 150; pos += 1) {
    myservo.write(pos=30);
  delay(1);
analogWrite(LED1,500);
  delay(2000);                  
for (pos =30; pos <= 150; pos += 1) {
    myservo.write(pos=60);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      
  delay(2000);
  for (pos = 60; pos <= 150; pos += 1) {
    myservo.write(pos=90);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      
  delay(2000);
  for (pos = 90; pos <= 150; pos += 1) {
    myservo.write(pos=120);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      analogWrite(LED4,500);
   delay(2000);
for (pos = 120; pos <= 150; pos += 1) {
    myservo.write(pos=150);
  delay(1);
      analogWrite(LED1,500);
      analogWrite(LED2,500);
      analogWrite(LED3,500);
      analogWrite(LED4,500);
      analogWrite(LED5,500);
   delay(2000);
   for(pos = 150; pos>=120; pos-=1) //从150度到120度运动
{
     myservo.write(pos=120); // 指定舵机转向的角度
    delay(1); // 等待15ms让舵机到达指定位置
      
       analogWrite(LED5,0);
      
  delay(2000);
         for(pos = 120; pos>=90; pos-=1) //从120度到90度运动
{
myservo.write(pos=90); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED4,0);
      analogWrite(LED5,0);
     
   delay(2000);
            for(pos = 90; pos>=60; pos-=1) //从90度到60度运动
{
myservo.write(pos=60); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      
      analogWrite(LED3,0);
      analogWrite(LED4,0);
      analogWrite(LED5,0);
     
   delay(2000);
               for(pos = 60; pos>=30; pos-=1) //从60度到0度运动
{
myservo.write(pos=30); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED2,0);
      analogWrite(LED3,0);
      analogWrite(LED4,0);     
      analogWrite(LED5,0);

   delay(2000);
               for(pos = 30; pos>=0; pos-=1) //从30度到0度运动
{
myservo.write(pos=0); // 指定舵机转向的角度
delay(1); // 等待15ms让舵机到达指定位置
      analogWrite(LED1,0);
      analogWrite(LED2,0);
      analogWrite(LED3,0);
      analogWrite(LED4,0);
      analogWrite(LED5,0);
      delay(1000);
  
   
   
}   
      
               }}}}}}}}}}}}}}}}}}}}}
 楼主| 发表于 2021-11-15 18:22 | 显示全部楼层
lwq1947 发表于 2021-11-12 16:10
#include
const int LED1=5;
const int LED2=3;

感谢您帮我简化修改了代码,现在完美运行了,但我还想加个按钮上去,例如:按一下按钮舵机就转一次,或者按一下就改变舵机的旋转速度之类的,这样的怎么实现呢?望不吝赐教,谢谢!
发表于 2021-11-16 06:33 | 显示全部楼层
貌似皇帝 发表于 2021-11-15 18:22
感谢您帮我简化修改了代码,现在完美运行了,但我还想加个按钮上去,例如:按一下按钮舵机就转一次,或者 ...

在void loop()中的开头加一个if(digitalRead(4)==LOW)//你的按纽接在上拉的端口4与GND上.
{ 简化修改后的代码 }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 21:45 , Processed in 0.072577 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表