読者です 読者をやめる 読者になる 読者になる

pythonで印刷するメモ(mac・linux編)

python

今回はpythonから何かをプリンターで印刷したい時にどうすればいいかについてです。
自分用のメモ書きなので適当な説明です。

テキストを印刷してみる

import subprocess

# ただのテキスト
text = 'print out message'
# ファイルから印刷する場合
text = open('text.txt', 'r').read()

p = subprocess.Popen('lpr', stdin=subprocess.PIPE)
p.communicate(text)
p.stdin.close()

lprコマンドにパイプしてデータを渡すだけで印刷ができました。とても簡単です。

画像を印刷してみる

今回やりたかったのは、画像を生成してそれをファイルとして書き出さずにそのまま印刷する方法です。PILで適当な画像を生成して印刷してみます。

import subprocess
from PIL import Image
from StringIO import StringIO

buf = StringIO()

# create an image
screen = (500, 500)
bgcolor = (0x00, 0x00, 0x00)
img = Image.new('RGB', screen, bgcolor) 

# save this image to memory as a png image
img.save(buf, 'PNG')

# print out
p = subprocess.Popen('lpr', stdin=subprocess.PIPE)
p.communicate(buf.getvalue())

p.stdin.close()
buf.close()

StringIOを使ってメモリ上に画像ファイルを作って、それをlprコマンドに渡してあげることで印刷することができました。

Linuxデバイスドライバを書いてみる(2)

デバイスドライバ

前回は最小構成のカーネルモジュールを作ってみました。
taltalp.hatenablog.jp

今回はデバイスを/devに登録して,ユーザー空間からデバイスドライバに触れてみたいと思います。

続きを読む

Linuxデバイスドライバを書いてみる(1)

デバイスドライバ

この間、O'ReillyのLinux Device Driversを読んでみました。
忘れないうちにメモを取っておこうと思います。

最終的にはZYNQ上で動くドライバを書くことが目的ですが、今回はとりあえず仮想環境上で動くCentOS用のドライバを書いて基本的な開発方法を勉強していこうと思います。

続きを読む

FPGAの差動入力でAD変換

FPGA zynq

はじめに

XilinxのXcell Journal 94号に掲載されている「1つのザイリンクス FPGA で数百の信号をデジタル化する方法」がとてもおもしろそうだったので実際に実装してみました。
Xcell Journal 日本語版
差動入力1つと抵抗,コンデンサがそれぞれ1つだけでΔ変調器型のADCを作ることができるため1つのFPGAにたくさん搭載することができます。
今回はVivado2015.4で開発してZyboで動かしました。

仕組み

回路図は下のようになります。差動アンプの+側にアナログ信号を入力し,-側にはRCローパスフィルタの出力を接続しています。+側と-側の電位を比較してアンプから0または1の信号が出力され,そのパルスがローパスフィルタを通してフィードバックされます。そうすると+側と-側の電位差がほぼ0となるところで安定します。このとき,デジタル出力から出るパルスはディジタルローパスフィルタを通すことでAD変換をすることができます。
f:id:taltalp:20160619043945p:plain

ソースコード

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library UNISIM;
use UNISIM.VComponents.all;

entity adc is
    Port ( clk_240m: in STD_LOGIC;
	   sigin_p : in STD_LOGIC;
           sigin_n : in STD_LOGIC;
           sigout : out STD_LOGIC;
           LED : out STD_LOGIC);
end adc;

architecture Behavioral of adc is
    signal sig : std_logic;
begin

    -- 差動入力
    ibufds_1_i : IBUFDS
        generic map(
            DIFF_TERM => FALSE,
            IBUF_LOW_PWR => FALSE,
            IOSTANDARD => "DEFAULT"
        )
        port map(
            O => sig,
            I => sigin_p,
            IB => sigin_n
        );
    
    process (clk_240m) begin
        if (clk_240m'event and clk_240m='1') then
            sigout <= sig;
        end if;
    end process;

    LED <= sig;
end Behavioral;

I/O Planning

ピンアサイン時にいくつか注意点があるため各ピンについて説明をしていきます。
clk_240m : 240MHzのクロックを入れます。zyboの場合PS側からPL側に供給される100MHzまたはPL側に直接供給される125MHzの信号からClocking Wizard等を用いて240MHzを生成します。
sigin_p, sigin_n : 差動入力に対応したピンに割り当てる必要があります。またI/O StdはTMDS_33に設定しました。
sigout : ここから出た信号はRCローパスフィルタに繋がります。LVCMOS33に設定し,Drive Strengthを16に設定しました。 Xcellの内容には24に設定したと書かれていますが,zynq-7010では16が最大なようです。これをオーバーしないように外付けの抵抗の値を決める必要があります。また,Slew TypeはFastにOff-Chip TerminationはNONEに設定しました。
LED : どこでもいいのですが,今回はとりあえずLEDにデジタル信号を入れてみました。

回路

上に示す回路図のRとCは下記のように設定しました。
R = 10kΩ
C = 33pF
3.3Vの電圧をRCに入力するときに16mAの電流値を超えないように設定しています。周波数特性は特に気にせず適当に決めています。

実験

アナログ入力に可変抵抗器で0~3.3Vまでの信号を入力してLEDの光り方をみてみました。
電圧が低いと暗くなり,電圧が高くなると明るくなります。原理はPWM調光と同じような感じです。(PDM信号)

まとめ

FPGAを使ってADCがとても簡単に、しかも大量に実装することができます。デジタルローパスフィルタを入れて数値に変換すればマルチチャンネルな簡易オシロスコープなんかも作ることができそうです。プリミティブを使ってアナログフロントエンドを作るというのはとてもおもしろいですね。

zynqでlinuxをブートするために必要なファイルは何か

FPGA zynq

はじめに

zyboやzedboardに載ったzynq上でlinuxを動かす際に必要なファイルについて,各ファイルがどんな意味を持つのか簡単にまとめていこうと思います。

zynqでlinuxを動かす

zynqでlinuxを動かす方法についてはいろいろなサイトで紹介されているのでそちらを参考にしてください。
1. Zynq LinuxからFPGAを利用するって? – yuki-sato.com
zybo でlinux - ippeiの日記

必要なファイルについて

zynqでlinuxを動かすためには,
・boot.bin
・devicetree.dtb
・uimage
・uramdisk.image.gz
の4つが最低限必要なようです。
今回はこれらの4つをSDカードに入れて,zynq上でlinuxを起動するとします。

ブートプロセス

zynqをSDカードからのブートモードにした場合,まずPS側でSDカードを読み込みboot.binを探すようです。boot.binにはSDKで作成したFSBL(First Stage Boot Loader)とvivadoやISEなどで作成したbitstream,ブートローダu-boot.elf入っています。PS側でFSBLを読み込み,その後PS側がPL側をコンフィギュレーションします。

次にu-boot.elfが読み込まれ,Linuxカーネルイメージ,デバイスツリーが読み込まれます。

バイスツリー(devicetree.dtb)

devicetree.debはARM Linux向けにデバイスのアドレスやクロックなどの設定が書かれたファイルのことです。AXIバスを通して自作のデバイスを接続した場合にはアドレスやデバイス名を書き加える必要があります。CPUのクロックなども設定することができます。

Linuxカーネル(uimage)

uimageはLinuxカーネルで,第2ステージでu-bootが起動したあとに起動します。

RAMディスク(uramdisk.image.gz)

Linuxカーネル起動後,uramdisk.image.gzがRAMに展開されマウントされます。uramdiskにはLinuxファイルシステムが入っています。

raspberry pi zero の購入方法とかインストール方法とか

raspberry pi

先日、はやりの$5パソコンraspberry pi zeroを入手しました.
購入方法やOSのインストール方法などを簡単に紹介します.

1.購入方法

raspberry pi zeroはまだ日本では売っていないようですので海外の通販で買います.

続きを読む

ESP-WROOM-02を赤外線リモコンに(2.解析編)

電子工作 ESP-WROOM-02

前回、ESP-WROOM-02で赤外線通信を行うための準備をしました.
taltalp.hatenablog.jp

今回は実際に回路を組んで、赤外線リモコンのコードを解析してみようと思います。
(といってもサンプルプログラムを動かすだけです)

続きを読む