この投稿がガス冷却ペルチェ方式霧箱と関係があるのかといわれると、直接の関係は無いです(笑 が、行きがかり上、というかこれやらないと霧箱ができないでしょ、と解釈してその8として投稿させていただきます。
現有のCNC3040にはスピンドルの回転数を検出する手段がありません。
スピンドルはDC駆動 230W(公称)の結構でかいやつがついています。
このモータをこのコントローラでスピード調整するのですが、そのつまみはこんな感じで全く回転数が分かりません。
ということで、スピンドルの回転数を検出するための回転数計を作ることにしました。
回転数を測る方法は様々ありますが、ここは安直にいくことにします。
スピンドルのこのファン部分にアルミテープか何か光を反射しやすいテープなどを貼って、スピンドルが回転した際にどの程度の周期でそのテープが前を通過するかをフォトインタラプタで測定する方式です。
この方式を選んだのは、必要な部品が全部手元にあるからです。ほかにホール素子と磁石使ったり、ストロボライト使ったりする手がありますね。
使用するのはROHMの反射型フォトインタラプタRPR-220シリーズです。
これ。
こんな感じにLEDとフォトトランジスタが隣り合っています。
通常のフォトインタラプタはこの二つが互いに向かい合っていて、その間に邪魔板が入ると光が遮断されてフォトトランジスタの信号レベルが変化するというものですが、反射型は両社が同じ方向を向いており、邪魔板が近づくとLEDの光が邪魔板に反射してフォトトランジスタに入り信号レベルが変化します。つまり、邪魔板が作用するときのロジックが逆になっています。フォトトランジスタはオープンコレクタですのでプルアップしたポートのロジックレベルを見張ることで状態変化を検出することができます。
検出した回転数の表示はLCDを使いますが、今回はこの小型LCDを使います。
このLCDはaitendoで買ったもので、外形が50x20mm程度と非常に小さいです。これでちゃんと16x2文字を表示出来、インターフェースはいわゆるSC1602と同じになっています。ということでArduino につなげば簡単に使うことができるのです。
引き出し線は16P片面のフレキになっていますので、適切なコネクタを使って引き出し線をハンダ付けします。このコネクタは日米商事の向かって右側の入り口近くにある棚(わかりますよね)で探し出したものです。一つ30円くらいじゃなかったかな。
せっかく小さなLCDを使いますので、Arduinoも小さい奴にしましょう。
これで。あんまり登場する機会がないArduino Pro Mini の168P 5V版です。
Aliexpress で超格安で手に入ります。これ。一つわずか150円くらい。
せっかくなので基板も小さいものに。回転するファンに近づけて測定しますので、センサを近づけやすく、かつ握りやすいスティック状に作ってみることにします。
こっちの基板にしましょう。ちょうどカードエッジにパターンがありますのでセンサの実装がやりやすいです。
Arduinoはこんな感じに載せますか。
配線していきます。
LCDはこんな感じに縦に実装します。いろいろ無理はあるのですが、それなりにスティック状です。
LCDの位置を決めたらホットメルトで固定します。
配線はどうというものでもないので特に載せません。注意点は、フォトトランジスタの状態変化を割り込みで検出しますので、フォトトランジスタのコレクタを外部割り込みポートである2番か3番に接続しておくことです。
LCDの配線はRSとEnable,データ線は4-7の4本接続にしています。このあたりもArduino のデジタル出力ができるポートにつないどけばあとでどうにでもなります。あとはLCDの電源とバックライト用の電源。
結構汚い引き回しですがお許しを。
スケッチ書き込みます。
Arduino Pro MiniはFTDIやCH340といったUSBシリアル変換ICを積んでません。ので、スケッチの書き込みにはUSB-シリアル変換基板が必要です。
私は秋月のFT232RLが乗ったボードを使っています。
とりあえずLCDの動作を確認します。
スケッチを適当に書いてフォトインタラプタのレベル変化が適切に起きるかどうかを確認します。プルアップした3番を使います。邪魔板がない状態ではポートはHIGHです。
指を近づけていくとあるところで指に当たって反射したLEDの光がフォトトランジスタに入り、トランジスタがONしてレベルがLOWに落ちます。
離すと元に戻ります。結構いい感じで動いています。
動画でどうぞ。
RPR-220シリーズには赤色/青色LEDがあり、いずれもてもとにありますが、今回は赤を使用。
スケッチを書き直して回転数を計算させます。
考え方は、割り込みポートのレベルがLOWに落ちた時刻と、次にLOWに落ちた時刻をそれぞれmillis()で二つの変数に書き込み、両者の差から周期を求めて1分あたりの回転数に換算、それをLCDに表示しています。演算はmsTimer2を回して1秒に1回行っています。
スケッチはこの投稿の最後に載せておきます。相変わらず汚くて効率が悪いと思いますがご容赦ください。
懐かしいハンドスピナーを使って実際に回転体の回転速度を測ってみたいと思います。
ハンドスピナーの一部にマスキングテープを貼ってそこを黒く塗ります。ここで反射光が弱くなってフォトトランジスタがHIGHになるはずです。
動いているところを動画で。
なんか回転数が飛ぶことがありますのでおそらくバグが残っていますが、まあいいでしょう。
ということで、とりあえず完成とします。
ちゃんと電源とらないといけませんね。あと簡単なアクリルの保護板くらいはつけましょうかね。
ということで、霧箱といいつつ完全な電子工作ネタでした。
イカソース。
*****************************************
//LCD駆動とタイマーのためのライブラリをインクルード
#include <LiquidCrystal.h>
#include <MsTimer2.h>
//LCD配線、自分の接続に合わせて変更が必要です
const int rs = 2, en = 4, d4 = 6, d5 = 7, d6 = 8, d7 = 9;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//邪魔板がセンサの前を横切った時刻を格納する二つの変数
unsigned long time1 = 0;
unsigned long time2 = 0;
void setup() {
//外部割り込みポートは3番です
pinMode(3, INPUT_PULLUP);
//割り込みが入ったらcountという関数を呼び出します。
//割り込みは信号レベルがHIGHからLOWに落ちた瞬間に発生します。
attachInterrupt(1, count, FALLING);
//見出し
lcd.begin(16, 2);
lcd.print(“RPM meter”);
//タイマー設定。1秒ごとにタイマー割り込み発生
//割り込みが生じたらLcdUpdate関数を実行
MsTimer2::set(1000, LcdUpdate);
MsTimer2::start();
}
void count() {
//センサ割り込みが発生したらtimeRecord関数を呼び出す
//経験上ここでいろいろ処理すると変なことが起きがち
timeRecord();
}
void timeRecord() {
//センサ割り込み発生の時刻を格納
time2 = time1;
time1 = millis();
}
void LcdUpdate() {
int rpm;
//回転数の計算
if (time2 != time1) {
rpm = 60000 / (time1 – time2);
}
else
{
rpm = 0;
}
time2 = time1 = millis();
//LCDへの表示
lcd.setCursor(0, 1);
lcd.print(” “);
lcd.setCursor(0, 1);
lcd.print(” ” + String(rpm));
lcd.setCursor(13, 1);
lcd.print(“rpm”);
}
void loop() {
//loop関数では何もしません
}
*****************************************
コメント