我编写的代码使LED闪烁并将伺服器移动到几个不同的方向。这是基本结构:
while(true){
//led on
//wait
//led off
//wait
}
while(true){
//servo to 45
//servo to 90
//servo to 270
}
我希望两者同时运行。上面的代码只打开LED,并且无限循环,因为它在循环中。伺服永远不会起作用。我在这里查看了其他问题,但我找不到任何相关内容。
如何让LED和伺服同时工作?
答案 0 :(得分:0)
一般来说,你不能使用两个无限循环。这是因为它是一个序列程序,因此在第一个程序完成之前它不能运行第二个程序。因此,如果第一个循环是无限的,那么第二个循环将永远不会运行。
要做某种多线程',最简单的方法是使用定时器和中断。
在您的情况下,您想要运行两个不同的任务。闪烁LED和转向伺服系统。当你使用wait()/ sleep()/ delay()时,uC只是停止(除了处理interupts之类的其他东西等)。所以你可以设置定时器并在中断闪烁导致。或者更好的中断只是设置一些标志,并在你的主要只检查标志是否已更改。不只是处理眨眼。所以一般来说,你会有这样的主题:
volatile uint8_t nowBlink = 0
ISR(TIMER1_OVF_vect)
{
// some timer handling and then:
nowBlink = 1
}
loop(){
if(nowBlink){
toggleLed();
nowBlink = 0;
}
setServo(123123);
}
将intterupt设置为1秒,将使用1 Hz的频率闪烁你的led,然后程序的其他部分将完成。
Here你有定时器解释,Here你有一些库。请阅读,你应该掌握arduino。
最好的问候,voodoo16。
答案 1 :(得分:0)
不要使用delay_ms(),wait()等函数。尝试中断。
使用这样的结构:
int flag = 0;
void func_delay_50ms () interrupt
{
// set initial condition
flag ++;
}
void main
{
while (1)
{
if (flag == 4) // per 200ms
{
led = -led;
flag = 0;
}
if (!(flag % 2)) // per 100ms
{
servo ();
}
}
}
注意:servo()不应该长时间阻塞。
没有真正的并行线程,你应该创造一种幻觉来实现它。
(:з」<)我的英语不好。请原谅我。
答案 2 :(得分:0)
闪烁LED并不需要MCU上的代码。您可以使用定时器和PWM信号。 https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
答案 3 :(得分:0)
我为Arduino编写了一个操作系统,它支持多线程以便一次运行多个循环。请注意,伺服的范围为0-180。你不能转入270度。您可以在https://github.com/DrBubble/ArduinoOS找到源代码和进一步的文档。
在ArduinoOS下运行时,此示例代码应该完全符合您的要求。
#include "KernelInitializer.h"
#include "Servo.h"
#include "Led.h"
void setup()
{
KernelInitializer::InitializeKernel(mainThread);
}
void mainThread()
{
InitTask(secondThread);
while (true)
{
Led led(2); // replace 2 with the pin of your led
while (true)
{
led.TurnOn();
sleep(1000);
led.TurnOff();
sleep(1000);
}
}
}
void secondThread()
{
Servo servo(9); // replace 9 with the pin of your servo
while (true)
{
servo.SetValue(45);
sleep(1000);
servo.SetValue(90);
sleep(1000);
servo.SetValue(180);
sleep(1000);
}
}
答案 4 :(得分:0)
您可以简单地使用goto语句
在两个循环中.....如果使用goto,甚至不需要循环,就像在汇编语言中一样。
c代码是:
#include<stdio.h>
int main()
{
int count;
loop1:for(;;)
{
printf("Loop 1\n");
goto loop2;
}
loop2:for(;;)
{
printf("Loop 2\n");
goto loop1;
}
return 0;
}