マルチタスクとかマルチスレッドとか検索してたら、次の記事を見つけました。
早速真似してやってみました。上記にも記載がありますが、
からダウンロードした「TimedAction.h」内の「#include "WProgram.h"」を「#include "Arduino.h"」に変更する必要があります。
ただなぞるのもつまらないので次のようなストーリーを考えました。
親父は「MsTimer2」で2秒間隔で動き、その都度乱数でお話相手を選びます。母親は親父に話す機会を与えられオロオロしますが、これまた乱数で話す時間を勝手に決め終了します。話す機会を与えられて、特性の異なる求婚者4人はそれぞれ自己アピールします。母親と彼らに「TimedAction」の「プロトスレッド」なるものを使ってみました。母親と求婚者4人を懸命に捌く親父をイメージしてください。(でも一番大変なのは娘のNanoですよね)
以下、一応 arduino Nano 用のソースです。時間のずれを少なくするつもりで「65536=2^16」を超えない所で"delayMicroseconds"を使ってます。
#include <TimedAction.h>
#include <MsTimer2.h>
void ororo();
void t2();
void t4();
void t5();
void t6();
TimedAction HAHA = TimedAction(250, ororo); // 0.250秒毎にチェックに行く?
TimedAction Task2 = TimedAction(250, t2);
TimedAction Task4 = TimedAction(250, t4);
TimedAction Task5 = TimedAction(250, t5);
TimedAction Task6 = TimedAction(250, t6);
void setup() {
Serial.begin(115200);
if(!Serial.available()){;}
// Omit Pin3
pinMode(13, OUTPUT);
pinMode(7, OUTPUT); // digitalWrite
pinMode(2, OUTPUT); // digitalWrite
pinMode(4, OUTPUT); // digitalWrite
pinMode(5, OUTPUT); // analogWrite
pinMode(6, OUTPUT); // analogWrite
MsTimer2::set(2000, OYAJI); // Pin3 to disabled. Used by MsTimer2.?
MsTimer2::start();
}
int rN,rn;
void loop() {
HAHA.check();
Task2.check();
Task4.check();
Task5.check();
Task6.check();
}
void OYAJI() {
rN = random(5);
Serial.print(rN);
digitalWrite(13, HIGH);
delayMicroseconds(1000);
digitalWrite(13, LOW);
}
void ororo() {
if (rN == 0) {
digitalWrite(7, HIGH);
Serial.print(">");Serial.println(rN);
rn=random(400);
delay(100+rn);
digitalWrite(7, LOW);
}
}
void t2() { // はっきりした性格
if (rN == 1) {
digitalWrite(2, HIGH);
Serial.print(">");Serial.println(rN);
delay(1999);
digitalWrite(2, LOW);
}
}
void t4() { // ちょっと声は小さいけど話はできる
if (rN == 2) {
digitalWrite(4, HIGH);
Serial.print(">");Serial.println(rN);
for (int i = 0; i < 250; i += 1) {
digitalWrite(4, HIGH);
delayMicroseconds(200);
digitalWrite(4, LOW);
delayMicroseconds(3800);
}
}
}
void t5() { // テンションが上がり、後下がる
if (rN == 3) {
analogWrite(5, 200);
Serial.print(">");Serial.println(rN);
for (int i = 0; i < 250; i++) {
analogWrite(5, i);
delayMicroseconds(5000);
}
for (int i = 248; i >= 0; i--) {
analogWrite(5, i);
delayMicroseconds(5000);
}
}
}
void t6() { // テンションが徐々に上がっていく
if (rN == 4) {
analogWrite(6, 200);
Serial.print(">");Serial.println(rN);
for (int i = 0; i < 200; i++) {
analogWrite(6, i);
delayMicroseconds(9998);
analogWrite(6, 0);
}
}
}
やはり無理が有るので、タイミングが微妙にずれます。親父は2秒ごとに誰かを指名し、それを他の5人が0.25秒ごとに調べにいくので最大0.25秒の遅れが出ます。さらに、指名された者が時間制限を守らないと時間がずれますかね。自己アピールが過ぎ他人や周りに迷惑をかける、現実社会でアルアルですね。この設定だと、時々話を早めに切り上げる母親の出る幕が多いのも面白いです。
人間一人一人がシングルタスクです。そのタスクがたくさん勝手に動いている、不思議❓
こんなのも良いかと思ってます。
以上。