ぼくだってブログ書くねん

意識向上を目指した意識高い系ブログです。本業はなんちゃって電気設計業務です。

RPi+Flask+ElectronなGUIアプリケーションの導入

目的

ラズパイ+Electronなアプリケーション作りたい!
PyQtとか使わなくてもゴージャスなWeb技術を利用してアプリ作成したい!

ってことで始めました。

タイトル通りRPi+Flask+ElectronでHello Worldまで行います。

【前提条件】
* RaspberryPi 3
* 古いnode.js導入済み
* Flask導入済み

まとめ

大筋Qiita キカガクのelectron導入編でいける

引っかかったところ

古いnode.jsのアップデート

pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
pi@raspberrypi:~ $ sudo apt-get install -y nodejs

ラズパイ用の魔法のElectronのインストールコマンド

pi@raspberrypi:~ $ sudo npm install -g electron --unsafe-perm=true --allow-root

でいけるはず

作業記録

Qiita キカガクのelectron導入編をめっちゃ参考にしてます。

まずはnode.jsのバージョン確認。

pi@raspberrypi:~ $ node -v
v8.11.1

さっそくQiitaに従ってコマンドを打つ

pi@raspberrypi:~ $ sudo npm intall -g electron-prebuild
(node:1442) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
npm ERR! Error: Not found : electron-prebuild
npm ERR! at RegClient.<anonymous> (/usr/share/npm/node_modules/npm-registry-client/lib/request.js:300:14)
npm ERR! at Request._callback (/usr/share/npm/node_modules/npm-registry-client/lib/request.js:238:65)
npm ERR! at Request.self.callback (/usr/lib/nodejs/request/index.js:148:22)
npm ERR! at emitTwo (events.js:126:13)
npm ERR! at Request.emit (events.js:214:7)
npm ERR! at Request.<anonymous> (/usr/lib/nodejs/request/index.js:896:14)
npm ERR! at emitOne (events.js:121:20)
npm ERR! at Request.emit (events.js:211:7)
npm ERR! at IncomingMessage.<anonymous> (/usr/lib/nodejs/request/index.js:847:12)
npm ERR! at emitNone (events.js:111:20)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR! <http://github.com/npm/npm/issues>

npm ERR! System Linux 4.14.44-v7+
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "-g" "electron-prebuild"
npm ERR! cwd /home/pi
npm ERR! node -v v8.11.1
npm ERR! npm -v 1.4.21
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/pi/npm-debug.log
npm ERR! not ok code 0

なんかめっちゃエラー出る。
npmでエラーでているからnode.jsが問題っぽい
とりあえず、node.jsのバージョンアップをしてみる。
参考:https://qiita.com/Yorinton/items/00ad34f3f902ed41c12f

pi@raspberrypi:~ $ sudo n stable

 install : node-v10.8.0
 mkdir : /usr/local/n/versions/node/10.8.0
 fetch : https://nodejs.org/dist/v10.8.0/node-v10.8.0-linux-armv7l.tar.gz
######################################################################## 100.0%
 installed : v10.8.0

最新版が入ったらしい。
念の為、node.jsのバージョン確認

pi@raspberrypi:~ $ node -v
v8.11.1

え、なんかアップデートされてない

まあいいや。
とりあえず、もっかいelectronを入れてみる

pi@raspberrypi:~ $ sudo npm install electron -g
/usr/local/bin/electron -> /usr/local/lib/node_modules/electron/cli.js

> electron@2.0.8 postinstall /usr/local/lib/node_modules/electron
> node install.js

/usr/local/lib/node_modules/electron/install.js:54
throw err
^

Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/electron/.electron'
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! electron@2.0.8 postinstall: `node install.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the electron@2.0.8 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2018-08-28T01_06_02_716Z-debug.log

なんかちょっとインストールしかけてエラー発生

node.jsの公式サイトの支持に従って最新版っぽいv10系をラズパイにいれてみよう
参考:https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions

pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
pi@raspberrypi:~ $ sudo apt-get install -y nodejs
pi@raspberrypi:~ $ node -v
v10.9.0

今度こそ入ったっぽい( ^)o(^ )

もっかい

sudo npm install electron -g

打つも、さっきと同じエラーか。。。
「Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/electron/.electron'」
でググったら素晴らしき先人がいました。
参考:https://qiita.com/spadeloves/items/664b25353f9e9620a65f

pi@raspberrypi:~ $ sudo npm install -g electron --unsafe-perm=true --allow-root
/usr/local/bin/electron -> /usr/local/lib/node_modules/electron/cli.js

> electron@2.0.8 postinstall /usr/local/lib/node_modules/electron
> node install.js

Downloading SHASUMS256.txt
[============================================>] 100.0% of 5.33 kB (5.33 kB/s)
+ electron@2.0.8
added 149 packages from 126 contributors in 101.279s

pi@raspberrypi:~ $ electron -v
v2.0.8

おし!Electron導入成功だ!
Flask環境は導入済みなので(ラズパイでも問題なく入ります)
Qiita キカガクのelectron導入編を進められます。

ちゃんとラズパイでもハローワールドができました!
f:id:nbk01409:20180829230842j:plain 今日は以上!

Androidでカメラ連携+OpenCVなアプリについて

あらまし

うっかり引き受けてしまったAndroid開発?ボランティア。
いや、開発ボランティではなくプロジェクト管理ボランティアだった。

しかし、現状として自分も開発にコミットしていかなければならない状況っぽいので
ブログのネタにしつつ、今日一日作業してみようと思う。

発端はAndroidのカメラアプリを作ろう!という安易な発想から始まった。

やりたいことは以下
- カメラ撮影
- 画像解析(撮影画像のRGB値抽出)

腐るほど世の中にカメラアプリあるし、有志もいっぱいいるはずだから簡単簡単!!!

これが地獄への始まりだった。

Android開発におけるカメラ使用方法

調べたらすぐに出てくるが現在はCamera2 APIなるものがある。
これはGoogleが提供する標準のカメラAPIだ。

一方で、日頃色々なアプリ使っていて目にする標準カメラをアプリ内から呼び出す方法。

簡単に以上の2つの方法がカメラアプリを作るにあたって簡単に思い浮かぶ。

最強・最凶・最難?のCamera2 API

最近のAndroidカメラ事情を調べるとCamara2 APi必ず行き着く。
Andriod 5.0から使われだした。

Camera2 APiを用いることでカメラをアプリケーションから細かく設定できる。
このAPIによって近年のバースト撮影やRaw撮影機能が実現されているようである。

もちろんRGB(YUV)データならお茶の子さいさい?で取れるっぽい。

ただし、自由にカメラを制御できるようになった反面、
コードの記述や電気的なシーケンス制御を正しく精密に行う必要がある。

これが曲者で、ちょーっと色を出してISOを固定でwww撮影できるようにしよっ
と思ったらFailedの連続である。

よっぽどGoogleのリファレンスを読み込まないとムリムリムリのカタツムリ。

Camera2 APIをいい感じに実装しようと思うと職人レベルで普通にお金が発生する技量と時間が必要である(たぶん)。

その証拠って訳でもないが、ググってもまともに動くレベルで解説してる記事が殆ど無い。
日本語の記事では解説しているのはかなりの熟練者で「1」だけ話してあとは行けるよね!ってものがちょっとだけ。

そのあとが全然無理なんだけど!?っていう私みたいな情弱にはレも足も出ない。

英語記事でもstackoverflowでうまくいかないんだけど???で解決しないままのものばっかりだ。
How to control iso manually in camera2, android
(じつは解決してるのか?自分でやってみたけどうまく動かない...)

サンプルプロジェクトCamera2Basicの中身を解説してる記事もあるけど、 Googleのコメントを翻訳してるだけだったりするし、
そもそもカメラの制御を知っとかないと改編も難しい。

一個人がCamera2 APIをイジるなんてやっぱ無理。
天才解説記事書いてくれ頼む状態なので諦めました(敗北主義者)

Android標準カメラアプリとの連携

アプリ内から端末標準のカメラアプリを読み込むのよく見かける。。。よね?
ってことで、これを実装すればとりあえOKかな。

ってことでぐぐったらあるやん!あるやん!
しかもごっつシンプルに実装できるみたいやん!

ここでアップされてるサンプルがとっても参考になりました。
まぁ記事は有料会員にならない全部見れないようだけど、サンプル見れれば十分です。

グラシアス、アミーゴ!

画像解析方法としてのOpenCV

RGB見るならOpenCVが一般的?
最近、PythonでもOpenCV使ったから馴染みもある。

ぐぐってみる先輩たちがたくさんいる!
いける!いけるぞぉ!!!

ってことで

Androidで標準カメラ連携+OpenCVで撮影データのRGBを抽出アプリの開発に着手したい

【ラズベリーパイ】i2cで2バイトのレジスタアドレスの読込みについて

仕事でラズベリーパイで基板上のICとi2c通信するときに困ったメモ。

目次

1. python-smbusで2byteのレジスタアドレスを読み込むことはできない

仕事上、基板のICをイジることが多いのですが、ICのセンサー情報などステータスをi2cで読むには以下画像のようなやりとりを行う。

f:id:nbk01409:20180804211316p:plain

画像に書いたようにRegisterアドレスは1 byteで呼ぶことが多いのである。
したがってpython-smbusの例えば、
read_byte_data(int addr,char cmd)

というICのレジスタを読む関数だと、
read_byte_data(0x64, 0x01)

のようにすればスレーブアドレス0x64で0x01コマンドを実行して返してくれるのである。
しかし、このchar cmd は1 byteまでしか対応していないのである。(そもそも何故char型?)

意地の悪いことに 2byteアドレス(例えば0x2345)を指定して、 read_byte_data(0x64, 0x2345)

と打ってもエラーが出ないでナチュラルに下位1byteだけ認識して
read_byte_data(0x64, 0x45)

を実行してやがる(波形を見て確認しました)。

結論としてはpython-smbusでは2byte レジスタを指定できないことがわかった。

2. 応急処置と対策

ラズベリーパイで2byteレジスタを指定したいときはシェルスクリプトで一応解決可能。 read_byte_data(0x64, 0x2345)

のようなことしたい場合は、
sudo i2cset -y 1 0x64 0x23 0x45 b
sudo i2cget -y 1 0x64

とやってやれば一応は解決できる(もはやpythonじゃないけど)

あとはpython-smbusを2byteレジスターを指定できるように書き換えるしかないように思います。
それができれば、いいんだけど今の私の技術では難しいですね。。。

3. まとめ

  • python-smbusでは2byte レジスタを指定できない
  • シェルで i2cse tと i2cget を組み合わせれば可能

だれか2byteレジスタの指定方法知っていれば教えてください。。。

毎日ブログを更新し続けるために必要なこと

ブログ更新を連続して続けるに当たり、色々わからないことだらけだ。 「わからないこと」をメモとしてこの記事にまとめておく。

目次

1. ブログ更新に必要なネタ

まず最初に困ったのは寝ても覚めても記事のネタである。
そもそも、このブログ自体は技術ブログとして続けたい意志がある。

pythonやラズパイやarduinoなどで遊ぶ上で、インターネットの先人に習ったことは多く、貰ったものは返したいという思いだった。 その手段として、自分も同じようにやったことを記録して、無雑煮に広がるインターネットの肥やしとして(?)誰かの役に立ちたいと思ったのである。

しかし、技術ブログをやるにしても「行動を起こす」ことをしない限り、ネタはできないのである。 一日のうち会社から帰宅したあとの20時〜23時の3時間で技術をキャッチアップし記事にするのは至難の業だ。

さらにテーマが決まっていないなら、もうブログ更新なんて不可能なわけなんだね。
というわけで以下のテーマで更新していこう(上が優先度高い)

  • 技術(電子工作・プログラミング系)
  • 商品レビュー系(読んだ本、映画、ガジェットとか)
  • カメラ(写真とか)
  • 日記
  • 願望系(やりたいことの構想とか)

2. 文章構成について

文章構成はどうしたものか。

論文なら
1. 序論
2. 関連研究
3. 提案手法
4. 実験
5. 考察
6. 結論
とだいたいの構成が決まっているから楽なんだけどね。

ぱっと思いつくスキームとしては5W1Hだけど全部書いてると冗長だしなぁ。
それに5W1Hだと目的や結論が書きにくい。

うーん、難しい。
と考えるのはやめてGoogleさんに頼ってこのサイトを参考にした。 結局、

  • 結論
  • 根拠
  • まとめ

の3章構成が一番シンプルっぽいですね。
シンプル最高!

3. 今から心がけること

とりあえず、ネタ探しして下書きをいっぱい書く。

  • 技術(電子工作・プログラミング系)
  • 商品レビュー系(読んだ本、映画、ガジェットとか)
  • カメラ(写真とか)
  • 日記
  • 願望系(やりたいことの構想とか)

このお題から各1つずつくらいテーマを決めてタイトルを下書きにいれておく。
もちろん、3章構成もスキームに入れる。

うん、明日の記事は今日よりもクオリティが上がりそうだ。

ちなみに今日のこの記事はMarkdown記法を導入してみました。
見栄えは昨日よりもいいかと思います(たぶん)
texのようで楽しいけど, texのほうが便利だねw

明日は画像も記事に入れたいね。

Just Do It: 30日間チャレンジとアウトプットの最大化

 TEDの「マット・カッツの30日間チャレンジ」をご存知だろうか?

www.ted.com

 

最近、私はAmazonKindleを購入してから毎日読書をするようになった。

Liifehacking.jpの「ライフハック大全」やホリエモンの「多動力」のような意識高い系書籍を読んで圧倒的に自分のアウトプット能力が欠如していることに気づいた。

ライフハック大全では意識高い系ノートのモレスキンに実に様々なことをアウトプットして生活の改善を図る方法が具体的に多く紹介されている。

実際に高価なモレスキンを購入してアウトプットを開始してみた。

しかしながら、アウトプットの質はまだ悪く、モチベーションも変わらない。

ホリエモンの多動力では、インプットしてアウトプットし続けるホリエモンの具体的な行動方法が書かれていて、実にすごい。

この「マット・カッツの30日間チャレンジ」も多動力の中で紹介されていた。

 

とにかく今の自分を見て思うのはアウトプット量の低さと質の低さ。

今日から30日間チャレンジとして、このブログを30日間更新し続けようと思う。

一ヶ月後の9月には何が変わっているのか。

8月の30日間チャレンジを「ブロガーになってみる」で開始する。

HD ピコ レーザー プロジェクター 自作キットを買ってみたの巻

 

巷で話題の[HD ピコ レーザー プロジェクター 自作キット for Pi](https://raspberry-pi.ksyic.com/main/index/pdp.id/442/pdp.open/442)を買ってラズパイのデスクトップを写すところまでやってみました。

セット全景を取るのも忘れて、早速作業開始。

作業にはピンセットと精密工具の用意を強くオススメします!

まずは光源やレンズが含まれた巨大なヒートシンクブロックと制御基板をフレキでつなぐ。

フレキロックの方法がよくわからなかったが、どうやらこの写真のように寝ていればロック状態、起きていれば開放状態らしい。

f:id:nbk01409:20180724224851j:plain

ロック状態

f:id:nbk01409:20180724223640j:plain

開放状態



ここで、うっかりラズパイのMIPI-CSI端子のように引っ張って壊しかけた。

この作業、電子工作初心者にとっては最初で最大の難所だった(笑)

f:id:nbk01409:20180724225358j:plain

フレキ取り付け完了



あとはネジで固定していくだけである。

だが、このネジの小さいことなんの。
ピンセットと精密工具は必須である。
ちなみに私は転がっていた百均メガネ用のドライバーと手で作業したが、ちゃぶ台をひっくり返したいくらいイライラしたので、きちんと工具を揃えることを強くおすすめする。

f:id:nbk01409:20180724225629j:plain

ネジ締め



ネジの梱包についている数字はかなり謎。
この順番に作業したら、見事に制御基板上のICに載せるヒートシンクをつけ忘れる意地悪仕様である。
適当だと絶対引っかかる。

f:id:nbk01409:20180724225902j:plain

ヒートシンク

最後に蓋(?)をして終了だがこのカバーは茶色のカバーに見えて実は保護膜がついてあるだけである。

しかし膜がめっちゃ剥がしにくい。

 

f:id:nbk01409:20180724225929j:plain

f:id:nbk01409:20180724225946j:plain

 

あとは適当にミニ三脚に乗せれば完成。

 

f:id:nbk01409:20180724230004j:plain

f:id:nbk01409:20180724230024j:plain

あとはラズパイにつなげれば冒頭写真のようにデスクトップが現れます。

(私の場合はbootコンフィグを書き換えてたのですぐに映らなかった。。。普通は問題なく映ります)

 

f:id:nbk01409:20180724230038j:plain

ちなみにラズパイ用途銘打っているがHDMIで繋ぐだけなのでPCに繋ぐこともできます。

渡しの場合はラズパイよりも簡単に映りました(笑)

 

解像度は悪くないものの、輝度は流石に暗すぎて照明を消さないとまともに使えないですね。

暗すぎて、これからの用途に困ってしまいますが同じ価格帯のプロジェクタに比べればコスパいいかな?

 

以上!何に使おうかな!

Raspberry Pi + Ubuntu Mateで自由を手に入れようとした話

<背景>

・ラズパイ(ラズビアン)にOpenCVを入れて顔認識しようとした
OpenCV+pyenv+python3の環境構築に手間取る
・ラズビアンにcondaが入らないのが原因や!(conda以外にも節々でno distributioが出る)
・そ、こ、で、巨大なUbuntuファミリーのUbuntu MateをラズパイOSに迎える 

<結論>

Raspberry Pi + Ubuntu Mate + pyenv + python3 + OpenCVな環境は無理です
(少なくとも僕の知識と技量では) 

Ubuntu Mateの導入>

ラズビアンにOpenCVを入れるために四苦八苦して時間を浪費したのでイラツイてUbuntu Mateを導入した。
わざわざ64GB microSDまで買って。。。
ラズパイ3ならサクサク動いてUIも申し分なく、ほぼほぼラズビアンと同じように動くのでラズビアンなんていらんかったんやって思う。
もはや儀式的にapt-get update && apt-get upgradeを繰り返す。
しらべていると、もはやapt-getは古く、これからはaptの時代ということでapt update && apt upgradeもやっておく。

pyenvも導入して「pyenv global 3.6.4」を打つまでは順調。
SSHも通るようにして念のため再起動した。
ところで問題発生、なんか起動後エラーがでる「Script Error」???
なぜかFireFoxも起動しない。
dmesgのエラーを見ながらググってもよくわからない。
すべて英語の記事しかヒットしないし環境も微妙に違って謎状態。
なんとなくWiFi関連のエラーなようなので固定IPを適当に振ったのがまずかったのか。

結局また、apt-get update && apt-get upgradeとapt update && apt upgradeとリブートを繰り返すと起動時のエラーが謎に出なくなった。
本当に謎だけどFirefoxは起動できないまま。
暗雲が立ち込める。

 

<Anacondaが入らない>

なんのために、Ubuntu Mateを導入したのか忘れていた。
そうだOpenCV+Python3な環境を実現したかったんだった。

pyenv install anaconda3-5.1.0 を打ってみて驚愕したね.
ERROR: The binary distribution of Anaconda3 is not available for Linux-armv7l.f:id:nbk01409:20180304181241p:plain

ラズビアンのときと一緒やないカーイ
この二時間は一体何やったんや。
ちなみにminicondaも入らなかった。
どうやらBerryCondaなんてものがあるらしいがもう結構です。
Condaには頼りません。 

<結局>

cmakeでOpenCVを導入しようとしたけど無理無理無理のカタツムリ。
最終的にpip install python-opencvで入ったpython2.7 + OpenCVの環境で我慢するしかなさそう。

明日、会社のWindows10にPython3+OpenCVがすっと入ったらそっち使うことにする
まじでこの週末の合計10時間位を返してほしい。
でもせっかくRPi+Ubuntu導入したし電子工作関係はこっちを使っていこうと思います丸。。。

RPi+Ubuntuがすごくうまく行けばモバイル開発環境として大活躍してもらうつもりだったんだけどなぁ・・・