M5Stack IMUとタッチパネルを別タスクで使うためMutexで排他制御

カテゴリー: ESP32

M5Stack Core2でIMU(6軸センサ)のサンプルプログラムを応用して、アプリを構築しようとしています。

M5Stack Core2のスイッチはタッチパネル(以降TP)の一部を使っています。IMUと共通I2Cです。マルチタスクで読みだす際に、アクセス競合防止にMutexで排他制御した覚書です

ESP32の開発では、「ESP-IDF環境でないとFreeRTOSが使えない」と勝手に誤解して永らくESP-IDFを使っていましたが、今回の解決でArudino環境でも使えるのが大々的に判明したので、嬉しくなっての投稿でもあります。

続きを読む…

.NET6でSerialPortコンポーネントを使えるまで

カテゴリー: ソフトウェア

ずっと.NETframeworkを使ってました。簡単なアプリが多いのでいまでも支障はないのですが、WPFにするスキルもなくWFAを使い続けようと思っていた矢先に、.NETframeworkは長期サポート外ということが分かり、それではLTS版の.NET6にアプリを移行してみたらどうか、とやってみたらSerialPortがうまくいかないので解決するまでの覚書。 続きを読む…

PlatformIO版ESP-IDF V6に移行する – ADC

カテゴリー: ESP32

ESP32-S3の開発にはPlatformIO(以降PIO)版ESP-IDFV5.1.1で行っていましたが、V6.1.0まで使えるようになったので今後のことも考えて移行することにします。

PIO版ESP-IDF V6公式版ESP-IDF V5に相当し、公式版ではV4→V5で大幅に変更がありました。migrationの一覧はここ、詳細はここで。バージョンの値が近いのでややこしいです。

以前公式版とPIO版のVersionを混同してPCNTをレガシー表記で使った記事を書きましたが、今回の変更でそれも新表記に修正することになりました。

今回はADCについての覚書。キャリブレーションの効果も簡易的に測定しました。

続きを読む…

ESP32-S3のPCNTをPlatformIO版ESP-IDF V5で使う

カテゴリー: ESP32

2023/1/4 文章修正と内容訂正しました。

2023/4/12 ESP-IDFバージョンについての記述を追加しました。

公式版ESP-IDFのAPIはV4.4からV5へのバージョンアップで大幅に仕様が変わっていました。

PlatformIO版ESP-IDFはV6が公式版V5に相当します。これがややこしく、私も混同していましたので、以下のPCNTについての内容はPlatformIO版V5では公式版V5の記述ができない、という至極当然のことだったわけで、訂正いたします。

PCNTも含まれ、記述や関数名が変わっています。参考はここ

ところが、PlatformIOでESP32-S3をESP-IDF V5.1.1で開発してみると、新しい仕様のPCNTが使えない。無理やり「pulse_cnt.h」「pulse_cnt.c」を組み込んでも当然ながらframeworkにhalのドライバが存在しないのでリンカが通らない。なにより小手先の対策はESP-IDFのバージョンを変えるとフレームワークも一新されるので得策ではありません。

今回はレガシィ記述でPCNTを使うことにしました。その覚書です。

続きを読む…

サイクロン集塵機 3号機

カテゴリー: サイクロン集塵機

15年以上前から自作サイクロン集塵機を使っていますが、サイクロン用のパーツが結構出回っているのを発見したので、自作集塵機を新たに3号機とてグレードアップすることにしました。

2023/1/26更新 ターボファンの型式(推定)追加

続きを読む…

ESP32-S3:VScode+PlatformIOで生成したバイナリをesptoolで量産書き込み

カテゴリー: ESP32

VScode+PlatformIOで開発したコードは、PlatformIO→UpLoadで書き込めますがBuildも含まれるので複数枚書き込みには適しません。

そこで、VScodeが吐き出したコードを単体のFlashプログラマとして「esptool」で量産書き込みする覚書です。私の環境はESP32-S3ですが、ESP32全般でたぶん使えると思います。

続きを読む…

PlatformIOのESP-IDFのバージョンを指定する方法 

カテゴリー: ESP32

Espressif IDEの公式HELPでは4.4.3ですが、2022/11現在のPlatformIOのESP-IDFの最新バージョンは5.2.0です。

ただ、ESP32-S3での5.2.0では、ブートからうまくいかないのでいろいろなバージョンを試しています。

 

バージョンを細かく設定する方法

最新バージョンはgitから

最新バージョンは、platformIO.iniのplatform項目にgitを直接指定します。

[env]
platform = https://github.com/platformio/platform-espressif32.git

これで最新バージョンが適用されます。適用後のPlatformIOのinstallを見るとV5.2.0+パッチが適用されていました。

常に更新されているようです。

 

過去バージョンは、platformio.iniで直接バージョン指定

過去バージョンが存在するバージョンは

https://github.com/platformio/platform-espressif32/releases

から確認できます。

ここから希望のバージョンをピックアップし、PlatformIOのplatform=espressif32に後に@x.x.xを追加します。

例としてV5.1.1なら

[env]
platform = espressif32@5.1.1

だんだん使いやすくなってるようです

まだまだ、いろいろ試さなければなりませんが、バージョン設定などの操作は徐々にやりやすくなってるみたいです。

ESP32-S3-1-N16R8を試してみる-USBIFでCDCデバイス

カテゴリー: ESP32

ESP32-S3モジュールは相当魅力的ですが、情報量が少ないので、少しづつ自分なりに確認していきます。開発環境はVScode+PlatformIO ESP-IDF版です。
 今回は、ESP32-S3-1-N16R8で、JTAG用のUSBをCDCデバイスとして設定してみた覚書です(windows限定です)。

2022/11/28追加 sdkconfig.xxxの更新方法

ESP-IDFでTinyUSBスタックが提供されている

私の開発環境であるPlatformIOのESP-IDFモードで確認します。Arduinoモードでも同名のライブラリが存在するようです。

sdkconfigでUSB許可しておく

PlatformIOでsdkconfig.esp23s3を編集して2行を”y”に変更しておきます(2行連続しているとは限りません)。

CONFIG_TINYUSB=y
CONFIG_TINYUSB_CDC_ENABLED=y

Espressif-ESP-IDF/USBサンプルをDL

GitHubから「tusb_serial_device」をDLします。簡単なループバックテストです。TeraTermでキー入力のバックを見るために「キーコード+1」を追加しました。

/*
 * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Unlicense OR CC0-1.0
 */

#include <stdint.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "sdkconfig.h"

static const char *TAG = "example";
static uint8_t buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE + 1];

void tinyusb_cdc_rx_callback(int itf, cdcacm_event_t *event)
{
    /* initialization */
    size_t rx_size = 0;

    /* read */
    esp_err_t ret = tinyusb_cdcacm_read(itf, buf, CONFIG_TINYUSB_CDC_RX_BUFSIZE, &rx_size);
    if (ret == ESP_OK) {
		buf[0] += 1;   // 追加コード
        tinyusb_cdcacm_write_queue(itf,buf,rx_size);
	    tinyusb_cdcacm_write_flush(itf, 0);
        ESP_LOGI(TAG, "Data from channel %d:", itf);
        ESP_LOG_BUFFER_HEXDUMP(TAG, buf, rx_size, ESP_LOG_INFO);
    } else {
        ESP_LOGE(TAG, "Read error");
    }

    /* write back */
//    tinyusb_cdcacm_write_queue(itf, buf, rx_size);
}

void tinyusb_cdc_line_state_changed_callback(int itf, cdcacm_event_t *event)
{
    int dtr = event->line_state_changed_data.dtr;
    int rts = event->line_state_changed_data.rts;
    ESP_LOGI(TAG, "Line state changed on channel %d: DTR:%d, RTS:%d", itf, dtr, rts);
}

void app_main(void)
{
    ESP_LOGI(TAG, "USB initialization");
    tinyusb_config_t tusb_cfg;
    tusb_cfg.descriptor = NULL;
    tusb_cfg.string_descriptor = NULL;
    tusb_cfg.external_phy = false;
    ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));
    tinyusb_config_cdcacm_t acm_cfg;
    acm_cfg.usb_dev = TINYUSB_USBDEV_0;
    acm_cfg.cdc_port = TINYUSB_CDC_ACM_0;
    acm_cfg.rx_unread_buf_sz = 64;
    acm_cfg.callback_rx = &tinyusb_cdc_rx_callback; // the first way to register a callback
    acm_cfg.callback_rx_wanted_char = NULL;
    acm_cfg.callback_line_state_changed = NULL;
    acm_cfg.callback_line_coding_changed = NULL;
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
    /* the second way to register a callback */
    ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(
                        TINYUSB_CDC_ACM_0,
                        CDC_EVENT_LINE_STATE_CHANGED,
                        &tinyusb_cdc_line_state_changed_callback));

#if (CONFIG_TINYUSB_CDC_COUNT > 1)
    acm_cfg.cdc_port = TINYUSB_CDC_ACM_1;
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
    ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(
                        TINYUSB_CDC_ACM_1,
                        CDC_EVENT_LINE_STATE_CHANGED,
                        &tinyusb_cdc_line_state_changed_callback));
#endif

    ESP_LOGI(TAG, "USB initialization DONE");
}

windows10、11ではそのままつながる

UMによるとTinyUSBはUSB-CDC-ACMクラスに準拠しています。Windows10、11では外部ドライバーのインストール無しに使えます。

ローカルエコーONにして”abcdefg”と打った画面です。コードに+1して帰ってきます。

Windows8、8.1マシンは持っていないので未確認ですが、「8以降」と記載されていたのでおそらく大丈夫。できない場合は下記の方法でインストールします。

Windows7ではドライバインストール必要

ESP-IDFのUMに従って汎用CDCドライバをインストールします

Zadig.exeで汎用CDCドライバインストール

zadigはJTAGデバッガでも使う汎用USBドライバです。今回DLしたのは「zadig-2.7.exe」。USB-Serial(CDC)を選択してインストールします。

2022/11/28追加 sdkconfig.xxxの変更

sdkconfig.defaultに記述する

ESP-IDF V5以降では、sdkconfig.xxxを変更しても元に戻ってしまうようです。

今回のTiny-USBの追加作業では、sdkconfig.defaultに記述することで変更できました。

CONFIG_TINYUSB=y
CONFIG_TINYUSB_CDC_ENABLED=y

ダイソーのメモパッド買っちった。

カテゴリー: 電子と機械の工作室

出始めから評判でしたが、やっと買ってみました。500円!

書き消し5万回、筆圧感知!

コレステリック液晶の一種で、電子ペーパーのように双安定性があるため、無電圧で状態を保持するので消去時のみ電流を必要とする超低消費電力機器、らしい。

仕事で使うよりも、リビングやダイニングでちょっとしたメニューなどのメモ書きや覚書に便利です。

贅沢を言わせて頂ければ、消去ボタンで全部消えてしまうので、部分消去できたら良いな、と思いましたが、500円でこれが手に入るのに驚きです。

 

MPLAB Xでフォルダ名に日本語を使うとエラー

カテゴリー: PIC

こんなことは、すでに何回も痛い目にあっているのですが、ついついやってしまう。

今回も既存のプロジェクトをコピーして、ついつい「○○テスト」というフォルダ名にしてしまった。

案の定、正体不明のjavaエラーで構築が一向に終わらない。その様子です。

構築に成功しているプロジェクトをベースにしたはずが・・・

コンパイルは成功するのですが、最後のロードの先が進まない

Java lang.IlleagalArgumentException:・・・メッセージの後に進まない。

最下段の緑のインジケーターが終わらないのだ

フォルダ名から日本語を抜いて解決

大見出しですでに言ってるので、それ以上はありませんが、MPLABXに限らず「うっかりフォルダ日本語名」は絶対やらないという縛りで解決するので、プロジェクトのフォルダ名ぐらいは頑張って英字で決めてゆきたいと思います。

私自身は英語不得意なので、カッコ悪いですけどローマ字表記で頑張ります。

「回転装置」→「kaitensouchi」、カッコ悪いですが、私には分かり易いので・・・