2025年12月21日日曜日

Arduino IDEのDEADLINE_EXCEEDEDエラー対策

 Arduino IDE 2.3.7を入れた状態で、ESP32 Arduino Core 3.3.4をボードマネージャーからインストールしようとしたらDEADLINE_EXCEEDEDエラーが出てインストールできなくなってしまっていた。

Error: 4 DEADLINE_EXCEEDED: net/http: request canceled (Client.Timeout or context cancellation while reading body)
他のボードはインストールできるのになぜかESP32 Arduino Coreだけインストールできない。
DEADLINE_EXCEEDEDはどうやらタイムアウトっぽいので、Arduino IDEからみてインストールに時間がかかりすぎていて止まってるように見えてしまっているのかな?

ということでタイムアウトを伸ばせないか調べてみた。

調べてみるとどうやらarduino-cliのnetwork設定っぽくて、Linuxの設定方法ばっかり出てきたんだけど、ライブラリの方で問題が起きている人がいたっぽくてそこの設定がそのまま使えそうなのでやってみた。

C:\Users\<username>\.arduinoIDE\arduino-cli.yamlの中に設定が入っているようで、(<username>は自分がログオンしているWindowsのユーザー名)このファイルを編集していく。普通にCドライブから開いていっても隠しファイルとかじゃないので表示できる。

Arduino IDEを全部閉じた状態で、上のarduino-cli.yamlをメモ帳とかで開いて一番下の方に

network:
  connection_timeout: 300s

と入れて保存。

あとはArduino IDEをもう一度開いてインストールしてみると…

普通にインストールできるようになっていた。Windows 11でArduino IDEでDEADLINE_EXCEEDEDエラーが出ている人は試してみると良いかも。

2025年12月20日土曜日

drinkmate 620の炭酸ガス漏れ修理 その後

 この前ゴム部品を反対につけて治ったと思っていたdrinkmate 620なんだけど、やっぱり反対側が裂けているのでちょっと使っていたらまた少しずつ漏れるようになってきてしまった…
2週間しか持たなかった…

というわけで代わりにOリングを突っ込んでみようと思ってOリングを購入してみた。

EA423RB-3
P-3のOリングがサイズ的に良さそう。ということでAmazonでポチってみたんだけどエスコのOリングが10個で89円って値段間違ってない?

早速drinkmateのノズルのゴムパーツを外して代わりにOリングを突っ込んでみた。高さ的には3個必要かな?とおもったけど2個で大丈夫そう。

これでOリングを2個つけた状態で問題なく漏れなかった。周りのゴムはボロボロだけどあんまり関係ない模様。漏れを防止しているのはセンターの小さいゴム部品だけだったのね。

とりあえずこれでもれなくなったし、汎用部品になったのでまた壊れても安心だね。

2025年12月14日日曜日

USB-PD電源モジュールを使ってみた。

 USB PDトリガーデバイスの中でもスイッチで簡単に切り替えられるやつを見つけたので使ってみた。固定のほうが安全なパターンもあるけど、テストのときは切り替えられたほうが便利だし。

表面にはスイッチが3つついていてこれの組み合わせで電圧を変更できる。
裏側にはLEDがついている。PDSink (303PDSink01)っていうのがデバイス名なのかな。MRA193Aっても書いてあるけど。
そんでもってUSB PD+BC シンクコントローラのCH224Kが乗っている。

デフォルト設定だと全部がのスイッチがオフなので5Vが出力される。

5V: OFF-OFF-OFF
9V:ON-ON-ON
12V:ON-ON-OFF
15V:ON-OFF-OFF
20V:ON-OFF-ON

という感じで設定できるっぽい。USB PD充電器によっては12V対応していないのがあるのでその場合は12Vに設定しても9Vになってしまう。
電源を入れたままスイッチをいじるとリアルタイムで変更される。

端子台とスイッチがついてると実験用には地味に便利だなぁ。

ちなみにデバイスを接続する前には一旦電圧をテスターチェックをしたほうが良いと思う。

2025年12月7日日曜日

drinkmate 620の炭酸ガス漏れ修理

 drinkmate 620を2年半ぐらい使っているわけだけども、どうもボタンを押してから"キューッ"っていう音がするのが気になったので調べてみた。自動でガスが少し漏れるのでシューっていうのは元々していたんだけどもキューっていうゴム風船の空気を抜くような音は今までしていなかった。

炭酸ガス漏れというとボンベの方のパッキンの情報は多くて交換用が売っているんだけども、今回は炭酸水を作るときにだけ漏れてるので、インフューザーとヘッドの間から漏れていそうな。

ヘッドのところを下から覗いて見るとゴム部品がボロボロに…

回りのところはまぁ良いとして、先端のノズルについているゴム部品は先端が真っ二つに割れているのでここからガスが漏れているんじゃないかと…

先端のゴム部品を慎重に引き抜いてみるとこんな感じ。

形状がシンメトリなので先端が裂けてない方と入れ替えればいいんじゃね?って言うことで反対に入れてみた。

これだけで治ってしまった…

この部品だけ売って欲しいなぁ

小さいOリングを団子にするか、ゴムチューブを加工して作るか?インフューザーが入るところは5mmぐらい、一番太いところで5.8mmで、ノズルは3.2mmぐらい。長さは5mmぐらいなのでもしかしてグロメットとか加工して作れるかも?

ガスが減ってきていたので購入するか悩んでいたが、これでしばらくは使えそうなのでガスを買いに行こうかな。


追記:
結局また漏れてきてOリングに交換しました。

2025年11月22日土曜日

KZ ZSN PRO 2を買ってみた。

 アリエクの11月11日セールでKZ ZSN PRO 2が安くなっていたので購入してみた。今までKZ ZNAを使っていたんだけども左右の音量に差が出てるような気がしたので…(他のイヤホンから付け替えたときに違和感があって気がついた)

KZ ZSN PRO 2は昔使っていたKZ ZSN PRO Xと同じ構成の進化系っぽいのでいいかなと。

箱が小さくなってる気がする。送料を抑えるための工夫かな?

スペックは裏側に書いてある。今回はマイク無しで1,390円だった。Amazonの半額以下とだいぶお安くなっている。
青いラインが入っているBlue-Blackにしてみた。ケーブルはZNAと同じ感じ。
イヤーピースはこんな感じ。
ケーブルに装着するときはいつも迷う。ミスると位相が逆になるので注意。

音質的にはZNAよりも女性ボーカルが出てくる感じで良い感じ。ZNAから切り替えると高音がすごい刺さってくる感じがあるけどこれはそのうち良くなるかな。

2025年11月9日日曜日

2208モータをセンサ付きFOC制御で回してみた。

 前回はSimpleFOCでOpenloopで回したんだけど、モータドライバ用アダプタを3Dプリントしてもらったのでセンサ付きFOCを試してみた。Openloopで回しただけなのにSimpleFOCで回したというタイトルはまずかったかな…

アダプタは今回もOnshapeで設計したのでフリープランなのでMars Power 2208とかで検索すれば出てくるかも。MT6701に付属のΦ4で2mm厚のマグネットをモータの軸に接着してMT6701と磁石の間が1.7mmぐらいになる感じにしておいた。

まずはアダプタをモータに装着して、その上から基板を装着する感じ。

他のモータ用に作った基板なので配線が外に出てしまったり大きさが微妙だったりするけど、そもそもこのモータの直径まで小さくできるかなぁ?

スケッチはこんな感じでとりあえずSimpleFOCで前回同様にキャリブレーションを行った。

#include "SPI.h"
#include "SimpleFOC.h"
#include "SimpleFOCDrivers.h"
#include "encoders/MT6701/MagneticSensorMT6701SSI.h"

#define MOTOR_POLE 7

#define CS1 PA15
#define SCK1 PB3
#define MISO1 PB4
#define MOSI1 PB5
#define DRV_EN PB12
#define TX3_SCL2 PB10
#define RX3_SDA2 PB11
#define CAN_RX PB8
#define CAN_TX PB9
#define V_CURR PA0
#define W_CURR PA1
#define U_CURR PA2
#define TEMP PA3
#define VOLTAGE PA4
#define LED_BUILTIN PC13


HardwareSerial Serial3(TX3_SCL2, RX3_SDA2);
SPIClass SPI_1(MOSI1, MISO1, SCK1);
MagneticSensorMT6701SSI sensor(CS1);
//InlineCurrentSense current_sense = InlineCurrentSense(0.01, -50 * 4, W_CURR, V_CURR, U_CURR);
InlineCurrentSense current_sense = InlineCurrentSense(0.01, -50 * 4, W_CURR, V_CURR, _NC);
BLDCMotor motor = BLDCMotor(MOTOR_POLE);
BLDCDriver6PWM driver = BLDCDriver6PWM(PA8, PB13, PA9, PB14, PA10, PB15, DRV_EN);  //W V U EN
float target_angle = 0;
Commander command = Commander(Serial3);


void toggleLED() {
  static bool state = false;
  state = !state;
  if (state) {
    GPIOC->BSRR = (1 << 13);
  } else {
    GPIOC->BSRR = (1 << (13 + 16));
  }
}

void doTarget(char* cmd) {
  command.scalar(&target_angle, cmd);
}

void doMotor(char* cmd) {
  command.motor(&motor, cmd);
}

void doAnalog(char* cmd) {
  if (cmd[0] == 'T') Serial3.println(analogRead(TEMP));
  else if (cmd[0] == 'V') {
    Serial3.print("Voltage: ");
    Serial3.println(analogRead(VOLTAGE) * 0.0032);
  }
};

void setup() {
  analogReadResolution(12);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  Serial3.setTx(TX3_SCL2);
  Serial3.setRx(RX3_SDA2);
  Serial3.begin(115200);
  SimpleFOCDebug::enable(&Serial3);

  sensor.init(&SPI_1);
  motor.linkSensor(&sensor);
  driver.voltage_power_supply = 8;
  driver.init();
  motor.linkDriver(&driver);
  current_sense.linkDriver(&driver);
  // control loop type and torque mode
  motor.torque_controller = TorqueControlType::foc_current;
  motor.controller = MotionControlType::velocity;
  motor.motion_downsample = 0.0;

  // velocity loop PID
  motor.PID_velocity.P = 1.5;
  motor.PID_velocity.I = 10.0;
  motor.PID_velocity.D = 0.0;
  motor.PID_velocity.output_ramp = 1000.0;
  motor.PID_velocity.limit = 2.0;
  // Low pass filtering time constant
  motor.LPF_velocity.Tf = 0.05;
  // angle loop PID
  motor.P_angle.P = 5.0;
  motor.P_angle.I = 0.0;
  motor.P_angle.D = 0.0;
  motor.P_angle.output_ramp = 0.0;
  motor.P_angle.limit = 200.0;
  // Low pass filtering time constant
  motor.LPF_angle.Tf = 0.0;
  // current q loop PID
  motor.PID_current_q.P = 1.1;
  motor.PID_current_q.I = 20.0;
  motor.PID_current_q.D = 0.0;
  motor.PID_current_q.output_ramp = 1000.0;
  motor.PID_current_q.limit = 5.0;
  // Low pass filtering time constant
  motor.LPF_current_q.Tf = 0.005;
  // current d loop PID
  motor.PID_current_d.P = 1.1;
  motor.PID_current_d.I = 15.0;
  motor.PID_current_d.D = 0.0;
  motor.PID_current_d.output_ramp = 1000.0;
  motor.PID_current_d.limit = 5.0;
  // Low pass filtering time constant
  motor.LPF_current_d.Tf = 0.02;
  // Limits
  motor.velocity_limit = 200.0;
  motor.voltage_limit = 5.0;
  motor.current_limit = 2.0;
  // sensor zero offset - home position
  motor.sensor_offset = 0.0;
  // general settings
  // motor phase resistance
  motor.phase_resistance = 1.06;
  // pwm modulation settings
  motor.foc_modulation = FOCModulationType::SpaceVectorPWM;
  motor.modulation_centered = 1.0;

  motor.useMonitoring(Serial3);

  motor.linkCurrentSense(&current_sense);
  current_sense.init();
  Serial3.print("current_sense.gain:\t");
  Serial3.print(current_sense.gain_a);
  Serial3.print(", ");
  Serial3.print(current_sense.gain_b);
  Serial3.print(", ");
  Serial3.println(current_sense.gain_c);
  Serial3.print("current_sense.offset_i:\t");
  Serial3.print(current_sense.offset_ia);
  Serial3.print(", ");
  Serial3.print(current_sense.offset_ib);
  Serial3.print(", ");
  Serial3.println(current_sense.offset_ic);

  motor.init();
  motor.sensor_direction = Direction::CCW;
  motor.initFOC();

  command.add('T', doTarget, "target angle");
  command.add('M', doMotor, "motor");
  command.add('A', doAnalog, "analog read");
  motor.monitor_downsample = 0;
  //motor.monitor_variables = 0;

  Serial3.println(F("Motor ready."));
  Serial3.println(F("Set the target angle using serial terminal:"));

  _delay(1000);
}

void loop() {
  motor.loopFOC();
  motor.move(target_angle);
  motor.monitor();
  command.run();
}

今回はインライン電流センサを2つに減らしてみたので使っていない層のピンアサインは"_NC"を指定している。ドキュメントだと2つのポートを指定しただけでも大丈夫そうに書いてあったんだけど初期化のときに"current_sense.offset_ia"が0になってしまって、bとcに値が入っていた。

とりあえず電流センサを2つに減らしても問題なく動いている。もともと2層だけのモータドライバも多いし。

SimpleFOC Studioでキャリブをしているけど9Vでも500mAぐらいしか流れないのでもっと電圧を高めたい感じ。しかしながらTMC6300が11Vまでという…
センサレスのときよりは断然トルクが上がっているのでギアボックスに組み込んでちゃんと回るかな。

2025年11月2日日曜日

2208モータをSimpleFOCで回してみた。

 知り合いが3Dプリントでジンバルモータ内蔵の流星ギアを作っていたみたいなんだけどトルクが全然無いので手でスタートしてやらないと回らないと…
ということでこの前作ったSimpleFOCモータドライバでセンサ付きで回してみることに。

モータはMars Powerの2208モータ。スペックとしては2208 80Tとしか書いてなくて電圧も2S-3Sとなってる。7.4V~11.1Vってことならこの前作ったモータドライバがちょうど良さそう。
ちなみに抵抗値は16Ω、114KVっぽい。ちょっと抵抗値が高いので電圧をかけないとトルクが出ないかも。

電流センサも2つで行けるだろうということで電流センサを2系統、CANトランシーバを装着しないやつをもう一枚作った。オペアンプをつけていないところのシャント抵抗の部分はジャンパした。

とりあえずモータにこの基板をつけるためのアダプタを設計しないといけないので磁気角度センサのMT6701はまだ実装していない。まずは動作確認してみる。

もともとモータのピンヘッダと合体できる設計なんだけど、今回はパッドからケーブルを出して接続。SimpleFOCでセンサなしでVelocity Open Loopで回してみた。
一応電流センサも動いてそう?ちゃんと回ってるけどこんな波形だっけ…
それにしてもOpenloopは発熱だけしてトルクがない感じがする。まだBack-EMFのフィードバックかけてるラジコン用ESCのほうがいいかも。
センサ付きFOC制御で回してみるのが楽しみ。

とりあえずモータとモータドライバのアダプタを設計して磁気アングルセンサ使えるようにしないと。