続・Propeller日記(4)

長嶋 洋一


Propeller日記(1)

Propeller日記(2)

Propeller日記(3)

Propeller日記(4)

Propeller日記(5)

続・Propeller日記(1)

続・Propeller日記(2)

続・Propeller日記(3)

続・Propeller日記(5)

続々・Propeller日記(1)

続々・Propeller日記(2)

続々・Propeller日記(3)

続々・Propeller日記(4)

2012年9月28日(金)

9月26日(木)は、「9月卒業式」と「アルスエレクトロニカ映像資料整理」のため、Propellerはまったく進展が無かった。 「アルスエレクトロニカ映像資料」というのは、後期の「メディアアーツ論」と「メディアデザイン特論」の講義準備でもあり、 行ってきたばかりの 欧州ツアー の記憶があるうちに、アルスエレクトロニカ入賞作品集DVDから教材ムービーを作り、 撮ってきたビデオとともにまとめる必要がある。

そして翌9月27日(木)も、Propellerはまったく進展が無かった。 終日、お仕事パソコン(Mac mini)の2画面モニタと並んだお仕事デスクの3台目のモニタでは、 もう1台のMac mini(ここで教材ムービー編集のレンダリング)がずっと走っているので、 切り替え器を経由して接続されているWindowsマシン(今回の実験試作基板の設計CADが入っている)は使えない(^_^;)のであった。

多数のムービーをFinal Cut Proで取り込んで、個別に切り出してムービー化して、 さらにQuickTime ProによってMP4に変換する、という作業がようやく終わったのは、 3日目の9月27日(金)の午後であった。 しかし予想したように、後期スタートに向けて、あたらしいhigh-priority事項が浮上してきた。 以下の写真はその準備に、お店を広げたところである。

これはM2の伊熊さんの修了制作のインスタレーション作品に使われる、 UVセンサの部分である。 まだ未発表の新作なのでここで詳細は書かないが、多数のUVセンサからの情報を、 ワイヤレスでホスト(Max)に送る必要がある。 XBeeもそのために実験したのだが、ここで、当初はAKI-H8で行うつもりだった処理を、 届いたばかりのPropQuickStartを使う、というアイデアを思いついた。 ちょうどPropeller日記を書いていることもあるので、ここではやはり、Propellerで行ってみよう。

・・・というところで、9月25日(火)に情報を整理して、外形寸法が不明だった、 Gainer miniがやって来た。 以下のように、これまでの通常のGainerよりも、かなり小さい。 他のマイコンと並べてみると、28ピンでその幅は600milになっていて、 通常の28ピンのRAM等と同じであった。 これで搭載されるマイコンも全て揃った。 汎用実験試作基板の設計は、UVセンサの後となるが、こちらも進めていきたい。

2012年9月29日(土)

台風17号が日本列島縦断か・・・というこの週末であるが、 以下のように研究棟11階からの眺めは、まだ好天である。 SUAC「出会いの広場」には、来週木曜日にある薪能の舞台のセットが設置されたままであるが、 果たして台風直撃なのにこれでいいのか(^_^;)。 そして駅前東街区には、たくさんのテントが見える。 「浜松餃子まつり」である。明日、OGの野口さんと行く予定であるが、 なんとか雨が降らずに・・・という希望は叶うだろうか。

さて研究室では、いよいよM2の伊熊さんの修了制作のシステム裏方作業である。 メイルの確認で、「UVセンサは30個」「センサまでのシールドは40cm」と確認できたので、 まずは以下のように、基板(ここはPropellerで行く予定)の方でなく、細シールドケーブルとUVセンサの前加工から始めた。 なかなかに小さい(^_^;)。

そしてようやく、以下のように「UVセンサ+シールド線」の前加工が完了した。 30本もあるとヤレヤレというところだが、久しぶりにハンダの感覚が蘇ってきて、最後の5本ぐらいは快調だった。 これで、後期「サウンドデザイン演習」のハンダ付けにも突入できるだろう。

11階から見える「浜松餃子まつり」会場は、ずっと凄い人だかりである。 明日の「餃子とビール」を楽しみにしつつ、今日はここまで。(^_^;)

2012年10月1日(月)

いよいよ後期、新学期スタートである。 昨日はOGの野口さんと「浜松餃子まつり」に10時半から行き、6種類の餃子とビール2杯を堪能、 ぎりぎり台風の雨が降り出すお昼前に自宅に送ってもらって、あとは台風情報とともに夏休み最後の休日をだらだら過ごした。 そして今日は、台風一過の好天である。

後期の講義は、大学院「メディアデザイン特論」と芸術文化学科専門科目「メディアアーツ論(現代芸術論C)」とメディア造形学科専門科目「サウンドデザイン演習」とを、 全て水曜日にかためているので、月・火・木はかなり余裕がある。 伊熊さんのセンサが製作途中であるが、実験基板試作はリードタイムがあるので、忘れないためにも、 今日はP板試作のための回路設計作業から始めることにした。 久しぶりに「CADLUS Circuit」を起動してみると、以前に作ったPropStickが部品として表示されていなかったり(^_^;)、 お仕事Macに転送するためにFTPしてみると蹴られたり(^_^;)、と苦闘しながら、 なんとか以下のように、PropStickを部品として含めた図面が復活し、またFTPも繋がった。 これだから、時間をあけるとイケナイのである。

これまでの情報整理で、今回の試作基板に搭載するマイコンが確定しているので、 既に登録したPropStickに続いて、これらを新たな部品として登録する、というステップである。 まずは 続・Propeller日記(3) の9月24日のところで整理した、AKI-H8についてやってみる事にした。 これがピン数でも最大なので、思い出しの対象としては好適である。

いざ始めてみると、通常のDIPでないAKI-H8については、たぶんコネクタごとに信号ピンを定義して、 あとは複数のコネクタの位置関係を部品の実装データとして登録するのだろう、と解釈して、 以下のような単調作業に突入した。 これが、僕が「CADは嫌」という理由なのだが、全て定義しないと始まらないので、仕方ない。(^_^;)

そして、ここまで入力したところで、フト不安になった。 こうやって入力したところで、AKI-H8の3つに分割したコネクタを後で部品配置として統合できればいいが、 実はAKI-H8全体として登録しないと駄目、となれば、この単調作業は無駄骨となる。 そこで作戦を変えて、このAKI-H8については「P板.com」に以下のように質問のメイルを出して (さりげなく最後に虫のいい項目を加えてみたが、果たしてどうなるか)、 DIPサイズのArduino Nanoを入力する、と変更した。
P板.comサポート窓口 御中

お世話になります、登録会員の長嶋と申します。

貴社に基板を発注すべく、「CADLUS Circuit」で回路入力を始めています。
質問がありますので回答をお願いします。

今回の基板には多数のマイコンを搭載するのですが、その中で、
DIP形状でないものについての質問です。モノは秋月電子の「AKI-H8」です。

http://nagasm.org/ASL/Propeller2/20120924/002.jpg
という基板で、このうち3つのコネクタ
http://nagasm.org/ASL/Propeller2/20120924/001.jpg
を基板に取り付けます。
回路図は以下です。
http://nagasm.org/ASL/Propeller2/20120920/AKI-H8.pdf

質問(1)
この場合、「CADLUS Circuit」で新しい部品として登録するのに、AKI-H8の
3つのコネクタを別々の部品として登録して、それらの配置情報として
http://nagasm.org/ASL/Propeller2/20120924/001.jpg
のように指定するのか、それとも、AKI-H8という部品としては3つのコネクタに
分かれる全てのピン(計100ピン)を持つ、1個の部品として登録するのか、
という事です。

質問(2)
AKI-H8のコネクタは
http://nagasm.org/ASL/Propeller2/20120924/001.jpg
のように、20ピン2列ですが、ピン番号は通常のDIPとかと違う並びになっています。
(1列目と2列目とで行ったりきたり)
これは外形図のときにきちんとこの図のように示せば、部品登録においては、単に
http://nagasm.org/ASL/Propeller2/20121001/002.jpg
のように並べていいのでしょうか。

質問(3)
もし、貴社の既存ライブラリに「AKI-H8」があるのであれば、それが欲しいの
ですが・・・(^_^;)

以上、よろしくお願いいたします。
そしてしばらく、Arduino Nanoの新規部品登録をして、以下のようになったところで悲劇は起きた(^_^;)。 突然にエラーメッセージが出て「CADLUS Circuit」がクラッシュして、ライブラリから、 以前に登録していた「ジャンパ」と「PropStick」が消滅していた(;_;)。 またやり直しかぁ。 こうなると、部品を作ったたびに、上書きでなく新しいライブラリ名として登録していくことになる。 だからCADは嫌いなのだ。(^_^;)

消えてしまったものは仕方ないので、とりあえず「Arduino Nano」という部品をコピーして、新たに「PropStick」と名付けて、 もう一度、信号名などを入力した。 上書きはもうこりごりなので(^_^;)、新しいライブラリとして、これをさらに新しい図面として登録した。 このあたりの融通の無さというのは、まぁCADではいつもの事である。

そして以下のように、Gainer miniも登録した。どんどんライブラリも図面も名前を更新して新規登録して、 「上書き保存」をしない、という方針を徹底することにした。 一度でもクラッシュするようなソフトは、もう金輪際、信じないというのが鉄則である。 AKI-H8のコネクタについての質問メイルへの回答にはたぶん1日とか2日の時間を見込んで、 ここで図面の「線引き」にトライすることにした。

マニュアルで「線引き」について調べていたところ、なんと速攻で「P板.com」からメイルが届いた(^_^)。 素晴らしい対応である。
静岡文化芸術大学 長嶋 洋一 様 

いつもお世話になっております。P板.comサポート窓口 ○○ ○○です。 
お問い合わせいただきまして、誠にありがとうございます。 

3つの部品とする場合は20ピンと40ピンのコネクタ部品を登録して
回路図上に参照名をCN1〜CN3として配置します。
1つの部品とする場合は端子番号1〜100ピンの部品を登録して
回路図上に配置します。

宜しくお願いいたします。
ということは、どちらでもいい、さらにピン番号の配置はジクザグだろうが何だろうが、 外形の定義次第なので大丈夫、ということなのだろう。 そうなれば、サッサと登場人物を登録してしまい、回路設計(配線)に入るしかない。 3つのコネクタとして登録して、外形寸法図で統合するよりも、 巨大であっても全ピンがある方がなんとなく精神衛生上は好ましい、と考えて、 結局ここでは以下のように登録してみた。

そして、外形寸法図にあったピン番号を、この部品登録に合わせて、以下のように変更した。 これにより、AKI-H8の全ピンに対して、一意にピン配置が対応するのだろう。 この論理的整合だけ注意すればいい、というのは、ある意味ではシンプルなのであった。

これで、あとは基板上には若干の部品と、あとはコネクタが並ぶだけである。 内部配線としてはターミネータとなるため、配線設計のためには、コネクタも部品として登録する必要がある。 コネクタのピン配置は、まったく制約が無いので、まさに仮想的な登録でいい事になる。。

2012年10月9日(火)

前回の日記から1週間以上が経過してしまった。 予想した通りに、新学期とともに怒濤のあれこれが殺到して、さらに 「野口佳恵 個展」 などもあり、Propellerにはまったく進展が無かった。 後期も2週目となったので、ぼちぼち進めていかなくては。(^_^;)

マイコン類の登録まで終わっていたが、重要なパーツが残っているのに気付いた。 XBeeである。 これは、秋月電子のピッチ変換基板 AE-XBee-REG-DIP を使うことにしていたので、まずはこれを以下のように部品として登録した。

この変換基板のいいところは、電源レギュレータが載っているところで、 XBeeの+3.3V電源を、外部の「Vin」(+4V〜+20V)から作ってくれる。 ただし、Propellerで実験した時にはそのまま直結で良かったが、 +5V系との接続にはレベルシフトを考慮する必要がある。 こちらも秋月電子には外形寸法図は無いので、PDFを拡大して以下のようなものを作った。

あと定義するのは、基板の外部に信号を引き出すためのコネクタである。 全て基本的には、0.1インチピッチの秋月の2列ピンヘッダ/ソケットを使うつもりであるが、ピン数とかはかなりアバウトである(^_^;)。 秋月電子の、ロープロとシングルを除いた「ピンソケット」を検索すると、以下のように5/7/8/10/13/20/22/25/30ピンの7種類がある、 と確認できた。

オスのピンヘッダは以下のように2×7から2×40まで6種類あるが、こちらは好きにカット出来るので、 同じ値段なら「2×40(80P)」をたくさん買って、適当にカットすればいい。 あと注意点としては、これまでに製作した基板でもそうだが、現場の接続で間違わないために、 なるべく異なるコネクタをたくさん使いたいので、これはちょっとしたパズルである。

信号線のコネクタには、余裕ピンを持って、電源やGNDをたくさんアサインしたいところであるが、 「P板.com」の見積りページの経験から、基板の「総ピン数」がコストに大きく影響するので、あまり無駄にたくさん使う、というのも考えものである。 とりあえず全体像を検討するために、フリーハンドで全体を構想しつつ考え始めた。 Propellerでも2ピンを使った逐次比較A/Dコンバータはサンプルがあったが、 ここはAKI-H8とArduinoとGainerが8チャンネルの電圧入力に対応しているので、 汎用の8チャンネルA/Dコンバータを使うことにした。 業界で定番なのは、アナログデバイセズ社の ADC0808 と、ほぼ同等のMAXIM社の MAX161 である。いずれもパッケージは28ピンDIP(600mil)である。 ADC0808は過去に使ったことがあったが、そうなると初めてのMAX161の方を使ってみたいので(^_^;)、 変換スピードが5倍ほど早いが値段も4倍ほどするMAX161を使うことにして、サンプルも手配した。 MAX161まで登録したのが以下の回路図(まだ部品を並べただけ(^_^;))である。

2012年10月18日(木)

前回の日記から10日近く経過した。 後期にスタートした講義は、3科目とも順調に、軽快に、かなり入れ込んでスタートした。 金重さんと 光で回るドラえもん も作った。 それ以外に進展が無かったわけではなくて、M2の伊熊さんのインスタのためのセンサシステムを、 以下のように少しずつ製作していたが、日々刻々とこの日記を書く余裕が無かっただけである。


10月12日


10月14日


10月16日

そして今日は木曜日、午後の学生委員会しかないタイミングに、以下のように無事にセンサシステムは完成した。 あとは明日に、伊熊さんが来たところで、UVセンサとXBee経由で受け取ったMaxパッチのビット対応を調べればいい。 1ビットだけ、UVセンサの出力が出っぱなしになっているが(^_^;)、これは消去法で「どれ」と確定すれば、たぶん簡単に直るだろう。

ここで、自分の備忘録として、このセンサシステム(Propeller活用)について、まとめておこう。 まず、いつものように簡単な回路図だが、以下が全回路図である。(^_^;)

これと、以下のPropStickの回路図があれば、あとはMaxのパッチとPropellerのコードで全情報は完結している。

Maxの実験パッチは以下である。

回路としては、まず32個のUVセンサ(光ダイオード)の発生する電圧をOPアンプ(LM324)に入れる。 OPアンプはコンパレータとして動作させ、比較電圧は、共通の半固定ボリュームで設定した電圧をボルテージフォロワで分配している。 この計32個のコンパレータ出力はそのまま 74HC245に入り、4個の74HC245の出力は8ビットのバスに直結する。 245のG入力で常にどれか1個しか出力しないようにPropellerで制御する必要がある。 この出力は+5Vなので、1kΩを直列に接続してPropellerのポートに8ビット並列として入力する。

Propellerの別の4ビット出力は、74HC245にそのまま入力すると、スレショルドの関係でそのまま+5V系になる。 この4ビットを、4個のセンサ入力の74HC245のGに入れている。デコードはソフトである。 Propellerのピンは+3.3V系なので、XBeeとはそのまま直結できる。 これが上の回路図の全てである。

Maxパッチについても、何も目新しいことはない。 19200のスピードでシリアルポートをopenして、50msecのmetroで叩く。 1000msecごとに出しているのは、動作確認用に追加したPropellerのLEDを点滅させる命令として使っている。 そして、200msecごとのmetroの情報をトリガとして、Propeller側では32ビットのUVセンサの情報を一気に取得して、 MIDIノートオンイベントの8チャンネル分に4ビットずつ分割して返送する。 イベント発生チェックの管理も、受信するMaxの側にしている。

Propellerのプログラムは、MIDI用に開発したオリジナルの通信ドライバを 単純に改良した、シリアル送信・受信の2本のドライバと、実験用のメインプログラムの計3本である。 まず、メインのPropellerブログラムは以下である。 けっこう無駄に「MIDIメッセージ風パケット」に入れているが、動作確認しやすさ、というのは命である。

CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000

OBJ
  serialOut       : "XBee_Out2"
  serialIn        : "XBee_In3"

PUB main | dummy, num, d
  serialOut.start(21)
  serialIn.start(20)
  port_initial
  repeat
    dummy := serialIn.event
    if dummy <> -1
      d := (dummy & $FF0000) >> 16
      if d == 144
        d := (dummy & $000100) >> 8
        if d == 1
          outa[22] := 1
        else
          outa[22] := 0
      elseif d == 145
        repeat num from 0 to 3
          outa[19..16] := !( 1 << num )
          d := ina[15..8]
          outa[19..16] := %1111
          dummy := $900000
          dummy := dummy + (num*2) << 16
          dummy := dummy + (num*2) << 8
          dummy := dummy + d & %00001111
          serialOut.fifoset(dummy)
          dummy := $900000
          dummy := dummy + (num*2 + 1) << 16
          dummy := dummy + (num*2 + 1) << 8
          dummy := dummy + (d & %11110000) >>4
          serialOut.fifoset(dummy)

PUB port_initial
  dira[19..16]~~                ' output
  dira[22]~~                    ' output
  outa[19..16] := %1111
  dira[15..8]~                  ' input
そして、シリアル受信プログラムは以下である。
VAR
  long rx_Head, rx_Tail, rx_Buff[64]

PUB start(_midiPin) : status
  midiPin := _midiPin
  rx_top := @rx_Head
  rx_end := @rx_Tail
  rx_fifo := @rx_Buff
  bitticks := clkfreq / 19_200
  halfticks := bitticks / 2  
  longfill(@rx_Head,66,0)
  status := cognew(@asm_entry, 0)

PUB event : status
  status := -1
  if rx_Tail <> rx_Head
    status := rx_Buff[rx_Tail]
    rx_Tail := (rx_Tail + 1) & $3F
    
DAT
                        org
asm_entry
                        mov     midiMask,#1
                        shl     midiMask,midiPin
getMidiByte
                        waitpne midiMask,midiMask
                        mov     bitClk,cnt
                        add     bitClk,halfticks       
                        add     bitClk,bitticks
                        mov     testBits,#9                         
:check_loop
                        waitcnt bitClk,bitticks
                        test    midiMask,ina            wc
                        rcr     rx_data,#1
                        djnz    testBits,#:check_loop
                        shr     rx_data,#32-9
                        and     rx_data,#$FF
                        test    rx_data,#%10000000      wz
              if_z      jmp     #:running
                        mov     rsb,rx_data
                        mov     dcb,#0
                        jmp     #getMidiByte
:running
                        tjnz    dcb,#:byte_3
                        add     dcb,#1
                        mov     keyno,rx_data
                        jmp     #getMidiByte
:byte_3
                        mov     dcb,#0
                        mov     event_data,rsb
                        shl     event_data,#16                                      
                        mov     t1,keyno
                        shl     t1,#8
                        or      event_data,t1
                        or      event_data,rx_data
:write_event
                        rdlong  t1,rx_top
                        mov     rx_pointer,t1
                        shl     rx_pointer,#2
                        add     rx_pointer,rx_fifo
                        wrlong  event_data,rx_pointer
                        add     t1,#1
                        and     t1,#$3F
                        wrlong  t1,rx_top
                        jmp     #getMidiByte

t1                      long    0
midiMask                long    0
testBits                long    0
bitClk                  long    0
bitticks                long    0
halfticks               long    0
midiPin                 long    0
rx_top                  long    0
rx_end                  long    0
rx_fifo                 long    0
rx_data                 long    0
rx_pointer              long    0
event_data              long    0
rsb                     long    0
dcb                     long    0
keyno                   long    0

                        fit
そして、シリアル送信プログラムは以下である。
VAR
  long tx_Head, tx_Tail, tx_Buff[64]

PUB start(_midiPin) : status
  midiPin := _midiPin
  tx_top := @tx_Head
  tx_end := @tx_Tail
  tx_fifo := @tx_Buff
  bitticks := clkfreq / 19_200
  longfill(@tx_Head,66,0)
  status := cognew(@asm_entry, 0)

PUB fifoset(_tx_data)
  tx_Buff[tx_Head] := _tx_data
  tx_Head := (tx_Head + 1) & $3F
    
DAT
                        org
asm_entry
                        mov     midiMask,#1
                        shl     midiMask,midiPin
                        or      dira,midiMask
:fifo_check
                        rdlong  t1,tx_end
                        rdlong  t2,tx_top
                        cmp     t1,t2                   wz
              if_z      jmp     #:fifo_check  
                        mov     t2,t1
                        shl     t1,#2
                        add     t1,tx_fifo
                        rdlong  event_data,t1
                        mov     t1,t2
                        add     t1,#1
                        and     t1,#$3F
                        wrlong  t1,tx_end
                        mov     tx_data,event_data
                        shr     tx_data,#16
                        mov     status_d,tx_data
                        call    #send_event
                        and     status_d,#%11100000
                        cmp     status_d,#%11000000       wz
              if_z      jmp     #:byte_2
                        mov     tx_data,event_data
                        shr     tx_data,#8
                        call    #send_event
:byte_2
                        mov     tx_data,event_data
                        call    #send_event
                        jmp     #:fifo_check

send_event
                        and     tx_data,#$FF
                        or      tx_data,#$100
                        shl     tx_data,#1
                        mov     testBits,#10                        
                        mov     bitClk,cnt
                        add     bitClk,bitticks
:bit_send
                        shr     tx_data,#1              wc
                        muxc    outa,midiMask
                        waitcnt bitClk,bitticks
                        djnz    testBits,#:bit_send
send_event_ret          ret

t1                      long    0
t2                      long    0
midiMask                long    0
testBits                long    0
bitClk                  long    0
bitticks                long    0
midiPin                 long    0
tx_top                  long    0
tx_end                  long    0
tx_fifo                 long    0
tx_data                 long    0
status_d                  long    0
event_data              long    0

                        fit
ここまで出来たところで、「サウンドデザイン演習」で電子工作キットを製作中の学生からヘルプがあって、 ちょっと電子制御機器制作室に出かけた。以下がその様子である。

そこそこ進展したので、今日はここまで。 伊熊システムを移管できれば、いよいよ汎用試作基板に戻ることになる。 フト思い立って、来年3月の情報処理学会全国大会(東北大)にエントリーしたので、 このネタを進めていかなくては。

2012年10月23日(火)

先週、Propellerを使って完成させた、M2の伊熊さんのインスタレーションのためのセンサシステムについては、 無事に金曜日に引き渡しを終えた。あとは修了制作作品の進展を見守る、というところである。 そして週末には、土・日・月と同窓会(水戸一高卒業生・復活「歩く会」)に初参加のために、水戸に帰ったので、まったく進展が無かった。 とりあえず12kmを無事に踏破できたが、身体の節々が痛い(^_^;)。

これで当面のスケジュールは、特に何もない碧風祭を冷やかすぐらいで、ちょっと平穏な時期に戻る。 ただしもちろん、M1の特論(プログラミング)、芸文の「メディアアーツ論」、そしてメディア造形の「サウンドデザイン演習」に、 毎週、全力投球である。 次の目標はいよいよ、汎用実験試作基板の設計を「P板.com」に出すために、初めてのP板CADでの設計を進めることである。

AKI-H8、Propeller(PropStick)、Arduino-Nano、Gainet-Mini、という異なる4種類のマイコンを搭載して、 これらに共通の周辺拡張機能を搭載する、というボードの設計は、なかなかにパズルである。 「可能な限り、拡張性を最大にする(使わない部品は挿さなければよい)」という条件において、 考慮すべき点はざっと以下である。

  • 各マイコンのポート数が違う
  • 電源が+5V系だけでなく、Propellerは+3.3Vである
  • Arduinoはピンが限られている
  • Gainerは拡張に対応してモードを指定する必要がある
  • GainerはXBeeは無理、Arduinoは受信は無理で送信だけOK
  • アナログ電圧入力はPropellerだけ無いのでA/Dコンバータを外付け
  • AKI-H8とPropellerはピン数が多いので「ディジタルOut/In」の拡張を両方とも同時に可能とする
これを同時に満足する解を求めて、あれこれ検討した。 Propellerだけのために、8ピット・アナログ入力マルチプレクサ内蔵の汎用8チャンネルA/Dコンバータとして、 MAXIM社の MAX161 を使うことにしていたが、このお休み期間のうちに、MAX161のサンプルも10個、ちゃんと届いた(^_^)。

さて、ここからは恐れていた超単純作業である。 以下のように、とりあえず各部品に配線のためのラインを繋いでみた。

ここに、まずは入出力を8ビットのデータバスとして8ポートずつに拡張するために、 8個の74HC574と10ピンコネクタ、8個の74HC245と集合抵抗と10ピンコネクタを並べてみて、 A4で入らなくなったのでサイズをA3にしたのが これ であり、JPGにしてみると以下のようになった。 この紙面サイズで入らなくなれば、次はA2である(^_^;)。

なんとも面白くない作業であるが、これを進めないと完成しない。 なかなか辛い道のりである。

2012年10月27日(土)

水曜日は1・2・4・5限に講義の日、木曜日は「出前授業」で豊橋の豊丘高校に行ってきて、金曜日はM2伊熊その他があり、また週末になった。 ただし来週は碧風祭ということもあり(デザインの一部学生はTDWに没頭)、静かな週末である。 ここで基板のCADを・・・と思っていたら、昨日、なんとイギリスから自宅に国際郵便封筒が届いた。 なんと半年も待たされて忘却の彼方にあった(^_^;)、Raspberry Piが届いたのである。 去年から話題になっていたこのボード、日本ではRSコンポーネンツから入手できるというので発注ユーザ登録をしたのが4月6日であった。 そしてRSから「大変お待たせいたしました。ラズベリーパイのBモデルをRSコンポーネンツからご注文いただけるようになりました」というメイルが届いたのが6月30日。 そしてその日のうちに発注して、以下のようにOrder Confirmationが届いた。
Allied Electronics & RS Components Order Confirmation

Thank you for your Raspberry Pi order, your order reference number is: *13##29*

Once your order has been despatched we will send you further details on shipment and courier, to help track your delivery.
Order details
Order placed by 	Yoichi Nagashima
Contact tel 	+815345###15
Contact e-mail 	nagasm@suac.ac.jp
Date of order 	Sat, 30 Jun 2012, 08:51 AM
Your order number 	
Method of Payment 	Credit Card
Delivery Type Desc 	Standard Delivery *(Despatch expected within 12 week(s))*

Delivery details
Delivery address 	
10-####01, Sumiyoshi-5, naka-ku
Hamamatsu
Shizuoka
430-0906
JAPAN
Invoice address 	
10-####01, Sumiyoshi-5, naka-ku
Hamamatsu
Shizuoka
430-0906
JAPAN

Reference: 13##29
Your order
*RS Stock No.* 	*Qty* 	*Description* 	*Unit Price* 	*Goods Value*
756-8308	1	Raspberry Pi Type B Single Board Computer	£21.60	£21.60
557-032	1	Ethernet network cable for Raspberry Pi	£0.97	£0.97
2000114155	1	3.5mm Stereo to twin RCA plug cable for Raspberry Pi	£1.49	£1.49
CASE-WHT	1	Raspberry Pi Type B Case - White	£3.99	£3.99
2000117882	1	4GB SD Card with Raspberry Pi OS installed	£9.99	£9.99
	Running Total 	£38.04 	
Standard Delivery *(Despatch expected within 12 week(s))*	£4.95	
*Order total* 	*£42.99* 	

Grand total: £42.99
Thank you for your order.

Kind regards

Allied Electronics & RS Components
raspberrypi.rsdelivers.com
配達まで12週間、待て、ということだったが、8月下旬には以下のメイルが届いた。 まぁ想定されたことだが、世界中からの発注で生産が間に合わないので遅れる、ということだった(^_^;)。
RS Online 
 
Raspberry Piの出荷遅延に関して 

いつもお世話になっております。 

この度はRaspberry Piをご注文いただきありがとうございました。お客様の注文番号は101013##29となっております。 

発売以来想像以上の反響となり、Raspberry Piの生産が需要に追いつかす現在出荷の遅延が発生しております。
当初メーカーより9月時点で4万個のRaspberry Piを納入されることとなっていましたが、Raspberry Piに使用されて
いるコアプロセッサが市場で不足しているため、10月まで納入が遅れるとの連絡が入りました。 弊社としては出来る
限り遅れることのないよう最大限の努力をしておりますが、この影響によりお客様への商品の発送が最大で4週間程度
の遅れることが想定されます。 最新の出荷状況、また遅延に関しての情報はFAQページ、またRaspberry Piフォーラム
に掲載する予定です。生産の状況に関して、新たな進展がありましたら再度報告をさせていただきます。 

この度商品の出荷遅延によりご迷惑をおかけすることとなり大変申し訳ございません。弊社では引き続きお客様の
手元へできる限り早く商品をお届けできるよう、メーカーとの調整を継続してゆきます。 

今後ともよろしくお願いいたします。 

RS Components & Allied Electronics 
・・・そしてようやく、発注時点では「1個」しか注文できなかったRaspberry Piが届いた、という事である。 RSのページに行ってみると、いま発注したら納期は12月だ、ということだったが、複数個もOKということで、 さっそくオンラインでRaspberry Piを10枚、発注した。 以下が、届いたRaspberry Pi、ケース、OSの入ったSDカード、ケーブル類である。 RSを経由しているので3000円近いが、ネットの謳い文句は「An ARM GNU/Linux box for $25. Take a byte!」である。 ARMのLinuxボードで、直接購入すれば2000円ほど、というのは驚異的なシステムである。

今回の汎用実験試作基板のホストにRaspberry Piを搭載する事は無い(コネクタが無いのでRaspberry Piはケースに入れてスタンドアロン)が、 周辺を拡張するために接続する可能性は考慮しておきたいので、ここで寄り道して、今日はRaspberry Piと遊ぶことにした。 本当は「Raspberry Pi日記」になる奥行きがあるが、グッと堪えて、ごくごく上っ面を撫でてみることにしよう。

昨今のオープンソースの風潮から、このような新しいシステムについても、たいていはGetting StartedまではWebで完備しているものである。 RS-onlineのRaspberry Piページ にも、もちろん本家の Raspberry Piサイト にも、膨大な資料がある。 これに従っていけばいい筈である。

まずはボードに付属してきたA5の「Quick Start Guide」を見ると、 Raspberry PiサイトQuick start guide ページに行け、とあり、以下にはそのページと同じことが印刷されていた。 これはシンプルなので、ここに従ってセットアップした。

まずは「Basic setup」(Before You Begin)である。 もっとも簡単にRaspberry Piを起動してみるためには、Raspberry PiのUSBポートとテレビorディジタルモニタがあればよい、という。 この言葉も分らないビギナーは beginners’ section of our forums に行けば、ステップごとに写真付きでガイドしてくれるというが、さすがにこれは不要なのでパスした。 「初めてのRaspberry Pi」に必要なセットアップは以下だという。

  • USB keyboard and mouse.
  • Prepared SD card (see below).
  • HDMI or composite television, OR a monitor with DVI or HDMI input, and an HDMI/composite cable.
  • Micro USB power supply - make sure you use a good quality one, capable of providing at least 700mA at 5V. Do not attempt to power your Raspberry Pi by plugging it into a computer or a hub.
  • Ethernet LAN cable (optional).
USBキーボードとマウス(トラックボール)は、まさにCADをやっているWindowsXPマシンから引き抜いて挿した。 付属してきた「Prepared SD card」はノーブランドでなくTranscendの4GBだった(^_^)ので安心してスロットに挿入した。 「HDMI or DVIモニター」は研究室に無いことが判明(^_^;)したので、当面は机上の11インチのテレビのビデオ入力に接続した。 たぶんUnixの画面はとても読めないので、ちゃんとやるには買わないといけない。 「Micro USB power supply」については、パソコンやHUBに繋いでは駄目、最低700mA が必要、とあった。ちょうど研究室には、SonyのPCMレコーダ用かなんかの専用USBアダプタ(5V800mA)があったのでこれを使った。 「Ethernet LAN cable (optional)」も、せっかくなので繋いでみた。 学外には出れなくても、DHCPであれば研究室内で他パソコンと通信できるだろう。

ここでいざUSB電源プラグを差し込もうとすると、なんとジャックの一部に突起があって差し込めなかったが(^_^;)、 そこをラジオペンチで押しつぶして、無理に立ち上げてみた。 何度かビデオ出力が荒れてリセット(リセットボタンが無いのでいちいちUSB電源アダプタを抜いて挿す(^_^;))したが、 以下のように無事にLinuxが起動し、さらにX-Windowシステムが起動して、ターミナルとかゲームとかがちゃんと動いた。 ホストのお仕事Macのリモートユーザ接続を許可してみると、ちゃんとsshでログイン出来た。 これが約2000円のボード単体で、初めて電源を入れてから15分ほどで全て動くのである。 やはり、世界中から注目されるのも当然だろう。

とりあえずここまで動いたので、Raspberry Piについてはいったん終了、とした。 ここからどう遊ぶかは、僕のUinxの師匠であり長年の友人である(僕が神戸山手女子短大の非常勤として毎週、 浜松から神戸に通っていた時に僕の講義の助手、後には神戸山手の教員として、 その後もComputer Music仲間、音楽情報科学研究会とかでずっとご一緒)、東大の中村文隆さんに質問してみよう。 たぶんおいおい、CQ出版から中村さんの「Raspberry Pi本」が出ると思うので、 ここに付いていくだけでも勉強となりそうである。

2012年10月29日(月)

昨日はNHK杯の「羽生-ハッシー」があまりに面白くて、将棋関係の棋譜とか動画をあれこれ整理しているうちに、 CADに入れないまま終わってしまった(^_^;)。まぁ休日なんてそんなものである。 わずかに進展したとすれば、いろいろ調べて、Raspberry PiのためにHDMI-DVIの変換アダプタとかケーブルを発注したぐらいであった。 そして今日は、3限にドラえもん関係の制作を手伝ってくれている金重さんが来る(今回だけは助っ人もあと1人)予定だけで、 今日と明日はまさにCAD日和である。

10月23日のCADから、合間に少しずつ設計も加筆していたが、考えてみると周辺拡張のために、 バッファの74HC245とデコーダの74HC138を除いても、ラッチバッファの74HC574が8個、入力3ステートバッファの74HC245が8個と、 300milの20ピンDIPが16個加わった。 さらに、MAX161は600milの28ピンDIPである。 関連する2列ピンヘッダ類も膨大な個数である。 これで想定している基板に全部が載るのか・・・をまったく考えていなかったが、 まだ搭載予定の部品は残っている。 そこで、あらためて基板に載せてスペースを検討してみることにした。 すると以下のように、既に「無理」っぽいことが判明した(^_^;)。

さてどうするか。 とりあえず、対応策としては以下のようなものがあるだろう。
  • 基板サイズを大きなものにする
    → コストが上がる。ただし今回の基板サイズは相当に小さいので、まだ拡張の余地がある
  • 300mil20ピンDIPのICを、全てミニフラットパッケージにする
    → おそらく面積は半分以下になるので搭載可能となる。ただしハンダ付けの難易度が相当に上がる
  • 周辺回路をそこまで欲張らずに削減する
    → これではなんのための汎用試作基板か分らなくなる(^_^;)
今回は、来年度に作る本番に向けた実験試作であることから、やはり選択肢は1番目となるだろう。 ここはこのまま回路設計を進めて、「入るギリギリのサイズ」という基板サイズの規定は、「P板.com」と相談していくことにしよう。 スタートラインは以下の回路図である。 基板サイズはまだまだ大きくなってもいいが、このA3サイズに回路図が入らないと面倒になるので、 このあたりが全体の目安となりそうである。

上のように進めてきた回路設計だが、いざPropellerとMAX161との接続を詳しく調べていくうちに、 ちょっと雲行きが怪しくなってきた。 MAX161 は、互換性はないものの、昔から定番の ADC0808 の機能については単純に置き換えられる・・・と思っていたのだが、 どうもマニュアルPDFを読むと、MAX161の方が後発で高機能にしているため、 単純にADC0808のように使えるのかが不安になったきた。 MAX161では、Vrefにいろいろマイナス電圧を与えて、+10Vとか-10Vとかのユニポーラ、 さらに±5Vでのバイポーラなども設定できるのだという。 こちらは単純にADC0808と同様の、「+5Vユニポーラ」として使えればいいのだが、 マニュアルにその回路が無くて、たぶんVref=+5Vでいいと思うのだが、なんか不安がある。

ADC0808は単純でいいのだが、マニュアルPDFを読むと、ディジタルのインターフェースがHSCMOSではなくてTTLのため、 Propellerの+3.3Vの信号出力では「Vcc-1.2V」というHレベルのスレショルドに不足する。 ここにわざわざ、レベル変換の石を使うのもシャクである。 仕方ないので、この部分は、Propeller(+3.3V系)とのインターフェースの確認を兼ねて、 回り道して、せっかく9月25日に届いたのにまだ遊んでいなかった、以下のPropQuickStartボードで実験してみることにした。

回路図PDFは既にあったので、あとは 購入元サイトの情報 の以下の情報を頼りに、実験とはいってもスタンドアロンで「使える」ものを作ることにした。
  • AltiumとDipTracePCB layoutファイルを通した設計のオープンハードウェアリファレンス
  • USBポートからのBus-Power、3.3 V regulator、500 mA
  • ボード上に5 MHzクリスタルがありSMTジャンパーを外すことによって、外部からのクリスタルに取り換える事が可能
  • 64 KB EEPROM (P8X32Aプログラム用の32 Kと、汎用使用の32 K)
  • 外部の電力管制用リセットは、SMTジャンパーを外すことによってインストール可能
  • P16からP23上に8個のブルーLED
  • P0からP7上に8個の抵抗型タッチスイッチ
  • sigma-delta A/D AppNoteを使うための、sigma-delta A/D回路用パッド(2個の抵抗と2個のキャパシター)
  • Vss、Vdd、32本の I/Oピンに拡張ヘッダーを通してアクセスが可能(28本が一般使用、2本はI2Cバス、そして、USBパワーに接続したなら2本がオプションでTx/Rx)
  • サイズ:5.1 cm x 7.6 cm
考えてみれば、汎用実験試作ボードに複数のマイコンを搭載し、その一つとしてPropellerがあるが、 そのためにMAX161の実験をする、その実験にPropQuickStartボード、という流れであるが、 えらい「寄り道」のようで、実は「Propeller日記」としては、また初めてのPropellerボードを使う、という、 まさに王道なのであった。 以下のように、敢えて小さいユニバーサル基板にPropQuickStartボードとMAX161とを載せて、 ここから高機能なシステムを実現してしまおう、という作戦である。

ユニバーサル基板にPropQuickStartボードとMAX161を載せて、まだ他に何も配線していない(^_^;)この状態で、 まずはこのPropQuickStartボードに馴れるために、ボード上のLEDを光らせることにした。 回路図から、ホストとUSBで接続していれば、オンボードの+3.3Vを作って電源供給はOKということで、 まずは以下のように、8個のLEDを8ビットバイナリで点灯させる、というお約束のプログラムである。 プログラミングはものの5分、あっさりと以下のように奇麗なブルーLEDイルミネーションが出来た(^_^)。

月曜はアカペラもあるので、まぁこんなところまでである。 LEDをPWM制御して連続値点灯する、というアセンブラのドライバを作るのもまだだったのを思い出した。 8個並んで抵抗だけ付いている「スイッチ」というのも、次にやってみることにしよう。

2012年10月30日(火)

昨日は無事に、ハロウィンの1回生2人とともに、 「飛ぶのび太くん」 を制作し、記録動画もYouTubeに上げた。 YouTubeの「動画アップロード」ページは、頻繁に内部的な仕組みを変更していて、 昨日はいきなりアップロードがストップして困ったが、そういう時のために、 過去に動作確認できている「クラシックアップローダ」というページがあり、ここから無事に上げられた。 ところが今朝になってみると、どうも改良されたらしく(^_^;)、新しい方でもOKになっていた。 まさに日進月歩である。 また、Raspberry Piについても、ふーみん(東大の中村先生のこと(^_^;))からメイルが来て、 ぼちぼちCQ出版から、初心者向けの彼のRaspberry Pi本が出る・・・という状況も分った。 さて、明日はまた怒濤の水曜日なので、今日のうちにいろいろ進めてみよう。

PropQuickStartボードの回路図はあるものの、他に何かドキュメントがあるかな・・・とParallax社のPropellerサイトに行ったが、 どうも「無い」らしい(^_^;)。 PropQuickStartのページにあるのは、もっとも基本的なPropellerのレクチャーページへのリンクだけだった。 そしてこのページで発見したのが、PropQuickStartボードが25ドル、という事実である。 25ドルといえば、ちょうどRaspberry Piも25ドルである。 うーーーーむ、 これは何と言っていいのやら、大変な時代になったものである。

せっかくなので、まだ決定していなかった、汎用実験試作基板(そろそろ何かネーミングしないと(^_^;))に搭載する、 PropStickともポート番号を対応させて、両方の仕様を決めることにした。 「P26-P31」の4ビットは、ホストUSB通信の2ビットと外付けFlashメモリのインターフェースで、予約である。 574ラッチ出力と245入力に共用する汎用入出力拡張ポートについては、 PropQuickStartボードのブルーLEDが光ってくれるのも嬉しいので、これを「P16-P23」とまず、決めた。 PropQuickStartボードで100kΩでGNDとの間にスイッチのパターンが作られている「P0-P7」はとりあえずキープして、 何も予定のない「P8-P15」の8ビットを「MAX161と接続するバス」と決めた。 ここにはMAX161の+5V系出力から、ビットごとに直列に1kΩを入れることになる(簡易レベル変換)。 PropQuickStartボードの回路図を見ると、USBシリアルインターフェースのFT232RLとの間には、 ちゃんと74LVC126Aで正しくレベルシフトしていた。 本家なので当然とも言えるが、さすがである。(^_^)

残るポートは「P0-P7」と「P24-P27」の計12ビットである。 これはちょっと悩ましい。 汎用入出力拡張ポートのアドレスデコードに3ビット、ラッチパルス用に1ビット、入力/出力の切り替えに1ビット、 計5ビットが必要である。 MAX161との間には、アドレスデコードに3ビット、ALEとCLOCKとで、たぶんやはり計5ビットが必要である 残るは2ビットだが、MIDIとXBeeとを混在させるなら4ビット、選択的に共用しても2ビット必要である。 これでピッタリ、と言いたいが、実は、あと3ビット、以下の「Video出力」のために欲しい、と思っていたのである。

Propellerの内部Cog(並列8プロセッサ)から2個を使い、外部ポートとして3ビットに1本ずつ抵抗を付けるだけで、 ソフトウェアによってビデオ信号を出す、というPropellerの強力な機能は、この実験回路でも、 もちろん汎用実験試作基板(「SUACボード ver0.5」という名前はどうかなぁ(^_^;))でも、ぜひ実現したいのである。

今回の試作基板に搭載されるマイコン4種のうち、もっともポート数が多いのはAKI-H8であり、 もっとも少ないのはGainerである。 PropStickはPropellerの全ピンが出ているものの、AKI-H8の最大64ビットに比べれば全32ビットでも半分、 そして予約4ピンを除いた28ピンで、別途にアナログ入力端子のあるAKI-H8と同等のことを盛り込もう、 という点で既に無理がある。 しかし、ここはPropellerにテコ入れしたい僕としては、なんとかして、 Propellerが持っていないアナログ電圧入力をMAX161で拡張してでも、この試作基板の全機能に対応させたいのである。 ArduinoとGainerでは、この「試作基板の全機能に対応させたい」というのは、最初から捨ててかかっている。

ここでしばらく考えて、システム図を改訂するとともに、Propeller周辺について整理した。 汎用入出力拡張ポートとして内部データバスで多重化しているが、Propeller用のMAX161にはCS端子があるので、 さらにMAX161もこのバスに多重化する、というアイデアに気付き、一気に構成が洗練されてきた(^_^)。

  • AKI-H8
    • P10-P17 - (ポート電流が取れるのでreserved)
    • P20-P27 - (ポート電流が取れるのでreserved)
    • P30-P37 - (reserved)
    • P40-P47 - (reserved)
    • P50-P53 - (ポート電流が取れるのでreserved)
    • P60-P62 - 汎用入出力アドレス(A0-A2)
    • P63 - 汎用入出力・出力574ラッチパルス(CK)
    • P64 - 汎用入出力・入力245イネーブル(G)
    • P65 - 汎用入出力・入力MAXイネーブル161(CS)
    • P66 - (reserved)
    • P70-P77 - アナログ電圧入力AN0-AN7として使用
    • P80-P84 - (reserved)
    • P90-P95 - シリアル通信(UART)として使用(MAX232の11/12pinをcut) - MIDI or XBee
    • PA0-PA7 - 汎用入出力拡張バスライン
    • PB0-PB7 - (ポート電流が取れるのでreserved)
  • Propeller
    • P0-P2 - Video出力(1)
    • P3-P5 - (reserved)
    • P6-P8 - 汎用入出力アドレス(A0-A2)
    • P9 - 汎用入出力・出力574ラッチパルス(CK)
    • P10 - 汎用入出力・入力245イネーブル(G)
    • P11 - 汎用入出力・入力MAXイネーブル161(CS)
    • P12-P14 - Video出力(2)
    • P15 - (reserved)
    • P16-P23 - 汎用入出力拡張バスライン
    • P24-P25 - MIDI
    • P26-P27 - XBee
    • P28-P31 - USB通信/Flashメモリ用に予約
  • Arduino
    • ADC0-ADC7 - アナログ電圧入力0-7として使用
    • PD0/Rx - ホスト通信用 / XBee or 入力245イネーブル(G)
    • PD1/Tx - ホスト通信用 / MIDI or XBee
    • PD2-PD7 - 汎用入出力拡張バスライン(0-5)
    • PB0-PB1 - 汎用入出力拡張バスライン(6-7)
    • PB2-PB4 - 汎用入出力アドレス(A0-A2)
    • PB5 - 汎用入出力・出力574ラッチパルス(CK) or 入力245イネーブル(G)
とりあえずGainerを後回しにするとして、AKI-H8とPropellerとArduinoまでについて、 まずは、個々のマイコンごとのポート定義を上のようにまとめてみた。 AKI-H8については、内蔵の8ビットA/D入力に加えて、MAX161を選択して入力すれば、 外部マルチプレクサ無しでアナログ入力16チャンネルも可能となる。 PropellerについてはMIDIとXBeeの両立が可能、ビデオも最大2系統出力として、 Cogの分配からその全部の同居は無理としても、AKI-H8を上回る機能が実現出来そうだ。 Arduinoについては、ポートのビット数が1ビット不足するので、XBeeの入力(PD0)またはジャンパオプション、とした。 入出力をソフトの側で切り換えて両方を多重化する場合には、XBee入力は使えない(MIDIやXBeeの出力はOK)、という事になる。

CQ出版から新しい「エレキジャック」が届いたが、ArduinoでMIDIを受信する、という製作例が載っていた。 かつて Arduino日記 で調べたように、ちょっとMIDIのトラフィックを上げると、C言語のIDEで開発している限り、 ArduinoはMIDIを受信しきれずにデータ落ちを起こす(アセンブラで割り込みドライバを書けばAKI-H8のようにOKであるが)。 一般のプロトコルのように「データ落ちがあったらゴメンネ」という程度であればいいが、 MIDIの規約では1バイトでも落とせば「鳴った音が消えない」という、音楽において致命的な結果となるので、 僕の見立てとしては「ArduinoはMIDI受信に使えない」となる。 もちろん、 ジャミネータと遊ぼう でやったように、「暇な時に送信する」ので、MIDI送信にはまったく問題ない。 このあたり、ちょっとした電子工作のノリでMIDIを扱う人はいいのだが、こちとら音楽演奏においては、 ステージ上のライブでトラブる、という命がかかっているので、まったく姿勢が違うのである。

・・・ここからさらに、モードを仮定しながら、Gainerを組み合わせていくことになるが、 「サウンドデザイン演習」で電子工作キットの宿題が残っていた学生からのアポも次々に入り、 ここらまで、となった。 明日は講義満載なので、この続きは週末の碧風祭をまたぐ事になるかもしれない。

2012年11月2日(金)

昨日11/1(木)には、 「山村知世・年賀状イラスト集」 とか 「SUAC「赤本」が出た」 とかのWeb更新や、外出の用事があったりしたが、 今日は全学休講、碧風祭の準備日ということで、時間がソコソコある。 午後にメディア造形学科2回生の展示企画のためにマルチメディア室に保管のiMacを貸し出すぐらいである。

10/30のシステム設計検討で、最後に残っていた疑問点は、AKI-H8とPropellerとで「汎用入出力拡張バスライン」とした、 双方向切り替えの内部データバスの電圧レベルであった。 基本的にこの「SUACボード ver0.5」(こう呼んで馴れることにしよう(^_^;))の信号ラインは、+5V系である。 信号レベルが+3.3V系なのは、PropellerとXBeeだけなので、この部分にレベル変換を考慮しなければならない。 +3.3V系のPropellerやXBeeの信号出力は、LowはもちろんGNDレベル、そしてCMOSなのでHighはほぼ3V程度まで振れる、 と期待できる。 そこで、74HC245で受ければ、「+3.3V系→+5V系」は問題なく接続できる。

一方、ディジタル入力の 74HC245やMAX161の出力は+5Vなので、Propellerに入れるには直結は不可(壊れる)で、 直列に1kΩを入れる簡易型のレベルシフタとするのが定番である。 ところが「SUACボード ver0.5」では、この両者を双方向切り替えの内部データバスとする、と決めたので、 回路的には、

  • 内部入力ポートを並列接続したラインにビットごとに直列に1kΩを入れた信号
  • 内部出力ポートに送る74HC245の入力信号
とを結んで、これをAKI-H8/Propeller/Arduino/Gainerのポートに接続しなければならない事になる。 すると、今度は「74HC245やMAX161の出力に直列に1kΩを入れた信号」を、 ちゃんと+5V系のAKI-H8やArduinoやGainerがディジタル入力信号として受け入れられるか、 という検討が必要になるのである。

まずはAKI-H8について、秋月電子提供の日立のマニュアルPDFから、 以下のページを発見して、+2V以上というスレショルドから、おそらくOKであろう、という情報を得た。 もちろん実際に実験してみる必要がある。

Arduinoについては、あまりCPU自体について知らなかった(^_^;)ことを発見したが、 Arduinoのサイト からCPUは「Atmel ATmega328」と判明して、 Atmelのサイト から、24MBのシリーズ全体の マニュアル も入手できた。 この中から関連する電気的情報を探すと、以下のように、「0.6*Vcc」とあった。 電圧ドロップなくきっちり+5Vとして、「+3.0V」ということになる。 これはPropellerやXBeeから受けたらちょっとギリギリで厳しいが、 なんせCMOSの+5Vに直列1kΩ、ということであれば、こちらもOKな気がする。 もちろん実際に実験してみる必要がある。

あとはGainerである。 こちらもあまりCPUについて知らなかったが、 Gainerのサイト からCPUは「Cypress CY8C29466」と判明して、 Cypressのサイト から、 マニュアル も入手できた。 この中から関連する電気的情報を探すと、+2.1V以上というスレショルドから、 これはAKI-H8と同様におそらくOKであろう、という情報を得た。 もちろん実際に実験してみる必要がある。

居ながらにしてネットで10分ほどでこれだけの調査が出来るというのは、本当にいい時代である。 かつてメーカの研究開発セクションにいた時代であれば、ここまで確認するのに、 代理店を通して各社に調査して、まず2週間はかかったものだった(遠い目)。

マニュアルPDFでさらにMAX161を調べていると、ADC0808でも必要だったCLK入力が欲しいと判明した。 そのために、かつて使ったことのある、以下の京セラの EXO3-12MHz を使うことにした。秋月電子にちょうど12MHzがあり、これは1/2分周した6MHzがちょうどMAX161の最適クロックである。 また部品が増えたが(^_^;)、PropellerとMAX161を使う以外であれば、基板にパターンはあるとしても、 部品を搭載しなければいいのである。

これで後顧の憂いが無くなったので、MAX161のコントロール、 さらに前述のバスラインの信号レベルの確認も含めて、 いよいよPropQuickStartボードとMAX161の実験である。 今日は手描きの回路図を作っていたらオシマイになってしまったが、 明日と明後日の碧風祭ではとくにお呼びもかかっていないので、 寒かったら研究室で製作に勤しむことにしよう。

2012年11月5日(月)

11/3-4の 碧風祭 が終わり、また新しい週の始まりである。もう11月、今月は月末に推薦入試がある。 碧風祭の期間にも研究室で細々とハンダ付けを進めて、 ようやく今日の午後になって、以下のように、MAX161とPropellerとの実験基板が完成した。

これはハードが(一応)出来た、というだけであり、ここからいよいよ楽しいPropellerプログラミングである。 ・・・という矢先に、発注していたモノが届いた。 以下のように、Raspberry PiのためのUSB-ACアダプタと、HDMI-DVIケーブルである。 これで実験机の上の大型モニタに出せるようになった。 ちなみにLANケーブルを繋ぎ、「Midori」というブラウザを立ち上げると、 プロキシの設定も簡単で、あっさりとSUACネットから学外に出て、自分のWebページが見れてしまった。 こんな小型のボード、それも2000円なのに、である(^_^;)。 さすがにフォントに「EUC_JP」が無いので僕のサイトは文字化けするが、しかし、凄いものである。

しかし、Raspberry Piに驚いたりRaspberry Piと遊ぶ前に、まずはPropellerである。 アカペラまで2時間ほどあるので、進めてみることにした。 Propellerからの出力としては、3ビットの抵抗ラダーによる簡易D/Aによって、 ビテオ信号をソウトウェア的に生成するライブラリを発掘する、という作戦である。

古いプログラムを発掘していくと、どうもビデオ信号をPropellerから出す、という実験は、 2008年5月あたりにやって、それ以降はノータッチだった。 あれこれ苦労して、とりあえずまずは、以下のようにLEDと同じデータをモニタに出せた。

しかしここから足踏みすることになった。 サンプルにあったグラフィックライブラリを、自分なりに改良していたのだが、 そのあたりは完全に忘却していて、なかなかうまくいかない。
CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000

OBJ
  Num : "E_Numbers02"
  TV : "E_TV_Terminal02"
  gr : "E_Graphics02"

PUB main | dummy, para, data
  Num.Init                      { Num.Init MUST be called before first object use. }
  para := TV.Start1(0)
  dummy := TV.Start2
  port_initial
  TV.out(0)                     { display home }
  TV.Str(string("TV_port_Cog ="))
  TV.Str(Num.ToStr(para, Num#DEC))
  TV.Str(string(", Graphic_driver_Cog ="))
  TV.Str(Num.ToStr(dummy, Num#DEC))
  dummy := 0
  data := 0
  repeat
    dummy++
    if dummy > 1000
      dummy := 0
      data := (data+1) & %11111111
      outa[23..16] := data
      TV.out(data//3+1)
      TV.Str(Num.ToStr(data, Num#HEX))

PUB port_initial
  dira[23..16]~~
こんなところで、刻々とビデオ出力として16進表示までは出来た。 アカペラの時間も迫ってきたので、今日はここまでとなった。残念。(^_^;)

2012年11月6日(火)

いつものように終日空いている火曜日であるが、翌日の「メディアアーツ論」と「サウンドデザイン演習」で紹介する教材を準備したり、 情報処理学会・音楽情報科学研究会の12月研究会のプログラム担当として、発表申し込みを締め切って整理するなど、 いろいろ些事が立ちはだかってくる(^_^;)。

再開の最初は、ビデオにテキストカラーを変えて16進表示したデータが、 0から15までは「1文字」になってしまうのを、printf関数であれば「%02h」となる、 先頭にゼロを付けた2文字表示にする、という定番の改良である。 文字列の値に応じて、先頭に「ゼロ」文字を付加する、という方針かと思ったが、 なんと数値表示ライブラリ「E_Numbers02.spin」に、以下のような表示オプションが定義されていることを発見した。

CON
'             III ZZZ GGG P S FFFFFF BBBBB
  CHAR2    =  %000_000_000_0_0_000010_00000     'Fixed Width
  CHAR3    =  %000_000_000_0_0_000011_00000
  CHAR4    =  %000_000_000_0_0_000100_00000
  CHAR5    =  %000_000_000_0_0_000101_00000
  CHAR6    =  %000_000_000_0_0_000110_00000
  CHAR7    =  %000_000_000_0_0_000111_00000
  CHAR8    =  %000_000_000_0_0_001000_00000
  CHAR9    =  %000_000_000_0_0_001001_00000
  DEC      =  %000_000_000_0_0_000000_01010     'Decimal, variable widths
  HEX      =  %000_000_000_0_0_000000_10000     'Hexadecimal, variable widths
  HEX2     =  HEX+CHAR2                         'Hexadecimal, fixed widths, zero padded
  HEX3     =  HEX+CHAR3
  HEX4     =  HEX+CHAR4
  HEX5     =  HEX+CHAR5
  HEX6     =  HEX+CHAR6
  HEX7     =  HEX+CHAR7
  HEX8     =  HEX+CHAR8
  HEX9     =  HEX+CHAR9
これを使うことで、以下のようにmainのループ内の「TV.Str(Num.ToStr())」の部分を、 「Num.ToStr(data, Num#HEX3)」とするだけで、奇麗に表示できた。
PUB main | dummy, para, data
  .............
  repeat
    dummy++
    if dummy > 1000
      dummy := 0
      data := (data+1) & %11111111
      outa[23..16] := data
      TV.out(data//3+1)
      TV.Str(Num.ToStr(data, Num#HEX3))

これでOK、次にはA/D変換のデータをビデオでモニタするために、表示位置を固定する必要がある。 いつもの手で、ページ先頭に戻してから「改行」「タブ」で指定することにした。 そしてここまで順調に来たように見えたが、突然にストップしてしまった。 まぁいつもの事であるが、ハードが出来てもソフトを走らせてちゃんと動かない限り、 そのシステムはまったく未完成なのである。

いろいろ調べたり試したりしてみたが、「MAX161から何も来ない」という現象である。 マニュアル を改めて見てみると、A/D結果は独自にデュアルポートRAMに書き込まれて、 CPUは好きなタイミングで読み出せる筈である。 分らないのが、サンプルとして3種類、紹介されている、「0-5V」でない範囲の電圧への対応である。 こちらは何もナシに「0-5V」が欲しいのだが、ここではVrefとかVoffsetとか、なにやら外付け部品が並んでいる。 ADC0808(0809)では、何も迷うことなく単純に出来たA/D変換回路が、 ここにきて暗礁に乗り上げてしまった。 音楽情報科学研究会のプログラム編成もあり、中途半端ながら、この日はここまでとなった。(^_^;)

2012年11月8日(木)

講義満載の怒濤の水曜日を経て、この日は半日ほど、MAX161と格闘した。 ALEを出したりアドレスを000に固定したり・・・と、可能性を全て当たったが、駄目だった。 MAX161を替えたり、VrefとVoffsetの接続など色々に試してみたが、どうしてもデータが得られない。 EX03からのクロックを下げたり、オシロまで出してCSなども調べたが、駄目である。

そもそも、データシートに従って実験して、その通りに動かなかったチップというのは、 ちょっと記憶に無いのだが、実は このマニュアル は、ちょっとおかしいのである。 +5Vユニポーラのもっともシンプルな回路例が無いというよりも、 肝心のデータ部分で、ACタイミングの欄はほとんど矛盾のオンパレードである。 アクセスタイムとかセットアップタイムは、MINとTYPとが記述されていれば、 MAXの方はいくらでもいい・・・というのが普通だが、このマニュアルでは、 タイミング/クロック関係の全てのパラメータが「反対」である。 マニュアルのライタのケアレスミス、という理由は無理があるので、 なんだか「ヘン」なマニュアルなのだった。(^_^;)

・・・そして結論として「MAX161は諦める」と決めて、あらためて手元にもストックのあった ADC0808 に付け替えよう、とMAX161のための配線を全部取り去った。

そして改めて ADC0808 のマニュアルを読んでいて思い出したのが、ディジタル入力電圧のスレショルドである。 ここで、10月29日に書いていた、「ADC0808はディジタルのインターフェースがHSCMOSではなくてTTLのため、 Propellerの+3.3Vの信号出力では「Vcc-1.2V」というHレベルのスレショルドに不足する。 ここにわざわざ、レベル変換の石を使うのもシャクである」と書いていたのを思い出した(^_^;)。 そうなのだ、アドレス3ビットにALEとOEとSTART、計6ピットもレベル変換するのでは、 74HC367など、16ピンICが増えてしまうのだった。

ここで一念発起して、また新たにYAHOO.COMに検索に出かけた。 ADC0808/0809とほぼ同等のスペックで、CMOSレベルのより新しいA/Dコンバータも出ている筈だ、 という予想からである。 そして遂に、「analog to digital 8channel 8bits CMOS」などと入れて、 同じAnalog Devices社から、 AD7829-1 というチップを発見した。 Digikeyで価格を調べると、以下のように1000円以下と良好である(^_^)。

スペックを見てみると、ADC0808とは互換でないものの、ほぼ同等であり、電圧の問題もスレショルドの問題も解決されている。 コレだ! と、さっそくサンプルを業者に発注しようとさらに調べていると、なんと マニュアル の最後のページに、驚くべき情報を発見した。 このチップには、「600milのノーマルDIP」が無かったのである(^_^;)。 さすが、新しいチップでは、もはやノーマルDIPなど不要なのだろうが、これは困った。

そこでさらに検索していくと、同じAnalog Devices社から、 AD7829 というチップを発見した。 これは「AD7829-1」と違って、1/4/8ビットのA/Dのファミリであり、なんと マニュアル の最後のページを見ると、プラスチックパッケージに「600milのノーマルDIP」があった。 もちろん、電圧の問題もホストインターフェースのスレショルドの問題も解決されている。 ところが今度は、Digikeyでコストを調べてみると、DIPパッケージの「AD7829BN」については、 以下のように「取り扱っていない」のだった(^_^;)。

他の電子部品サイト(台湾とか中国とか)では、在庫しているところもありそうなので、 とりあえず業者に発注を依頼してみたが、いつ納品されるかは不明である。 こういうドタバタは嫌いではない(^_^;)ので、結構、楽しんでいるところがあるが、 この状態で「A/D待ち」で止まってしまうのもあまり嬉しくない。 せっかくなので、ここで以下のように作戦を整理してみた。
  • AD7829BNが簡単に入手できる場合
    → 実験してA/Dコンバータを搭載する方向へ
  • AD7829BNが簡単には入手できない/異常に高価な場合
    • 74HC367も増設してADC0808を使う
      → さらに基板が大きくなるし美しくない(^_^;)
    • AD7829-1のフラットパッケージを使う
      → いっそのこと、74HC245/74HC574も全てミラフラットパッケージにしたくなる
    • PropellerだけのためのA/D外付けは搭載しない
      → これもアリかも(^_^;)
とりあえず、業者が調べて入手とコストの見込みを回答するのを待つ、というところで、 きょうはここまでである。 企業の製品開発の現場(修羅場)であれば、開発期間と納期に追われてそれどころではないが、 こうやってあれこれ紆余曲折するのも、また電子回路の設計の醍醐味である。

2012年11月12日(月)

汎用実験試作基板を作る、という初めてのプロジェクトは遅々としている気がするが、 まぁそれなりにぼちぼち進展している、とも言える。 この日記part4も既に90KBとなり、Raspberry Piとかの話題はあったものの、 実質的には遅々としてページの区切りの分量を迎えようとしている。 この週末はもろもろデータ整理などで進展が無かったが、業者から「AD7829BN」が入手できる、 と連絡があったので、入荷(→実験)まで回路CAD設計を進めることにしよう。

基板については、コストが「ピン数」、つまりスルーホールの穴開け/めっき加工の総数に依存するので、 多数のDIP(74HC245/74HC574)を、全て300milのミニフラットパッケージにしてしまう、 という可能性に改めて注目した。 過去に、Wiiリモコンに付加する手首の筋電センサの開発研究の時に、 こんな作業 をやっていて、学生には難しいものの、フラックスを使えばそこそこ簡単に出来る、と経験していたのである。 全体が確定してからカウントすればいいが、これによって、基板サイズもかなり小さく、コストもかなり安価になる。 基板の用途としてディジタル多数ポートを使用しない場合には、ICを付けなければいいので、 この可能性はキープしていこう。

回路設計CADの上ではミニフラットパッケージ(300mil)もノーマルDIP(600mil)もまったく同等というのも、 まぁ当たり前ではあるが、考えてみると面白い。 ミニフラットパッケージの図面が必要になるが、これはどこからでも入手できる。 とりあえず、A/Dの「AD7829-1」「AD7829」は電気的にはほぼ同じなので、 0.65ミリピッチの「28-Lead Thin Shrink Small Outline Package [TSSOP]」はちょっと怖いので(^_^;)、 0.5インチ(1.27ミリピッチ)の、 以下の「28-Lead Standard Small Outline Package [SOIC_W]」を使うことになる。

DIP(74HC245/74HC574)についても、以下のように0.5インチ(1.27ミリピッチ)のパッケージがある。 これを並べる、という方向に行く可能性が大きく浮上してきた。

回路設計においては、既に登録していたMAX161を捨てて(^_^;)、 新たにAD7829を登録する必要があり、あとはMIDIやXBeeなどの通信関係ぐらいである。 AD7829はよくマニュアルを見ると、外部クロックが不要であるらしい。 さらに、Vmidという電圧入力端子があり、A/Dコンバータのダイナミックレンジは2.5Vであるところに、 Vmidのオフセットを任意に与えられるという。 まぁ、+5V系のシグナルコンディショニング回路にLM324などを単電源回路として使えば、 どうせ+4Vレンジぐらいまで圧縮されるので、これは問題ない。

ホストとのインターフェースは、Convst信号でA/D変換が開始、その後にEOCをモニタするハンドシェイクのようである。 かなり高速なので、1回のA/D変換で一気に8チャンネル分を獲得できそうである。 CSとRDと2ピンが必要なのか・・・と調べてみたら、これらのセットアップタイムとホールドタイムは「0ns」ということで、 両方まとめて制御できる事が判明した(^_^)。 ここらを調べつつ、10月30日のところで定義していた、各マイコンボードのピン定義について、 Propellerのビデオ出力ドライバの制限(3ビット束のスタートピンは4の倍数)、 A/D関係のインターフェースの変更などをふまえて、以下のように改訂してみた。

  • AKI-H8
    • P10-P17 - (ポート電流が取れるのでreserved)
    • P20-P27 - (ポート電流が取れるのでreserved)
    • P30-P37 - 汎用入出力拡張バスライン
    • P40-P42 - 汎用入出力アドレス(A0-A2)
    • P43 - 汎用入出力・出力574ラッチパルス(CK)
    • P44 - 汎用入出力・入力245イネーブル(G)
    • P45 - 汎用入出力・AD7829イネーブル(CS/RD)
    • P46 - 汎用入出力・AD7829変換開始(CONVST)
    • P47 - 汎用入出力・AD7829変換終了(EOC)入力
    • P50-P53 - (ポート電流が取れるのでreserved)
    • P60-P66 - (reserved)
    • P70-P77 - アナログ電圧入力AN0-AN7として使用
    • P80-P84 - (reserved)
    • P90-P95 - シリアル通信(UART)として使用(MAX232の11/12pinをcut) - MIDI入出力 or XBee入出力
    • PA0-PA7 - (reserved)
    • PB0-PB7 - (ポート電流が取れるのでreserved)
  • Propeller
    • P0-P2 - Video出力(1)
    • P3 - (reserved)
    • P4-P6 - Video出力(2)
    • P7 - (reserved)
    • P8-P15 - 汎用入出力拡張バスライン
    • P16-P18 - 汎用入出力アドレス(A0-A2)
    • P19 - 汎用入出力・出力574ラッチパルス(CK)
    • P20 - 汎用入出力・入力245イネーブル(G)
    • P21 - 汎用入出力・AD7829イネーブル(CS/RD)
    • P22 - 汎用入出力・AD7829変換開始(CONVST)
    • P23 - 汎用入出力・AD7829変換終了(EOC)入力
    • P24-P25 - MIDI入出力
    • P26-P27 - XBee入出力
    • P28-P31 - USB通信/Flashメモリ用に予約
  • Arduino
    • ADC0-ADC7 - アナログ電圧入力0-7として使用
    • PD0/Rx - ホスト通信用 / XBee or 入力245イネーブル(G)
    • PD1/Tx - ホスト通信用 / MIDI or XBee
    • PD2-PD7 - 汎用入出力拡張バスライン(0-5)
    • PB0-PB1 - 汎用入出力拡張バスライン(6-7)
    • PB2-PB4 - 汎用入出力アドレス(A0-A2)
    • PB5 - 汎用入出力・出力574ラッチパルス(CK) or 入力245イネーブル(G)
AKI-H8とPropellerとは、ほぼピンアサインが似た配置にすることが出来た。 Arduinoについては何と言ってもピンが少ないので、ちょっとトリッキーに多重化して、 ジャンパオプションを仕込む必要がある。 Gainerについてはピン不足はなおさらなので(^_^;)、これは他マイコンの回路が確定してから考えよう(^_^;)。

午後になって、1回生の金重さんが研究室に来て、一緒に ドラえもん望遠鏡 を作って記録した。 制作は超カンタンだったが、撮影にこれまでで一番、難儀した(^_^;)。 そして後は放課後のアカペラまでの時間、引き続き、「CADLASサーキット」で回路エントリーを続けた。 汎用入出力バスの信号に間違いを発見するなど、なかなか外見では分らない修正が続く。 これだからCADは嫌なのである。(^_^;)

しばしの苦行の後に、とりあえず今日は ここまで という区切りまで進んだ。 こうやって、しばらくは遅々として行くしかないのだろう。

2012年11月13日(火)

今日は何も予定がない、Propeller日記日和である(^_^)。 遠い記憶によれば、たぶん11月13日というのは「茨城県民の日」であり、県内の学校はお休みだった。 この休日に水戸から秋葉原と青梅鉄道公園に一人旅したのは中学生の頃だっただろうか。 しかし、茨城県民だった18年、学生時代の京都4年を経て、静岡県民歴がもう32年目である(^_^;)。 明日の講義の準備もほぼ終わっているので、びしばし行けばいいのだが、そういう時に限って、 寄り道したくなるのも人情である(^_^;)。

先週の講義の際に、ある学生から僕の名前がネット上で絶賛されている、と言われたのを思い出して、 リンク切れチェックも兼ねて検索すると、アッサリと出て来た。 YAHOOで「長嶋洋一 日記」と検索すると、 「長嶋洋一教授のSuperCollider日記はヤバいです。」 というリンクが出て来た。 これは、大阪のSuperColliderワークショップでご一緒した人のブログらしい。 ただしこのリンクは「bit.ly」で圧縮形になっているので、URLが変更になったので出てくる URL変更メッセージ に飛んでも、URLを変更できない(^_^;)。

YAHOOのリンクには、山形市立大?の「千秋ゼミ」の 「長嶋洋一さんのPropeller日記」 という紹介リンクもあった。読んでくれた人がいて、お役に立っていれば嬉しいことである。 ただし、このURLも旧版なので、URL変更メッセージに飛ぶことになる。 うまくここの記述に従って、新しいURLに到達してくれれば、と願う。 取得ドメインはそのまま内部記述だけ変更したこの新しいURL体系は、今後ほぼ存続の予定である。

・・・かと思うと、いきなり知らない人から名指しで(^_^;)、 「長嶋洋一さん向け: 電子回路で芸術」 というブログも出て来た(^_^;)。 その先には 「空中配線ロボット」 というページがあったが、これならもっと凄い巨大なものを、アルスエレクトロニカだったかNIMEだったか、で見てきた。 空中配線は僕も嫌いではないので、2006年に手作りしてNIME2007(ニューヨーク)で公演した以下の楽器とかも、 基板ナシで全てスズメッキ線で空中配線しているので、あまり驚かない。

それより驚いたのは、こちらも知らない人の 「モーニング娘?AKB48?電波系なら国民的GB(ガールズバンド)ジャミーズ娘一択だろ!」 というブログである(^_^;)。 どこから知ったのか、YouTubeのリンクもあるし、「ジャミネータと遊ぼう」のリンクも新しいURLである。 しかし、「ジャミーズ娘」が「電波」である、というのは、ここで初めて知った。(^_^;)

こうやってネットを掘っていくのも楽しいが、これでは何も生み出せないので、寄り道はここらにしよう。 来年の国際会議の募集もだいぶ出揃ってきて、今月中には1件、応募するものがあるのだが、 こちらは昨夜、ふと新しいアイデアが出て来たので、なんとか出せそうである。 メディア造形の1-2回生あたりで、春休みにでも「新・ジャミーズ娘」をやりたい・・・というのが何人か出てくれば、 この新アイデアに沿ってまた新たにJaminator改造大会をやりたいところなのだが、どうなるか。 (誰もこんなところ、読んでいないだろうなぁ・・・)

そして、午前中をかけて過去の「Propeller日記」を読み返しつつリンクバグを修正して、 午後になってここは一度、キチンと回路図を描いて・・・ということで、 かなり時間をかけて以下のように描いてみた。

そしてあとはXBeeの回路、というところまで描いたところで業者がやって来て、 なんと速攻で、注文していた、ノーマルDIP(600mil)のA/Dコンバータ「AD7829」が届いた。 これは、バスラインの電圧レベル変換、そしてA/D変換の制御タイミングなどの確認のために、 回路設計をpendingしてでも、まずは実験してみたいところである。 Propellerから制御する部分の実験プログラムは、そのまま汎用実験基板でも使えるものとなる。

・・・ここから3時間ほどで、以下のように、とりあえず8チャンネルA/D変換が出来た。 実際には、まだどこかに単純なバグがあって(^_^;)、入力チャンネルと表示されているチャンネル番号が1つだけズレているが、 まぁこれは後日、冷静になれば見つかるだろう。

ここで実験したプログラムは以下である。 たぶん間違いなくバグ有りであるが(^_^;)、とりあえず記載しておこう。
CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000

OBJ
  Num : "E_Numbers02"
  TV : "E_TV_Terminal02"

PUB main | dummy, data, sel
  Num.Init           { Num.Init MUST be called before first object use. }
  port_initial
  TV.Start1(0)
  TV.Start2
  outa[21]~~
  outa[22]~~
  outa[18..16] := 0
  TV.out(1)

  repeat
    outa[22]~
    outa[22]~~
    repeat while ina[23] < 1
    outa[21]~
    data := ina[15..8]
    outa[21]~~
    TV.out(13)
    TV.Str(Num.ToStr(sel, Num#DEC))
    TV.Str(Num.ToStr(data, Num#HEX3))
    sel := (sel+1) & 7
    outa[18..16] := sel
    if sel == 0
      waitcnt(10000000+cnt)
      TV.out(0)

PUB port_initial
  dira[15..8]~                  ' universal bus line : input
  dira[18..16]~~                ' select A2-A0 : output
  dira[21]~~                    ' CS/RD : output
  dira[22]~~                    ' CONVST : output
  dira[23]~                     ' EOC : input
それにしても、ちょうど院生とArduinoをやっている事もあるが、Propellerのspin言語を忘れている事に愕然とした。 まぁ、コンピュータ言語なんてのは、数日でも離れていれば忘れる、というぐらいが健康的なのかもしれない。

2012年11月14日(水)

水曜日は講義満載でPropellerは進まない筈であるが、つかの間の3限に進展した(^_^)。 またまた夜中にフト目覚めて、そこで思い出した事があり、布団の中で解決していたのである。 残像のように頭に残っていたのは、以下のAD7829のタイミングチャートであった。

つまり、A/DデータをPropellerに読み込むためにRD/CSを下げる時に、 一緒に出しているセレクトアドレスは、その読み出しアドレスの「次」だったのである。 これが、前日、ズレていた原因である。 そしてもう一つ、EOCをモニタしている足踏みルーチンだが、 極性が逆のようで気になっていたが、実はこれは、A/D変換が猛烈に速いので、 実質は不要なのではないか、というアイデアだった。

この両方ともまさに正解で、無駄な足踏みも不要、そしてアドレスを整合させることで、 以下のプログラムでまさに想定通りに動作した。 3限の最後、30分の速攻勝負であった。(^_^)

CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000

OBJ
  Num : "E_Numbers02"
  TV : "E_TV_Terminal02"

PUB main | dummy, data, sel
  Num.Init           { Num.Init MUST be called before first object use. }
  port_initial
  TV.Start1(0)
  TV.Start2
  outa[21]~~
  outa[22]~~
  sel := 0
  TV.out(1)

  repeat
    dummy := sel
    sel := (sel+1) & 7
    outa[18..16] := sel
    outa[21]~
    data := ina[15..8]
    outa[21]~~
    TV.out(13)
    TV.Str(Num.ToStr(dummy, Num#DEC))
    TV.Str(Num.ToStr(data, Num#HEX3))
    if sel == 0
      waitcnt(10000000+cnt)
      TV.out(0)
    outa[22]~
    outa[22]~~

PUB port_initial
  dira[15..8]~                  ' universal bus line : input
  dira[18..16]~~                ' select A2-A0 : output
  dira[21]~~                    ' CS/RD : output
  dira[22]~~                    ' CONVST : output
  dira[23]~                     ' EOC : input

これで無事に、AD7829のチェックは完了となった。 そしてさらに嬉しい収穫は、「EOC」のピンが不要となった事である。 そうなると、「CONVST」は共用できるので、せっかくならミニフラットのAD7829を2個搭載して、 アナログ拡張入力を8ビットでなく16ビットにしたくなる。 Propellerで16チャンネル、AKI-H8では24チャンネルと出来る。 せっかくなので、各マイコンのポート定義を以下のように改訂してみた。
  • AKI-H8
    • P10-P17 - (ポート電流が取れるのでreserved)
    • P20-P27 - (ポート電流が取れるのでreserved)
    • P30-P37 - 汎用入出力拡張バスライン
    • P40-P42 - 汎用入出力アドレス(A0-A2)
    • P43 - 汎用入出力・出力574ラッチパルス(CK)
    • P44 - 汎用入出力・入力245イネーブル(G)
    • P45 - 汎用入出力・AD7829イネーブル[1](CS/RD)
    • P46 - 汎用入出力・AD7829イネーブル[2](CS/RD)
    • P47 - 汎用入出力・AD7829変換開始(CONVST)
    • P50-P53 - (ポート電流が取れるのでreserved)
    • P60-P66 - (reserved)
    • P70-P77 - アナログ電圧入力AN0-AN7として使用
    • P80-P84 - (reserved)
    • P90-P95 - シリアル通信(UART)として使用(MAX232の11/12pinをcut) - MIDI入出力 or XBee入出力
    • PA0-PA7 - (reserved)
    • PB0-PB7 - (ポート電流が取れるのでreserved)
  • Propeller
    • P0-P2 - Video出力(1)
    • P3 - (reserved)
    • P4-P6 - Video出力(2)
    • P7 - (reserved)
    • P8-P15 - 汎用入出力拡張バスライン
    • P16-P18 - 汎用入出力アドレス(A0-A2)
    • P19 - 汎用入出力・出力574ラッチパルス(CK)
    • P20 - 汎用入出力・入力245イネーブル(G)
    • P21 - 汎用入出力・AD7829イネーブル[1](CS/RD)
    • P22 - 汎用入出力・AD7829イネーブル[2](CS/RD)
    • P23 - 汎用入出力・AD7829変換開始(CONVST)
    • P24-P25 - MIDI入出力
    • P26-P27 - XBee入出力
    • P28-P31 - USB通信/Flashメモリ用に予約
  • Arduino
    • ADC0-ADC7 - アナログ電圧入力0-7として使用
    • PD0/Rx - ホスト通信用 / XBee or 入力245イネーブル(G)
    • PD1/Tx - ホスト通信用 / MIDI or XBee
    • PD2-PD7 - 汎用入出力拡張バスライン(0-5)
    • PB0-PB1 - 汎用入出力拡張バスライン(6-7)
    • PB2-PB4 - 汎用入出力アドレス(A0-A2)
    • PB5 - 汎用入出力・出力574ラッチパルス(CK) or 入力245イネーブル(G)
これにより、若干だけ見劣りしていたPropeller関係のスペックも強力になった。 これで進めていくことにした。 いよいよ4限は「サウンドデザイン演習」、音楽理論講座をさらに進めていこう。

2012年11月15日(木)

いつものように7時ごろに研究室に出勤すると、SketchingのMLから面白いメイルが届いていた。 Propellerと関係なさそうで、実は僕の中では「Sketching=Propeller」というぐらいに関係が大アリなのである。 Sketchingというのは、「Sketching in Hardware」という国際会議(summit)で、過去には と開催されてきたようであるが、僕が参加したのは、これまで の3回である。キッカケは、友人であるIAMASの小林茂さんから、何かの折りに聞いたことだった。 Sketching in Hardwareは、実質的には 「ThingM」を主宰する、 Mike Kuniavsky氏が取り仕切っている、closedなコミュニティである。 普通の国際会議と違って、参加は「募集」でなくて「招待」制である。 一度参加すると、翌年からは「今年も参加する?」と聞いてくるが、いちばん最初は、誰か参加者に取り次いでもらって、 Mike Kuniavsky氏からの招待をもらわないといけない。 Gainer/funnelの小林さんは実はSketchingのスターなので、このルートを活用したわけである。(^_^;)

Sketchingの詳細は上記「レボート」などを参照するということで省略して、 今回、そのメンバーから届いたのは、 「こういうのをヨロシク」という情報であった。 これは、KickStarter を利用した、新しいプロジェクトの「賛同・購入者」募集、というページである。 すでにMike Kuniavsky氏本人の 「こういうのをヨロシク」 のbackerとして発注していたので、これが2件目である。

KickStarter というのは実に面白いシステムで、何か新しいことを発想/企画した人が、 ネットに賛同者(出資者)を募って、目標金額に到達したら、その資金でそのアイデアを実際に実現する、というサイトである。 僕が賛同した2件は、いずれもイニシャルの試作開発費用がかかるので、 ある目標の資金が調達できる、となって初めて、応募した金額がクレジットカードから引かれるのである。 こんな面白い話に乗らない理由もなく、速攻で発注(支援表明)した。 果たして目標に達して、以下のブツが届くかどうか、楽しみである。

いま開発中の汎用実験試作基板は、とりあえずSUACの学部長特別研究として進めているが、 将来的には、この KickStarter あたりに出してみる、というのも面白いかな、と思う。 お金のやりとりが面倒なようだが、おそらくKagiとかPayPalとかで統一的にやっているのだろう。 2004年に NIME2004 をSUACで開催した時には、「大会委員長・一人事務局」として口座を開設して、 海外・国内からの参加者300人近くの参加費を、全てKagi経由で処理したことがあったので、 あの面倒臭さはもう勘弁だが(^_^;)、これは可能だと思う。 何より、こういうツールでアクティビティを世界に発信できる、という事が面白そうである。

そしてこの日は、前日の結果を受けて汎用試作基板の回路図を修正して、 さらに午前中は「メディアアーツ論」の多数の学生Daily Reportへのコメントを講義ページに掲載しているうちに終わり、 午後の3限は来週末に迫った推薦入試に関する業務で消えて、4限は学生委員会、 5限は2回生の土佐谷さんの電子工作キットの不調原因解析→修復解決(^_^)、で終わった。 放課後にOGの野口さんがチラッと寄っていったが、これで今日はオシマイである。 明日の金曜日には、またまたPropellerに戻って、基板の設計を進めたいところである。

2012年11月16日(金)

これまで描き進めてきた回路図に、残されていたXBeeを追加した。 そしていよいよ、これまで「載せる」とだけしていたGainerについて、あらためて このPDFの表 を眺めて検討した。 Gainerには8つのモードがあるが、スイッチマトリクスのモード7と特殊なモード8を別にして、 小林さんがよく考えた6種類のモードがファームウェアとして提供されている。

しかし、過去に何度となくGainerを使っていると、「帯に短し襷に長し」(^_^;)というのを何度も経験している。 入門者向けに、アナログ入力が4ポート、PWMのLED表示が4ビット、 さらにディジタルで入力も出力もそれぞれ4ビット(モード1)もあれば十分だ、 というのは、本当に教育用途の入門編だけである。 インスタレーション作品に使う場合には、スイッチが16個どころか20-30個欲しいとか、 モータだって16個とか20個ドライブしたいとか、とにかく不足するのである。 「Gainerカイダン」のように、Gainerを50個とか100個とか使うというのも、 USBの仕様から最大127個までOKであるとしても、あまりにスマートじゃない(^_^;)。 これまでの例では、「Gainer2個使い」というのは何度かやったが、これが限度だろう。

今回の汎用実験試作基板で、Propeller・AKI-H8・Arduinoについては、 「ディジタル出力64ビット(PWMでアナログ出力にも対応)」・「ディジタル入力64ビット」・「アナログ入力16チャンネル」という拡張を可能とした。 しかしこれは、「汎用入出力拡張バスライン」として8ビットのポートを確保して、その上で、 8ピットを8個の系列に振り分けるための3ビットのアドレス、 さらにラッチ出力(CK)/セレクト入力(G)/アナログ入力(CS)の制御線が必要となる。 Propeller・AKI-H8ではこのポートを全て予約定義して完備したが、 Arduinoではポート数の限界から、ジャンパオプションによってやり繰りして、なんとか実現した。 そしてGainerでは、モードによって色々と使い分けているものの、まさに「帯に短し襷に長し」で、使えないのであった(^_^;)。

ちょっと検討した結論として、この汎用実験試作基板にGainerを搭載する意義があるのは、 「ディジタル出力64ビット」に拡張する場合に限ることが判明した。 モード6の、全ピンをディジタル出力に定義した場合に、そのうち8ビットを「汎用入出力拡張バスライン」として、 あとセレクトとCKの計4ビットで制御することになる。 残りの4ビット出力は、まぁコネクタから出すぐらいである。 他のモードの時には、この基板にGainerを載せる意味が無いので、従来と同様に、個別の基板を組むことになる。

これで全体が整理されたので、回路図にまとめて、遂に回路が以下のように出来た。 これは最初に描き始めた頃の「絵に描いた餅」ではなくて、Propellerを使ってAD7829の実験もやってきたので、 そのまま動くことに確信を持った回路である。(^_^)

そしてこの回路図とセットで、以下のように、Gainerまで加えて、あらためて各マイコンのポート定義を整理した。 今度はシリアル通信のdirectionまできちんと定義してある。 Gainerについては「モード6に限定」という条件である。 この定義は今後、ハードが固定すれば変更はほぼ無理となるし、関連した周辺回路インターフェースのドライバなどの汎用性から、 絶対に変更しない(フラつかない)、という覚悟とともに規定するものである。 これでP板設計のために必要な回路設計の情報は、全て完備したことになる。(^_^)
  • AKI-H8
    • P10-P17 - (ポート電流が取れるのでreserved) - コネクタピン設置
    • P20-P27 - (ポート電流が取れるのでreserved) - コネクタピン設置
    • P30-P37 - 汎用入出力拡張バスライン
    • P40-P42 - 汎用入出力アドレス(A0-A2)
    • P43 - 汎用入出力・出力574ラッチパルス(CK)
    • P44 - 汎用入出力・入力245イネーブル(G)
    • P45 - 汎用入出力・AD7829イネーブル[1](CS/RD)
    • P46 - 汎用入出力・AD7829イネーブル[2](CS/RD)
    • P47 - 汎用入出力・AD7829変換開始(CONVST)
    • P50-P53 - (ポート電流が取れるのでreserved)
    • P60-P66 - (reserved)
    • P70-P77 - アナログ電圧入力AN0-AN7として使用
    • P80-P84 - (reserved)
    • P90 - MIDI出力 or XBee出力 (MAX232の11/12pinをcut)
    • P92 - MIDI入力 or XBee入力 (MAX232の11/12pinをcut)
    • PA0-PA7 - (reserved) - コネクタピン設置
    • PB0-PB7 - (ポート電流が取れるのでreserved) - コネクタピン設置
  • Propeller
    • P0-P2 - Video出力(1)
    • P3 - (reserved) - コネクタピン設置
    • P4-P6 - Video出力(2)
    • P7 - (reserved) - コネクタピン設置
    • P8-P15 - 汎用入出力拡張バスライン
    • P16-P18 - 汎用入出力アドレス(A0-A2)
    • P19 - 汎用入出力・出力574ラッチパルス(CK)
    • P20 - 汎用入出力・入力245イネーブル(G)
    • P21 - 汎用入出力・AD7829イネーブル[1](CS/RD)
    • P22 - 汎用入出力・AD7829イネーブル[2](CS/RD)
    • P23 - 汎用入出力・AD7829変換開始(CONVST)
    • P24 - MIDI入力
    • P25 - MIDI出力
    • P26 - XBee入力
    • P27 - XBee出力
    • P28-P31 - (USB通信/Flashメモリ用に予約)
  • Arduino
    • ADC0-ADC7 - アナログ電圧入力0-7として使用
    • PD0/Rx - (ホスト通信用) / XBee入力 or 汎用入出力・入力245イネーブル(G)
    • PD1/Tx - (ホスト通信用) / MIDI出力 or XBee出力
    • PD2-PD7 - 汎用入出力拡張バスライン(0-5)
    • PB0-PB1 - 汎用入出力拡張バスライン(6-7)
    • PB2-PB4 - 汎用入出力アドレス(A0-A2)
    • PB5 - 汎用入出力・出力574ラッチパルス(CK) or 入力245イネーブル(G)
  • Gainer
    • Ain0-Ain3 - 汎用入出力拡張バスライン(0-3)
    • Din0-Din3 - 汎用入出力拡張バスライン(4-7)
    • Aout0-Aout2 - 汎用入出力アドレス(A0-A2)
    • Aout3 - 汎用入出力・出力574ラッチパルス(CK)
    • Dout0-Dout3 - 汎用出力- コネクタピン設置
いろいろと寄り道しながらも、ようやくここまで来たので、あとはP板を発注するために、 ひたすら回路設計するという「CAD三昧」に突入である(^_^;)。 これまでもそうだったが、お仕事Macの2画面モニタの横のモニタでCAD用Windowsの画面が並ぶが、 そこでちらほらと設計してはスクリーンショットを撮って、それをFTPでMacに転送して日記の続きを書き進める、 という作業は、両方を分断するので、あまり時間効率はよろしくない(^_^;)。 そこで、この日記も既に100kBを越えているので、ここを区切りとして、次は「続・Propeller日記(5)」として、 しばらくは黙々とCADを進めることにしよう。 うまく行けば、次の「続・Propeller日記(5)」の冒頭では、「完成したCAD図面」からスタート、としたいところである。

続・Propeller日記(5) へ

「日記」シリーズ の記録