Vol.928 10.Oct.2025

NHK_ONE(ワン) Windows10から11への道 MCP2515モジュール

N NHK ONE(ワン)

by fjk

 スマホで「NHK+」と「NHKニュース防災」を使っていたが、10月1日から同サービスが「NHK ONE」に代わり、再度、利用登録が必要になった。
 
● 既にNHKプラスを利用している場合の手続きは(NHKのHPから)、

@ NHK ONEアカウントの登録にあたって
【旧NHKプラスを利用されていた方はこちら】をクリックしてください。
A NHKプラスからの移行手続きをされる方へ
旧NHKプラスに登録されていた方は受信契約の確認ができていますので、別途の契約や追加のご負担は必要ありません
B パスワード設定
【NHKプラスに登録されていたメールアドレス】を入力してください。そのアドレスに6桁の認証コードを記したメールが届きますので、画面にコードを入力してください。
C パスワードの再設定
改めて任意のパスワードを設定してください。
D アカウント登録完了
「ログイン画面に進む」をクリックし、プロファイルを設定していただくと、NHK ONEの配信サービスをご利用いただけます。
※ プロファイル設定について
・1つの「NHK ONE アカウント」につき「プロファイル」を5つまで作成することができます。
・プロファイルは「アカウント設定ページ」の「プロファイル管理」画面から作成してください。
・NHK ONEでは世帯(同一生計、同一住居)ごとに1つのアカウントをご登録・ご利用いただくことができます。

★早速、10月1日に、

@「NHKプラスからの移行手続き」に従い、WEBで「NHK ONEアカウント」を登録。
  (登録時には、旧「NHK+」のメールアドレスとパスワードが必要)
A アカウントで登録したメールアドレスに、6桁の認証コードが送られてくるので、入力。
B NHK ONE用の「パスワード」を再設定。
C 「NHKプラス(NHKone)」の新アプリをスマホにインストール
D 起動後、「メールアドレス」と「パスワード」を入力
E 「プロファイル」を作成(最低一つは必要)
F 利用するプロファイルを設定すると、「NHKプラス(NHKone)」が使えるようになった
 
*さらに、「NHK ONE ニュース防災」の新アプリもスマホにインストールしました。
 
◎ テレビで見る場合は、「NHKプラスアプリ(テレビ向け)で視聴する」を参照。
 
◇ パソコンで見る場合は、「NHK ONE」にアクセス(「ニュース」「天気防災」なども見れます)。


W Windows10から11への道 〜セキュアブートの設定

by fjk

 abc926で「Windows11にアップグレードできない」と報告していたWin10マシンですが、ネットで良く調べて見ると、BIOSの更新でTPM設定ができることが判り、無事TPM2.0にすることができた。
 ところが、再起動してみると、それでも何故か「システム要件を満たしていない」と表示される。
 更に調べて見ると、「セキュアブートの問題」らしいことが判った。特に、「起動HDDがGPTでなければならない」とある。HDDのパーテションを調べて見ると、やはりMBRだった。
 そこで、mbr2gptを使って、データをそのままで、パーテションをGPTに変更し、BIOSで「UEFI起動」に設定した。
 再起動後、「PC正常性チェック」を行うと、「Windows11の要件を満たしている」となった。
 しかし、Windows Updateに「Windows11アップグレード」が表示されないので、「更新アシスタント」でWindows11をインストール。
 いろいろと壁がありましたが、何とかWindows11にアップグレードできました。

  【参考】

・TPMの確認:
TPM2.0かどうかを確認する方法・有効にする方法
・BIOSでTPMの変更(ASUSの例):
Windows11 をサポートするモデルとBIOSでTPM 2.0 を設定する方法
・セキュアブート?:
Windows 11でセキュアブートを有効化できない原因と対処法
・パーテションチェック:
MBRかGPTかの確認方法と変換方法
・MBRからGPTに:
WindowsのシステムドライブをMBRからGPTに変換する方法
・BIOSでセキュアブートの変更(ASUSの例):
セキュアブートの有効/無効を設定する方法
・正常性チェック?:
PC 正常性チェック アプリをダウンロードする方法
・正常性OKなのにアップグレードが非表示:
Windows 11アップグレードがWindows Updateに表示されないときの解決策・注意点
・Windows10に戻す(10日以内):
Windows 11からWindows 10に戻す方法

 あ、そうそう、Windows11へのインストール中、数分以上画面が真っ暗(マウスアイコンも表示されない)になることがある。この状態はまだインストール途中なので、焦らず何もせず待っていて下さい。慌てて何かをするとパソコンが起動しなくなるかも知れません。「次のメッセージ」が出るまで、30分位はこの状態で待つこと。インストールが終わるまで数時間かかることもあるので、気長に・・。


P PICでCAN通信(2) 〜MCP2515モジュール

by fjk

 前報(abc927)でPIC-PIC間のCAN通信ができたが、「MCP2515モジュールでCAN通信の実験2(PIC)」(きむ茶工房)を参考に、CAN機能が無いPIC16F18326とMCP2515モジュール(KKHMF、Amazon、3個1,300円)[ノード4]を使ってCAN通信をテストした。
 
【きむ茶工房さんのオリジナルから、以下を変更・追加した】

1.SPIマクロ:
#define SPI_transfer(a)   SPI1_ExchangeByte(a)  // [mcp_can_dfs.h]
2.CANのCS変更:
#define MCP25XX_SPI_CS  LATCbits.LATC3     // [stMCS.h]
3.ピン割込処理:
void IOCAF2_Process(void)      // EXT_INTモジュールを使用
4.SPIの有効化:
SSP1CON1bits.SSPEN = 1;     // SPI1を有効に(デフォルトでSPIは無効)

【ハード】

  • MCP2515モジュールのピンヘッダーは、ハンダ吸い取り器で半田付けを外し、基板の上下を逆に取り付け。
  • MCP2515モジュールのJ1はジャンパーピンでショートし、終端抵抗の120Ωを有効にした。
  • ディスプレィはスペースの関係で「0.96inch有機ディスプレィ」(秋月#112031、@580)を使用。
  • USBシリアルは5V電源供給を兼ねて「FT234X 超小型USBシリアル変換モジュール」(秋月#108461、@780)を使用。
  • フォントROM(24FC1025[秋月#103570]など)はオプションで使用可(ROMは無くてもCANテストは可能)。


PIC16F18326によるCAN通信実験回路図(INT不使用ならLED使用可)

BB配線(ソケットはROM用)

【ソフト】  MCC設定


System Module

EUSART Module


Pin Module (RA3ピンを入力ピンに)

MSSP1(SPI) Module

MSSP2(I2C) Module

・System:
クロックは32MHz。LVPは使わない(チェック外す)
・Eusart:
ボーレートを115200bpsに
・Pin:
RA0/4/5はWPUを有効、RA2をピン割込を設定
・Ext_Int:
RA2割込、EXT_INT(立ち下がり)に設定
・MSSP1:
SPI-Master、Mode_0、4000kHz
・MSSP2:
I2C-Master、400KHz

EXT_INT Module

★ きむ茶工房さんのsKMCPxx.c/hとmcp_can_dfs.hを利用させていただいた。
  ほとんどオリジナルのままだが、MCC用に以下を追加・修正

@ mcp_can_dfs.hでMCS2515を選択するポートを変更
	#define MCP25XX_SPI_CS        LATCbits.LATC3      // RC3をCSとする
A stMCP25xx.hで、SPI関数がオリジナルとMCCで異なるので、マクロで対応(#includeも必要)
	#include "myProject.h”

	#define SPI_transfer(a)     SPI1_ExchangeByte(a)
B stMCP25xx.hで、delayマクロ用の動作周波数の指定はMMCで指定済みなので、コメントに
−>詳細は添付ファイル参照

★ その他の変更・追加部分は、

  1. C99に対応するため、myProject.hで「delayマクロ」を宣言
  2. 「EUSARTの設定」はabc917などを参照
  3. 「OLEDライブラリ」はi2c_SSD1306.c/h(abc907など)からその一部を利用
  4. 「myFunction」(abc924など)もその一部を利用
  5. sprintf()を使わないで、自作関数にするとPIC16F18325(ROM=8k)でもテスト可能
  6. 画面最下部に「受信データを半角文字で表示」を(#define USE_HCHAR 宣言で)選択可
  7. なお、受信データのスクロール機能は手抜きの簡易型で、行が上に移動しない(書込行が移動するだけ)。

ノード4のプログラムリスト

● CAN 通信のテストは、今回作った「ノード4」と、abc927で作った「ノード2(リモート)」を使用した。

@ノード4で「プッシュスイッチを押す」か「ターミナルから'R'コマンドを送信」すると、リモートフレームを送信。
Aノード2では、リモートフレームを受信すると、アナログ電圧値を読取り、電圧値をデーターフレームで返信。
Bノード4では、受信したデーターフレームデータをOLED(とUSB端末)に表示。

【動作テスト】
 電源投入後、CANが立ち上がるまで3秒待ってから、スイッチを押す(またはRコマンド入力)と、OLEDとテラターム画面にノード2の設定電圧が表示され、CAN通信が正常にできていることを確認した。


CAN通信テスト状況(最下行は最後に受信したデータ)

テラターム画面例


【おまけ】
 当初、RA0を送信スイッチ入力にしたが、ICSPを接続したままだと、入力が正しく判断されなかったので、テスト中はRA3(通常はMCLR/リセット入力)を送信スイッチ入力にした。MCCでRA3を汎用入力とするには以下を参照。
 なお、SW0(RA0)をスイッチ入力(WPU付)に変更し、ICSPを外すと、SW0入力で正常に動作することを確認した。

★ MCCでRA3(MCLR)を入力ポートにするには

@ 低電圧プログラムを使わない(systemでLVPのチェックを外す)

A CONFIG2のMCLREで”dijital input”に設定

B ピン設定でRA3を入力ピンにする(RA3は入力のみ使用可)
 


≪≪ ノード4 ≫≫   ▼abc928-18326.c(zip)

/*****************************(abc928-18326.c)***
 *      CANモジュールテスト            
 *************************************************/
#include "myProject.h"
#include "myFunction.h"
#include "mcp_can_dfs.h"
#include "skMCP25xx.h"

#define GET_SW()    SW0_GetValue()      // スイッチはSW0を使用
//#define GET_SW()    RA3_GetValue()    // スイッチはRA3を使用

#define USE_HCHAR                       // 半角文字表示指定

#ifdef USE_HCHAR
  #define OLED_MX_LN  4                 // 画面最下部に半角文字表示
#else
  #define OLED_MX_LN  7                 // 画面フルスクロール
#endif

//----- シリアル通信用データ
char     RBuf[EU_BFSIZE];               // SIZEはmyProject.hで宣言
uint8_t  SFlg;                          // シリアル受信フラグ

//---- CAN用共通変数の宣言
unsigned char flagRecv = 0 ;            // CAN受信有無フラグ
unsigned char len = 0 ;                 // CAN受信データサイズ
unsigned char RcvBuf[8];                // CAN受信データ

//---- Font data -----
const char hk[11][16] ={
   { 0x00,0xF8,0x04,0x02,0xC2,0x24,0xF8,0x00,
     0x00,0x0F,0x14,0x23,0x20,0x10,0x0F,0x00 },  // 0
   { 0x00,0x10,0x08,0xFE,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00 },  // 1
   { 0x00,0x18,0x04,0x02,0x82,0x44,0x38,0x00,
     0x00,0x38,0x26,0x21,0x20,0x20,0x20,0x00 },  // 2
   { 0x18,0x04,0x82,0x82,0x82,0x44,0x38,0x00,
     0x0C,0x10,0x20,0x20,0x20,0x11,0x0E,0x00 },  // 3
   { 0x00,0xC0,0x30,0x0C,0xFE,0x00,0x00,0x00,
     0x03,0x02,0x02,0x02,0x3F,0x02,0x02,0x00 },  // 4
   { 0xE0,0x5E,0x22,0x22,0x22,0x42,0x80,0x00,
     0x0C,0x10,0x20,0x20,0x20,0x10,0x0F,0x00 },  // 5
   { 0xF0,0x8C,0x42,0x42,0x42,0x84,0x00,0x00,
     0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00 },  // 6
   { 0x02,0x02,0x02,0x02,0xE2,0x1A,0x06,0x00,
     0x00,0x00,0x00,0x7E,0x01,0x00,0x00,0x00 },  // 7
   { 0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x00,
     0x0E,0x11,0x20,0x20,0x20,0x11,0x0E,0x00 },  // 8
   { 0x78,0x84,0x02,0x02,0x02,0x84,0xF8,0x00,
     0x08,0x10,0x21,0x21,0x21,0x10,0x0F,0x00 },  // 9
   { 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
     0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00 }   // :
};

const char sp[16] = {
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };  // space

const char as[6][16] ={
   { 0x00,0xC0,0x38,0x06,0x38,0xC0,0x00,0x00,
     0x3C,0x03,0x02,0x02,0x02,0x03,0x3C,0x00 },  // A
   { 0xFE,0x82,0x82,0x82,0xC4,0x38,0x00,0x00,
     0x3F,0x20,0x20,0x20,0x20,0x11,0x0E,0x00 },  // B
   { 0xF0,0x0C,0x02,0x02,0x02,0x04,0x08,0x00,
     0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00 },  // C
   { 0xFE,0x02,0x02,0x02,0x04,0x18,0xE0,0x00,
     0x3F,0x20,0x20,0x20,0x10,0x0C,0x03,0x00 },  // D
   { 0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
     0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00 },  // E
   { 0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
     0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }   // F
};


/*--------------------------------------------------*
 *  割り込み処理関数                                *
 *--------------------------------------------------*/
//----  MCP2515のINTピン割り込み
void IOCAF2_Process(void){
     flagRecv = 1 ;             // CAN割込有りフラグセット
}

/*--------------------------------------------------*
 *  OLED表示用関数                                  *
 *--------------------------------------------------*/
//---- 半角文字列の表示
void i2cPrint_Hstr(uint8_t py, uint8_t x, char *str){
    uint8_t n;
    uint8_t xpos;
    xpos = x;
    while(*str){
        n = *str;
        if((0x30<=n)&(n<=0x3A)){
            xpos = i2cOLED_Ptn(py,xpos,2,8,(char *)hk[n-0x30]);
        }else if((0x41<=n)&(n<=0x46)){
            xpos = i2cOLED_Ptn(py,xpos,2,8,(char *)as[n-0x41]);
        }else{
            xpos = i2cOLED_Ptn(py,xpos,2,8,(char *)sp);
        }
        str++;
    }
    return xpos;
}

//---- スクロール付き表示 (スクロール範囲は[0-OLED_MX_LN])
void i2cOLED_Prt(char *str){
    i2cOLED_posPX(CrtLn,0);
    i2cOLED_str(str);
    if(CrtLn < OLED_MX_LN) CrtLn++;
    else                   CrtLn = 0;
    i2cOLED_Clr(CrtLn,CrtLn,0);
}

/*------------------------------------------------*
 *  CAN受信の処理                                 *
 *------------------------------------------------*/
void CheckReceiveProcess(void) {
    union {  unsigned char c[2] ;
             unsigned int  i ;
          }   data ;
    unsigned long id ;
    char buf[16];

    // INTピン割り込みが有れば処理する
    if(flagRecv) {
        flagRecv = 0 ;                  // 割り込みフラグをクリア
        while (CAN_MSGAVAIL == mcp_checkReceive()) {
            // 受信したメッセージを読み込む,
            mcp_readMsgBuf(&len, RcvBuf);
            // データフレームなら処理する
            if (mcp_isRemoteRequest() == 0) {
                id = mcp_getCanId() ;
                switch (id) {
                    case 0x123 :        // 可変抵抗値の識別子ID
                        data.c[0] = RcvBuf[0] ;
                        data.c[1] = RcvBuf[1] ;
                        sprintf(buf,"%03X:%8d",(uint16_t)id,data.i);
                   //   --- sprintfを使わない場合
                   //    my_xtoa(buf,id,3); buf[3]=':'; buf[4]=' ';
                   //    my_utoa(buf + 5, data.i);
                        i2cOLED_Prt(buf) ; EU_Puts(buf);
                      #ifdef USE_HCHAR
                        i2cOLED_Clr(6,7,0);         // 表示エリ消去
                        i2cPrint_Hstr(6, 0, buf);   // 半角文字表示
                      #endif
                        break ;
                    default :         // その他の識別子ID
                        i2cOLED_Prt(" Unknown") ;
                        break ;
                }
            }
        }
    }
}

//---- CAN送受信テスト
void test_CAN(uint8_t *buf){
     mcp_sendMsgBuf(0x123,CAN_STDID,CAN_RMTFRM,0,buf,1) ;
}

/*------------------------------------------------*
 *       Main application                         *
 *------------------------------------------------*/
void main(void){
    uint8_t cmd;                    // コマンド
    uint8_t buf[8] ;                // CANデータ用
    uint8_t sw, sw_lst;             // スイッチ情報
    
    char msg[]  = "ready!";
 
    SYSTEM_Initialize();
    SSP1CON1bits.SSPEN = 1;         //SPI1を有効に
        
    IOCAF2_SetInterruptHandler(IOCAF2_Process);
    
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();

    i2cOLED_init();
    i2cOLED_Clr(0,7,0); i2cOLED_str(msg);
    EU_Puts(msg); 
    
    // MCP2515によるCAN通信の初期化
    // CANバス通信速度=100Kbps  MCP2515のクロック=8MHz
    while (CAN_OK != mcp_begin(CAN_100KBPS,MCP_8MHz)) {
         i2cOLED_str("InitFail") ;
         while(1) ;                 // 終了
    } 
    i2cOLED_str("Init OK!") ;
    // MASK0->Filter0->RXB0(オーバフローでRXB1)のみ使用します。
    mcp_init_Mask(0, 0, 0x3ff) ;    // 全て受付る
    mcp_init_Filt(0, 0, 0x123) ;    // ID:0x123のみ受け取る
    // MCP2515のINTピン割り込みの設定
    IOCAN2 = 1 ;                    // RA2で立下げエッジ割込み
    IOCAF2 = 0 ;                    // RA2割込フラグをクリア
    IOCIF  = 0 ;                    // 割込フラグをクリア
    IOCIE  = 1 ;                    // 状態変化割り込みを有効に

    sw_lst = GET_SW() ;             // 現在のキー状態を記憶

    while (1) {
        sw = GET_SW() ;
        if((sw == 0)&(sw_lst==1)){  // スイッチの立ち下がりで実行 
            sw_lst = sw;            // 現在スイッチ値を記憶
            test_CAN(buf);          // CAN受信処理
            while( GET_SW() );      // キーが離れるまで待つ
            __delay_ms(100);        // チャタリング防止に100mS程待つ 
            sw_lst = 1;
        }
        // 受信しているメッセージデータを調べる
        CheckReceiveProcess() ;

        if(SFlg){                   // シリアル入力があれば
            cmd = RBuf[0];
            switch(cmd){
                case 'C': i2cOLED_Clr(0,7,0); CrtLn = 0;  break;
                case 'R': test_CAN(buf);                  break;
            } 
            SFlg = 0;
        }
    }
}

/*************** End of File **********************/

【その他のプログラム】

mcp_can_dsf.h(zip)
skMCP25xx.c/h(zip)
myProject.h(zip)
myFunction.c/h(zip)
i2c_SSD1306.c/.h + Font_5x7.h(zip)
※ EUSARTの設定についてはabc917等を参照

※プログラムのリストをハイライト付きのスタイルで見る場合はここをクリック


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


NHK_ONE(ワン) Windows10から11への道 MCP2515モジュール