2016年6月25日土曜日

Raspberry piにAndroid TVを入れる

Raspberry piにAndroid TVを入れる

Ubuntuを使ってRaspberry PI3用のAndroid TVのSDカードの作成方法をメモしておきます。

1.以下からAndroid TVのイメージをダウンロード

http://geektillithertz.com/wordpress/index.php/2016/06/02/android-tv-for-raspberry-pi-3/

2. イメージをSDカードへ書き込み

以下の手順でイメージを解凍して書き込み
システム→設定→ハードウエア→ディスク

3. アプリの追加

作成したSDカードのdataパーティションのappフォルダにapkファイルを置くことで
アプリが追加できる。

pybeaconを使ってみる

pybeaconを使ってみる

今、はやり?のeddystoneをRaspberry PI3でやってみようかと思った次第です。。

1.Pybeaconをダウンロードし、解凍

$ wget https://pypi.python.org/pypi/PyBeacon/
$ unzip mastar.zip

2. bluzとbluez-hcidumpをインストール

$ sudo apt-get install bluez bluez-hcidump

3. PyBeaconのインストール

$ cd PyBeacon-master
$ sudo pip3 install PyBeacon

4. PyBeaconの実行

1. URLを送りたいので以下を使って送りたいURLを短縮する。

    https://goo.gl/

$ PyBeacon -u https://goo.gl/Aq18zF

でも実行できるがURLを切り替えたいのPythonで実行

#! /usr/bin/python3

import subprocess
import time

def main():
    cmd = "PyBeacon -u "
    url = ""
    counter = 0
    check = subprocess.check_output(cmd + url, shell=True, universal_newlines=True)

    while True:
        counter += 1
        url = ""
        if counter == 5:
            url = "https://goo.gl/Aq18zF"
        elif counter == 10:
            url = "https://goo.gl/epjq13"
            counter = 0

        if url != "":
            print(cmd+url)
            check = subprocess.check_output(cmd + url, shell=True, universal_newlines=True)
        time.sleep(1.0)

if __name__ == "__main__":
    main()

5. Ghomeの設定

設定→プライバシー→フィジカルウェブをONすると、
Raspberry PI3からアドバタイジングされたURLを受け取ることが可能。

2016年6月19日日曜日

RaspberryPI3で照度センサー(TSL2561)を使ってみる

RaspberryPI3で照度センサー(TSL2561)を使ってみる

照度センサー(TSL2561)をRaspberryPI3に接続してみた。

1.Raspberry PI3でI2Cを有効にする

$ sudo raspi-config

Advance Option->I2Cで有効にするし、再起動。

$ lsmod

i2c_bcm2708,i2c_devが見れていればOK.

2.以下のようにRaspberry PI3と接続

GND (TSL2561) -> GPIO04 (Raspberry Piの9pin)
VCC (TSL2561) -> 3.3v (Raspberry Piの1pin)
SDA (TSL2561) -> GPIO08 SDA1(Raspberry Piの3pin)
SCL (TSL2561) -> GPIO09 SCL(Raspberry Piの5pin)
$ sudo apt-get install i2c-tools python-smbus
$ sudo i2cdetect -y 1
$ sudo apt install libi2c-dev

このようにでてくればOK
enter image description here

3.PythonからI2Cを叩く準備

1. wiringpiのインストール

以下を参考。
http://takashin10mura.blogspot.jp/2016/06/wiringpipython.html

2. SMBUSのインストール

python-smbusはよくでてくるがpython3で使うとなると少し手間がかかります。
以下のようにすればできました。

wget http://ftp.de.debian.org/debian/pool/main/i/i2c-tools/i2c-tools_3.1.1.orig.tar.bz2

tar -xf i2c-tools_3.1.1.orig.tar.bz2
cd i2c-tools-3.1.1/py-smbus
mv smbusmodule.c smbusmodule.c.orig # make backup
$ sudo wget https://gist.githubusercontent.com/sebastianludwig/c648a9e06c0dc2264fbd/raw/2b74f9e72bbdffe298ce02214be8ea1c20aa290f/smbusmodule.c
$ sudo vi setup.py
  /usr/bin/python3に修正
$ sudo python3 setup.py build
$ sudo python3 setup.py install

3. smbusの確認

$ python3
$ import smbus
ここでエラーがでなければOK

4.TSL2561の制御

データシートを参考に以下のコードで照度を取得できました。

#! /usr/bin/python3
#coding: UTF-8
#TSL2561 照度センサー

import smbus
import time
import math

bus = smbus.SMBus(1)        #I2cバス番号
address = 0x39              #I2Cアドレス
command = 0x00

#i2c データ出力 1byte
def write(regist, value):
    bus.write_byte_data(address, regist, value)

#i2c データ読み込み 1byte
def read(regist):
    value = bus.read_byte_data(address, regist)
    return value

#i2c データ読み込み ブロック
def blockread(regist, num):
    value = bus.read_i2c_block_data(address, regist, num)
    return value

def ratio_calc(ambient, ir):
    # Avoid division by zero
    if (float(ambient) == 0):
        ratio = 9999
    else:
        ratio = (ir / float(ambient))

    return ratio

def init():
    #read ID
    print("id_reg=0x{0:02x}".format(read(0x8A)))
    #device enable
    write(0x80,0x03)
    power = 0x03
    while power != 0x03:
        power = read(0x80) & 0x03
        print("{0:02x}".format(power))
    #print("reg=0x{0:02x}".format(read(0x80)))

    #gain setting
    write(0x81,0x11)
    print("reg=0x{0:02x}".format(read(0x81)))

def read_lux():
    value0 = blockread(0xAC,2)
    ch0 = 256*value0[1]+value0[0]
#    print("reg=0x{0:04x}".format(ch0))

    value1 = blockread(0xAE,2)
    ch1 = 256*value1[1]+value1[0]
#    print("reg=0x{0:04x}".format(ch1))

    ratio = ratio_calc(ch0,ch1)
    if ((ratio >= 0) & (ratio <= 0.52)):
        lux = (0.0315 * ch0) - (0.0593 * ch0 * (ratio**1.4))
    elif (ratio <= 0.65):
        lux = (0.0229 * ch0) - (0.0291 * ch1)
    elif (ratio <= 0.80):
        lux = (0.0157 * ch0) - (0.018 * ch1)
    elif (ratio <= 1.3):
        lux = (0.00338 * ch0) - (0.0026 * ch1)
    elif (ratio > 1.3):
        lux = 0

    return lux

def main():
    init()
    counter = 0
    while True:
        counter += 1
        if counter == 5:
            lux = read_lux()
            print("lux={0:f}".format(lux))
            counter = 0

        time.sleep(1.0)

if __name__ == '__main__':
    main()

RaspberryPI3に簡単に外からアクセスする方法

RaspberryPI3に簡単に外からアクセスする方法

スマホからRaspberryPI3に簡単にアクセスできる方法を探していたところngrokというものを知りました。

1.ここからLinux ARM版をダウンロードし、インストール

$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
$ unzip ngrok-stable-linux-arm.zip
$ sudo mv ngrok /usr/bin

2.ngrokにsign upし、Dashboardにあるauthtokenをコピーし、以下を実行する。

enter image description here

$ ngrok authtoken xxxxxxxxxxxxxxx

3.解放するポートを設定する

$ ngrok tcp 22
ngrok by @inconshreveable                                                                        (Ctrl+C to quit)

Tunnel Status                 online                                                                             
Version                       2.0.25/2.1.1                                                                       
Region                        United States (us)                                                                 
Web Interface                 http://127.0.0.1:4040                                                              
Forwarding                    tcp://0.tcp.ngrok.io:14274 -> localhost:22                                                                                                                                                        
Connections                   ttl     opn     rt1     rt5     p50     p90                                        
                              0       0       0.00    0.00    0.00    0.00    

4.試しにスマホから繋いでみる。

Google PlayからConnectBotをインストールし、以下を入れる。
SSH: user名@0.tcp.ngrok.io:14274

スマホからRaspberryPI3へアクセスできました。

5.ngroxを自動起動する。

$ sudo vi ~/.ngrok2/ngrok.yml
authtoken: xxxxx
region: ap
tunnels:
  ssh:
    proto: tcp
    addr: 22

rc.localにコマンドを記載

$ sudo vi /etc/rc.local
/usr/bin/ngrok start –all –config=/home/username/.ngrok2/ngrok.yml –log=stdout >> /dev/null
“`

6.Dashboardの確認

以下で接続のポートを確認し、SSH: user名@0.tcp.ngrok.io:ポートでアクセス
https://dashboard.ngrok.com/status

※14274を固定したい場合は月$5を払う必要がある。。

参考
http://www.mori-soft.com/2008-08-15-01-36-37/2008-12-07-09-39-26/222-ngrok-ssh
http://qiita.com/kaiinui/items/9e01d976066b1b5898a4
http://asukiaaa.blogspot.jp/2016/06/ipmvnoraspberry-pingrokurlssh.html

2016年6月15日水曜日

RaspberryPI3からIFTTTへトリガをかける

RaspberryPI3からIFTTTへトリガをかける

IFTTTのMaker ChannelでKEYは取得したので、
トリガをかけてみたいと思います。

1.requestsのインストール
Python3を使うことを前提としているので以下でrequestsをインストール

sudo pip3 install requests

2.post
Maker Channelで取得したSECRET_KEYとEVENTを入れてPushする。

import requests
import datetime
now = datetime.datetime.now()               requests.post("https://maker.ifttt.com/trigger/alert-temp/with/key/YOUR_SECRET_KEY", json={"value1": temperature,"value2": "{0:%Y-%m-%d %H:%M:%S}".format(now)})

3.作成したレシピのNotificationに
“{{Value2}}に 異常温度{{Value1}}が検出されました。”
と記載

意図通りIFTTTへ通知ができました。

2016年6月13日月曜日

RaspberryPI3とMilkCocoaを連携させてみる。

RaspberryPI3とMilkCocoaを連携させてみる。

Raspberry PI3で測定した温度をリアルタイムに表示する手段を探していたところMilkCocoaというサービスがあったので試してみました。

温度はDHT11を使ったので、Adafruit_Python_DHTを使いました。
Adafruit_Python_DHTの使い方は調べればでてくるのでそちらを参照。

MilkCocoaの準備

1.MilkCocoaでユーザー登録し、dashboardから新しいアプリを作るをクリック。

enter image description here

2.App Nameを入力し、新しいアプリを作るをクリック。

enter image description here

3.認証をクリックし、API Key認証新しいAPI KeyとAPI Secretのペアを生成するをクリック

enter image description here

4.データストアをクリックし、名前を入力。
ここではtempとした。
enter image description here

Raspberry PI側のPythonの準備

1.PythonSDKのインストール
 これを参考にインストール

2.APP_ID, API_KEY,SECRET,DB_NAME(datastore名)を以下のようにpythonのコード(dht11_milkcocoa.py)に入れる。
APP_IDは以下に記載のものです。
enter image description here

#! /usr/bin/python3

import Adafruit_DHT
import time
import milkcocoa.milkcocoa as milkcocoa

APP_ID = 'xxxxxx'
API_KEY = 'xxxxxx'
SECRET = 'xxxx'
DB_NAME = 'temp'

def add_count_record(temperature,humidity):
    try:
        mc_client = milkcocoa.Milkcocoa.connectWithApiKey(APP_ID, API_KEY, SECRET, useSSL=False)
        datastore = mc_client.datastore(DB_NAME)
        datastore.push({"temperature": temperature, "humidity": humidity})
    except Exception as e:
        print(e)

def main():
    counter = 0

    while True:
        counter += 1

        # 30秒ごとに検知回数をMilkcocoaに送信
        if counter == 30:
            humidity, temperature = Adafruit_DHT.read_retry(11, 4)
            add_count_record(temperature,humidity)
            print("Temp={0:0.1f}, Hum={1:0.1f}" .format(temperature,humidity))
            counter = 0

        time.sleep(1.0)

if __name__ == '__main__':
    main()

3.pythonを実行

$ sudo python3 ./dht11_milkcocoa.py

4.データストアの確認
リスト表示(更新)を押して以下のようにデータがでればMilkCocoaにデータが送られている。
enter image description here

MilkCocoaでのグラフ化

1.データストアでデータ可視化をクリック

2.DATASOURCESの下のAddをクリックし、以下を入力
 TYPE: Milkcocoa
 NAME: 温度(自由に記載OK)
 DATASTORE: temp
 API: push
enter image description here

3.ADD PANEで以下を追加
TYPE: Sparkline
TITLE: 温度(自由に記載可能)
VALUE: datasource[“Temp”][“value”][“temperature”]
INCLUDE LEGEND: YES
LEGEND: detection temperature/30sec

enter image description here

4.一度に表示する個数の設定。
以下の工具マークをクリックし、Columnsの値を設定することで表示するサンプル数を決められる。
enter image description here

参考
http://yura2.hateblo.jp/entry/2016/02/29/PIR%E3%82%BB%E3%83%B3%E3%82%B5(SB00412A-1)%E3%81%A8Milkcocoa%E3%81%A7%E7%B0%A1%E6%98%93%E8%A6%8B%E5%AE%88%E3%82%8A%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E6%A7%8B%E7%AF%89

2016年6月11日土曜日

wiringPiをpythonから呼び出す。

wiringPiをpythonから呼び出す。

Raspberry PI3のGPIOを制御するにはwiringpi2を使ったほうがよいらしいので、試してみました。

1.wiringpi2のインストール

$ sudo apt-get update
$ sudo apt-get install python3-dev python3-pip
$ sudo pip3 install wiringpi2

2.wiringPi2-Pythonのインストール

$ git clone https://github.com/Gadgetoid/WiringPi2-Python.git
cd WiringPi2-Python
$ sudo python3 setup.py install

3.動作確認

$ sudo python3
>> import wiringpi2

以下のエラーがでた。

Traceback (most recent call last):
  File "/home/rpi3/Work/WiringPi2-Python/wiringpi2.py", line 18, in swig_import_helper
    fp, pathname, description = imp.find_module('_wiringpi2', [dirname(__file__)])
  File "/usr/lib/python3.5/imp.py", line 296, in find_module
    raise ImportError(_ERR_MSG.format(name), name=name)
ImportError: No module named '_wiringpi2'

解決方法

wiringpi_wrap.cを修正する必要があるらしい。

$ vi wiringpi_wrap.c
PyString_FromStringAndSize(x, len) PyUnicode_FromStringAndSize(x, len)を追加

追加する場所は以下の「+」のところです。

 #define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_FromStringAndSize(x, len) PyUnicode_FromStringAndSize(x, len)
#define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)

再度、インストールし、実行することでうまくいきました。
結構、調べてるとpython2.xとpython3.xでだいぶ違う。。。

$ sudo python3 setup.py install
$ sudo python3
>> import wiringpi2
エラーがでなくなった!
>> wiringpi2.piBoardRev()

これでpythonからGPIOが制御できるようになったので少し遊んでみようかと思います。