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関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
1個前の「書き込みモード中の各ポートの出力は?」の続きです。
今日イベントで、LEDキューブをディスプレイで展示して、4時間ぐらい調子よく動いてたのですが、全く触ってもないのに突然「ビカビカッ」と表示がぐちゃぐちゃになって、リセットボタンも効かなくなりました。
30分位待って電源入れてみても、やはりちゃんと動きませんでした。
家に帰って(パソコンは持ってってなかったので)、I/Oに差してるピンを全部抜いて、USB差してリセットボタン押したら、3~4回押して、やっとリセットしました。
パソコン側で認識したので、Lチカサンプル書き込んで、ちゃんと動くことを確認しました。
イベント中におかしな動作になった時、「熱暴走?」と、RXは触ってみましたが、全く熱くはありませんでした。
暴走はよくある事なのでしょうか?防止できないのでしょうか?
(ちなみに、ケースにも入れずハダカで使ってます。素手でベタベタ触ってます。手油が付いて絶縁が低下したりして、それがいけんのかなぁ…、と思ったりもするのですが…。)
接触不良と言う事はありませんか?
SAKURA→制御基板間の接触不良という意味でしうょうか?
接触不良ならあちこち点かなくなる方な回路になってると思うのですが、あちこち大量につきっ放しになってました。
SAKURAちゃんがちゃんと動いてるかどうかの確認の為に、メインプログラムの進行に合わせて本体の青LEDを順につける様にして、プログラムが進行してるのか止まってるのか、確認できるようにしようかと思います。
経験上ではリセットボタンが効かなくなるほどの暴走は経験したことがないですが、現象からすると電源が不安定になるぐらいの電流が流れて、CPUが不安定になっているような感じではありますね。chobichanさんの書かれている通り、接触不良が気になるところです。
プログラムの暴走に関して、例えば時間的な処理いいますとmicros()はArduinoと同様(たしか)、70分ぐらいでオーバーフローするため、それを考慮しないプログラムは暴走してしまう可能性あります。millis()は50日ですがunsigned longで扱われているか、丸めた演算が影響していないかなど、一応確認していただきたいところです。同様に、delayMicrosecondsや、delayも引数の取りうる時間を考慮する必要がありそうです。
それだけの個数のLEDを点灯させるとなると、結構な電力だと思いますが、電源ラインに使用している線材やパターン、またそれのリターンとなるGNDは、十分に強固でしょうか?仮にあまり十分ではない環境だと、そいつらに電力持ってかれてマイコン側の電源が不安定になったりする事はあり得ます。
またLEDをマトリクス状に切り替える構成の場合、高周期で点灯消灯が繰り返される事になります。これが大量LEDとなると、大電流かつ良応答特性という、そこそこ優秀な電源回路が欲しいところです。例えば外部からの5V直撃なんかでは、信頼動作の期待に対し何の保証もない状況と思われます。
またケースに入れずに触る点に関しては、油よりも静電気の方がヤバイかなと。ここからの季節は一層、バチバチ君が大暴れです。
とりあえず、信頼性の話を詰めてするのであれば、漏れの無い回路図と、出来れば配線材の判る写真があれば、より良い話が出来るかなと。
いや~、「まだまだシロウトだなぁ…」と、耳の痛い限りです。
電源は、5V3AのACアダプタを繋げるだけです。HC595にそれぞれ0.1μFのパスコンつけてるだけで、ノイズ対策も電源変動対策も、全然できてないと思います…。
万能基板で作成ですが、GNDラインもVCCラインも貧弱です。
「ACアダプタには当然平滑コンがついてるよね?」と、電源ラインに電解コンデンサも入れてません…。
とりあえず、数百~1000μFぐらいの電源平滑コンデンサを追加してみます。VCCライン・GNDラインを太くしてみます。
基板(特に裏)は、はずかしくて見せたくないなぁ…、と思いつつ、時間を見つけて回路が書ければ、基板と一緒に掲載します。
とりあえず、スケッチ(の一部)を載せておきます。
(これも、シロウトなので載せるの恥ずかしいです…。コメントも少なくて恐縮です。cとarduinoの思想では、極力グローバル変数は使わないのと、ポートレジスタは使わないのが基本だとは存じますが、人間が古いので、汎用性は考慮せず、LED表示のための配列はグローバルで、ポート丸ごとのバイト単位での操作になってます。)
#include <Arduino.h> #define LAYER_PORT 44 #define RATCH_CLK 52 #define SHIFT_CLK 53
/* globalでLED表示配列を定義 */byte dispData[8][8];
void plane_x(int times);void plane_y(int times);void plane_z(int times);void raindrop(int times,int repeat);void rainrise(int times,int repeat);void letter1(int times);void letter2(int times);void ballbound(int times,int repeat);void boxexpand(int times);void downstream(int times,int repeat);
void setup() { PORTD.PDR.BYTE = 0xff; // シリアルデータ出力portをoutputに PORTE.PDR.BYTE = 0xff; // レイヤー選択出力portをoutputに pinMode(RATCH_CLK,OUTPUT); // ラッチクロック用pinをoutputに pinMode(SHIFT_CLK,OUTPUT); // シフトクロック用pinをoutputに }
void loop() { plane_x(8); plane_y(8); plane_z(8); raindrop(15,60); boxexpand(10); rainrise(15,60); downstream(15,120); letter1(15); letter2(30); }
void LEDDisp(int times) { int n,i,j; PORTE.PODR.BYTE = 0; for(n=0;n<=times;n++) { for(i=0;i<=7;i++) { for(j=0;j<=7;j++) { PORTD.PODR.BYTE = dispData[i][j]; digitalWrite(SHIFT_CLK,1); digitalWrite(SHIFT_CLK,0); } PORTE.PODR.BYTE = 0; digitalWrite(RATCH_CLK,1); digitalWrite(LAYER_PORT+i,1); digitalWrite(RATCH_CLK,0); delayMicroseconds(500); } PORTE.PODR.BYTE = 0; } }
void clearData() { for(int i=0;i<=7;i++) { for(int j=0;j<=7;j++) { dispData[i][j] = 0; } } }
void shift_xplus() { for(int i=0;i<=7;i++) { for(int j=0;j<=7;++j) { dispData[j][i] = dispData[j][i] << 1; } } }
void shift_xminus() { for(int i=0;i<=7;i++) { for(int j=0;j<=7;++j) { dispData[j][i] = dispData[j][i] >> 1; } } }
void shift_yplus() { for(int i=7;i>=1;i--) { for(int j=0;j<=7;j++) { dispData[j][i] = dispData[j][i-1]; } } for(int j=0;j<=7;++j) { dispData[j][0] = 0; } }
void shift_yminus() { for(int i=0;i<=6;i++) { for(int j=0;j<=7;j++) { dispData[j][i] = dispData[j][i+1]; } } for(int j=0;j<=7;++j) { dispData[j][7] = 0; } }
void shift_zplus() { for(int j=7;j>=1;--j) { for(int i=0;i<=7;++i) { dispData[j][i] = dispData[j-1][i]; } } for(int i=0;i<=7;++i) { dispData[0][i] = 0; } }
void plane_x(int times) { int i,j; clearData(); for(i=0;i<=7;i++) { for(j=0;j<=7;++j) { dispData[j][i] = 0x01; } } for(i=0;i<=6;i++) { LEDDisp(times); shift_xplus(); } for(i=0;i<=6;i++) { LEDDisp(times); shift_xminus(); } }
void plane_y(int times) { int i; clearData(); for(i=0;i<=7;i++) { dispData[i][0] = 0xff; } for(i=0;i<=6;i++) { LEDDisp(times); shift_yplus(); } for(i=0;i<=6;i++) { LEDDisp(times); shift_yminus(); } }
void plane_z(int times) { int i; clearData(); for(i=0;i<=7;i++) { dispData[0][i] = 0xff; } for(i=0;i<=6;i++) { LEDDisp(times); shift_zplus(); } for(i=0;i<=6;i++) { LEDDisp(times); shift_zminus(); } }
void raindrop(int times,int repeat) { int m,i,x,y; clearData(); for(m=0;m<=repeat;++m) { for(i=0;i<=7;++i) { dispData[0][i] = 0; } for(i=0;i<=random(2)+1;++i) { x=random(8); y=random(8); bitSet(dispData[0][y],x); } LEDDisp(times); shift_zplus(); } }
イ、インデントが無くなっちゃって、すごく見にくくなってしまった…。
記事削除できなかったけど、修正できたので、インデントだけ入れました。
おー、よりにもよってピンポイントでPortDとEを使ってるんですね。前スレで、D/Eは外バス共通ポートで、マイコンスタートアップに残骸が残ってて一瞬バス有効(≒出力)になるって話でした。瞬間で8個しか同時点灯させない構想と思いますが、(koheiさんのせいではないですが)最悪同時に64個のLEDが同時点灯していたと思われます(=大電流)。後学の参考に、LEDの型番と直列抵抗の値をお聞きできると嬉しいです。
あと、でかいソースコードを貼るなら、ファイル添付にした方がいいですよー。ご参考に。
japan.renesasrulz.com/.../3651.aspx
返事遅くなりました。
「回路図・写真、掲載する」とは言ったものの、ちょうどファイル添付のやり方が疑問な所でした。
あーでも、複数貼り付けるやり方が分からない…。写真は添付にせずに、使ってるブログのサーバーにアップして、リンク貼ります。
添付ファイルが回路図です。いいツール使っておらず、officeで手書きなのですが、見れないことはないかな? まあ、IO増やすのにどのIC使うか次第で、誰が考えてもほぼ同じような回路になるのではないかしら。
外観。 キューブに関しては、かなりの自信作です。うつくし~くできたと思います。(SAKURAとの配線は、今は外してあります。)
基板おもて キューブに結線するとぐちゃぐちゃになってしまいますが、整然ときれいに配置できたと思っています。
基板うら ビニール線をつけるより前は、美しくできたと思いますが、一見美しいだけ?…。VCCラインもGNDラインも、ほそ~いメッキ線1本だけで引っ張ってます…。 ビニール線を張り巡らせたら、ぐちゃぐちゃです…。
※後日:回路図に間抜けな間違いがあったので、一旦削除。後ろの方で再掲します。
肝心な(?)、ダーリントン接続のベースへの入力抵抗を書き忘れました。多分2kΩです。
「低すぎるんじゃない?=そんなに電流流す必要ないんじゃない?」という気もするのですが、最大64個を点けないといけないので、10mA×64個=640mA。使ったTr-BC639(aitendoで購入)のhfeがMin:25、あたりから、ちょっと電流流し目にしてみました。(今思うと、20kΩでもいいぐらいかも…。プルダウンとるなら、バランス悪くなりそうなので、プルダウン付ける時に一緒に変更しようかしら…。)
LEDは、型番なんてありません。aitendoで1個3円の、多分メーカー不問の5mmLEDです。回路図の通り、直列抵抗は100Ωです。HC595出力(5V)→100Ω→LED→シンク回路経由で、点灯時1個当たり8mAぐらい流れたと思います。
サラリーマンのおっさんなので、平日は何もしない。土日も結構忙しくて、全然はかどってません。
プログラムの進行につれてSAKURA本体のLEDを順に点灯させるようにして、動作がおかしくなった時に、SAKURA側の不具合なのかどうかが判定できるようにしようと思います。(SAKURA側の不具合じゃない気がしてきた…。もしくは、電源・GNDの見直しで発生しないようになるか…。)
イメージしてたモノより遥かにキチ○イ(褒め言葉)だった、ドン引き(褒め言葉)です。なにこれかっこいい!
さておきまだ全然回路図見れてないですが、え、74HC595の1ピンあたり8個もLEDつける構成ですか?NXPの595の仕様書見ると35mA/pinって書かれてる気がしますが。。僕なんか間違ってるのかな。。
真面目にデバイスの個体差を考えたら、8個に纏めず全LEDに個別に制限抵抗すべきでしょうが、このデザインならばそこは諦めですかね。
回路図見てみましたが74HC595のOEをGNDに落とすのではなくちゃんと制御すればGR-SAKURAへのスケッチ書き込み時にLEDが点くのは防止できるのでは。
fluxさんが言っていたように、電源の安定度が気になります。基板の入り口に大容量コンデンサは必須だと思います。
ACアダプタはたぶんスイッチングタイプで線が1m位はあるのではないでしょうか。
このような場合、距離が離れすぎているため、高速なLEDのON/OFFに対してACアダプタ側のコンデンサの効果は期待できません。
電流変化が最大(全点灯と全消灯の繰り返し)の状態で、テスタかオシロで基板入り口の電圧を測定してみると、電圧がかなり不安定なはずです。
LEDマトリクスをダイナミック点灯するのが前提の回路なので、595の1ピンあたりはLED 1個分(8mA)ですが、8ピンを同時に点灯すると8x8=64mAですね。595の最大定格ぎりぎりだと思います。
シンク側のトランジスタは必ずひとつだけONになるようにソフトで制御するはずですが、問題は順番にON/OFFしていった時に、OFFにしたところがトランジスタの特性ですぐにOFFにならず、ONしたところと重なった結果、595の1ピンで2つのLEDを駆動する事になり、電流が増大して595の定格を超える可能性がある事だと思います。
このような場合、トランジスタのONしているところを切り替える時にデッドタイムを入れると良いはずです。
なお、先ほどの全点灯と全消灯の繰り返しは、LEDの個数を少なめにした状態から様子を見ながら増やしていった方が無難です。
へたをすると595が全部壊れます。
あ、それとついでに。トラのところ。
懐かしの1815使って2段にしてますが、この用途ならFET使った方が作るのラクでロスが少なくて小さくてイイことだらけかと。手持ち在庫の処分祭りなら別ですが。
そして折角だしrenesasのFETを探してみるか!と思ったら、なんスかこの使いにくいページ。。
www.renesas.com/.../mosfets-for-high-frequency-amplifier.html
ブラウザ最大化しても表が横に広がらないし、無駄に枠の縦が大きくて1画面に数個しか出ないし、左右移動はクリックカチカチだし、一番下のスクロールバー動かそうとすると最上段の項目が画面から消えてるし。いいんスかこれでokamiyaさん。。
あと、例の書き込み時にPortDとEがバスになっちゃう件で、理論上ないかもしんないけど、へたすっとLEDが512個全点灯、とかになる恐れもあるかもなんで、fujitaさんオススメのOE制御をした方がいいかもです。根治解決はSAKURAのFW更新と思いますが。
ダーリントン接続で感度を上げているから、リーク電流に反応しているだけだったりして。
パターンもさらっと見ました。ハンダ綺麗ですね!つやつやしてる。
さておき、GNDが気になりました。恐らく右上のACアダプタがINで、上中央のGND/5VがSAKURAに行くのかと思います。ここでGNDに注視すると、下からぐるっとUの字になっています。で、よりにもよってこの間に、LEDをドライブするトラさんたちが居ます。バリバリのノイズ元です。いくら導線だスズメッキ線だと言っても多少の抵抗はありますので、ここでガツガツ揺すられたらSAKURAのGNDはノイズまみれの可能性があり、各端子の絶対定格(GND以下になってはいけない)等が守れていない可能性があります。確率的に長時間運転でいつか不具合が起きる、、というのは十分ある状況かと。
できればACアダプタから、いったん二股ケーブルにしてSAKURAに個別供給するか、この基板のまま行くなら右上→中央は電源GNDとも個別で最短で引く&根元に大きめ且つ低ESRなコンデンサ(右上を1点GND基点としてトラ系とSAKURAと595系の3方に分ける)かつSAKURAいく直前に47uFくらい置く。できれば点灯系の電源(HC595?)にはLCかフェライトビーズあたり挟みたいですかね。
もっと贅沢言っていいなら、8VくらいのACアダプタ使って、SAKURAとそれ以外とで別々にレギュレータで5V作って供給した方が一層安全かも。
…ん。あれ。SAKURAってIO3.3vじゃなかったっけ。595のデータシート見ると、5vの場合が明記されてないけど、4.5vの時のVIHがmin3.15vっぽい。ギリギリすぎる、というかSAKURAのマイコン仕様書だと出力HighレベルはminがVCC-0.5vだからワースト2.8vなんで本来は回路設計段階でNGっすね。