2026年9月1日火曜日

コイル巻き巻き女工さん(2)

今日はコイル巻き治具をpower upしました.

コイル巻き巻き女工さん(1)は2024年10月に投稿しました.
ボビンを所定の回数グルグルさせたら停まるっていうだけでした.
こんなシンプルな治具でも100回巻きぐらいなら良かったんです.

しかし、1500~2000回をキッチリ巻かなくちゃいけなくなりました.5~6個作ります.

↓秋月で買った0.16mmポリウレタン線を使います.1500回巻くには130mぐらい消費するんです.
1500回だとプアな巻き治具ではもう無理だなと.なぜかというと、巻いてる途中で電話がかかって来ても中断できないよとか、集中力が尽きたとか、スタミナが尽きたとか、トイレに行きたいとか、そんな悪い事が起きないわけがない.

↓そこでgrade up!!! コイルボビン(右)は30mm径、長さ50mmです.
Arduinoで回転制御してます.
機能:
・USB接続でPCのterminalから巻き数を設定できる
・巻き数を変えたら前途はクリアされる
・terminalのenter keyを押す毎にGO/PAUSE
・所定巻き数で自動停止
・現在巻き数をterminalに表示

しかしながらコイル巻きの重要ポイントは、
 ●テンションをどうやって発生させるか?
 ●巻き位置の長さ方向制御をどうやるか?
両方ともメカニカルな要件ですが、一段と大変になるので今回は見送りました.
これらを完備すればフルオートになりますけど、設計難易度は高いなぁ.

テンション制御と撒き位置制御は「指でやる」ことにしました.
1500回巻くには15分ぐらいかかりますので、人間がつきっきりです.

↓1500T コイルの完成です.とりあえず1個.
整列巻きならば理論値は114mなんですが、ザンバラ巻きしかできないので重量増から逆算して148mも消費しました.無念・・・
ボビンの下端が曲がってるのは、ヒートガンでわざと曲げてあります.巻いてる最中に凸部が引っ掛かって事故るから.またヒートガンで元に戻せばいいじゃ~ん.

コイル屋さんって偉いと思った・・・

翌日追記:
実測したら理論値よりも磁力不足だったので1500→2000Tに巻き増しました.そしたら直流抵抗180Ωになってしまって、電源電圧15Vだと100mA流せないや.失敗です.線径を0.16→0.29mmに増やさなくちゃいけません.これから秋月に買いにいきます.ちくしょう.

かしこ


Arduino sourceを以下に貼っておくね. Programed by Gemini.
terminalの改行コードはCRでお使いください.

// 1回転あたりのパルス数は200で固定
const long PULSE_ROTATION = 200;

// グローバル変数
long turn = 100;            // ターミナルから変更する回転数(初期値100、最大10000)
long i = 0;                 // ループカウンター
bool is_running = false;    // 起動時は回転しない
String input_buffer = "";   // シリアル入力バッファ

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(2, OUTPUT);

  // 2)起動メッセージに、デフォルトの回転数100を表示する
  Serial.println("\nSTART COIL MAKI JIG");
  Serial.print("Default Turn: ");
  Serial.println(turn);
}

void loop() {
  // シリアル端子からの入力を監視
  while (Serial.available() > 0) {
    char c = Serial.read();

    // (\r) を受信したら「データ確定」として処理
    if (c == '\r') {
     
      // バッファに文字が入っている場合(数値入力の確定)
      if (input_buffer.length() > 0) {
        long val = input_buffer.toInt();
       
        // 3)terminalから数値が送られてきたら、表示するとともに、あたらしい回転数を表示する
        Serial.print("Received value: ");
        Serial.println(val);

        if (val > 0 && val <= 10000) {
          is_running=0;
          i=0;
          turn = val; // 入力された数値をTURN変数に代入
          Serial.print("New TURN: ");
          Serial.println(turn);
        } else {
          Serial.println("Error: Value must be between 1 and 10000");
        }
       
        input_buffer = ""; // 数値処理後にバッファをクリア
      }
      // バッファが空の場合(何も入力せずにEnter/CRを押した=STOP/GO切り替え)
      else {
        // 連続する改行コード(\r\nなど)による二重動作を防ぐチャタリング対策
        static unsigned long last_toggle_time = 0;
        if (millis() - last_toggle_time > 50) {
          is_running = !is_running;
          if (is_running) {
            Serial.print("\n--- ROTATION START ---     now:");
            Serial.print(i/PULSE_ROTATION);
            Serial.print("   target:");
            Serial.println(turn);
          } else {
            Serial.println("\n--- ROTATION PAUSE ---");
          }
          last_toggle_time = millis();
        }
      }
    }
    // 数字であればバッファに溜める
    else if (isDigit(c)) {
      input_buffer += c;
    }
  }

  // 回転処理(GO状態、かつ目標値「PULSE_ROTATION * turn」未満の場合のみ実行)
  if (is_running && i < (PULSE_ROTATION * turn)) {
   
    // 画面表示ロジック
    if ((i % PULSE_ROTATION) == 0) {
      Serial.print(i / PULSE_ROTATION);
      Serial.print(" ");
    }
    if ((i % (PULSE_ROTATION * 20)) == 0) {
      Serial.print("\n");
    }

    // パルス出力
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(2, HIGH);
    delayMicroseconds(500);
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(2, LOW);
    delayMicroseconds(2000);

    // インクリメント
    i++;

    // 目標値に達したら停止
    if (i >= (PULSE_ROTATION * turn)) {
      is_running = false;
      Serial.print("\nTarget reached. Finished.  ");
      Serial.println(i/PULSE_ROTATION);
    }
  }
}


2 件のコメント:

  1. ロータリーエンコーダなのかな反射板と光センサなのかなと要らぬ心配して写真ながめて,ああ,このモータね,と。ステッピングモータという名前を思い出すのにしばらくかかりました。

    返信削除
    返信
    1. もっと早く回したいけど、脱調寸前で寸止めしてる

      削除