GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
がじぇるね岡宮です。
マルチタスクなArduino、ステキですね。以下のようなスケッチです。loopが複数あり、並列に動かすような感じです。初めて動かしたとき、若干衝撃的でした。
void setup(){
}
void loop(){
void loop1(){
void loop2(){
まず、オープンソースのリアルタイムOSとしてTOPPERSがありまして、GR-PEACHで動かすことができます。
以下は、EclipseベースのTrueSTUDIOで開発する例が紹介されています。
http://qiita.com/exshonda/items/3742799cbc648e0505f7
さらにWebコンパイラにもTOPPERS環境を用意しました。
ちなみにGR-PEACHではじめてWebコンパイラを使われる場合はこちらを参照してください。
「はじめてのGR-PEACH (Webコンパイラ編)」
(2016年7月2日のTOPPERSワークショップ向けに公開しました! 松原先生ありがとうございました!)
はじめてプロジェクトを作ると、以下のプロジェクトが展開されます。
従来のようにgr_sketch.cppのようなソースがルートフォルダにないのですが、exampleの中に入っています。
以下のgithubリポジトリから作成したもので、基本的に構成を変えないという方針の下、Webコンパイラに乗っけています。
https://github.com/ncesnagoya/asp-gr_peach_gcc-mbed
デフォルトの状態でビルドすると、以下のblinkyサンプルがビルドされます。
ビルド実行を行って、GR-PEACHに書き込むと、LEDがチカチカします。プログラムはblinky.cppに記載されおり、これはArduinoスケッチにはなっていません。
次に本題のArduinoでマルチタスクスケッチをしてみます。
ルートフォルダにあるbuild_targetにビルド実行をするフォルダが記載されています。デフォルトでは./example/blinkyになっています。
このため、blinkyサンプルをビルド実行するようになっています。
このbuild_targetの記載を./examples/multitask_arduinoにします。
ビルド実行をします。。。。。。ビルドに3分くらいかかりますが、これは初回だけですので根気よく待ちましょう。
。
待ったわりにはLチカしかしないのですが、examplesの中のソースファイルmultitask_arduino.cppを開いてみましょう。
loop()の他にloop1(), loop2()があります。不思議な光景ですね。
以下のように書き換えて(コピペでいいです)、ビルド実行し、GR-PEACHに書き込んでみましょう。
void loop(){ while(digitalRead(PIN_SW) == 0){ digitalWrite(PIN_LED_USER, 1); delay(INTERVAL); digitalWrite(PIN_LED_USER, 0); delay(INTERVAL); }}
void loop1(){ digitalWrite(PIN_LED_GREEN, 1); delay(INTERVAL_GREEN); digitalWrite(PIN_LED_GREEN, 0); delay(INTERVAL_GREEN);}
void loop2(){ digitalWrite(PIN_LED_BLUE, 1); delay(INTERVAL_BLUE); digitalWrite(PIN_LED_BLUE, 0); delay(INTERVAL_BLUE);}
loop()ではwhileでずっとユーザスイッチを監視して赤LED(ユーザーLED)を点滅。
loop1()は緑LEDを点滅。
loop2()は青LEDを点滅。
GR-PEACHのユーザスイッチを押すと、赤LEDが点滅しつつも緑LEDも青LEDも点滅します。
不思議というか、なんだか面白いですね。
このマルチタスクプログラムの説明は以下に記載されています。
https://github.com/ncesnagoya/asp-gr_peach_gcc-mbed/wiki/Running-example-programs
以下は温湿度センサーHDC1000のシリアル出力も含めた全部のスケッチ例です。
HDC1000のSCL/SDAをWireのピン、RDYをピン2につなげる必要があります。
#include <kernel.h>#include <t_syslog.h>#include <t_stdlib.h>#include "syssvc/serial.h"#include "syssvc/syslog.h"#include "kernel_cfg.h"
#include "arduino_app.h"#include "arduino_main.h"
/* GR-PEACH Sketch Template V1.00 */#include <Arduino.h>#include <Wire.h> #define HDC1000_ADDRESS 0x40#define HDC1000_RDY_PIN 2 #define HDC1000_TEMPERATURE_POINTER 0x00#define HDC1000_HUMIDITY_POINTER 0x01#define HDC1000_CONFIGURATION_POINTER 0x02#define HDC1000_SERIAL_ID1_POINTER 0xfb#define HDC1000_SERIAL_ID2_POINTER 0xfc#define HDC1000_SERIAL_ID3_POINTER 0xfd#define HDC1000_MANUFACTURER_ID_POINTER 0xfe #define HDC1000_CONFIGURE_MSB 0x10 /* Get both temperature and humidity */#define HDC1000_CONFIGURE_LSB 0x00 /* 14 bit resolution */ void getTemperatureAndHumidity(float *temperature, float *humidity) { unsigned int tData, hData; Wire.beginTransmission(HDC1000_ADDRESS); Wire.write(HDC1000_TEMPERATURE_POINTER); Wire.endTransmission(); while (digitalRead(HDC1000_RDY_PIN) == HIGH); Wire.requestFrom(HDC1000_ADDRESS, 4); while (Wire.available() < 4); tData = Wire.read() << 8; tData |= Wire.read(); hData = Wire.read() << 8; hData |= Wire.read(); *temperature = tData / 65536.0 * 165.0 - 40.0; *humidity = hData / 65536.0 * 100.0;} #define INTERVAL 100#define INTERVAL_RED 100#define INTERVAL_BLUE 150#define INTERVAL_GREEN 200
void setup(){ pinMode(PIN_LED_RED , OUTPUT); pinMode(PIN_LED_GREEN , OUTPUT); pinMode(PIN_LED_BLUE , OUTPUT); pinMode(PIN_LED_USER , OUTPUT); pinMode(PIN_SW , INPUT); pinMode(HDC1000_RDY_PIN, INPUT); Serial.begin(9600); //Put the HDC1000 IC into the correct operating mode Wire.beginTransmission(HDC1000_ADDRESS); Wire.write(HDC1000_CONFIGURATION_POINTER); Wire.write(HDC1000_CONFIGURE_MSB); Wire.write(HDC1000_CONFIGURE_LSB); Wire.endTransmission();}
void loop1(){ while(digitalRead(PIN_SW) == 0){ digitalWrite(PIN_LED_USER, 1); delay(INTERVAL); digitalWrite(PIN_LED_USER, 0); delay(INTERVAL); }}
void loop(){ float temperature, humidity; getTemperatureAndHumidity(&temperature, &humidity); Serial.print("Temperature = "); Serial.print(temperature); Serial.print(" degree, Humidity = "); Serial.print(humidity); Serial.println("%"); Serial.flush(); delay(1000);}
/* * Cyclic Handler * * This handler is called every 10 [ms] as specified in * multitask_arduino.cfg. */void cyclic_handler(intptr_t exinf) { irot_rdq(LOOP_PRI); /* change the running loop. */}
どうも。
かなり古い話を確認して大変申し訳ございません。
GR-PeachとGR-Lycheeを始めようと思って色々揃えているところですが、マルチタスクに関して確認させていただきたいことがあります。
IDE for GR (ver 1.14)にてloop1()、loop2()などを使ってマルチタスクでプログラムをしたいのですが、可能でしょうか?どのライブラリをどのようにincludeする必要がありますか?
手元にあるPeachにloop1をテストしたところ、全く応じていません。
ご教示いただけると幸いです。