色々と面倒。マオです。
最近メモリ関係が壊れる流れになっているが、今度は音楽鯖として使っているRaspberry piに刺さっているSDカードが飛んだ。
よく分からんがファイルシステムが壊れたっぽい。
っぽいってのは確認が出来なかったからなのよね。
ラズパイを鯖として使う場合、出力を省いているのでエラーの確認が全く出来ない。
そしてコンソールをいじる為にキーボードも用意しないといけない。
とーっても面倒なのだ。
手間がかかったが使用しているケーブルやらキーボードを引っこ抜いて、何とか作業に取り掛かれるようになった。
エマージェンシーモードで起動していて、コンソールに書いてあった「リブートコマンドをやってみてね」ってのやったら、完全に起動しなくなったゾ。
くたばれ!(くたばった)
ま、動かない物はしょうがない。
ついでにSDカードのエラーチェックをして問題無かったので、再インストールして復旧完了。
暇を見つけて設定とか直さないとなー。
で、寝る。マオです。
注文してた物が届いていたが、忙しくて放置してしまった。
丁度、雨が降ったり材料待ちが発生して仕事が休みになったので一気に設置。
「Right-EAR Pillowspeaker PS-21」を買ってみました。
簡単に言っちゃうと薄型のスピーカーで、枕の下に敷いて使う。
普段はヘッドホンかイヤホンを使ってるけど寝る時は気になって使えないし、寝返り打つとケーブルの付け根にダメージが・・・。
ってか、既にイヤホンの片耳が死んでしまったのだ(白目)
カバーの色は5種類で写真の買ったヤツはPattern-3。
(Pattern-1・Pattern-2・Pattern-3・Pattern-4・Pattern-5)
PCから音を出して性能チェック。
音量とかがヘッドホン基準で設定してあるので、それだと音が小さ過ぎたので少し音量を上げた所、良い感じに聞こえるようになった。
何もしない状態だとただのスピーカーで普通のスピーカーよりは小さいが、それなりの音量が出る。
この上に枕を置くと音が抑えられて、頭を載せると良い感じに音が聞こえるのだ。
残念ながら比較対象が無いから、この手の枕に使うスピーカーの安いヤツとどのくらい違うのかが分からない(笑)
一応、私の持っているスピーカーでは一番高い物になったな。
性能テストは良いのだが、流石に音楽を聴くのにPCを立ち上げるのは鶏を牛刀で割くようなもんだ。
後、音量とかを毎回変えるのも面倒。
というわけでネットワークオーディオの世界に手を出してみる事になった(沼の入り口)
音楽データを保存するNASは既に存在しているので、後はこれを再生する物が必要になる。
この再生する機構をレンダラーと言い、2年ほど前に買った省電力で小型で3.5mmフォーンプラグが付いているRaspberry Piが良い感じらしい。
入れるOSやらソフトは色々存在するのだが、今回はVolumioを入れてみた。
MicroSDにダウンロードしてきたイメージファイルを書き込んで差し込むだけだ。
DHCPでIP割り振られるので対象のIPか「http://volumio.local」にWebブラウザからアクセスして設定を色々する。
やる事は日本語へ変更とNASの場所を知らせる所くらいだな。
操作はWeb上で出来るので、ローカルネットワークに接続すればスマホでも行ける。
PCを立ち上げる必要は無いのだ。
数日使ったが良い感じに音楽聞きながら安眠出来ている。
・・・仕事疲れがヤバイのかなぁ・・・。
これで目標は達成したが所有しているRaspbeyyr Piが有線のみなので少し煩わしい。
最新のヤツはデフォルトでWiFiとBluetoothが内蔵されているらしいから、もしかしたら買ってしまうかもしれぬな。
ちょっと心配なのがスピーカーの線が細いから断線しそうな気がするのよね。
長生きしてくれる事を祈る。
現在、そば殻枕を使っているのだがもっと包み込まれるような枕のが良いのかなぁ?
低反発枕もあるんだけど、そっちは音の通りが宜しくない。
今度は最適な枕を探す事になりそうだ(笑)
ここから細かい制御が出来るようになる。マオです。
今まではコマンドで個別に部品を制御してたけど、プログラムで制御する事により複雑な事が出来るようになる。
使える言語は様々で推奨はPythonらしい。
ここでは既に開発環境が整っているJavaを使用していく。
GPIOを使うには、Pi4Jというライブラリが必要になる。
もし、RaspberryPiが直接ネットワークに繋がっているなら、インストールは簡単に終わる。
curl -s get.pi4j.com | sudo bash
これをsudoが出来るユーザで実行するだけだ。
JDKなんかはデフォルトで入ってるようなので、問題無いっぽい。
ライブラリは「/opt/pi4j/lib」にインストールされる。
今回の回路は前回のタクタイルスイッチと前々回のフルカラーLEDを使って、スイッチを押すごとに色が変わっていく物を作る。
注意点はコマンドの時とGPIOの番号が違う所だ。
コマンドではGPIO16だった所が、Pi4JではGPIO27となる。
詳細は公式のPin Numbering(Raspberry Pi 2 Model Bはここ)にあるので、確認しよう。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalInput; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.PinPullResistance; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.RaspiPin; import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent; import com.pi4j.io.gpio.event.GpioPinListenerDigital; public class ButtonDeLedTikatika { public static void main(String[] args) { // #1 final GpioController gpio = GpioFactory.getInstance(); // #2 final GpioPinDigitalOutput led_red = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_29, PinState.HIGH); led_red.setShutdownOptions(true); final GpioPinDigitalOutput led_green = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_25, PinState.HIGH); led_green.setShutdownOptions(true); final GpioPinDigitalOutput led_blue = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, PinState.HIGH); led_blue.setShutdownOptions(true); // #3 final GpioPinDigitalInput button = gpio.provisionDigitalInputPin(RaspiPin.GPIO_27, PinPullResistance.PULL_UP); button.setShutdownOptions(true); // #4 button.addListener(new GpioPinListenerDigital() { private byte flag; @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent pin_event) { if(pin_event.getState().isLow()) { flag += flag < 7 ? 1 : -flag; led_red.setState((flag & 1) != 0 ? PinState.LOW : PinState.HIGH); led_green.setState((flag & 2) != 0 ? PinState.LOW : PinState.HIGH); led_blue.setState((flag & 4) != 0 ? PinState.LOW : PinState.HIGH); } } }); // #5 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { while(!in.ready()) { Thread.sleep(1000); } in.readLine(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } // #6 gpio.shutdown(); } }
以上が制御するプログラム。
#1でGPIOをなんやかんやするインスタンスを貰う。
なんやかんやするインスタンスを使って、#2でLED部分の設定をしている。
赤をGPIO29、緑をGPIO25、青をGPIO28に繋いである。
二つ目の引数にあるPinState.HIGHはデフォルトの出力状態を指定している。
このLEDは電圧がかかっていると消えるので、実行されると消えた状態になる。
setShutdownOptionsは終了時に関わる設定なので、そっちで説明するので飛ばす。
#3はタクタイルスイッチ部分の設定だ。
GPIO27に接続してあり、二つ目の引数PinPullResistance.PULL_UPはプルアップ抵抗の設定をしている。
#4はタクタイルスイッチの状態が変化された時の処理を登録している。
各色の状態は3ビット(0~7)で記録して、ビットが立っている部分が光る。
スイッチが押されると処理がされ、電圧がLowになるのでif分の中が実行される。
フラグ管理をしているflagに1を加算するか、7から溢れる場合は0に戻している。
setStateでPinState.LOWかPinState.HIGHを指定する事で、電圧を変更する事が出来る。
これによりスイッチを押すたびに、消えた状態からレッド→グリーン→イエロー→ブルー→マゼンタ→シアン→ホワイトとなり、次でまた消える。
#5はエンターキーを押すまで、プログラムを抜けないようにループさせている。
GPIOの制御部分は別スレッドで動く為に、この部分が無いと処理が終了してしまう。
#6の部分でGPIOを開放(コマンドにおけるunexport)したりする。
しかし、#2や#3でやっているsetShutdownOptions(true)を指定していないと開放してくれない。
setShutdownOptionsでは色々と開放後のピンの状態も指定出来たりする。
実行は一般ユーザからクラスファイルが置いてあるディレクトリで以下のコマンドで出来る。
sudo java -cp .:"/opt/pi4j/lib/*" ButtonDeLedTikatika
意外とサクサクとここまで出来てしまった。
基礎は終わったので、ここから難易度がドンドン上がって大変な事になりそうだ・・・(遠い目)
基本その2。マオです。
前回の終わりに次はプログラムでーなんて書いてあったけど、もう一つの基本をコマンドでやる事にする。
今回はタクタイルスイッチを使う。
タクタイルスイッチとは簡単に言えば押す事によって回路が繋がるボタンだ。
ボタンが押されたかをRaspberryPiで検出する。
一般ではタクトスイッチと呼ばれているけど、これは商標らしい(キャタピラーと同じような感じ、正式名称はクローラーである)。
足が4本あるけど、2本ずつで回路が繋がっていて、ボタンを押すと全部が繋がる。
なので接続する時には注意が必要だ。
タクタイルスイッチで分断するように、GPIOとGroundに繋ぐ。
本来ならば今回の回路にはプルアップ抵抗という物を入れなければならない。
入れないとノイズやら静電気やらで電圧が安定せずに、正常に状態の検知が出来ない。
RaspberryPiには内部に抵抗が付いていて、設定でそこら辺を制御して安定させる事が出来るのだ。
接続が終わったらコマンドで制御する。
例としてGPIO16を使用する。
rootで作業をする。
echo 16 > /sys/class/gpio/export
GPIO16を確保する。
次は設定。
echo "in" > /sys/class/gpio/gpio16/direction
前回はoutを指定していたけど、今回は入力なのでinを指定する。
echo "high" > /sys/class/gpio/gpio16/direction
highの部分がプルアップ抵抗の設定になる。
これで準備は完了だ。
cat /sys/class/gpio/gpio16/value
このコマンドで0か1が表示される。
ボタンを押さない状態だと1が表示され、ボタンを押すと0が表示される。
echo 16 > /sys/class/gpio/unexport
最後にピンを開放して終了だ。
今回はGroundと接続したが、電源と接続するパターンもある。
その場合は抵抗設定をhighではなくlowを指定する(プルダウン抵抗という)。
結果は逆転してボタンを押さない状態だと0が表示される。
注意するべき点は、電圧は3.3vまでしか許容されていない所だ。
RaspberryPiには5v電源があるが、これを入力してしまうと壊れるので気を付けよう。
以上で、入力も出来るようになった。
次回こそはプログラムを使ってみたいなぁ。
記念すべき第一歩。マオです。
Raspberry Piのセットアップがある程度終わったので、今度は電子回路の練習を始めたいと思う。
正直な所、私は電子回路に関する知識がゼロである!
ゼロである!
大事な事なので2度書いた。
ま、勉強しながら作業するのは好きなので、ゆっくりとやって行くとしよう。
書かれている記事の知識は間違っている可能性もあるので、真似する人は自己責任で。
今回は電子回路の基本的なヤツで、Lチカをやってみる。
Lチカとは「LEDをチカチカ」の略らしい。
つまりLEDを光らせる事だ。
LEDは「OptoSupply製 フルカラーLED OSTA71A1D-A」を使用します。
ブレッドボード(実験用の基板、部品を挿すだけなので便利)に、各種ジャンパワイヤーや抵抗、LEDを挿していく。
このLEDは4本足なのだが、ブレッドボードは行で繋がっている。
ブレッドボードに数字と英字が書いてある。
1つの行(画像ではブレッドボードを横にして使っているので、画像では行と列が逆なので注意)でa-e列とf-j列がそれぞれで繋がっている。
それ以降の行も同じだ。
ちなみに+と-の部分もそれぞれの列で全部繋がっている。
話を戻して、この手の複数の足が付いている部品はブレッドボードの真ん中を跨いで付ける事によって、a-e列とf-j列で全てのピンを分離できるのだが、今回のLEDはサイズが小さいので中央を跨ぐ事が出来ない。
解決方法としては、ワイヤーを使ってそれぞれの足を接続すれば良い。
ただ、今回は簡単に斜めに挿してしまった。
少し硬いがちゃんと行を分けて挿す事が可能だ。
LEDを見ると、一角が欠けた部分があり目印となっている。
欠けた部分から反時計回りで赤・緑・青・コモンアノードとなっている。
Raspberry Piから色の部分はGPIOのピンを、コモンアノードには3.3Vの電源ピンを挿す。
各色のピンとGPIOのピンの間には抵抗を入れる。
データシートによると、VFは標準値で赤は2.0Vで緑と青は3.2V、IFは標準で20mAを使っている。
GPIOは3.3Vを出力する。
必要な抵抗は(電圧-Vf)/電流で計算出来るので、赤は65Ωで緑と青は5Ωとなるが、それにピッタリな抵抗は無いのでその値の近い上の抵抗を使用する。
とりあえず、回路はこれでおっけー。
Raspberry Piの電源を入れると、この時点でLEDの赤青緑が微妙に光って見える。
今回はコマンドを使って制御してみる。
まず、GPIOの設定をする。
例としてGPIO20を使う。
rootで作業をする。
echo 20 > /sys/class/gpio/export
この作業で/sys/class/gpioにgpio20というディレクトリが生成される。
gpio20内にあるファイルを書き換えて作業をする。
echo out > /sys/class/gpio/gpio20/direction
この作業はgpioを出力モードにしている(逆にoutの部分をinにすると、入力モードになる)。
これにて準備完了だ。
実際のLEDを使用するには3つのピンの設定が必要なので、数字を変えて3回作業する事になる。
それぞれのピンを出力モードにする度にLEDの各色が点灯しているはずだ。
このLEDは赤青緑のピンに電流を流していない時に点灯する。
デフォルトでは電流は流れていないので、出力モードになった時点で光るのだ。
カメラの問題もあるのだが、物凄い明るさである。
目の前に置いておくのはキツイので、紙を四角くして載せたがそれでもキツイ。
echo 1 > /sys/class/gpio/gpio20/value
この作業でピンに電流を流す事が出来る。
0を指定すると電流を止める。
それぞれのピンに1を指定していくと、完全に明かりが消えるはずだ。
紙を載せても明る過ぎて撮影が難しいので、カメラの設定を変えて頑張って撮影してみた。
光の三原色を使って組み合わせで色を出したりも出来る。
残念ながらデジタル出力なので、この時点では点灯か消灯しか出来ない。
手段は色々あるらしいが、それは次回以降の課題だな。
echo 20 > /sys/class/gpio/unexport
最後に、これでピンが開放されてgpio20ディレクトリが消える。
初めての電子回路作りは成功に終わった。
次回は多分プログラムを使って、同じような事をする予定だ。
いつになるかは不明だがな・・・。