首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RobotC -电梯编程

RobotC -电梯编程
EN

Stack Overflow用户
提问于 2013-11-10 05:18:41
回答 3查看 10.8K关注 0票数 4

我正在为一个高中项目设计和编程一个类似电梯的机器人。我能做些什么让这件事变得更简单吗?或者更好?我附加了一张我在AutoCAD Inventor中制作的带有标签的设计图片。

对于那些不熟悉RobotC或VEX (它与C和C++非常相似)的人: limit开关(limit1,limit2,...)和凹凸开关(floor1、floor2等)是模拟按钮,如果未按下则返回值0,如果按下则返回值1。马达(mainMotor)转动齿轮,使机构在滑道上向上移动。当伸出电机机构的轴上下移动时,它按下限位开关并使其返回值1。

代码语言:javascript
复制
int callup [3];
int calldown [3];
int floorat[3];

    int main ()
    {

        if (SensorValue[limit1] == 1)
        {
            floorat[0] = 1;
        }
        else
        {
            floorat[0] = 0;
        }

        if (SensorValue[limit2] == 1)
        {
            floorat[1] = 1;
        }
        else
        {
            floorat[1] = 0;
        }

        if (SensorValue[limit3] == 1)
        {
            floorat[2] = 1;
        }
        else
        {
            floorat[2] = 0;
        }

        if (SensorValue[floor1] == 1)
        {
            calldown[0] = 1;
            SensorValue[LED1] = 1;
        }

        if (SensorValue[floor2] == 1 && floorat[2] == 1)
        {
            calldown[1] = 1;
            SensorValue[LED2] = 1;
        }

        if (SensorValue[floor2] == 1 && floorat[0] == 1)
        {
            callup[1] = 1;
            SensorValue[LED2] = 1;
        }

        if (SensorValue[floor3])
        {
            callup[2] = 1;
            SensorValue[LED3] = 1;
        }

        motors ();

    }


    void motors ()
    {

        if (callup[2] == 1 && floorat[2] == 1)
        {
            int x = 1;
            while (x < 3)
            {
                SensorValue[LED3] = 1;
                wait(0.5);
                SensorValue[LED3] = 0;
                wait(0.5);
            }
            callup[2] = 0;
            main ();
        }
        else if (callup[1] == 1 && floorat[1] == 1)
        {
            int x = 1;
            while (x < 3)
            {
                SensorValue[LED2] = 1;
                wait(0.5);
                SensorValue[LED2] = 0;
                wait(0.5);
            }
            callup[1] = 0;
            main ();
        }
        else if (callup[0] == 1 && floorat[0] == 1)
        {
            int x = 1;
            while (x < 3)
            {
                SensorValue[LED1] = 1;
                wait(0.5);
                SensorValue[LED1] = 0;
                wait(0.5);
            }
            callup[0] = 0;
            main ();
        }

        if (callup[2] == 1 && floorat[1] == 1 && calldown[0] == 0 || callup[2] == 1 && floorat[0] == 1 && callup[1] == 0)
        {
            startMotor(mainMotor, 60);
            untilTouch(limit3);
            stopMotor(mainMotor);
            callup[2] = 0;
            wait(1);
            main ();
        }

        if (callup[1] == 1 && floorat[0] == 1)
        {
            startMotor(mainMotor, 60);
            untilTouch(limit2);
            stopMotor(mainMotor);
            callup[1] = 0;
            wait(1);
            main();
        }

        if (calldown[1] == 1 && floorat[2] == 1)
        {
            startMotor(mainMotor, -60);
            untilTouch(limit2);
            stopMotor(mainMotor);
            calldown[1] = 0;
            wait(1);
            main();
        }

        if (calldown[0] == 1 && floorat[2] == 1 && calldown[1] == 0 || calldown[0] == 1 && floorat[1] == 1)
        {
            startMotor(mainMotor, -60);
            untilTouch(limit1);
            stopMotor(mainMotor);
            calldown[0] = 0;
            wait(1);
            main();
        }
    }

虽然这不应该是这个问题的问题,但startMotor命令中的60是电机的速度,只是为了让它更清楚。

请随时提出更多问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-10 05:51:54

我不熟悉RobotC或VEX,但是我注意到有一定数量的复制操作可以放入它们自己的函数中。

下面的代码片段我会放在不同的函数中。因此,在称为马达的大型函数中,您有以下一组操作:

代码语言:javascript
复制
    int x = 1;
    while (x < 3)
    {
        SensorValue[LED3] = 1;
        wait(0.5);
        SensorValue[LED3] = 0;
        wait(0.5);
    }
    callup[2] = 0;
    main ();

使用略有不同的值重复此操作。

在这里,我会编写一个如下所示的函数:

代码语言:javascript
复制
void adjust_sensors( size_t led, size_t level )
{
    int x = 1;
    while (x < 3)
    {
        SensorValue[led] = 1;
        wait(0.5);
        SensorValue[led] = 0;
        wait(0.5);
    }
    callup[level] = 0;
    main ();
}

您也可以对以下代码执行相同的操作:

代码语言:javascript
复制
startMotor(mainMotor, 60);
untilTouch(limit3);
stopMotor(mainMotor);
callup[2] = 0;
wait(1);
main ();

而且,看起来while循环永远不会结束,因为x的值永远不会改变。

当您声明时,在顶部也有一个拼写错误:

代码语言:javascript
复制
int callown [2];

我想你的意思是:

代码语言:javascript
复制
int calldown [2];

为了清晰起见,最好也给你的代码添加一些注释。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2013-11-10 06:07:31

让我们定义电梯在给定时刻的状态:

电梯可以go updown,或者be

电梯位于给定的 floor ,并在触发开关时从一个楼层到另一个楼层:

现在,如果我们将其转换为一些伪代码(应该可以很容易地转换为RobotC):

代码语言:javascript
复制
enum elevator_status = { idle, down, up };
int currentfloor; //1, 2, 3 


switch(elevator_status)
{
    case idle:    
        //we check if a button is pressed and possibly go up or down           
        if(SensorValue(floor1))
        {         
             if(currentfloor > 1)
                elevator_status = down;               
        }
        else if(SensorValue(floor2))
        {
              if(currentfloor > 2)
                  elevator_status = down;
              else if(currentfloor < 2)
                  elevator_status = up;               
        }
        else if(SensorValue(floor3))
        {
              if(currentfloor < 3)
                  elevator_status = up;   
        }
        break;

    case up:
    case down:    
        //we check if we trigger a floor switch and stop the elevator
        if(SensorValue(limit1))
        {      
           currentfloor = 1;
           elevator_status = idle;
        }
        else if(SensorValue(limit2))
        {
           currentfloor = 2;
           elevator_status = idle;
        }
        else if(SensorValue(limit3))
        {
           currentfloor = 3;
           elevator_status = idle;
        }
        break;
}


//we set the speed of the motor
if(elevator_status == up)
{
   set_motorstate(cw);
)
else if(elevator_status == down)
{
   set_motorstate(ccw);   
}
else if(elevator_status == idle)
{
   set_motorstate(idle);   
}

注意:在这段代码中,电梯只会在电梯空闲时处理新的上下楼层调用。它不会在移动时存储up和down调用,然后再去那里。我不知道这是不是对你的要求。

票数 3
EN

Stack Overflow用户

发布于 2013-11-10 05:45:36

我可能走错了,因为我只是一个学生,有自己的问题,但看起来你可能在你的数组大小上犯了一个错误。例如,当您声明:

代码语言:javascript
复制
int floorat[2];

这使得数组大小为2。然后引用数组中的3个元素位置0,1,2。此外,您不能只使用常规整数,并将其赋值为1,2或3吗?

我建议将这些变量重新定义为:

代码语言:javascript
复制
int callup;
int calldown;
int floorat;

然后,您可以避免额外的代码行,并将if/else子句简化为:

代码语言:javascript
复制
if (SensorValue[limit1] == 1)
{
    floorat = 1;
}

if (SensorValue[limit2] == 1)
{
    floorat = 2;
}


if (SensorValue[limit3] == 1)
{
    floorat = 3;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19883220

复制
相关文章

相似问题

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