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もインストールして早速ログイン。

成功です!

2016年10月27日木曜日

Bloggerでソースコードを貼り付ける方法

Bloggerでソースコードを貼り付ける方法

これから書いていくコードを載せるときに不便だなぁと思ったのでソースコードを貼れるようにカスタマイズしたいと思います。
それで調べてみたところ何人かの方々が同じようなことを思ったらしく情報がたくさんありましたので幾つかを参考にさせていただきました。

参考サイト
SyntaxHighlighter公式ページ
プログラミング はじめる。 ブログ(Blogger)にプログラムのソースコードを埋め込む方法
digitra Bloggerでコードを綺麗に表示できるようにする
DevAchieve BloggerにソースコードをハイライトするSyntaxHighlighterを導入する

沢山のサイトを拝見させていただいたときに"SyntaxHighlighter"の文字が多く見られなんだろうと思い調べてみるとcssで作られたコードをきれいに見せるプラグイン的なものでした。

それではBloggerに適応してみましょう。

SyntaxHighlighterを使う


以下のCSSコードを"テンプレート"→"カスタマイズ"→"上級者向け"→"CSSを追加"の欄にコピー&ペーストします。
/* Pretty printing styles. Used with prettify.js. */
 
/* SPAN elements with the classes below are added by prettyprint. */
.pln { color: #000 }  /* plain text */
 
@media screen {
  .str { color: #080 }  /* string content */
  .kwd { color: #008 }  /* a keyword */
  .com { color: #800 }  /* a comment */
  .typ { color: #606 }  /* a type name */
  .lit { color: #066 }  /* a literal value */
  /* punctuation, lisp open bracket, lisp close bracket */
  .pun, .opn, .clo { color: #660 }
  .tag { color: #008 }  /* a markup tag name */
  .atn { color: #606 }  /* a markup attribute name */
  .atv { color: #080 }  /* a markup attribute value */
  .dec, .var { color: #606 }  /* a declaration; a variable name */
  .fun { color: red }  /* a function name */
}
 
/* Use higher contrast and text-weight for printable form. */
@media print, projection {
  .str { color: #060 }
  .kwd { color: #006; font-weight: bold }
  .com { color: #600; font-style: italic }
  .typ { color: #404; font-weight: bold }
  .lit { color: #044 }
  .pun, .opn, .clo { color: #440 }
  .tag { color: #006; font-weight: bold }
  .atn { color: #404 }
  .atv { color: #060 }
}
 
/* Put a border around prettyprinted code snippets. */
pre.prettyprint { padding: 0 0 0 3px !important; background: rgb(248, 248, 248) !important; color: gray; border: 1px solid rgb(224, 224, 224);}
 
/* Specify class=linenums on a pre to get line numbering */
ol.linenums { margin-top: 0; margin-bottom: 0; background: rgb(248, 248, 248); } /* IE indents via margin-left */
li.L0,
li.L1,
li.L2,
li.L3,
li.L4,
li.L5,
li.L6,
li.L7,
li.L8,
li.L9 { line-height: 1.5; border-left: solid 3px #6CE26C; padding-left: 3px;}
/* Alternate shading for lines */
li.L0,
li.L2,
li.L4,
li.L6,
li.L8 { background: white; }
li.L1,
li.L3,
li.L5,
li.L7,
li.L9 { background: rgb(248, 248, 248); }
pre.prettyprint {
        -moz-border-radius: 8px;
        -webkit-border-radius: 8px;
        border-radius: 8px;
        width: 95%;
        margin: .8em; auto;
        word-wrap: break-word;
        white-space: pre-wrap;
        overflow: auto
}

コピペしたら次は"テンプレート"→"HTMLの編集"と開いて、<head>タグの適当な位置に以下のコードをコピペします。
<script src="https://raw.github.com/gist/1522901/" type="text/javascript">

これで設定は終了、実際に記事に表示させるには
<pre class="prettyprint linenums">
ソースコード
</pre>
とする。

Raspberry PiのIPアドレスを通知させてリモートする

ラズパイのIPアドレスを知る

ラズパイを弄っていると、いちいちhdmiケーブルを繋ぎマウスとキーボードを別途接続して。。。
というのが億劫になってきました。
そこで"xrdp"をラズパイにインストールしてリモートしようと思いつきました。(sshはなんか嫌なので

大抵のラズパイをいじっている人も直接触るのではなくリモートするなりして操作していると思いますが、
そのためにはいくつか必要なものがありますので健忘録も兼ねて残しておこうと思います。

Pythonを使ってIPアドレスを調べる

とりあえずipアドレスは"ifconfig"で見れます。
commands.getoutput('ifconfig')

IPアドレスを送信するプログラム

Pythonを使って指定のメールアドレスにラズパイのipアドレスをお知らせするプログラムを置いておきます。
Gmailをお使いの方はhost,port,smtpの変更は要りませんがyahooとかだと変更が必要です。

#!/Usr/bin/env python                                                                                 
# -*- coding: utf-8 -*-                                                                               

import smtplib
from email.mime.text import MIMEText
from email.Utils import formatdate
import commands

class sendGmail:
    username, password = 'your_email', 'your_password'

    def __init__(self, to, sub, body):
        host, port = 'smtp.gmail.com', 465
        msg = MIMEText(body)
        msg['Subject'] = sub
        msg['From'] = self.username
        msg['To'] = to

        smtp = smtplib.SMTP_SSL(host, port)
        smtp.ehlo()
        smtp.login(self.username, self.password)
        smtp.mail(self.username)
        smtp.rcpt(to)
        smtp.data(msg.as_string())
        smtp.quit()

if __name__ == '__main__':
    to = 'your_email'
    sub = 'Raspberry Pi Notification'
    body = commands.getoutput('ifconfig')
    sendGmail(to, sub, body)

xrdpのインストール

apt-getでxrdpをインストールします。
sudo apt-get install xrdp

その後はWindowsからリモートするなら"リモートデスクトップ"からログインします。
"コンピューター"の欄はホスト名(NetBIOS?)かIPアドレスを打ち込んでやればいいです。

あとはラズパイのユーザー名とパスワードを入力してエンター。
以上でラズパイをリモートする方法でした。

Ubuntu mateでの設定方法の健忘録


Raspberry Pi調理のための下ごしらえ

SPI通信の設定

下記のコマンドをターミナルに叩き込み、config.txtを開きます。
sudo gedit /boot/config.txt
すると沢山変なコードが書いてあるので、その中からspi通信に関する箇所を探し出します。
一番ラクな探し方は"ctrl+f"で"dtparam=spi"と入力しエンター。
dtparam=spi=off
するとすぐ見つかるのでコレ↑を
dtparam=spi=on
こう変更します。
SPIが有効になったかは
ls /dev/spi*
で確認してください。

OSインストール後のパーティション変更

raspbianだと
raspi-config 
でいろいろな設定ができるけれどUbuntu mateだとこのコマンドが使えないので全て手打ちで変更する必要があります。
まずターミナルを開き以下のコマンドを入力します。
sudo fdisk /dev/mmcblk0
すると何やら入力を求められるので
vCommand (m for help): d
Partition number (1,2, default 2): 2と入力します。このコマンドはmicroSDカードの2番目のパーティションを削除しています。

削除したあとは新しく作成しないといけないので、以下の通りにします。
Command (m for help): n
Select (default p): p
Partition number (2-4, default 2): 2
First sector (133120-120946687, default 133120): (Enterキーだけ押す)
Last sector, +sector of +size{K,M,G,T,P} (133120-120946687, default 120946687):(Enterキーだけ押す)
この作業は新しくパーティションを作成するものでデフォルト値で大丈夫です。
容量を細かく分けたいのであれば"First sector"と"Last sector"の値を変えればokです。

以上の作業を反映させたいので、保存しましょう。コマンドは以下の通りです。
Command (m for help): w
このコマンドを打ち込んだあと、ラズパイを再起動して、更に以下のコマンドを入力します。
sudo resize2fs /dev/mmcblk0p2
以上で終了です。

自動起動するプログラムを設定する

2016年10月6日木曜日

割れないための工夫のその後

前回の割れないための工夫からの進捗

ケープを買いました

オシャレさんじゃないですがケープを買いました。
巷で流行りのケープはヒートヘッドにケープを散布するそうで、印刷し終わった構造物をきれいに剥がすことができるそうです。

まだ3Dプリントwithケープは試していませんが、今度試してみようと思います。
その報告はまた今度でも。