2021年7月11日日曜日

デジタルタコメータモジュール(その5、完成)

夜が明ける頃、目が覚めてしまい早朝から工作していました。

タコメータモジュールの裏側は基板むき出しなので埃やベルトの削れカス防止用に3Dプリンタでカバーを作成しました。これは昨日のうちに作っておいたもの。

こんな感じで裏側をカバーします。

同様にフォトリフレクタ基板も取り付け用に小さなケースを作りました。

AC100VからDC12Vに変換するモジュールも基板むき出しでは危険なのでケースに入れます。タカチのSW-40という小さなケースです。昔購入してストックしていたものです。

丁度ピッタリ収まりました。念のために0.2Aのフューズも入れてあります。

電源は、ボール盤のスイッチが付いていた場所が空洞になっていたのでそこに入れます。写真では電源ケースが大きく写っていますが、奥が深いので収まりました。AC100Vもここからとりました。ボール盤の電源をオンにするとタコメータにも給電されます。

タコメータ、フォトリフレクタはベルトケースの蓋に取り付けました。タコメータは差し込んで、裏蓋を被せたらしっかり固定できました。フォトリフレクタは両面テープで貼り付けた後、念のためにホットボンドで周りを補強してあります。

フォトリフレクタの反射板はプーリにアルミテープを貼りました。実験では白い紙でしたが、紙は汚れそうなのと、アルミテープの方が反射率が高そうなので。

試運転です。一番回転数の高いベルト設定です。ボール盤の仕様では3,000rpmなのでまあまあ合ってる。


中間の回転数。仕様では1,300rpmです。前に試した時よりは仕様に近くなった。アルミテープを反射板にしたのがよかったのか?

一番遅い回転、仕様では450rpmです。

以上で完了です。前にも書きましたがこのタコメータは元々エンジンの回転数を表示する目的のものです。そのためか表示の更新頻度があまり早くなく、数字も細かくは変化せず段階的です。それがデジタル?

ボール盤に負荷をかけても回転数表示は中々変わらないです。鉄の部材に大きな穴でも開けようとすれば変わるかもしれませんが。


2021年7月9日金曜日

デジタルタコメータモジュール(その4)

最近、土曜日の午後に仕事がある(在宅です)ので、今日の午後も代休です。久しぶりに少し遠くのスーパまで買い出しに行きました。土日は結構密になるし、レジが混むので敬遠していましたが、今日は空いていてよかったです。

帰宅後、デジタルタコメータのボール盤への取り付け方法を検討。ケースは使わずに直接取り付けることにしました。

RYOBIのシールをヒートガンで温めて剥がした後、残った接着剤をエターナルで拭き取りました。

ガイドのためにマスキングテープを貼ってリュータで削っていきますが、この作業が思いの外大変でした。鉄板が結構厚いのとリュータの砥石が非力です。なお内側のプーリやベルトにはビニールをかけて鉄粉などが付着しない様にガードしてあります。

結局2時間近くかかってようやく開きました。ピッタリ収まる様に微調整するのが大変。棒ヤスリも使いましたがなかなか削れない。

リュータの砥石はガンガン減るし、割れます。写真左上が新品です。小さなワッシャの様になったのは割れたもの。メガネをかけているので、保護メガネは使いませんでしたが、割れた破片が飛んでくるのであった方が安全です。


タコメータモジュールの枠だけ差し込んでみました。取れなくなると困るので仮です。奥までは入れていません。

切り口が錆びるとイヤなので、黒ラッカをスプレィしました。

鉄と砥石の粉塵まみれになったので、今日の作業はここまでです。防塵マスクをし忘れたのであまりよろしくなかったかも。

2021年7月8日木曜日

安価なステッピングモータで遊ぶ(その4、動画とスケッチ)

安価なステッピングモータで遊ぶ(その3)の動画とスケッチです。
    

適当に書いたスケッチです。正しくないかも知れません。無保証です。

Aruduino nanoとステッピングモータドライバ、タクトスイッチ、小型LCDの接続はスケッチの先頭に#defineしています。スイッチの反対側のピンはGNDです。

時計の秒針のように精確な1rpm(回転/60秒)を実現するために、Timer1割り込みでパルスを作って回転/5秒(12rpm)を基準にしています。1回転4秒でも回りましたが、5秒の倍数にしたほうがrpmを細かく分けられたのでこうしました。
//------------------------------------------------------------------
//                                                     21.07.07 naka
// ステッピングモータのテスト
//   P1-P4: ステッピングモータのドライバの各ピン
//   SW1  : タクトスイッチ(アクティブLow) 回転方向切り替え
//   SW2  : タクトスイッチ(アクティブLow) 回転角度切り替え(+90度)0度は連続回転
//   SW3  : タクトスイッチ(アクティブLow) 回転RPM切り替え(1~12)
//   SW4  : タクトスイッチ(アクティブLow) Start/Stop
//   SDAPIN,SLCPIN  : 小型液晶ディスプレイのI2C
//
//   Timer1割り込みで5秒/回転(2,048Step)するパルス409.6Hzを生成
//------------------------------------------------------------------
#define P1  2
#define P2  3
#define P3  4
#define P4  5
#define SW1 6
#define SW2 7
#define SW3 8
#define SW4 9
#define SDAPIN  A4
#define SCLPIN  A5
#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd;

#define steps_per_rotation 2048
volatile int timer1_flag;
volatile int ph_cnt,rpm_cnt,deg_cnt;
int          rpm_i,rpm_mag,dir;
long         deg,deg_step;
int          run_flag;
int rpm_tbl[6][2] = {1,12,  // 1rpm, 5秒を12倍
                     2,6,   // 2rpm
                     3,4,   // 3rpm
                     4,3,   // 4rpm
                     6,2,   // 6rpm
                     12,1}; //12rpm, 1: 5秒/回転(これが基準)
void setup() {
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  pinMode(P3, OUTPUT);
  pinMode(P4, OUTPUT);
  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(SW3, INPUT_PULLUP);
  pinMode(SW4, INPUT_PULLUP);

  motor_off();
  ph_cnt = 0;

  // Timer1設定
  TCCR1A = 0;
  TCCR1B = 0;
  // 5秒/回転  2048/5 = 409.6Hz
  // 1/409.6 = 0.00244140625 sec
  // 0.00244140625*16MHz = 39,062.5 (0.5は割り込み交互に吸収)
  TCNT1 = 26474;         // offset 65536-39062 = 26474  と
                         //        65536-39063 = 26473  を交互
  TCCR1B |= (1 << CS10); // プリスケーラ 1

  // モニタLCD設定
  SetupLCD();
  dispLCD_start();
  
  rpm_cnt = 0;
  rpm_i   = 0;
  rpm_mag = rpm_tbl[rpm_i][1]; // 基準5秒/回転の倍数
  dir     = 0;  // 右回転
  deg     = 0;  // 90度
  deg_step = steps_per_rotation * deg / 360;  // ステップ数
  deg_cnt = 0;

  dispLCD();
  run_flag = 0;
  TIMSK1 |= (1 << TOIE1); // Timer1イネーブル
}

byte ph1[4][4] = { // 1相励磁
  1,0,0,0,
  0,1,0,0,
  0,0,1,0,
  0,0,0,1
};

ISR(TIMER1_OVF_vect) {
  if (timer1_flag==1)
    TCNT1 = 26474;
  else
    TCNT1 = 26473;
  timer1_flag ^= 1;

  rpm_cnt+=1;
  if(run_flag==1 && rpm_cnt==rpm_mag) {
    if (deg_cnt<deg_step || deg_step==0) {
      digitalWrite(P1,ph1[ph_cnt][0]);
      digitalWrite(P2,ph1[ph_cnt][1]);
      digitalWrite(P3,ph1[ph_cnt][2]);
      digitalWrite(P4,ph1[ph_cnt][3]);
      if (dir==0)
        ph_cnt = (ph_cnt+1)%4;
      else {
        ph_cnt -= 1;
        if(ph_cnt<0) ph_cnt = 3;
      }
      rpm_cnt = 0;
      deg_cnt++;
    }
    else if (deg_cnt == deg_step) { // 規定数回転したのでstop
      run_flag = 0;
      motor_off();
    }
  }
}

void loop() {
  checkSW(); // タクトスイッチ状態確認
}

void checkSW() {
  if (digitalRead(SW1)==LOW) { // direction
    dir ^= 1;  // 回転方向逆転
    dispLCD();
    while(digitalRead(SW1)==LOW);
  }
  else if (digitalRead(SW2)==LOW) { // rpm
    rpm_i   = (rpm_i+1)%6;
    rpm_mag = rpm_tbl[rpm_i][1];
    rpm_cnt = 0;
    dispLCD();
    while(digitalRead(SW2)==LOW);
  }
  else if (digitalRead(SW3)==LOW) { // degree
    deg += 45;
    if (deg>360) deg = 0;
    deg_step = steps_per_rotation * deg / 360;
    deg_cnt = 0;
    dispLCD();
    while(digitalRead(SW3)==LOW);
  }
  else if (digitalRead(SW4)==LOW) { // Start/Stop
    run_flag ^= 1;
    if (run_flag==0) motor_off();
    deg_cnt = 0;
    rpm_cnt = 0;
    while(digitalRead(SW4)==LOW);
  }
  delay(10); // チャタリング回避
}

void motor_off() {
  digitalWrite(P1,LOW);
  digitalWrite(P2,LOW);
  digitalWrite(P3,LOW);
  digitalWrite(P4,LOW);
}

void dispLCD_start() {
  lcd.clear();
  lcd.print("STEPPING");
  lcd.setCursor(0, 1); // Col,Raw
  lcd.print("   MOTOR");
  delay(1000);
  dispLCD();
}

void dispLCD() {
  char buff[10];
  char dir_txt[2];

  if (dir) strcpy(dir_txt,"L");
  else     strcpy(dir_txt,"R");

  lcd.clear();
  lcd.setCursor(0, 0); // Col,Raw
  sprintf(buff,"%s %3dDEG",dir_txt,deg);
  lcd.print(buff);
  lcd.setCursor(0, 1); // Col,Raw
  sprintf(buff,"   %2dRPM",rpm_tbl[rpm_i][0]);
  lcd.print(buff);
}

void SetupLCD() {
  lcd.begin();
  lcd.command(0x38);
  lcd.command(0x39);
  lcd.command(0x14);
  lcd.command(0x73);
  lcd.command(0x51);  // 5V
//  lcd.command(0x56);  // 3.3V
  delay(2);
  lcd.command(0x6c);
  delay(300);
  lcd.command(0x38);
  delay(1);
  lcd.command(0x01);
  delay(2);
  lcd.command(0x0c);
  delay(2);
}
//------------------------------------------------------------------
// EOF
//------------------------------------------------------------------

2021年7月6日火曜日

デジタルタコメータモジュール(その3、電源モジュール)

ボール盤に取り付けるタコメータ のためにAliexpressで注文していた電源モジュールが届きました。最近、中国からの到着が早くなってきた気がします。

入力AC70-270V、出力DC12V、300mAの小さな変換モジュールです。2個+送料で250円くらいだった気がするので1個125円です。写真の方眼は10mmなのでとても小さい。

自前でコンデンサを使ったトランスレス電源を作るより安くて小さくて容量もとれますね。ちょっと耐久性は心配だけど。

100Vを繋いでみました。赤いLEDが光るのは予想外でしたが、通電状況がわかってよいです。出力は若干低めの11.88Vでした。無負荷だからか?


タコメータとフォトリフレクタを繋いでみました。ちゃんと動いているようです。


12Vと表示されたのでテスタで測ってみると、ちゃんと12V出ていました。やはり無負荷だと低く出るようです。

ボール盤への取り付け方法をどうするか思案中。タカチのケースに収めるか、3Dプリンタでケースを作るか、直接ボール盤のベルトのケース(蓋)に組み込むか。

2021年7月4日日曜日

安価なステッピングモータで遊ぶ(その3)

雨と気圧が低い日が続いているためか少々頭痛がします。ひどくはないですが、何となく体調がよくない。今日は都議会議員選挙の投票に行ってきましたが、雨で投票率が低かったのではないかと思う。早く晴れが戻って欲しいが、来週の天気予報はずっと雨と曇りです。

昨日の 続きでステッピングモータの制御プログラムを修正してみました。4つのタクトスイッチとLCDを付けて、回転方向、回転角度、速度(RPM)を指定できます。4つ目のスイッチはスタート/ストップ。


Timer1割り込みを使い、5秒ピッタリで1回転(2048ステップ)するようにしています。12RPMです。これを基準に他の回転数、最遅1RPM(1分で1回転)を作りました。Arduinoのステッピングモータ用ライブラリを使った方が簡単かもしれませんが、色々試したくてスクラッチで作ってます。

木片でモータを固定する台座を作りました。


こんな感じで収まります。モータの放熱を考えるとあまりよろしくないですが、実験程度の短い時間なら大丈夫でしょう。

MDFから切り出した円板を載せて、ターンテーブルです。

軽いものなら十分に回ります。ただし回転中に回転方向を変えると、ギアのバックラッシュの影響もあって少し動きが悪いです。重いものを載せているとギアが破損するかも。起動と停止時はゆっくり回さないと危なそうです。

今は軸で重量を支えていますが、本格的に作るなら写真のようなベアリングを使う方がよさそうです。これは以前、塗装のための回転台を作ろうと思って買ったもの。大きなものは回る中華テーブルなどに使われています。

需要があるか不明ですが、近日中にスケッチと動画をアップします。

2021年7月3日土曜日

安価なステッピングモータで遊ぶ(その2)

先日試した安価なステッピングモータ の軸から力を取り出すための部品を作成しています。軸の直径はφ5mmですが、すべり防止のために2面が平らになっていてそこの厚さは3mmです。その形に合わせてアクリル板からCNCで削りだしてカラーを作りました。
 
カラーの厚さは5mm、外形φ10mmです。軸にピッタリだったので圧入でも大丈夫でしたが、一応φ2mmのタップを切り、ビスで固定できるようにしています。手元にイモネジが無かったので皿ビスです。
 

カラーだけでは力を取り出せないので、サーボモータに付くような羽根も切り出してアクリル接着剤で貼り付けました。羽根の厚さは2mmです。



ステッピングモータに取り付けて回転させているところです。よい感じです。この先に何を繋ぐのかまだ思いつきません。このままだとネギ振りになってしまいそう。



もうひとつ、円盤も切り出しました。円盤の厚さは2mm、直径φ30mmです。中心をカラーの直径φ10mmでザグって、センターがでるようにしています。 



こちらもアクリル接着剤で固定し、皿ビスもつけています。


ターンテーブルにできないかと、6mm厚のMDFをφ200mmで切り出して、中心を上記φ30mmの円盤が収まるようにザグっています。とにかくセンターがでないと、回転させてもかっこ悪いので、このようにしました。



本日はここまで。明日、モータを固定して動かしてみる予定です。

2021年7月2日金曜日

非接触スイッチで電球の明るさ制御

先日、PICで作成した非接触スイッチ で電球のオンオフと明るさをコントロールした動画をアップしました。



速度での明るさ制御は4通りでは少しコントロールが難しいかも。3通りくらいが良いかもしれません。

週末は このステッピングモータの軸に取り付ける部品、カラー? を作り、何か動かしてみようかと思っています。