极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11418|回复: 9

行程开关控制马达问题

[复制链接]
发表于 2013-7-18 20:02:15 | 显示全部楼层 |阅读模式
本帖最后由 ouyangxp 于 2013-7-19 20:17 编辑

有如下问题,4个开关控制两个马达,如图所示,要求:
1.  初始状态,SW1和SW4是闭合的(就是ML和MR压住开关);
2.  ML首先启动(SW1放开),碰到SW2后返回;
3. ML返回后碰到SW1,然后ML停止,MR启动(SW4放开);
4. MR启动后碰到SW5,然后返回;
5. MR压住SW4,此时,MR停止,ML启动;
6. 如此周而复始;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2013-7-18 20:06:02 | 显示全部楼层
本帖最后由 ouyangxp 于 2013-7-19 20:17 编辑

我自己写了一下程序,但是运行老是出错,


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-7-18 20:33:44 | 显示全部楼层
图看得不太明白!!!!
回复 支持 反对

使用道具 举报

发表于 2013-7-19 04:29:29 | 显示全部楼层
刚好最近在谈另一本新书是有关 电机控制的

如果图能正确标记 运行方向 及开关位置

我想 对於站内 诸多逻辑达人 来说,要回答这个问题,并不是件困难的事

我看懂了,你呢?逻辑达人
回复 支持 反对

使用道具 举报

发表于 2013-7-19 04:32:40 | 显示全部楼层
当然 这也是新进人员最容易犯的错
以为自已了解的机械动作,别人就一定也知道

新进人员不一定是新手,可能是有几十年老经验的某范围专家。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-19 11:41:24 | 显示全部楼层
本帖最后由 ouyangxp 于 2013-7-19 20:45 编辑

学长 发表于 2013-7-19 04:32
当然 这也是新进人员最容易犯的错
以为自已了解的机械动作,别人就一定也知道


我是学机械的,对于电子毫无了解,最近才接触Arduino
下面描述一下运动的过程,简单来说就像走路,
一条腿动完后,另一条腿接着动,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-19 11:45:19 | 显示全部楼层
学慧放弃 发表于 2013-7-18 20:33
图看得不太明白!!!!

我已经上传详细解释图,请参考,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-19 13:38:31 | 显示全部楼层
麻烦会的人给予支持,谢谢!
回复 支持 反对

使用道具 举报

发表于 2013-7-19 15:26:08 | 显示全部楼层
ouyangxp 发表于 2013-7-19 11:45
我已经上传详细解释图,请参考,谢谢!

谢谢楼主!!!!!!!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-19 17:31:57 | 显示全部楼层
ouyangxp 发表于 2013-7-19 13:38
麻烦会的人给予支持,谢谢!

自己琢磨了一下,修改成功,因为只是学了几天C语言,所以,还是很多不懂,麻烦帮忙指正一下,谢谢!

//任务:通过按钮控制电机启停和正反转,通过电位计调节电机转速。
int Switch1=5;  //把Switch1(正转)按钮连在数字端口5
int Switch2=6;  //把Switch2(反转)按钮连在数字端口6
int Switch3=7;  //把Switch3(停止)按钮连在数字端口7
int Switch4=12; //把Switch4(正转)按钮连在数字端口10
int Switch5=11; //把Switch5(反转)按钮连在数字端口11
int potpin = 3; // 把电位计连在模拟端口3
int MotorIN1=3;   //数字端口2、3控制电机启停和转向
int MotorIN2=2;  
int MotorIN3=4;  //数字端口4、8控制电机启停和转向
int MotorIN4=8;
int PWMpinMotorL = 9; // 数字端口9输出PWM信号,控制M1电机转速
int PWMpinMotorR = 10; // 数字端口10输出PWM信号,控制M2电机转速
int ML=0;              //定义左右马达切换的判断
int MR=0;
//初始化         
void setup() {
   Serial.begin(9600);
   pinMode(Switch1,INPUT);//把数字端口5、6、7设置输入模式
   pinMode(Switch2,INPUT);
   pinMode(Switch3,INPUT);
   pinMode(Switch4,INPUT);
   pinMode(Switch5,INPUT);
   pinMode(MotorIN1,OUTPUT);//把数字端口2、3设置输入模式
   pinMode(MotorIN2,OUTPUT);
   pinMode(MotorIN3,OUTPUT);
   pinMode(MotorIN4,OUTPUT);
}
//主程序         
void loop() {
  //读取输入Pin脚信号
  int SW1=digitalRead(Switch1);
  int SW2=digitalRead(Switch2);  
  int SW3=digitalRead(Switch3);  
  int SW4=digitalRead(Switch4);
  int SW5=digitalRead(Switch5);

   //如果按下Switch3(总开关)按钮
  if(SW3==LOW) {
  //起始状态1
  if(SW1==LOW && SW4==LOW && ML==0 && MR==0) {
    //电机ML(正转) Start
    digitalWrite(MotorIN1,LOW);
    digitalWrite(MotorIN2,HIGH);
    //电机MR Stop
    digitalWrite(MotorIN3,LOW);
    digitalWrite(MotorIN4,LOW);
  }
   //状态3: ML运行到Switch2处,按下Switch2(ML反转)按钮
  if(SW2==LOW) {
    //ML电机反转
    digitalWrite(MotorIN1,HIGH);
    digitalWrite(MotorIN2,LOW);
    ML+=1;
    MR=0;  //MR数据清零
    Serial.print(ML);
  }
    //状态4: ML返回到Swintch1处,此时switch1作为切换按钮,停止ML,启动MR
  if(SW1==LOW && SW4==LOW && ML!=0 && MR==0) {
    //电机ML Stop
    digitalWrite(MotorIN1,LOW);
    digitalWrite(MotorIN2,LOW);
    //电机MR (正转) Start
    digitalWrite(MotorIN3,LOW);
    digitalWrite(MotorIN4,HIGH);
  }
   //状态6: MR运行到Switch5处,按下Switch5(MR反转)按钮
   if(SW5==LOW) {
    //ML电机反转
    digitalWrite(MotorIN3,HIGH);
    digitalWrite(MotorIN4,LOW);
    MR+=1;
    ML=0; //ML数据清零
    Serial.print(MR);
  }
    //状态7: MR返回到Swintch4处,此时switch4作为切换按钮,停止MR,启动ML
    if(SW1==LOW && SW4==LOW && ML==0 && MR!=0) {
    //电机MR Stop
    digitalWrite(MotorIN3,LOW);
    digitalWrite(MotorIN4,LOW);
    //电机ML (正转) Start
    digitalWrite(MotorIN1,LOW);
    digitalWrite(MotorIN2,HIGH);
  }
/*
  int sensorValue = analogRead(potpin); //读取电位计采样值           
  sensorValue = sensorValue/4; // 采样值 0-1024 转换为 0-255
  */
  int sensorValue = 50;
  analogWrite(PWMpinMotorL, sensorValue);//把处理后的转换值以PWM信号形式输出
  analogWrite(PWMpinMotorR, sensorValue);//把处理后的转换值以PWM信号形式输出
  delay(20);//延时
   }
  //如果按下Switch3(停止)按钮
   else{
    //电机停止
    digitalWrite(MotorIN1,LOW);
    digitalWrite(MotorIN2,LOW);
    digitalWrite(MotorIN3,LOW);
    digitalWrite(MotorIN4,LOW);
  }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-6-4 01:11 , Processed in 0.046672 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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