2025年12月5日金曜日

超音波距離計(その5)

 基本的な機能は実現できたので、次に実際の利用に合うようプログラミングを行う。基本的なロジックは、

  1. センサー部から200ms毎に送られてくる測距データを表示する。 
  2. 7セグメントLEDは測距データを3桁の数字で表示する。但し超音波センサーの最大探知距離が 400cmなのでそれより大きな値が来たときはエラーとみなし3桁ともマイナス(-)を表示する。
  3. RGB-LEDは距離に応じた色を表示する。また距離が短い場合は点滅表示を行う。これは7セグメントLEDを瞬間的に見た場合に読み間違いの可能性がある為だ。
  4. センサー部からのデータが途切れた場合は7セグメントLEDはドットを表示し、RGB-LEDは消灯する。

RGB-LEDは各色8ビットの諧調つまり24ビットの表示能力を持っている。 3,ではこれについて最初に距離に応じた連続的な色変化を試したが、そうすると逆に変化が認識しずらい。また輝度が高い場合の明るさの変化も認識しずらい。そこで距離に従って色を決める事にした。5つのLEDは同じ色を表示させる。具体的には100cm以上は青、100cm~40cmは緑、それより近い場合は赤を表示。各色の諧調は8程度で、距離が短いほど指数関数的に明るくなるようにした。さらに70cm以内では距離応じて点滅、距離が近いほど早く点滅するようにした。また緑は輝度が高いので値を約半分に抑えるようにしている。

4,ではタイマーを使って監視し、センサーからの信号が2秒以上来なかった場合に途切れたと判断している。





とりあえず当初の目標は達成したので、次はこれらを格納する箱探しを行う。

(終り) 


 



2025年12月2日火曜日

超音波距離計(その4)

 

 RGB-LED(PL-9823)は次のような特殊なPWMパルスを作って駆動する必要がある。このデータは信号が0→1になる所からスタートし、全てのビットを送り終える最後のビットの最後は0→1で終了する。であるなら全てのデータを送った後のアイドルの状態は0なのか1なのか? スタートの条件を考えれば0であるが図からは最後は1で終わるように見える。たぶん最後は0を延長したRETコードをアイドル状態として使うのだろうと推測する。

このパルスの厳密なタイミングには幾つかの情報があり曖昧であるが次の情報が確からしい。実際には動かして確かめる必要があるがHとLが概ね1:3あるいは3:1の比率であれば成立しそうだ。

またビットの並びはMSBファーストで、次の様にRGBの順だという資料もあるがGRBという資料もあり、これも実機で確かめる必要がある。

RGB-LEDはカスケード接続で複数を制御できる優れものである。今回はこれを5個を使う。

データの転送時間は上のタイミングから1ビット当たり1.25μsかかり(転送レート800Kbps相当)、1つのLEDに30us、5個のLEDを合わせると150μsかかる。

この信号をどうやって生成するかであるが、NOP命令を挿入してタイミングを取るソフト的な方法と、ハードロジックで信号を作成する方法が考えられる。MicrochipのアプリケーションノートAN1606にはPIC16F1509のCCPを使ってWS2811を駆動する例が示されており、これが参考になりそうである。しかし何れも時間的にかなりシビアで先人の例でも涙ぐましい苦労の跡が見える。特に回路の遅延などに伴うヒゲの発生には十分注意する必要がある。開発にはロジックアナライザを活用する必要があろう。

 ソフト的にやるのは後回しとして、とりあえずハードロジックを検討してみる。PL-9823はAN1606で示されたWS2811とは必要とする波形が違うので、それに合わせる必要がある。

信号の基本はSPIの出力である。PL-9823ではSPIの1つの出力ビットを4つに分けて1:3(0 code)又は3:1(1 code)の比率のPWMパルスを生成すれば仕様に合う。SPI出力が800Kbpsなら800KHzと1.6MHzの方形波があれば合成できる。SPIを駆動するクロックはFosc/4を分周したものであるため、3.2MHzの2^n倍のFoscが必要であるが一方PIC単体で発生できるクロックは限られており最も近い値として12MHzを4分周してFosc=3MHzとして使うのが適当だろう。ということで転送レート 750Kbps(=3MHz/4)で検討したい。

 AN1606に準じて考えると、SPIの出力(SDO)、SPIのクロック(SCK)、それにSCKの元となるクロックFosc/2から合成できそうだ。Fosc/2はCLKRを使ってFoscを2分周して生成した。

0 code = /SDO & SCK & Fosc/2

1 code = /(/SDO + /SCK + /Fosc/2)  

 PWMパルス = 0 code + 1 code

 この式で & は論理積、+ は論理和、語頭の/ は否定を表す。

この式ならCLKRとCLC各1個で実現できそうである。ということでこれを実際やってみたところ、SPIで送信するバイトの最後のビット(lsb)がSDOではアイドル状態まで引きの伸ばされるためlsbが1だとアイドル状態でもFosc/2がPWMパルスとして出力されAN1606のように上手くは行かない。強制的にlsbを0として7ビットのデータとするなら上手く行きそうだが。そこで悩んだ末に何とか窓信号を作り論理積をとる事とした。

具体的にはもう一個のCLCを使ってSCKをFosc/2の立下りでサンプリングすることで25%遅らせたSCK2を作り、SCKとSCK2の論理和を窓信号とする。つまり、 

     1 code = SDO & ( SCK + SCK2 ) 

 とする。これで上手く行きそうだ。そして、次の通り上手く光ってくれた。

実際に出来た波形を観測すると、 SPIの出力は1バイト(8ビット)送出した後次のバイトを送出までに隙間が出来る。つまりSPIではバイトを跨ぐ連続送信は出来ずバイト間では T0L や T1L が長く引き延ばされている状態になる。この隙間の大きさの規程は無いがRETコード、つまり(確かめた訳ではないが)50usを超えなければ問題ないようである。

 ここまでで基本的な機能は実現できたので、あとは受信した測距データをもとに表示内容を決めていきたい。

参考までにPWMパルスを作成するためのCLKR、SPI1、CLC1、CLC2の初期設定部分は次の様にした。

    //
    // CLKR Fosc(3MHz) to 1.5MHz
    //
    CLKRCONbits.CLKRDC  = 2;        // Duty is 50%
    CLKRCONbits.CLKRDIV = 1;        // divide by 2
    CLKRCONbits.CLKREN  = 1;
    //
    // SPI1
    //
    SSP1CON1            = 0x0;      // clear SSPEN
    SSP1CON1bits.CKP    = 0;        // IDLE Clock is Low
    SSP1CON1bits.SSPM   = 0x0;      // SPI with Clock = Fosc/4
    SSP1STATbits.CKE    = 0;        // trans. at clk idl->actv 
    PIR1bits.SSP1IF     = 0;        //        
    SSP1CON1bits.SSPEN  = 1;
    //
    // CLC1
    //
    CLC1CONbits.LC1MODE = 0;        // AND-OR
    CLC1SEL0            = 0x13;     //1 SPI1 SDO
    CLC1SEL1            = 0x12;     //2 SPI1 SCK
    CLC1SEL2            = 0x0B;     //3 CLKR = Fosc/2
    CLC1SEL3            = 0x05;     //4 CLC2 = SCK2
    CLC1GLS0            = 0x16;     // 0 code = /SDO & Fosc/2
    CLC1GLS1            = 0;        // T
    CLC1GLS2            = 0x02;     // 1 code = SDO
    CLC1GLS3            = 0x88;     //          &  /(/CSK & /SCK2 )  
    CLC1POL             = 0x03;
    CLC1CONbits.EN      = 1;
    //
    // CLC2 - MAKE DELAYED SCK
    //
    CLC2CONbits.LC2MODE = 4;        // 1 input D-ff with S & R
    CLC2SEL0            = 0x12;     //1 SPI1 SCK
    CLC2SEL1            = 0x0B;     //2 CLKR = Fosc/2
    CLC2SEL2            = 0;
    CLC2SEL3            = 0;
    CLC2GLS0            = 0x4;      // CK: /SEL1 = /Fosc/2
    CLC2GLS1            = 0x2;      // D:  SEL0 = SCK
    CLC2GLS2            = 0;        // R: F
    CLC2GLS3            = 0;        // S: F
    CLC2POL             = 0x00;
    CLC2CONbits.EN      = 1;
 

SPIは同時双方向通信という特徴があり、送信のみや受信のみという動作は無い。通常のシリアルインターフェイスの送信だと送信バッファーが空になるのを待って送信バッファーにデータを書き込むが、SPIでは送受のバッファーが共通になっており、送受信が完了したというフラグしかない。従ってSPI(マスターモード)でデータを送信する場には先ずバッファーに送信データを書き込み、送受信完了のフラグを待って次のデータを書き込むというプログラミングをする必要がある(受信の動作はダミーとなる)。このとき送受信完了のフラグは自動的にクリヤーされないのでソフトでクリヤーする必要がある。具体的に5個のLEDにデータを送るのは次の様にした。なお割込みが起きる事でタイミングが狂わないようこの部分は割り込み禁止としている。

void rgbSetLeds(byte *clr_r, byte *clr_g, byte *clr_b){
    byte GIEBitValue = INTCONbits.GIE;
    INTCONbits.GIE   = OFF;          // di()-----------------              for(byte i=0; i<5; i++){
        PIR1bits.SSP1IF = 0;
        SSP1BUF     = *clr_r++;     
        while(PIR1bits.SSP1IF==0){} PIR1bits.SSP1IF = 0;
        SSP1BUF     = *clr_g++;     
        while(PIR1bits.SSP1IF==0){} PIR1bits.SSP1IF = 0;
        SSP1BUF     = *clr_b++;     
        while(PIR1bits.SSP1IF==0){}
    }
    INTCONbits.GIE = GIEBitValue;    // ei()-----------------

}

これを誤って最初を、UARTの送信のように

        while(PIR1bits.SSP1IF==0){} 
        SSP1BUF     = *clr_r++;     
 

とするとSPIでは永久の待ちとなりデータは送信できない。

(続く) 

 

2025年11月30日日曜日

超音波距離計(その3)

1週間ほどで基板が届き、組み立てた。RGB-LEDのピンの間隔が狭くブリッジが出来て上手くハンダ付けができない。ブリッジの場所を探し出すのにパターンを切ったりして苦労したのでこれ以上ショートしないようUVレジンで固めた。その結果が次の写真である。ここではRGB-LEDのピンを左右に開くなどパターン作成に工夫が必要だ。


この 表示部はセンサー部から送られてきた測距データを表示する。

センサー部から送られる測距データは行が'='で始まり3文字目から測距結果を格納する。7セグLEDは実際に測定した距離を表示し、RGB-LEDは距離に応じて色を決めるようにする。

 7セグメントLEDは100回/秒くらいのレートでリフレッシュ出来れば十分なので10msに一回、つまり3桁で割って約3msくらいで割込み処理すれば充分だろう。という事で比較的簡単に実現できた。

表示用の割込み処理は次のようなものである。

static const byte swp_pos[3] = { 0x10, 0x20, 0x40 };
static byte dsp_dat[3] = { 0, 0, 0 };
static byte dsp_pos = 0;

void sevenSegLed_Isr(){
    LATC        = dsp_dat[dsp_pos];
    LATB        = swp_pos[dsp_pos++] | (LATB & 0x8f);
    if(dsp_pos >= 3)  dsp_pos = 0;
}

dsp_dat[]は7セグLEDに与えるビットパターンを格納している。

ちなみに数字を表すビットパターンは、

 static const byte SvnSegPtn[16] = {
        0x7e, 0x30, 0x6d, 0x79,  0x33, 0x5b, 0x5f, 0x70,    // 0..7
        0x7f, 0x7b, 0x77, 0x1f,  0x0d, 0x3d, 0x4f, 0x47     // 8..F
    };
を使っている。

(続く)

 

2025年11月19日水曜日

超音波距離計(その2)

 表示部は車の後窓付近に置きたいので、大き目の7セグ赤色LEDとワゴンセールで安価に入手したマイコン内蔵RGBLED(PL-9823、以下RGB-LED) を使う事とした。障害物との距離が近い場合は数字より色の方が感覚に訴える。

RGB-LEDはシリーズに繋ぐだけで使うことが出来る優れものである。 

7-セグLEDをアノードコモンにするかカソードコモンにするかであるが、コモン端子には大電流(最大160mA=各セグメントで20mA)が流れるのでPICでは直接駆動できなく適切なICが見付からなければトランジスタで駆動する事にする。このときアノードコモンだとPNPトランジスタを使う事となりそれをNPNでドライブするのでトランジスタの数が増える。一方カソードコモンだとNPNトランジスタだけでPICから駆動できる。 

各セグメントの駆動には電流制限のため(抵抗で済ますことも出来たが)試しに定電流ダイオードを使うが電圧降下が4V以上あり電源の5V供給では足りないため電源に12Vを使うこととなりPICには直結できない。そして次のような回路とした。(後で考えると電流制限は抵抗で済ませたほうが簡単で安価だった。)また20ピンのPICの抜き差しは面倒なのでプログラムはPicKitで直接書き込むようにした。

 電源は車のアクセサリー等から12Vを引いて使う予定だが上の回路図からは電源部は省略している。

そして次のような基板を設計し発注した。 

あとはソフトの制作だ。

(続く) 

 

2025年11月12日水曜日

超音波距離計(その1)

 以前作った超音波測距モジュールからブランチして超音波距離計を作れないか相談を受けた。車のバックセンサーとして使いたいというものだ。ならば車外のセンサー部と車内の表示部という構成にする必要があろう。先ずセンサー部だ。

超音波センサーには秋月で安価に売っているHC-SR04とUS-015があり、コネクタには互換性がある。HC-SR04はGPIOインターフェイスのほかI2CやUARTにも対応しているがUS-015はGPIOのみであり、ここでは両方使えるよう、また後処理を考えてGPIOを使うようにした。

単に距離を測れれば良いならば簡単なものだ。そこでPIC16F18313を使ってプロトタイプを作った。 電源は表示部から供給する。

簡単な回路なので、であっという間に完成した(電源のバイパスコンデンサやLEDランプは回路図からは省略している)。

ソフトも、距離だけ測れば良いので以前PIC16F18346用に作ったものをPIC16F18313用に簡略化して1日で出来上がった。PIC16F18313は内蔵タイマーが少ないのでTMR0を200ms毎の測定開始用、TMR1をエコー時間測定用、TMR2を100msのタイムアウト用として使っている。測定は毎秒5回行い、過去4回分を平均して結果として報告するようにしている。次は実際に動かしてみた結果の一例である(結果はcm単位)。

US Ranging313-3.01.013 for RH-Kager3 US-Sensor Rev0.1
Copyright(C) 2025 MYcrosLip.
= 56
= 56
= 45
= 33
= 21
= 21
= 33
= 45
= 56
= 60
= 83
= 111
= 122
= 156
= 190
= 205
 

超音波センサーの最大探知距離4mより大きな値は999cmとし、センサーから応答がない場合は998cmとして報告するようにしている。


センサー部は出来上がったので、次は表示部の検討を行う。

(続く) 

 

 

 

 

2025年11月7日金曜日

Multicore社のハンダ、使ってます

 エレキギターのエフェクターの修理動画を見ていたら修理にMulticoreのハンダを使っているという説明があった。私も昔からMulticoreの直径1mm/5コアの物を使っているが、敢えてブランド名を言うほどの優れものだとは知らなかった。

このハンダは就職して間もない頃、大阪日本橋の電気店で手頃の大きさ/太さだからと何も考えずに買ったものだ。当時はもっと太いハンダが主流で1mmの細いハンダは珍しかったように思う。もう半世紀近く使っているがまだ使いきれていない。しかしもう巻が一重強ほどしか残ってないので次をどうしようかと考えていた所であった。

ネット情報によるとMulticoreのハンダは音楽界隈で評判が良いようで、音が全然違うとか有名音楽家の機材に使われていたとか出てくるが、こういう方面はオカルト的であまり興味が湧かない。私の使用目的は主にデジタル回路で、8ビットマイコンの時代から使っている。

ヤフオクで検索するとMulticoreの古いハンダにけっこう高値が付いている。 少し気になるのはMulticoreのハンダのラベルにはオレンジ系の色が使われてERSINという名前が印刷されているが、一方私の持っている物は青(紺)色で、それにXersinと書いてある。オレンジ色の本物はMade in  Englandみたいだが私のはMade in U.K.とあり、まがい物か?

製品情報が欲しくてHPを検索するが、Multicore社は既に無くなっているようで検索しても会社のHPは出て来ない。 Copilotに聞いてみたらMulticore社はドイツのHenkel社に買収されたとの事。またブランド名XersinはHenkel傘下のLoctite社が2000年代以降に作った無鉛ハンダでErsinの派生品(改良品)との返事であったが私が入手したのは1980年前後だからCopilotは事実を反映していない。

経験豊かな知人によると、古いヤニ入りハンダはヤニが酸化していてよくないとの事で、じっさいハンダの濡れが良くなく液体フラックスを併用しているが、これは電線の表面が酸化している影響かも知れない。 ちなみに私が使っている電線はハンダと同じ頃に買ったフッ素樹脂被覆のジュンフロン電線(0.26mm)で本来はラッピング用だが被覆が熱に強くハンダごての熱でもびくともしないので配線用に愛用しいる。


私のハンダの事はよく分からなかったが、もう暫くMulticoreを使い続ける事になろう。 

 

2025年11月6日木曜日

ベリンガー A500 を修理(その2)

 ここで一度、全体を元に戻し症状を確認する事とした。というのは故障修理を依頼されたのはたまたま実家に帰った時であり、信号源も負荷も無く動作テストも出来ず、手元にあるのはテスターのみであった。

 自宅に持ち帰りテストを行うこととした。ただ高出力に耐えるスピーカーは持ち合わせていないので15Ω10Wの抵抗を調達し、各チャネルの負荷とした。入力にはオーディオジェネレータを用意した。動作を試してみるとチャネルBは正常に働く一方チャネルAには出力が出ていない。やはりチャネルAに問題がある。

ボリュームを上げるとチャネルBではボリュームに合わせてレベル表示のLEDが上昇するが(このレベル表示はスピーカー出力を全波整流して表示している)、チャネルAではレベルは上がらず代わりにレベル表示の上位にあるCLIPの赤いLEDが点灯する。 このCLIPはボリュームの中点を受けるOPアンプの出力を全波整流して点灯するようになっている(次回路のX7間にCLIPのLEDが接続されている)。

このオペアンプにはスピ―カー出力からの帰還がかかっているので、正常に帰還がかかっていればこの程度の入力でCLIPが点灯することは無いはずであり、それが点灯するという事は帰還ループの何処かが切れていてOPアンプがコンパレータとして動作している事になる。実際スピーカー出力は無く、レベル表示も上がっていない状態でのCLIP表示だ。

そこで再度OPアンプ出力から終段のTr迄の間の個々の部品をテスターを使って個別にチェックするが全て正常に見える。この時点で終段は怪しいのですでに新品に交換している。試しに2つのドライバーTrを取り外しチェッカーでチェックしたが特に問題はないようだ。この状態で入力信号を加えてみるとドライバーTrのベースには11Vp-pくらいの信号が来ていて特に問題は無さそうだ。う~~む、さっぱり分からない。

 ドライバーTrを元に戻し入力信号を加えてみると正常に動いている。なに?どうなっているの?

特に問題ないようなので元のように組み上げて入力を加えてテストしてみると、やっぱり出力が出なくCLIPのLEDが点灯する。さらにチャネルAのヒートシンクが熱くなる。組み上げる時にどこかでショートして異常な電流が流れている様だがどこかは分からない。組み上げた時に終段Trの電極が筐体(シャーシ)に近くなるのでショートしているのでは、と絶縁テープを挟んでみるが状態は変わらない。そのほか 基板の帰還ループに関係する配線がどこかで切れているかショートしている筈だ・・・再び分解してテストすると正常に動作したり異常になったり、だ。基板や部品に力を加えてみても状態は変わらない。クラックやショート、ハンダ不良では無さそうだ。

あれやこれやテストしている最中、本体から分離したチャネルAユニットのシャーシと本体のシャーシが接触すると火花が出る事があった。何か変だ、ここに電位差は無いはずだ。 試しにこの間の電圧を測ってみると、無音時(ボリュームが0の時)には電圧は無いが入力を加えボリュームを上げるとそれに応じて交流の電圧が生じ最大20Vを超える事が分かった・・・どこかで絶縁が破壊されている。いや待てよ、この電圧はスピーカに加わる電圧そのものではないか?

改めて基板を見てみると、 スピーカ出力のX4コネクタが怪しい。他のコネクタは方向が決まって逆向きに挿せないのにX4コネクタだけは方向性が曖昧で、じっさい逆向きに挿す事ができる。


配線を確認しX4コネクタを正しい向きに挿すとシャーシ間の電位差は無くなりアンプは正常に動作するようになった。 X4コネクタを逆挿ししてもチャネルAのユニットが電気的に浮いていて本体シャーシから切り離されていれば問題なく動作するが、シャーシを組み立てるとスピーカー出力が接地されOPアンプへの帰還が無くなる。この事でCLIP表示の現象を説明できる・・・原因はこれか。

という事で、ここには詳しく書いてない事を含め3週間ほどあれやこれやと調べたり部品交換したが、何十回も抜き差ししたX4コネクタの関係で迷走した。そして訳が分からないうちに故障は直っていた。まっ、いいか。そういう事もあるさ。

(終わり)

 

2025年10月26日日曜日

ベリンガー A500 を修理(その1)

 イベントなどで使っているアンプ(ベリンガー A500)が壊れたので見てくれという依頼があった。使っている最中にスピーカーから音が出なくなった。それ以降使っていないとの事。そのときスピーカーも断線したらしい。

コンパクトだが重い(8.4Kg)筐体の上蓋を外すと、真ん中に大きなトロイダルコアの電源トランスが鎮座し、左右に放熱板付きの2つのパワーアンプが対称に配置されている。


パワーアンプは各々250Wの出力がありステレオとしても、2つを併せて500Wのモノラルアンプとしてもスイッチで切り替えて使えるそうだ。だが故障したときどのような状態で使っていたかは要領を得ない。

 とりあえず回路図をネットで探すとともに、似たような故障事例を探したが事例は見つからない。たいていの場合定番の故障と修理報告がありそうなものだが、A500の事例は無い。

回路図を見ると、一見SEPP構成の普通のアンプに見えるが細かく見ると変な箇所がある。電源トランスに電圧の基準とする中点は無く、巻き線の2本の線はブリッジ整流されたあと低抵抗を経て上下の終段のパワートランジスタのエミッタへ接続されている。一方パワートランジスタのコレクタは接地されている!! 一般のSEPPと比べ終段のNPNとPNPトランジスタが逆に使われている。最も不思議な点はSEPPを構成するであろうパワートランジスタの出力がスピーカーに繋がっていない点だ。どうやって出力をスピーカへ渡している?


スピーカへ接続されているのは電源の正負に直列接続されている2個の平滑コンデンサの中点で、普通なら接地電圧であるべき所だ。スピーカへの接続のHOTとCOLDが逆転している?何という設計だ。 何だ、この回路は?こんな回路を過去に見た事もない。「変な家」の電子回路版か?

この回路の一番のメリットと考えられるのは終段のパワートランジスターのコレクタを(絶縁を考慮することなく)筐体に直接ネジ止めする事ができ、冷却効率が良い事だろう。 怖いのは終段の上下のトランジスタがストレートに繋がっている点で、バイアスのかけ方を間違ったり不注意で一瞬で吹っ飛んでしまう。その分パワーが取り出せるのだろう。

このアンプを500Wモノラルアンプとして使う場合はチャネルAのスピーカー出力をチャネルBの途中に逆位相で戻している。OPアンプ回路みたいな設計だが250Wのアンプでこれをやるか?

スピーカ端子の電圧を測定すると、左右分離のステレオモードではチャネルBがほぼ0Vなのに対しチャネルAでは電源投入後17V ほどあり、時間とともに0Vに向かって徐々に下がっていく。モノラルモードではチャネルBがチャネルAに逆位相で追従する。これは通常動作である。つまりチャネルAが怪しい。 

チャネルAの+VccとーVccの電圧を測るとそれぞれ+75V、-31.5Vと完全にアンバランスしている。何かがおかしい。テスターでトランジスタやダイオードの方向性を個別にチェックしてみるが特に怪しいところはない。

+VccとーVccから前段のOPアンプの電源±15Vを作っている2つのツェナーダイオードの両端を測ってみると-15V側の電圧が-3.8Vしかない。これが壊れているのか?新品と交換してみるが変化はない。ということは設計値以上に電流を食っている-15V電源の負荷があるはずだ。 多分OPアンプだろうと思って交換のためにOPアンプを外してツエナーの電圧を計ってみると確かに±15V位になってる。それではと新しいOPアンプを付けると元のアンバランスな状態に戻っている。何かがおかしい。

先ず全部の部品をもう一度洗い直そうとテスターで1個づつ計っていると、あれ?部品(R66,R67)が実装されていない。

極小(1608?)のチップ抵抗なので気付かなかった。チャネルAのボリュームに繋がるコネクタ(X6)は外しているので、この状態ではOPアンプ(IC2B)のマイナス端子が浮いていて正常に動作しないはずだ。これがアンバランスの原因か。

故障診断は振り出しに戻った。

(続く) 

 

 

 

 

 

 


 


 

2025年9月9日火曜日

2色 8×8 マトリクスLEDを使う(その7)

 これまで、買った15個のマトリクスLEDのうち5個を使って基板を作成しテストをしていたが、残り10個分の基板も発注し作成した。14個を連結して表示させてみたが特に問題なく動く。次の動画は10個連結した例である。

  

製作の過程で経験したのは、ハンダペースト+ヒートガンでSMD(表面実装部品)をハンダ付けする場合、ハンダ付け後急に冷やすと基板と部品の熱膨張率の違いによりハンダにクラックが生じて著しく信頼性が低下する事である。

せっかく効率的にハンダ付けが出来ても後で細かく補修する羽目になる。 これが老眼の目にはきつい。USB顕微鏡が欲しい所である。 あと、注射器タイプのペーストハンダを直接基板に付けたが斑になり均一な量を塗布できなかった(概ね多すぎた)。基板と同時にステンシル(ハンダマスク)も発注したほうが均一に塗布できハンダ付けは上手く行くだろう。但しその場合は基板作成の値段が跳ね上がる覚悟が必要だ。

最後に、定電流LEDドライバーのTB62706BFは意外と異常電圧に弱い。最近のIC、LSI類は設計が良いのか多少手荒く扱っても、一瞬逆電圧をかけても滅多に壊れないが、TB62706BFは簡単に壊れ数個をダメにした。具体的にはENA端子が絶縁破壊されGNDとの間の抵抗値が170Ω程度に下がり(正常なICは十数MΩある)動作が不安定になった。注意が必要である。

 秋月のアウトレットで安く入手した2色8X8マトリクスLED15個を使い終わったので、このシリーズは終わりとする。

(終わり) 

 ----------------(追記)------------------

その後、依頼によりデモ表示内容を一定時間ごとに切り替えるような機能を追加した。デモは6種類まで設定できる。またデモ中にUARTからテキスト入力があればそれを一定時間表示した後デモに戻る。このとき超音波測距のデータについては特別に処理を加え距離の範囲に応じて色を変えて表示するようにしている。 

 -------------(追記終り)--------------- 

2025年9月4日木曜日

出入り検知器をPCB化する(その26) インテグレーション3

 暫く作業をお休みしていたが、これまで作った基板を組み合わせて、人の通行を感知して挨拶する挨拶ロボットを作る。

そこで新たらしく必要になるのがロボットを制御する方法、即ちサーボモータによるロボットの動作とメロディ・音声を同期させる手法及びその記述法である。最初のステップとしてインテグレーション1で作ったサーボ制御ユニットのコマンドを次の様に整理した。

    <nn>A - Rotate Ch.1 to direction <nn>.(<nn>=-90..0..90)
    <nn>B - Rotate Ch.2 to direction <nn>.(<nn>=-90..0..90)
    <nn>C - Rotate Ch.3 to direction <nn>.(<nn>=-90..0..90)
    <nn>a - Rotate Ch.1 <nn>degrees.(<nn>=-90..0..90)
    <nn>b - Rotate Ch.2 <nn>degrees.(<nn>=-90..0..90)
    <nn>c - Rotate Ch.3 <nn>degrees.(<nn>=-90..0..90)
    <nn>x - Set Ch.1 speed to <nn>.(<nn>=1..253)
    <nn>y - Set Ch.2 speed to <nn>.(<nn>=1..253)
    <nn>z - Set Ch.3 speed to <nn>.(<nn>=1..253)
    <mm>s - Set all speed to <mm>.(<mm>=1..253)
     <m>S - Set all speed to level <m>. (<m>=0..9)
        Z - Rotate Ch.1,2,3 to origin(0,0,0).
        > - Wait Idle
        $ - Abort
        e - Echo OFF(default)
        E - Echo ON
        i - Idling OFF(default)
        I - Idling ON
        v - Show software version.
        V - Show configuration data.
 

これらのサーボの制御コマンドは制御モジュールに後置記法(逆ポーランド記法)で与える。つまり改行を待たずアルファベットや記号のコマンドを入力した時点で即動作する。いちいち改行を入れる必要が無いので連続的な指示が可能である。 


 メロディや音声に同期してサーボユニットへ指示を行うための記法を次の様にした。

    [A:B:C](D)E 

 ここでサーボへの指示は[]の中に記述し、メロディは()の中に記述する。つまりAはサーボの事前処理、Bがサーボの動きの記述、Cがサーボの終了処理、Dはメロディ、Eが音声メッセージである。例えば、

    "[200sZ>5s:90A90C>-90A-90C>:$Z>](@j)ohayo" 

と記述すると、

  1. スピード200で原点移動、 その後スピードを5に変更(A部)
  2. 「@j」で定義されるメロディを演奏(D部)
  3. その後「おはよう」と発声(E部)
  4. 2,3を行っている間にチャネル1とチャネル3のサーボモータを原点から+90度へ、次に-90度へ回転(B部)
  5.  発声が終了するとともにサーボの回転を停止し原点へ移動(C部)

 のように動作する。こういった1行をイベント毎に用意し、実行すればよい。

 (続く)

 

2025年6月28日土曜日

文鎮化し起動ロゴも出なくなったFujitsu Celsius J580 を回復・復活

文鎮化した富士通のPCの回復は、専門業者に依頼するか、ツール(FreeDOS)をインストールしたUSBメモリーを使って最新のBIOSを上書きする方法しかネットに情報が無い。とくに後者のUSBメモリーを使う方法は私を含め成功しなかった事例も多そうだ。ここに、それ以外の方法で回復した事例があるので紹介する。ただ、本件は1つの成功事例ではあっても不確定要素を含んでおり再現性は保証できない。あくまで参考として見ていただきたい。

以下ダラダラと経緯を書いたので、全体を要約すると、

  1. 約半月ぶりに Fujitsu Celsius J580(以下J580)を立ち上げようとしたがビープ音と再起動を繰り返した。この時Fujitsuのロゴも出なく、キーボードも効かず、いわゆる「文鎮化」となっていた。
  2. ボタン電池を一旦取り外すC-MOSリセットは効果が無かった。 
  3. ネット情報を頼りにUSBメモリーを使ってBIOS再インストールに挑戦したが上手く行かなかった。
  4.  3.に準じた方法でBIOS再インストーラではなくWindows10のUSBインストーラを起動することが出来て、そこからBIOSに入ることが出来た。
  5.  BIOSで時刻を合わせ設定保存・終了を行った後、元のSSDからWindowsを起動する事が出来て、無事復旧できた。

という事である。 以下は経緯である。

6月中半に累積更新を適用し、しまっておいたFujitsu Celsius J580 に月末の累積更新を適用するため起動しようとしたら全く立ち上がらない。1回のビープ音と再起動を繰り返すのみでFujitsuのロゴも出ない。キーボードも無反応。やられた!、これが悪名高き文鎮化(レンガ化)か(このPCはサブのPCとして普段は使用せず定期的な Windows Update のみ行っている)。

富士通のサポートページでは「公開予定のBIOSは問題の発生を抑えるもので、既に問題が発生したものを復旧させるものではありません。」と事前の対策を呼び掛けており、問題が起きた後ではお手上げという状態だ。一方富士通のこのページを見る人の大部分は既に手遅れの人だろう。

そこでYouTubeで紹介されていたBIOSの更新をやる事にした。その概要は、32GB以下のUSBメモリーを用意し、それをFujitsuのWEB(国際版)で提供されているツール(FTS_BootStick_100_1088425.exe)でフォーマットする。 さらにそのUSBメモリーに同WEBからダウンロードし展開した自分のPC用のBIOSファイルを格納し、J580のUSBポートにに挿す。J580のメインボードのFrontPanelコネクタ(下図)にあるRecovery端子をジャンパーでショートさせたあと電源をONにすると自動的にBIOSが上書きされる。この時DVDやHDD、SSDなどのストレージやその他のデバイスはディスプレイを除き予め外しておく必要がある。これで上手く行くはずだ。なお下図のRecovery端子はJ580のピンの配置であり、この上に被さっているソケットには両端に余計な1列の穴が空いているので場所を間違えないよう注意しないといけない(モデルや基板ごとの確認が必要)。

この方法はYouTubeでも紹介されているし、Fujitsu ESPRIMOでの成功例も多い。またWindowsではないがこのページにも同様の手順が書いてある。しかしこれをやってみたが全くダメ。ボタン電池を外してCMOSをクリヤーするのは最初に試したがダメ。ネット情報によると、古いバージョンのBIOSファイルの方が成功率が高いとかあり、真似してみても駄目。この方法でもしエラーが起きたとしても何回かビープ音がなるはずだが私の場合はリトライ(勝手に電源がON-OFF)を繰り返すのみでビープ音は鳴らずUSBから起動する気配がない。そうか、YouTubeでやり方を紹介していた修理店主が仕事としては受けないと言っていたのはこういう事かと納得した。

上記ツールでUSBメモリーにインストールされるのはFreeDOSというMS-DOS互換のフリーのOSでUSB自身で起動できるよう(ブータブル)になっている筈だが私のJ580では起動されるようには見えない。この場合、考えられる原因は、(1)上記ツールの不備かUSBとの相性でUSBメモリーがブータブルになっていない、(2)ワークステーション用であるCelsiusではセキュリティや信頼性確保のため何らかの細工が行われておりFreeDOSの起動がブロックされている、(3)BIOSが完全に壊れ、例えブータブルUSBでも読み込めない、(4)BIOSの更新では現在と同じか或いはより古いバージョンを書き込むことはできない、等が考えられる。(1)を考え他のメーカのUSBメモリーでも試したがダメだった。

こうなったらハードウェア・ツールを使って最新BIOSを強制的にEEPROMに書き込むしかない、と諦めかけていた。狙いはこいつ(GD25B127D)だ。

単に書き込むと言っても門外漢の私が成功する確率は高くない。なぜならこのROMにはBIOS以外にPC固体の識別番号やMACアドレス等の固有情報が書き込まれている可能性があり、またチェックサムやMD5などセキュリティに関する情報も入って保護されいる可能性があるので単純に書き込めばよいというものでも無いだろう。 ROMの直接書き換えは最後の手段だ。

待てよ、ブータブルと言えばWindowsのインストーラもそうだ。ダメモトでやってみようと思い立ち、手持ちのWindos10 22H2のUSBインストーラで試した。Recovery端子を短絡しディスプレイ以外のデバイスを外したJ580にWindos10 のインストーラを挿して電源をONにする。すると、何とビープ音がするではないか。2回-4回-1回というパターンのビープ音を2~3回繰り返した後インストーラが立ち上がり、画面にメニューが表示された。

そこでキーボードを接続しメニューから「BIOSの設定(正確な名前は憶えていない)」を選択するとBIOSが立ち上がった。バージョンを確認するとBIOSは既に対策版のバージョン(R1.38.0)になっている。イケルかも・・・。

そこで電池を外したことで狂っていた日時を修正し、設定の保存・終了を選び一旦電源を落とした。どうも立ち上がりそうな雰囲気だ。そこでUSBインストーラを外し、文鎮化前まで使っていたSSD(Windows11インスト―ル済)をM.2ソケットに戻し、Recovery端子のジャンパーを外して電源をONにすると何事も無かったようにWindowsは立ち上がった。

Windowsが立ち上がればこっちのもの、後は普通のWindowsマシンとして扱えばよい。本来の目的であった累積更新を適用し DVDやHDD等残りのデバイスも接続してメデタシメデタシとなった。

BIOSが既に対策版になっていた理由には次の2つが考えられるが、どちらが正しいかは分からない。

(1)6月中旬のWindowsUpdateで既にBIOSは対策版になっていたがBIOSが使うデータ領域が破壊されたままだったので立ち上がらなくなっていた。

(2)ビープ音が鳴らず見かけ上起動しなかったBIOS書き換え用USBメモリーだったが実際には書き換えは行われていた。しかしBIOSの使うデータ領域が破壊されたままだったので立ち上がらなくなっていた。

個人的には(2)はBIOSの書き換えに分の単位で時間がかかると思うので現象と合わず、(1)が正解かなと思う。 

終り

 

 

 

2025年6月20日金曜日

2色 8×8 マトリクスLEDを使う(その6)

 LEDの明るさはTB62706BFに付ける外部抵抗(R-EXT)で決まるが、この抵抗は桁毎に固定抵抗をハンダ付けしているため容易に明るさを変更できない。 一方設置の自由度を増すため明るさは可変にしたい。

そこで(その4)で述べたようにイネーブル信号をパルス幅変調(PWM)して明るさを可変にする事とした。 当初は2ms毎のラスタースキャンを起動しているTMR2をトリガーにTMR1とCLCを組み合わせてPWMを作る事を考えたが、やってみるとどうも上手く行かない。理由は不明だがTMR1にクロック(Fosc)が供給されないのだ。そこでCCPを使う事とした。CCPは元々TMR2と組み合わせてPWMを作る事が出来るようになっている。

この回路の動作の中心はクロック(Fosc/4)でカウントUPされる8ビットのTMR2である。TMR2の値がPR2と同じになると、 次のクロックでTMR2は0にリセットされる。すなわちPR2+1の周期のカウンタとなる。またこの時R-S・FFがSETされPWMのパルスがスタートする。さらにこのタイミングで割り込みを発生させることが出来る。

CCPでは10ビットのCCPRと10ビットに拡張されたTMR2とが比較され(10ビットのTMR2がFoscで駆動されていると考えると分かり易い)、一致するとR-S・FFがリセットされPWMのパルスが終了する。この動作が成り立つためには 0< CCPR <(PR2*4)の関係が成立している必要がある。

最初からCCPを使えばよかったように思われるが、そうしなかったのには理由がある。TMR2による2ms毎の割込み処理の中では先ず1行分のデータを作成し、次にSPIインターフェイスでデータをLEDの各桁まで届け、最後にラッチさせることでその行データがLEDを光らせる。つまり割り込みから実際の表示(ラッチ)迄の処理である程度の時間を取られる。一方明るさを制御するPWM信号はラッチを起点としたいが、実際は割り込みがカウント開始の起点となり処理に時間を取られるので望む結果が得られない。そこで処理の順番を変更し、割込みと同時にラッチを行うことでPWMの起点と整合させる事とした。その後次の割込みに向けて行データを用意し各桁へ届けて割込み処理を終える。このデータのラッチ(表示)は次の割込みの頭で行う。

 この方法でPWMパルスのデユーティ比は概ねCCPR/(PR2*4)である。この式から分かるがPR2が小さい場合にはPWMの細かい制御は出来ない。具体的には行スキャンレートを2msとするためのPR2の値は7なので明るさは3~4%単位での制御となる。

なお、R-EXTの値はテスト段階では室内用に10KΩを使ったがPWMを実装した後は1KΩにした。これでけっこう明るくでき、直射日光下でなければ昼間の屋外でも見えるだろうし、R-EXTを小さくすればもっと明るく出来る。LED1個当たりの最大平均電流は25mAなのでR-EXTは約800Ωまで下げることが出来る(ピークを考えるともっと下げられる)。一方それが最大16個並列になるので、ソースドライバは400mAのドライブ能力が必要だがTD62783は最大500mAのドライブ能力がある(推奨条件とは異なる)ので通常の動作は大丈夫だろう。

 (続く)

2025年6月8日日曜日

2色 8×8 マトリクスLEDを使う(その5)

 出すのが遅れたが制御部は次のような簡単な回路である。J101が外部インターフェイス用のRS-232Cコネクタ、J102とJ104はドライバー部との接続コネクタである。配置の自由度を増すため2個設けている。2つのジャンパーはソフト的にチェックして立ち上げモードを変更できるようにするためのものであり、またこの端子をデバッグ用信号の出力にも使っている。その2で見せた割り込み中を表すトレース波形はここから取り出した。

このユニットを作って驚いたのは、PICが極めて低消費電力なのは言うに及ばず、J101にRS-232cのケーブル経由でPCが接続されていれば電源を切っても動き続ける事である。回路的には何処からも電源が供給されていなくても、UARTのRX 端子(U-RX)に加わるHの信号電圧だけで機能している事になる。つまり入力ポートからの漏れ電流だけで動いていることになる。さらに5桁のマトリクスLEDを接続した状態でもこの動作は継続される。このとき暗闇で見るとLEDが薄く点灯して動作している。これには感動した。

(続く) 

 

2025年6月6日金曜日

2色 8×8 マトリクスLEDを使う(その4)

 5桁のLEDマトリクスを裏側から見るとこうなる。制御部は一番左の二階部分。全体を見るとコネクタが多くの経費を食っているようだ。

 

 使っているCコンパイラのバグに悩まされて手間取ったが(Cコンパイラのバージョンが古いままだったため原因不明の異常動作に悩まされたが最新のバージョンに上げたら安定した)、その後表示内容をスクロールさせる機能を追加することが出来た(以下はデータ量を減らすため動作が分かる程度のショート動画にしている)。


 

スクロールの基本的な構造は、表・裏2つの画面バッファを持ち(それらを瞬時に切り替えることも可能)、2つのバッファを(縦または横に)ループ状に繋げて連続的にシフトする事でスクロールさせている。左・上スクロールを組み合わせて斜め上スクロールも出来て、見てると浮遊感があるが見続けていると酔った感じになって気分が悪くなった。

機能は一通り出そろったので、これrらをユーザインターフェイスにどう纏めるかが課題となった。あと、LEDの明るさを抵抗で決めているがソフト的に変更できるようにしたい。そのためには現在BLINKの機能に使っているイネーブル端子をパルス幅変調する必要がある。このときパルスの周期を表示と同期させないとエイリアシングが発生して周期的に明滅するので一工夫する必要がある。とりあえずTimer1とCLCを使えば何とかなるだろう。

現在、前作の超音波測距センサーと組み合わせて反射物までの距離を表示させている。

(続く)


 

 

 

2025年5月31日土曜日

2色 8×8 マトリクスLEDを使う(その3)

 フリーのAsciiフォントを入手した事で文字列を表示できるようになった。8x8のフォントだが当初想定したより見易い。

誤っていた基板の配線も修正したバージョンを作成し、完成した基板5桁分を繋げてみた。3色の表示が可能だ。



ハード的には出来上がったが、まだ固定した形式でしか文字列を表示できないので、後はソフトにどういう機能を入れるか、だ。

(続く) 


 

 

 

2025年5月18日日曜日

2色 8×8 マトリクスLEDを使う(その2)

 ソフトを組むうえで改めて構成を考えてみた。色々数値を試算してみて、CPUクロック(Fosc)を4MHz(インストラクションサイクル(Fosc/4)は1MHz)、SPIクロックを500KHzとした(その後、場合によっては処理が間に合わない事が分かったのでCPUクロックを4倍の16MHzにした。以下のトレースはCPUクロックが4MHzの時点の写真である)。

LEDは8行(row)で構成されるが、各行を同じ明るさで表示するため、タイマーを使って行毎の表示時間を一定にする。タイマーの割込み間隔を2msにすると1秒間の表示回数は約62回(=1/(0.002*8))となる。行データは1桁に3バイトなのでLEDを5桁並べると15バイト、つまり120ビットである。これを500Kbpsで転送すると240μsかかり2msより充分短いのでソフトのオーバーヘッドを考慮しても問題ないだろう。次トレースは上が行ラッチのストローブ(2ms周期)、下がSPIクロックである。

これを拡大すると15個のSPIクロックの塊が見え1行15バイトのデータを(240μsではなく)800μsかかって転送していることが分かる。この処理を割り込み処理ルーチンの中で実行しているのでその間割込み禁止となっており、残り1200μsの中でアプリケーションを動かす事になる。
これをさらに拡大すると次の様に2μs周期(500KHz)のSPIクロックが見える。

ホストとの通信レートは9600bpsとするので最短でも1ms/バイト程度であり十分表示の合間に処理できるだろう。

ソフトもテストパターンを出せる所まで作った。


行表示タイマーの割込み間隔を色々設定できるようにしているが、2msより大きくするとチラつきが目立つようになる。さらに200ms程度に大きくするとスキャンの動作が見えてデバッグに役立った(配線の誤りを発見できた)。

その後CPUクロックを16MHzに上げた。その状態を表す次のトレースで上が2ms毎のラッチ信号、下がHで割込み処理中を表しており、割込み(表示)に500μsかかり、その他の処理に1.5msの余裕が出来たことがわかる。



 マトリクスに表示させる文字パターンはAscii文字を対象にし、著作権フリーのフォントデータを使い、そのほか任意のパターンを設定できるようにする予定である。

その前に誤っていたPCBのパターンを修正する必要がある(コネクタを裏面に取り付けた事でピン番号の偶奇が逆になっていた。今はソフト的にビットを入れ替える事で修正している)。

 (続く)

 

2025年5月10日土曜日

チャラン・ポ・ランタンは面白いぞ

 チャラン・ポ・ランタンの動画がYouTubeのお勧めに出た。全く知らないユニットだったが大道芸の動画らしく面白そうだったんで見てみた。女性二人組でボーカルとアコーディオンという組み合わせだ。きっと売れない芸人か本職の大道芸人がやっているんだろうと思って見たが、なかなか面白い。

何本か動画を見て、どんな人物がやっているのか興味が湧き検索してみた。二人は姉妹でアコーディオンを弾いている姉の小春はアコーディオンを531個売った実績があるとか・・・楽器店員かな?妹のももがボーカルで5歳年下らしい。

さらに調べると過去にTVドラマ「逃げ恥」の曲を担当した事があるらしい。へー、そうなんだ。 ももは2024年の紅白に椎名林檎と出場したとか・・・バックコーラスかな?動画を検索してみると、何と一曲丸ごと椎名林檎とデュエットしてる・・・知らなかった、実力派じゃないか。小春の弾くアコーディオンは右手側がピアノみたいな鍵盤式ではなくボタン式で珍しい。しかも目視できないボタンを物凄いスピードで弾き、しかも出てきたメロディに力みがなく美しい;神業だ。しかも活動を始めた頃からこのレベルに達していたようだ。

という事でここ数日 チャラン・ポ・ランタンの動画に嵌っている。もう15年以上活動していて今でも大道芸もやって投げ銭の量も半端ない。亀田誠治ともコラボした。ミスチルのをサポートしたり、海外のコンサートに出たりドイツでツアーをやった事もある。531個のアコーディオンは個人で会社を立ち上げて企画し、ネットで1日で販売したとか。Wikipedia を見ると色んな活動をしており多芸・多才なユニットだ。

もう古希も過ぎたが、まだまだ知らない事がいっぱいあるな~と思い知らされた一週間であった。

2025年5月5日月曜日

2色 8×8 マトリクスLEDを使う(その1)

 先日、秋月へ行ったら2色の8×8マトリクスLED15個入りのレールが300円で売っていたので思わず買ってしまった。


家に帰って改めて調べるとLITE-ONのLTP-12188Mというモデルで大きさは32mm×32mm、1個140円で売っているものが20円で買えたので1/7の値段だ。

内部は次のような結線で8×8×2色、アノード・コモンになっており足は24本ある。

さぁて、これをどう料理しようかと調べ始めた。

こういう場合は8行(ROW)を順にスキャンさせ、16列(COL)にデータを与える。出来ればドライバーを32mm×32mmに収め、水平方向にドッキングさせると横長に広がるようにしたいがどんな回路にしたら良いか。列に接続する電流制限のシリーズ抵抗だけで16本必要であり、8行(ROW)16列(COL)構成の駆動をするだけで8ビットのシフトレジスタが3個必要で、安易に作ると部品が基板からはみ出す。

ネットで色々調べると、74TC595AFという8ビットシフトレジスタ+ラッチと、TB62708BFという16ビットシフトレジスタ+ラッチ+定電流ドライバを使うと上手く行きそうな事が分かり、早速ドライブ部の設計を始めた。

これでロジック的には動きそうなのでPCB基板を考えた。
 
ちなみに、この回路のインターフェイスにはSPIを使い、3バイトで1行のデータを表示する。これを8回繰り返す事で8x8ドットを表示することが出来る。表示のリフレッシュレートを30回/秒とするとデータレートは最低5760bps(=3*8*30*8)必要となる。これを5個直列接続する場合は5倍の29Kbps必要である。実際にはソフトのオーバーヘッドを考慮してクロックを100Kbps以上にすれば良いだろう。1点注意が必要なのはTB62708BFのラッチが負論理のエッジトリガーなのに対し74TC595AFのラッチは正論理のエッジトリガーと逆になっている点である。間にインバータを1個入れれば問題ないが余計な部品を追加せずシンプルに済ませたい。そこで両者を同じトリガー信号で駆動する事とし、短いトリガーパルスを使うことで両者をほぼ同時にラッチさせる事とした。このトリガーパルスは負極性でも正極性でも問題なさそうであるが、実際には負極性だと上手く行かず消灯すべきLEDが暗く点灯する現象が発生した。
 

実装密度を上げ基板の面積を抑えるために表面実装部品(SMD)を積極的に使うようにした。PCBの設計で問題だったのはICチップのフットプリントである。ICの型番は分かって外形もSOP-16などと記述されているが実際の大きさが曖昧である。昔のDIPならソケットで規格化されていて簡単だがSOPには様々な大きさのパッケージがあり、どれを選べばよいか。幸い秋月では定規にあてたチップの写真を掲載してくれているので非常に助かった。あと、TB62708BFは足のピッチがインチ(1.27mm)ではなく1mmと変則的なので自分でフットプリントを作らざるを得なかった。

結局、出来上がった基板は32mm×32mmには収めきれなかった。

ここまで来て、改めて電流値を計算してみた。LEDの向きからTB62708BFを定電流シンクとして使う。1列の中で同時に光るLEDのは1個なのでドライブ能力は十分ある。一方74TC595AFを電流ソースとして使うことになるが1行最大16個のLEDを同時に駆動する必要がある。TTLの場合は電流ソースとしてのドライブ能力はとても低かったが今回のC-MOSでは改善され25mAある。しかし行ドライバーとして16個のLEDを同時駆動するには数百mAの電流が必要であり、全く足りない。この基板は未発注のままお蔵入りとなった。

やはり別途電流ドライバーが必要である。ここにNPNトランジスタのエミッタフォロワーが使えないか等と調べていたらTD62783という8チャネル500mAのソースドライバーを売っていたのでこれを使う事にし、次の回路を作った。

この回路は上の大きさの基板に収まりそうもないし、これ以上面積を大きくすると例え完成したとしても見栄えが悪すぎる。

 そこで基板を2枚に分けて直交させ、前面からはLEDのみが見え、不足する面積は奥行で解決する事とした。2枚の基板間はコネクタ接続としている。さらにPIC(16F18326)による制御部を追加して3枚の基板に仕上げた。

基板にVカットを入れた1枚の基板として発注したかったが規定以下のサイズと形状のため不可であり、そこでエッジカットを入れて1枚の基板として誤魔化して発注してみたが3枚とカウントされ追加料を支払うはめに・・・まあ、安いから良いけど。

 基板が届いて組み立てた。

背面の2段重ねの基板のうち上がPICを使った制御部で、下がLEDのドライバー部だ。制御部を外すとドライバー部はこうなる。

ドライバー部は横に連結して広げる事ができるようになってている。制御部1つで複数のドライバー部を制御する。何個連結できるかは主に電源容量とPICのドライブ能力に依存するが少ない数ではないだろう。

TB62708BFのR-EXT端子に接続する抵抗Rの値でLEDに流す電流を設定することが出来る。

とりあえずテストのために10KΩを入れた。 試しに330Ωを入れてみたが物凄く明るく直視できない。これでも発光時間は1/8だから平均電流に直したらLED1個当たり7mA程度の筈である。色々な場所で使えるようにするためにはENABLE端子をPWM信号で駆動して明るさを可変にするのが良いのかもしれない。

(続く)