2017年1月23日月曜日

ラズパイで作るドラレコ完成編

ドラレコ、完成しました

どうもお久しぶりです。
前回はこういう部品がいるかもね、こんな感じで作りたいねっていう感じで終わりましたね。
今回は完成した全体図とどうやって実装したかを適当にご紹介したいと思います。

まず前回のおさらい

意気揚々と3Dプリンターでカメラケースを作っていましたね。
コレ、使いませんでした。
コレ、使いませんでした!。
一体何やってんだろう自分。。。データ作って印刷してテストするのに結構な時間かけちゃったよ。。。
そうして私はModMyPiからラズパイzero用のケース広角レンズを輸入しました。
お気づきでしょうがラズパイzero用のケースということはzeroがないと使えないということですよね。
買いましたよ、ラズパイzero。
Raspberry Pi Zeroは通常のラズパイよりも小さくてver1.3だと純正のカメラモジュールも使える!
ラズパイ3よりも小さいなら理想的じゃないか、ということでね、ポチりました。
Raspberry Pi Zero - Version 1.3
ラズパイZeroは現在日本では技適の問題で取扱がなく、外国のサイトからしか購入できません。
私はAdafruitからラズパイZeroとLipoバッテリーをゴニョゴニョできるPowerBoost 1000 Chargerを買いました。
このPower(長い)は外部電源口と電源出力口とバッテリ接続口があり、外部電源から出力口とバッテリに電力を供給できる優れものなんです。そして外部電源が切れると自動的にLipoバッテリーを5Vまで昇圧して使えるようにしてくれます。つまり簡易UPSです。コレがすっごいんですよねぇ。。。

という事で以上のパーツで楽してドラレコを作ろうという魂胆です。

ドラレコ制作編

まずは完成したブツをペタリ。
 後ろから撮影したもの↑

正面から↑

車に取り付け↑

適当に取り付けしたのでケーブルがだら~ん、ゴツゴツとした感じになってしまいました。

では制作過程をば。

1, Zeroにワイヤーをはんだ付けしてケースに収める。んでカメラも付ける。
ラズパイZeroにはピンヘッダーがついていないので必要に応じてワイヤーを付ける必要があります。
こんな感じ

2, PowerBoost 1000 ChargerにつけるLipoバッテリーの準備
日本だとアブナイ二次電池は資格がいるのか何だったかは忘れましたが、
ある容量より上の物は一般の市場に出回っていないようです。それは困った。

という事でNXT Mindstormのバッテリーパックを2つ分解して
取り出しました。(危ないのでやめてくださいねすっとぼけ

NXTのバッテリーは7.4Vという記述でしたがセルを2つくっつけているだけですのでそのまま使おうと思った所、
2つの内1つのセルは保護回路やらたくさん乗っていてめんどくさかったのでニッパでパッチンしてきれいなセルだけを2つ適当に並列に繋いで3.7V11.1Whにしました。
多分並列なら大丈夫でしょ。。。
パワブ君にも保護回路はあるし。。。

これでエンジンがオフになってもシャットダウンできる電力は確保できますね。
あとパーキング録画もできますね。まぁめんどくさかったのでやりませんでしたが。

3, プログラムも作りますよ
肝心のプログラムは残念ながら全てはお見せ出来ないのでかいつまんでお教えします。

まず仕様として、
  • 保存先の自動設定(USBメモリーがあるならば本体に保存しない)
  • 10分ごとに録画する(エンジンが切れるまでループする)
  • エンジンが切れるとシャットダウンする
  • 保存先に古いファイルが有るならば削除して空き容量を増やす
を満たすものをとりあえず作ります。

一つ目は簡単でos.path.ismount()を使う
if os.path.ismount(directory):
    path=foobar
二つ目も簡単
while True:
    camera.start_recording(path+fileName+'.h264')
    camera.wait_recording(time)
    camera.stop_recording()
三つ目はちょっと面倒callbackを使う
GPIO.add_event_detect(pin,GPIO.Both)
GPIO.add_event_callback(pin,shutdown_method)
四つ目はまぁまぁ
subprocess.Popen("sudo find foorbar")
とりあえずこんなもんでしょう。
プログラムは真似せず自分で作ってみてください、結構簡単ですよ。

さてさて以上でドラレコ制作が終了しました。
しかしまだ改良出来る部分があるので細々とアプデしていきたいと思います。
次はGPSもつけようかなぁ。

2016年11月27日日曜日

Raspberry Piを使ったドライブレコーダーの作成

ドラレコをラズパイで作る

どうも、お久しぶりです。
今回はドラレコを作ってみたいと思います。

とりあえず使ったもの一覧
  • Raspberry Pi 3
  • Raspberry Pi Camera Module v2
  • Ubuntu Mateインストール済みSDカード
  • タクトスイッチ数個
  • 抵抗数個
  • LED数個
  • 適当なケーブル
ドライブレコーダーって基本的な機能は運転してる風景を録画して、もし事故にあった時に
分かり易く第三者の視点として事件の状況を教えてくれるものですよね。
ただコレがすごく値段が高い!だいたい\15,000から\20,000するのでとてもじゃないけどワンクリ購入できない!
しかし性能は値段に比例するので高いやつを買っておけばOK!
きれいな画質でどこを何キロどれくらいの時速で走ったかまで記録してくれるものもありますね。

(コレ全部ラズパイでできるじゃん)

実はAliexspressで購入してあったGPSもあるし、カメラモジュールもこの前買ったし、
加速度センサーもなんだかんだ持ってるしイケる、コレはイケる!
もし実現したら市販のものにさらに付加価値を追加できるし、キットにして販売すれば
ワンちゃんビジネスとして通用するのでは?と思いついたわけです。

という事で簡単ざっくりとした制作記録を残しておこうと思います。

カメラケース制作

コレは前回紹介したものと同じでカメラモジュールは基盤むき出しのまんまだとすぐに壊れてしまうので、
何かしらのケースに入れて運用する必要があります。なのでまずはケース作りから始めましょう。

まずケースを作るにあたり、どのようにしてカメラを設置するかを考えなくてはいけません。
カメラと本体は一体にさせるのか、とかカメラだけをルームミラーの裏に貼り付けてケーブルで繋ぐのかとかとか。

私の場合は、うるせぇまずは静電気保護だ!って感じで適当に作ったので後で作り直さないといけません。
あと追加でレンズを装着する際の取付口とかも重要ですね。
巷ではマグネットで取り付けるタイプのが市販されていて先駆者さんたちはそれを使っているケースが多いようです

ドラレコ完成イメージ

とりあえず私は完成イメージをこう言う風にします。
  • カメラは吸盤を使ってフロントガラスに貼り付ける(スマホホルダーみたいなやつで)
  • ラズパイ本体は電源口に近いグローブボックスらへんに設置する
  • ラズパイとカメラを繋ぐために長いフラットケーブルを使う
  • 広角レンズを使う
  • 保存先の媒体はUSBメモリーかHDD
  • 可能ならばGPSを使ってどの道を何km/hで走ったのかを映像と紐付ける
  • 可能ならば加速度センサーで衝突を検知し、検知した場合の映像データは削除されないようにする
  • 保存先の容量が一杯になったら、古いデータから消去していく
設置場所についてはぶっちゃけ試行錯誤して改良していくしか無いので構想練りの段階では
あまり気にしなくていいかな感がします。

広角レンズは純正のカメラで録画すると、歩道など映らず意味が無いので画角を広げるために使います。

保存先については、ラズパイのOSが入れてあるSDカードに頻繁に書き込んだりすると故障する時期が
早まってしまうし、データを取り出す時に不便なので別口で用意したいところです。
HDDを使うと容量と書き込み寿命を考えないでいいけれど、振動で壊れるかもしれないので対策が必要ですね。
それとスピンアップ時に電力を大量に消費するのでラズパイと要相談っていうところもありますね。

そうそうラズパイの電源についても考えないといけません。
まぁそれはあとで考えましょう。

GPSを映像と紐付けるのは少し難しそうですね。後で念入りに考えましょう。

衝突時の検知は加速度センサーをチョチョイのチョイすればできそうな気がするので特に考える事はなし。

容量が一杯になったら~はすごく簡単考える必要なし。

以上を踏まえてドラレコを作っていきましょう。

後日色々更新します。

2016年11月22日火曜日

ラズパイ純正カメラのケース

カメラケース始めました。

どうも、今回はタイトル通りカメラケース始めました。

まずはこちら、どーん。

先日カメラを買ったときに、コレはもうドラレコにするしか無いと思いまして
まずカメラを使うにはケースだケースとなりました。それで作りました。

水滴とかホコリとか静電気とかが気になるのでアクリルのダサい板とはおさらば。
心機一転新型ケースでドラレコ制作開始ですね。

追記

なんかいろいろあってこうなりました。

新しく購入したものたち

購入したもの

こんにちは。
今回は新しく購入したアイテムをご紹介したいと思います。

まずはこちら。
これは13.56MhzのRFIDリーダーですね。
規格はISO/IEC 14443になっています。
このリーダーを使って入室管理的なことをしたいと思います。

続いてこの棒、歪センサーです。重さが量れるもので体重計の中にも入ってます。
これで飲み物の残量とかお米の残量とか表示できます。

これはISO/IEC 14443対応のタグです。
サンワサプライのNFCを買ってリーダーで試してみたんですが、使えなかったので買い直しました。
今はNFCとこの規格両対応のタグを購入しているところです。

そして今回の主役、ラズパイ純正のカメラモジュールです。
下にあるアクリルは適当に切って土台にしました。
これでドラレコとか作れますね。

あとヒートシンクも買ってきました。強制空冷するともっと冷えますね。

ではこれらを使いこなすために猛勉強をしましょうかね。

2016年11月16日水曜日

da-Vinci-1.0Aで非純正フィラメントを使いたい

非純正フィラメントを使いたい!

お久しぶりです。
今回はxyz printing製の3Dプリンターで純正のフィラメントではなく、非純正のフィラメントを使う方法を発見したのでご紹介したいと思います。
ただし今から行うことはメーカーの保証が無効になり、かつプリンターが壊れてしまう可能性があります。

参考サイト voltivo.com Da Vinci 1.0 filament counter reset using an Arduino

とりあえず本日必要になる道具たち

[ここをクリック]
aaaa

2016年10月30日日曜日

Raspberry Piで圧力センサーを使う

圧力センサーを使うために

どうも、電子工作っぽいことをやってみようと思います。

今回はスイッチサイエンスさんで売られているMouser製の感圧センサーを買ってきました。確かMouserは台湾の会社だったような。。。
お値段はおひとつ400円で、使用用途はとりあえず重さを測ると言う感じです。

しかしコレを使うには問題が!
それはA/Dコンバーターを使わないとラズパイではただの変なペラペラになってしまうことです。
しかし前回A/Dコンバーターをちゃっかり3つも買ってあるので大丈夫です。

それでは実際に回路を作ってみましょう!
SPI通信の設定をされていない方は、前記事のUbuntu mateでの設定方法の健忘録 SPI通信の設定をご覧の上行ってください。

今回使う部品たち
  • Raspberry Pi (お好きなバージョン
  • A/Dコンバーター (MCP3008)
  • 感圧センサー
  • ブレッドボード
  • ジャンパワイヤー
  • 適当な抵抗
まず最初にどうやって重さを測るかを説明しましょう。
興味のない方やもう知っていますという方は読み飛ばしてください。

重さを量るには・・・?

重さを量るにはまずセンサを用いますが、そこから先はどうするのでしょうか。
工業高校へ行った方とか高専とか工業系の方なら基礎過ぎて既にご存知だとは思いますが、
こういったアナログなセンサ類は基準の電圧からどれくらい電圧が下がったかを見ています。

例えば5vの電源に適当な抵抗を2つ追加したとします。
すると2つの抵抗の間の電圧はどうなるでしょうか?
電圧降下が起こり、その中間の電圧は5vから下がってしまいます。
そして今回使う感圧センサは荷重がかかると抵抗が下がるものです。
つまり二つ目の抵抗にこのセンサを使えば重さが計れるということになります。

そしてアナログセンサはその変化を波のように表します。
しかしラズパイはアナログの波を見ることが出来ないのでA/Dコンバーターを使用します。
今回使用するA/DコンバーターはMCP3008で、10bitの精度でアナログ波をデジタル波に変換することが出来ます。
10bitが何を指しているかというと、2^10で2進数を10桁扱えるということです。10進数に変換すると1024ですね。
それで0から1024の値の範囲で実際の重さと見比べればどれくらいの重さかが分かるというわけです。

回路制作

回路と行っても特別なものは何もありません。
上の図から用意に想像できる通りこうなります。
私が使用したラズパイ3はピンの配置が他と違いますのでご確認ください。

MCP3008のスペックシートを参考にラズパイと接続してください。

使用したPIN一覧

Pin02(5v)=MCP:VDD,VREF
Pin06(gnd)=MCP:AGND,DGND
Pin23(GPIO11)=MCP:CLK
Pin21(GPIO09)=MCP:DOUT
Pin19(GPIO10)=MCP:DIN
Pin24(GPIO08)=MCP:CS



作図に使用したもの

値を読み取るプログラム

A/Dコンバーターから受け取った値を見れるようにします。使用する言語はPythonですので簡単かも。
インデントと文字コードでエラーが出るかもしれないので使用する際はご確認願います。
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import spidev
import time
import os

# SPIバスを開く
spi = spidev.SpiDev()
spi.open(0,0)

# MCP3008から値を読み取るメソッド
# チャンネル番号は0から7まで
def ReadChannel(channel):
 adc = spi.xfer2([1,(8+channel)<<4,0])
 data = ((adc[1]&3) << 8) + adc[2]
 return data

# 得た値を電圧に変換するメソッド
# 指定した桁数で切り捨てる
def ConvertVolts(data,places):
 volts = (data * 5) / float(1023)
 volts = round(volts,places)
 return volts

# センサのチャンネルの宣言
force_channel = 0

# 値を読むのを遅らせる
delay = 0.25

# メインクラス
if __name__ == '__main__':
 try:
  while True:
   data = ReadChannel(force_channel)
   print("A/D Converter: {0}".format(data))
   volts = ConvertVolts(data,3)
   print("Volts: {0}".format(volts))
   time.sleep(delay)
# 何か入力したら終了
 except KeyboardInterrupt:
  spi.close()
  sys.exit(0)

実際に測定してみる

先ほど作成した回路を使って重さを測ってみましょう。
では書き込んだプログラムを実行しましょう。
実行するにはターミナルに
python /home/"ユーザー名"/"プログラム名".py
と打ち込みましょう。
""の中身は皆さんごとで違うと思いますが、私はhome上の自分のディレクトリ上にプログラムが置いてあります。

するとターミナル上に不思議な数字がたくさん出てくると思います。
"A/D Conveter"が10bit表記の電圧で、"Volts"が変換済みの電圧の値です。
何もセンサー上に置いてなかったりすると値は1023になっており、電圧は5vになります。
だんだん圧力をかけていくと値が小さくなっていき、電圧が下がります。

本格的にセンサーを使ってみる

回路とプログラムは無事に動きましたが素の状態でセンサーを使うのはどうも不格好だし、測りにくい。
そこで3Dプリンターでこんなものを作ってみました。

ぴったりハマります。ただし端っこに置くと正常に測れなくなりますが、ペットボトルとかなら測れますね。

以上で圧力センサーの使い方の紹介を終わります。

Ubuntu 16.04でXRDPが使えない

XRDPが使えない現象

この前のことですが、ラズパイと色々連携させるためのサーバーを用意していました。
最近は昔みたいに馬鹿でかいパソコンを使わなくても、サーバーレンタルしなくても手軽に安価にサーバーを用意出来るのでいいですね。
(ラズパイをサーバーにしとけばよかったかも

用意したのはIntelのNUCでSSDに換装済みのものです。



それでApacheとMySQLを使うために、最新版のUbuntuをインストールした所まではいいんです。
無事インストール作業が終わったのでいつも通りの手順でxrdpをインストールしました。
(複数パソコンが有るとディスプレイの切り替えだったり2つもキーボードがあったりして煩わしいので)
sudo apt-get install xrdp
その後キーボードとマウスとHDMIケーブルを引っこ抜いてメインのPCからリモートしようとログインした矢先に、「Login OK」という文字が表示された瞬間落ちるんです。何が落ちるってアプリが落ちて接続どころじゃないんです。


リモート出来ないんじゃ今後の設定ができないじゃないかと激おこですよ。
それでよく調べてみるとある段階からUbuntuはUIにUnityを採用してると言う記事が見つかりました。
UnityだとVNCがどうのこうのってつまりxrdpは使えないという結論になったわけです。おふざけあそばさらないでください割りと時間返してほしいです。
(しかしUnityちゃんが可愛いので許しましょう→

私が今までに見たサイトの数々↓
Griffon's IT Library – How to install XRDP on Ubuntu 16.04 – Easy Way
askubuntu How to use xrdp with Unity on Ubuntu 16.04 LTS?
kashiの日記 ubuntu 16.04インストール(11) リモートデスクトップ(xrdp)
pelican@ainoniwa.net Ubuntu 16.04.1とXRDP再び!日本語を取り返せ!

割りと最初に見たサイトはわかりやすく説明してあったのですが、追加でコードを書くのが嫌だったもので、いっその事Ubuntu Mateを使えばいいじゃないかと思いました。
(普通にUbuntuでxrdp使えるので私みたいに変なことしないでも大丈夫です。

さて、なぜUbuntu Mate(ウブンツメイトではなくマテ)を使うのでしょう。
理由は簡単Unityを使っていないからです。
Ubuntu Serverだと日本語に対応していなくて後からインストールが必要で、最新版だとxrdpが使えないし、
Ubuntu for Desktopは日本語版があるけれどもxrdpが使えない。
Mateだと日本語環境が最初からあっていちいち文字入力に追加でIbusやらMozacやらインストールしたり設定しなくてもいいし、Ubuntuベース?だから対して違和感もなく使い続けられます。

めっちゃいいじゃないですか。しかもラズパイでもMateは提供されているのでお揃いですよ。
ということでUbuntu Mateをインストール、xrdpもインストールして早速ログイン。

成功です!