2015年10月23日

【ニュース】<Raspberry Pi Sense HAT>Raspberry Pi財団公式、宇宙科学分野向けのアドインセンサーボード

Raspberry Pi Sense HATというセンサーボード。

「国際宇宙ステーション(IIS)で、Raspberry Piをみんなの作ったプログラムで動かそう」というプロジェクトー【Astro Pi(http://astro-pi.org/)】ーのためにRaspberry Pi財団が開発したものだそうです。


    

下記のセンサーや、8x8 LEDフルカラーディスプレイ・5ボタンジョイスティックなどが内包されていて、宇宙科学分野向けの開発に便利なセンサーボードです。

■気圧センサ、温度センサ、湿度センサ、慣性測定ユニット(加速度計・ジャイロスコープ・磁力計)


下記のライブラリやドライバも用意されているので、宇宙科学に限らず、簡単に色々なプロジェクトに活用できそうです。

Pythonライブラリ
http://pythonhosted.org/sense-hat/

Firmware and driver
https://github.com/raspberrypi/rpi-sense



posted by Raspberry Pi at 10:49 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年09月30日

【ニュース】Raspberry Piの公式タッチスクリーン(7インチ)ディスプレイが発売された

RaspberryPi公式のタッチスクリーンディスプレイが発売されました。

Raspberry Piに待望の公式タッチスクリーンが登場、「PiPad」制作が楽々に

    

Amazonで購入可能です。私も購入してみようと思います。
購入したら、設定方法等の記事を書きますのでお楽しみに。

スポンサードリンク


posted by Raspberry Pi at 10:58 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年07月16日

RaspberryPiで光の明るさを測ってみた【フォトレジスタ(Photoresistor)】【Python】

◆今日のゴール

RaspberryPiで光の明るさを計測します。

今回は、フォトレジスタ(Photoresistor)を使って計測をします。 

◆必要なもの
  • フォトレジスタ(Photoresistor)
  • コンデンサ(10μF)
  • 抵抗(10kΩ)
  • ブレッドボードとジャンパーピン(あると便利)
フォトレジスタは光依存性抵抗といい、入射する光の強度が増加すると電気抵抗が低下する電子部品です。

コンデンサは電荷を蓄えたり・放出したりするものです。容量は、1μFから10μFくらいのものを使いましょう
今回は、10μFを使いました。



◆配線する

抵抗・フォトレジスタ・コンデンサに極性はありませんので、向きはどちらでも構いません。
下記のように接続します。

photoregi.png

フォトレジスタの片側は、抵抗を挟んで3.3Vに。
もう一方は、GPIOと、コンデンサを挟んでGNDに。

GPIOは今回は5番を使いました。変更しても構いません。その場合は、以下のコードも変更してください。

スポンサードリンク
◆計測するプログラム【Python】

まずは、任意のディレクトリに「photoresistor.py」という名前で、新規ファイルを作ります。
$ cd ~
$ sudo vi photoresistor.py

以下のように編集して保存します。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO

# GPIOのピン番号。適宜変更すること。
PiPin = 5

GPIO.setmode(GPIO.BCM)

def RCtime():
  value = 0

  # コンデンサの中の電気を放出する。
  GPIO.setup(PiPin, GPIO.OUT)
  GPIO.output(PiPin, GPIO.LOW)
  time.sleep(1)
 
  # コンデンサへの蓄電を始める
  GPIO.setup(PiPin, GPIO.IN)

  # コンデンサの蓄電が終わるまでループ
  while (GPIO.input(PiPin) == GPIO.LOW):
    value += 1
    # 無限ループ防止
    if value > 100000:
      return -1
  return value

try:
  measurement = RCtime()
  print(measurement)
except KeyboardInterrupt:
  print "Quit"
finally:
  print "clean up"

保存して、下記のように実行すると「4995」と数字が出力されました。
$ sudo python photoresistor.py 
4995
clean up

◆解説

15~18行目でコンデンサを放電させています。

21行目で、コンデンサへの蓄電が始まります。

蓄電にかかる時間が長いほど、24行目の中がたくさん実行されて、RCtimeメソッドから返却される値が大きくなります。

フォトレジスタは、光が強いと、抵抗が小さくなるので、コンデンサに蓄電されるまでの時間が短くなり、出力される値が小さくなります。

逆に、光が弱いと(暗いと)抵抗が大きくなり、コンデンサに蓄電されるまでの時間は長くなります。従って、出力される値は大きくなります。

今回の例では、蛍光灯で明るい部屋で4500前後、暗い場所で8000前後という値になりました。

この値は、コンデンサの値や、フォトレジスタの種類によって異なってきます。
この例では、コンデンサに蓄電される時間を便宜上利用しており、実際の「光度」を示す指標とは異なりますので、ご注意ください。



posted by Raspberry Pi at 08:00 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年07月08日

RaspberryPiからメールを送信してみた。【Python】【Postfix】を使用。

◆今日のゴール

RaspberryPiからメールを送信します。

今回は、SMTPサーバーにPostfixを使います。

また、メール送信プログラムはPythonを使って作ります。

mysza.gif

それでは、やっていきましょう!!

スポンサードリンク


◆Postfixのインストール

メールの送信サーバー(SMPTサーバー)をRaspberryPiにインストールします。今回はPostfixを使います。

まずはPostfixで使用するmailコマンドを使えるようにするため、
mailutilsをインストール
$ sudo apt-get install mailutils
続いて、Postfixをインストール
$ sudo apt-get install postfix
いろいろ質問が出てきますが、デフォルトのままインストールを進めます。

まず、メールサーバー設定形式を聞かれるので、「インターネットサイト」を選択しEnterクリック。
postfix01.png

続いてドメイン名を入力します。デフォルトで、「host名.com」が入力されているので、そのままEnter。
(好きなドメイン名に変更してもOKです。)
postfix02.png

あとは自動で、インストールが進み完了します。
基本的には、特に設定を変更する必要はないですが、下記の「main.cf」を編集することで、設定を変更することができます。
$ sudo vi /etc/postfix/main.cf


Postfixのサービス起動。
インストール完了と共に、Postfixのサービスが立ち上がります。
もし起動していない場合は下記コマンドでサービスを上げます。
$ sudo service postfix start

ちなみに、サービス起動時にIPv6の警告が出る場合がありますが、送信に影響はありません。ワーニングが出るのが嫌な場合は、上記のmain.cfのファイルの一番下の行に以下の文字列を追記すると警告が消えます。
inet_protocols = ipv4


◆Pythonのプログラムからメールを送る

適当なディレクトリにPythonのプログラムを作ります。
$ cd ~
$ sudo vi sendMail.py

「sendMail.py」という名前で新しくファイルを作り、以下のように編集します。

この際、日本語の件名・本文を送りたい場合は文字コードの指定とエンコードが必要なので、その処理を入れています。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import smtplib
from email.MIMEText import MIMEText
from email.Header import Header

def create_msg(from_address, to_address, subject, body, encode):
  msg = MIMEText(body, 'plain', encode)
  msg['Subject'] = Header(subject, encode)
  msg['From'] = from_address
  msg['To'] = to_address
  return msg

def send_by_local(from_address, to_address, msg):
  # SMTPの引数省略の場合、SMTPサーバーは localhost:25になる
  s = smtplib.SMTP() 
  s.connect()
  s.sendmail(from_address, [to_address], msg.as_string())
  s.close()

if __name__ == '__main__':
  from_addr = 'from_raspi@example.com'
  to_addr = 'to_raspi@example.com'
  subject = u'件名'
  body = u'本文です'
  encode = 'ISO-2022-JP'

  # 送信用のメッセージを作る
  msg = create_msg(from_addr, to_addr, subject, body, encode)

  # メール送信           
  send_by_local(from_addr, to_addr, msg)


保存したら、以下のように実行するとメールが送信されます。
 $ sudo python sendMail.py 

「to_addr」は送り先の実在するアドレスに書き換えてください。
「from_addr」は実在しないアドレスを入力しても送信可能です。

また、中継サーバーや外部のSMTPサーバーを使う場合は、17行目以降のSMTPの設定を変更すればOKです。

センサーで取得した値などを送信するなど活用ができます。



posted by Raspberry Pi at 07:00 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年06月23日

Raspberry PiでTwitterのタイムラインに投稿してみた【Twitter API】【Python】【tweepy】

今日のゴール

TwitterのAPIを使い、タイムラインに投稿する。
1339033610a09f5958510ffdd145bac36131f5e86e.jpg

前提

Twitter APIを利用するには、Twitterのアカウントが必要です。
持っていない場合は作成してください。

また、携帯電話の番号をアカウントに登録する必要があります。
ログイン後、以下から登録します。
https://twitter.com/settings/add_phone


※ 2015年6月25日時点での方法です。

1、アプリケーションの登録

まず、アプリケーション登録をする必要があります。

https://apps.twitter.com/にアクセスします。
(ログインしていない場合は、Twitterのアカウントでログインしてください。)

「Create New App」ボタンを押します。

Create an applicationのページに遷移します。

以下の項目の入力が求められます。
● Name * : アプリケーションの名前
● Description * : アプリケーションの説明
● Website * : アプリケーションのWEBサイト
● Callback URL : 認証後のコールバック先のURL


今回は、具体的に以下の様に入力しまた。
● Name * : 「Raspi My App」
● Description * : 「RaspiのTwitterアプリケーションです。」
● Website * : 「https://twitter.com/●●●●」(自分のTwitterのアカウントページ)
● Callback URL : 「」(ブランク)

NameやDescriptionはお好みで。
Websiteはとりあえず、自分のTwitterのアカウントページにでもしておけばよいでしょう。
Callback URLはブラウザアプリケーションで作る場合などは必要ですが、とりあえず、今回はブランクのままで登録します。

利用規約に同意にチェックをして「Create your Twitter application」ボタンを押します。

2、アクセストークンの作成

APIを使うために以下の4つの値を取得します。
  • Consumer Key (API Key)
  • Consumer Secret (API Secret)
  • Access Token
  • Access Token Secret

前の手順で「Create your Twitter application」ボタンを押し、アプリケーションが作成されると、アプリケーションの管理のページに遷移します。

このページの「Keys and Access Tokens」というタブをクリックします。

「Application Settings」の「Consumer Key (API Key)」と「Consumer Secret (API Secret)」を控えておきます。

「Your Access Token」の「Create My access token」ボタンを押すと、「Access Token」と「Access Token Secret」が生成されるので、控えておきます。

ここで、得られた、「Consumer Key (API Key)」「Consumer Secret (API Secret)」「Create My access token」「Access Token」の4つの値は、次の手順で使用します。

3、pythonで投稿してみる

「tweepy」というpython用のTwitterライブラリを使って、手軽にやってみます。

まずは、下記コマンドを順に打って、「tweepy」ライブラリをインストールします。
$ cd /tmp
# setuptoolsのインストール
$ sudo wget http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py

# pipのインストール
$ sudo wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
$ sudo python get-pip.py

# tweepyのインストール
$ sudo git clone https://github.com/tweepy/tweepy.git
$ cd tweepy
$ sudo python setup.py install

※ ここでは、「tweepy」をインストールする前に、「setuptools」と「pip」をインストールしています。pipはpythonライブラリのパッケージ管理するやつです。

これで準備完了です。適当なディレクトリに「tweet_pi.py」という名前でファイルを作り、以下の様に編集します。
$ cd ~
$ sudo vi tweet_pi.py
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import tweepy

CONSUMER_KEY = 'xxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxx'
ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.secure = True
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

api.update_status(status='Hello, world!')

「xxxxxxxxxxxxxxxx」のところは、前の手順で控えた値にそれぞれ置き換えてください。

下記コマンドで実行すると、「Hello, world!」という文字が投稿されます。
$ sudo python tweet_pi.py 


タイムラインを取得したり、検索したりできますので、APIリファレンスを参考に色々と試してみてください。

センサーと連携したりして活用すると面白いと思います。




posted by Raspberry Pi at 15:09 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年05月11日

RaspberryPiで、LCDに文字を表示されてみた

今日のゴール

RaspberryPiにLCD(liquid crystal display、液晶ディスプレイ)を接続し文字を表示させる。

用意するもの

1602A LCDモジュールを使います。


以下のようなセットにも入っています。


また、10kオームの可変抵抗器(ポテンショメータ:B10K)を使います。
ディスプレイの文字の明るさを変更するのに使います。


配線する

配線については、下記サイトの「Wiring Diagram」を参考に接続してください。
https://learn.adafruit.com/drive-a-16x2-lcd-directly-with-a-raspberry-pi/wiring#wiring-diagram


10kオームの可変抵抗器(B10K)の左端はGND、右端にVCC(5V)を接続します。

LCDの各ピンは下記の通りに接続します。
  【LCD】< - - - - - - - > 【RaspberryPi】
  • Pin #1 < - - - - - - - > GND (黒)
  • Pin #2 < - - - - - - - > VCC 5V(赤)
  • Pin #3 < - - - - - - - > 可変抵抗器B10Kの真ん中のピン(オレンジ)
  • Pin #4 < - - - - - - - > GPIO25 (黄色)
  • Pin #5 < - - - - - - - > GND (黒)
  • Pin #6 < - - - - - - - > GPIO24 (緑色)
  • -- LCDのPin #7, #8, #9, #10 は接続なし --
  • Pin #11 < - - - - - - - > GPIO23 (青)
  • Pin #12 < - - - - - - - > GPIO17 (紫)
  • Pin #13 < - - - - - - - > GPIO21 (灰色)
  • Pin #14 < - - - - - - - > GPIO22 (白)
  • Pin #15 < - - - - - - - > VCC 5V(赤)
  • Pin #16 < - - - - - - - > GND (黒)

とにかく、文字を表示する

まず、PythonのGPIOモジュールをインストールしていない場合は、インストールします。
$ sudo apt-get install python-rpi.gpio
今回はAdafruitが提供しているライブラリを使います。gitからcloneします。
$ git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
下記の通りコマンドを打って、サンプルを実行してみます。
$ cd Adafruit-Raspberry-Pi-Python-Code
$ cd Adafruit_CharLCD
$ sudo python Adafruit_CharLCD_IPclock_example.py
実行すると、1行目に現在の日時、2行目にIPアドレスが表示されます。
表示されない場合は、可変抵抗器のつまみを回してディスプレイの明るさを調整してみてください。

もし、接続しているGPIOの番号を変更した場合、同じディレクトリ内にある「Adafruit_CharLCD.py」というファイルの56行目あたりの数字を変更すればOKです。

好きな文字を表示する

Adafruit_CharLCD.pyと同じディレクトリ内に、「writeLCD.py」というファイルを新しく作ります。
(importするパスが通っていれば、同じディレクトリじゃなくてもOKです)
$ sudo vi writeLCD.py

下記のように編集します。
text1 が1行目、text2が2行目の文字列です。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

from Adafruit_CharLCD import Adafruit_CharLCD


text1 = 'Hello'
text2 = 'Welcome!'

try:
  lcd = Adafruit_CharLCD()
  lcd.clear()

  lcd.message(text1)
  lcd.message('\n')
  lcd.message(text2)
finally:
  print 'cleanup'
  lcd.GPIO.cleanup()

text1、text2を好きなように変えて下記のコマンドを実行すれば、好きな文字が表示できます。
$ sudo python writeLCD.py 


日本語(カタカナ)を表示する

半角カタカナも表示させることができます。
その場合は「writeLCD.py」下記のように変更してください。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

from Adafruit_CharLCD import Adafruit_CharLCD

text1 = u'コンニチワ!'
text2 = u'RasberryPi デス'

text1 = text1.encode('shift-jis')
text2 = text2.encode('shift-jis')

try:
  lcd = Adafruit_CharLCD()
  lcd.clear()

  lcd.message(text1)
  lcd.message('\n')
  lcd.message(text2)
finally:
  print 'cleanup'
  lcd.GPIO.cleanup()

※ text1、text2の文字は半角カタカナで記述してください。

下記コマンドで実行すれば、半角カタカナも表示させることができます。
$ sudo python writeLCD.py 




posted by Raspberry Pi at 08:00 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年05月07日

「apply-image は不明なオプションです。」っていうエラーが出る場合 【Windows 10 IoTをRaspberry Pi 2にインストール】

下記エントリーで、Windows7やwindows8のPCで作業すると「dism.exe」コマンドのところでエラーが出るみたいです。

最速でWindows 10 IoTをRaspberry Pi 2にインストールしてみた

win10_01.png

エラー:87「apply-image は不明なオプションです」

apply-imageのオプショに対応しているのがWindows10以降なのが原因です。

対処法として、Windows ADK RC for Windows 10をダウンロード・インストールします。

こちらのページの下部の「Windows ADK for Windows10をダウンロードする」からダウンロードします

win10_02.png

ダウンロードした「adksetup.exe」を開きインストールします。
インストール画面で、インストールするモジュールを選択する画面がでてきます。
ここでは、「Deployment Tools」のみにチェックをいれて、他はチェックを外しても構いません。

以下のフォルダ内に、最新版の「dism.exe」があります。
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\x86\DISM\

インストールが完了したら、コマンドプロンプトを管理者として実行します。
「Flash.ffu」をコピーしたフォルダに移動し、下記のようにコマンドを実行します。
"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\x86\DISM\dism.exe" /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck

ディスク番号が3の場合は下記の通り。
"C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\x86\DISM\dism.exe" /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDrive3 /SkipPlatformCheck

成功すると、下記のようになります。
win10_03.png

posted by Raspberry Pi at 11:29 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年05月01日

最速でWindows 10 IoTをRaspberry Pi 2にインストールしてみた

今日のゴール

ついに、Raspberry Pi2で稼働する「Windows10 IoT Core」がリリースされました。
Dev Centerから入手が可能になっています。

早速、Raspberry Pi 2 にWindows10 IoTをインストールして動かしてみます。

yu_iot.jpg

必要なもの

Raspberry Piのモデルは「Raspberry Pi 2 MODEL B」が必要です


その他、動かすのに必要なものは下記エントリーを参考にしてください。
Raspberry Piを買ってみた。

Windows 10 IoT をSDカードに入れる

※ ここでの作業は、Windowsマシン上で行います。OSはWindows10である必要があります。

Windwos7やWindows8でおこなう場合は、下記エントリーを参考に、Windows ADK RC for Windows 10をインストールしてください。

「apply-image は不明なオプションです。」っていうエラーが出る場合 【Windows 10 IoTをRaspberry Pi 2にインストール】

[●1] Microsoft Connectのアカウントを作成する

手順にしたがって、アカウントを作成してください。
いくつかのアンケート(利用規約への同意)への回答が必要な場合がありますので、すべて回答して下さい。

[●2] 「Windows_IoT_Core_RPI2_BUILD.zip」をダウンロードする

ダウンロードページを開く
・「Windows 10 IoT Core Insider Preview Image for Raspberry Pi 2、 Category: Build 」をクリック
・ダウンロードページの「単一のファイルをダウンロードする」のところから「Windows_IoT_Core_RPI2_BUILD.zip」をダウンロードする

[●3] SDカードのドライブ番号を調べる

ダウンロードを待っている間に、SDカードのドライブ番号を調べます。


まだ、SDカードは挿入しません。
・「windowsスタート」メニュー > 「全てのプログラム」 > 「アクセサリ」 > 「コマンドプロンプト」 > 右クリックして「管理者として実行(A)...」
・コマンド・プロンプトを起動したら、以下のコマンドを実行
diskpart
list disk
使用している環境にもよりますが、下記のような実行結果になります。
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           264 GB      0 B
  ディスク 1    メディアなし             0 B      0 B
  ディスク 2    メディアなし             0 B      0 B
  ディスク 3    メディアなし             0 B      0 B
  ディスク 4    メディアなし             0 B      0 B
  ディスク 5    メディアなし             0 B      0 B
続いて、SDカードを挿入してもう一度「list disk」を打ちます
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           465 GB      0 B
  ディスク 1    メディアなし             0 B      0 B
  ディスク 2    メディアなし             0 B      0 B
  ディスク 3    オンライン            29 GB  3072 KB
  ディスク 4    メディアなし             0 B      0 B
  ディスク 5    メディアなし             0 B      0 B

「ディスク 3」が新しくオンラインになりました。SDカードのディスク番号は「3」ということがわかりました。

この数字は、使用環境によって変わるので、必ず自分で調べてください。

[●4] 「Windows_IoT_Core_RPI2_BUILD.zip」を解凍して、「Flash.ffu」を取り出す

・手順[●2]でダウンロードした、「Windows_IoT_Core_RPI2_BUILD.zip」を解凍します ・展開したフォルダ内にある「Flash.ffu」というファイルを「C:\Temp」にコピー(または移動)する。

[●5] 「Windows10 IoT Core」のイメージをSDカードに展開する

もう一度、コマンドプロンプトを管理者として実行します。
手順[●3]のDISKPARTが既に開いている場合は、「exit」と打って「DISKPART」を抜けます。


まずは、「Flash.ffu」をコピーしたフォルダに移動します。
cd C:\Temp

以下のコマンドを実行します。
PhysicalDriveNの「N」は前の手順[●3]で調べたSDカードのディスク番号に置き換えてください。
例えば、ディスク番号が「3」ならば「/ApplyDrive:\\.\PhysicalDrive3」になります。
dism.exe /Apply-Image /ImageFile:Flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck

ディスク番号を間違えると、最悪、PCのハードディスクが消えるので気をつけて下さい。
dism.exe /Apply-Image /ImageFile:Flash.ffu /ApplyDrive:\\.\PhysicalDrive3 /SkipPlatformCheck


ここで、「apply-image は不明なオプションです」などのエラーが出る場合は、下記エントリーを参考にして下さい。
また、Windows ADK RC for Windows 10をインストールして作業している場合も下記を参考にしてください。

「apply-image は不明なオプションです。」っていうエラーが出る場合 【Windows 10 IoTをRaspberry Pi 2にインストール】

[●6] RaspberryPiを起動

SDカードを抜いて、RaspberryPiに挿入します。
RaspberryPiで、windows10が起動します。




posted by Raspberry Pi at 18:12 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月30日

タクトスイッチでRaspberryPiをシャットダウンさせてみた【Python】【supervisor】

今日のゴール

RaspberryPiにタクトスイッチを付けて、スイッチ押されたら、RaspberryPiをシャットダウンする


手順は以下
・タクトスイッチをRaspberryPiに取り付ける
・Pythonで、スイッチが押されたらRaspberryPiをシャットダウンするプログラムをつくる
・PythonのシャットダウンプログラムをSupervisorでデーモン化する

タクトスイッチ

以下のような、4つピンのタクトスイッチを使います。


タクトスイッチは以下のような構造になっています。
ボタンを押すと、通電する仕組みです。
今回は、1番と3番にピンは使用しないので、切り落としてしまってもよいでしょう。
raspi_sw2.gif

配線する

以下の様に配線します。
GPIOは好きな番号に変えても構いません。その場合はソースコードも変更してください。 raspi_sw.png
クリックで拡大します。

GPIO25とGNDの間に10kオームの抵抗を入れています。これはプルダウン抵抗といいます。
プルダウン抵抗を入れることで、スイッチをおした時GPIO25に3.3Vの電圧がかかる(HIGHの状態になる)、押してない時は0Vになる(LOWの状態になる)ようにします。

広告


シャットダウンプログラム【Python】

GPIOのモジュールがインストールされていない場合はインストールしてください。
$ sudo apt-get install python-rpi.gpio
「shutdown.py 」という名前で新規ファイルを作成し、下記のように編集します。
$ sudo vi shutdown.py 
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO
import shlex
import subprocess

pin = 25
cmd = 'sudo shutdown -h now'

GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.IN)

def shutdown():
  print "shutdown"
  proc = subprocess.Popen(shlex.split(cmd))

try:
  GPIO.wait_for_edge(pin, GPIO.FALLING)
except:
  print "Quit"
finally:
  print "clean up"
  GPIO.cleanup()

shutdown()

20行目の「GPIO.wait_for_edge(pin, GPIO.FALLING)」は、GPIOにかかる電圧がHIGHからLOWに変わるまで待つという処理です。
タクトスイッチのボタンを押して(HIGH)、離したとき(LOW)に処理が進み、最後の行のシャットダウン処理まで到達します。

Supervisorを使用して、デーモン化

Supervisorがインストールされていない場合は、インストールします。
$ sudo apt-get install supervisor
「/etc/supervisor/conf.d/」ディレクトリの下に新しく、シャットダウンプログラム用の設定ファイルを作成します。
$ sudo vi /etc/supervisor/conf.d/shutdown.conf
以下のように編集します。
[program:shutdown_button]
command=sudo python /home/pi/work/shutdown.py
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/shutdown.log
user=pi
2行目の「/home/pi/work/shutdown.py」のパスは、ファイルを置いた場所に適宜変更してください。

下記コマンドを順に打てば、シャットダウンプログラムがデーモン化されます。
$ sudo supervisorctl reread
shutdown_button: available

$ sudo supervisorctl add shutdown_button
shutdown_button: added process group

$ sudo supervisorctl status
shutdown_button                  RUNNING    pid 1234, uptime 0:00:00

ボタンを押して、シャットダウン

ここまで、きたら、タクトスイッチのボタンを押してみます。
ボタンを押したら(正確には、押して離したら)RaspberryPiがシャットダウンします

ちなみに

RaspberryPiには50kオーム程度のプルアップ・プルダウン抵抗が内蔵されています。
ですので、上記のように、抵抗をつかってGNDにつなげなくても、プルダウンが可能です。
その場合は、13行目のGPIO.setupの引数にpull_up_downを追加します。

GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)


このほうが、配線がスッキリするので、ぜひ試してみてください。

ちなみに、ちなみに

タクトスイッチの2番ピンをGPIO25、4番ピンをGNDにそれぞれつなげ、GPIOピンをプルアップモード(pull_up_down=GPIO.PUD_UP)にすることで、タクトスイッチを押していない時はHIGH、押した時はLOWにすることもできます。

ちなみに、pull_up_downの設定を間違えると、ボタンを押しても、電圧の変化がおこらなくなります。
ですので、wait_for_edgeで止まったままになってしまいます。

色々と試してみてください。



posted by Raspberry Pi at 10:35 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月20日

RaspberryPiにシフトレジスタ【74HC595】 を使って、複数のLEDをチカチカさせてパーリィーナイしてみた【Python使用】

今日のゴール

・RaspberryPiにシフトレジスタ【74HC595】 を使ってLEDライトを8個つなげる
・PythonでLEDを制御してチカチカさせてみる



必要な道具たち

 ・シフトレジスタ【74HC595】
 ・LEDライト×8個
 ・抵抗×8個(一般的なLEDなら、120 〜 330オームぐらいの範囲)(私は、220オームを使用)
 ・ブレッドボード (2個あると、やりやすい)
 ・ジャンパーピン

シフトレジスタとは

ざっくりと言うと、シフトレジスタにまとまったデータ(命令)を記憶させ、一気に実行する、ようなイメージです。
今回でいうと、まとまったデータ(命令)=各LEDライトを点ける/付けない となります。

今回は、74HC595を使います。1個100円ほどで購入可能です。
下記のようなセットにも、入っています。


配線する

下記は、74HC595の各ピンの名前です。向きは、丸い窪みで判断します。
スクリーンショット 2015-04-20 10.53.57.png
下記のようにRaspberryPiとつないでください。
74HC595の向きを間違えないようにしてください。丸い窪みが左側に来るようにしています。 スクリーンショット 2015-04-17 11.38.44.png
クリックで大きくなります。

【74HC595】
1 QB <- - - - - - - - > + LED7 - <- - - 抵抗 - - - > GND
2 QC <- - - - - - - - > + LED6 - <- - - 抵抗 - - - > GND
3 QD <- - - - - - - - > + LED5 - <- - - 抵抗 - - - > GND
4 QE <- - - - - - - - > + LED4 - <- - - 抵抗 - - - > GND
5 QF <- - - - - - - - > + LED3 - <- - - 抵抗 - - - > GND
6 QG <- - - - - - - - > + LED2 - <- - - 抵抗 - - - > GND
7 QH <- - - - - - - - > + LED1 - <- - - 抵抗 - - - > GND
8 GND <- - - - - - - - > GND
9 QH'   なし
10 SCLR <- - - - - - - - > 3.3V
11 SCK <- - - - - - - - > GPIO19 (オレンジ)
12 RCK <- - - - - - - - > GPIO20 (紫)
13 G <- - - - - - - - > GND
14 SI <- - - - - - - - > GPIO21(茶色)
15 QA <- - - - - - - - > + LED8 - <- - - 抵抗 - - - > GND
16 Vcc <- - - - - - - - > 3.3V


GPIOの番号は適宜変更しても構いません。その場合はソースコードも変更してください。

各ピンの解説
SI : シリアルデータを入れる
SCK : シフトレジスタクロック
RCK : ラッチクロック
QA〜QH : 出力先(8個)
Vcc : 電源(+)今回は3.3Vに接続
GND : グラウンド(−)
G : Hiにすると、QA〜QHがハイインピーダンス状態(切断状態)になる。今回は未使用なので、GNDに接続
SCLR : リセットクロック(Loにするとシフトレジスタをリセットする) 。今回は未使用なので、VCCに接続
QH' : 別の74HC595につなげて拡張できる


LEDをチカらせる

今回は、1番目から順番に一個づつ光らせて、パーリナイッ感を演出します。

gpioモジュールがインストールされていない場合はインストールしてください。
$ sudo apt-get install python-rpi.gpio
「led.py」という名前で新しくファイルを作ります。
$ sudo vi led.py
「led.py」という名前で新しくファイルを作ったら、下記のとおり、編集しましょう。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time

interval_time = 0.5
loop_num = 3

# 各GPIOの番号
SCK = 19
RCK = 20
SI = 21

GPIO.setmode(GPIO.BCM)

# 初期化
GPIO.setup(SCK, GPIO.OUT)
GPIO.setup(RCK, GPIO.OUT)
GPIO.setup(SI, GPIO.OUT)

def reset():
  GPIO.output(SCK, GPIO.LOW)
  GPIO.output(RCK, GPIO.LOW)
  GPIO.output(SI, GPIO.LOW)

def shift(PIN_NUM):
  GPIO.output(PIN_NUM, GPIO.HIGH)
  GPIO.output(PIN_NUM, GPIO.LOW)

def send_bits(data):
  for i in range(8):
    if ((1 << i ) & data) == 0:
      GPIO.output(SI, GPIO.LOW)
    else:
      GPIO.output(SI, GPIO.HIGH)

    shift(SCK)

  shift(RCK)

def lighting():
  reset()

  num = 1
  for i in range(9):
    send_bits(num)
    num = num << 1
    time.sleep(interval_time)

  send_bits(0)

try:
  print("start")
  for num in range(loop_num):
    lighting()
finally:
  print("finish")
  reset()
  GPIO.cleanup()

下記コマンドで実行すると、1番目のLEDから順番に光っていくのを、3回繰り返します。
interval_time を短くすると、動きが早くなります。


$ sudo python led.py


上記の例だと、シフト演算とか使ってて意味不明な感じです。
解説がてら、シフト演算やループ処理を使わず、ステップ実行させてみます。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time

interval_time = 0.5
loop_num = 3

# 各GPIOの番号
SCK = 19
RCK = 20
SI = 21

GPIO.setmode(GPIO.BCM)

# 初期化
GPIO.setup(SCK, GPIO.OUT)
GPIO.setup(RCK, GPIO.OUT)
GPIO.setup(SI, GPIO.OUT)

def reset():
  GPIO.output(SCK, GPIO.LOW)
  GPIO.output(RCK, GPIO.LOW)
  GPIO.output(SI, GPIO.LOW)

# 次のLEDに移動
def shift_SCK():
  print "SCK"
  GPIO.output(SCK, GPIO.HIGH)
  GPIO.output(SCK, GPIO.LOW)

# 命令を実行
def shift_RCK():
  print "RCK"
  GPIO.output(RCK, GPIO.HIGH)
  GPIO.output(RCK, GPIO.LOW)

# 1番目のLEDを光らせる
def send_bits_1():
  print "LED1"

  # --- 命令をレジスタに格納(この時点ではまだ光らない)

  GPIO.output(SI, GPIO.HIGH) # 1番目のLED(QH)「点灯」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 2番目のLED(QG)「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 3番目のLED(QF)「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 4番目のLED(QE)「消」  
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 5番目のLED(QD)「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 6番目のLED(QC)「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 7番目のLED(QB)「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 8番目のLED(QA)「消」
  shift_SCK() # 次のLEDの設定に移動
 
  # --- 命令を実行。1番目のLEDが点灯する
  shift_RCK() 

# 2番目のLEDを光らせる
def send_bits_2():
  print "LED2"

  # --- 命令をレジスタに格納(この時点ではまだ光らない)

  GPIO.output(SI, GPIO.LOW) # 1番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.HIGH) # 2番目のLED「点灯」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 3番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 4番目のLED「消」 
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 5番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 6番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 7番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 8番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動
 
  # --- 命令を実行。2番目のLEDが点灯する
  shift_RCK()

# 3番目のLEDを光らせる
def send_bits_3():
  print "LED3"

  # --- 命令をレジスタに格納(この時点ではまだ光らない)

  GPIO.output(SI, GPIO.LOW) # 1番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 2番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.HIGH) # 3番目のLED「点灯」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 4番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 5番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 6番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 7番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  GPIO.output(SI, GPIO.LOW) # 8番目のLED「消」
  shift_SCK() # 次のLEDの設定に移動

  # --- 命令を実行。3番目のLEDが点灯する
  shift_RCK()  

# ---- 4番目以降は省略 ---- #

# 全て消灯
def all_off():
  for i in range(8):
    GPIO.output(SI, GPIO.LOW)
    shift_SCK()
  shift_RCK()

# メインの処理 
def lighting():
  reset()

  send_bits_1()    # 1番目のLED点灯
  time.sleep(interval_time)

  send_bits_2()    # 2番目のLED点灯
  time.sleep(interval_time)

  send_bits_3()    # 3番目のLED点灯
  time.sleep(interval_time)

# ---- 4番目以降は省略 ---- #

  all_off()

try:
  print("start")
  for num in range(loop_num):
    lighting()
finally:
  print("finish")
  reset()
  GPIO.cleanup()

簡単に使い方を解説します。

 ・まず、出力先QHの値(HIGH or LOWいずれか)をセットします。
 ・セットするときはシリアルデータ(SI)に値を入れます。
 ・次は、QGに入れたいです。
 ・SCKにHIGHを入れると次のアドレス(QG)に移動します。
 ・移動したら次回の処理のために、SCKをLOWに戻しておきます。

 ・出力先QGにデータを入れます。SIにHIGH or LOWいずれかをセットします。
 ・SCKにHIGHを入れ、次のアドレス(QF)に移動し、データを入れます・・・

 ・これを繰り返し、QAまで8個全ての値を指定したら、RCKをHIGHにします。

 ・RCKがLOWからHIGHに変わると、QA〜QHのデータが一括して出力されます。
 ・実行したら次回の処理のために、RCLをLOWに戻しておきます。


いろいろな点灯パターンをプログラミングして、パーリー感を出すと面白いです。




posted by Raspberry Pi at 18:44 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする