ド素人ですw。以前にGR-SAKURAのフォーラムで「8×8×8のLED-CUBEを作ったけど、うまく動かない」で助けて頂いた者です。
https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-sakura/3717/thread
同じLED-CUBEをとある事情で、SAKURA->秋月で買ったRX621ボードへの移植をしてます。(せっかくかわいいSAKURAボードは、他の用事に使おうかとw)
e2studioで作ってます。なんとかほぼ動くようになったのですが、sinを使ってる所でSAKURAとLEDの表示が違います…。
SAKURAの方のプログラムの該当部分は、
1 : void ripples(int times, int repeat)2 : {3 : int i,j,k,z;4 : float distance,ztemp;5 : clearData();
6 : for(k=0;k<=repeat;++k) {7 : for(i=0;i<=3;++i) {8 : for(j=0;j<=3;++j) {9 : distance=sqrt((3.5-(float)i)*(3.5-(float)i)+(3.5-(float)j)*(3.5-(float)j));10: ztemp=3.5+sin(distance/1.3+(float)k/3.14159)*3.5;11: z=(int)(ztemp+0.5);12: bitSet(dispData[z][i],j);13: bitSet(dispData[z][7-i],j);14: bitSet(dispData[z][i],7-j);15: bitSet(dispData[z][7-i],7-j);16: }17: }18: LEDDisp(times);19: clearData();20: }21: }
LED表示用配列の辺は見ないで頂いて(移植に伴いbitsetー>ビットシフトに変えてます)、9~11行目の式で、がじぇるねのwebコンパイラでビルドしたSAKURAと、e2studioでビルドしたRX621ボードとで、計算結果が異なる原因が何かあるでしょうか…?
sqrtとsinをsqrtfとsinfに変えてみたりとか、型指定を外してみたりとかしても、変わらない様です。
(printfで計算結果を確認しようとしたのですがうまくいかないので、ほんとに計算結果が違うかどうかは確認できていません…)
どなたかご助言頂けると助かります。
がじぇるね岡宮です。
試しにk=3として、同じ演算をしてみましたが、結果としては同じでした。RX621は持っていないため、やれてません。あまり解決の糸口にならずすみませんが、とりあえずの実験結果でした。
0,0,00,7,00,0,70,7,7
0,0,10,7,10,0,60,7,6
1,0,21,7,21,0,51,7,5
2,0,32,7,32,0,42,7,4
0,1,00,6,00,1,70,6,7
2,1,12,6,12,1,62,6,6
3,1,23,6,23,1,53,6,5
4,1,34,6,34,1,44,6,4
1,2,01,5,01,2,71,5,7
3,2,13,5,13,2,63,5,6
5,2,25,5,25,2,55,5,5
6,2,36,5,36,2,46,5,4
2,3,02,4,02,3,72,4,7
4,3,14,4,14,3,64,4,6
6,3,26,4,26,3,56,4,5
7,3,37,4,37,3,47,4,4
確認したのですが、式は間違えて無さそう…
動画撮ったのですが、サイズが大きすぎて張り付けられないので、しばしお待ちください…。
SAKURAはピンケーブルでLED基板側に繋いでたのですが、接触が悪く不確実で、今回何か専用のボードを買ってハンダ付けで配線しようと思ったのが、SAKURAー>RX621に変更した理由の一つです。
ハンダ付けで結線したRX621ボードを外すのは大変なので、RX621は繋いだまま、残してたピンソケットに無理やりSAKURAも繋いで動作確認しました。
SAKURA側はwebコンパイラでビルド仕直して、書き込みしなおしてます。今まで通りのLED表示でした。ちなみに「repeat」は名前の通り、何回繰り返すかで、メインループからrepeat=150で呼び出しています。
この式をe2studioの方にそのままコピペして、再ビルド・再書き込み。やはりおかしなLED表示でした…。
(下のコメントアウトは、「ほ~ら式が間違ってたんじゃん?」の検証のために、昨日までの状態を残しておいたもの。上の式3行が、webコンパイラーからそのままコピペした物。う~ん、そのままコピペだし式に相違はないはず…)
動画のファイルサイズ縮小ができたら、動画載せます。今回のLED-CUBEの全体は、ぼくのブログを参照下さい。
https://blog.goo.ne.jp/kohei-m/e/c66bda3027eae9e72a22d286a561bdf9
動画縮小・変換できました、張り付けてみます。「動画で言うな、数字で言え!」と怒られそうですけど…w
まず、SAKURAで動かしたときの動画です。
(必要ない所がちょっとピカピカしてる様ですが、信号線が不安定か、RX621を繋ぎっぱなしにしてる影響かも。無視して下さい。)
次が「おかしいんじゃない?」というRX621で動かしたときの動画です。
それっぽい動きですが、明らかにSAKURAの時と違います…。sinを使った表示は他にも、RX621の方の動画の中ほどに、波みたいなヤツがありますが、それはSAKURAと変わらないように思えます。(という事は、sinの方の式じゃなくて、distance=sqrt…の方の計算結果が違うのかしら…)
RX621の方をスローにした動画です。(関数呼び出しの際に、timesを大きくすれば遅くなる作りです。)
LED表示は、一番上がz=0、一番下がz=7のはずです。この動画からzがいくつになってるかを拾うのは…厳しそうですが、ちょっと考えてみます。
あまり関係ないかもしれませんが、Arduinoではcharをsignedで扱うため、GR-SAKURAのWebコンパイラ(GCC)でもsignedで扱います。
しかし、CCRXではe2studioの設定のデフォルトでunsignedで扱うようになってます。設定としては以下の赤枠のところですが、ここを「符号付きとして扱う」に変更して試してみていただけますか?
もし解決しない場合は他の設定も何かしら影響しているかもしれません。ひとつずつ演算結果を見た方がよいと思いますが、とりあえず気になった部分のため記載します。