RaspberryPiに接続したフルカラーLEDをPWMでグラデーションさせる
以下の記事でPWMでLEDの明るさの調整をすることができました。
hogesuke.hateblo.jp
つづいて、フルカラーLEDを使ったグラデーションに挑戦してみたいと思います。
フルカラーLEDのグラデーション
PWMを使って赤・緑・青の各色の明るさを変えることによりグラデーションさせることできます。
下の動画は実際にPWMを使ってグラデーションさせた様子です。
ちなみに使っているフルカラー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
を入力してください。
超カンタンに解説
初期状態では赤のみ点灯させ、その後、以下のように変化させています。
- 青をだんだんと明るく
- 赤をだんだんと暗く
- 緑をだんだんと明るく
- 青をだんだんと暗く
- 赤をだんだんと明るく
- 緑をだんだんと暗く
以上を繰り返すことで、赤 から 緑、青、そしてまた赤に戻るグラデーションをつくることができます。
おわりに
PWMを使ったLEDの明るさ調整を応用して、フルカラーLEDでグラデーションを実現できました。 これを利用して電子工作の表現の幅も広がりそうです。
Raspberry Pi 3 Model B (Element14)
- 出版社/メーカー: RASPBERRY-PI
- メディア: エレクトロニクス
- この商品を含むブログ (2件) を見る
PWMでRaspberryPiに接続したLEDの明るさを変える
RaspberryPiでLEDの点灯は簡単にできたので、次にLEDの明るさ調整を試してみたいと思います。
PWM
明るさの調整は、PWM(Pulse Width Modulation)という方法用いることで実現可能です。
PWMというのはパルス信号のONである時間(パルス幅)を調整することにより流れる電流量を変えるような仕組みです。
OFFの時間と較べONの時間が長くなるほど電流量が大きくなり、短くなるほど電流量が小さくなります。 その特性を利用することでLEDの明るさを調整することが可能となります。
以下の動画は実際にPWMでLEDの明るさを動的に変えて点滅させた様子です。
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のピン番号は異なるので注意が必要です。それぞれの対応は以下のページで確認できます(下の方の画像)。
実行
$ sudo ruby sample.rb
だんだんと明るくなり、その後、だんだんと暗くなることを確認できると思います。
処理を止める際は Ctrl + C
を入力してください。
ちょっとだけ雑に解説
8行目の soft_pwm_create
の3番目の引数 100
は pwm_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
- メディア: エレクトロニクス
- この商品を含むブログ (2件) を見る
Raspberry Pi Zeroに無線LAN経由でsshできるようにする
せっかく小さいRaspi Zeroですから、キーボードやモニタは接続せずにsshで操作したいですね。先日sshできるようにしたので、その工程をメモとして残しておきます。
無線LANアダプタを用意する
Raspi ZeroはRaspi3とは異なり無線LAN機能を標準で搭載していないので、別途、無線LANアダプタを購入する必要があります。
BUFFALOの下の商品がオススメです。ドライバのインストールが必要がなく、差し込むだけで使用可能です。値段も1000円以下と他と較べても安いのも魅力です。
ただ、Amazonレビューでも指摘されていますが、かなり熱を持ちます。これが機器の動作に影響するのか分かりませんが、いまのところは問題なく使えています。
BUFFALO エアーステーション 11n/g/b 150Mbps USB2.0用 無線LAN子機 ソフトウェアルーター機能付 エコパッケージ WLI-UC-GNME
- 出版社/メーカー: バッファロー
- 発売日: 2015/08/05
- メディア: Personal Computers
- この商品を含むブログを見る
また、Raspi ZeroにはmicroBの口しかないので変換ケーブルも必要です。
iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK
- 出版社/メーカー: バッファロー
- 発売日: 2011/11/01
- メディア: エレクトロニクス
- 購入: 15人 クリック: 54回
- この商品を含むブログを見る
無線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 Pi にsshする
Raspiの再起動が完了したら無線LANでネットに接続できるようになっているはずです。
pingを飛ばして確認してみます。
$ sudo ping -c 5 www.yahoo.co.jp
もし Unknown host
のように表示されたら接続できていません。もう一度設定を確認してみてください。
ネットへの接続を確認できたら、実際にRaspiにsshしてみます。
まず、ssh先のIPアドレスを確認するため ifconfig コマンドを叩きます。
$ ifconfig
wlan0 の inetアドレス が割り当てられた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.12 にIPアドレスを固定しています。
routersやdomain_name_serversの値は使用しているルータやプロバイダによって異なりますので、ご自身で確認していただく必要があります。
ちなみにBIGLOBEのDNSサーバは サーバ情報一覧: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アドレス設定 を開きます。
DHCP固定IPアドレスエントリの 編集 ボタンからレコードを追加します。
前手順で確認したMACアドレスと設定したIPアドレスを入力します。
レコードを追加後、有効にチェックを入れ、 設定 ボタンをクリックします。
その後、ルータの再起動がかかるので起動されるまでしばらく待ちます。
固定IPへssh
$ ssh pi@192.168.1.12
接続できれば固定IPの設定成功です。
おわりに
これでキーボードもモニタも接続せずにRaspi Zeroを操作できるようになりました。邪魔なコードがなくなって超スッキリです。開発も捗りそうです。
BUFFALO エアーステーション 11n/g/b 150Mbps USB2.0用 無線LAN子機 ソフトウェアルーター機能付 エコパッケージ WLI-UC-GNME
- 出版社/メーカー: バッファロー
- 発売日: 2015/08/05
- メディア: Personal Computers
- この商品を含むブログを見る
iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK
- 出版社/メーカー: バッファロー
- 発売日: 2011/11/01
- メディア: エレクトロニクス
- 購入: 15人 クリック: 54回
- この商品を含むブログを見る
Raspberry Piで静電容量式タッチセンサ(AT42QT1010)を使う
Raspberry Pi Zeroで静電容量式タッチセンサ(AT42QT1010)を試してみたので簡単に使い方をメモしておきます。
使ったもの
これです。赤が渋くてカッコいい。1000円を切るお値段というのも嬉しいですね。
ちなみにピンヘッダは付属していないので別に調達する必要があります。自分はL字のものをハンダ付けしました。
uxcell ピンヘッダ プラスチック製 メタル製 ブラック シルバートン コンピュータ成分 3枚入り 40 ピン 2.54mm
- 出版社/メーカー: uxcell
- メディア:
- この商品を含むブログを見る
タッチセンサ氏近影
サイズ感が分かるでしょうか、100円玉より一回り大きいといった感じです。
裏側(?)です。この白線の丸の中に触れるとセンサが反応します。
配線
タッチセンサのピンをそれぞれRaspiに以下のように接続します。
- VDD (白線) -> 5V
- GND (黒線) -> GND
- OUT (黄線) -> GPIOピン(上の例では25番ピン)
配線がうまくいっていれば、センサにタッチすることで基盤に付いているLEDが光るはずです。
タッチ検知
配線が終わったのでさっそく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パネルを接続する
SHARPの7インチ液晶、お手頃価格で高精細、表示はとても綺麗でオススメです。
ところで、この7インチ液晶をRaspberryPiに繋いで使う際には /boot/config.txt
ファイルを書き換える必要があります。
購入すると付いてくる説明書に書き換える内容が記載されているのですが、Raspberry Pi Zeroではその内容のとおり書き換えても動きませんでした(おそらくRaspi3でも動かない?)。
いろいろ検索し調べた結果、以下の内容で書き換えることで動くようになりました。
※ ちなみに秋月のページからダウンロードできる config.txt
はダメでした
ラズベリーパイ 7インチ ディスプレイ SHARP 7" 高精細 IGZO LCD for Raspberry Pi
- 出版社/メーカー: シャープ株式会社
- メディア: エレクトロニクス
- この商品を含むブログを見る
参考
neuralassemblyのメモ: SHARPのIGZO液晶用のスタンドをタミヤの楽しい工作キットで作り、Raspberry Piで使ってみた
ポモドーロ・テクニックでSlack見がち問題を解決する
Slack見がち問題がすこし話題になっていたので、自分もすこし書いてみる。
Slack見がち問題 - hitode909の日記
自分のSlack見がち問題対処法 - $shibayu36->blog;
問題
以前に Slackに気を取られすぎる問題とその解決 っていうのを書いていて、この頃は、こんな感じで対処していた。
これで、新規の投稿が目につかなくなり頻繁に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だけのクライアントが欲しいなっていう感じ。気が向いたら今度作ろうかな。
- 作者: 松下雅和,小島泰洋,長瀬敦史,坂本卓巳
- 出版社/メーカー: 技術評論社
- 発売日: 2016/06/28
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
React + Reduxでテック系Podcastをピックアップして聴けるwebサービス、pickfmを作った
pickfmとは
テック系Podcastにでてくる話題を可視化し、好きな箇所をピックアップして聴けるwebサービスです。
下の画像はwada.fm Episode 52の話題を表示した様子です。このように、タイムライン状に表示された話題から聴きたい箇所をピックアップして再生することができます。
これをどう実現しているかというと、ディープラーニングを用いて音声認識をしてうんぬんとかそんなことは1ミリもありません。
このように非常にローテクな残念仕様となっております。
作った動機
「あの話、また聴きたいな」と思っても探しだすのが困難で、あっちこっちと這いずり回らないといけないのを何とかしたくて作りました。Googleで音声も検索できるようになればいいのになー。
あと、ニコニコ動画式に「この時この話題でこんなことを思った」っていうのをコメントで共有できたら面白いかもと思い、コメント機能も付けています。
こんな具合にコメントで盛り上がっている箇所がわかる。
構成
謝辞
wada.fmを配信されている和田さんには、pickfm上で扱うことをご了承いただきました。ありがとうございました。
おわりに
フィードバックありましたらIssue送りつけてください。また、PullRequestも募集しています。
github.com