電子工作」カテゴリーアーカイブ

Raspberry Piで部屋の温度を長期間記録する(自動実行編)

部屋の温度を測定してデータベースに記録するところまではできたので、今度はこのプログラムを定期的に実行してデータをためていきます。

Linux系OSの場合”cron”というデーモンでプログラムの自動実行が可能です。Windowsでいうところのタスクスケジューラ的な使い方ができるものです。

cronの設定ファイルを開く

cronは設定ファイルに各プログラムをどういうスケジュールで実行するかを書き込むことで設定を行います。

設定ファイルはcrontabという名前で、ターミナルから以下の通りにコマンドを入力すると中身を編集することができます。

<ターミナル>
crontab -u [ユーザ名] -e

Raspberry Piの場合デフォルトのユーザ名はpiに設定することが多いと思うので、その場合は crontab -u pi -e と入力すればOKです。

cronのスケジュールの書き方

crontabを開くとエディタが起動するので、スケジュールを書いていきます。

基本的な記法は以下の通りです。

<crontab>
* * * * * [実行する内容]

最初のアスタリスクは前方から”分・時・日・月・曜日”を意味しています。

<crontab>
#毎日8時59分に実行
59 8 * * * [実行する内容]

#毎時29分に実行
29 * * * * [実行する内容]

実行する内容はプログラムの名前をフルパスで記述します。プログラムの名前だけで動作しない場合、そのプログラムを実行するファイルの環境変数が設定されていない可能性があります。この場合、プログラムの名前の手前部分に実行するファイルの名前を明示的に指定すると動きます。

今回の場合はPythonなので以下の通りになります。私が今回作った環境ではPythonの実行パスがあわせて必要で、最初これにしばらく気づかず解決にずいぶん時間がかかりました。

<crontab>
#ファイル名のみ設定
#毎時29分に実行
29 * * * * /home/Document/roomtemp.py

#Pythonの実行パスも含めて設定
#毎時29分に実行
29 * * * * /usr/bin/python3 /home/Document/roomtemp.py

crontabを保存して終了して設定は完了です。

cronの実行と設定確認

crontabで設定ができたら、念のためcronを再起動しておくと確実です。

<ターミナル>
sudo systemctl restart cron

これでうまく動いてくれれば大丈夫です。動作を確認したい場合は以下のコマンドで実行ログが出るので、cronでプログラムが実行されたかどうかをチェックできます。

<ターミナル>
sudo /etc/init.d/cron status -l

-lのオプションをつけておかないと結果が省略されて見づらくなってしまうので、-lを付けておいた方が良いと思います。

まとめ

これでプログラムを定期的に実行し、データを蓄積することができるようになりました。次回ではためたデータをグラフ化して見る方法をまとめてみたいと思います。

Raspberry Piで部屋の温度を長期間記録する(データベース編)

今回Raspberry Piで部屋の温度を記録するに当たって、おおよそ以下のような設計を考えました。

  1. Raspberry Piで部屋の温度を測定する
  2. データベースに測定時刻と共に温度データを蓄積する
  3. データベースの情報を元にグラフを描画する

1の手順については準備編で紹介した書籍、”Raspberry Piで学ぶ電子工作”で紹介されているので、それを流用します。今回のエントリは2の部分です。

SQLiteによるデータの蓄積

簡易なデータベースとして今回はSQLiteを使うことにしました。SQLiteはローカルでの利用に向いた手軽なデータベースとしてよく使われているものだそうです。

コードは以下のような感じになりました。

<Python>
#UTF8
import smbus
from time import sleep
import sqlite3
import datetime

#温度測定プログラム"Raspberry Piで学ぶ電子工作 プログラム7-1を流用"
#変数"InputValue"に温度が格納される

#データベースファイルが存在しない場合は作成
dbpath = '/home/pi/Documents/roomtemp_db.sqlite'

#コネクション生成
connection = sqlite3.connect(dbpath)

#カーソル生成
cursor = connection.cursor()

#テーブルが存在しない場合は作成
#ID、日付時刻、温度の3列で構成
cursor.execute("CREATE TABLE IF NOT EXISTS roomtemptable (id INTEGER PRIMARY KEY AUTOINCREMENT, datetime TEXT, temp REAL)")

#現在時刻を取得
nowdt = datetime.datetime.now()
nowdt = nowdt.strftime('%Y%m%d-%H:%M:%S')

#SQLコマンド実行
sql = 'insert into roomtemptable (datetime, temp) values (?, ?)'
data = (nowdt, inputValue,)
cursor.execute(sql, data)
connection.commit()

connection.close()

SQLiteの面白いと思ったところはコード内でファイル作成から行えるところです。既に同名のファイルが存在した場合は上書きせずにスキップしてくれるので、作る方としては楽です。これはテーブルについても同様です。

SQLコマンドの実行はcursorインスタンスのexecuteメソッドで行います。SQL文のパラメータはタプル(データの組)としてexecuteメソッドの第2引数に設定することができます。他にもパラメータの使い方はあるようなのですが、何となく私はこの記法が理解しやすかったのでそうしました。

日付時刻の処理

少々詰まったのは日付時刻の処理で、取得したdatetime型の情報を文字列型に変換する方法が分からずに苦労しました。結局datetimeオブジェクトのstrftimeメソッドで変換可能なことが分かったのでそれを使いました。

まとめ

このプログラムを実行することでデータベースを作成し、その中のテーブルに日付時刻と共に温度情報を書き込むことができます。

後はこのプログラムを定期的に実行すればOKです。次回のエントリではcronを使ってこのプログラムを自動実行する方法を整理してみたいと思います。

参考リンク

sqlite3—SQLite データベースに対する DB-API 2.0 インターフェース

datetime—基本的な日付型および時間型

[Python.org]

Pythonのドキュメント群は非常に分かりやすい日本語情報があるので、何と言ってもオフィシャルの情報が頼りになりました。

Raspberry Piで部屋の温度を長期間記録する(準備編)

部屋の環境測定のために、温度を一定時間ごとに長期間モニタリングする方法はないかと考えていました。多少のプログラミングの心得があればRaspberry Piで実現可能らしいことが分かったので材料を準備して試してみることにしました。

用意したもの

  • 講談社 Raspberry Piで学ぶ電子工作(書籍)
  • 講談社 Raspberry Piで学ぶ電子工作用パーツセット
  • Raspberry Pi4 ModelB(8GB)
  • Raspberry Pi4用ケース
  • HDMIケーブル TypeDオス-TypeAオス
  • スイッチングACアダプタ(USB TypeC)5.1V-3.8A
  • MicroSDHCカード
  • Raspberry Pi Zero WH
  • Raspberry Pi Zero WH用ケース
  • スイッチングACアダプタ(USB MicroB)5V-3A

Raspberry Pi本体が2種類あるのはPi4が開発機でZero WHが本番機という構成のためです。開発機が本番機を兼ねる場合は上記リスト中下側の3行は不要になります。

今回は本体を2台用意しているので正味の調達価格は2.6万円くらいになってしまいましたが、とりあえず1台で始めるなら2万円くらいで書籍やパーツも含めて一通り揃うと思います。

書籍について

今回入門書として使った”Raspberry Piで学ぶ電子工作”はとても分かりやすく、かなりの良書だと思いました。

Linux系のOSやプログラミングが一切未経験という方が読んでも分かるように説明がされており、分かりやすい説明の見本としても秀逸なのではないかと思います。

そしてこの書籍に関しては書籍の内容と連動したパーツセットが秋月電子通商で販売されていて、これも便利です。電子工作部品は規格が分かりにくく、慣れていないと必要な部品を揃えるのが難しいと思います。

私は過去に作ろうと思った物の部品に発注忘れや発注間違いがあって何度も注文したり、必要な部品の最低発注数量が数百個となっていたりで困った記憶があります。

この点、この書籍連動パーツセットを買えば過不足なく部品が入っていて書籍の内容を全てこなせますし、書籍の内容を終えたら部品を別の用途にそのまま転用できるので無駄がなく便利です。いきなりアラカルトで部品を揃えるより確実にオススメできます。

プログラミングの入門にも

書籍の内容はRaspberry Pi上で動くPythonのプログラムを使ってLEDを光らせたり画像を取得したりするといった内容です。

現実世界にプログラムで指示したことが反映されるので、学習初期にありがちな”プログラムで何をしたらいいか分からない”や”プログラムで文字が表示されても別に面白くない”といった問題を解決できます。学習者のモチベーション維持に非常に良いのではないかと思います。

Quick7のファームウェアカスタマイズ

自作キーボードはファームウェアのカスタマイズで自分好みの機能にできるのも魅力です。先日組み立てたQuick7を一部カスタマイズしてみました。

LEDの明るさをおとなしめに調節してみました。

Quick7にはLEDが搭載されていますが、デフォルトで最大輝度に設定されているので少々まぶしく感じます。LEDの輝度はファームウェアで調節可能です。

設定ファイルの場所

LEDの明るさはファームウェアに含まれているconfig.hファイルの中身を書き換えて行います。config.hファイルはQMK MSYSでデフォルトのファームウェアをコンパイルしていた場合、

C:\Users\[ユーザ名]\qmk_firmware\keyboards\[ベンダ名]\[キーボード名]

のフォルダに格納されています。

設定ファイルの編集

config.hファイルはサクラエディタなどのテキストエディタで開いて編集できます。

Quick7の場合はファイル内の # define RGBLIGHT_LIMIT_VAL xxのxx部分を0-256の数字で指定することで明るさを調節できます。ファイル書き換え後にファームウェアを再コンパイルし、編集したconfig.hファイルをファームウェアに組み込んでおきます。

ちなみに上の写真のLED輝度は64に設定しています。

ファームウェアを上書きする場合の注意

最後に完成したファームウェアを書き込む際、QMK Toolboxで1回ファームウェアを書き込んだキーボードに対して上書きを行いたい場合は、Auto Flashを有効にしておきます。

ここが有効になっていないと1回リセットモードに入った後にドライバが読み込まれ、デバイスが自動的にリセットモードを抜けてしまいます。
Auto Flashにしておけばリセットモードに入った瞬間書き込みが開始されるので、ファームウェア上書きの場合でも確実に書き込みが可能です。

逆作用ピンセット

電子工作を中心に工作用に逆作用ピンセットという道具を買いました。

通常のピンセットは力のかかっていない状態では開いていて、指で挟むことで先端が閉じて物をつかみます。逆作用ピンセットはその逆で、力のかかっていない状態ではバネがかかっていて閉じており、指で挟むと開くという性質があります。

要するに洗濯ばさみと同じ機能ですが、逆作用ピンセットは遠くの物を挟めるので基板の中央付近にある部品を一時的に押さえておきたい時などに便利です。

Qucik7のファームウェア書き込み

先日組み立てた自作キーボードキット”Quick7″のファームウェア書き込み手順について整理しておこうと思います。

Quick7には自作キーボードキットで広く使われている”QMK”というファームウェアが採用されています。ファームウェアの構造や記法がキーボード間で共通なので、1回覚えてしまえば様々な自作キーボードキットのカスタマイズを楽しめます。

基本的にはQMKの公式ドキュメントが非常に詳しいのでこれを見ていただくのが一番良いとは思いますが、情報量が非常に多いのでこのエントリではQuick7を例にWindows環境において「これだけでOK」な手順をかいつまんでまとめておきたいと思います。

ファームウェアのカスタマイズ環境構築

デフォルトのファームウェアを使う場合でもカスタマイズ環境を構築しておく必要があるので、まず環境構築を行います。

ファームウェアのカスタマイズ環境はWindowsの場合”QMK_MSYS“をインストールします。これとサクラエディタ等のプレーンテキストを編集できるテキストエディタをインストールすればカスタマイズ環境は完成です。

ファームウェアのカスタマイズ環境設定

QMK_MSYSをインストールした後にQMKを起動し、表示されるコンソールに

[QMK]
qmk setup

と入力します。公式のドキュメントにある通り、表示されるプロンプトにyと答えていくと設定は完了です。このコマンド入力はWindowsのコマンドプロンプトで行うものではなく、QMK起動時に表示されるコンソールで行う点に注意が必要です。

続いてQuick7のデフォルトキーマップ(デフォルト設定のファームウェア)を生成します。同様にQMKのコンソールで

[QMK]
qmk compile -kb yushakobo/quick7 -km default

と入力すると生成ができます。

ファームウェアのフラッシュ(書き込み)

生成したファームウェアはQMKのインストールフォルダを変更していなければ、

[システムドライブ]:\Users\[ユーザ名]\qmk_firmware

の直下に*.hexという拡張子で保存されます。命名規則は決まっており、

[製造元]_[製品名]_[キーマップ名].hex

です。今回例に挙げているQuick7の場合は、”yushakobo_quick7_default.hex”というファイルがQuick7のデフォルトファームウェアになります。

ファームウェアの書き込みにはQMK Toolboxを使います。これを使うとGUI操作で簡単にファームウェアを書き込めます。書き込み作業の前にインストールしておきます。

書き込む際はまずキーボードをPCに接続し、キーボードをブートローダモード(ファームウェアを書き込めるモード)に移行します。ブートローダモードへの入り方はキーボードごとに違うそうですが、Quick7の場合は背面のスイッチを押すことで移行が可能です。

水色で囲ったところがスイッチです。ペン先など細い物で押します。

QMK Toolboxのウィンドウの上にファームウェアのhexファイルをドラッグ&ドロップするとファームウェアが書き込み待ちになります。その後にQMK Toolboxの”Flash”ボタンを押してしばらく待つとファームウェアが書き込まれ、キーボードがPC側にキーボードとして認識されます。

まとめ

ファームウェア自体を直接操作することになるので、いわゆる”文鎮化”の可能性がチラつき緊張しますが、公式ドキュメントを読んでその通りに進めれば引っかかる部分はないと思います。

ファームウェアが書き込まれてWindowsが新しいUSBキーボードを認識した瞬間は結構新鮮な驚きがあります。緊張する作業ではありますがある意味作業全体のハイライトとも言える部分なので、あわてず楽しんで作業をして見るのが良いと思います。

キーボード組み立てで使用した半田ごて

今回キーボード組み立てに挑戦するに当たって半田ごてを新しくしました。元々長く使っていた半田ごてがあったのですが、新しい半田ごてが非常に高性能だったのでご紹介します。

半田ごて本体(白光 FX-600)

半田ごて本体は白光のFX-600にしました。セラミックヒーター採用で電源ONから作業開始までが非常に速い製品です。ホビー用途なら十分なスペックだと思います。

今回は半田付けする部品の中にチップ状のLEDパーツがあったので、半田付け時の温度には気をつかう必要がありました。この製品はダイヤル式で温度調節もできるので、こういった用途にも安心です。

動作状況を示すランプがついており、所定の温度に達したことを目視できるのも優れたポイントです。

半田ごてスタンドとクリーナー

こて台は同社製のFH300-81にしました。今までは半田ごてクリーナーの上に何となく置いていましたが、専用のこて台を買ったのは正解でした。作業の安全性も高くなったので満足です。この製品は安価ですが金属製で、思いのほか重量があります。重量のおかげで半田ごてが安定します。

クリーナーはこて台に元々スポンジタイプのものがついているのですが、金属製のクリーナー(大洋電気産業 ST-40)に交換しました。この金属製のクリーナーはこて先を何度か突き刺すと加熱された半田がこそげ取られるというものです。

スポンジタイプクリーナーは水に濡らして使うのでクリーニング時にどうしても半田ごての温度が下がってしまいますが、この金属製のクリーナーはクリーニング時に温度が下がりません。クリーニングしたそばから作業を再開できるので便利です。

ちょっと形から入るような感じになってしまったのでどうかと思っていましたが、実際に組み立てに使用してみたら買って正解だったと思いました。料理などでも同じことを思いますが、きちんとした道具を使うと気持ちが良いものです。

HD435のプラグを修理

愛用のHD435ですが、最近プラグの調子がおかしくなってきていました。
時々右側の出力がなくなってしまうことがあり、どうもプラグ根元の部分が断線しているようでした。
プラグを開けてはんだ付けすれば直るかな?と思っていましたがプラグ自体ががっちり接着されているようだったのでプラグを別途買ってきて交換することにしました。
140211_01
こちらです。謎のカーボン柄です。
続きを読む

LED灯大体できあがり

さて、基盤の取付けも終わりました。

振ったときにパイプ部分が外れて飛ぶってのが一番怖いので、コインケース部分とパイプ部分は不細工になるのを承知でビス止めしました。安全第一。

しかも痛恨の傾ぎ具合。

次作るときはもうちょっときれいに作りたいもんです。

パイプとシャーシをくっつける

昨日のコインケースですが加工してアクリルパイプと接合しました。
色が昨日の写真と違いますが同時に買ったものです。
形を見ればお分かりでしょうがこのLED灯は最終的にイベント用の「光り物」になる予定です。

コインケースの切削はいわゆるニッパやのこぎりの類で割合簡単にできます。
穴を開ける場合は実は半田ごてでズボッと穴を開けると簡単。ただし明らかに体に悪そうなガスが出るので換気は十分に。

接着時は半田ごてでぐりぐりすれば表面が溶けて接着剤代わりになるほか、グルーガンでもくっつきます。
今回は100円ショップで300円ほどで買ったグルーガンで接着しました。

細かいでっぱりなどの処理はやすりも有効なほか、デザインナイフで細かく削るときれいに仕上がります。