今後の為の準備ではあるけど。マオです。

AIやらなんやらでネット関係を色々いじる事が多く、市販ルータやらで標準装備されているDHCPとかDNSだと小回りが効かなくてNASの仮想環境に移行してた。
ところが、あまりにも機能を集約し過ぎてしまって、NASの電源を止めて長時間メンテをするとネットが使えないのね。
メインPCやスマホは作業中の情報収集とかがあるので不便。
なので、物価が上がり続けてるし、早めにRaspberryPiを買って一部機能を移す事にした。
最新RaspberryPiは5なのだが、そこまで性能は必要ないので4のメモリ2GBにしてみた。
1GBは安いけどWebUIとかあると厳しいかもしれないからな。
一応、2も持っているのだが起動にMicroSDが必須。
過去の経験でMicroSDって壊れやすくて何度もOSが吹き飛ばされたので、今回はUSBSSDを買う事にした。
・・・SSDも高い、250GBで9000円ほど。
大きい物を入れるわけじゃないから問題はないけど、細かい事をやるのに便利だから安い時にもっと容量の小さいSSDを沢山手に入れておけばよかったなぁ。
相変わらず初期セットアップがマニュアルの通りに行かなくてアレだが、色々手間をかけて動くようになった。
昔のRaspberryPiは冷却ファンなんて必要なかったんだけど、最近のは必要なんだね。
ケースに付いてたファンを取り付けてみたけど結構うるさい。
機会を見てNoctuaの5V4cmファンに換装したい・・・が、高い。
4000円越えるのよねぇ。
安眠の為に早めに交換したいけど、株ちゃんが頑張ってくれないと買う気にならない(遠い目)
色々と物価が上がって地獄なのだが、ついにRTX5090の在庫が尽きかけて100万円を超え始めたそうな。
去年末に50万少しオーバーで買っていた私は「上がっても70万くらい」と思ってたが倍になるとは。
何か、まだまだ色々な物が上がるようだし必要な物は早めに仕入れるべきだな。
色々と面倒。マオです。
最近メモリ関係が壊れる流れになっているが、今度は音楽鯖として使っている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電源があるが、これを入力してしまうと壊れるので気を付けよう。
以上で、入力も出来るようになった。
次回こそはプログラムを使ってみたいなぁ。

