コンテンツへスキップ

フィラメント菅時計

時計って家にあります? 私,引っ越したので無かったんです。

PCかスマホ見ればいいですし,時計を持ってない人は多いかも。 しかし,朝はギリギリまで寝ているので,スマホをわざわざポケットから取り出す時間すら勿体なかったりします。

時計が欲しい! しかもなるべくカッコイイ時計が欲しい!

そこで,欲求を整理した結果,自分が欲しい時計がamazonでは見つかりませんでした。なんてこった!! そんなわけで時計を作りました。

作ったの半年くらい前なんですけどね。作り方をざっくり紹介します。

ガラスの加工がうまくいかなかったのが残念。

目次

  • 欲求の整理
  • 全体構想と仕様追加
  • 開発環境
  • 回路の部品一覧
  • 回路とソースコード
  • タイマモジュールの使い方
  • GPSの使い方
  • IOエキスパンダ―のつなぎ方
  • フィラメント間の使い方
  • 木枠
  • 回路発注
  • 完成!
  • 雑記

欲求の整理

時計を作るにあたって,求める機能を羅列していきます。

  • 見た目をカッコよくしたい → 木材で枠を作る。フィラメント菅を使用。
  • 電池交換したくない → コンセントから給電
  • 手動で時間を合わせるのが面倒 → 電波等で時間を公正

ニキシー菅を使って作りたかったけど,ニキシー菅はかなり高電圧らしい。5Vで作れた方が安心なので,フィラメント菅に変更しました。敗北 +1。

全体の構想と仕様追加

また,基本的な部品はこれを使用。これにGPSをくっつけます。 6桁表示・フィラメント管時計キット -nixie-tube.com さん

コントローラ(マイコン)部分は私が慣れているRaspberry Pi Picoを使用します。

全体の構成はこんな感じ。

電波で公正ですが,なるべく簡単に作りたいという気持ちがあり,GPSでやります。

GPS受信キット 1PPS出力尽き 「みちびき」2機受信対応

GPSから時刻を取得して時刻表示を更新するタイミングは下記にします。

  • 電源投入時
  • スイッチ(SW)押下時
  • 内部で持っている時刻が12時0分0秒の時

開発環境

  • 開発PC: windows
  • 開発対象: Raspberry Pi Pico
  • 言語: MicroPython
  • 開発環境: Thonny
  • その他: Mini GPS_r1.20 (GPSの設定に使う)
  • その他: Power GPS_r1.00 (GPSの設定に使う)

回路の部品一覧

NAMEQuantitymemoURL
Raspberry Pi Pico1https://akizukidenshi.com/catalog/g/gM-16132/
IV-96フィラメント菅https://nixie-tube.com/shop/1_76.html
5V2A11Aで十分https://akizukidenshi.com/catalog/g/gM-01801/
DCジャック12.1mmhttps://akizukidenshi.com/catalog/g/gC-09408/
タクトスイッチ4色は何でもhttps://akizukidenshi.com/catalog/g/gP-03647/
ボタン電池11.5Vhttps://www.amazon.co.jp/dp/B003X5WJR6?tag=amz-mkt-edg-jp-22
電池ホルダ(LR44用)1https://akizukidenshi.com/catalog/g/gP-08208/
ICソケット18pin1https://akizukidenshi.com/catalog/g/gP-00008/
ICソケット8pin1https://akizukidenshi.com/catalog/g/gP-00017/
ICソケット28pin3https://akizukidenshi.com/catalog/g/gP-00013/
DS1307+1RTC(タイムキーパー)https://akizukidenshi.com/catalog/g/gI-06949/
MCP230173I/Oエキスパンダーhttps://akizukidenshi.com/catalog/g/gI-09486/
水晶発振子32.768kHz1https://akizukidenshi.com/catalog/g/gP-04005/
10kΩ5https://akizukidenshi.com/catalog/g/gR-25103/
1kΩ2I2Cバス用https://akizukidenshi.com/catalog/g/gR-25102/
15Ω6https://akizukidenshi.com/catalog/g/gR-09429/
0.1µF6https://akizukidenshi.com/catalog/g/gP-00090/
M3ねじ適量
スペーサー適量
GOS受信機キット1https://akizukidenshi.com/catalog/g/gK-09991/
ボタン電池1予備https://amzn.to/3oIKaik
基板1PCBwayでプリントしてもらいました。

過不足あるかもしれないけど御愛嬌。

回路とソースコード

私のgithubで公開したはず

回路は watch.pdfです。

タイマモジュール

DS1307+を使います。どうやら内部のメモリに格納された値が時間の初期値で,そこからカウントアップしていく感じらしいですね。

時間を合わせるには,このメモリに時間を上書きしてあげます。

ドライバーですが,Micropythonで簡単に使えるライブラリがgithubに上がってるので使わせていただきます。

書き込みなどは下記のgithubの関数を使うのが簡単です。

micropython-tinyrtc-i2c -github

使い方は簡単,「ds1307.py」をクローンして,picoに保存してあげましょう。それで準備完了。あとは main.py 内でインクルードしたりして,普通に関数をコールすればOK。

下記も参照。

注意点ですが,タイマモジュールに時間を書き込むときは2進化10進法表記の整数にしないといけません。この後出てくるGPSはASCIIで時刻を取得するので,変換してあげましょう。

なお,メモリの値は,電源供給が絶えると消えてしまいます。が,私の設計ではGPSで取得して上書きするので,電池追加等はしていません。

GPS

下記を設定

  • 5Hzで時刻を受信
  • GPZDAモード

GPZDAモードは日付と時刻だけが流れてきます。受信データはASCIIコード。 ホットスタンバイで,ずーっと受信します。消費電力など知るか。

仕様について。下記の3つの条件が一つでも満たされたとき,GPS情報を読み込むように設計しました。

  • 電源投入時
  • タイマモジュール が保持している時刻が0時0分0秒のとき
  • push switch が押下されたとき

GPSの使い方

GPSは色々と受信できます(位置情報とか)が,日付と時刻のみのモードに設定します。ボーレートや更新周波数も設定します。

GPS受信キット 1PPS出力尽き 「みちびき」2機受信対応

秋月のサイトに,GPS設定用ソフトのリンクが張ってあります。

受信するデータの形状はこんな感じの33文字です。ただし,時間は本初子午線基準なので,日本時間にするためには 9 時間足してあげる必要があります。

$GPZDA,131003.400,28,10,2022,,*5B

githubで共有した302行目でGPSを読み込んでいます。 次の行のcorrect_time(buff, rtc_write)の引数ですが,buffは302行目で読み込んだ値,rtc_writeは書き込み先(つまりタイマモジュールに対応するオブジェクト)です。

IOエキスパンダ―

GPIOピンを増やすICです。下記のようにI2Cで結線してあげればOKです。

I2Cの結線
回路一部抜粋

A0, A1, A2 の3ピンでスレーブアドレスを指定できます。Highが1, Lowが 0で,3bitなので最大で8個のMCP23017が繋げるってことですね。 (A0, A1, A2)=(0,0,0)の時,アドレスは0x20になります。

フィラメント菅の使い方

※フィラメント菅の回路図記号が分からなかったので(存在するんですか?)代わりに7セグで作りました。

回路一部抜粋

フィラメント菅には制御ピン8本と電源ピン(コモン)1本の計9ピンあります。

電源は5VでOK。コモンに5Vを供給しておいて,制御ピン(IOエキスパンダ―MCP23017に繋いである)を0Vにすると,電流が流れて対応するセグメントが光ります。

フィラメント菅の実験

木の枠

やっぱり3Dプリンタより木の方がカッコイイよね。

ところで,趣味で CAD 使う時って皆さん何を使ってるんですか?

こんなに単純ならCAD要らんやろって? CADなしで物を作るなどありえん……

自分は oneshapeを使ってみました。 インストール不要ですし,履歴型なので操作感がsolidworksに似ていて使いやすい。長さの測定方法がよく分からなかったのでそこだけイマイチでした。

多分下記リンクで飛べば,自分が作ったデータが見れるはず。

onshape

CAD

これに合わせて切っていきました。切る/穴を空ける/削る。 ドリルとのこぎりと,ガラスカッターが必要です。

水溶性ニス(ダークブラウン) ガラス切る

ガラスはガラスカッターで傷を付けた後,板チョコのように割って加工するんですが,上手くカットできませんでした。当然です,板チョコですら上手く割れないじゃないですか。

自分はガラスカッター以外はホームセンターで全部買いました。

・ガラスカッター & オイル(左端2個): 使いやすかったかと言われると微妙。普通なのでは。

・ニス(真ん中): 二度塗りしました。塗って乾かすだけなので楽でした。色も良い感じ。

・ドリル(右端): ドリルって何が良いんだか分からないのでとりあえず BOSCH にしました。小さい木材を削る分には全く問題無い,使い勝手がいいドリルと言う印象でした。

・ドリルスタンド(右端): ドリルを固定してボール盤みたいにして使ってます。小さい木材を固定するのはちょっと工夫が必要ですが,まぁ大丈夫でしょう。

金が溜まったら卓上フライスが欲しい。

回路発注

PCBway で注文しました。注文時にオペレーターにチャットで繋がって基板チェックが入って,新鮮でした。後でメールでやり取りとかしないんだなぁと。一発OKだったのでほぼ会話なしでしたし,届くまでも1週間しなかったので,かなり良かったです。 ただし,たしか 5枚 $30 くらいだったんですが,ちょうど円安の時期だったので5500円くらいに…。

んで,出来た。

完成!

部品値段 [円]
プリント基板5493
フィラメント菅時計キット11600
GPS受信機キット2200
木材・ハケ・ニス・ガラス1526
合計13419

他にのこぎりとかドリルとか買ったので結構な額が動いた。

夜の姿はこんな感じ。

夜のフィラメント菅の暖かい輝き
夜のフィラメント菅

雑記

利用させてもらった ds1307.py は MITライセンス。こういう無償で公開しているコードってすごく有難いですし有難すぎて投げ銭したい気持ち。github さんスパチャ機能を実装してくれないかな。

追記 (2023/5/13)

みちびき受信キット (GPS) の電池が無くなると動作がおかしくなります。

詳細ですが,GPS はホットスタンバイでずっと正確な時間を受信しており,ラズピコが時々読みに行くという設計です。GPS は受信する信号の種類やボーレートを設定する必要があり,秋月のページに載っている設定ソフトであらかじめ設定します。そして,設定を保持するために,ボタン電池が付いています。この電池が無くなると,設定が初期化されて,ラズピコが読みたいデータ形式ではなくなってしまい,結果,動作がおかしくなってしまいます。(たぶん 11:59:59 から時間が更新されなくなります。)

つまり,「電池交換したくない → コンセントから給電」という要求は達成できていません!!! くやしい!!!!! 

とはいえ,正確な時間 or 停止 なので異常が分かり易くて使い勝手は良いのかなと思います。「いつの間にか時計が30分遅れていた! 遅刻だ!」が一番ヤバいと思いますので。なので,いったんは保留にして,今後もし Ver 2. を設計することになったら修正したいと思います。

ラズパイ上でruby on Railsをやるのが楽なのでは?と思って環境構築したときに詰まったことを書きます。

IoT的なシステムを作る上で、センサ情報をラズパイが取得し、webアプリへ送信するものを作るならラズパイ上でruby on Railsをやるのが楽なのでは?と思って環境構築したときに詰まったことを書きます。

目次

  • 目的
  • 環境構築
  • 参考

目的

ラズパイ上でRuby on Rails環境を作ります。現在の環境は以下。

  • raspberry pi 3 B +
  • ubuntu MATE

Railsとは

Ruby on RailsはRubyで書かれたwebアプリケーションフレームワークであり、webアプリケーションを他のフレームワークよりも少ないコードでかけるように設計されています。 Model View Controllerアーキテクチャに基づいて構築されています。

Model View Controller
  • model:処理
  • view:画面表示部分
  • controller:modelとviewをつなぐ処理 modelとviewへの命令に変換する

modelとviewの中間処理をcontrollerに書く、というような思想がModel View Controllerです。図はwikipediaを参考にしました。

環境構築

普段通りアップデートを確認した後、以下のコマンドを打っていきます。先にnode.jsをインストールしているのは、これがないとjavascriptがないと怒られるからだそうです。

$sudo apt-get install nodejs 

次に参考で見たのでは以下のようにやっていましたが、rbenv install -listで入れたいバージョンが出てこないエラーが発生しました。

$sudo apt-get install rbenv ruby-build 

理由についていろいろと調べたところ、知人によってsudoでrbenvを入れたせいでroot権限が付与されたのではないかと指摘されますた。 ですので、試行錯誤の結果、gitからcloneでインストールしたら成功しました。APPはお好きな名前に変更してください。

$sudo rm -rf ~/.rbenv
$git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build //続いているので注意
$rbenv install -l 
$rbenv install 2.5.0
$rbenv rehash
$sudo reboot
$gem install bundler
$gem install rails
$ sudo apt-get install libsqlite3-dev
$ sudo reboot
$ mkdir rails
$ cd rails
$ rails new APP —skip-bundle //APPアプリを作成。
$ cd APP

ここで、ラズパイと相性が悪い部分があるので、エラー回避のため、config/boot.rbの以下を削除(コメントアウト)します。

#require ‘bootsnap/setup’

ラズパイの接続状況を調べて、以下のように書きます。右上の有線・無線マークの接続情報から見られます。

$ rails s -b (ラズパイの現在のPIアドレス) -d

これにて成功です。http://(ラズパイのIPアドレス):3000 を開いて確認します。

Railsのhello

成功ではありますが、chromium-driver-helperがサポート終了するらしいので、webdriberに移行して欲しいというメッセージが現れます。

+--------------------------------------------------------------------+
 |                                                                    |
 |  NOTICE: chromedriver-helper is deprecated after 2019-03-31.       |
 |                                                                    |
 |  Please update to use the 'webdrivers' gem instead.                |
 |  See https://github.com/flavorjones/chromedriver-helper/issues/83  |
 |                                                                    |
 +--------------------------------------------------------------------+

rails/Gemfileを以下のように変更して、

group :test do
 # Adds support for Capybara system testing and selenium driver
 gem 'capybara', '>= 2.15'
 gem 'selenium-webdriver'
 # Easy installation and use of chromedriver to run system tests with Chrome
 gem 'chromedriver-helper' => gem 'webdrivers'  //ここ
end
$bundle install

同様にサーバーを立てて動作を確認しましょう。 アプリケーションを作るたびにこの設定をした方がいいと思います。このときもconfig/boot.rbの設定変更を忘れずに。

雑記

以前windowsに入れたときにめちゃくちゃ大変だった記憶があります。rubyのバージョンが合わないとすぐエラー!要注意。

参考