JD-STER不参加と暇つぶし

デバッグ中 雑談
デバッグ中


参加するぞと準備を進めてきたJD-STERですが、総監督の入院に加え、助監督の体調不良が重なり、平メンバーである当方の自走単独参加は無理筋となり、残念ながらJD-STER第三ステージは全員不参加となりました。
今年は最終戦が月末にまだあるのですが、これも開催日の都合で当方は参加できません。
ということで今シーズン完全不参加、来シーズンまで当方はお預けとなりました。

今のところJD-STERは逃げないので車両を整える方向で整備し来年に備えます。

最近、東京地方はずっと雨模様、土日もずっと雨、塗り残しの塗装もあるのですが、まったく作業が進みません。ランツァなんかずっと放置時間が長くて乗りたいのに乗れない状態です。
外装の色を変え、合わせてタンクも塗装したいのに塗装ができず、ラッピングでも試してみるかなぁなんて思ってるところです。
週末は予定を繰り上げたのが失敗したようで、用事を先に済ませた土曜日は曇り空、日曜日は知っての通り土砂降り。全部の予定が狂ったので部屋で実施出来ることに切り替えます。

最初はまた、欠けてしまったサイドカバーの修復。
重曹や瞬間接着剤とか、youtubeにある動画の方法もいろいろ試して見ましたが、長持ちせずやっぱり分解してしまいます。
今回は最初から処置していたプラリペアに戻り、プラリペアのHPの推薦修復方法を試してみます。
1)接合面をV字カットし、接合面積を増やす
2)ガラスクロスを使って割れた部分を強化。(プラリペアから専用品が出てます)

例によって作業中の写真は取り忘れ、1)と2)の両方を使ってみたので暫く使って、その内感想を述べます。今度は忘れるくらい長期もってくれるとありがたい。

次に作業したのは4CHのOSR-CDI怪V2を手元で切り替える装置です。
そもそもOSR-CDI自体に切り替えスイッチを付けた怪V1は使い勝手が悪く、手元の切替を置こうと考え出しましたが小型のローターリースイッチでは手袋をしたままでは操作しにくい。
どうすぺっかなぁと考えていたら、ホーンスイッチを利用したQiuckShifter用のスイッチ増設を考えたよな!、そうだあれを使おう、頂戴良いしということで作った回路が以下のような代物(ホーンスイッチはイメージ的に置いただけで実際はフォトリレーでも間に置くつもりです)

この回路の合うように作ったファームウェアがこれ(しっかりバグ付き)
途中で仕様をあれこれ変えたので意図しない説明が残ったままです
久しぶりに当方としてはプログラムを組んだのでゆっくり修正しようと思う。
単純なバグだと思うが時間切れでまた今度状態だ。

仕様 
1)スイッチを1回押すことにOSR-CDIのパターンが変わる
2)4つの赤色LEDでパターンの位置を示す。
3)抵抗入り赤色LEDを使う(回路図には便宜的に抵抗とLEDのセット)
4)LEDの照度が低いため、炎天下の切り替わりにLEDを走らせて位置の確認をできるようにする
5)パターンを切り替えるごとにEEPROMに情報を保存し電源再投入の際に元に戻るようにする

しかし、相変わらずプログラムセンスがないな。専門の人がみたら、こいつは素人だなと思うであろうくらいの統一感がない。4)なんかLED0から固定で走るというセンスのなさ(自虐)

バグ:再電源投入時にEEPROMから読みだした値とは異なる+1された状態でLEDが点灯する。
ハード的にプルアップしてる(回路図では省略)ので論理的にはHIのはずだがRA3が不安定になってようで、スイッチを押したと同じ状況でLOWを1発カウントしているみたい。

//----------------------------------------------------------------------------
//               +--- U ---+
// (5V) ---------| 1     8 |------  (GND)
// (QShifter)<---| 2     7 |------> (LED4)
// (LED1) <------| 3     6 |------> (LED3)
// (SW) ---------| 4     5 |------> (LED2)
//               +---------+                   
//               PIC12F1822                   
//                                         
//                                                  2026/09/07 Mooncat
//------------------------------------------------------------------------------
#include <xc.h>

// コンフィグレーション設定
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = ON, MCLRE = OFF
#pragma config CP = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF

#define _XTAL_FREQ 8000000

// ピン定義
#define SW PORTAbits.RA3

// EEPROMのアドレス定義
#define EEPROM_ADDR_PATTERN 0x00

// 8bit PWM (デューティ比 0〜255) の設定値
const unsigned char pwm_duties[4] = {0, 85, 170, 255};

// --- EEPROM読み書き関数 ---
unsigned char read_eeprom(unsigned char addr) {
    EEADRL = addr;
    EECON1bits.CFGS = 0;
    EECON1bits.EEPGD = 0;
    EECON1bits.RD = 1;
    return EEDATA;
}

void write_eeprom(unsigned char addr, unsigned char data) {
    // 現在値と同じであれば書き込まない(EEPROM寿命保護&不必要な処理回避)
    if (read_eeprom(addr) == data) {
        return;
    }

    EEADRL = addr;
    EEDATA = data;
    EECON1bits.CFGS = 0;
    EECON1bits.EEPGD = 0;
    EECON1bits.WREN = 1;
    
    // 割り込み禁止(GIE退避)
    unsigned char gie_status = INTCONbits.GIE;
    INTCONbits.GIE = 0;

    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1bits.WR = 1;

    // 割り込み状態の復元
    INTCONbits.GIE = gie_status;
    
    while(EECON1bits.WR);
    EECON1bits.WREN = 0;
}

// すべてのLEDを消灯する関数 (すべてソース駆動: ALL LOW)
void clear_all_leds(void) {
    LATA &= 0b11100000;
}

void init_sys(void) {
    OSCCON = 0b01110010;    // 内部クロック 8MHz
    
    // アナログ機能および特殊モジュールの完全無効化
    ANSELA  = 0x00;         // 全ピンデジタルI/O
    CM1CON0 = 0x00;         // コンパレータ1 OFF
    CPSCON0 = 0x00;         // 容量センシング(CPS) OFF
    
    TRISA   = 0b00001000;   // RA3のみ入力、その他出力
    
    // 初期状態:LATAクリア(全LED消灯)
    clear_all_leds();
    
    // RA3 (スイッチ) 内部プルアップ設定
    OPTION_REGbits.nWPUEN = 0; // 内部プルアップ全体許可
    WPUA       = 0b00001000;   // RA3プルアップ
    
    // PWM (CCP1) 設定: RA5ピンへリマップ (CCP1SEL = 1)
    APFCONbits.CCP1SEL = 1; 
    CCP1CON = 0b00001100;   // PWMモード
    PR2 = 255; 
    T2CON = 0b00000100;     // TMR2 ON, プリスケーラ 1:1
}

// 起動時のLED流れるアニメーション処理 (LED1 -> LED2 -> LED3 -> LED4)
void opening_animation(void) {
    clear_all_leds();
    
    // LED1 (RA4)
    LATA = (LATA & 0b11100000) | (1 << 4); __delay_ms(70);
    // LED2 (RA2)
    LATA = (LATA & 0b11100000) | (1 << 2); __delay_ms(70);
    // LED3 (RA1)
    LATA = (LATA & 0b11100000) | (1 << 1); __delay_ms(70);
    // LED4 (RA0)
    LATA = (LATA & 0b11100000) | (1 << 0); __delay_ms(70);
    
    clear_all_leds();
    __delay_ms(100);
}

// パターンに応じたLED表示制御
void set_pattern(unsigned char pattern) {
    unsigned char temp = LATA & 0b11100000;
    
    switch (pattern & 0x03) {
        case 0:
            temp |= (1 << 4); // LED1 (RA4) ON
            break;
        case 1:
            temp |= (1 << 2); // LED2 (RA2) ON
            break;
        case 2:
            temp |= (1 << 1); // LED3 (RA1) ON
            break;
        case 3:
            temp |= (1 << 0); // LED4 (RA0) ON
            break;
    }
    
    LATA = temp; // 一括更新
    CCPR1L = pwm_duties;
}

void main(void) {
    init_sys();
    
    // 電源投入直後の安定待ち
    __delay_ms(100);

    // オープニングアニメーション実行
    opening_animation();
    
    // EEPROMからパターン復元
    unsigned char current_pattern = read_eeprom(EEPROM_ADDR_PATTERN);
    if (current_pattern > 3) {
        current_pattern = 0;
        write_eeprom(EEPROM_ADDR_PATTERN, current_pattern);
    }
    
    // 復元したパターン適用
    set_pattern(current_pattern);
    
    // 起動時チャタリング/ノイズ防止用の安定化ウェイト
    __delay_ms(200);
    
    while(1) {
        // スイッチ入力判定 (チャタリング防止対策強化)
        if (SW == 0) {
            __delay_ms(20); // 20ms待機
            if (SW == 0) {  // 確定
                // 1ステップ進める
                current_pattern = (current_pattern + 1) % 4;
                
                // 表示更新とEEPROM保存
                set_pattern(current_pattern);
                write_eeprom(EEPROM_ADDR_PATTERN, current_pattern);
                
                // スイッチが離されるまで待機(チャタリング防止用ウェイト入り)
                while (SW == 0) {
                    __delay_ms(10);
                }
                __delay_ms(50); // 離した後のチャタリング吸収
            }
        }
    }
}


バグフィックスしてる最中に虎の子のPICKIT3に異常が出るようになった。
たぶん。機器の寿命かと思う。
書き込みはMPLAB IPEで書き込むのだが、イレース→ブランクチェック→プログラミングまでは正常に動作するのだが、単独でベリファイを行うと
EEData memory
Address: 0 Expected Value: ff Received Value: 2
Verify failed
MPLABComm USB Version: 3.47
MPLABComm Serial Access Version: N/A

一応PICKIT3のファームウェアも強制的に書き換えたが治らない。
所詮中古だし別のPICKIT3を使うけど、そろそろマイコンごと乗り換えた方がいいのなぁと思う。
結構高いんだよね。PICKIT5


コメント