15年以上前から自作サイクロン集塵機を使っていますが、サイクロン用のパーツが結構出回っているのを発見したので、自作集塵機を新たに3号機とてグレードアップすることにしました。
2023/1/26更新 ターボファンの型式(推定)追加
15年以上前から自作サイクロン集塵機を使っていますが、サイクロン用のパーツが結構出回っているのを発見したので、自作集塵機を新たに3号機とてグレードアップすることにしました。
2023/1/26更新 ターボファンの型式(推定)追加
VScode+PlatformIOで開発したコードは、PlatformIO→UpLoadで書き込めますがBuildも含まれるので複数枚書き込みには適しません。
そこで、VScodeが吐き出したコードを単体のFlashプログラマとして「esptool」で量産書き込みする覚書です。私の環境はESP32-S3ですが、ESP32全般でたぶん使えると思います。
ESP-IDFのAPIはV4.4からV5へのバージョンアップで大幅に仕様が変わったらしいです。PCNTも含まれ、記述や関数名が変わっています。参考はここ
ところが、PlatformIOでESP32-S3をESP-IDF V5.1.1で開発してみると、新しい仕様のPCNTが使えない。無理やり「pulse_cnt.h」「pulse_cnt.c」を組み込んでも当然ながらframeworkにhalのドライバが存在しないのでリンカが通らない。なにより小手先の対策はESP-IDFのバージョンを変えるとフレームワークも一新されるので得策ではありません。
今回はレガシィ記述でPCNTを使うことにしました。その覚書です。
2023/1/4 文章修正と内容訂正しました。
Espressif IDEの公式HELPでは4.4.3ですが、2022/11現在のPlatformIOのESP-IDFの最新バージョンは5.2.0です。
ただ、ESP32-S3での5.2.0では、ブートからうまくいかないのでいろいろなバージョンを試しています。
最新バージョンは、platformIO.iniのplatform項目にgitを直接指定します。
[env]
platform = https://github.com/platformio/platform-espressif32.git
これで最新バージョンが適用されます。適用後のPlatformIOのinstallを見るとV5.2.0+パッチが適用されていました。
常に更新されているようです。
過去バージョンが存在するバージョンは
https://github.com/platformio/platform-espressif32/releases
から確認できます。
ここから希望のバージョンをピックアップし、PlatformIOのplatform=espressif32に後に@x.x.xを追加します。
例としてV5.1.1なら
[env]
platform = espressif32@5.1.1
まだまだ、いろいろ試さなければなりませんが、バージョン設定などの操作は徐々にやりやすくなってるみたいです。
ESP32-S3モジュールは相当魅力的ですが、情報量が少ないので、少しづつ自分なりに確認していきます。開発環境はVScode+PlatformIO ESP-IDF版です。
今回は、ESP32-S3-1-N16R8で、JTAG用のUSBをCDCデバイスとして設定してみた覚書です(windows限定です)。
2022/11/28追加 sdkconfig.xxxの更新方法
私の開発環境であるPlatformIOのESP-IDFモードで確認します。Arduinoモードでも同名のライブラリが存在するようです。
PlatformIOでsdkconfig.esp23s3を編集して2行を”y”に変更しておきます(2行連続しているとは限りません)。
CONFIG_TINYUSB=y
CONFIG_TINYUSB_CDC_ENABLED=y
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");
}
UMによるとTinyUSBはUSB-CDC-ACMクラスに準拠しています。Windows10、11では外部ドライバーのインストール無しに使えます。
ローカルエコーONにして”abcdefg”と打った画面です。コードに+1して帰ってきます。
Windows8、8.1マシンは持っていないので未確認ですが、「8以降」と記載されていたのでおそらく大丈夫。できない場合は下記の方法でインストールします。
ESP-IDFのUMに従って汎用CDCドライバをインストールします
zadigはJTAGデバッガでも使う汎用USBドライバです。今回DLしたのは「zadig-2.7.exe」。USB-Serial(CDC)を選択してインストールします。
ESP-IDF V5以降では、sdkconfig.xxxを変更しても元に戻ってしまうようです。
今回のTiny-USBの追加作業では、sdkconfig.defaultに記述することで変更できました。
CONFIG_TINYUSB=y
CONFIG_TINYUSB_CDC_ENABLED=y
出始めから評判でしたが、やっと買ってみました。500円!
コレステリック液晶の一種で、電子ペーパーのように双安定性があるため、無電圧で状態を保持するので消去時のみ電流を必要とする超低消費電力機器、らしい。
仕事で使うよりも、リビングやダイニングでちょっとしたメニューなどのメモ書きや覚書に便利です。
贅沢を言わせて頂ければ、消去ボタンで全部消えてしまうので、部分消去できたら良いな、と思いましたが、500円でこれが手に入るのに驚きです。
こんなことは、すでに何回も痛い目にあっているのですが、ついついやってしまう。
今回も既存のプロジェクトをコピーして、ついつい「○○テスト」というフォルダ名にしてしまった。
案の定、正体不明のjavaエラーで構築が一向に終わらない。その様子です。
コンパイルは成功するのですが、最後のロードの先が進まない
大見出しですでに言ってるので、それ以上はありませんが、MPLABXに限らず「うっかりフォルダ日本語名」は絶対やらないという縛りで解決するので、プロジェクトのフォルダ名ぐらいは頑張って英字で決めてゆきたいと思います。
私自身は英語不得意なので、カッコ悪いですけどローマ字表記で頑張ります。
「回転装置」→「kaitensouchi」、カッコ悪いですが、私には分かり易いので・・・
久々にPSoC1のプロジェクトを修正することになりました。開発環境はPSoCdesignerです。
メインPCではアンインストールしてあったので、再インストールです。
PSoC1は内部ブロックの設計にSVGviewerが使われているらしく、Windows11ではインストール時に不適合のメッセージがでます。実行させてもそこだけ抜けていました。
そこで、先日VMware Workstation 16 PlayerにインストールしたWindows7で実行させてみました。
結果は一発OK、USBをゲストに繋ぎ変えてMiniProg/MiniProg3も普通に動作しました。
めでたしめでたし
VMwareToolsの導入に少し苦労したので覚書
そこで、VMwareToolsの手動インストールすることにしました。
VMwareToolsのダウンロードページから、12.1.0をDL。Windows7 SP1 or laterとあるのでインストール条件はOKのはず
まず、SP1をもう一度上書きインストールしてみる。Windows7 SP1のインストールページから手動インストールファイルをDL。
その後、VMwareToolsのコミュニティページで更新プログラムを適用する回答があったのでやってみる。
いずれもゲストOSで実行するものです。
この時点では、VMwareToolsが無効なので、まだD&Dやファイルの共有もできません。そこでUSBメモリ経由でゲストOSへパッチをコピー。
順番としては、
インストール後は再起動。Windows 7 のサポートが切れていますというメッセージが出たら、手順がうまく行ったことらしい。
コミュニティのおかげで助かりましたm(_ _)m
ESP32-S3モジュールは相当魅力的ですが、情報量が少ないので、少しづつ自分なりに確認していきます。開発環境はVScode+PlatformIO ESP-IDF版です。
今回は、秋月販売のモジュールESP32-S3-1-N16R8を使う確認です。販売されているESP32-S3-DevkitC-1とはモジュールの種類が違うので乗せ換えて動かしてみます。
高性能マイコンとして使ってみたいだけなので、ESP32-S3-DevkitCで動作確認して、N16R8でも同じに動作させたいのです。
DevkitC搭載のS3の彫刻は「D3N8」ですが、データシートにD3N8という型番はないのでおそらく「ESP32-S3-WROOM-1-N8」と推測します。HPに「N8」と書いてありました(^^)。
N8とN16R8との(私が)気になる違いは、PSRAMがQuad→OctalSPIです。接続ピンが増えるらしくデータシートによるとGPIO33~37はPSRAM用となりGPIOとしての使用は非推奨となっています。いま検討している事案では、このポートが汎用で使用可否が懸案事項なのです。まずはデフォルト状態でGPIO33~37使えるかどうか確認です。
DevkitCとしてブレッドボードで確認したいので乗せ換えます。
外してみたら8ピンQuad64MbitSPIFlashが搭載されてましたがSPIは一組です。N16R8ではこれがOctalになるそうで、SPI組が増えてGPIO33~37にOctalSPI信号が割り当てられると想像つきます。N16R8を分解して接続を見る必要ありますが、PSRAMを使用しない設定にできればそのままでIOポートとして使えると推定します。まずはデフォルトでなにも設定しないでポートとしてアクセスしてみます。
確認プログラム抜粋です(PlatformIOのBlink Exampleを流用)
#define BLINK_GPIO (gpio_num_t)45
#define SW6 (gpio_num_t)37
・
・
static void blink_led(int s_led_state) {
gpio_set_level(BLINK_GPIO, s_led_state);
}
・
・
static void configure_led(void)
{
gpio_reset_pin(BLINK_GPIO);
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}
void ledTestTask(void *pvParameters) {
for(;;) {
if(gpio_get_level(SW6)==0) s_led_state=1; else s_led_state=0;
blink_led(s_led_state);
vTaskDelay(50);
}
}
extern "C" void app_main() {
gpio_reset_pin(SW6); gpio_set_direction(SW6, GPIO_MODE_INPUT);
gpio_set_pull_mode(SW6,GPIO_PULLUP_ONLY);
configure_led();
xTaskCreate(ledTestTask,"ledtest", 2048, NULL, 5, NULL);
while (1) {
vTaskDelay(100);
}
}
というわけで、とりあえずデフォルトでGPIO36をLED出力、GPIO37をスイッチ入力としてみたところ、無事に動作しました。めでたしめでたし。信号波形もきれいで衝突・干渉等はありません。
PSRAMを使わない・・という設定をきちんと確認する必要はあると思います。
sdkconfigに「PSRAM」のキーワードがなかったので、そう簡単には見つかりませんが、これから関連項目を探すことにします。
これができれば、単なる高性能マイコンボードとして使える用途が増えそうです。