以下の内容はhttps://gijin77.blog.jp/archives/2024-02.htmlより取得しました。


◆8PinのCH32V003J4M6でデバッグ用に「PD1/SWIO/TX」端子をシリアル出力に
 指定した後、WCH-LinkEにてプログラムを書き込めなくなります。
 このマイコンはピン数が少ないので、UARTのTXとSWIOのどちらか一方しか
 使えません。
 UARTに指定したあと電源OFF/ONでもUARTのままとなります。
 その時、プログラムを書き込む為にはおまじないをします。

 このマイコンの書込み方法など、下記ブログ内記事を参照して下さい。
 
1.WCH-LinkUtility.exeを起動して下記の操作をします。
 すると、再度書き込めます。
 ①「Target」をクリック
 ②プルダウンメニューの「Clear All Code Flash By Power off」をクリック
 ➂「Succeed!」が表示されてOK
 WCH_reset

以上

ブログトップへ


◆ArduinoIDE 環境で格安マイコン32ビットRISC-Vマイコン CH32V003J4M6/
 CH32V003F4P6にOLED SSD1306をI2C接続して表示させてみました。
 OLED-2
 OLED-3

 このマイコンの書込み方法など、下記ブログ内記事を参照して下さい。
 ①・CH32V003 J4M6 32bit RISC マイコンでLチカ(ATTiny85の代わり)
 ②・CH32V003F4P6 割り込み Lチカ シリアル出力 してみた
 
1.まずはCH32V003で動くSSD1306用のライブラリを探します。
 ライブラリマネージャーで「SSD1306」検索するとたくさんのライブラリが
 見つかります。
 その中で、下記の二つで使える事が確認出来ました。
 ①ACROBOTIC_ssd1306は、テキストのみのライブラリで8行まで表示出来ました。
  バージョン1.0.0で動作確認
 ACROBOTIC_ssd1306
 
 ②OLED-SSD1306は、テキスト、グラフィック共に表示が確認出来ました。
  但しCH32V003のRAMが2kしかないために128x32ドットまでしかバッファが
  確保できませんでした。
  OLED-SSD1306

2.接続図を下記に示します。
 CH32V003J4M6-OLED

 CH32V003F4P6-OLED

3.スケッチと実際のデモの様子
 ①ACROBOTIC_ssd1306ライブラリ使用
  1.ライブラリのバージョン1.0.0使用でサンプル「HelloOLED.ino」が動作OK
   1.0.1では、動作NG
  2.ライブラリのバージョン1.0.0/1.01共にサンプル「DrawLogo.ino」は、
   メモリ不足の為、コンパイルエラー
 
 ②OLED-SSD1306ライブラリ使用
  1. ◆2倍速でのデモ動画です。
 

  2.スケッチを下記に示します。サンプルを多少修正したものです。
  ◆保障無しの自己責任で参考程度に
//ch32v_oled_demo.ino
//modified v2024/02/26 by JK1VCK
//blog URL:http://gijin77.blog.jp/archives/39932667.html
#include <Wire.h>
#include <Arduino.h>
#include <oled.h>
//
//SSD1306は128x64表示可能であるがch32v003のRAMが2kしかないのでバッファを1024バイト確保できない
//よって128x32に制限される 
//幅は、enum tWidth { W_96=96, W_128=128 };高さは、  enum tHeight { H_16=16, H_32=32, H_64=64 };
//コントローラは  enum tDisplayCtrl { CTRL_SSD1306, CTRL_SH1106 };と定義されている
//OLED(uint8_t sda_pin, uint8_t scl_pin, uint8_t reset_pin=NO_RESET_PIN, tWidth width=W_128, tHeight height=H_32,
//  tDisplayCtrl displayCtrl=CTRL_SSD1306, uint8_t i2c_address=0x3C);
OLED oled=OLED(PC1,PC2,NO_RESET_PIN,OLED::W_128,OLED::H_32,OLED::CTRL_SSD1306,0x3c);

static const uint8_t bitmap[] = { 
    1,2,4,8,16,32,64,128,128,128,192,192,128,128,128,64,32,16,8,4,2,1, // 最初のページ (垂直 8 ビット、22 列)
    255,255,255,255,15,15,15,15,15,15,15,15,15,15,15,15,15,15,255,255,255,255 // 2 ページ目 (垂直 8 ビット、22 列)
};

void setup(){
  delay(1000);
  oled.begin();   
}

void loop(){
  oled.clear();    // 通常のサイズでテキストを描画する
  oled.draw_string(2,0,"123456789012345678901"); //6x8フォントの為(128/6)21文字表示出来る
  for (int y=8;y<32;y+=8) {
    oled.draw_string(2,y,"CH32V003 OLED SSD1306");
  }
  oled.display();   // 外側のエッジにピクセルを描画します
  oled.draw_pixel(0,0);
  oled.draw_pixel(127,0);
  oled.draw_pixel(127,31);
  oled.draw_pixel(0,31);    
  oled.display();
  delay(1000);      // 中空の円を描く
  for (uint_least8_t radius=3; radius<62; radius+=3){ 
    delay(50);
    oled.draw_circle(64,16,radius);
    if (radius>15) {
        oled.draw_circle(64,16,radius-15,OLED::SOLID,OLED::BLACK);
    }
    oled.display();
  }
  delay(500);    // 実線の円を描く
  oled.draw_circle(36,16,14,OLED::SOLID);
  oled.display();
  delay(500);
  oled.draw_circle(36,16,7,OLED::SOLID,OLED::BLACK);
  oled.display();
  delay(500);     // 長方形を描く
  oled.draw_rectangle(64,0,98,31);    
  oled.display();
  delay(500);
  oled.draw_rectangle(69,5,93,26,OLED::SOLID);
  oled.display();
  delay(1000);    // スクロールアップする
  oled.scroll_up(32,20);
  oled.draw_string(4,2,"Hello");    // 通常のサイズでテキストを描画する
  oled.display();
  delay(1000);    // 線を引く
  oled.draw_line(4,10,34,10);
  oled.display();    
  delay(1000);    // テキストを2倍のサイズで描画する
  oled.draw_string_P(16,15,PSTR("World!"),OLED::DOUBLE_SIZE);
  oled.display();
  delay(1000);    // 十字を描く
  oled.draw_line(16,31,88,15);
  oled.draw_line(16,15,88,31);
  oled.display();
  delay(1000);    // 生のビットマップを描画する
  oled.draw_bitmap_P(100,8,22,16,bitmap);
  oled.display();
  delay(1000);    // スクロールのデモンストレーション
  oled.set_scrolling(OLED::HORIZONTAL_RIGHT);
  delay(3000);
  oled.set_scrolling(OLED::HORIZONTAL_LEFT);
  delay(3000);
  oled.set_scrolling(OLED::NO_SCROLLING);

  oled.display();   // スクロール後に再描画して元の画像を取得します
  delay(1000);      // OLEDをフラッシュする
  for (int i=0; i<10; i++) {
      oled.set_invert(true);delay(200);
      oled.set_invert(false);delay(200);
  }
  uint8_t cont[]={128,64,32,16,8,4,2,1,2,4,8,16,32,64,128,255,128};
  for(int i=0;i<17;i++) {    // コントラスト値を表示する
    contrast(cont[i]); 
  }
  delay(500);
  oled.clear();
}
void contrast(int value){
  char buffer[4];
  oled.clear();  
  oled.draw_string(0,0,"Contrast:");
  itoa(value,buffer,10);
  oled.draw_string(64,0,buffer);
  oled.draw_rectangle(0,20,value/2,31,OLED::SOLID);
  oled.display();
  oled.set_contrast(value);
  delay(500);
}
  
以上


ブログトップへ

◆格安マイコンCH32V003F4P6で赤外線(IR)受信リモコンを作ってみました。
 ch32v_IR-2
 ①リモコンのフォーマットは、解析が単純なNECフォーマットのみです。
 リモコンのフォーマットについては、下記URLを参照しました。
 赤外線リモコン(NECフォーマット)
 ②CH32V003F4P6について詳しくは、下記ブログ内記事を参照して下さい。
 ・CH32V003F4P6 割り込み Lチカ シリアル出力 してみた

1.配線図を下記に示します。
 ch32v_IR_remocon

2.スケッチを、下記に示します。(保障無しの自己責任で参考程度に)
 ①割り込み間隔が、ずれる事が有り取り込みに失敗することが有ります。
  CH32Vでリモコン受信時の割り込みでPC0をL/H変化させて、そのピンをESP32で割り込みで
 処理した時のmicros()の値を調べた所、H32Vでは割り込み処理によって経過時間関数micros()の
 戻り値が途中辻褄合わせで2ms加算されています。
 約9ms前後で2ms加算されているのが分かります。
 ハード的には、ちゃんと割り込みが発生していますが、ソフト的に不具合が有るようです。
 とりあえずの対策として、2ms以上の時は、2msマイナスしています。
 *スケッチの50行目

 ◆下記表は、赤外線(IR)リモコンを受信したときのCH32V003F4P6とESP32で比較です。
 ch32v_esp32比較

//CH32V_IR_Decoder.ino
//v1 2024/02/23 
//blog URL:http://gijin77.blog.jp/archives/39900522.html
//PD7 リセットピン L=リセット

#include "Arduino.h"
#define IR_PIN    PD4
#define LED       PC0
//                           POWER     ,↑        ,↓         ,→        ,←        ,MENU
const uint32_t IR_DATA[] = { 0x61D648B7,0x61D6D827,0x61D658A7,0x61D6609F,0x61D620DF,0x61D6A05F };
const size_t   IR_CT     = (sizeof(IR_DATA) / sizeof(IR_DATA[0]));
const uint8_t  LED_PIN[] = { PD3,PC7,PC6,PC5,PC4,PC3 };//POW,↑,↓,→,←,MENU
const size_t   LED_CT= (sizeof(LED_PIN) / sizeof(LED_PIN[0]));

bool f_entry=false;  // エントリフラグ
uint32_t tt0;
uint32_t tmp_data;
uint32_t ir_data;

uint8_t  pulsecounter=0;             // 受信ビットカウンタ
uint32_t t0=0;                       // 割り込み間隔用
uint32_t ir_value=0;                 // IR コード
bool     ir_begin=false;             // 解析スタートフラグ
uint32_t t_buf[40];                  // デバッグ用バッファ
//*************************************************************************
//          I S R _ I R 
//*************************************************************************
// 信号がL->Hへ変化するたびに IR受光器から受信し割り込み。
// データの間隔は 640 または 1640 us秒です。 同期パルスは 3400 us以上です。
// 最後の 32 レベルの変更がリモコンコードです。
// 解析はNECフォーマットのみ
//*************************************************************************
void isr_IR() {
uint32_t t1, intval;       // 現在の時刻と最後の変更からの間隔
  digitalWrite(LED, LOW);
  t1=micros();             // 現在時刻を取得する
  intval=t1 - t0;          // 間隔を計算
  t0=t1;                   // 次の比較のために保存する
  if(intval > 4000) {      // コードのシーケンスを開始するか? 3500<t<5500
    pulsecounter=0;        // カウンタをリセットする
    ir_value=0;
    ir_begin=true;
    digitalWrite(LED, HIGH);
    return;
  }
  if(ir_begin==false) {
    digitalWrite(LED, HIGH);
    return;
  }
  if (intval>2000) intval=intval-2000; //CH32Vでランダムに2ms加算される時があるので調整
  t_buf[pulsecounter]=intval;     // デバッグ用に割り込み間隔を保存
  if(intval < 1000){              // ショートパルス? 400<t<750
    ir_value=(ir_value << 1) + 0; // 「0」をセットしシフトする
    pulsecounter++;               // 受信ビット数をカウントアップする
  } else if(intval > 1500){       // ロングパルス? 1400<t<1900
    ir_value=(ir_value << 1) + 1; // 「1」をセットしシフトする
    pulsecounter++;               // 受信ビット数をカウントアップする
  }
  if(pulsecounter==32){
    ir_begin=false;
    ir_data=ir_value;    //解析終了データをセーブ
  }
  digitalWrite(LED, HIGH);
}

void setup(){
  Serial.begin(115200);
  delay(3000);
  Serial.println();Serial.println("<IR Start>");
  pinMode(LED, OUTPUT);digitalWrite(LED,HIGH);
  for (size_t i = 0; i < LED_CT; i++) {
    pinMode(LED_PIN[i], OUTPUT);
    digitalWrite(LED_PIN[i], HIGH); //LED Off
  }
//CH32V003 割り込み処理 IR_PINの立上りにより割り込みを発生させ、「isr_IR」にて処理します。
//EXTI_Trigger_Falling 立下り EXTI_Trigger_Rising  立上り EXTI_Trigger_Rising_Falling 両方
  attachInterrupt(digitalPinToInterrupt(IR_PIN), GPIO_Mode_IN_FLOATING, isr_IR, EXTI_Mode_Interrupt, EXTI_Trigger_Rising);
}

void loop(){
  ir_loop();
}

void ir_loop(){
  if(f_entry == false) {tt0 = millis(); f_entry = true;}
  if((tt0 + 49 > millis()) && (tt0 <= millis())) return;   // 50ms待ちます(オーバーフローの場合は除く)
  f_entry = false;
  if(tmp_data == ir_data) return;         // 前と同じだったらリターン
  tmp_data = ir_data;
  Serial.printf("ir_dat: %X\n",ir_data ); //IRデータを表示
  for (int i=0;i<32;i++){
    if (!(i%4)) Serial.println();
    Serial.printf("i=%d %lu\n",i,t_buf[i]);
  }
  for (size_t i = 0; i < IR_CT; i++) {
    if(ir_data==IR_DATA[i]) {digitalWrite(LED_PIN[i], LOW);} //LED On
  }
  delay(500);
  for (size_t i = 0; i < LED_CT; i++) {
    digitalWrite(LED_PIN[i], HIGH); //LED Off
  }
}

3.テストの様子です。
 ◆以前作った解読器(下記ブログ内記事)でコードを比較しています。
 ・ESP32 で 赤外線リモコン解読器 を作ってみた(その2)

 ch32v_IR-1

3.現在LEDを繋いでテストしています。
 最終的には、下記HDMIモニタのキーボードとパラ接続してリモコンで
 操作できるようにする予定です。
 ・RUNTK0001ZAPN LCDパネルを M.NT68676 HDMIモニタとして再利用
 このM.NT68676搭載のLCDコントローラは、IR端子は、着いているのですが
 ファームウェアが対応していないようです。(販売店にて確認)
 対応ファームウェアと書き換え方法も合わせて検索中です。
 
以上

ブログトップへ

◆格安マイコンCH32V003F4P6でスイッチ割り込み処理でLEDのONさせ
 デバッグ用にシリアルに出力出来たので備忘録に残します。
 CH32V003F4P6

1.CH32V003F4P6の入手先
 ◆下記秋月でも有ります
 32ビットRISC-Vマイコン CH32V003F4P6 50円
 SSOP20ピン(0.65mm)・SOP20ピン(1.27mm)DIP変換基板 50円
 akizuki

 が手間を考えるとLチカ用のLEDや電源LEDもついた基板がAliexpressに
 有りましたので下記でも入手しました。
 ◆シリアルモニタを使うためにディフォルトのUTX(PD5)を使います。
  このピンとWCH-LinkEの「RX」を接続します。
 CH32V003F4P6_UART

 WCH-LinkE 基板
 3V3 ---- 3V3
 GND  ---- GND
 SWDIO ---- SWDIO
 RX   ---- PD5
       PD0---抵抗入りLED---GND
       PD4---タクトSW-------GND
        "  ---抵抗4.7kΩ-------VCC
 ch32v_test

4.スケッチの書き込み
 ①WCH-LinkEを使っての書き込み方法は、下記ブログ内記事を参照して下さい。
 ・CH32V003 J4M6 32bit RISC マイコンでLチカ(ATTiny85の代わり)

 ②割り込みに関して下記サイトを参照しました。
 小ピンマイコンの酷暑(3) CH32V003、外部端子から割り込みをかけてみる

 ➂スケッチの動作
  1.SW圧下で割り込み発生しLEDをONします。
  2.5秒毎にLEDをOFFにします。
  3.都度シリアルに出力します。

void sw_Isr() {
    digitalWrite(PD0, LOW);
    Serial.println("(LED ON)");
}

void setup() {
  Serial.begin(115200);
  Serial.println("Program Start...");
  pinMode(PD0, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(PD4), GPIO_Mode_IN_FLOATING, sw_Isr, EXTI_Mode_Interrupt, EXTI_Trigger_Falling);
}

void loop() {
  delay(5000);
  digitalWrite(PD0, HIGH);
  Serial.println("<LED Off>");
}

4.実際のシリアル出力状態
 シリアル出力

以上


ブログトップへ

◆ST-22TVが壊れたのでLCDパネルだけでも使えないかと思い
 M.NT68676搭載のLCDコントローラに繋いでみました。
 M_NT68676-4

1.パネルの写真と諸元
 ◆写真
 PANDA-RUNTK0001ZAPN-01
 PANDA-RUNTK0001ZAPN-02

 ◆パネルの諸元を確認するのに下記サイトが参考になりました。
 panelook.com

 ◆ネットで探すと似たような下記がヒットしました。
 T-con LM215DA-T01、パンダ RUNTK0001ZAPN;パネル M215ED1DA3-1

 ①型番   RUNTK0001ZAPN PANDA製
 ②サイズ  21.5インチ
 ➂解像度  1920 x 1080 
 ④接続方法 LVDS 2ch 8bit

2.LCDコントローラ
 ◆今回のパネルに対応していそうなコントローラを下記より購入
 ①HDMI VGA DVI Audio LCDコントローラ基板 M.NT68676;
 ②電源は12V 2A
 ➂対応 21.5インチ 23インチ 23.6インチ 27インチ液晶パネル
 ④解像度1920x1080 30ピン LVDS

 
>>HDMI DVI VGA Audio LCDコントローラー基板
対応サイズ 21.5 23 23.6 27インチ 解像度1920x1080 液晶パネル

Amazon.co.jpへ
今すぐチェック


3.組み立て
 ①壊れた基板を取り去り新しい基板を取り付けました。
 M_NT68676-1

 ②配線確認のために表・裏の写真を撮りました。
 M_NT68676-02
 M_NT68676-2

 ➂基板以外のスピーカー、キースイッチ、インバータ基板、IR受信機、LEDは
  TVの物を流用し、組み上げました。
  ◆キースイッチは、元々のTVの物とパラ接続しました。
 M_NT68676-3

 ④組み上げ後、ラズパイに接続しHDMIで1920x1080でめでたく表示出来て成功です。
 おまけにHDMI出力でちゃんと音声もスピーカーから再生出来ました。
 ラズパイ以外でも映像、音声を一本のケーブルで出力出来るようになり上出来です。
 M_NT68676-4

以上



ブログトップへ


◆以前使わなくなった端末の液晶パネルをHDMI対応のディスプレイとして
 活用していました。
 下記ブログ内記事参照

 今回別のパネルを使うためにファームウェアの書き換えをESP32を使い書き込んでみました。
 esp32-hdmi-0

  HDMI VGA 2AV 信号入力コレクタ基板 コントローラ基板 (下記を購入)
2024/02/09 現在
以前のリンクが無くなったので、現在の商品のリンクに更新しました。
基板は、同じですが解像度の確認が必要です。
但し今回みたくファームウェアの書き換えが出来れば問題ないと思われます。


 >UNTERING AT070TN90/92/94 7 インチ VGA 50pin LCD ドライバボード
 LCD TTL LVDS コントローラボード

 Amazon.co.jpへ

1.今回のパネルは、NECタブレットの1024x800の「LP101WX1」です。
 ①パネルの型番
 LP101WX1

 ②ネットで検索して解像度と接続方法を確認しました。
  「画素数:1280 X 800 接続方法:LVDS 40 pins (1 ch 6-bit)」
 LP101WX1-2

 ➂これ用のBINファイルを下記サイトよりダウンロードします。
 「PCB800099-LVDS1280x800-s6--2av1vga1hdmi-5key-ir2.bin」
  ◆RTD2660_PCB800099-master Firmware
 lvds1024x800__s6

2.次にボードに書き込む為に下記の配線図のように配線します。
 esp32-hdmi-2

3.最後にESP32にプログラムを書き込みます。
 ①まずはRTD266X用のライブラリを下記よりダウンロードします。
 Adafruit_RTD266X_I2CFlasher

 ②解凍後、ライブラリフォルダに保存します。
 rtd266xライブラリ

 ➂ライブラリの中のinoファイルを参照してプログラムを作ります。
  ◆RTD266xから読み込むファイル名は「/FLSHSAVE.BIN」に固定
  ◆RTD266xに書き込むファイル名は「/RTDFLASH.BIN」に固定

  (保障無しの自己責任で)  esp32_rtd266x.ino

 ④「esp32_rtd266x.ino」と同じフォルダへ下記ブログ内記事の「SD_esp32.cpp」
  「SD_esp32.h」をコピペします。
  ・ESP32 で Micro-SD を使ってみた

 esp32_rtd266x_ino

 ⑤ここまでで「esp32_rtd266x.ino」をコンパイル実行してみます。
 下記のエラーにならずコマンドプロントまで進めば⑦へ進みます。
 esp32_rtd266x-error

 ⑥エラーが出たの場合、ライブラリの修正をします。
  ついでにコンパイル時のワーニングも修正しました。
  ◆チップが未登録の場合、調べて「rtd266x_main.cpp」に追記します。

  1.「rtd266x_main.cpp」の修正
  rtd266x_main_cpp

  2.「rtd266x_main.h」の修正
  rtd266x_main_h

  3.「i2c.cpp」の修正
  i2c_cpp

 ⑦修正後、再度コンパイル実行してみます。
  1.エラーなくコマンドプロンプトまで進んだ様子です。
  esp32_rtd266x-1

  2.「R」リードコマンドの様子
  esp32_rtd266x-R1
  esp32_rtd266x-R2

  3.「W」ライトコマンドの様子
  ◆「RTDFLASH.BIN」のファイルを書き込みます。
  rtdflash_bin
  esp32_rtd266x-W1
  esp32_rtd266x-W2

4.動作確認
 ①起動後HDMIを選択した時の写真
 hdmi-1

 hdmi-2

 ②ラズパイに接続しての写真
 hdmi-3

以上


ブログトップへ

◆ESP32でMicro-SDを読み書きしてみました。
 ①ESP32DevkitとMicroSDアダプタ
 esp32-micro_sd

 ②接続図
 esp32-micro_sd-回路図

1.他でも使えるようにSDカードのプログラムをcppソースとヘッダーファイルを
  別ファイルとしてINOファイルと同じフォルダに入れています。
 ライブラリとすればいいのですが、まだそこまでのスキルがありません。
 また、エラーメッセージなど日本語化しました。
 esp32_sd_ide

 (保障無しの自己責任で)   

 ①「SD_esp32.h」ヘッダーファイル
  SD_esp32.h
 ②「SD_esp32.cpp」ファイル
  SD_esp32.cpp

 ➂「esp32_sd.ino」ファイル 
//esp32_sd.ino modified by JK1VCK
//http://gijin77.blog.jp/archives/39748138.html
//
//   Connect SCK, MOSI, MISO, CS -> MicroSD card
//   GPIO18->SCK GIPO23->MOSI GPIO19->MISO GPIO4->CS 3V3->3V3 GND->GND

#include "FS.h"
#include "SD.h"
#include "SPI.h"
#include "SD_esp32.h"

#define SD_CS        5         // esp32-pin connected to SD chip select

char line[LINELEN];
//char cmds[3][33] = { 0,0,0}; // 分割された文字列を格納する配列 

File dataFile;

void error(const char *str) {
  Serial.println(str);
  Serial.println(F("****************************************"));
  Serial.println(F("プログラムストップ.......  リセット又はチェック"));
  while (1);
}

void setup(void) 
{
//  while (!Serial);
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("****************************************"));
  Serial.println("*** プログラムスタート Ver.2024-02-09 ***");

//SD************************************************************
  Serial.println(F("SDカードを初期化しています..."));
  // see if the card is present and can be initialized:
  if (!SD.begin(SD_CS)) {
    error("カードが故障したか、カードが存在しません");
  }
  Serial.println(F("カードが初期化されました。"));

  uint8_t cardType = SD.cardType();
  if(cardType == CARD_NONE){
    Serial.println("SDカードが接続されていません");
    return;
  }
  Serial.print("SDカードの種類: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SDカードのサイズ: %lluMB\n", cardSize);
  listDir(SD, "/", 0);
  Serial.println(F("----------------------------------------"));
}

void loop(void) {
  Serial.println(F("SD Card TOOL"));
  Serial.println(F("dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg")); 
  if (get_line(line)!=1) {
    String cmds[CMDSIZE] = {"\0"}; // 分割された文字列を格納する配列 
    char cmdmg[10];
    char path1[100];
    char path2[100];
    // 分割数 = 分割処理(文字列, 区切り文字, 配列) 
    int index = split((String)line, ' ',cmds,CMDSIZE);
    if (index > 0 ) {
      cmds[0].toCharArray(cmdmg,cmds[0].length()+1);
      cmds[1].toCharArray(path1,cmds[1].length()+1);
      cmds[2].toCharArray(path2,cmds[2].length()+1);      

      if ((strcmp(cmdmg,"dir") == 0)&&(index==1)) {
        listDir(SD, "/", 0);
      } else if ((strcmp(cmdmg,"dir") == 0) &&(index==2)) {
        listDir(SD, path1, 0); 
      } else if (( strcmp(cmdmg,"rd") == 0 ) &&(index==2)){
        removeDir(SD, path1);
      } else if (( strcmp(cmdmg,"md") == 0 ) &&(index==2)){
        createDir(SD, path1);
      } else if (( strcmp(cmdmg,"del") == 0 ) &&(index==2)){
        deleteFile(SD, path1);
      } else if (( strcmp(cmdmg,"ren") == 0 ) &&(index==3)){
        renameFile(SD, path1,path2);
      } else if (( strcmp(cmdmg,"cp") == 0 ) &&(index==3)){
        copyFile(SD, path1,path2);  
      } else if (( strcmp(cmdmg,"add") == 0 ) &&(index==3)){
        appendFile(SD, path1,path2);
      } else if (( strcmp(cmdmg,"cat") == 0 ) &&(index==2)){
        readFile(SD, path1);
      } else if (( strcmp(cmdmg,"new") == 0 ) &&(index==3)){
        writeFile(SD, path1,path2);
      } else {
        Serial.println(F("コマンドエラー ?????"));
      }
    } else {
      Serial.println(F("コマンドエラー ?????"));
    }
  }
  Serial.println();
}

2.操作はシリアル経由でコマンドを打って実行します。
 コマンドの種類
 ①dir        リストディレクトリ
 ②rd /path       ディレクトリの削除
 ➂md /path     ディレクトリの作成
 ④del /name           ファイルの削除
 ⑤ren /name1 /name2 ファイルの名前を変更
 ⑥cp /name1 /name2   ファイルをコピー
 ⑦apd /name msg      ファイルに追加中
 ⑧cat /name            ファイルの読み込み
 ⑨new /name msg       ファイルの書き込み

3.デモ画面
 ①リセット直後(MicroSDは空の状態)
 esp32_sd
 
 ②コマンドの実行様子のシリアルモニタ
 注意)青文字がコマンド入力 赤字が追記の注釈
****************************************
*** プログラムスタート Ver.2024-02-09 ***
SDカードを初期化しています...
カードが初期化されました。
SDカードの種類: SDHC
SDカードのサイズ: 29818MB
リストディレクトリ: /
----------------------------------------
SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>md /abc
ディレクトリの作成: /abc
ディレクトリが作成されました

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>dir
リストディレクトリ: /
  DIR : abc ←abcが作成されている

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>rd /abc
ディレクトリの削除: /abc
ディレクトリが削除されました

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>dir
リストディレクトリ: /
          ←abcが削除されている
SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>new /test.txt test1234567890
ファイルの書き込み中: /test.txt
ファイルが正常に書き込まれました

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>dir
リストディレクトリ: /
  FILE: test.txt  SIZE: 14 ←test.txtが作成されている

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>cat /test.txt
ファイルの読み込み中: /test.txt
ファイルから読み取り
test1234567890     ←test.txtの中身
ファイルから正常に読み取りました 

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>add /test.txt abcdefg
ファイルに追加中: /test.txt
メッセージが正常に追加されました

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>cat /test.txt
ファイルの読み込み中: /test.txt
ファイルから読み取り
test1234567890abcdefg        ←test.txtの中身(追加されている)
ファイルから正常に読み取りました 

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>cp /test.txt copy.txt        copy.txtに/が付いていないのでエラー
ファイルをコピー中 /test.txt から copy.txt
コピー先ファイルを作成できません
 
SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>cp /test.txt /copy.txt
ファイルをコピー中 /test.txt から /copy.txt
ファイルが正常にコピーされました

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>dir
リストディレクトリ: /
  FILE: test.txt  SIZE: 21
  FILE: copy.txt  SIZE: 21 ←同じサイズでコピーされている

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>ren /test.txt /org.txt
ファイルの名前を変更します /test.txt から /org.txt
ファイル名が正常に変更されました

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>dir
リストディレクトリ: /
  FILE: copy.txt  SIZE: 21
  FILE: org.txt  SIZE: 21 ←名前が変更されている

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>del /org.txt
ファイルの削除中: /org.txt
ファイルが正常に削除されました

SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>dir
リストディレクトリ: /
  FILE: copy.txt  SIZE: 21
                                              ←/org.txtが削除されている
SD Card TOOL
dir,rd /path,md /path,del /name,ren /name1 /name2,cp /name1 /name2,add /name msg,cat /name,new /name msg
>

以上


ブログトップへ



以上の内容はhttps://gijin77.blog.jp/archives/2024-02.htmlより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14