Raspberry Pi 2 Model B + RaspyPlay4 で組んだ volumio サーバーに OLED キャラクタ液晶を接続してみた

2016-08-22 13.13.23

Raspberry Pi 2 Model B に PCM5122 の DAC を搭載したサウンドカード RaspyPlay4 を載せてミュージックサーバーなるものを作ってみました。今は Raspberry Pi 用に様々な DAC 搭載したボードが販売されていて、載せた例も多数 Web 公開されています。私もそういうのを見て、ちょっと組んでみようと思った次第。

今回購入したのは、たまたま RS の通販見ててみつけた RaspyPlay4 という MikroElektronika 製のボード。runeaudio 対応らしいです。

20160716-091455-0

ボードは完成品なので、Raspberry Pi のコネクタに差してしまえば使えます。今回は volumio を Raspberry Pi にインストールしました。volumio には RaspyPlay4 の設定はありませんが、おなじ PCM5122 搭載のボードを選択したら動いたので問題ないかと思います。

このままで使用しても問題ないのですが、基板中央部に LCD と書いたスルーホールがありましたのでやっぱりキャラク液晶付けてみようと設定開始。最終的には、CPU の平均負荷と、空きメモリを表示するようにしてみました。ボリウムの値は MPD, AirPlay, mixer などのボリュームが複数あって、整理出来てなかったためひとまず CPU 負荷とかを出すことに決定しました。

Raspberry Pi でキャラクタ液晶の制御というと、Python の RPi-GPIO モジュールを使うのが簡単らしいので、Python を使うことにしました。よそ様の Web とかに apt-get install python-rpi.gpio すればインストール出来るようなことが書いてあったので、やってみたところパッケージが見つかりません。あれこれ探しましたが見つけられなかったので、本家のソースからビルドすることにしました。

volumio を入れた Raspberry Pi に ssh ログインして作業開始。raspberry-gpio-python
のサイトから RPi.GPIO-0.6.2.tar.gz をダウンロードして、tar zxvf で展開。ビルドするパッケージもインストールして Rpi.GPIO をインストールします。

# wget https://pypi.python.org/packages/c1/a8/de92cf6d04376f541ce250de420f4fe7cbb2b32a7128929a600bc89aede5/RPi.GPI O-0.6.2.tar.gz
wget の URL は、ブラウザなどで確認したアドレスを wget に渡すか、
いったんブラウザで RPi.GPI O-0.6.2.tar.gz をダウンロードしてから Raspberry Pi にアップロードしてください。
# tar ztvf RPi.GPIO-0.6.2.tar.gz 
# cd RPi.GPIO-0.6.2
# python setup.py install
コンパイル環境が無いのでエラーになる
# apt-get install gcc
# apt-get install arm-linux-gnueabihf-gcc
# apt-get install python-dev
# python setup.py install
ワーニングメッセージが出力されるけど、ビルドは通ってライブラリのインストール成功

今回使用した液晶モジュールは共立で買ってきた OLEDディスプレイ キャラクタ表示タイプ 16文字x2行 黄文字 WEH001602A というものです。

で、付録の紙の初期化をやっても動かず、散々苦労した結果動いた Python ソースコードは以下のとおりであります。Adafrit のサンプルが無かったらマジ捨ててたと思う。

#!/usr/bin/env python
#
# WINSTAR OLED 16x2 CHARACTER DISPLAY
# +----+-----+--------------------|
# | No | Pin | Desc               |
# +----+-----+--------------------|
# |  1 | VSS | GND                |
# |  2 | VDD | 3.3V or 5V         |
# |  3 | NC  | Not Used           |
# |  4 | RS  | 0: Command 1: Data |
# |  5 | RW  | 0: Write   1: Read |
# |  6 | E   | Enable             |
# |  7 | D0  | Data bit 0         |
# |  8 | D1  | Data bit 1         |
# |  9 | D2  | Data bit 2         |
# | 10 | D3  | Data bit 3         |
# | 11 | D4  | Data bit 4         |
# | 12 | D5  | Data bit 5         |
# | 13 | D6  | Data bit 6         |
# | 14 | D7  | Data bit 7         |
# | 15 | NC  | Not Used           |
# | 16 | NC  | Not Used           |
# +----+-----+--------------------|

import RPi.GPIO as GPIO
import time
import subprocess

RS = 7
E  = 8
D4 = 25
D5 = 24
D6 = 23
D7 = 22

DATA = True
COMMAND = False

def main():

    i = 0

    setup()

    while True:

        vmstatout = subprocess.check_output(["vmstat"])
        cpuidle = int(vmstatout[233:236])
        cpubusy = 100 - cpuidle

        lcdSetPos(0,0)
        lcdPutStr("CPU{:>3d}%".format(cpubusy))

        lcdSetPos(1,0)
        memfree = int(vmstatout[174:181])
        lcdPutStr("FREE{:7d}KB".format(memfree))

        lcdSetPos(1,15)
        if i == 0:
            lcdPutStr("-")
        if i == 1:
            lcdPutStr("*")
        if i == 2:
            lcdPutStr("|")
        if i == 3:
            lcdPutStr("*")
        i = i + 1
        if i > 3:
            i = 0

        time.sleep(1)

def setup():

    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(E, GPIO.OUT)
    GPIO.setup(RS, GPIO.OUT)
    GPIO.setup(D4, GPIO.OUT)
    GPIO.setup(D5, GPIO.OUT)
    GPIO.setup(D6, GPIO.OUT)
    GPIO.setup(D7, GPIO.OUT)

    time.sleep(0.05)
    lcdPut4bit(0x03)
    time.sleep(0.005)
    lcdPut4bit(0x08)
    time.sleep(0.005)
    lcdPut4bit(0x02)
    time.sleep(0.005)
    lcdPut4bit(0x02)
    time.sleep(0.005)
    lcdPut4bit(0x08)
    time.sleep(0.005)
    lcdPutByte(0x08,COMMAND)
    time.sleep(0.005)
    lcdPutByte(0x01,COMMAND)
    time.sleep(0.005)
    lcdPutByte(0x06,COMMAND)
    time.sleep(0.005)
    lcdPutByte(0x02,COMMAND)
    time.sleep(0.005)
    lcdPutByte(0x0c,COMMAND)
    time.sleep(0.005)

def lcdPutByte(byte, mode):

    GPIO.output(RS, mode)
    time.sleep(0.0001)
    GPIO.output(D4, GPIO.LOW)
    GPIO.output(D5, GPIO.LOW)
    GPIO.output(D6, GPIO.LOW)
    GPIO.output(D7, GPIO.LOW)

    if byte & 0x10 == 0x10:
        GPIO.output(D4, GPIO.HIGH)
    if byte & 0x20 == 0x20:
        GPIO.output(D5, GPIO.HIGH)
    if byte & 0x40 == 0x40:
        GPIO.output(D6, GPIO.HIGH)
    if byte & 0x80 == 0x80:
        GPIO.output(D7, GPIO.HIGH)

    lcdE()

    GPIO.output(D4, GPIO.LOW)
    GPIO.output(D5, GPIO.LOW)
    GPIO.output(D6, GPIO.LOW)
    GPIO.output(D7, GPIO.LOW)

    if byte & 0x01 == 0x01:
        GPIO.output(D4, GPIO.HIGH)
    if byte & 0x02 == 0x02:
        GPIO.output(D5, GPIO.HIGH)
    if byte & 0x04 == 0x04:
        GPIO.output(D6, GPIO.HIGH)
    if byte & 0x08 == 0x08:
        GPIO.output(D7, GPIO.HIGH)

    lcdE()

def lcdPut4bit(byte):

    GPIO.output(RS, GPIO.LOW)
    time.sleep(0.0001)
    GPIO.output(D4, GPIO.LOW)
    GPIO.output(D5, GPIO.LOW)
    GPIO.output(D6, GPIO.LOW)
    GPIO.output(D7, GPIO.LOW)

    if byte & 0x01 == 0x01:
        GPIO.output(D4, GPIO.HIGH)
    if byte & 0x02 == 0x02:
        GPIO.output(D5, GPIO.HIGH)
    if byte & 0x04 == 0x04:
        GPIO.output(D6, GPIO.HIGH)
    if byte & 0x08 == 0x08:
        GPIO.output(D7, GPIO.HIGH)

    lcdE()

def lcdE():

    time.sleep(0.0001)
    GPIO.output(E, GPIO.HIGH)
    time.sleep(0.0001)
    GPIO.output(E, GPIO.LOW)
    time.sleep(0.0001)

def lcdSetPos(line, col):

    rowOffset = (0x80, 0xc0)
    lcdPutByte(rowOffset[line] | col, COMMAND)

def lcdPutStr(str):

    length = len(str)
    for i in range(length):
        lcdPutByte(ord(str[i]),DATA)

def lcdClear():

    lcdPutByte(0x01, COMMAND)

if __name__ == '__main__':

    try:
        main()
    except KeyboardInterrupt:
        pass
    finally:
        lcdClear()
        lcdSetPos(0,0)
        lcdPutStr("Goodbye!")
        GPIO.cleanup()

vmstat コマンドの結果を液晶に表示しているだけです。この部分を変更することで、表示する内容を変更できます。
Raspberry Pi 3 での動作確認は面倒なのでやっていません。もし動かない場合は def lcdE(): の sleep 時間を増やせば動く確率は上がるかと思います。

root@volumio0726:~# cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/home/volumio/pythonスクリプト.py &

exit 0

Raspberry Pi を立ち上げたときに、自動起動するように rc.local に /home/volumio/pythonスクリプト.py & (pythonスクリプトは作成されたファイル名に置き換えてください)を記述します。

YAMAHA CPX700 II エレアコギターの電池液漏れを修理

2016-05-08 11.21.35

エレアコを長いこと放置していましたら、電池が液漏れしていました。完全放電してまえば液漏れも止むを得えない状況ですが気付くのが遅かったです。掃除では復活しないレベルに到達していました。

2016-05-08 11.21.23

仕方ないので、ヤマハのサポートに交換部品を問い合わせをして型番を教えてもらいました。楽器屋の通販で部品をゲット。新しい電池ボックスがきました。早速新しいのと交換します。

2016-05-08 11.22.30

電池ボックスは爪で引っ掛かっているだけなので楽器本体に傷着けないよう慎重に外します。(本来でしたらコントローラを先に外して電源の線を抜きます。今回は電池ボックスを先に抜いてしまったので順番が逆になっています)

2016-05-08 11.25.18

コントローラのネジを外すとコントローラーは簡単に取り外せます。電池ボックスからきているコネクタを抜きます。

2016-05-08 11.35.07

交換自体は新しい電池ボックスは爪がひっかかるまで入れたら終りです。電源コネクタを接続してコントローラーをネジ止めして完了。このとき、金具を落してしまうとうまくネジ止め出来ませので、裏側から指で押さえるなどしてうまくネジ止めして下さい。

うっかりして液漏れさせてしまいました。長期間使わないときは電池を抜いておきましょう。

TOCOS 超簡単!無線マイコンTWE-Lite で、シリアル透過モードを少し試してみた

2014-09-12 22.22.46

半固定抵抗やボリュームでお世話になっている東京コスモス電機さんから出ている無線モジュールです。無線モジュールといえば XBee ですが、日本橋のシリコンハウス店頭の吊し在庫を見て、お値段と DIP 形状品、PC 接続すぐ出来る USB スティックタイプがあることから TWE-Lite DIP と ToCoStick を購入してみました。

TWE-Lite DIP は無線モジュール単体が DIP 形状の基板に載っているだけのものです。ToCoStick は無線モジュール + FTDI USB シリアル変換がセットになっていて USB メモリみたいなケースに入っているものです。この2つで通信してみようと思うのですが、今回は、標準で書き込まれているアプリではなく、シリアル通信専用アプリで通信してみる実験。普通に USB シリアル変換で直結すれば良いのですが、無線化も使えるかな? とふと思ったのでちょっと試してみます。

ファームの書き込みソフトや、ビルド済みアプリケーションは 東京コスモス電機 ワイヤレス事業部のメーカーサイトからダウンロードします。

2014-09-12 22.32.36

ToCoStick の書き込みは本体を USB ポートに差して TWE-Programmer.exe を起動すれば書き込み出来ますが、TWE-Lite DIP は写真のように USB シリアル変換を接続して TWE-Programmer.exe から書き込みしないといけません。このUSBシルアル変換は、たまたま手持ちのものを使用しましたが、メーカーから USBアダプター TWE-Lite R という専用のものも販売されています。アプリケーションの書き換え手順は省略させていただきます。

今回は、メーカー提供ビルド済みのシリアル通信専用アプリを設定して使用します。PC に差して使う ToCoStick を設定。TeraTerm で ToCoStick のCOMポートを開いてボーレート 115200 で接続します。キーボードから + プラスキー を何回か叩くと↓のようなメニューが出ます。

--- CONFIG/TWE UART APP V1-02-10/SID=0x810069f7/LID=0x00 -E ---
 a: set Application ID (0x67720103)
 i: set Device ID (121=0x79)
 c: set Channels (18)
 x: set RF Conf (41)
 r: set Role (0x0)
 l: set Layer (0x1)
 b: set UART baud (38400)
 B: set UART option (8N1)
 m: set UART mode (T)
 k: set Tx Trigger (sep=0x0a, min_bytes=1 dly=100[ms])
 h: set handle name []
 C: set crypt mode (0)
 o: set option bits (0x00000000)
---
 S: save Configuration
 R: reset to Defaults

i: set Device ID (121=0x79) を、121 にして親機にします。あとm: set UART mode (T) を T(透過モード)にして、S で保存します。

TWE-Lite の設定も ToCoStick と同様に。TeraTerm で TWE-Lite のCOMポートを開いてボーレート 115200 で接続します。キーボードから + プラスキー を何回か叩くと↓のようなメニューが出ます。

--- CONFIG/TWE UART APP V1-02-10/SID=0x810079a5/LID=0x65 -E ---
 a: set Application ID (0x67720103)
 i: set Device ID (1=0x01)
 c: set Channels (18)
 x: set RF Conf (41)
 r: set Role (0x0)
 l: set Layer (0x1)
 b: set UART baud (38400)
 B: set UART option (8N1)
 m: set UART mode (T)
 k: set Tx Trigger (sep=0x0a, min_bytes=1 dly=100[ms])
 h: set handle name []
 C: set crypt mode (0)
 o: set option bits (0x00000000)
---
 S: save Configuration
 R: reset to Defaults

i: set Device ID (1=0x01) を、1 にして子機とします。あと、通信のモードはm: set UART mode (T) を T(透過モード)にして、S で保存します。

2014-09-12 22.35.11

これで、準備が出来たので、適当なターゲットを TWE-Lite DIP に接続して PC と通信出来るかやってみました。今回は Raspberry Pi のマイコンボードのシリアルコンソール出力を TWE-Lite のポートに接続し、PC 側に ToCoStick を差して TeraTerm で ToCoStick の COM ポートをオープン。

スクリーンショット 2014-09-12 22.40.21

無事接続できて、コマンドも打てましたので良しとしましょう。ただし、USBシリアルで PC 直接接続したときに比べて伝送速度は遅いようで ls -l などの表示速度は遅かったです。このため数kバイト一気に流しただけであっさり文字欠落とか発生することがあります。raspberry pi のシリアルコンソールのボーレート落とすのが手っ取り早い解決方法と思います。/etc/inittab の最後に コンソール用 getty の起動があるのでそれを修正して起動しなおせばok。TWE-Lite 設定メニューに再送回数などがあるのでそういうところを調整すればいけるのかと思われますが、無線で送れる速度よりもuart の速度を下げるのがいいです。
マイコン工作物などでは1回あたりせいぜい数十バイト送ればいいと思うのですが、この程度なら無線モジュールのバッファに入るので気にしなくてもちゃんと送れます。
シリアル通信に特化したところだけで実験しましたが、モジュールには GPIO 端子や I2C, アナログ入力など一般的なマイコンの端子も出ていて使用可能なためいろいろ楽しめそうです。

BOSE QC3 の交換品が届いた。

2014-09-06 11.11.21

8月30日にヘッドアームのところのパッドがぼろぼろになった BOSE QuietConfort3 を BOSE 心斎橋プレミアムショップに持って行って修理依頼してきました。受付してもらった時には混んでて1ヶ月くらいかかるかも知れません。とのことでしたが1週間で着。2011年6月に修理依頼した BOSE QC3 の交換品が届いた。 ときと対応時間はかわりない感じでした。

修理は前回よりも少し下って 12,400円 + 消費税(8%) 992円 = 13,392円で送料無料。

2014-09-06 12.49.26

修理依頼して返ってくるのはヘッドホン本体の交換品は当然ですが、ケーブルも付いてきます。今回来たケーブルのピンは今迄の金メッキでは無くシルバーに変更されていました。一番手前が前回修理のときのスタンダードケーブル、向こう2本が今回同梱されていたケーブルです。スタンダードケーブルのほかに、iPhone, iPad 対応のマイク・音量調節対応のケーブルも付いていてちょっと嬉しかったりします。

2008年に買って、2011年6月交換、2014年8月交換なので3年サイクルでんな。

MAX1771 DC/DC 電源をユニバーサル基板に組んでみた

2014-06-15 15.40.01

MAX1771 を使ったスイッチング電源をユニバーサル基板に組んでみました。インダクタの関係と実装の問題で性能は発揮されていません(笑)。フィードバック入力に0.1μF 抱かせてズルしています。ブレッドボードよりかはマシでもはやり無いと電圧安定しない。
写真では、100μH/3.9A 巻線抵抗97mΩ を使用して 180V 出力、負荷 10kΩ をパラって 5KΩ で 6.48W(36mA) は1時間放置でもインダクタの温度は触れてもちょっと熱いくらい。これを、シールドケース入り面実装インダクタ 47μH/7A 巻線抵抗35mΩ に替えると、発熱でみるみる温度上って行って1分もするとアツアツでした。コア材よりもスイッチングタイミングの問題かなぁ。

どちらのインダクタでも、スイッチングに使用している IRF644 の FET は発熱しません。これは今回唯一の救いですな。電流制限用の抵抗 50mΩ をもう少し下げて電流流せる設定にすれば、↑の47μHのインダクタも調子良く動くようになるかも知れませんね。

これはこれで十分パワーが出るので、IN-9 バーグラフネオン管の事前バーンイン用電源にでもなってもらいましょう。4本は余裕、6本もなんとか一気でバーンイン出来そうなので、頒布キットの手順も減らせるし部品も減らせるのでいいですね。

サイレントバイオリン用の駒を削った

2014-05-31 07.33.14

今年の 3 月のことですが バイオリンの駒購入 という記事で、バイオリン用の駒を買ってきたことを書いたのですが、目的はサイレントバイオリンの弦高が、アコースティックバイオリンよりも高くてちょっと使いにくく弦高を下げるためです。サイレントバイオリンの駒を職人に頼むのは微妙だったので今回削りましたが、アコースティックバイオリンの保守は専門家に依頼しています。という補足も入れた上で作業開始。
上の写真の左はアコースティックバイオリンの駒で、右が未加工の駒です。今回はアコースティックバイオリンの駒をお手本に削っていきます。

2014-05-31 07.44.30

新品の駒にお手本の駒を重ねてエンピツで型を取ります。それで、余分なところをカット。


2014-05-31 07.53.19

ピントがどっかいってしまい見にくいですが、厚さの比較。最初は全体の厚さを減らすために、カンナで全体を削ります。

2014-05-31 08.42.10

カンナひっくりかえして、鰹節削る感じで駒を動かして全体の厚みを減らしました。指を削らないよう注意。

2014-05-31 08.41.07

で、だいたい厚みが同じくらいなったところ。

2014-05-31 09.16.42

このあと、小刀で弦のところが狭くなるように荒削りしてヤスリをかけるというのを繰替えして全体の形をあわせていきます。

2014-05-31 09.38.48

お手本をマネしてはいけない場所が1ヶ所。駒の足の角度です。アコースティックバイオリンは R がありますが、今回装着する場所はピックアップです。写真のように水平なので、足は平にします。

2014-05-31 10.07.11

削って、ヤスリがけを繰り返して完成です。アコースティックバイオリンの弦高と、今回削ったサイレントバイオリン用の駒の弦高です。

  • G 6.5mm
  • D 6.5mm
  • A 5.5mm
  • E 4.8mm
  • G 6.3mm
  • D 6.2mm
  • A 5.4mm
  • E 4.3mm

ちょっと低くなってしまいましたか。弾いてみて様子見してみたいと思います。

2014-05-31 11.16.48

使った主な道具は小刀です。あとはカンナと彫刻刀をちょっと使ったのとヤスリがけにペーパー、リューターにもヤスリを着けてます。

バイオリンの駒購入

2014-03-02 14.09.23

サイレントバイオリンの弦高がアコースティックよりも高いため、駒削ってみようと思いたちます。アコバの弦高とサイレントの弦高を測ってみると

  • G 6.5mm
  • D 6.5mm
  • A 5.5mm
  • E 4.8mm
  • G 7.5mm
  • D 7.5mm
  • A 6.5mm
  • E 5.0mm

サイレントのほうが約 1mm 高くなっています。基本スチール弦使うことで、弦の振幅がおおきくなるから、ビビリ防止のため高めの設定?とか思いつつ普段はナイロン弦なのでアコースティックバイオリン程度まで弦高下げたいのが正直なところ。

ただ、これはそのままでは使えなくて加工しないといけません。

2014-03-02 14.09.52

このぶ厚い駒を

2014-03-02 14.15.55

これくらいの厚さに削るのと、弦乗るところの位置決め。高さあわせと、足のフィッティングですね。専用の道具は無いので小型のナイフと小型のカンナとリューター使ってなんとかしようと思います。

天王寺で買い物

2014-02-15 14.56.06
2014-02-15 14.55.46

文具コーナーいいですよね。鉛筆削りいいですよね。ついつい買っちゃいます。ハルカス 5 階の MARUZEN で買ったのは KUM Automatic Long Point で、写真のとおり 1 番で木を削って、2 番で芯をお好みの鋭さに削るというやつで、ちょびっとマニアックな削り方の鉛筆削り。あと、芯ホルダー使う人は横サイドの小型削りで芯だけ削れます。おまけに替刃も2枚内蔵されています。

2014-02-15 14.56.19

ソフマップで何故かシェーバーの替刃を購入。結構年数経ってる型番のシェーバーなのと、たまたま見つけたこの替刃。やっぱり購入しておきましょう。という判断です。充電の電池 ESLA50L2507N が入手出来れば、さらにシェーバーの延命が可能かな?というところ。

2014-02-15 14.56.30
2014-02-15 14.56.53

キューズモールの島村楽器さんで、ギターの弦と国道25号線デザインのピックを購入。ピックは結構前から売ってた記憶があるので持ってる人多いんじゃないかな。

20130309 ヴァイオリンレッスン120回目(今の教室30回目)

スギ花粉ピーク、ヒノキもミックス。黄砂に PM2.5 でギャース。教室行く途中大阪市内のほう見渡せるポイントありますが、今日は大阪市内ほとんど見えないくらいすごく霞んでいました。目ぇ痒い

  • 楽器のチューニング
  • 小野アンナ ヴァイオリン音階教本 P20 G Dur音階練習
  • 山岡耕筰著 ステップ式 ヴァイオリン入門 III P22「聖夜」
  • カイザー練習曲 4番

サードポジションの練習曲は「聖夜」 クリスマスの曲です。前の練習曲とこの曲で、短三度のポジション移動を練習します。移動する練習のため楽譜のほうもあちこちに指番号入ってます。移動時にピッチ外さないよう3回ほど練習してとりあえず OK なのですが、中途半端に知ってる曲だと音を区切るところが楽譜と違ってあいまいになってしまいました。

カイザー練習曲 4番は先週に引き続き、2回目のレッスン。今日もまずは四分音符の長さでボゥイングしながら音取り。楽譜全体2回流して、3と4の指、2と4の指の繰り返しなどをポイントレッスンしていただき、指の開きを確認。次に私の楽譜にはなかったのですが、ボゥイングのパターン違うやつで弾けるかどうかやってみるなどの練習を経まして、まぁまぁピッチ取れてきてるので OK というステータスになりました。次は5番にはいります。

次回は3月23日の予定。