ouyangxp 发表于 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. 如此周而复始;

ouyangxp 发表于 2013-7-18 20:06:02

本帖最后由 ouyangxp 于 2013-7-19 20:17 编辑

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


学慧放弃 发表于 2013-7-18 20:33:44

图看得不太明白!!!!

学长 发表于 2013-7-19 04:29:29

刚好最近在谈另一本新书是有关 电机控制的

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

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

我看懂了,你呢?逻辑达人

学长 发表于 2013-7-19 04:32:40

当然 这也是新进人员最容易犯的错
以为自已了解的机械动作,别人就一定也知道

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

ouyangxp 发表于 2013-7-19 11:41:24

本帖最后由 ouyangxp 于 2013-7-19 20:45 编辑

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



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

ouyangxp 发表于 2013-7-19 11:45:19

学慧放弃 发表于 2013-7-18 20:33 static/image/common/back.gif
图看得不太明白!!!!

我已经上传详细解释图,请参考,谢谢!

ouyangxp 发表于 2013-7-19 13:38:31

麻烦会的人给予支持,谢谢!
:lol:lol:lol:lol:lol:lol:lol:lol

学慧放弃 发表于 2013-7-19 15:26:08

ouyangxp 发表于 2013-7-19 11:45 static/image/common/back.gif
我已经上传详细解释图,请参考,谢谢!

谢谢楼主!!!!!!!!!

ouyangxp 发表于 2013-7-19 17:31:57

ouyangxp 发表于 2013-7-19 13:38 static/image/common/back.gif
麻烦会的人给予支持,谢谢!

自己琢磨了一下,修改成功,因为只是学了几天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);
}
}
页: [1]
查看完整版本: 行程开关控制马达问题