Vol.915 28.Mar.2025

レンジで焼ケール 秋月AE-MICRO-SDを使う

D 電子レンジで焼き・蒸しができる 〜レンジで焼ケール

by fjk

 以前から、火を使わず、電子レンジを使用して、魚や肉を焼いたり、肉まんの蒸しなどができる調理器に興味があり、デパートなどでも確認していたが、以外と高価なので迷っていたところ、JustShopから、ユーザ割引有りで「東京企画販売TO-PLANレンジで焼ケール深型(蒸しプレート付)」の紹介があり、さらにクーポン付で3,950円と・・、ついポチり。
【特徴】 (商品の詳細は ここ など参考)
・「焼く、蒸す、煮る、茹で、炒め、炊く」が
  電子レンジでできる
・ 内側はフッ素加工で、食洗機対応・丸洗いOK
・マイクロ波を反射する蓋により熱が全体に行き渡る
・深さがあるので茶碗蒸しも容器のまま調理可
 
※注1)茶碗蒸し、蒸しプリンの場合は200W以下で加熱すること!
※注2)必ず蓋を付け、レンジ内壁面に接触しないこと!!

サイズ


本体がレンジ壁面に接触していないこと!

蓋は必ず、すきまなく、しっかりと!

焼き芋は、50ccの水を入れて、
600W/10分、ひっくり返して、8〜10分

肉まんは、蒸しプレートを引き、
200CCの水を入れて、600W/3〜5分


P PICでSDカードを使う(2) 〜秋月AE-MICRO-SDとレベル変換

by fjk

 abc914で、SDカードの読み書きができることを確認したが、さらに3.3VのSPI接続デバイスも同時に使えるように、レベル変換モジュールと3.3V用SDカードスロットを使ってみた。使用したパーツは、

@ マイクロSDカードスロットDIP化キット: AE-MICRO-SD(@300、秋月電子#105488)
A 8ビットレベル変換モジュール: AE-LLCNV8(@250、秋月電子#117062)
B シリアル(USB-typeC)変換モジュール: CH9120F(@500、秋月電子#129505)
C 3端子DC-DCレギュレータ[5V−>3.3V]: VX07803-500[現在販売終了](同等品を使用可)
D(ニュー)ブレッドボード: SAD-01(@2,134、サンハヤト)

【ハード】
 回路は、abc914とほぼ同じだが、ボード変更に伴い、ピン設定を変更しているので、配線に注意!
 AE-LLCNV8レベル変換モジュールを使った場合、変換モジュールのSPIin入力信号にはプルアップが必要で、SDカードスロット間に10kΩの抵抗で3.3Vにプルアップした。プルアップが無い場合、マウント実行時にフリーズが発生し、この原因がわからず、解決に結構時間を要した。


回 路 図
(abc914と使用ピンが異なるので注意!)

配 線 例
(余分は配線は将来使用予定)

【ソフト】
 MCCの設定は、SPIと入出力ピンの設定を除き、abc914と同じ(使用ピンがabc914と異なるので注意!!)。
 シリアル入力は文字列入力に対応できるように強化(フィル名の入力が可能)。
 EUSARTはabc900とほぼ同じだが、EUSART設定で「Redirect STDIO to USART」にチェックすると、getch()でデータを正常に受信できないことがあったので、myEusart()関数で、getch()をEUSART_Read()に、putch()をEUSART_Write()に変更した。 =>変更したmyEusart
 ≪ターミナルコマンド≫
T
マウントのテスト
R
データの読出し
W
データの書き込み
F[name]:
ファイル名の指定
[name無しは現在名表示]
X
カウント表示の停止
C
カウント表示の開始
 ※なお、ファイル名は大文字小文字を問わない
 
   
      テスト実行中
 

テラターム画面例

【トラブル】
※ MPLAB-Xのバージョンアップ(5.5−>6.15)
 フォルダーにプロジェクトが沢山たまってきたので、古いプロジェクトをいくつか削除したところ、「デフォルトのmakefileでエラー」が出てMPLAB-Xが使えなくなった。
 そこで、古いMPLAB-Xを全削除して、ダウンロードしてあったMPLAB-X_V6.15(IDE、IPE、XC8)をインストールした。

@ さらに「古いDeviceファイルが無い」と警告されるので、新しいデバイスファイルを指定
=>他のプロジェクトでも警告が出るので、古いデバイスファイルも読み込むと、警告が出なくなった。
 
A プロジェクトファイルは全て残っていたが、V6.15(XC8_v2.x)ではC言語仕様が厳格になっているようだ。
__delay_ms関数など => C99ではマクロを宣言しなければならない −> myProject.hに記述
   記述例: #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))
        #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL)))


【SDカードの読み書きプログラム】 [秋月版]:abc915-18857.c+myProject.h(zip)


/*******************(abc914-18857.c)***
 *  SDカードの読み書き   [秋月版]
 *  (EUSART割り込み有り)
 ***************************************/
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <string.h>
#include "myProject.h"

//--- File Systme 変数
FRESULT  result;                                // FatFs処理結果
FATFS    drive;                                 // ドライブ番号、ex: "0:"
FIL      file;                                  // FatFsオブジェクトのポインタ
		
//--- アプリ変数
char     FilNam[16] = "LOGDATA.TXT";
uint16_t Length[2];                             // 送受信用文字数格納配列
char     Buffer[80];  	                        // データ受信用バッファー
char     Msg[40];      	                        // コメント等送信用文字列
uint8_t  tFlag;                                 // タイマーフラグ
uint16_t Counter;                               // タイマーカウンタ

//---- EUSART用変数
char    RBuf[BFSIZE];                           // シリアル受信バッファー
uint8_t SFlg;                                   // シリアル受信フラグ

/***************************************
 *  タイマ0 Callback関数 (1秒周期割り込み)
 ***************************************/
void TMR0_Process(void){
    tFlag = 1;                                  // フラグセット
}

/***************************************
 *  文字列バッファ出力関数
 ***************************************/
void StrWrite(char * str){
    while(*str != 0){                           // '\0'(文字列終り)まで繰り返し
        EUSART_Write(*str++);                   // 1文字バッファに出力(送信)
    }
}
//--- EUSARTへ文字列送信(改行付)
void US_Puts(char * str){
    StrWrite(str);
    EUSART_Write('\n');
}
/***************************************
 *  SDカード用汎用関数
 ***************************************/
//--- SDカードのマウント
FRESULT SD_Mount(void){
    uint8_t ct = 10;
    FRESULT res;
    do{
        res = f_mount(&drive,"0:",1);     
        EUSART_Write('.');
    }while((res != FR_OK) && ct--);             // 10回まで試みる

    if(res != FR_OK){                           // マウント失敗なら
        US_Puts("** SD Not Mounted !!");
    }else{
        US_Puts("SD Mount OK!");
        LED_SetHigh();
    }
    return res;	
}

//--- SDカードのクローズとアンマウント
void SD_All_Close(void){
    f_close(&file);                             // ファイルクローズ
    f_mount(0, "0:", 0);                        // アンマウント
    US_Puts("closed & Un_Mounted"); 
    LED_SetLow();	
}

/***************************************
 *  コマンド処理
 ***************************************/
//--- SDカードテストコマンド (兼テンプレート)
void SD_cmd_T(void){
    US_Puts("Start Command T");
    if(SD_Mount() == FR_OK){                    // SDマウント
    //  set custom function  ------ ここから

        __delay_ms(2000);

    //  ------------------   この間にユーザプログラムを記述
        f_mount(0, "0:", 0);                    // アンマウント
        US_Puts("Un_Mounted");
    }
    LED_SetLow();
}

//--- SDカードから読込コマンド
void SD_cmd_R(void){
    FRESULT res;
    US_Puts("Start Command R");
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_READ);   // ファイルオープン
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            US_Puts(Msg);
            do{
                f_read(&file, Buffer, 64, (UINT *)Length); // SDから読込む
                Buffer[Length[0]] = 0;
                US_Puts(Buffer);
            }while(Length[0]!=0);
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            US_Puts(Msg); 
        }
        SD_All_Close();                         // ファイルクローズ&アンマウント
    }
//    LED_SetLow();
}

//--- SDカードへデータ書込コマンド
void SD_cmd_W(void){
    FRESULT res;
    US_Puts("Start Command W");
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_WRITE | FA_OPEN_APPEND); // ファイルオープン
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            US_Puts(Msg);
            sprintf(Msg, "%07d,", Counter);
            f_write(&file, Msg, 8, (UINT *)Length);
					// SDへ書込
            US_Puts(Msg);
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            US_Puts(Msg);           
        }
        SD_All_Close();                             // ファイルクローズ&アンマウント
    }
//    LED_SetLow();
}

//--- ファイル名セット
void SD_cmd_F(char *str){
    size_t i,n;
    n = strlen(str);
    if(n > 1){
        if(n > 12) n = 12;
        for(i = 0; i < n; i++)
            FilNam[i] = str[i+1];
//      strncpy(FilNam,str+1,n);
        FilNam[n]=0;
    }
    sprintf(Msg,"NewFileName = %s\n",FilNam);
    US_Puts(Msg);
}

/***************************************
 *  メイン関数
 ***************************************/
void main(void){
    uint8_t tMode = 0;                              // タイマカウンタ表示モードフラグ
    char   cmd;                                     // 受信コマンド文字
    
    SYSTEM_Initialize();

  // タイマ0 Callback関数定義
    TMR0_SetInterruptHandler(TMR0_Process);
    
    US_Puts("\n==== SD Test ====");
    
  // 割り込み許可
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    
  //======= メインループ =========
    while(1){
      // 1秒周期の処理
        if(tFlag == 1){                             // フラグオンの場合
             LED_Toggle();
            tFlag = 0;                              // フラグリセット
            if(tMode == 0){
                sprintf(Msg,"Counter = %05d",Counter++) 
                US_Puts(Msg);
            }
        }
      // コマンド処理
        if(SFlg){                                   // 受信ありの場合
            cmd = RBuf[0];  
            sprintf(Msg,"Input = %s",RBuf);
            US_Puts(Msg);

            switch(cmd){
                case 'T':   SD_cmd_T();  break;     // SDマウントテスト
                case 'R':   SD_cmd_R();  break;     // SDからデータ読出し
                case 'W':   SD_cmd_W();  break;     // SDにデータを書込む
                case 'X':   tMode = 1;   break;     // カウンタ表示OFF
                case 'C':   tMode = 0;   break;     // カウンタ表示ON 
                case 'F':   SD_cmd_F(RBuf); break;  // ファイル名の指定
                default:    US_Puts("???"); break; 
            }
            SFlg = 0;
        }
    }
}
/******  End of File ******/


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


【おまけ】
 <EUSARTの設定>
  mcc_generated_files/eusart.cの一部を抜粋 (赤字の部分は今回変更した関数)
  myEusart()はプロトタイプ宣言していないので、EUSART_Receive_ISR(使用場所)より前に記述すること。

【eusart.cファイル】 (青字の部分はMCCが作成したファイルに追加する部分)
/**
  Section: Included Files
*/
#include "eusart.h"
#include "../myProject.h"

/**
  Section: Macro Declarations
*/

#define EUSART_TX_BUFFER_SIZE 8
#define EUSART_RX_BUFFER_SIZE 8
/**
  Section: Global Variables
*/
extern char    	RBuf[];         // シリアル受信バッファー
extern uint8_t 	SFlg;           // 受信完了フラグ

static uint8_t 	sIdx;           // 受信文字列インデックス

volatile uint8_t eusartTxHead = 0;

	・・・<途中省略>・・・

void myEusart(){
    char ch;
    ch = EUSART_Read();
    #if ECHO == ON
        EUSART_Write(ch);
    #endif

    if((ch == 0x0a)||(ch == 0x0d)){	  // 改行処理
        SFlg = 1;
        RBuf[sIdx] = 0;
        sIdx = 0;
    }else if((ch == 0x08)&&(sIdx > 0)){	   // BS処理
        sIdx--;
    }else{
        if(sIdx < BFSIZE) RBuf[sIdx++] = ch;
    }
}

void EUSART_Receive_ISR(void)
{
    eusartRxStatusBuffer[eusartRxHead].status = 0;

    if(RC1STAbits.FERR){
        eusartRxStatusBuffer[eusartRxHead].ferr = 1;
        EUSART_FramingErrorHandler();
    }

    if(RC1STAbits.OERR){
        eusartRxStatusBuffer[eusartRxHead].oerr = 1;
        EUSART_OverrunErrorHandler();
    }
    
    if(eusartRxStatusBuffer[eusartRxHead].status){
        EUSART_ErrorHandler();
    } else {
        EUSART_RxDataHandler();
    }
    
    // or set custom function using EUSART_SetRxInterruptHandler()
    myEusart();
}
 	・・・<以下省略>・・・
なお、main.cで、以下も宣言しておくこと。さらに、(BFSIZEを宣言している)myProject.hも必要です。
 char     RBuf[BFSIZE];
 uint8_t  SFlg;


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


レンジで焼ケール 秋月AE-MICRO-SDを使う