回路図を修正 [DesignSpark PCB]
今のDACのPCBには、GPIOボタンへの引き出し用コネクタがありません。基板を発注するかはまだ未定ですが、回路図とPCBを更新したいと思います。まずは回路図からです。
DSを起動します。以前回路図とPCBを開いたので、自動的に開きます。
部品を追加するので、インタラクションバーを表示させます。メニューバーからViewメニューの、Intreraction Barを選択します。
インタラクションから、Add Componentタブを選択します。
部品を追加するので既存の部品を移動させます。部品の外形をクリックして、マウスで移動させます。
インタラクションのAdd Componentタグで表示される部品から、挿入する部品を選択し、回路図にドラックアンドドロップします。
部品の向きを右に変えます。部品の外形をマウスで選択し、右クリックのメニューからFlipを選択します。
向きが変わります。
右クリックでメニューからプロパティを選択し、コンポーネント名、パッケージ名のチェックボックスを外します。
配線を書きます。Add Schematic Connectionを選択します。
部品の×印をクリックして配線します。
配線が終わりました。
次はPCBです。
DSを起動します。以前回路図とPCBを開いたので、自動的に開きます。
部品を追加するので、インタラクションバーを表示させます。メニューバーからViewメニューの、Intreraction Barを選択します。
インタラクションから、Add Componentタブを選択します。
部品を追加するので既存の部品を移動させます。部品の外形をクリックして、マウスで移動させます。
インタラクションのAdd Componentタグで表示される部品から、挿入する部品を選択し、回路図にドラックアンドドロップします。
部品の向きを右に変えます。部品の外形をマウスで選択し、右クリックのメニューからFlipを選択します。
向きが変わります。
右クリックでメニューからプロパティを選択し、コンポーネント名、パッケージ名のチェックボックスを外します。
配線を書きます。Add Schematic Connectionを選択します。
部品の×印をクリックして配線します。
配線が終わりました。
次はPCBです。
Volumio2で音楽5 [Volumio]
有機ELディスプレイに曲名や歌手名を出すためにプログラムを書きます。
以下のプログラムを書きます。
次に、起動時にデーモンとして動くように登録します。
以下の入力します。
コマンドを入力して有効にします。
再起動すれば、アルバム名、曲名、歌手名、サンプルレートが表示されます。
root@volumio:~# /var/tmp/mkinitramfs_8pJogT/bin/vi SSD1306.py
以下のプログラムを書きます。
#!/usr/bin/python # -*- coding: utf-8 -*- import os import sys import smbus import time import signal from PIL import Image from PIL import ImageDraw from PIL import ImageFont from socketIO_client import SocketIO PIDFILE='/var/run/SSD1306.pid' class SSD1306(object): DISPLAYOFF = 0xAE DISPLAYON = 0xAF DISPLAYALLON = 0xA5 DISPLAYALLON_RESUME = 0xA4 NORMALDISPLAY = 0xA6 INVERTDISPLAY = 0xA7 SETREMAP = 0xA0 SETMULTIPLEX = 0xA8 SETCONTRAST = 0x81 CHARGEPUMP = 0x8D COLUMNADDR = 0x21 COMSCANDEC = 0xC8 COMSCANINC = 0xC0 EXTERNALVCC = 0x1 MEMORYMODE = 0x20 PAGEADDR = 0x22 SETCOMPINS = 0xDA SETDISPLAYCLOCKDIV = 0xD5 SETDISPLAYOFFSET = 0xD3 SETHIGHCOLUMN = 0x10 SETLOWCOLUMN = 0x00 SETPRECHARGE = 0xD9 SETSEGMENTREMAP = 0xA1 SETSTARTLINE = 0x40 SETVCOMDETECT = 0xDB SWITCHCAPVCC = 0x2 OLED_WIDTH = 128 OLED_HEIGHT = 64 OLED_PAGE_COUNT = 8 OLED_SIZE = ( OLED_WIDTH , OLED_HEIGHT ) OLED_TARGET = 0x3C OLED_CMDMODE = 0x00 OLED_DATAMODE = 0x40 def command(self, *cmd): self.__bus.write_i2c_block_data(self.OLED_TARGET,self.OLED_CMDMODE,list(cmd)) def cleanup(self): self._hide() self.clear() self.__bus.close() def clear(self): self.display(Image.new("1",self.OLED_SIZE)) def show(self): self.command(self.DISPLAYON) def hide(self): self.command(self.DISPLAYOFF) def contrast(self,level): self.command(self.SETCONTRAST,level) def __init__(self): self.buffer = [0] * self.OLED_PAGE_COUNT * self.OLED_WIDTH; self.__bus = smbus.SMBus(1) def init(self): self.command( self.DISPLAYOFF, self.SETDISPLAYCLOCKDIV, 0x80, self.SETMULTIPLEX, 0x3F, self.SETDISPLAYOFFSET, 0x00, self.SETSTARTLINE, self.CHARGEPUMP, 0x14, self.MEMORYMODE, 0x00, self.SETSEGMENTREMAP, self.COMSCANDEC, self.SETCOMPINS, 0x12, self.SETPRECHARGE, 0xF1, self.SETVCOMDETECT, 0x40, self.DISPLAYALLON_RESUME, self.NORMALDISPLAY) self.contrast(0xCF) self.clear() self.show() def display(self,image): pix = image.load() index = 0 for page in range(8): for x in range(128): bits = 0 for bit in [0, 1, 2, 3, 4, 5, 6, 7]: bits = bits << 1 bits |= 0 if pix[(x, page*8+7-bit)] == 0 else 1 self.buffer[index] = bits index += 1 self.command(self.COLUMNADDR, 0x00, 128-1, self.PAGEADDR, 0x00, 8-1) for i in range(0, len(self.buffer), 16): self.__bus.write_i2c_block_data(self.OLED_TARGET,self.OLED_DATAMODE,self.buffer[i:i+16]) class socketio(object): def __init__(self): self.album = '' self.title = '' self.artist= '' self.samplerate = '' self.bitdepth = '' def init(self): self.socketIO = SocketIO('localhost', 3000) self.socketIO.on('pushState', self.on_pushState) self.ssd = SSD1306() self.ssd.init() def max_length(self,font,text): length = len(text) for i in range(0,length-1,1): w = font.getsize(text[0:i])[0] if w > 128: return i + 1 return length def on_pushState(self,args): s = '' b = '' if 'samplerate' in args : s = args['samplerate'] else: s = '' if 'bitdepth' in args: b = args['bitdepth'] else: b = '' if self.album == args['album'] and self.title == args['title'] and self.artist == args['artist'] and self.samplerate == s and self.bitdepth == b : return self.album = args['album'] self.title = args['title'] self.artist= args['artist'] self.samplerate = s self.bitdepth = b image = Image.new('1', (self.ssd.OLED_WIDTH, self.ssd.OLED_HEIGHT),0) draw = ImageDraw.Draw(image) draw.rectangle((0,0,self.ssd.OLED_WIDTH-1, self.ssd.OLED_HEIGHT-1), outline=0, fill=0) jpfont = ImageFont.truetype('/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf',12, encoding="unic") draw.text((0,0 ), self.album , font=jpfont, fill=1) e = 0 length = len(self.title) e = self.max_length(jpfont,self.title) if e < length: draw.text((0,12), self.title[0:e-2] , font=jpfont, fill=1) draw.text((0,24), self.title[e-2:length] , font=jpfont, fill=1) else: draw.text((0,12), self.title , font=jpfont, fill=1) draw.text((0,36), self.artist, font=jpfont, fill=1) if 'samplerate' in args and 'bitdepth' in args: f = '%s | %s' % (self.samplerate, self.bitdepth) #draw.text((0,50), str(self.samplerate) + '|' + str(self.bitdepth), font=jp draw.text((0,50), f, font=jpfont, fill=1) else: draw.text((0,50), '', font=jpfont, fill=1) self.ssd.display(image) print('-----') print(self.album.encode('utf-8')) print(self.title.encode('utf-8')) print(self.artist.encode('utf-8')) if 'samplerate' in args and 'bitdepth' in args: #print(str(self.samplerate) + "|" + str(self.bitdepth)) print(f) else: print('-NaN-') print('-----') def setRandom(self): self.socketIO.emit('setRandom',{'value' : 'true'}) self.socketIO.emit('getState') while True: self.socketIO.wait(seconds=1) def main_loop(): volumio = socketio() volumio.init() volumio.setRandom() os.remove(PIDFILE) sys.exit() def signal_handler(signal,handler): os.remove(PIDFILE) sys.exit() def daemonize(): pid=os.fork() if pid > 0: pidf = open(PIDFILE,'w') pidf.write(str(pid)+'\n') pidf.close() sys.exit() if pid == 0: signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) main_loop() if __name__ == '__main__': daemonize()
次に、起動時にデーモンとして動くように登録します。
root@volumio:~# /var/tmp/mkinitramfs_8pJogT/bin/vi /etc/systemd/system/ssd1306.service
以下の入力します。
[Unit] Description=Volumio2 SSD1306 display [Service] ExecStart=/root/SSD1306.py Restart=always Type=forking PIDFile=/var/run/SSD1306.pid [Install] WantedBy=multi-user.target
コマンドを入力して有効にします。
root@volumio:~# chmod +x SSD1306.py root@volumio:~# systemctl enable ssd1306.service
再起動すれば、アルバム名、曲名、歌手名、サンプルレートが表示されます。
DesignSpark PCB8.0で7.2で作ったファイルを開いてみる [DesignSpark PCB]
ライブラリも無事に移行できたので、7.2で作った回路図とPCBが開くか確認してみます。
DesignSpark PCBを起動し、ファイルを開きます。 ファイルを選択します。CTRLキーを押しながら2つのファイルを選択します。 回路図もちゃんと表示できているようです。 PCBも大丈夫そうです。 これで安心して作業できます。
DesignSpark PCBを起動し、ファイルを開きます。 ファイルを選択します。CTRLキーを押しながら2つのファイルを選択します。 回路図もちゃんと表示できているようです。 PCBも大丈夫そうです。 これで安心して作業できます。
DesignSpark PCB8.0のライブラリ移行 [DesignSpark PCB]
まあ、大したことではないのですが、バージョン7.2で作ったライブラリを8.0に移行しました。コピーしただけですが。
バージョン7.2のフォルダにあるファイルを、バージョン8.0のフォルダへコピーします。
DesignSparkを起動してライブラリ管理を確認します。コピーしたファイル名を選択します。
部品を選択して、表示されるのを確認します。
問題なさそうです。次は過去の資産を確認したいと思います。
バージョン7.2のフォルダにあるファイルを、バージョン8.0のフォルダへコピーします。
DesignSparkを起動してライブラリ管理を確認します。コピーしたファイル名を選択します。
部品を選択して、表示されるのを確認します。
問題なさそうです。次は過去の資産を確認したいと思います。
DesignSpark PCB8.0のインストール [DesignSpark PCB]
DesignSpark PCBのバージョンが上がりましたので、インストールしてみました。バージョンは7.2から8.0になったようです。古い7.2はアンインストールしました。
https://www.rs-online.com/designspark/pcb-download-and-installation からファイルをダウンロードします。ダウンロードしたファイル「DesignSparkPCB_v8.0.exe」をダブルクリックして、インストーラを起動します。
NEXTボタンで次へ遷移します。
基本、NEXTボタンでOKです。
ユーザ名にメールアドレスを設定します。
インストール完了です。
起動するとこんな画面が出てきます。
次は、バージョン7.2で作ったライブラリを持ってきて、以前作ったプロジェクトを呼び出します。なお、初期インストールは、アクティベーションが必要です。以下のURLで詳しくはチュートリアルをみてください。
https://designspark.zendesk.com/hc/ja/categories/201145765-DesignSpark-PCB
https://www.rs-online.com/designspark/pcb-download-and-installation からファイルをダウンロードします。ダウンロードしたファイル「DesignSparkPCB_v8.0.exe」をダブルクリックして、インストーラを起動します。
NEXTボタンで次へ遷移します。
基本、NEXTボタンでOKです。
ユーザ名にメールアドレスを設定します。
インストール完了です。
起動するとこんな画面が出てきます。
次は、バージョン7.2で作ったライブラリを持ってきて、以前作ったプロジェクトを呼び出します。なお、初期インストールは、アクティベーションが必要です。以下のURLで詳しくはチュートリアルをみてください。
https://designspark.zendesk.com/hc/ja/categories/201145765-DesignSpark-PCB
Volumio2で音楽4 [Volumio]
それでは、有機ELディスプレイとボタンを接続します。接続は以下の通りしました。
Volumio2を起動し、プラグインの設定をします。プラグインでGPIOボタンの設定を追加します。
インストールを実行し、設定を行います。
どの操作をどのGPIOに接続されたボタンに割り振るか設定をします。
ボリュームをソフトウェアで実行する場合は、プレイバックオプションで設定をします。しかしながら、設定してもうまくボリュームを操作することができませんでした。私の場合、アンプで音量調節をするので、GPIOボタンの設定とボリュームのソフトウェアでの設定はしないようにします。
あとは、有機ELディスプレイに表示するプログラムを書くだけです。
Volumio2を起動し、プラグインの設定をします。プラグインでGPIOボタンの設定を追加します。
インストールを実行し、設定を行います。
どの操作をどのGPIOに接続されたボタンに割り振るか設定をします。
ボリュームをソフトウェアで実行する場合は、プレイバックオプションで設定をします。しかしながら、設定してもうまくボリュームを操作することができませんでした。私の場合、アンプで音量調節をするので、GPIOボタンの設定とボリュームのソフトウェアでの設定はしないようにします。
あとは、有機ELディスプレイに表示するプログラムを書くだけです。
Volumio2で音楽3 [Volumio]
ログインしたら、rootユーザにスイッチします。
つぎに、ライブラリをインストールするための準備をします。以下備忘録ですので、現時点で通用 するかは確認できていません。
apt-getコマンドで取得するサーバの情報を追加します。viコマンド(エディタ)が普通のLinuxにある場所にありませんので、フルパスで指定します。
volumio@volumio:~$ sudo su - [sudo] password for volumio: (パスワードはvolumio) root@volumio:~#I2Cインタフェースに有機ELディスプレイを接続した状態で、i2cdetectコマンドで 接続状態を確認します。
root@volumio:~# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- root@volumio:~#I2Cインタフェースのアドレスが3Cであることがわかります。
つぎに、ライブラリをインストールするための準備をします。以下備忘録ですので、現時点で通用 するかは確認できていません。
apt-getコマンドで取得するサーバの情報を追加します。viコマンド(エディタ)が普通のLinuxにある場所にありませんので、フルパスで指定します。
root@volumio:~# /var/tmp/mkinitramfs_8pJogT/bin/vi /etc/apt/sources.list以下の内容を追加します。
deb http://archive.raspberrypi.org/debian/ wheezy mainapt-getコマンドでアップデートしてバージョン情報を更新します。エラーが出るのでapt-keyコマンドでキーを登録します。
root@volumio:~# apt-get update root@volumio:~# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 82B129927FA3303E root@volumio:~# apt-get update必要なライブラリをapt-getコマンドでインストールします。
root@volumio:~# apt-get -y install python-daemon python-smbus --force-yes root@volumio:~# apt-get -y install python-imaging fonts-takao-gothicつぎに手動でライブラリをインストールします。pythonのインストーラであるpipコマンドを インストールします。
root@volumio:~# wget https://bootstrap.pypa.io/get-pip.py root@volumio:~# python get-pip.pyVolumio2と通信するのに必要なsocketIOをダウンロードしてインストールします。
root@volumio:~# wget https://pypi.python.org/packages/12/d4/abeb2596c2f16276c66910362b27d04b8d2cf12a746dcccf1d00de3f691b/socketIO-client-0.7.2.tar.gz#md5=ecdbfa4cc00118d2948632cd50b10735 root@volumio:~# tar xvf socketIO-client-0.7.2.tar.gz root@volumio:~# cd socketIO-client-0.7.2 root@volumio:~# pip install -U socketIO-client root@volumio:~# cd ..これでソフトを動かす準備ができました。そういえば、I2Cインタフェースの接続方法がまだでした。つぎは、このあたりを書きたいと思います。
Volumio2で音楽2 [Volumio]
曲名を出すのに小型のディスプレイをI2Cと呼ばれるインタフェースでRaspberry piと接続します。使用しているディスプレイは、SSD1306と呼ばれるコントローラをのせた有機ELディスプレイです。私は、aitendoのこれ、http://www.aitendo.com/product/14958 を使っています。
I2Cとの接続をコントロールするため、pythonと呼ばれるプログラム言語を使用しました。インターネットでいろいろキーワード検索すると、やりたいことの断片的な情報があるため、それをつなぎ合わせて目的のものを作成します。
ライブラリをインストールするために、Linuxにリモートログインする必要があります。Volumio2をネットワークに接続すると、おそらくvolumio.localというマシン名が使えるようになります。PCからTeraTermなどのソフトを使用して接続します
ユーザとパスワードはどちらも、volumio、です。
無事、リモートログインできれば、以下のようなプロンプトが出てきます。
これで、ライブラリをインストールすることができます。
I2Cとの接続をコントロールするため、pythonと呼ばれるプログラム言語を使用しました。インターネットでいろいろキーワード検索すると、やりたいことの断片的な情報があるため、それをつなぎ合わせて目的のものを作成します。
ライブラリをインストールするために、Linuxにリモートログインする必要があります。Volumio2をネットワークに接続すると、おそらくvolumio.localというマシン名が使えるようになります。PCからTeraTermなどのソフトを使用して接続します
ユーザとパスワードはどちらも、volumio、です。
無事、リモートログインできれば、以下のようなプロンプトが出てきます。
これで、ライブラリをインストールすることができます。
Volumio2で音楽1 [Volumio]
私の家の音楽環境は、Raspberry piを使った自作のネットワークオーディオです。
Raspberry piに自作のDACを作り、Volumio2と呼ばれる音楽再生ソフト(Linux)を使って実現しています。
Volumio2は、Webブラウザを通して操作するようになっています。でも、普段はPCを起動しなくても使いたいという欲求にかられます。Volumio2のプラグインで、再生、曲送りなどボタンをGPIOで操作することが可能なのですが、曲名など表示する機能がありません。そこで、Raspberry piに小型のディスプレイを接続して、自作のプログラム(インターネットをあちこち調べました)で表示させることができました。トップ画面の写真がそれです。
自作のDACは、PCM5102と呼ばれるICを使用して、何度か試行錯誤して作ってきました。それを元に人生初めての基板の設計をCADで行い、基板発注して作りました。無事1回の発注で動かすことができました。いろいろと調べたことを今後、つらつらと書いていきます。
Volumio2は、Webブラウザを通して操作するようになっています。でも、普段はPCを起動しなくても使いたいという欲求にかられます。Volumio2のプラグインで、再生、曲送りなどボタンをGPIOで操作することが可能なのですが、曲名など表示する機能がありません。そこで、Raspberry piに小型のディスプレイを接続して、自作のプログラム(インターネットをあちこち調べました)で表示させることができました。トップ画面の写真がそれです。
自作のDACは、PCM5102と呼ばれるICを使用して、何度か試行錯誤して作ってきました。それを元に人生初めての基板の設計をCADで行い、基板発注して作りました。無事1回の発注で動かすことができました。いろいろと調べたことを今後、つらつらと書いていきます。