【发布时间】:2013-11-09 21:18:41
【问题描述】:
我正在为一个高中项目设计和编程一个类似电梯的机器人。我可以做些什么来让这更简单吗?或更好?我附上了一张我在 AutoCAD Inventor 中制作的带有标签的设计图片。
对于那些不熟悉 RobotC 或 VEX(它与 C 和 C++ 非常相似)的人:限位开关(limit1、limit2、...)和碰撞开关(floor1、floor2、...)是模拟按钮和如果未按下则返回值 0,如果按下则返回 1。电机(mainMotor)旋转齿轮,使机构在滑块上向上移动。当伸出电动机构的轴上下移动时,它按下限位开关并使其返回值1。
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是电机的速度,只是为了更清楚。
如有任何问题,请随时提出。
【问题讨论】:
-
如果语言允许,您可以考虑如何用表格来表示您的电梯系统。考虑一下 100 层而不是 3 层的代码可能是什么样子。您将如何编写这样的代码,以便仅几行代码就可以查询更大的表/数据结构集以知道该怎么做?
-
您可能还需要考虑使用
while循环。真的,除了main()的无底递归和调用之外的任何东西都会更好。别介意调用main()是一个禁忌,递归最终会毁掉你的堆栈。 -
我可以使用 while 循环和/或 for 循环。但我没有在这里使用它们,因为真正需要循环的唯一楼层是 floor2,而且手动输入代码更容易。
-
这样做可能更容易,但除非 VEX 与普通 C 非常不同,否则您的实现最终会崩溃。我更喜欢我的电梯可靠。 :)
-
我该怎么做才能不必一遍又一遍地引用 main() ?它基本上是带有特殊变量的 C,因此 C 用户的建议也会有所帮助。