2019年7月28日日曜日

CO2レーザー その19(Z軸可動化Ⅵ:Limit SW)

CO2レーザー「Z軸可動化」
とうとうⅥ(六)になってしまいました。
ホントは、ⅤでLimit SWまで行き着くはずだったのですが
ATTINY85に邪魔され、かなり疲労しています(-_-;)
CNCやったりして頭を冷やして
さ~て、Limit Switchです。

一応、完成まで、単体ATTINY85で進めていくつもりです。

モデル設計の時に、宝箱で見つけた小さなスイッチを
基板ごとカットして使うことにしていました。
ペン型ノコギリで、必要な部分だけを切り出していきます。
2つの基板付きLimit SWが採れました!
たまには、こういう作業もいいです。
下側のLimit SWをマウントにM2ボルトでつけます。
Limit SWを付けました
下側は、うまいこと当たります。
拡大
Limit SWの棒に当たる、上側のポッチが小さすぎたな~
Fusion360をあまり拡大して設計すると、大きさの感覚が薄れますね~
下側のLimit SWの設計時のモデルです。
上側は、Mortorマウントに取り付けます。
が、スライドロッドが設計よりも短かったので
最上部まで上げてもLimit SWに当たりません(T_T)
上側移動架にLimit SWが当たるポッチを付けていますが
約2mm隙間が空いてます。
そこをSW側に肉盛して厚みを持たせることにします。
上側Limit SWの設計時のモデルです。
これでは、ちゃんと当たっていたのです。
長い方のスライドロッドが1本しかなく、少し短いのを使ってたのを
すっかり忘れておりました(-_-;)
エポキシパテを使います。
60分で硬化し始め、6時間で実用硬度とあります。
粘土のように形成できるので重宝します。
2mm程の肉盛りと幅を広げました!

丁度いい具合の高さになりました。
下側Limit SWのポッチも小さくて心もとなかったので
少し肉盛りと幅広げしました。
配線をしていきます。
リード線は、PS2マウスのだと思うこれ!
今は、6芯あればいいのですが、9芯
後で何か拡張できるでしょう!
コネクタは、P2.5(上側)とP2.0(下側)を持ってますが
下の小さい方を使うことにします。
ハンダ付けしました!
が、スミチューブ(別名:ヒシチューブ、熱収縮チューブ)を忘れた(-_-;)
ので、ホットメルト(別名:ホットボンド)で固めておきます^^;
コネクタのメスの方にpinをカシメます。
ちょっと線が細いので、数本失敗(T_T)
ハウジングに入れました。
このブロックでは、線を短めにして雄コネクタを付けています。
モデルの時に線処理を考えとかねばな~
なんて思っておりましたが、
思ってただけだったので、うまく処理できません(-_-;)
実は、エアホースもどう引き回そうか決めてないのです。
そこから長い線(黒線)で制御回路まで引いていきます。
ダイニングテーブルで実験中なので
すぐに退避できるよう、こんなまな板に乗せてやっております(-_-;)
Limit SWに当たるポッチを肉盛りした時に
一度、分解したので、
再度組み立てると上向きが重くなっています。
調整が非常にデリケートですね~
リードスクリューをM3ネジタイプにしたらいいのですが
このステッピングモーター、軸が一体になっていて
簡単には、M3ネジにできなかったのです。
だいぶ調整しましたが、最初より、ちと重くなったので
モーター電流を増やします。
ADC 1本で3つのKEYをスキャンするようにして
A4988のENABLEを制御できるようになったので
無操作0.5sec後にモーター電流OFFにしてます。
安心して電流増やせます^^;
0.24A/2phaseでもなんとか動いてくれますが、
0.331A/2phaseにしておきます。
で、Limit SW位置を調整します。
このSWは、Normal OPENのみです。
テスターで導通を確認しながら丁度いい位置でボルトを締めます。

では、
Limit SWのテスト
上下でLimit SWがCLOSE(LOW)したら
1mm(27step)戻して、モーターOFFして、3sec休止
わかっているのに、定番の「=」「==」をミスりましたが(-_-;)
無地動きました!
何度も往復してるとモーターがほんのり温かくなってます。
***CO2_Z-Axis_Move_H***
全部省略(-_-;)
**********

次は、HOMING動作です。
HOMEボタン押すと、
「上昇してLimit SW CLOSEしたら、Limit SW OPENまで下げて、
1sec休止(操作受付OFF)」
ATTINY85と格闘したので、やっとスケッチ通りに動いてくれます。
やっぱCNC使ったので頭が冷えたのかも?

***CO2_Z-Axis_Move_J・・・悪くないけどまだ未完成***
//*************************************************************
// CO2 Laser Cutter Z-Axis Controller
// DigiSpark (ATTINY85)
// 抵抗分割して3-KEYをADCで検出
// PB1(Step):470KΩ+Diode(Pluse 立下りなまり対策)
// PB4(LimitSW):4.7KΩ程度のPullUp必須(内部Pull-Up不安定対策)
// 1 PUSHで1mm以上移動するので
// 0.1sec以上の同一KEY押下でSTEP信号を出し、1STEP毎に0.1secのDelayを入れる。
// 0.3sec以上の同一KEY押下でNo Delayして連続移動にする。
// Limit SW 0.5mm(13step)戻って2sec 停止
// Homing 上昇してLimit SW CLOSEで停止、Limit SW OPENまで下がる、1sec停止 

// 注意 see https://digistump.com/wiki/digispark/quickref
// Digital 2 is analog (ADC channel) 1 = pin7 今回は、これ
// Digital 3 is analog (ADC channel) 3 = pin2
// Digital 4 is analog (ADC channel) 2 = pin3
// Digital 5 is analog (ADC channel) 0 = pin5
//*************************************************************

#define Direction 0 // PB0 for Direction HIGH: UP、LOW: DOWN 
#define Step 1 // PB1 for Step Pluse
//#define KEY_Detect 2 // これは間違い!! ADC ch2 = PB4 = pin3
#define KEY_Detect 1 // ADC ch1 = PB2 = pin7
#define nENABLE 3 // PB3 for nENABLE 
#define LimitSW 4 // PB4 for Limit-SW(Upper & Lower)
#define nRESET 5 // PB5 for nRESET

int DontMoveCount = 0; // 非動作期間カウント
int MaxDontMoveCount = 500; // これで約0.5秒
short ContenuousMode = 0; // 0:シングル動作、1:連続動作(未使用)
#define None_Key 4
#define UP_Key 1
#define DOWN_Key 2
#define HOME_Key 3
short KeyPosition = None_Key; //  今押したKEY 4:None Key、1:UP、2:DOWN、3:Home
short last_KeyPosition = None_Key; // 前押したKEY 4:None Key、1:UP、2:DOWN、3:Home
int SameKeyCount = 0; // 同一KEY押下時間カウント
short WaitCount = 0;   // Single Step移動時の無効化時間カウント
short WaitCountIncrease = 10; // 1LOOPの時間が約10msecになるようにする

void setup() {
  // initialize
  pinMode(Direction, OUTPUT);       // DIRECTION
  pinMode(Step, OUTPUT);       // STEP
  pinMode(KEY_Detect, INPUT); // ADC ch1(PB2)でKEY検出
  pinMode(nENABLE, OUTPUT); // nENABLE
  pinMode(LimitSW, INPUT); // LimitSW ("_PULLUP"は効かない)
  digitalWrite(LimitSW, HIGH); // 一応これで内蔵PullUpをActiveにする
  pinMode(nRESET, INPUT);        // Reset(固定だが覚書)
  // 初期値設定
  digitalWrite(Direction, HIGH); // UP
  digitalWrite(Step, LOW);
  digitalWrite(nENABLE, HIGH);  // Motor Disable
  analogReference(DEFAULT);  // Reference = VCC(5V) (念の為)
}


void loop() {
  KeyDetect(); // ADCのKEY状態をScan
  MoveProcess(); // KEY押下時間判定して移動処理
}

//**********************************************
// 抵抗分割のKEYは、ADCで検出(1pinキー回路)
// UP  : 0.0V(0~1.0V)
// DOWN: 1.76V±20% (1.4~2.2V)
// HOME: 3.0V±20% (2.4~3.6V) ・・・ 最上部に移動
// INPUT: 5V ・・・ ADC: 1024 なので
// UP  : 0 to 205
// DOWN: 286 to 451
// HOME: 491 to 738
//**********************************************

void KeyDetect() {
   // 0 以上 ~ 205以下:UP
  if ( (0 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 205)) {
    KeyPosition = UP_Key;
  }
  
  // 286 以上 ~ 451以下:DOWN
  if ( (286 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 451)) {
    KeyPosition = DOWN_Key;
  }

  // 491 以上 ~ 738以下:HOME ・・・ Limit SW 直前まで上がる
  if ( (491 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 738)) {
    KeyPosition = HOME_Key;
  }

   // KEYを押してない時は、5V(VCC)になる
   // 一定カウント超えたらnENABLEをHIGHにしてモーター電流停止
   // SW ALL OFF 739~1023
  if ((739 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 1023)) {
    KeyPosition = None_Key;
  }
}


void MoveProcess(){
    if (last_KeyPosition == KeyPosition) { // 前KEYと同一KEY押下の場合
     SameKeyCount = SameKeyCount + WaitCountIncrease; // ① 1loop分増加
     // 同一Positionに最低閾値~300msec定位していればシングルstep移動命令
     // 同一KEY押下が約100~300msecであれば、シングルstep動作
       if ( 1000 <= SameKeyCount && SameKeyCount < 3000 ) {
          if ( WaitCount == 0 ) { // KEY変化の最初
            ContenuousMode = 0;  // 連続モードOFF(未使用)
            MoveControl();  // 
            WaitCount = WaitCount + WaitCountIncrease;  // 1loop分増加
          } else { // 2回めに同一KEY検出したら290 Wait
          // 一定期間(300msec弱)不感時間を設ける為のカウンタ
            WaitCount = WaitCount + WaitCountIncrease;  // 1loop分増加
              if( WaitCount > 2900) {
                 WaitCount = 0;
              }
          }
          // KEY押下時間SameCountが100未満の場合、①のカウントUPのみ
        }
      // 同一Positionに約300msec以上定位していれば連続移動命令
        if (SameKeyCount >= 3000) {
          // 一定間隔で出力する連続モード
          ContenuousMode = 1; //(未使用)
          MoveControl(); // delayなしでMoveする
        }
     } else { // 前KEYと異なるKEY押下の場合
    // 初めてのKeyScan時の初期化処理
    // ノイズも含め全ての検出は、最初にここを通る
       last_KeyPosition = KeyPosition;
       SameKeyCount = 0;
       WaitCount = 0;
    }
}


void MoveControl() {
    switch ( KeyPosition ) {  // KEYに応じて処理
    case 1:  // UP
      DontMoveCount = 0;
      // UP処理
      // ここにLimit SW判定
         if ( digitalRead(LimitSW) == LOW ) {
           digitalWrite(Direction, LOW); // DOWN方向
             for (short i=0; i<=13; i++){
               SendStepPluse(); // 13step ≒0.5mm後退
             }
            digitalWrite(nENABLE, HIGH); // ENABLEをDISABLE、MORTOR OFF
            delay(2000); // 2sec停止
          }
      digitalWrite(nENABLE, LOW); // ENABLEをACTIVEする
      digitalWrite(Direction, HIGH);
      SendStepPluse();
    break;
    case 2:  // DOWN
      DontMoveCount = 0;
      // DOWN処理
      // ここにLimit SW判定
         if ( digitalRead(LimitSW) == LOW ) {
           digitalWrite(Direction, HIGH); // UP方向
             for (short i=0; i<=13; i++){
               SendStepPluse(); // 13step ≒0.5mm後退
             }
           digitalWrite(nENABLE, HIGH); // ENABLEをDISABLE、MORTOR OFF
           delay(2000); // 2sec停止
         }
      digitalWrite(nENABLE, LOW); // ENABLEをACTIVEする
      digitalWrite(Direction, LOW);
      SendStepPluse();
    break;
    case 3:  // HOME
      // HOMING処理・・・上側Limit SWまでUP
      DontMoveCount = 0;
      digitalWrite(nENABLE, LOW); // ENABLEをACTIVEする
      digitalWrite(Direction, HIGH);
      while (digitalRead(LimitSW) == HIGH) { // Limit SWに当たるまで
         SendStepPluse();
      }
      // Limit SWが働かないちょっと下まで下げる必要がある
      // DOWNにしてLimitSW:LOWで止める
      // Limit SW ONしたらOFFまで戻す
      if (digitalRead(LimitSW) == LOW) {
          digitalWrite(Direction, LOW); // DIRECTION DOWNへ反転
      //    ギリギリでとまりすぎるかな?
          do { // 最低1stepは戻したいのでdo
            SendStepPluse();
          } while (digitalRead(LimitSW) == LOW);
      }
      digitalWrite(nENABLE, HIGH); // ENABLEをDISABLE、MORTOR OFF
      delay(1000); // HOMEの後は、1sec停止
    break;
    case 4:  // None KEY(KEY押下なし)
      // nENABLEをDISABLEしてMOTOR OFF処理
      // 非動作期間カウントUP処理
      DontMoveCount = ++DontMoveCount;
      if ( DontMoveCount >= MaxDontMoveCount ) {
        digitalWrite(nENABLE, HIGH); // ENABLEをDISABLEする
        DontMoveCount = 0; // カウントリセット
      }
    break;
  }
}


//**********************************************
// STEP信号を1Step Pluse送出 F500固定
// 20step/回転、3mmリード=ピッチ、1/4 Microstepなので
// 20 ÷ 1/4 ÷ 3 = 26.667step/mm
// F500 = 500mm/min
// 26.667 x 500 = 13333step/min(1分間)
// 1秒間のSTEP数が、A4988のStepパルス周期になるので
// 13333 ÷ 60 = 222.22step/sec = 222.22Hz = 4.5 msec(HIGH/LOWの1周期)
// 4.5msec ÷ 2 = 2250μsec
// 1step=1/26.667mm=0.0375mm
//**********************************************
void SendStepPluse() {
  digitalWrite(1, HIGH);
  delayMicroseconds(2250);
  digitalWrite(1, LOW);
  delayMicroseconds(2250);
}
**********************

ここらで動画を
・黄ボタン:UP
・赤ボタン:DOWN
・緑ボタン:HOMING
・左上LED:5V Power
・上LED   :DIRECTION(点灯:下向き)
・下LED   :ENABLE(点灯:MOTOR ON)
最初、黄ボタンを約0.3sec以上押してると、連続移動UPになり
Limit SWに当たると0.5mm戻って、2秒間操作無効になります。
次に、赤ボタンを押してる間、連続移動DOWNして
Limit SWに当たると0.5mm戻って、2秒間操作無効になります。
最後に、緑ボタン押すと、HOMING(鏡筒が最も収縮)です。
Limit SW ONまでUPして、Limit SW OFFまで戻り、
1秒間操作無効になります。
短押し(約0.1~0.3sec)は、1step移動ですが、
動きがわからないので、撮ってません。
ここまでくるのに随分長い道のりでした~^^;
ステッピングモーターのDC電源の表示
0.346Aは、モーター全体の平均
0.346Aavr/2phaseなので、0.173Aavr/phase
Peakは、0.25A近いかも
数往復では、モーターは、温かくなる程度なので大丈夫でしょう。
パーツ選定の時に調べた、たぶん、定格:0.2Aavr/phaseだと思います。
短押し:0.0375mm(1step)だと、ほとんど動きがわからないので、
0.5mm(13step)にします。
つまり、KEY押し時間
・0.1sec未満:無反応
・0.1~0.3sec:13step(≒0.5mm)移動
・0.36sec以上:連続移動(F500)

。。。。。無事に動きました。
ATTINY85版が完成です!\(^o^)/
ボードタイプのDigisparkで動作するかは、不明です(-_-;)
***CO2_Z-Axis_Move_K・・・やっと完成\(^o^)/***
//*************************************************************
// CO2 Laser Cutter Z-Axis Controller
// For ATTINY85単体(Digisparkボードで動作するか不明)
// 抵抗分割して3-KEYをADCで検出
// PB1(Step):470KΩ+Diode(Pluse 立下りなまり対策)
// PB4(LimitSW):4.7KΩ程度のPullUp必須(内部Pull-Up不安定対策)
// Delayなしでは、1 PUSHで1mm以上移動するので
// 0.1sec以上の同一KEY押下でSTEP信号を出し、1STEP毎にDelayを入れる。
// 0.3sec以上の同一KEY押下でNo Delayして連続移動にする。
// Limit SW 0.5mm(13step)戻って2sec 停止 (Limit SW:Normal Open)
// Homing:上昇してLimit SW CLOSEで停止、Limit SW OPENまで下がる、1sec停止
// 短押(0.1~0.3sec)  1step ⇒ 13step(0.4875mm≒0.5mm)に変更
//
// 注意 see https://digistump.com/wiki/digispark/quickref
// Digital 2 is analog (ADC channel) 1 = pin7 今回は、これ
// Digital 3 is analog (ADC channel) 3 = pin2
// Digital 4 is analog (ADC channel) 2 = pin3
// Digital 5 is analog (ADC channel) 0 = pin5
//**************************************************************

#define Direction 0 // PB0 for Direction HIGH: UP、LOW: DOWN 

#define Step 1 // PB1 for Step Pluse
//#define KEY_Detect 2 // 注意:これは間違い!! ADC ch2 = PB4 = pin3
#define KEY_Detect 1 // ADC ch1 = PB2 = pin7
#define nENABLE 3 // PB3 for nENABLE 
#define LimitSW 4 // PB4 for Limit-SW(Upper & Lower)
#define nRESET 5 // PB5 for nRESET

int DontMoveCount = 0; // 非動作期間カウント

int MaxDontMoveCount = 500; // これで約0.5秒
short ContenuousMode = 0; // 0:シングル動作、1:連続動作(未使用)
#define None_Key 4
#define UP_Key 1
#define DOWN_Key 2
#define HOME_Key 3
short KeyPosition = None_Key; //  今押したKEY 4:None Key、1:UP、2:DOWN、3:Home
short last_KeyPosition = None_Key; // 前押したKEY 4:None Key、1:UP、2:DOWN、3:Home
int SameKeyCount = 0; // 同一KEY押下時間カウント
short WaitCount = 0;   // Single Step移動時の無効化時間カウント
short WaitCountIncrease = 10; // 1LOOPの時間が約10msecになるようにする

void setup() {

  // initialize
  pinMode(Direction, OUTPUT);   // DIRECTION
  pinMode(Step, OUTPUT);         // STEP
  pinMode(KEY_Detect, INPUT);  // ADC ch1(PB2)でKEY検出
  pinMode(nENABLE, OUTPUT);  // nENABLE
  pinMode(LimitSW, INPUT);       // LimitSW ("_PULLUP"は効かない)
  digitalWrite(LimitSW, HIGH);    // 一応これで内蔵PullUpをActiveにする
  pinMode(nRESET, INPUT);       // Reset(固定だが覚書)
  // 初期値設定
  digitalWrite(Direction, HIGH);  // UP
  digitalWrite(Step, LOW);
  digitalWrite(nENABLE, HIGH);  // Motor Disable
  analogReference(DEFAULT);    // Reference = Vcc(5V) (念の為)
}


void loop() {
  KeyDetect();     // ADCのKEY状態をScan
  MoveProcess(); // KEY押下時間判定して移動&Limit処理
}

//**********************************************

// 抵抗分割のKEYは、ADCで検出(1pinキー回路)
// UP  : 0.0V(0~1.0V)
// DOWN: 1.76V±20% (1.4~2.2V)
// HOME: 3.0V±20% (2.4~3.6V) ・・・ 最上部に移動
// INPUT: 5V ・・・ ADC: 1023 なので
// UP  : 0 to 205
// DOWN: 286 to 451
// HOME: 491 to 738
// No KEY:739 to 1023
//**********************************************

void KeyDetect() {

   // 0 以上 ~ 205以下:UP
  if ( (0 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 205)) {
    KeyPosition = UP_Key;
  }
  
  // 286 以上 ~ 451以下:DOWN
  if ( (286 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 451)) {
    KeyPosition = DOWN_Key;
  }

  // 491 以上 ~ 738以下:HOME ・・・ Limit SW 直前まで上がる

  if ( (491 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 738)) {
    KeyPosition = HOME_Key;
  }

   // KEYを押してない時は、5V(VCC)になる

   // 一定カウント超えたらA4988のENABLEをHIGHにしてモーター電流停止
   // SW ALL OFF 739~1023
  if ((739 <= analogRead(KEY_Detect)) && (analogRead(KEY_Detect) <= 1023)) {
    KeyPosition = None_Key;
  }
}


void MoveProcess(){

    if (last_KeyPosition == KeyPosition) { // 前KEYと同一KEY押下の場合
     SameKeyCount = SameKeyCount + WaitCountIncrease; // ① 1loop分増加
     // 同一Positionに最低閾値~300msec定位していればシングルstep移動命令
     // 同一KEY押下が約100~300msecであれば、シングルstep動作
       if ( 1000 <= SameKeyCount && SameKeyCount < 3000 ) {
          if ( WaitCount == 0 ) { // KEY変化の最初
            ContenuousMode = 0;  // シングル移動モード
            MoveControl();  // 
            WaitCount = WaitCount + WaitCountIncrease;  // 1loop分増加
          } else { // 2回めに同一KEY検出したら290msec Wait
          // 一定期間(300msec弱)不感時間を設ける為のカウンタ
            WaitCount = WaitCount + WaitCountIncrease;  // 1loop分増加
              if( WaitCount > 2900) {
                 WaitCount = 0;
              }
          }
          // KEY押下時間SameCount < 1000 の場合、①のカウントUPのみ
        }
      // 同一Positionに約300msec以上定位していれば連続移動命令
        if (SameKeyCount >= 3000) {
          // Step Pluseを出し続ける連続モード
          ContenuousMode = 1; // 連続移動モード
          MoveControl(); // delayなしでMoveする
        }
     } else { // 前KEYと異なるKEY押下の場合
    // 初めてのKeyScan時の初期化処理
    // ノイズも含め全ての検出は、最初にここを通る
       last_KeyPosition = KeyPosition;
       SameKeyCount = 0;
       WaitCount = 0;
    }
}


void MoveControl() {

    switch ( KeyPosition ) {  // KEYに応じて処理
    case 1:  // UP
      DontMoveCount = 0;
      // UP処理
      // ここにLimit SW判定
         if ( digitalRead(LimitSW) == LOW ) {
           digitalWrite(Direction, LOW); // DOWN方向
             for (short i=0; i<=13; i++){
               SendStepPluse(); // 13step ≒0.5mm後退
             }
            digitalWrite(nENABLE, HIGH); // ENABLEをDISABLE、MORTOR OFF
            delay(2000); // 2sec停止
          }
      digitalWrite(nENABLE, LOW); // ENABLEをACTIVEする
      digitalWrite(Direction, HIGH);
      SendStepPluse();
    break;
    case 2:  // DOWN
      DontMoveCount = 0;
      // DOWN処理
      // ここにLimit SW判定
         if ( digitalRead(LimitSW) == LOW ) {
           digitalWrite(Direction, HIGH); // UP方向
             for (short i=0; i<=13; i++){
               SendStepPluse(); // 13step ≒0.5mm後退
             }
           digitalWrite(nENABLE, HIGH); // ENABLEをDISABLE、MORTOR OFF
           delay(2000); // 2sec停止
         }
      digitalWrite(nENABLE, LOW); // ENABLEをACTIVEする
      digitalWrite(Direction, LOW);
      SendStepPluse();
    break;
    case 3:  // HOME
      // HOMING処理・・・上側Limit SWまでUP
      DontMoveCount = 0;
      digitalWrite(nENABLE, LOW); // ENABLEをACTIVEする
      digitalWrite(Direction, HIGH);
      while (digitalRead(LimitSW) == HIGH) { // Limit SWに当たるまで
         SendStepPluse();
      }
      // Limit SWが働かないちょっと下まで下げる必要がある
      // DOWNにしてLimitSW:LOWで止める
      // Limit SW ONしたらOFFまで戻す
      if (digitalRead(LimitSW) == LOW) {
          digitalWrite(Direction, LOW); // DIRECTION DOWNへ反転
      // Limit SW OFFまで戻す
          do { // 最低1stepは戻したいのでdo
            SendStepPluse();
          } while (digitalRead(LimitSW) == LOW);
      }
      digitalWrite(nENABLE, HIGH); // ENABLEをDISABLE、MORTOR OFF
      delay(1000); // HOMEの後は、1sec停止
    break;
    case 4:  // None KEY(KEY押下なし)
      // nENABLEをDISABLEしてMOTOR OFF処理
      // 非動作期間カウントUP処理
      DontMoveCount = ++DontMoveCount;
      if ( DontMoveCount >= MaxDontMoveCount ) {
        digitalWrite(nENABLE, HIGH); // ENABLEをDISABLEする
        DontMoveCount = 0; // カウントリセット
      }
    break;
  }
}


//**********************************************

// STEP信号を1Step Pluse送出 F500固定
// 20step/回転、3mmリード=ピッチ、1/4 Microstepなので
// 20 ÷ 1/4 ÷ 3 = 26.667step/mm、F500 = 500mm/min
// 26.667 x 500 = 13333step/min(1分間)
// 1秒間のSTEP数が、A4988のStepパルス周期になるので
// 13333 ÷ 60 = 222.22step/sec = 222.22Hz = 4.5 msec(HIGH/LOWの1周期)
// 4.5msec ÷ 2 = 2250μsec
// 1step=1/26.667mm=0.0375mm
//**********************************************
void SendStepPluse() {
  if (ContenuousMode == 0) {
    // シングル移動モード:13step(≒0.5mm)
    // 移動後、 MoveProcess()で300msec弱、操作無効にしている
     for (short i=0; i<=13; i++){
       digitalWrite(1, HIGH);
       delayMicroseconds(2250);
       digitalWrite(1, LOW);
       delayMicroseconds(2250);
     }
  }
  else { // 連続移動モード
     // MoveProcess()でDelayしない、KEY押下中、連続してPluse送出
     digitalWrite(1, HIGH);
     delayMicroseconds(2250);
     digitalWrite(1, LOW);
     delayMicroseconds(2250);    
  }
}
***

フラッシュメモリ:28%
グローバル変数(RAM):26バイト(512バイト中)
最終テストの実体配線図は、これ!
ATTINY85(図では、右下が1pin)は、
・Pin1(RESET)  :OPEN
・Pin2(PB3-OUT):ENABLE(5Vから470Ω+LED)
・Pin3(PB4-IN)   :Limit SW Normal Open(4.7KΩ PULL-UP)
・Pin4(GND)     :GND
・Pin5(PB0-OUT):DIRECTION
・Pin6(PB1-OUT):STEP(GND間に470KΩ+Diode)
・Pin7(ADC1-IN) :KEY用
・Pin8(VCC)      :5V
一応、回路図も作っておきます。
PCBを切削して基板起こすわけではないのですが、
久しぶりにEAGLE V.8.5.2(Updateしてません)で!
A4988のシンボルは、中にステッピングモーターがあって変です。
一時しのぎなので、ユニバーサル基板に組む予定です^^;
***2019.7.31 修正***
78L05の最低入出力間電圧:2V なので、IN:6.2V、OUT:5Vはダメです。
*************
次は、PIC12F1822への換装にいくかな
MPLAB Xをちょっと開いて数年前のコードを見ると
うぉ~~っ!全部呪文に見える(-_-;)
ほぼ忘れていますね~
PICを思い出すには、ちょうど良さそうですが、
どうしようかな~

0 件のコメント: