6 years, 6 months ago.

2つのプログラムを同時に動作させる方法

御世話になっております。

申し訳ありません、2つのプログラムを同時に動作させる方法について教えてください。

サーボモータ4個を6行から47行目までの関数を作って動作させるにあたり 59行目から61行目と、67行目から69行目までを同時に動作させたいのですが 良い方法はありませんでしょうか。

1   #include "mbed.h" 2 3  PwmOut LeftShoulder(p21),LeftElbow(p22); 4  PwmOut RightShoulder(p24),RightElbow(p25); 5 6  int LeftArmSo0() 7  { 8  LeftShoulder.pulsewidth_us(2389); 9  LeftElbow.pulsewidth_us(1067); 10  wait(0.5); 11  return 0; 12 } 13  int LeftArmSi1() 14  { 15  LeftShoulder.pulsewidth_us(1611); 16  LeftElbow.pulsewidth_us(667); 17  wait(0.5); 18  return 0; 19  } 20  int LeftArmDo3() 21  { 22  LeftShoulder.pulsewidth_us(778); 23  LeftElbow.pulsewidth_us(1389); 24  wait(0.5); 25  return 0; 26  } 27  int RightArmSo0() 28  { 29  RightShoulder.pulsewidth_us(2222); 30  RightElbow.pulsewidth_us(1500); 31  wait(0.5); 32  return 0; 33  } 34  int RightArmSi1() 35  { 36  RightShoulder.pulsewidth_us(1278); 37  RightElbow.pulsewidth_us(2278); 38  wait(0.5); 39  return 0; 40  } 41  int RightArmDo3() 42  { 43  RightShoulder.pulsewidth_us(700); 44  RightElbow.pulsewidth_us(1833); 45  wait(0.5); 46  return 0; 47  } 48 49  int main() 50  { 51  while(1) 52  { 53  LeftShoulder.pulsewidth_us(2500); 54  LeftElbow.pulsewidth_us(1500); 55  RightShoulder.pulsewidth_us(500); 56  RightElbow.pulsewidth_us(1500); 57  wait(2); 58 59  LeftArmSo0(); 60  LeftArmSi1(); 61  LeftArmDo3(); 62 63  LeftShoulder.pulsewidth_us(2500); 64  LeftElbow.pulsewidth_us(1500); 65  wait(2); 66 67  RightArmSo0(); 68  RightArmSi1(); 69  RightArmDo3(); 70  } 71  }

1 Answer

6 years, 6 months ago.

こんにちは。

まず、ソースをポストするときには
< < code > > ソース < < / code > >
という書式でポストしていただくと
読めるコードになると思います。
※ < と > の間にスペースはいれません。

二つのプログラムを同時に動作させる
ということを厳密に受け止めると マルチタスクOSを使用するか、
FPGAのようなハードウェアを使用することが 必要になるかと思います。
“だいたい同時に”ということであれば 下記のようなアプローチは如何でしょうか?

(1) 各パーツ関数にある wait(0.5) を外す。
(2) main関数内で下記のように並び替える。

int main()
{
	while(1) {
		LeftShoulder.pulsewidth_us(2500) ;
		LeftElbow.pulsewidth_us(1500) ;
		RightShoulder.pulsewidth_us(500) ;
		RightElbow.pulsewidth_us(1500) ;
		wait(2) ;

		LeftArmSo0() ;
		RightArmSo0() ;
		wait(0.5) ;

		LeftArmSi1() ;
		RightArmSi1() ;
		wait(0.5) ;

		LetArmDo3() ;
		RightArmDo3() ;
		wait(0.5) ;
	}
}

moto

Accepted Answer

お世話になります。

分かりずらい問い合わせになってしまい申し訳ありません。 回答いただきましてありがとうございます。

教えていただいた内容で作り直してみます。

よろしければ マルチタスクOSを使用した場合どうなるのかも 教えていただけませんでしょうか。

posted by hiroshi matsubara 07 May 2018

実験できるハードウェアが無いので printf だけでテストプログラムを書いてみました。
プログラムは mbed OS Blinky LED HelloWorld をテンプレートにして作成後、main.cpp を
以下のようにモディファイしました。

この場合、右と左は独立に動いてしまいますので、なんらかの同期手段を用意する必要があると思います。

恐らく main の中で、それぞれの thread に対して同期をとるような手法が必要になると思いますが、
そのあたりは "thread" "同期" などでググって研究してみていただけたならと思います。

#include "mbed.h"

Thread left_arm ;
Thread right_arm ;

void LeftArmHome(void)
{
    printf("Left Arm Home position\n") ;
//    LeftShoulder.pulsewidth_us(2500); 
//    LeftElbow.pulsewidth_us(1500); 
}

void LeftArmSo0(void)
{
    printf("Left So0\n") ;
}

void LeftArmSi1(void)
{
    printf("Left Si1\n") ;
}

void LeftArmDo3(void)
{
    printf("Left Do3\n") ;
}

void RightArmHome(void)
{
    printf("\t\t\tRight Arm Home position\n") ;
//    RightShoulder.pulsewidth_us(500);
//    RightElbow.pulsewidth_us(1500); 
}

void RightArmSo0(void)
{
    printf("\t\t\tRight So0\n") ;
}

void RightArmSi1(void)
{
    printf("\t\t\tRight Si1\n") ;
}

void RightArmDo3(void)
{
    printf("\t\t\tRight Do3\n") ;
}

void left_arm_thread(void) 
{
    while(1) {
        LeftArmHome() ;
        wait(2) ;
        
        LeftArmSo0() ;
        wait(0.5) ;
        LeftArmSi1() ;
        wait(0.5) ;
        LeftArmDo3() ;
        wait(2) ;
    }
}

void right_arm_thread(void)
{
    while(1) {
        RightArmHome() ;
        wait(2) ;

        RightArmSo0() ;
        wait(0.5) ;
        RightArmSi1() ;
        wait(0.5) ;
        RightArmDo3() ;
        wait(2) ;
    }
}


int main() {
    left_arm.start(left_arm_thread) ;
    right_arm.start(right_arm_thread) ;
    
    while(1) {

    }
}
posted by Motoo Tanaka 08 May 2018

何度も申し訳ありません。

勉強になりました。 ありがとうございました。

posted by hiroshi matsubara 08 May 2018

Assigned to hiroshi matsubara 6 years, 6 months ago.

This means that the question has been accepted and is being worked on.