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}
岡宮さん
すいません、蒸し返すようなのですが、V1.06でもやはり挙動がおかしいように思います。
255の出力でLEDが消灯しません。また、255の直後に0を与えた時に、消灯されます。再度0を与えると完全点灯します。
255送信→わずかにLEDがついた状況
0送信→消灯
0送信→点灯した状況
1〜254に関しては、きちんと動いているように見受けられます。それらの値から0への遷移も、普通に行われます。
255を与えて消灯させる場合だけがおかしいように感じられます。
fujitaさん
あら、ホントだ、見てると、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 は期待した動作となるようです。
「初回だけビカっとする」はポートの初期化の際に LOW になることではなく、
/*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() { analogWrite(led_red, 255); delay(1000); analogWrite(led_red, 254); } void loop() { }
上のスケッチで analogWrite(led_red, 254); を実行した際に一瞬明るく光ることで、前の RLduino78_basic.cpp では発生してました。今回のではこの現象はないようです。
ポートの初期化で LOW が出力される件ですが、_pinMode() のプロトタイプ宣言を
static void _pinMode(uint8_t u8Pin, uint8_t u8Mode, uint8_t u8Value = LOW);
とし、_pinMode() 本体を
static void _pinMode(uint8_t u8Pin, uint8_t u8Mode, uint8_t u8Value)
~ 略 ~
#ifdef WORKAROUND_READ_MODIFY_WRITE if (u8Value == HIGH) { sbi(Px, u8Bit); // 出力をHIGHに設定 } else { cbi(Px, u8Bit); // 出力をLOWに設定 } if (u8Mode == INPUT) { sbi(PMx, u8Bit); // 入力モードに設定 sbi(PIMx, u8Bit); // TTL入力バッファに設定 cbi(PUx, u8Bit); // プルアップ抵抗を無効に設定 } else if (u8Mode == INPUT_PULLUP) { sbi(PMx, u8Bit); // 入力モードに設定 cbi(PIMx, u8Bit); // CMOS入力バッファに設定 sbi(PUx, u8Bit); // プルアップ抵抗を有効に設定 } else if (u8Mode == OUTPUT) { cbi(PMx, u8Bit); // 出力モードに設定 cbi(POMx, u8Bit); // 通常出力モードに設定 } #else if (u8Value == HIGH) { *Px |= u8Bit; // 出力をHIGHに設定 } else { *Px &= ~u8Bit; // 出力をLOWに設定 } if (u8Mode == INPUT) { *PMx |= u8Bit; // 入力モードに設定 *PIMx |= u8Bit; // TTL入力バッファに設定 *PUx &= ~u8Bit; // プルアップ抵抗を無効に設定 } else if (u8Mode == INPUT_PULLUP) { *PMx |= u8Bit; // 入力モードに設定 *PIMx &= ~u8Bit; // CMOS入力バッファに設定 *PUx |= u8Bit; // プルアップ抵抗を有効に設定 } else if (u8Mode == OUTPUT) { *PMx &= ~u8Bit; // 出力モードに設定 *POMx &= ~u8Bit; // 通常出力モードに設定 } #endif } } }
と変更、_pinMode() の直後に _digitalWrite() を呼んでる箇所を
#if 0 // 出力モードに設定 _pinMode(u8Pin, OUTPUT); // 出力をHIGHに設定 _digitalWrite(u8Pin, HIGH); #else // 出力モードに設定 _pinMode(u8Pin, OUTPUT, HIGH); // 出力をHIGHに設定 _digitalWrite(u8Pin, HIGH); #endif
等変更すれば良い気がします。
Fujitaさん、ご確認とご提案ありがとうございます。
そうですね、まず一瞬ピカはanalogWriteの中で_pinModeを呼び出したときにLOW出力してましたのでそうなっていました。
Arduinoのサンプルでは、analogWriteを呼ぶ前にpinModeでOUTPUTに指定しており、感覚的には不定のまま出力になるためいまいちなんですよね。
Fujitaさんの変更に関してですが、仕様的にpinModeで出力を固定化するのはどうでしょうね。たとえば
digitalWrite(22, HIGH);
pinMode(22, OUTPUT);
とした場合、ユーザの期待はHIGH出力だと思っているのですが、LOW出力になるということですよね。この辺についてご意見あればいただきたいです。
お疲れ様です。
添付のRLduino78_basic.cppを導入してみました。
自分の手元で全ての条件のテストができているとは思いませんが、自分の利用する範囲では問題が発生しないようです。
これまで発生していたような問題はなく、動いています。
また、ピカっとしない初期化についても承知いたしました。なるほどですね。これは即組み込みます。
ありがとうございました。
あと、本来はスレ違いですが、内蔵eepromなんですけど、現在のバージョンもnoInterupt()しないといけない状況でしょうか。
2KBの連続書き込みをしようと思うと猛烈に遅く、また割り込み入れられないのでシリアル出力などができないので、
プログレス表示などもできなくて、現在は諦めて外付けのI2CEEPROMを利用することにしてしまいました。
このへんも改善されるといいなぁ。別スレッド立てたほうが良ければこの件もあげます。
(v1.04での話です。前述のとおり外付けのEEPROMを使うことにしたので最近のバージョンでは試していません。)
おおっと、書き込みしようと思ってだらだらしてたら、いつの間にかスレが進行してた!
Fujitaさん、毎度毎度検証ありがとうございます。毎度、自分の検証の甘さを思い知るなぁ。
一度ライブラリの主要部分目を通したほうがいいのかしらん。
digitalWrite(22, HIGH); pinMode(22, OUTPUT); とした場合、ユーザの期待はHIGH出力だと思っているのですが、LOW出力になるということですよね。
digitalWrite(22, HIGH); pinMode(22, OUTPUT);
digitalWrite(pin, HIGH) と pinMode(pin, INPUT) を併用するとプルアップ入力になるという記述はArduino のリファレンスにはあるので、同等に pinMode(pin, OUTPUT) を設定する前に digitalWrite() を実行した場合の挙動はマニュアルに記述があれば良いと思います。Arduino 実機の動作がどうなのかは予め確認しておいたほうが良いでしょう。
今回提案させていただいたのは pinMode() の挙動を変えるということではなく、内部の _pinMode() の動作を拡張するということなので、ユーザに対する説明は現状と変わらずで良い筈です。
Fujitaさん、だいぶ間が空いてしまいました。
pinModeでのポート設定については、一旦保留としてポート設定はしない方向でV1.07としてアップしたいと思います。
スケッチリファレンスにはその辺、記載するようにしたいと思います。
1.04で動いていたanalogWriteが、1.09では動かなくなってしまいました。見た目ですが0を書いた時以外はちゃんと出力できていない?
なんでしょう?
chobichanさん、PWMが出力できる(3,5,6,9,10,11)以外を指定しているということはないですか?
昔Fujitaさんに教わった以下のイルミネーションはV1.09で最近やりました。5,6,10をRGBのLEDにつなげてます。
static double t = 0.0;
while(1){
analogWrite(5, int(255.0 * pow(0.5 - 0.49 * cos(t / 2.0), 2.0)));
analogWrite(6, int(255.0 * pow(0.5 - 0.49 * cos(t / 3.0), 2.0)));
analogWrite(10, int(255.0 * pow(0.5 - 0.49 * cos(t / 5.0), 2.0)));
t = fmod(t + (2 * M_PI / 1000 * 10), 60.0 * M_PI);
delay(1);
D3です
以下のもわっとLEDプログラムで試したのですが、3ピンのanalogWriteできました。でもV1.04で動いてV1.09で動かないのですよね。PWM以外に使用している機能を教えていただくことできますか?
for(int i = 0; i < 256; i++){
analogWrite(3, i);
delay(10);
基板上のフルカラLEDへのanalogWriteと競合する機能がリストアップされてると嬉しいです。
e2 studio V4とE1でのデバックが絶不調で、頻繁にデバッカーが落ちてしまうので、ちょっと訳がわからなくなっています。
基板上のフルカラLEDへのanalogWriteと競合する機能
D11 と D22~D24 のソフトウェア PWM で、タイマ割り込みにタイマ・アレイ・ユニットのチャネル 6 を使ってるだけで他との競合はない筈。
ただソフトウェア PWM の割り込み周期が 32kHz と結構高速なので、割り込み禁止を頻繁に行う処理をしながらではまともに機能しない可能性が大。
原因は判らないけれど、現象はanalogWriteのPWM値をまず0を書いてスタートさせないと、それ以降PWMを変更しても何も波形を出さない事が判った。
あと、今PWMの周波数を38Khzにしている。ただこれが影響しているかは怪しい。