Vol.919 30.May.2025

アンドロイドスマホ ドローンの登録更新 Petit_FatFs

A アンドロイドスマホで画面がモノクロに

by fjk

 或る日、スマホの画面が突然モノクロになった。特に設定を変えた記憶も無いが、スマホをズボンのポケットに入れておいただけなのだが、・・・。そこで、ネットで調べると・・、
 Androidスマートフォンの画面で「カラー画面がモノクロになる」と言うことがありますが、これは[おやすみ時間モード]が関係しており設定を変更するだけでカラーに戻すことができる。
 「特定のアプリのみが白黒になる」と言う場合は[アプリタイマー]が影響している可能性が高いです。
 「設定」/「DigitalWellbeingと保護者による使用制限」/「おやすみ時間モード」をOFFにするか、さらに「カスタマイズ」「オプション」で「グレースケール」をOFFにすると、カラー画面に戻ります。
【参考】engrmemo

 本来であればユーザー自身で有効にしない限り「おやすみ時間モードがオンになる」と言うことは無いが、クイック設定ツールからワンタップでオン/オフが切り替わるため誤操作も考えられる。
 そういえば、何故か機内モードがONになっていたので、あわててクイックツールを操作したことが原因かも。WiFiが知らないうちにOFFになっていることもあるし・・。


D ドローンの登録更新

by fjk

 無人航空機(ドローン・ラジコン)は2022年6月20日に登録制度が開始され、登録の無い無人航空機は、基本的には飛行させることができません。私のMavicMiniも2022年の4月に登録しましたが、登録有効期間が3カ年で2025年の6月20日には登録期限が切れることになります。
 特に、MavicMiniにようにリモートID機能の無い機種は、2022年6月19日までに登録を行っていた場合、その搭載が免除されていますが、申請有効期限内に再登録しないと、リモートIDを搭載しなければ、新規に登録ができなくなります。


 「登録新規申請や有効期間の更新」は書面でも申請できますが、国土交通省のDIPS2.0によるオンライン申請の方が安価で早く手続きが行えます。DIPS2.0でも申請方法により、本人確認方法・手数料・審査期間が異なります。


 そこで、DIPS2.0でマイナンバーカードを使って更新申請を行い、申請後に送られてきた振込先に手数料の900円をPay-easy(ペイジー)で振り込み、無事登録更新ができました。


P PICでSDカードを使う(6)  〜Petit_FatFs(プチFAT)

by fjk

 abc918まで、SDカードをPICで利用したが、大容量メモリが必要で、利用できるPICに制限があった。そこで、少容量メモリPICでSDカードが使えるPetit_FatFsをPIC16F18326(ROM:16k、RAM:2k)で使ってみた。
 Petit_FatFs(プチFAT)はFatFsの機能を限定した小型マイコン向けに作成されたファイル管理システム(必要メモリ、ROM:2K〜4KB+α、RAM:44B+α、[PIC24/C30使用時])で、以下の制限がある、

  • ファイルの新規作成ができない(既存のファイルで、同時に1ファイルのみ)。
  • データを追加して、ファイルサイズを拡大できない(対応FATはFAT12/16/32)。
  • ファイルの書込みはセクタ境界(512byte)から開始する必要がある(読込はストリーミング可)。
  • タイムスタンプは更新されない(ディレクトリデータは読込のみ対応[dir_option選択時])

 このため、事前にPCなどで必要なサイズのファイルを作成し、SDカードに保存しておく必要がある。
 なお、diskio.cの低ディスクI/Oモジュールはユーザーが準備すること(PIC等の作成例有り)

【ハード】
microSDカードスロットは5V動作のAE-microSD-LLCNV(秋月#114015、@480)を用いた。

PICによるSDカード読み出しテスト回路

試作BB回路
【プチFATの使い方】   <参考> 理系男子の電子工作
  • 「理系男子」さんのページにあるように、PIC用のdiskio.cを作成する(ほぼそのままですが・・)。
  • 参考にしたdiskio.cを、MCCに対応するように修正・変更。
  • ダウンロードしたpff.c/h、pffconf.h、と修正したdiskio.c/hをプロジェクトに追加
  • pffconf.hで「#define PF_FS_FAT32 1」と変更し、FAT32を有効に
  • myFunction.cとmyProject.hもプロジェクトに追加(独自USER関数等を利用[不使用なら省略可])
【ソフト】   <MCC設定>
System
Osc=HFINTOSC、Clock=32MHz、Divider=1
TMR0
Prescaler=1:128、Postscaler=1:1、Mode=16bit、Source=FOSC/4、Rate=1
(タイマー0は、PICの稼働確認のため、1秒ごとの割り込みでLED点滅を実施)
EUSART
Rate=115200、Interruptにチェック、STDIOはどちらでもOK
( eusart.cにmyEusart()等を追加、 abc917 を参照)
MSSP1
Mode=Master、SPImode=Mode3、Clock=FOSC/4_SSPxADD、Freq=4000000
(SPIを有効にするため SSP1CON1bits.SSPEN = 1; を忘れないこと)


    PinModule(ピン名を設定)
 
<ターミナルコマンド> [ ]はオプション
R[filnam]
txtファイルを読み出し・表示
F[filnam]
ファイル名filnamをセット

データ読出しターミナル画面例

 PIC16F18326で、プチFATを利用してSDカードのデータ(SD_CARD.TXTやabc914で書き込んだLOGDATAx.TXT等)を読み出すことができた。なお、メモリ使用量は、ROM:7,620byte(46.5%)、RAM:551byte(26.9%)だが、printf文や未使用のコード部分を省くと、もっとメモリが少ないPICでも「プチFAT」が使えそう。

  • マウントに時間を要するようなので、pf_mountは1回以上リトライすること。
  • プチFATにはclose関数がなく、対象ファイルを変えるには、pf_open関数で指定しなおす

【diskio.c】 茶色部をコメント化し桃色部を追加   diskio.c/h(zip) ppf.c/h+pffconf.h(zip)


/*----------------------------------------------------------------*/
/* PFF - Low level disk control module for PIC  (C)ChaN, 2014     */
/*----------------------------------------------------------------*/

#include "diskio.h"
#include "myProject.h"

/*----------------------------------------------------------------*/
/* Platform dependent macros and functions needed to be modified  */
/*----------------------------------------------------------------*/

//#include <xc.h>
#include "mcc_generated_files/mcc.h"

//#define _XTAL_FREQ 32000000

//#define CS_LOW()  RC7 = 0             // Set CS low 
#define   CS_LOW()  SD_CS_SetLow()

//#define  CS_HIGH()  RC7 = 1           // Set CS high 
#define   CS_HIGH()  SD_CS_SetHigh()

//#define  IS_CS_LOW  !RC7              // Test if CS is low

static void init_spi (void)             // Initialize SPI port
{                                       // MCCで設定済みなので削除
/*  *** Configure using MCC ***
    SSP1STAT = 0b00000000;              // SMP:middle/CKE:IdleToActive
    SSP1CON1 = 0b00110000;              // SSPEN/CKP:Idle High/SPIMaster 
    
    SSP1DATPPS = 0x14;                  // SDI : RC4
    RC3PPS = 0x14;                      // SCK : RC3
    RC5PPS = 0x15;                      // SDO : RC5
*/
}

static void dly_100us (void)            // Delay 100 microseconds
{
   __delay_us(100);
}

//#define xmit_spi(d)  SPI_XCHG(d)
/* Send a byte to the SDC/MMC */
static void xmit_spi (BYTE d)
{
    char dumy;
    
    dumy = SSP1BUF;                     //Clear buffer
    SSP1BUF = d;                        //Send
    while(!SSP1STATbits.BF);
    
}

//#define rcv_spi()  SPI_XCHG(0x55)
/* Send a 0xFF to the SDC/MMC and get the received byte */
static BYTE rcv_spi (void)
{
    char dumy;
    
    dumy = SSP1BUF;                     //Clear buffer
    SSP1BUF = 0xFF;                     //Send
    while(!SSP1STATbits.BF);
    
    return SSP1BUF;                     //Receive
}

/*----------------------------------------------------------------
   Module Private Functions
------------------------------------------------------------------*/

// −−−  以下省略 (変更無し)−−−

 diskio.cは「理系男子の電子工作」さんのdiskio.cをmcc対応に修正した。


【abc919-18326.c】 abc919-18326.c + myFunction.c+myProject.h(zip)
( Redirect_STDIO_to_USARTにチェックが有ると、EU_Puts()はputs()に変更可 )


/*****************************(abc919-18326.c)*******
 *   Test Petit FatFS
 ****************************************************/
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "pff.h"
#include "myProject.h"

#define SD_BFSIZE      64
enum { NON = 0, TXT, CSV, BIN = 8, BMP };

//--- タイマー・汎用変数
char     Msg[40];                           // コメント等送信用文字列
uint8_t  TFlg;                              // タイマーフラグ

//---- SDカード用変数
FATFS    Fs;                                // ファイルシステム変数
BYTE     Buf[SD_BFSIZE + 1];                // ファイルデータ用バッファー
UINT     Br;                                // 送受信完了データ数
char     FilNam[13] = "SD_CARD.TXT";        // ファイル名(8.3))
uint8_t  F_ext = TXT;                       // 1:TXT, 2:CSV, 8:BIN, 9:BMP

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

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

/***************************************
 *  SDカード用汎用関数
 ***************************************/
//--- SDカードのマウント
FRESULT SD_Mount(void) {
    uint8_t i = 0;
    FRESULT res;
    do{
        res = pf_mount(&Fs);
        i++;
        EUSART_Write('.');
    }while((res != FR_OK) && (i < 10));     // 10回まで試みる

    if(res != FR_OK){                       // マウント失敗なら
        EU_Puts("** SD Not Mounted !!");
    }else{
        EU_Puts("SD Mount OK!");
    }
    return res;	
}
/*
//--- ファイルのオープン(SDアクセステスト用)
FRESULT SD_Open(void){
    FRESULT res;
    res = SD_Mount();
    if(res != FR_OK) return res;
    res = pf_open(FilNam);
    if(res != FR_OK){                       // オープン失敗なら
        EU_Puts("** SD Not OIpen !!");
    }else{
        EU_Puts("File Open OK!");
    }
    return res;
}

//---  データの読み出し(SDアクセステスト用)
FRESULT SD_Read(void){
    FRESULT res;   
    res = pf_read(Buf,SD_BFSIZE,&Br);
    if(res != FR_OK){                       // 読出し失敗なら
        EU_Puts("** File Not Read !!");
    }else{
        EU_Puts((char *)Buf);
        my_itoa(Msg,Br);
        EU_Puts(Msg);
    }
    return res;
}*/
//--- ファイル名セットするコマンド
/*    *str:指定するファイル名
 *    (strが無い場合、現在ファイル名を表示)   */
void SD_cmd_F(char *str) {
    size_t i,n;
    char *p;
    n = strlen(str);
    if(n > 1){
        if(n > 12) n = 12;
        for(i = 0; i < n; i++)
            FilNam[i] = (char)toupper(str[i+1]);
        FilNam[n]=0;
    } 
    p = strchr(FilNam,'.');
    if     (strncmp(p+1,"TXT",3)==0) F_ext = TXT;
    else if(strncmp(p+1,"CSV",3)==0) F_ext = CSV;
    else if(strncmp(p+1,"BIN",3)==0) F_ext = BIN;
    else if(strncmp(p+1,"BMP",3)==0) F_ext = BMP;
    else                             F_ext = NON;
    sprintf(Msg,"NewFileName = %s: %d\n",FilNam,F_ext);
    EU_Puts(Msg);
}

//--- SDカードから読込コマンド
/*    strファイルから読み出す(TXTファイルのみ)
 *    (strが無い場合は現在ファイルから読み出す)   */
void SD_cmd_R(char *str){
    FRESULT res;
    uint16_t sz = 0;
    if(strlen(str)>1)
        SD_cmd_F(str);    
    if(F_ext != 1){
        EU_Puts("Not Text File!");
        return;
    }
    EU_Puts("Start Command R");
    if(SD_Mount() == FR_OK){
        res = pf_open(FilNam);              // ファイルオープン
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            EU_Puts(Msg);
            do{
                pf_read(Buf, SD_BFSIZE, &Br); // SDから読込む
                Buf[Br] = 0;
                EU_Puts((char *)Buf);
                sz += Br;
            }while(Br!=0);
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            EU_Puts(Msg);
        }
        sprintf(Msg,"Size = %d",sz);
        EU_Puts(Msg);
    }
}

/***************************************
 *    Main application
 ****************************************/
void main(void) {
    FRESULT res;
    char   cmd;                             // 受信コマンド文字
    
    SYSTEM_Initialize();

  // タイマ0 Callback関数定義
    TMR0_SetInterruptHandler(TMR0_Process);
    
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();

    SSP1CON1bits.SSPEN = 1;
    
    EU_Puts("--- test ---");
    LED_SetHigh();
    
    while (1) {
        // 1秒周期の処理
        if(TFlg == 1){                      // フラグオンの場合
            LED_Toggle();
            TFlg = 0;                       // フラグリセット
        }
      // コマンド処理
        if(SFlg){                           // 受信ありの場合
          cmd = RBuf[0];  
          sprintf(Msg,"Input = %s\n",RBuf);
          EU_Puts(Msg);

          switch(cmd){
            case 'R': SD_cmd_R(RBuf); break;  // SDからデータ読出
            case 'F': SD_cmd_F(RBuf); break;  // ファイル名セット

            default:  EU_Puts("???"); break;  // 無効なコマンド
          }
          SFlg = 0;
        }
    }
}
/******   End of File   *****/


【おまけ】★Petit FatFsの関数

pf_mount(FATFS *fs)
- ボリュームをマウント
pf_open (char *path)
- ファイルを開く
pf_read (void *buff, UINT btr, UINT *br)
- ファイルの読み取り
pf_write (void *buff, UINT btw, UINT bw)
- ファイルの書き込み
pf_lseek(DWORD ofs)
- 読み取り/書き込みポインターの移動
pf_opendir(DIR *dp, char *path)
- ディレクトリを開く
pf_readdir(DIR *dp, FILINFO fno)
- ディレクトリ項目の読み取り


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


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


アンドロイドスマホ ドローンの登録更新 Petit_FatFs