スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:--】 | スポンサー広告 | page top↑
Matrix LED で時計(2) ソース付き


 秋月電子通商で大型の赤色LEDドットマトリクス(8×8)38x38mm TOM-1588BH (http://akizukidenshi.com/catalog/g/gI-00963/) を100円で買ってきた。で、少しまともな時計にしてみようとして見たのだが、上手くいかなかった。あろうことかLEDに付属していたデーターシート(ムービーの背景に写っている)が違っていたのだ。ピンを一つ一つ当たって調べると、16のピンのうち、8つも違っている。
【データシート】
Col.: 1 .. 8
Pin No.: 13, 3, 4, 10, 6, 11, 15, 16
Row: 1 .. 8
Pin No.: 9, 14, 8, 12, 1, 7, 2, 5
となっていたが、実際は
Col.: 1 .. 8
Pin No.: 12, 3, 4, 15, 6, 14, 10, 9
Row: 1 .. 8
Pin No.: 16, 11, 8, 13, 1, 7, 2, 5
だったのだ。配線をし直して何とか表示できた。やれやれ

 さて、Rubyのプログラムだが、文字フォントを返すクラスを作成し、それで得たフォントを横に並べ、8Col.ずつずらして表示している。
ソースは以下に転載しますが、Rubyの言語仕様では変数や引数の型のチェックが厳格でない(というか引数もオブジェクト)ので、文字フォントの配列を返すメソッドの呼出では、.getFont("A")や、.getFont(a) のように、文字定数や数値変数を引数にすることができる。
 また、メソッドが返すフォントデータは、配列なのだが、最初の要素(font[0])には文字フォントの有効文字幅の数値、次の要素(font[1])には、36の要素をもつ配列すようにしている。要素の一部が二次元配列になるという変則的な多次元配列も使えるのだ。これは結構便利だけどバグを生みやすいかもしれないな。
【プログラムソースは続きに】
続きを読む
スポンサーサイト
【2009/11/29 20:42】 | Gainer関係 | トラックバック(0) | コメント(2) | page top↑
Gainer+マトリクスLEDで時刻を表示


 Gainer でマトリクスLEDを動かすプログラムをRubyで書いて遊んでおります。で、少し時間が掛かったけど(Rubyも勉強しながらだしね)時刻を表示するプログラムができました。
 数字等の必要なフォントは4×7ドットで自作し、数値に合わせたフォントを返すモジュールを作成して呼び出して、一文字ずつ順に表示しております。
 ま、あまり実用的ではありませんが、動くだけで喜んでおります。我ながら単純ですな。(笑)
【2009/11/23 22:26】 | Gainer関係 | トラックバック(0) | コメント(0) | page top↑
Gainer 今度はマトリクスLED
imfj on Matrix LED Gainerを始めた人が通る道を順番に行っているらしいけど...
今度はマトリクスLEDに挑戦してみた。購入したのは秋月電子通商で売っていた BU5004-RG という 8×8 の二色(赤・緑)のもの。
赤の単色はありきたりだと思って二色にしたのが問題で、そのままではブレッドボードに載らないのだった。色々試行錯誤した結果、ユニバーサル基板(盛岡エレパーツで売っていた)を使ってにヘッダーピンに接続して、ブレッドボードに載るように加工した。Matrix LEDの3列×8個のピンの配置が微妙で、真ん中の列がそのままでは基盤の穴に合わないので、曲げて無理矢理入れたり、半田付けに苦労して何とか使えるようになった。(半田付けが汚いけど...)
 で、プログラムは ruby でサンプルを参考にして、文字が右から左に流れるように動かすものを作ってみた。
 以下は、そのプログラムです。「imfj→」の文字を流します。

#----------------------------
require 'funnel'
include Funnel

mat = MatrixLED.new
pixels = []
####### 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
row1 = [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
row2 = [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0]
row3 = [0,1,0,1,1,1,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0]
row4 = [0,1,0,1,0,0,1,0,0,1,0,1,1,1,1,0,1,1,0,0,0,0,1,0]
row5 = [0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,0,1]
row6 = [0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0]
row7 = [0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0]
row8 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0]

20.times do
for i in 0..23
for j in 0..7
k = i +j
k = k - 23 if (k > 23)
pixels[j] = row1[k]
pixels[j+8] = row2[k]
pixels[j+16] = row3[k]
pixels[j+24] = row4[k]
pixels[j+32] = row5[k]
pixels[j+40] = row6[k]
pixels[j+48] = row7[k]
pixels[j+56] = row8[k]
end
mat.scan_matrix(pixels)
sleep(0.1)
end
end

【2009/11/15 20:42】 | Gainer関係 | トラックバック(0) | コメント(0) | page top↑
XcodeでActionScript3を使う設定
XcodeでActionScript GainerをRubyで使う限界を感じてきたので、ActionScriptを勉強することにした。Gainerからの情報で、表示オブジェクトを動かすといった記述がRubyで実装するより楽に出来そうだと思ったから。
 ActionScript3をMacOS X Snow Leopard で使う開発環境(無償版)を調べていて、Xcodeで開発する方法が見つかった。これだと、ターミナルでコマンドモードで開発するより遙かにらくちんだ。元ネタのURIは末尾に書いておくが、元ネタサイトの情報には誤りもあったので、備忘録として記録しておく。
【開発環境の構築手順】
1.flexのインストール
http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK
から「Free Adobe Flex SDK (Download)」をクリックしてダウンロード
解凍したファイル「flex_sdk_3」を、/Developer/SDKs/ の下にコピー

2.パスの設定
.bash_profile ファイルに、
「export PATH=/Developer/SDKs/flex_sdk_3/bin:$PATH」
のコマンド行を追加しておく

3.XCode用のプロジェクト・ファイルテンプレートの「Core SWF」をインストール
http://idisk.mac.com/tadokoroatsushi-Public/flex_for_ssaw08.zip
をダウンロードして解凍したフォルダの中にある
Project Templateフォルダ内の Flex SDKフォルダーを
/Developer/Library/Xcode/Project Templates
フォルダー内にコピー

File Templateフォルダ内の ActionScript フォルダー を
/Developer/Library/Xcode/File Templates にコピー
Specificationsフォルダをフォルダごと
/Developer/Library/Xcode/の下にコピー

4.確認
Xcodeを起動し、新規プロジェクトでプロジェクトテンプレートから、「Flex SDK」→「AS3 Basic」を選択
プロジェクト名を「Hello」として保存
「ビルドと実行」を押すと、ブラウザが起動して「Hello World」が出力されれば、OK

以上の情報源は、「http://yoppa.org/ssaw08.php?itemid=831」ですが、上記の3のところに誤りがあるので、こちらを参考に。
【2009/11/03 17:21】 | Gainer関係 | トラックバック(0) | コメント(2) | page top↑
RubyでGainerがMODE6にできない問題(解決)
GAINER4 私の環境(MacOS X 10.6.1 Snow Leopard, Ruby 1.8.7)では、GainerをFunnel経由Rubyで動作モードを6にすることができなかった。
Funnel本家のサイト(http://funnel.cc/Software/Ruby)のExampleに
gio = Gainer.new(Gainer::MODE1)
と書いていたので、
gio = Gainer.new(Gainer::MODE6)
としてみると、警告が出た後、エラーになるのだった。
funnel/gainer.rb を読んでみると、:mode と明示する必要があるようなので
gio = Gainer.new(:mode=>Gainer::MODE6)
としてみると、警告がでなくはなったが、実行時に
/funnel/gainer.rb:62:in `initialize': undefined method `each' for nil:NilClass (NoMethodError)
というエラーになる。
 そこで、更に gainer.rb の62行目を確認すると、そこはデジタル入力ピンにフィルターを設定している部分のようだ。MODE6はデジタル入力が存在しない設定(nil)だ。(デジタル入力が設定されるのは、MODE1, MODE3, そして MODE4 の場合だけ)そこで、この部分を case 文で、上記の場合だけ設定するように修正してみたら、見事MODE6で動作した!
ちなみに、:mode=>Gainer::MODE6 は、:mode=>6 と書いても良い。

【funnel/gainer.rbの修正箇所】
62行目の

        config.din_pins.each do |i|
@system.io_module(0).pin(i).filters = [SetPoint.new(0.5, 0)]
end


を、次のように変更

      case mode
when MODE1, MODE3, MODE4 then
config.din_pins.each do |i|
@system.io_module(0).pin(i).filters = [SetPoint.new(0.5, 0)]
end
end


【MODE6での動作を確認したプログラム】
# 0~31 までを順に16進で表示して終了

require 'funnel'
include Funnel
# 0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F
A=[1,0,1,1,0,1,1,1,1,1,1,0,1,0,1,1]
B=[1,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0]
C=[1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0]
D=[1,0,1,1,0,1,1,0,1,1,0,1,1,1,1,0]
E=[1,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1]
F=[1,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1]
G=[0,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1]
gio = Gainer.new(:mode=>6) ####### Set MODE to 6
for i in 0..31
if i > 15 then
i = i - 16
gio.dout(15).value = 1
else
gio.dout(15).value = 0
end
gio.dout(8).value = A[i]
gio.dout(9).value = B[i]
gio.dout(10).value = C[i]
gio.dout(11).value = D[i]
gio.dout(12).value = E[i]
gio.dout(13).value = F[i]
gio.dout(14).value = G[i]

sleep(0.5)
end



【2009/10/31 16:08】 | Gainer関係 | トラックバック(0) | コメント(0) | page top↑
FunnelのRuby用ライブラリの問題?
 昨日の日記に、FunnelのRuby用ライブラリーを読んでみていると書きましたが、それはGAINERのモードをディフォルト(MODE1)以外に設定することができないでいたからです。
 エラーの情報とソースから(多分)問題になっている部分を突き止めました。
Funnel/libraries/ruby/funnel/にある、gainer.rb の60行目でデジタル入力ピンにフィルターを設定している部分が以下のようになっています。
config.din_pins.each do |i|
@system.io_module(0).pin(i).filters = [SetPoint.new(0.5, 0)]
end
でも、MODE1、MODE3、MODE5以外のモードでは、din_pinsがnilになっていて、そのことによるエラーが発生しているようでした。
なので、この設定を行う条件を追加して
case mode
when MODE1, MODE3, MODE4 then
config.din_pins.each do |i|
@system.io_module(0).pin(i).filters = [SetPoint.new(0.5, 0)]
end
end
としてみました。これで何とか動作モードを変更できるようです。
【2009/10/26 21:17】 | Gainer関係 | トラックバック(0) | コメント(0) | page top↑
すっきりしたかな
GAINER4 お試しでやってみようとしていたことは、ほぼクリアしたのでブレッドボードへの組み付けをやり直した。(ジャンプワイヤーのセットも届いていたしね)
 7セグLEDをアナログ出力とデジタル出力に、ボリューム、3軸加速度センサーをアナログ入力に接続して、後はプログラムだけ弄れば良いことになる。
 今までのプログラムはサンプルに毛が生えた程度で、実は良く判っていない。
GAINERとの通信をしてくれているFannelのRuby用ライブラリのソースを読んでみているけど、クラスのコンストラクタとか引数の扱いが良く判らない。これを切っ掛けに、Rubyをもう少し詳しく勉強してみることにしよう。
【2009/10/25 20:52】 | Gainer関係 | トラックバック(0) | コメント(0) | page top↑
| ホーム | 次ページ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。