ソレノイドコンテスト応募作品「CHRONOS(クロノス)」について
弊社Q-bot Electronicsは福岡県飯塚市(令和2年4月、同県北九州市八幡西区に本社移転)に本社を構える仮想企業です。同じ飯塚市においてタカハ機工というソレノイドを製造している会社があります。そのタカハ機工さんが主催するソレノイドコンテストに弊社は応募させて頂きました。
開発したものは、入場者数を計りとる時に用いられる計数器(カウンター)を用いた時計です。以下に開発経緯等を記載致します。
目次
- 開発経緯
- 概要
- 構成部品
- 配線図
- 3DCAD「Fusion360」での設計
- 3Dプリンターでの部品出力
- 動作プログラム
- 使用方法
- 動作の様子
- 今後の展開
1.開発経緯
電車の行き先表示などを見て頂くと分かりますが、LEDマトリックスなどで行き先表示がなされていることが当たり前となりつつあります。これまでは行き先が書かれたものが回転して表示を機械的に変えていました。時計も例外ではありません。液晶パネルに時刻が表示されているのは珍しくありません。そこで弊社は機械的な表示の良さを後世に残すべく、メカニカルな時計の開発に着手いたしました。
2.概要
百円ショップで市販されている計数器(カウンター)を用います。RTCモジュールによって時刻を取得し1分経過するごとにソレノイドによって加算ボタンを押下します。また、ステッピングモーターを用いて適宜リセットつまみを回転させます。
3.構成部品
- カウンター(百円ショップ販売品)
- Arduino Nano
- プルソレノイドCA12500050(5Ω)
- 電界効果トランジスタ2SK2233
- 一般整流用ダイオード10EDB40
- ステッピングモーター(28BYJ-48)
- ULN2003搭載ステッピングモーター制御基板
- Groveリアルタイムクロックモジュール
- CR1225コイン電池
- LED(赤、青)
- 1KΩ抵抗 6個
- タクトスイッチ 2個
- DCジャック
- ACアダプター(6V/1.8A)
- 3Dプリンター出力部品
- 固定部品(M3ネジ・インサートナット)
- その他配線類(ピンヘッダ・ユニバーサル基板等)
4.配線図
以下見えづらい箇所がございますが参考までに記載致します。
- Arduino(D2・D3)ー紫ーLED:LED出力制御
- Arduino(D4・D5)ー青ータクトスイッチ:スイッチ入力読み取り
- Arduino(D7)ー緑ー2SK2233(ゲート):ソレノイド制御
- Arduino(D8)ー橙ーステッピングモーター制御基板(IN1):ステッピングモータ制御
- Arduino(D9)ー橙ーステッピングモーター制御基板(IN2):ステッピングモータ制御
- Arduino(D10)ー橙ーステッピングモーター制御基板(IN3):ステッピングモータ制御
- Arduino(D11)ー橙ーステッピングモーター制御基板(IN4):ステッピングモータ制御
- Arduino(A4)ー橙ーRTCモジュール(SDA):RTCモジュール制御
- Arduino(A5)ー橙ーRTCモジュール(SCL):RTCモジュール制御
- Arduino(VIN)ー赤ー6V:電源供給
その他電源供給線等は省略致します。
5.3DCAD「Fusion360」での設計
AutodeskのFusion360で今回は筐体等の設計を行いました。
6.3Dプリンターでの部品出力
3DCADでSTL形式のファイルを出力、さらに3Dプリンター専用のソフトでラフト・サポート材の有無等を設定し、最終的にG-code形式のファイルを作成します。そのファイルをSDカードに保存し3Dプリンターで部品を出力します。
7.動作プログラム
RTCモジュール専用のライブラリ等を用いて以下のプログラムを作成しました。(PCでの閲覧を推奨致します)
注意点として最初のみRTCモジュールに時刻を書き込む必要があります。その為、以下のプログラムを書き込む前に公式のサンプルプログラム(現在時刻に変更)を書き込みました。
#include <Wire.h>
#include "DS1307.h"
#include "Stepper_28BYJ_48.h"
int Rled=2;
int Bled=3;int Lsw=4;
int Rsw=5;
int Sore=7;
DS1307 clock;
Stepper_28BYJ_48 stepper(8,9,10,11);
int num;
int time_num;
int count_num;
void setup() {
Serial.begin(9600);
clock.begin();
pinMode(Rled,OUTPUT);
pinMode(Bled,OUTPUT);
pinMode(Lsw,INPUT);
pinMode(Rsw,INPUT);
pinMode(Sore,OUTPUT);
digitalWrite(Rled,LOW);
digitalWrite(Bled,LOW);
digitalWrite(Sore,LOW);
}
void loop() {
/*時刻取得*/
clock.getTime();
time_num=clock.hour*100;
time_num+=clock.minute;
Serial.print("現在時刻");
Serial.print(time_num);
/*計数器表示値調整*/
if(0<=time_num&&time_num<=1110){
count_num=0;
}else if(1111<=time_num&&time_num<=2221){
count_num=1111;
}else if(2222<=time_num&&time_num<=2359){
count_num=2222;
}
Serial.print(" 計数器表示値");
Serial.println(count_num);
/*/計数器表示調整/*/
digitalWrite(Rled,HIGH);
if(digitalRead(Lsw)==HIGH){
stepper.step(10);
delay(100);
}
/*/メインプログラム/*/
if(digitalRead(Rsw)==HIGH){
while(1){
digitalWrite(Rled,LOW);
//時刻取得
clock.getTime();
time_num=clock.hour*100;
time_num+=clock.minute;
Serial.print(" 現在時刻");
Serial.print(time_num);
Serial.print(" 計数器表示値");
Serial.println(count_num);
//時刻変更
if(time_num!=count_num&&time_num!=0){
digitalWrite(Bled,HIGH);
digitalWrite(Sore,HIGH);
delay(500);
digitalWrite(Sore,LOW);
digitalWrite(Bled,LOW);
delay(500);
count_num++;
num=0;
}
if(time_num==2359)num=1;
//日付変更
if(num==1&&time_num==0){
for(int i=0;i<8;i++){
stepper.step(51);
delay(100);
}
count_num=0;
num=0;
}
}
}
}
8.使用方法
- DCジャックを差すと電源が入り、赤色LEDが点滅します。
- 以下の表を見てください。その時の設定時刻に応じて、左ボタンを押し表示調整時刻に変更します。
- 表示が調整ができたら、右ボタンを押せば現在の時刻に機械が自動調整してくれます。
- これで設定完了!あとはソレノイドが時を刻み続けます。
※故障かなと思ったら
時刻のずれが大きい
ー>内蔵電池が消耗した可能性があります。CR1225コイン電池をお買い求めください。
ー>一度プログラムを書き込む必要があります。7.動作プログラム(上記)をご覧ください。
9.動作の様子
動作させたところCHRONOSに9秒程度誤差が生じてしまいました。RTCモジュールへの時刻書き込みで生じるずれが原因だと考えられます。また日付変更時に23:59から00:00に表示調整するため、ステッピングモーターが自動で作動するようにしてあります。以下、長い動画ではありますが宜しければご覧下さい。
10.今後の展開
今回RTCモジュールを使用しましたが、時刻の書き込みにおいて誤差が生じてしまいます。ネット接続やGPSによって時刻を取得する方法について今後検討していかなければならないと考えています。また、操作方法に関してもユーザーに分かりやすいデザインを追求していくことが必要だと感じました。最後まで本サイトを閲覧して頂きありがとうございました。