RaspberryPiに接続したフルカラーLEDをPWMでグラデーションさせる

f:id:hogesuke_1:20160906013834j:plain

以下の記事でPWMでLEDの明るさの調整をすることができました。
hogesuke.hateblo.jp

つづいて、フルカラーLEDを使ったグラデーションに挑戦してみたいと思います。

フルカラーLEDのグラデーション

PWMを使って赤・緑・青の各色の明るさを変えることによりグラデーションさせることできます。
下の動画は実際にPWMを使ってグラデーションさせた様子です。

youtu.be

ちなみに使っているフルカラーLEDは以下のものです。

放熱基板付1WハイパワーフルカラーRGBLED OSTCWBTHC1S: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

PWMを使ってグラデーションさせるコード

以下はRubyでwiringpiを使ってグラデーションさせるコードです。

※ wiringpiのインストールについては下の記事を参照してください
PWMでRaspberryPiに接続したLEDの明るさを変える - 無理しない感じ

require 'wiringpi'

RED_LED = 4
GREEN_LED = 5
BLUE_LED = 6

SLEEP_TIME = 0.01

begin
  io = WiringPi::GPIO.new
  
  io.soft_pwm_create(RED_LED, 100, 100)
  io.soft_pwm_create(GREEN_LED, 0, 100)
  io.soft_pwm_create(BLUE_LED, 0, 100)
  
  while true
    (0..100).each do |x|
      io.soft_pwm_write(BLUE_LED, x)
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(RED_LED, (100 - x))
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(GREEN_LED, x)
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(BLUE_LED, (100 - x))
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(RED_LED, x)
      sleep(SLEEP_TIME)
    end
    (0..100).each do |x|
      io.soft_pwm_write(GREEN_LED, (100 - x))
      sleep(SLEEP_TIME)
    end
  end
rescue Interrupt
  io.soft_pwm_write(RED_LED, 0)
  io.soft_pwm_write(GREEN_LED, 0)
  io.soft_pwm_write(BLUE_LED, 0)
end

上記のコードを sample_color.rb として保存してください。
また、上記のコードは各色をそれぞれ以下のピンに接続した場合を前提としています。

  • 赤 -> GPIO23
  • 緑 -> GPIO24
  • 青 -> GPIO25

実行

$ sudo ruby sample_color.rb

グラデーションする様子を確認できるでしょうか。
処理を止める際は Ctrl + C を入力してください。

超カンタンに解説

初期状態では赤のみ点灯させ、その後、以下のように変化させています。

  1. 青をだんだんと明るく
  2. 赤をだんだんと暗く
  3. 緑をだんだんと明るく
  4. 青をだんだんと暗く
  5. 赤をだんだんと明るく
  6. 緑をだんだんと暗く

以上を繰り返すことで、赤 から 緑、青、そしてまた赤に戻るグラデーションをつくることができます。

おわりに

PWMを使ったLEDの明るさ調整を応用して、フルカラーLEDでグラデーションを実現できました。 これを利用して電子工作の表現の幅も広がりそうです。

Raspberry Pi 3 Model B (Element14)

Raspberry Pi 3 Model B (Element14)

PWMでRaspberryPiに接続したLEDの明るさを変える

f:id:hogesuke_1:20160905013832j:plain

RaspberryPiでLEDの点灯は簡単にできたので、次にLEDの明るさ調整を試してみたいと思います。

PWM

明るさの調整は、PWM(Pulse Width Modulation)という方法用いることで実現可能です。

f:id:hogesuke_1:20160904041609p:plain

PWMというのはパルス信号のONである時間(パルス幅)を調整することにより流れる電流量を変えるような仕組みです。

OFFの時間と較べONの時間が長くなるほど電流量が大きくなり、短くなるほど電流量が小さくなります。 その特性を利用することでLEDの明るさを調整することが可能となります。

以下の動画は実際にPWMでLEDの明るさを動的に変えて点滅させた様子です。

youtu.be

Raspberry PiでPWMを利用する

それでは、Raspberry PiでPWMを利用するにはどうすればいいでしょうか。
WiringPiというライブラリを使用することで簡単にPWMを利用可能です。

wiringpiのインストール

以下はRubyでWiringPiを使用する場合の説明となります。

Raspbian Jessieの場合、WiringPiはすでにインストールされているため、RubyからWiringPiを操作するためのGemをインスールすればOKです。

ただし、 ruby-dev が入っていないとGemのインストールに失敗するので、先にインストールしておきます。

$ sudo apt-get install -y ruby-dev
$ sudo gem install wiringpi

RubyでPWMを使用するコード

require 'wiringpi'

LED = 4

begin
  io = WiringPi::GPIO.new

  io.soft_pwm_create(LED, 0, 100)
  while true
    (0..100).each do |x|
      io.soft_pwm_write(LED, x)
      sleep(0.01)
    end
    (0..100).each do |x|
      io.soft_pwm_write(LED, (100 - x))
      sleep(0.01)
    end
  end
rescue Interrupt
  io.soft_pwm_write(LED, 0)
end

上記のコードを sample.rb で保存してください。 ちなみに、上記のコードではLEDを GPIO23 に接続した場合の例となります。

※ RaspberryPiのピン番号とWiringPiのピン番号は異なるので注意が必要です。それぞれの対応は以下のページで確認できます(下の方の画像)。

Pins | Wiring Pi

実行

$ sudo ruby sample.rb

だんだんと明るくなり、その後、だんだんと暗くなることを確認できると思います。
処理を止める際は Ctrl + C を入力してください。

ちょっとだけ雑に解説

8行目の soft_pwm_create の3番目の引数 100pwm_range です。

io.soft_pwm_create(LED, 0, 100) # 8行目

pwm_range は何かというと、LEDの明るさを何段階に設定するか、というように考えると分かりやすいかと思います。

100を設定した場合、100でもっとも明るく、0でもっとも暗くなります。

今回のコードでは0からはじめ、 soft_pwm_write で1ずつ値を加えるように書き換えています。 100までいったところで、今度は1ずつ減らすように書き換えています。

このようなコードで、だんだんと明るく、その後だんだんと暗くなるような点滅を実現できます。

おわりに

ライブラリを使うことで簡単にPWMを使用し、LEDの明るさを変えることができました。
今度はフルカラーLEDを使って色をだんだんと変えていくような実装を試してみたいと思います。

参考

PWM制御
Rubyでwiringpiを使う | ぬわーーーーーーー!!!

Raspberry Pi 3 Model B (Element14)

Raspberry Pi 3 Model B (Element14)

Raspberry Pi Zeroに無線LAN経由でsshできるようにする

f:id:hogesuke_1:20160827120821j:plain

せっかく小さいRaspi Zeroですから、キーボードやモニタは接続せずにsshで操作したいですね。先日sshできるようにしたので、その工程をメモとして残しておきます。

無線LANアダプタを用意する

Raspi ZeroはRaspi3とは異なり無線LAN機能を標準で搭載していないので、別途、無線LANアダプタを購入する必要があります。

BUFFALOの下の商品がオススメです。ドライバのインストールが必要がなく、差し込むだけで使用可能です。値段も1000円以下と他と較べても安いのも魅力です。

ただ、Amazonレビューでも指摘されていますが、かなり熱を持ちます。これが機器の動作に影響するのか分かりませんが、いまのところは問題なく使えています。

また、Raspi ZeroにはmicroBの口しかないので変換ケーブルも必要です。

iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK

iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK

無線LANアダプタを接続する

それでは早速、無線LANアダプタをUSBに差し込みます。
念のため、認識されているか lsusb コマンドで確認します。

$ lsusb
Bus 001 Device 002: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ちゃんと機器の名称が表示されているので問題なさそうです。

アクセスポイントの設定をする

つぎにアクセスポイントに接続するための設定を行います。
wpa_passphrase コマンドを使い、設定に必要なテキストを生成します。

$ wpa_passphrase [SSID] [パスフレーズ]
network={
        ssid=[SSID]
        #psk=[パスフレーズ] <- この行は削除して構いません
        psk=[暗号化されたパスフレーズ]
}

上記のテキストをコピーし /etc/wpa_supplicant/wpa_supplicant.conf ファイルに追記します。

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

もしくは以下のようにすることで一発で追記可能です。

$ sudo sh -c "wpa_passphrase [SSID] [パスフレーズ] >> /etc/wpa_supplicant/wpa_supplicant.conf"

設定できたら再起動します。

$ sudo shutdown -r now

Raspberry Pisshする

Raspiの再起動が完了したら無線LANでネットに接続できるようになっているはずです。
pingを飛ばして確認してみます。

$ sudo ping -c 5 www.yahoo.co.jp

もし Unknown host のように表示されたら接続できていません。もう一度設定を確認してみてください。

ネットへの接続を確認できたら、実際にRaspiにsshしてみます。
まず、ssh先のIPアドレスを確認するため ifconfig コマンドを叩きます。

$ ifconfig

wlan0inetアドレス が割り当てられたIPアドレスです。

接続元のPCから先ほど確認したIPアドレスに向けてsshしてみます。
piユーザの初期パスワードは raspberry です。

$ ssh pi@[IPアドレス]

接続できたでしょうか。

IPを固定する

これまでの手順でsshできるようになったのですが、DHCP環境では割り当てられるIPアドレスが変わってしまいます。

その状態では毎回接続先IPアドレスを確認する必要があるので、IPアドレスを固定する設定を行います。

なお、以下の手順は Raspbian Jessie 環境のものとなります。 Raspbian Wheezy では手順が異なるためご注意ください。

dhcpcd.confファイルの編集

まず /etc/dhcpcd.conf ファイルに以下の例のように追記します。

interface wlan0
static ip_address=192.168.1.12/24
static routers=192.168.1.1
static domain_name_servers=210.147.235.3

上記の例では 192.168.1.12IPアドレスを固定しています。

routersやdomain_name_serversの値は使用しているルータやプロバイダによって異なりますので、ご自身で確認していただく必要があります。

ちなみにBIGLOBEDNSサーバは サーバ情報一覧:BIGLOBE会員サポート で確認できます。

MACアドレスの確認

次に、無線LANアダプタのMACアドレスを確認します。 ifconfig コマンドを叩きます。

wlan0     Link encap:イーサネット  ハードウェアアドレス xx:xx:xx:xx:xx:xx

wlan0 のハードウェアアドレスがそれです。
この値を控えておいてください。ルータ側の設定で必要となります。

ルータの設定

固定IPのルータ側の設定を行います。

使用しているルータによって設定方法が異なるのですが、私が使用している PR-500KI を例として説明します。

ルータの設定ページをブラウザで開きます。PR-500KIでは http://192.168.1.1/ でした。

設定画面の 詳細設定 -> DHCPv4サーバ設定 -> DHCP固定IPアドレス設定 を開きます。

f:id:hogesuke_1:20160827152437p:plain

DHCP固定IPアドレスエントリの 編集 ボタンからレコードを追加します。
前手順で確認したMACアドレスと設定したIPアドレスを入力します。

f:id:hogesuke_1:20160827152935p:plain

レコードを追加後、有効にチェックを入れ、 設定 ボタンをクリックします。
その後、ルータの再起動がかかるので起動されるまでしばらく待ちます。

固定IPへssh

固定したIPアドレスに向けてsshしてみます。

$ ssh pi@192.168.1.12

接続できれば固定IPの設定成功です。

おわりに

これでキーボードもモニタも接続せずにRaspi Zeroを操作できるようになりました。邪魔なコードがなくなって超スッキリです。開発も捗りそうです。

iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK

iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK

Raspberry Piで静電容量式タッチセンサ(AT42QT1010)を使う

f:id:hogesuke_1:20160820192955j:plain

Raspberry Pi Zeroで静電容量式タッチセンサ(AT42QT1010)を試してみたので簡単に使い方をメモしておきます。

使ったもの

www.switch-science.com

これです。赤が渋くてカッコいい。1000円を切るお値段というのも嬉しいですね。
ちなみにピンヘッダは付属していないので別に調達する必要があります。自分はL字のものをハンダ付けしました。

タッチセンサ氏近影

f:id:hogesuke_1:20160820193720j:plain サイズ感が分かるでしょうか、100円玉より一回り大きいといった感じです。

f:id:hogesuke_1:20160820225115p:plain:w300
裏側(?)です。この白線の丸の中に触れるとセンサが反応します。

配線

f:id:hogesuke_1:20160820214505p:plain

タッチセンサのピンをそれぞれRaspiに以下のように接続します。

  • VDD (白線) -> 5V
  • GND (黒線) -> GND
  • OUT (黄線) -> GPIOピン(上の例では25番ピン)

配線がうまくいっていれば、センサにタッチすることで基盤に付いているLEDが光るはずです。

f:id:hogesuke_1:20160820223035p:plain:w200

タッチ検知

配線が終わったのでさっそくraspiでタッチを検知をしてみます。  

今回はGPIO25に接続しているので、25番ピンでタッチの入力を受け付けるように設定します。

$ cd /sys/class/gpio
$ echo 25 > export
$ cd gpio25
$ echo in > direction

まずタッチしていないときの値を確認します。0(Low)であるはずです。

$ cat value
$ 0

次にタッチした状態で値を確認します。0から1(High)に変わります。

$ cat value
$ 1

おわりに

タッチの検知だけであれば案外簡単に実現可能でした。
つぎはタッチをトリガーとして、何か動かしてみたいと思います。

Raspberry Pi ZeroにSHARP 7インチ IGZO-LCDパネルを接続する

f:id:hogesuke_1:20160806021825j:plain

SHARPの7インチ液晶、お手頃価格で高精細、表示はとても綺麗でオススメです。

ところで、この7インチ液晶をRaspberryPiに繋いで使う際には /boot/config.txt ファイルを書き換える必要があります。

購入すると付いてくる説明書に書き換える内容が記載されているのですが、Raspberry Pi Zeroではその内容のとおり書き換えても動きませんでした(おそらくRaspi3でも動かない?)。

いろいろ検索し調べた結果、以下の内容で書き換えることで動くようになりました。
※ ちなみに秋月のページからダウンロードできる config.txt はダメでした

参考

neuralassemblyのメモ: SHARPのIGZO液晶用のスタンドをタミヤの楽しい工作キットで作り、Raspberry Piで使ってみた

ポモドーロ・テクニックでSlack見がち問題を解決する

Slack見がち問題がすこし話題になっていたので、自分もすこし書いてみる。

Slack見がち問題 - hitode909の日記
自分のSlack見がち問題対処法 - $shibayu36->blog;

問題

以前に Slackに気を取られすぎる問題とその解決 っていうのを書いていて、この頃は、こんな感じで対処していた。

  1. 始業時間に全チャンネルをミュートするスクリプトを起動
  2. 就業時間にその日の投稿をレポートにまとめるスクリプトを起動

これで、新規の投稿が目につかなくなり頻繁にSlackを見ることもなくなり、レポートにまとめられることで就業後にはキャッチアップできる、みたいな日々を思い描いていた。

だけど、これは失敗に終わっていて、ミュートされていても投稿がないか確認するためチャンネルめぐりをしてしまい、結果、むしろSlackに向かう時間が長くなるという結末になった。

GitHub - dopin/slack-silencer
GitHub - hogesuke/slack-reporter: 特定期間のSlackの投稿をまとめてレポートしてくれるツール

再 解決

ところで最近、ポモドーロ・テクニックっていうのを使って仕事している。簡単に言うと25分仕事して5分休むっていうのを繰り返す。

それで、

  • 仕事をする25分の間はSlackを閉じて見ることができないようにする
  • 休憩後、つぎの25分が始まる前にSlackを起動して投稿を確認する

というような運用をしている。

これが結構うまくいっていて、プログラミング中に「うーん」って悩んでて気づいたらSlack眺めてたみたいな状況がなくなった。(いや、ほんとうはたまにある…)

Slackは起動に時間かかるっていうのが逆に良く機能してて、仕事中に朦朧として起動してしまった際に「ハッ!いかんいかん」と正気を取り戻すことができる。

デメリット

基本、ポモドーロのサイクルにSlackを組み込むことでうまく運用できてるんだけど、デメリットもある。

DMが送られてきても、仕事中の25分間は気づけない。Slackを見忘れることもあるので1時間とか放置してしまう場合もある。
DMを送る場面ってわりと即答を期待している場合が多いし、いままで即答を貰えることで助かる経験を何度もしてきたので、できれば自分も早い返答をしたいという気持ちはある。

SlackのDMだけのクライアントが欲しいなっていう感じ。気が向いたら今度作ろうかな。

Slack入門 [ChatOpsによるチーム開発の効率化]

Slack入門 [ChatOpsによるチーム開発の効率化]

React + Reduxでテック系Podcastをピックアップして聴けるwebサービス、pickfmを作った

f:id:hogesuke_1:20160518193805p:plain
https://pickfm.net

pickfmとは

テック系Podcastにでてくる話題を可視化し、好きな箇所をピックアップして聴けるwebサービスです。

下の画像はwada.fm Episode 52の話題を表示した様子です。このように、タイムライン状に表示された話題から聴きたい箇所をピックアップして再生することができます。
f:id:hogesuke_1:20160518195749p:plain

これをどう実現しているかというと、ディープラーニングを用いて音声認識をしてうんぬんとかそんなことは1ミリもありません。

  1. Podcastを聞きながら内容をふせんに書き出す
  2. それをスプレッドシートに起こす
  3. スプレッドシートcsvにエクスポートする
  4. csvスクリプトでElasticSearchに投入

このように非常にローテクな残念仕様となっております。

作った動機

「あの話、また聴きたいな」と思っても探しだすのが困難で、あっちこっちと這いずり回らないといけないのを何とかしたくて作りました。Googleで音声も検索できるようになればいいのになー。

あと、ニコニコ動画式に「この時この話題でこんなことを思った」っていうのをコメントで共有できたら面白いかもと思い、コメント機能も付けています。

f:id:hogesuke_1:20160518210116p:plain こんな具合にコメントで盛り上がっている箇所がわかる。

構成

  • バックエンド
  • フロントエンド
    • React.js
    • Redux

謝辞

wada.fmを配信されている和田さんには、pickfm上で扱うことをご了承いただきました。ありがとうございました。

おわりに

フィードバックありましたらIssue送りつけてください。また、PullRequestも募集しています。
github.com

リンク

https://pickfm.net