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関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
KURUMI上のフルカラーLEDですが、RGBがそれぞれ22,23,24番ピンに接続され、SoftwarePWMでanalogWriteできたはずですが、V1.05で少し挙動がおかしいようです。
以下のコードはV1.04ではLEDが点滅しますが、V1.05では点きっぱなしになってしまいます。analogWriteの部分を245ではなく0で実行すれば点滅します(何故?)。
今回analogWriteの修正が入ったと思いますので、それ関連かと思いますが、よろしくお願い致します。
/*GR-KURUMI Sketch Template Version: V1.05*/#include <Arduino.h>
// Pin 22,23,24 are assigned to RGB LEDs.int led_red = 22; // LOW activeint led_green = 23; // LOW activeint led_blue = 24; // LOW active
// the setup routine runs once when you press reset:void setup() { //setPowerManagementMode(PM_STOP_MODE, 0, 1023); //Set CPU STOP_MODE in delay() //setOperationClockMode(CLK_LOW_SPEED_MODE); //Set CPU clock from 32MHz to 32.768kHz
// initialize the digital pin as an output. Serial.begin(9600); pinMode(led_red, OUTPUT); pinMode(led_green, OUTPUT); pinMode(led_blue, OUTPUT);
}
// the loop routine runs over and over again forever:void loop() { analogWrite(led_red, 245); analogWrite(led_green, 245); analogWrite(led_blue, 245); delay(500); // wait 500ms
analogWrite(led_red, 255); analogWrite(led_green, 255); analogWrite(led_blue, 255); delay(500); // wait 500ms}
なんか現状 analogWrite() の第2引数に 0 や 255 を与えるとうまく動作しないようで、254 とかにすると一応点滅するようです。
void loop() { analogWrite(led_red, 245); analogWrite(led_green, 245); analogWrite(led_blue, 245); delay(500); // wait 500ms analogWrite(led_red, 254); analogWrite(led_green, 254); analogWrite(led_blue, 254); delay(500); // wait 500ms }
ちなみに KURUMI の LED は負論理なので analogWrite() の第2引数に 245 や 254 を指定するとだいぶ暗いです。
fujitaさん。
例えば、0,255で行き来させれば点灯します。
また、1〜254の数値での行き来も上手く動いているように感じます。
1~254と255の組み合わせだと、255の時の消灯が上手く行きません。
0と1~254の組み合わせだと、0の時の完全点灯が所定の時間維持されていない状況となるようです。
結果的に、0もしくは255以外を使ってしまうと、消灯できない状況となります。
とりあえずV1.04に戻してしまいました。
申し訳ありません。バグを作りこんでいました。
RLduino78_basic.cppの_digitalWriteで以下の通り、_turnOffPWM(u8timer)の位置を修正していただき、オブジェクト(.o)を削除してビルドすると修正されます。近日v1.06として他の案件(再コンパイルで時間がかかる)も含めて修正したいと思います。
if (u8Timer != NOT_ON_TIMER) {
_turnOffPWM(u8Timer); // PWMの設定解除
if (g_u8AnalogWriteAvailableTable[u8Pin] == true){
g_u8AnalogWriteAvailableTable[u8Pin] = false;
Okamiyaさん、お世話になっております。
該当箇所は確認でき、修正後コンパイルできました。帰ったら実機で試してみます。
実機での動作も確認できました。ご対応有難うございました。
岡宮さん
すいません、蒸し返すようなのですが、V1.06でもやはり挙動がおかしいように思います。
255の出力でLEDが消灯しません。また、255の直後に0を与えた時に、消灯されます。再度0を与えると完全点灯します。
255送信→わずかにLEDがついた状況
0送信→消灯
0送信→点灯した状況
1〜254に関しては、きちんと動いているように見受けられます。それらの値から0への遷移も、普通に行われます。
255を与えて消灯させる場合だけがおかしいように感じられます。
gr_common/RLduino78/cores/RLduino78_basic.cpp のなかの analogWrite(uint8_t, int) の
if (s16Value < PWM_MIN) {
else if (s16Value > PWM_MAX) {
の2箇所を
if (s16Value <= PWM_MIN) {
else if (s16Value >= PWM_MAX) {
に書き換えたらどんなもんですか?
fujitaさん
確認してみました。想定通りの挙動となったようです。
きちんと消灯しますし、PWMでの挙動もほぼ自然です。
ありがとうございます。
analogWrite() の第2引数に 254 を指定した初回だけビカっとするのが気に入らないんですよねー、まあその内直ると思いますが。
/*GR-KURUMI Sketch Template Version: V1.06*/ #include <Arduino.h> // Pin 22,23,24 are assigned to RGB LEDs. int led_red = 22; // LOW active void setup() { } void loop() { static int l = 255; static int d = -1; analogWrite(led_red, l); if (l == 0 || l == 255) { delay(1000); } l += d; if (l <= 0 || l >= 255) { d = -d; } delay(10); }
あら、ホントだ、見てると、254にかぎらず、最初にPWM値を指定した時にピカっとしますね。
値が小さいと目立たなくなってわかりませんが、少なくとも最初に253や252などを与えた場合もピカっとします。
あ〜、今色々と試してみて、fujitaさんの修正だけでは直っていないようです。
下記のテストコードですが、本来だと赤(暗)→緑(暗)→青(暗)となるべきところが、
v1.06で実行すると、
水色(緑+青)(明)→青(明)→青(暗)
となります。
また、v1.06にfujitaさんの修正を加えたもので実行すると、
水色(緑+青)(明)→紫(赤+青)(明)→黄色(赤+緑)(明)
RGBの各出力のうち不定値のものががデジタルLOWになってる感じでしょうか。
ちなみに、各カラーに初期値として255,255,255を与えてみると、
赤(暗)→赤(明)→黄色(赤+緑)(明)
となります。もう意味がわかりません。
テストのバリエーションが十分ではありませんが、どっちにしろ挙動がおかしいのは変わりない気がします。
【テストコード】
/*GR-KURUMI Sketch Template Version: V1.06*/
#include <Arduino.h>
// Pin 22,23,24 are assigned to RGB LEDs.
int led_red = 22; // LOW active
int led_green = 23; // LOW active
int led_blue = 24; // LOW active
// the setup routine runs once when you press reset:
void setup() {
//setPowerManagementMode(PM_STOP_MODE, 0, 1023); //Set CPU STOP_MODE in delay()
//setOperationClockMode(CLK_LOW_SPEED_MODE); //Set CPU clock from 32MHz to 32.768kHz
// initialize the digital pin as an output.
Serial.begin(9600);
pinMode(led_red, OUTPUT);
pinMode(led_green, OUTPUT);
pinMode(led_blue, OUTPUT);
// 赤で光るはず
analogWrite(led_red, 245);
delay(1000);
// 緑で光るはず
analogWrite(led_red, 255);
analogWrite(led_green, 245);
// 青に光るはず
analogWrite(led_green, 255);
analogWrite(led_blue, 245);
// the loop routine runs over and over again forever:
void loop() {
ご不便をおかけしてすみません。
V1.07として改善しようと思いますが、原因はpinModeで出力LOWにしてしまっていたことにあります。
pinModeを指定したときに、RGB-LEDがLow出力になってしまうため、上記のような現象が発生しています。
たとえば以下のように、Loop内に処理を移し、青を消灯する処理を加えると、2回目以降は所望の動きになります。
analogWrite(led_blue, 255);
Hineさん、Fujitaさん
できましたら添付のRLduino78_basic.cppを差し替えていただき、動作確認を行ってみていただけないでしょうか。
こちらでは境界テストや、波形確認、digitalWriteとの混合など、およそのテストをして期待通りの動作をしていますが、念のためお願いできればと考えています。
なお、KURUMIの仕様上、ポートの初期値は0のため、一番最初にピカっとならないようにするには、以下のようにpinModeの前にdigitalWriteを書き、出力ラッチを1にする必要がございますので、ご理解のほど宜しくお願いいたします。
digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, HIGH); pinMode(22, OUTPUT); pinMode(23, OUTPUT); pinMode(24, OUTPUT);
確認しましたが japan.renesasrulz.com/.../10047.aspx のスケッチで明るさの変化中に PWM の動作とは別に一瞬消えることがあるみたいです。japan.renesasrulz.com/.../10050.aspx は期待した動作となるようです。