0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

娘Nanoに求婚者4人。親父がデートを仕切る。母はオロオロ?

Posted at

 マルチタスクとかマルチスレッドとか検索してたら、次の記事を見つけました。

早速真似してやってみました。上記にも記載がありますが、

からダウンロードした「TimedAction.h」内の「#include "WProgram.h"」を「#include "Arduino.h"」に変更する必要があります。

 ただなぞるのもつまらないので次のようなストーリーを考えました。
親父.jpg
 親父は「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秒の遅れが出ます。さらに、指名された者が時間制限を守らないと時間がずれますかね。自己アピールが過ぎ他人や周りに迷惑をかける、現実社会でアルアルですね。この設定だと、時々話を早めに切り上げる母親の出る幕が多いのも面白いです。
 人間一人一人がシングルタスクです。そのタスクがたくさん勝手に動いている、不思議❓
 こんなのも良いかと思ってます。

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?