Posts Tagged with "EAGLE"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on March 29, 2026 #1070

Geminiに設計してもらったプログラムを以下に示します。

// --- コンフィギュレーション設定(マイコンの基本動作設定) ---
#pragma config FOSC = INTOSC    // 内蔵クロックを使用
#pragma config WDTE = OFF       // ウォッチドッグタイマーOFF
#pragma config PWRTE = ON       // パワーアップタイマーON
#pragma config MCLRE = OFF      // 4番ピンをリセットに使わずGPIO(RA3)として使う
#pragma config CP = OFF         // コードプロテクトOFF
#pragma config BOREN = ON       // 電圧低下で安全停止
#pragma config CLKOUTEN = OFF   // クロック出力OFF
#pragma config LVP = OFF        // 低電圧プログラミングOFF(ICSP動作を安定させる)

#include <xc.h>

// 動作クロックの定義(__delay_msの計算に必要)
#define _XTAL_FREQ 4000000 

void main(void) {
    // --- マイコンの初期化 ---
    OSCCON = 0x6A;          // 内部クロック4MHzに設定
    ANSELA = 0x00;          // 全ピンをデジタルモードに設定(スイッチ入力に必須)
    TRISA = 0b00100000;     // RA5(2番ピン)を入力、他を出力に設定
    WPUA = 0b00100000;      // RA5を内部プルアップ設定
    OPTION_REGbits.nWPUEN = 0; // 内部プルアップ機能を有効化

    // PWM(調光)の初期設定
    PWM1CON = 0xC0;         // PWM1(5番ピン/RA2)を有効化
    PWM3CON = 0xC0;         // PWM3(3番ピン/RA4)を有効化
    T2CON = 0x04;           // Timer2 ON, プリスケーラ1:1
    PR2 = 255;              // PWMの周期設定

    // 制御用変数の宣言
    unsigned char mode = 1;      // 0:消灯, 1:交互ゆらぎ, 2:全点灯, 3:点滅
    unsigned char duty_L = 0;    // 左側の明るさ用変数
    signed char direction = 5;   // 明るさの変化量(プラスで明るく、マイナスで暗く)

    while(1) {
        // --- モード切り替えスイッチ判定(2番ピンをGNDに落とすと反応) ---
        if (RA5 == 0) {
            __delay_ms(20);      // チャタリング防止
            if (RA5 == 0) {      // 押し続けられているか再確認
                while(RA5 == 0); // 指を離すまで待機
                __delay_ms(20);  // 離した後の安定待ち
                
                mode++;          // モードを1つ進める
                if (mode > 3) mode = 0; // モード0〜3を循環
                
                // モード切替時に明るさ変数をリセット
                duty_L = 0;
                direction = 5;
            }
        }

        // --- 各モードの動作実行 ---
        switch(mode) {
            case 0: // 【全消灯】
                PWM1DCH = 0;
                PWM3DCH = 0;
                break;

            case 1: // 【アナログ交互ゆらぎ】★初期起動モード
                PWM1DCH = duty_L;           // 5番ピン(L)を出力
                PWM3DCH = (unsigned char)(255 - duty_L); // 3番ピン(R)は逆位相で出力
                
                // 明るさを変化させる
                if (direction > 0) {
                    if (duty_L < 250) {
                        duty_L += 5;
                    } else {
                        direction = -5; // 上限で反転
                    }
                } else {
                    if (duty_L > 5) {
                        duty_L -= 5;
                    } else {
                        direction = 5;  // 下限で反転
                    }
                }
                __delay_ms(40); // 変化のスピード調整(ニューヨークの夜景風)
                break;

            case 2: // 【全点灯】
                PWM1DCH = 255;
                PWM3DCH = 255;
                break;

            case 3: // 【同時点滅】
                PWM1DCH = 255;
                PWM3DCH = 255;
                __delay_ms(300);
                PWM1DCH = 0;
                PWM3DCH = 0;
                __delay_ms(300);
                break;
        }
        __delay_ms(10); // ループの安定用ウェイト
    }
}

コンパイル(build)は金槌のアイコンをクリックします。PICへの書き込みはダウンロードのような下向き矢印アイコンをクリックします。読み出しはアップロードのような上向き矢印アイコンをクリックします。書き込んだPICかみ書き込みかは読みだすとわかります。以下はプログラムしたPICをhexで読みだしたファイルの中身です。

:020000040000FA
:100000000128FE2BFF3FFF3FFF3FFF3FFF3FFF3F2A
:10001000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF0
:10002000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE0
:10003000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD0
:10004000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC0
:
:10061000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FEA
:10062000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FDA
:10063000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FCA
:10064000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FBA
:10065000FF3FFF3FF501F31F2E2B2F2B362BF20907
:10066000F309F20A0319F30A0130F500F11F392BDF
:100670003A2B3F2BF009F109F00A0319F10A70082F
:1006800071040319442B452B6C2B0130F4004F2BC4
:100690000130F035F10D890B492B0130F407F11FC2
:1006A000522B532B482B71087302031D592B7008D2
:1006B0007202031C5C2B5D2B612B7008F202710827
:1006C000F33B0130F136F00C890B622B0130F40260
:1006D000031D6B2B6C2B532B75080319702B712B7F
:1006E000762BF209F309F20A0319F30A7308F100F1
:1006F0007208F0000800203021008C0023008C01DB
:10070000203024008C0021009513043020009C0030
:10071000FF309B00C0302C009300C0309900F801DE
:10072000F90120008C1A952B962BED2B0330F0004D
:100730000030F1007808013EF2000030793DF3000E
:1007400083312A2383317108F9007008F8000230E0
:10075000F7008630F6009930890BAC2BF60BAC2BEA
:10076000F70BAC2B000020008C1EB72BB82BB32B43
:10077000ED2BFF302C009200FF309800912BFA01F6
:100780007A082C0092007A0998000D30F600FC30AF
:10079000890BC82BF60BC82B0130FA077A0A031D08
:1007A000D22BD32BC02BFF30FA007A082C009200FA
:1007B0007A0998000D30F600FC30890BDD2BF60B22
:1007C000DD2B0130FA027A08031DE72BE82BD52B2D
:1007D000912B2C0092019801912B7908003A031972
:1007E000F22B912B7808003A0319B92B013A03191F
:1007F000BF2B033A0319E92B912B012820007B2BF7
:020000040001F9
:04000E00843FFF3FED
:08000000FF3FFF3FFF3FFF3F00
:00000001FF

左矢前のブログ 次のブログ右矢

posted by sakurai on March 28, 2026 #1069

ガーバーデータ及び完成したPCBを示します。

図%%.1
図1069.1 点滅回路ガーバー図

製造はいつものようにJLCPCBに依頼し、PCB製造は2.0日間で2 USD、配送料は3日で13.5 USDでした。 最終的に3月24日午前に発注して、3月27日にPCBを香港からの航空便で受け取れたので、中2日しかかかっていません。驚異的な速さです。

図%%.2
図1069.2 点滅回路PCB

左矢前のブログ 次のブログ右矢

posted by sakurai on March 26, 2026 #1067

Studio 500 3D Pop Up Wall Artの修理をすることになりました。LEDが点滅しなくなったので、点滅回路を作成します。

図%%.1
図1067.1 Studio 500

まずPICを用いて点滅シーケンスを再現します。EAGLEで作成した回路図は以下のようになります。上部のコネクタはin-circuitでPICプログラミングするためのコネクタです。

図%%.2
図1067.2 点滅回路図

以下にレイアウト図を示します。

図%%.3
図1067.3 点滅回路レイアウト図

左矢前のブログ 次のブログ右矢

FM-7 ROM吸出し器の改版 (3)

posted by sakurai on May 15, 2020 #258

PICの開発環境

早速、開発環境とCコンパイラをインストールし、PICプログラマを購入しました。

対象となるPICマイコンは、秋月電子でも入手可能なPIC12F1501-I/Pとします。

図%%.2
図258.2 PICマイコン

Eagleによる設計

PICマイコンをプログラマブルタイマーとして使用した回路図V5を図258.3に示します。回路は多いようですが、ほとんどがコネクタであり、Arduinoが1個と今回追加した8pinのICが全てです。他はZ80コネクタ、ロジアナ用ピンヘッダ、PICプログラム用コネクタから構成されます。

図%%.3
図258.3 FM-7IntruderV5の回路図
以前に格安PCB業者を調べましたが、今回は最安だったJLCPCBにオーダーしました。5枚で送料込みで17.95 USDです。ここは安いだけでなく、製造も速くて2~3日で製造します。
図%%.4
図258.4 FM-7IntruderV5の基板図

左矢前のブログ 次のブログ右矢

FM-7 ROM吸出し器の改版

posted by sakurai on May 13, 2020 #256

FM-7 ROM吸出し器にDRAMリフレッシュ回路を追加

過去記事において、表記のボードを開発しましたが、DRAMのリフレッシュを失念していました。そこで、前回のオールソフトウエア(?)回路に対して、ハードウエアでリフレッシュ回路を追加します。バイトアクセスはオールソフトウエアで可能なことを実証できたのですが、DRAMリフレッシュは2msec以内に128カラムアドレスにアクセスが必要、という制約があるため、ソフトウエアでは厳しいと思われます。従って、ハードウエアで構成しますが、タイミング回路なので意外に回路規模を必要とします。せっかくArduino 1個で済ませたので、最小の回路構成としたいところです。

アナログタイマーIC 555

最初に思いついたのは小型のタイマーICである555です。ところがこれはアナログICであり、時定数設定のためにRやCを複数必要とします。さらに、リフレッシュ周期だけでなくリフレッシュパルス幅を確保しようとすると、555の2個入りを使用する必要があるだけでなく、外付けCRも倍の数になり、シンプルになりません。設計してみたものの嫌になりました。

図%%.1
図256.1 NE555回路図

プログラマブルタイマーPIC

そこで、プログラマブルタイマーで検討したところ、PICマイコンを使用すれば、開発環境その他は必要となりますが、8pinのIC1個で行けそうです。デジタルのほうがシンプルで、かつ調整も無くて好きです。

図%%.2
図256.2 バス権調停信号図

PICのリフレッシュアルゴリズム

リフレッシュアルゴリズムは以下のように考えています。

  • 6809が\$FD05に1を書き、Z80W信号をLにします(Z80W=$6809/\overline{\text{Z80}}$)。
  • ArduinoはPICからのバス権の要求RFREQが無ければ、RFGNTをLにしてバスを獲得します。バスアクセスはQB/EBをアサートすることで行います(RFGNT=$\text{PIC}/\overline{\text{Arduino}}$)。
  • Z80W信号がLの際に、PICから周期的にRFREQをHとしてバス権要求をArduinoに通知します。
  • Arduinoはバスアクセス中であれば終了後にバス権を放し、PICにRFGNTをHとして通知します。
  • PICはRFGNTがHであればリフレッシュ可能と判断し、*REFCKをLとします。
  • バス調停のオーバヘッドを削減するため、PICは*REFCKは4回アサートします。その代わり、リフレッシュ周期は1/4の16KHzとなります。
  • リフレッシュが終了すると、PICはRFREQをLにします。
  • ArduinoはPICがバス権を放したと判断してRFGNTをLにしてバスを獲得します。

図%%.3
図256.3 バス権調停タイミングチャート

左矢前のブログ 次のブログ右矢

posted by sakurai on January 28, 2019 #82

3D化による検討

基板と部品の配置を行うために3D化をします。これにより部品どうしの干渉などが発見できます。そのためには3D CADと3D部品が必要ですが、ここでは無償で使用可能なSketch Upを使用してみました。さらにEAGLEからSketch UPへのプラグインが必要となります。

そのプラグインの場所はここです。 https://eagleup.wordpress.com/

ImageMagickを入手してパスを記録しておいてください。ImageMagickのインストール時には、レガシーツール(convert.exe等)もインストールするように、チェックしておいてください。

EAGLEのULP->Browseをクリックし、EagleUpを実行します。最初の一度だけパスを表示する画面が出るので、必要な情報を入力します。

図82.1
図82.1 EAGLE内からEagleUpを実行

EAGLEからULPを開き、EagleUPを実行すると、SketchUpのプラグインで読み込む情報(.eupファイル)が生成されます。SketchUpを立ち上げ、プラグインを実行し、今作成された.eupファイルをロードしたものが図82.2です。ただし部品が一部未搭載です。

図82.2
図82.2 SketchUp内からEagleUpを実行

レンダリングしたものを図82.3に示します。ただし部品が一部未搭載です。

図82.3
図82.3 レンダリングしたボードイメージ

左矢前のブログ 次のブログ右矢

posted by sakurai on January 27, 2019 #81

プロトタイプボード

以前UltraZedボードに実装したスペースインベーダーを移植します。

Ultra96にはPMODインタフェースが無いため、PMODインタフェースを持つVGAインタフェースボードI2Sインタフェースボードを接続するためのインタフェースボードを作成します。

仕様

Ultra96にPMOD仕様カードを接続するために、PMODコネクタだけでなく、レベル変換ICを搭載します。PMODは3.3V電源が標準ですが、Ultra96の低速インタフェースは1.8V電源であるため、1.8V⇐⇒3.3Vレベル変換ICが必要です。さらにUltraZedにも接続可能なように設計します。もともとUltraZedはPMODインタフェースが搭載されているので、論理的な意味は無いのですが、PMODカードが複数あり、抜き差しする手間を減らすために、共用にしてみました。

サプライヤ

プロトタイプボードを作成する場合には、これもひと昔前はワイアラッピングやハンダ付けで作成したものですが、最近では10ドル以下で5枚程度のPCBを作成できる工場が現れてきました。これだとユニバーサル基板で作成したほうが高くつくくらいです。送料は別として、

https://www.pcbway.com/⇒基板10枚で5USD
https://www.fusionpcb.jp/⇒基板10枚で4.9USD
https://www.boktech.cc/⇒基板5枚で1USD
https://jlcpcb.com/⇒基板10枚で2USD

Boktechはなんと5枚製造して1ドルという、ユニバーサル基板よりも安い金額ですが、送料が別途20ドル程度かかるので、今回はFusion PCBにしてみました。10枚製造して送料込みで7.9ドルです。

PCB設計ツール

PCB設計ツールも無償のものがあり、無償の範囲で十分実用的なPCBが設計できます。今回はEAGLEというPCB設計ツールをインタフェースボードの設計に使用してみました。

図81.1
図81.1 EAGLE設計画面

PCB製造業者とはGarberフォーマットのファイルでインタフェースしますが、設計が完了したレイアウトデータをビュワーにかけたものが図81.2です。

http://mayhewlabs.com/webGerber/

図81.2
図81.2 基板イメージ

左矢前のブログ 次のブログ右矢