人感センサ(SB00412A-1)検知時にLEDを光らせる
aitendoで人感センサ(SB00412A-1)を購入したので、センサが人を検知した時にLEDを光らせてみました。
追記(2016/02/28)
SB00412A-1を3.3Vで接続すると動作が不安定になるため、5Vでの接続を推奨します!
接続方法は、Raspberry Piで人感センサ(SB00412A-1)を5Vで利用する方法 - Yura YuLifeの記事を参照してください。
ちなみに人感センサことPIRセンサは赤外線の変化を捉えるセンサで、人間が発する赤外線によって人が近づいたのを検知できます。
性能
一回点灯すると人がいなくなっても7〜8秒は点灯し続けています。
スペックによると感知距離は3〜5mとのこと。机の上に上向きにセンサを設置した部屋に入ると、LEDがピカッと光りました。机とドアの距離は大体1.5mくらいです。
必要なもの
- Raspberry Pi2 Model B (Raspberry Pi A/B+も可)
- 低電圧極小PIRセンサー SB00412A-1
- LED
- 1kオームの抵抗
- ブレッドボード
- ジャンパーワイヤ 7本くらい
配線
SB00412A-1
基板に+と-が書いてあるので、それぞれ3.3VとGNDへ。GPIOはどこでも大丈夫です。
LEDと抵抗
LEDの足の長い方をGPIOに、短い方を抵抗を介してGNDに接続します。
スクリプト
プログラム中のSENSOR_PIN
とLED_PIN
を、それぞれSB00412A-1とLEDが接続されたGPIOのピン番号に変更します。
$ python sync_sensor_led.py
を実行するとセンサーが人を検知した時にLEDが光ります。
参考URL
Raspberry Piでスイッチを押すと音楽を再生する
Raspberry Piに接続したタクトスイッチを押すと、音楽を再生するPythonのスクリプトです。
ちなみに、上の動画で流れているのは僕のバンドCosmic Time Scaleの曲です。
必要なもの
- Raspberry Pi2 Model B (Raspberry Pi A/B+も可)
- タクトスイッチ
- 10kΩの抵抗
- ジャンパーワイヤ 5本くらい
Raspberry Piとタクトスイッチを接続
こんな感じで配線します。
GPIOピンは今回は19番を使っていますが、空いていればどのピンでも大丈夫。
スイッチの動作をテスト
以下のスクリプトをraspi_gpio_pin.py
として保存します。
$ python raspi_gpio_pin.py
を実行し、スイッチを押していない時は0
、スイッチを押している時は1
がコンソールに出力されれば、問題なく配線されています。
スイッチ押下で音楽を再生
以下のスクリプトをraspi_play_music.py
として保存します。
$ python raspi_play_music.py
を実行し、スイッチを押すとSONG_LIST
の中からランダムに曲が再生されます。
これを応用すればRaspberry Piで音響さんやDJができますね。
参考URL
Raspberry Piに接続したLCD(ACM1602NI)をPythonで動かす
Raspberry PiにI2Cで接続したLCD(ACM1602NI-FLW-FBW-M01)を、Pythonから動かします。
ソースコード、セットアップ手順はGitHubにて公開しています。
必要なもの
- Raspberry Pi2 Model B (Raspberry Pi A/B+も可)
- LCDモジュール(ACM1602NI-FLW-FBW-M01)
- 10kΩの半固定抵抗
- ハンダゴテ、ハンダ、吸い取り線(必要に応じて)
- ブレッドボード
- ジャンパーワイヤ(長いオス-メス: 4本、短いオス-オス:10本くらい)
Raspberry PiとLCDを接続
LCDにハンダ付け
LCDの基板に7ピンのピンフレームをハンダ付けします。
ブレッドボードにピンを刺した状態でハンダ付けすると、ピンを垂直に固定するのが容易になるのでオススメです。
LCDとRaspberry Piを接続
ブレッドボード上はこんな感じで接続します。
ちなみに本体側のピンはこちら。
ここまでできたらRaspberry Piを起動します。
Raspbianの設定
I2Cを有効にする
$ sudo raspi-config
9 Advanced Options
から A7 I2C
を選択し、 Yes
を2回選択します。raspi-config
を抜けたらRaspberry Piを再起動します。
必要なライブラリのインストール
$ sudo apt-get install i2c-tools python-smbus
ドライバーのロード
$ sudo modprobe i2c-bcm2708 $ sudo modprobe i2c-dev
I2C Configの編集
/boot/config.txt
を開いて以下の行を追記します。
dtparam=i2c_baudrate=50000
ここで再度Raspberry Piを再起動します。
設定の確認
以下のコマンドを実行し、bcm2708
がロードされていること、baudrate
が50000
に変更されていることを確認します。
$ dmesg | grep i2c
[ 3.787020] bcm2708_i2c 3f804000.i2c: BSC1 Controller at 0x3f804000 (irq 79) (baudrate 50000) [ 3.820524] i2c /dev entries driver
LCDの動作テスト
以下のコマンドを実行し、LCDにA
と表示されることを確認します。
$ sudo i2cset -y 1 0x50 0x00 0x01 $ sudo i2cset -y 1 0x50 0x00 0x38 $ sudo i2cset -y 1 0x50 0x00 0x0c $ sudo i2cset -y 1 0x50 0x00 0x06 $ sudo i2cset -y 1 0x50 0x80 0x41
なお、i2cset
コマンドの引数の1
はI2Cバスの番号、0x50
はLCDのアドレスです。
通常これらはi2cdetect
コマンドで調べられるのですが、このコマンドを実行するとLCDがハングするため絶対に行ってはいけません。
PythonからLCDを操作
$ git clone https://github.com/yuma-m/raspi_lcd_acm1602ni.git $ cd raspi_lcd_acm1602ni $ sudo python raspi_lcd.py "Hello world!" $ sudo python raspi_lcd.py "ラズベリーパイデ、" "ニホンゴヲLCDヒョウジ!"
raspi_lcd.py
は引数を1つ、もしくは2つ取ることができ、それぞれが1行目、2行目の表示内容に対応しています。
入力可能な文字は、半角英数記号、半角・全角のカタカナ、一部の特殊文字(千、万、円、Σ、α、βなど)です。
参考URL
PCがRealSense R200をUSBハブに接続するとPCから認識できない
タイトルの通り。 IntelのRealSense R200をUSBハブやUSB延長ケーブルに接続すると、PCから認識できないことがあります。 これは単純に電力の供給不足が原因です。
RealSenseなどの深度センサでは、赤外線レーザーによってパターンを照射し、赤外線カメラによってそのパターンの歪みを読み取ることで深度を計算しています。 このレーザーの照射に電力が必要なため、ハブなどに接続すると電力不足で正しく起動しないことがあります。
解決策としては以下のような方法が挙げられます。
2016年2月9日 追記
2つのポートから電力を供給できる、Y字のUSBケーブルっていうのがあるんですね。
こんなの。
参考URL
PythonでGoogle Drive API v3を利用して画像のアップロード
PythonでGoogle Drive API v3を利用して、 GoogleDriveにフォルダを作成し、ローカルのフォルダ内の画像をアップロードするスクリプトです。
環境
Google Drive APIの有効化と認証情報の取得
プロジェクトの作成
https://console.developers.google.com/start/api?id=drive のページから、新しいプロジェクトを作成するか、既存のプロジェクトを選択して「続行」をクリックします。
Google Driveが有効化されました、と表示されたら「認証情報に進む」をクリックします
認証情報の作成
「新しい認証情報」から「OAuth クライアントID」をクリックします
アプリケーションの種類は「その他」を選択し、適当な名前を入力します
「作成」をクリックし、次の画面では「OK」をクリックします
認証情報のダウンロード
作成した認証情報の「JSONをダウンロード」をクリックします
JSONファイルをダウンロードし、ファイル名をclient_secret.json
として保存します
ライブラリのインストール
以下のコマンドを実行します。
$ sudo pip install --upgrade google-api-python-client
スクリプトの作成
以下のスクリプトをupload.py
として保存し、IMG_DIR
等の変数の値を設定します。
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import httplib2 import os import sys from apiclient import discovery import oauth2client from oauth2client import client from oauth2client import tools from apiclient.http import MediaFileUpload import glob # アップロードする画像の入っているフォルダ IMG_DIR = '/path/to/image/dir/' # アップロードするファイルの拡張子 EXTENSION = 'jpg' # アップロードするファイルのMIMEタイプ MIME_TYPE = 'image/jpeg' # Google Driveに作成するフォルダ名 DRIVE_DIR = 'hoge' # client_secret.jsonの保存先 CLIENT_SECRET_FILE = '/path/to/client_secret.json' # アップロード先の親フォルダのID # Google Driveでフォルダを開いた時のURLの末尾がフォルダID # https://drive.google.com/drive/folders/ここがフォルダID FOLDER_ID = 'フォルダIDを入力' # アプリケーション名 APPLICATION_NAME = '先ほど入力した名前' # Google Driveにファイルの作成と、当該アプリで作成したファイルを取得できる権限(変更不要) # その他の権限は以下のURLを参照: https://developers.google.com/drive/v3/web/about-auth SCOPES = 'https://www.googleapis.com/auth/drive.file' try: import argparse flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() except ImportError: flags = None class GoogleDriveUploader: def __init__(self): self.credentials = self.get_credentials() self.http = self.credentials.authorize(httplib2.Http()) self.service = discovery.build('drive', 'v3', http=self.http) # /path/to/dir/*.jpg に一致するファイルを探しに行く self.file_path = os.path.join(IMG_DIR, '*.' + EXTENSION) self.files = glob.glob(self.file_path) if not self.files: print("No files to upload.") sys.exit() def get_credentials(self): u'''APIのQuickstartのコードのコピペ https://developers.google.com/drive/v3/web/quickstart/python 初回実行時のみブラウザに認証画面が表示され、 認証すると~/.credentials/に認証情報が保存される 2回目以降は保存された認証情報を利用してアクセスする ''' home_dir = os.path.expanduser('~') credential_dir = os.path.join(home_dir, '.credentials') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir, 'drive-python-quickstart.json') store = oauth2client.file.Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: # Needed only for compatibility with Python 2.6 credentials = tools.run(flow, store) print('Storing credentials to ' + credential_path) return credentials def create_folder(self): u'''Google Driveにフォルダを作成する''' print("Create folder: %s" % (DRIVE_DIR)) file_metadata = { 'name': DRIVE_DIR, 'mimeType': 'application/vnd.google-apps.folder', # マイドライブ直下にフォルダを作成する場合は次の行をコメントアウト 'parents': [FOLDER_ID], } folder = self.service.files().create(body=file_metadata, fields='id').execute() # 作成されたフォルダのID self.sub_folder_id = folder.get('id') def upload_file(self, file_name): u'''ファイルをアップロードする''' media_body = MediaFileUpload(file_name, mimetype=MIME_TYPE, resumable=True) body = { 'name': os.path.split(file_name)[-1], 'mimeType': MIME_TYPE, # マイドライブ直下にファイルをアップロードする場合は次の行をコメントアウト 'parents': [self.sub_folder_id], } self.service.files().create(body=body, media_body=media_body).execute() def upload_all_images(self): u'''フォルダ内のファイルを全てアップロードする''' # マイドライブ直下にファイルをアップロードする場合は次の行もコメントアウト self.create_folder() for file_name in self.files: print('upload: ' + file_name) self.upload_file(file_name) if __name__ == '__main__': uploader = GoogleDriveUploader() uploader.upload_all_images()
スクリプトの実行
$ python upload.py Storing credentials to ~/.credentials/drive-python-quickstart.json Create folder: hoge upload: hoge1.jpg upload: hoge2.jpg ...
マイドライブ を開いて、フォルダが作成されてとファイルがアップロードされていることが確認できれば成功です。