DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

RaspberryPiと炊飯器で低温調理器を自作してみた② プログラムの内部構造 ソフトをデーモンとして分割処理させる

前回、ざっくりした回路を組みましたのでハードは完成です。

dreamerdream.hateblo.jp

 

今回はこの回路を制御する為のラズパイ側のプログラムを機能別に分割していきます。

分割処理させるメリットとして

  • 後で機能を追加したりしやすくなる。
  • 温度の取得とか画面の表示とか実行が遅いプログラムの待ち時間を発生させない。
  • 後で簡単に使い回しが出来るプログラムになる。

ことが挙げられます。

 

全部を図に纏めるとこんな感じです。実際には作りながら適宜考えたものですから名前等がテキトーな箇所はご勘弁ください。

プログラムはモジュールとしてのfile_mng.pyを除き、全てデーモンで個別に動作させます。 

f:id:DreamerDream:20190918163220p:plain

 

各プログラムの概要一覧です。

各々のプログラムについては個別にブログに纏めることにします。

データの共用はRAMである/dev/shm/領域内を活用することにしました。

 

 

 

ファイルデータ統括モジュール

file_mng.py

今全てのプログラムから利用するファイル内容を一括で取り次いでくれるプログラム

これをimportするだけで各種ファイルの保存先から保存データを適切に拾ってくれます。
dreamerdream.hateblo.jp

 

 

 

画面表示デーモン

temp_displayd.py

素直に/dev/shm/に保存された表示用テキストをディスプレイに表示させるだけのデーモン

監視ファイルは/dev/shm/以下の

temp,time,row_0,row_1,row_2,row_3,row_4

dreamerdream.hateblo.jp

 

 

温度取得デーモン

write_tempd.py

センサー値を読むのが遅いのと℃に直すのが手間なので、画面表示と温度管理のために/dev/shm/にセンサー値を℃に直して保存するだけのデーモン

作成ファイルは

/dev/shm/temp

dreamerdream.hateblo.jp

 

 

 

スタート、ストップデーモン

start_stop_btnd.py

スタート/ストップボタンが押されたら、

ストップ時ならスタートファイルにスタート時間を記録したファイルを作る。

スタート時ならストップ処理としてスタートファイルを消す。

押された確認要にrow_0にSTAR、STOP表示

/dev/shm/にファイルを作るスタートボタン監視デーモン

監視ボタン

「スタート/ストップ」GPIO10

作成ファイルは

/dev/shm/start

/dev/shm/row_0

dreamerdream.hateblo.jp

 

 

 

温度、タイマー設定デーモン

settingd.py

/usr/local/etc/以下の設定ファイルを読み込んで画面表示/dev/shm/row_1,row_2ファイルに設定内容を書き出す。

物理ボタン操作により設定ファイルを書く

監視ボタン

「上」「下」「設定項目」ボタン

作成ファイル

/usr/local/etc/temp

/usr/loca/etc/time

/dev/shm/row_1

/dev/shm/row_2

dreamerdream.hateblo.jp

 

 

 

タイマーデーモン

timerd.py

スタートファイルを読んでタイムカウントするデーモン。

スタートファイルがある時はディスプレイ表示用timeファイルを書き換える

温度が設定温度になったらスタートファイルの日時を書き換えてスタート

設定タイムになったらstartファイルを消してrow_0を「Complete」に書き換えて終了。

監視ファイルは

/dev/shm/start

/dev/shm/temp

/usr/local/etc/set_time

/usr/local/etc/set_temp

作成ファイルは

/dev/shm/time

/dev/shm/row_0

dreamerdream.hateblo.jp

 

 

 

 

ヒーター制御デーモン

heaterd.py

startファイルが存在すれば、保存された温度ファイルに近づくようにヒーター制御を行なう。

日時を記録したログファイルを残す

監視ファイル

/usr/local/etc/temp

/dev/shm/temp

/dev/shm/start

出力

[ヒーター]

作成ファイル

ログファイル 

dreamerdream.hateblo.jp

 

 

これらデーモンは各々実行権限を与えてデーモンとして起動時に自動起動するよう設定しています。

<過去記事参考>

dreamerdream.hateblo.jp

 

実動作試験につづく↓ 

dreamerdream.hateblo.jp

 

RaspberryPiと炊飯器で低温調理器を自作してみた① 制御基盤作成

いきなりですが、低温調理器って憧れますよね?

 

 

これがあるとローストビーフにチャーシューにぃ、いろいろなことができるんです!

 

しかし、単純に63℃とか70℃とかを長時間維持するだけの機能なのに高ケーなオイ!

いや専用器具はそれなりの機能が備わっていることは解っていますよ!

けど頻繁に使わないと思われるものを買うのは躊躇します。・・・いやしかし低温調理やってみたい!

 

ってことで早速家に余って放置しているRaspberryPiで自作してみることにしました。

 

「ラズベリーパイを使って調理」って、何やらおいしそうですしね!(どーでもいい)

 

 

まずは、温度センサを取り付けます。

温度センサーは1-Wire式のものが便利です。

 

 

こいつは、以前にも室温の計測で使って便利だー!ってことで多めに買っておいたので家に在庫があります。

温度は125℃まで計測できるので問題無し!

過去記事↓で取り付けた通りなので割愛します。 

dreamerdream.hateblo.jp

 

次に、調理器具を調達します。

保温に適していて、水が蓄えられる構造の「炊飯器」や「ポット」が良さそうです。

しかし、IH式のものは制御基盤が良く解らないので、単純なヒーター式の「接続したら温まる」という単純な構造のものが良さそうです。

 

<参考記事>やはり!先輩がいらっしゃる!

www.cuspy.org

参考先の先輩はポットのAC100Vをそのままソリッドステートリレーという高価な半導体リレーを使われていますね。

 

 

 

 

僕の家には改造できるようなポットはなく、たまたま一人暮らしで使ってた3合炊きの古い炊飯器があったのでそれを使うことにしました。

炊飯器なのでコンセントに挿してすぐ過熱はしません。分解あるのみ!「もしやヒーターはリレーで直結してるのかな?」と分解してみると、ふむふむ・・・

制御信号はマイコンなので詳細不明なものの、ラッキーなことにマッキーで回路を辿っていると、基板に特にトリッキーな所は無く、高圧部回路からリレーへの解りやすい接続回路をすぐに発見しました!

f:id:DreamerDream:20190913201549p:plain

リレーの制御部には12Vの電圧がかかっていて、反対のリレー接続部をGNDへ繋げてやることでリレーが反応してヒーターに100Vが流れ過熱します。

今回はこのリレー制御部分の線だけ外に出してリレーを流用することにします。

(※家電の分解は完全に自己責任です。細かな情報を不用意に発信して、もし事故にでもなったら責任が取れませんので分解等の詳しいことは省きます。)

 

ということで、発熱体は炊飯器に元から付いているヒーターとリレーを利用します。(元から搭載されている温度ヒューズもそのまま使えるのでラッキーです!もし暴走しても安心!)

温度センサーは釜の周囲をグルッと回っていて、どうやらA/Dコンバータが必用そうなので今回はラズパイ用に冒頭の簡単接続の温度センサーを利用することにしました。

f:id:DreamerDream:20190918142350p:plain

お釜の元のセンサーのあたりに貼付けます。

 

要するに、炊飯器の構造はこんな感じだったので、

f:id:DreamerDream:20190918095455p:plain

リレーを拝借して、温度センサーを増設しただけです。

f:id:DreamerDream:20190918095509p:plain

ですので改造後も炊飯器の機能はそのまま使えます。(使う予定はありませんが)

 

 

で作ってみた制御回路がコチラです。・・・といっても上図の通りメインはフォトトランジスタと抵抗だけ(笑)あとオプションとして単品で操作できるようにプッシュスイッチ数個とディスプレイ。

 

f:id:DreamerDream:20190913202433p:plain

RaspberryPiは用途が無くなった初代のRaspberryPi A+

必要最低限の機能で低消費電力で冷却ファンも必用無いので組み込み機器には最適です。

<概要>

  • リレーの制御はフォトトランジスタで炊飯器のリレーを制御、フォトトランジスタなので炊飯器回路とは完全に安全に分離できます。
  • 温度センサーはVCC(3.3V)、GND、信号線の3線で接続しています。
  • スイッチ6個(ジャンクで取り置きしていたもので数は適当、後で何かしら機能を割り当てることにします(雑!))。
  • 有機ELディスプレイ(余っていたので)。
  • 5V線(配線しただけ、後ほど電源をUSBからではなく余ってる5V電源を基盤から接続するかも?(雑!))。

ざっくりな(優柔不断すぎる)回路というほどの回路でもありませんが、ひとまず必用な基盤は完成です。

 

あとはプログラムを書いて無事に動く事を祈るばかりです。

続く

 

 

dreamerdream.hateblo.jp

 

RaspberryPiに謎の有機ELディスプレイを接続してみた

手元に謎のディスプレイがあったので(たぶんメルカリとかで部品を買ったときのオマケ)表示させてみることにしました。

 

現物はコレ↓

f:id:DreamerDream:20190913193807p:plain

型番も何も書かれていないので・・・

「液晶、表示 Raspberrypi」と検索しても全然それらしき物がヒットしなくて困りました。唯一、端子に表示されている「VCC GND SCL SDA」という接続名は解るので仕方なくそれで画像検索してみたらヒットしましたよー!

なんと、液晶ではなく、有機EL(OLED)ディスプレイだったんですね!

 

ということで、それらしきディスプレイの表示をしておられる方のサイトを参考にセットアップしてみることにしました。

 

<参考>

Raspberry PiでI2C接続の128×64 OLEDに日本語を表示(美咲フォント) – Lifelog

 (コードはこちらから拝借しています。)

 

ディスプレイに「VCC GND SCL SDA」と表記されている通り、ラズパイの同じ端子に接続します。

注意:VCCはラズパイの3.3Vに接続しましょう!

f:id:DreamerDream:20190913194941p:plain

(※上の画像は実験中のものです。接続しただけの状態では何も変化ありません。液晶と違って有機ELはディスプレイそのものが発光するのでバックライトがありません。接続しても真っ暗のまま何も変化が無いので心配になると思いますが、接続がキチンと出来ている事を確認する術はありません。信じて進みましょう。)



 

まずは、お決まりのアップデートから

sudo apt-get update

 

ラズパイの初期設定を弄る

sudo raspi-config

 

f:id:DreamerDream:20190912155020p:plain

 「I2C」のセットアップがあるので選択して

f:id:DreamerDream:20190912155035p:plain

 再起動します。

f:id:DreamerDream:20190912155046p:plain

 

sudo reboot

 再起動後、下記のコードを入れると

sudo /usr/sbin/i2cdetect -y 1

この「3C」というのが接続したディスプレイのようです。

f:id:DreamerDream:20190912155417p:plain

LCDのアドレスは0x3c

 

sudo apt-get install build-essential python-dev python-pip

sudo pip install RPi.GPIO

sudo apt-get install git

 

これらは既にインストール済みでした。

 

 

git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git

cd Adafruit_Python_SSD1306

sudo python setup.py install

 とすると、

~~ずらずらー

//Finished processing dependencies for Adafruit-SSD1306==1.6.2//

と表示されて完了!

 

日本語フォントインストール

cd /home/pi

sudo mkdir font

sudo mkdir font/misakifont

sudo wget http://www.geocities.jp/littlimi/arc/misaki/misaki_ttf_2015-04-10.zip

(なんかエラー出てzip解凍できないから「まあ日本語表示させないしいいか」と、そのまま。)

 

公開されているコードを日本語を外して実行してみましたら、

import Image

が無いよーってことで怒られました。

ん?

pip install pillow

インストール実行しましたが、既にインストール済みとのこと

 

で、import文を

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

とすることでこれは通りました。

 

  

参考にさせていただいたサイトでは表示文字は白色でしたが、僕のは液晶の画面色がおかしい?と思い、全部塗りつぶしてみると、あら〜、上は黄色で下がブルーの2色式。

しかも上と下の間が2px程度空いているので表示場所には注意が必用なようです。

f:id:DreamerDream:20190913194357p:plain


なんだこれ?

と思ってAmazonで調べた所、どうやら↓のような2色式の商品のようです。 

なるほどー、元々そういう商品だったんですね。

 

ということで、参考コードはほぼそのままに、表示領域を探ってみました。

 

# -*- coding: utf-8 -*-

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import time

#ピンの出力設定24と書かれていますがこの辺よく解っていません。

RST = 24
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

 

disp.begin()

#一度クリアーするようです

disp.clear()
disp.display()

 

width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# ディスプレイ表示領域いっぱいの範囲を描画するってことですね
draw = ImageDraw.Draw(image)

# 表示領域いっぱいに四角形を色無しで描きます
draw.rectangle((0,0,width,height), outline=0, fill=0)

#タイトル テキストを設定、どの位置に書くかXY設定

title = 'TEST v2.0'
draw.text((2,0), title, fill=256)

#青字領域のテキストを設定

x=0
y = 14

for str in [ 'MyName is Onancopon' ,'hogehoge', 'hagehage', 'muninuni', 'paipai','123456789012345678901234567890']:
  draw.text((x,y), str, fill=256)
  y+=10

disp.image(image)

#実際に表示を実行
disp.display()  

 

X軸は約21文字、縦は青字が切れない所から最大で6行といったところでしょうか?

f:id:DreamerDream:20190913200527p:plain

しかしこれではあまりに詰め詰めなので実運用では10pxずつ表示させ、5行で表示させることにします。

 

※参考サイトのままの表示方法で、たぶん文字サイズとかも変更出来るのだろうけど、ひとまず表示出来たので良しとします。 

DreamerDramのブログ 1000PV/日達成しました!

いつものように、何気にPVをみていましたらー、

f:id:DreamerDream:20190912130107p:plain

 

え?え?ええ〜〜??

11日に念願の1000PV/日を達成していました!

 

f:id:DreamerDream:20190912124335p:plain

なにこれ??めちゃウレシイ!!

グラフの通り、10日からいきなりアクセス数が増えています。

 

実は今年の7月から500PV/日あたりをウロウロしていたので、気合いを入れて一ヶ月以上連続投稿してみたりもしたのですが、一向に500〜600PV台を超える気配がなかったので半ば諦めかけていました。これでやっと報われた気がします。

 

ブログPVが増えるときは一気に増えるんですねー。

これは以前にも3000PV/月のなかなか超えられない壁で体験しました。

内訳はGoogleの検索アルゴリズムの影響とかいろいろあるみたいなんですけど、本当にアクセスの変動はいきなりなんですね。

 

 

以前、2016年の7月末に100PV/日達成の記事を書いていましたから

そこから約3年もかかっています・・・長っ!

dreamerdream.hateblo.jp

 僕がんばったよー(嬉)

 

ということで、いつもご覧いただきありがとうございます!

本当にありがとうございます!

多謝!!

これからもよろしくお願い致します!

 

 

現在、ある作品を作る為にいろいろと実験をしています(チラ見せ↓)。

f:id:DreamerDream:20190913194941p:plain

また完成しましたらこちらのブログに掲載致しますのでその時は是非ご覧頂ければ幸いです。

Djangoの使い方⑭同じ画像アドレスでサーバー側から画像データを選んでレスポンスとして返す方法

僕は今までDjangoでWebアプリを作っていて画像ファイルはDjangoを介さずにサーバーソフトのApacheに設定したディレクトリにアクセスするようにしていました。

 

<Apacheのimgs/ディレクトリ設定>

f:id:DreamerDream:20190912092212p:plain

 

しかし例えば、ロボットの制御等でカメラを使う場合、Apacheで画像ファイルを指定する方法だとログインしていない部外者でも画像ファイルへのアクセス先を知っていたら見られちゃうんですよね。

 

ということで、今回の課題は

同じ画像アドレスへのアクセスで、サーバー側から任意のデータを渡す

です。

これが出来れば、例えば「ログインしていない人へは画像データを渡さない」等の制御が可能になりますね。

 

先にうまくいったviews.pyのコードを書いておきます。

※urls.pyまで書くと面倒なので割愛しますが、ホームディレクトリにアクセスしてきたらindexへ、imgにアクセスしてきたらimgへ通すよう設定しておきます。

<views.py>

from django.http.response import HttpResponse

file_img = '(イメージファイルの場所)'


def index(request):
  return HttpResponse('<h1>TOP</h1><img src="/img">')

 

def img(request):
  with open(file_img, 'rb') as f:
    binary = f.read()
  response = HttpResponse( binary , content_type = 'image/jpeg')
  #response['Content-Disposition'] = 'attachment; filename=hoge_img.jpg'
  return response

以上。プログラムはこれだけ。

 

実はDjangoに標準のHttpResponseで任意のデータを渡せるそうです。(今までHTMLの直書きファイルを返すためにあるものだと思ってました。)

 

画像ファイルを渡すポイントは「content_type」を指定しているところです。(Django v1.7以前はmine_typeとして指定していたそうで、古い情報だとmime-typeと書かれていました。現在mine_type指定は廃止されているそうです)

 

<参考>いろいろなcontent-type

Content-Typeの一覧 - Qiita

 

HttpResponseを使っていろんなデータが任意で返せるんですね。これは便利ー!

f:id:DreamerDream:20190912093317p:plain

 

このプログラムで/imgへ接続すると画像表示されます。

ちなみに、コメントアウトしている

['Content-Disposition'] = 'attachment; filename=hoge_img.jpg'

このattachmentを設定することで、直接/imgへアクセスするとブラウザで画像を開かず、任意のファイル名で画像をダウンロード出来るようにもなります。

 

indexへアクセスすると、HTMLの<img>タグを使って/imgを読み出しています。

 

このように意外と簡単に出来ちゃうことだったのですが、いろいろ調べるのに結構手間取ったので備忘録として残しておきます。

 

 前回記事

dreamerdream.hateblo.jp

 

次の記事

dreamerdream.hateblo.jp

 

韓国をホワイト国から除外したことに対する韓国の反応が「半沢直樹」な件について

2019年8月2日、日本政府がこれまで輸出優遇対象国から韓国を除外することを閣議決定しました。

「優遇除外」といっても「特別一般包括制度」を取り入れているまともな企業からしたらほとんど影響が無いといっても過言では無い処置のはずなのですが、これに対する韓国の反応がすごすぎるので、ここまでの反応を一度纏めてみることにしました。

 

 

韓国側

反日(阿部)運動

www.mag2.com

昔からよくしている抗議活動ですね。

これは想定内です。

 

日本製品不買運動

www.sankei.com

これもまた昔からよく見る感じの運動で想定内ですね。 

しかし、物に当たるのはヨクナイ。

 

教科書の反日強化

www.excite.co.jp

これも今更感ですが、子供のうちから反日かぁ・・・。

まあ日本は昔から他の国の教育に対して文句は言いませんが、本当はやめてもらいたいとこですね。

 

石炭灰放射線検査強化

www.nikkei.com

これは、韓国側の受け入れ現場で手間がかかって大変なことになっているらしいですね。 

対抗処置としては失敗ではないでしょうか?

 

輸入食品放射線検査強化

www.asahi.com

これもなんとか日本産を閉め出したい意図が見え見えですね。

 

軍事協定(GSOMIA)破棄

business.nikkei.com

これには正直驚きましたが、軍事協定ってこんな簡単に破棄していいの?

この処置は国際的な評判を落としかねない危険な行為ではないでしょうか?

 

竹島での軍事演習

www.nikkei.com

完全に煽ってきていますね。

今このタイミングでそこで演習をする意味が全くわかりません。 

 

議員竹島上陸

www.asahi.com

これも昔からよくありますが、演習に続いて上陸ですから、これはー、煽りすぎです。

 

原発汚染水問題をIAEAに訴える

www.asahi.com

なんで?今更?感が否めませんが、これも対抗処置なのでしょう。

 

パラリンピックメダルに広義

www.fnn.jp

旭日旗に似てるということで広義したそうですが・・・

他にも似ているものって沢山あるのになぁ・・・ 

 

東京五輪/パラリンピックのボイコット請願活動

www.iza.ne.jp

こちらは政府の対応ではなく、上記のような状況を踏まえて一般国民が大統領府に請願しているそうです。

名目は「放射線の影響が」ということだそうですが・・・ネットの反応は「嫌なら別に来なければいいのでは?」といった薄いものです。

スポーツと政治を絡めるのはヨクナイ。というか五輪に向けて練習してる戦手がふりまわされて可哀想・・・

 

日本をホワイト国除外準備

www.huffingtonpost.jp

「目には目を」の解りやすい対抗処置ですね。 

 

WTO提訴

www.yomiuri.co.jp

11日、つまり本日中に輸出厳格化処置をWTO違反だと訴えるそうです。

これはWTOが原因を「輸出管理」と捉えられるか「報復処置」と捉えられるかによって大きく変わりますね。

 

「戦犯企業のステッカー」条例可決

www.fnn.jp

まさかの、行政が堂々と反日を煽っています・・・。

これは日本では考えられない事態です。

 

日本側

週間ポスト叩き

www.sankei.com

あれ?韓国側は堂々と国を挙げてヘイト活動を展開してますが・・・単なる一般雑誌の一記事について過敏すぎませんか?なんででしょうね?この差

 

 

 

しかし、改めて見返してみると凄いですね。

まさにコレ↓な反応じゃないでしょうか?


今見ても 面白い「倍返しだ」

 

どれもこれも韓国の動きは全て「嫌ならホワイト国に戻せ」という意図のようですが・・・

 

これらの抗議(?)活動を見て日本が、

「まいったよ、じゃあホワイト国に戻すよ」ということにはならないんじゃないでしょうか?

 

まだGSOMIAの正式破棄の11月までは(GSOMIAを政治カードとして利用する)抗議する有余があると見られているようなので(軍事協定破棄が簡単に覆るのもおかしな話ですが)、僕はこのような抗議(?)活動が少なくとも11月まではどんどんエスカレートするのではないか?と予想していますがどうなるのでしょうね?

MyDNSで取得したドメインのサブドメインをIP毎に分ける方法

僕は自宅サーバーにはフリーのDDNSサービス、MyDNSを愛用しています。

 

Free Dynamic DNS (DDNS) for Home Server and VPS etc | MyDNS.JP

 

ここでフリーで取得したドメインは、いわゆるMyDNSが取得したドメインサブドメインになるわけですが、そのサブドメインにもさらにサブドメインを追加する方法があります。

 

そして、そのサブドメイン同一IPのみならず、サブドメインごとにIPを分けることが可能です。

つまり、「sample.mydns.jp」が親ドメインサブドメインが「sub.sample.mydns.jp」とする場合、両方に同じIPアドレスを適用させるだけでなく、

「sample.mydns.jp」のIPアドレスは123.456.789.101、

「sub.sample.mydns.jp」のIPアドレスは123.456.789.102

という風に分けられるんですよー。

 

 

という情報は知ってはいましたが、子IDの追加する方法が解らず少し手間取ってしまったので備忘録として残します。

 

メインのフリードメイン取得は過去記事参考

dreamerdream.hateblo.jp

 

 

まず、マスターIDでログインしてユーザー情報ページを開きます。

f:id:DreamerDream:20190907110559p:plain

 

子ID関連の項目で追加する子IDの数を選択します。これがIPごとに分けられる数になります。

f:id:DreamerDream:20190907110703p:plain

 

登録すると、メールでマスターIDと子IDの情報の一覧が送られてきます。

f:id:DreamerDream:20190907110931p:plain

f:id:DreamerDream:20190907110809p:plain

G-mailだと何故か迷惑メールに分類されていましたので要注意です!

f:id:DreamerDream:20190907110853p:plain

 

次に、ドメイン情報を開きます。

f:id:DreamerDream:20190907111036p:plain

 

すると、先ほど追加した数だけ子IDが選択出来るようになっています。

ここのHostname(左側)にサブドメインに付けたい名前を入れて子IDを選択するだけです。

例)メインドメインが「sample.mydns.jp」の場合、サブドメインに「sub」を追加すると

「sub.sample.mydns.jp」となります。

f:id:DreamerDream:20190907111102p:plain

IPの更新はこの子IDとメールに付属してきたパスワードをBASIC認証等でリクエストすることで更新されます。

kampa.me