|
DumBoさんのコメントの「構造体からの抜き出し」に触発されて、冗長なスケッチを全面的に描き直しているところである。
BASICで言えば、INSTR(<予約文字列>,<入力文字>)関数の戻り値に応じて処理を変える、みたいな感じである。 とか言いながら、また別のアプローチを考えついたりするので、始末が悪い。 http://art11.photozou.jp/pub/378/247378/photo/24492280.jpg 2006年9月付「RS232C to JOY」でいじっていた、「RBIO-1」というインターフェース・ボードである。 ボードの詳細は、共立エレショップの紹介ページを参照されたい。 テキストベースの簡単なコマンドを用いて、RS232C経由でリレーをコントロールできる。 アセンブラで作成したマシン語コードをさらに専用コマンドに変換するという迂遠な手間がかかるが、ハードウエア的にはシンプルになる。 魅力的なリレー式であるうえ、10個のリレーを装備しているのでお誂え向きである。 ところで、DumBoさんとのやりとりでも書いたが、GMC-4の魅力のヒミツは、いろんなアプローチが考えられる点ではないだろうか。 アプローチの方向を種類分けすれば、第一に、もちろんGMC-4のプログラミングである。パズルめいた数少ない命令群、僅かなメモリエリア、チープなアウトプット。この制約の中で、何かカタチになるものを仕上げるには、工夫とひらめきと、「1」と「7」の変化だけで強引に「初音ミク」と言い張る想像力が必要である。 第二に、ハンドアセンブルからの脱却である。アセンブラの書式から各種言語やExcelによる処理まで、すべて自分流で考える結果、豊かなバリエーションが生まれることとなる。さらには、CやらGMC-4用BASICやら、実に多彩である。 第三に、入力するハードウエアの開発である。さすがにキーをソレノイドで叩くというのは見たことがないが、大別して、リレー式とフォトカプラ式が見られる。それらのコントローラーもArduinoやUSB-IOのほか、先に写真を掲げたRBIO-1その他いろいろなスタイルが考えられる。実はこれに加えて、MSXからのプリンタポート出力+汎用ポートの出力なんてのも考えているところである。 第四に、GMC-4からの出力取り出しがあるが、こちらはLEDのダイナミック点灯が災いして、二進LEDの信号横取りだけでは済まないようだ。この点については、今のところ「モールス信号を受信側でデコード」なんて、バカなことを考えているところである。 ことほどさように、GMC-4は色んなことを考えさせてくれる。 実装されている機能は制約が多いものの、(1)とりあえずは内蔵サンプルプログラムで遊べること、(2)「簡単にLEDを点灯できるコマンド」などお手軽なコマンドが用意されていること、といった絶妙な仕掛けの勝利と言っていいだろう。 といっても、この楽しさが分からない人には全然分からないのだけどね。 |
全体表示
-
詳細
コメント(0)
|
■シリアル通信の仕様 とりあえずはオーソドックスに、Arduinoのシリアル通信機能を用いたGMC-4の制御を試みる。 一応完成すれば(飽きたら、とも言うが)、スケッチを明らかにすることとして、方向性だけ示しておく。 (1)パソコンからは、アセンブル済みのマシンコードのみ、テキストで送信する。 (2)いちいち「INC A」を押さなくていいように、適宜、Arduino側で「INC A」を挿入してGMC-4に入力する。改行なしのマシンコードだけなら、Arduinoのバッファに(たぶん)収まる。 (3)内蔵プログラムの「オルガン」のように「INC A」が不要な場合もあるので、「プログラムモード」と「ダイレクトモード」を指定できるようにする。違いは自動的にインクリメントされるかどうか、だけである。初期値は「プログラムモード」とする。 (4)「RESET」などのキーも制御できるようにする。 ■文字列の解釈 送信された文字列は、一文字ずつswitch()関数で処理を振り分ける。 「0」〜「F」は、データとして処理。「G」以降の文字は制御文字として扱う。当初、「G」から順番に割り振るつもりであったが、やってみると機械的に過ぎる。「RESET」なら「R」を使いたくなるのが人情であろう。ということで、ある程度、意味づけをした文字を割り振る。「RUN」も「R」であるが、これは「Go!」の「G」とした。「A SET」は「A」が使えないので「Memory」の「M」とした。こんな調子で割り振った制御文字は(今のところ)次のとおり。 P:プログラムモード(自動インクリメント) N:ダイレクトモード(ノン・インクリメント) M:A SET(Memory) I:INC R G:RUN(Go!) R:RESET Z:(何もしない) 最後の「Z」はちょっと特殊で、loop()関数中で同じデータをGMC-4に送信し続けないよう、一文字解釈するたびに文字変数Dを「Z」にリセットしている。結果的に「Z」は何もしないので、何も起こらない。 ■実験 「プログラムモード」は、だいたい実装できたので早速、試してみる。 材料として、WEBに掲載されていた「FX-マイコンR-165 プログラム集」掲載の自動演奏プログラム用音楽データ「証城寺の狸ばやし」を取り上げた。 これは、CPU内蔵の演奏プログラム用データであるが、プログラムと同様、メモリ0番地からインクリメントしながらデータ入力する。 これの冒頭に、「プログラムモード」と「RESET」を意味する制御文字「PR」を付加してArduinoに送信する。 実際に送信するデータは次のとおり。 「PR633537151310171514131415171015373A1C1B1A172708171A1A1A1016151413141517171A1807051413303F0」 Arduinoにスケッチを描き込んだあと、「シリアル通信テキスト窓」にデータを貼り付けて送信ボタンを押す。 送信後、GMC-4本体の「RESET」「A」「RUN」を押すと演奏が始まる。「ダイレクトモード」を実装したあかつきには、最後に「NRAG」を付加すれば、データ転送から実行までパソコン側のワンタッチで処理できるはずである。 さて、実験の様子を録音してみた。最初の14秒ほどの「ピピピピ」がデータ転送の音。続いて、お馴染みの「ポンポコポンのポン」が連続演奏される。キリがないので2コーラス余りでフェードアウト。全体で40秒ほどである。せっかくなので、フランジャーやらコーラスやらリバーブ、コンプレッサー、イコライザなども軽くかけてみた。あまり効果はないようである。 なお、聴取の際は、音量に十分留意されたい。(→音声ファイルのダウンロードは末尾に) ■まとめ 現時点で、GMC-4は完全にArduinoのシールド化されている。改造点は次のとおり。 (1)キー入力部分を残しつつ、フォトカプラを介してデータ転送可能とした。 (2)電源をArduinoから供給するようにした。5V電源に直列に電源ランプとしてLEDを入れることで、0.6V電圧降下させ、電池と同等の4.4Vを供給している。 (3)スピーカーの代わりにミニジャックを取り付け、ヘッドフォン出力とした。 あとは、GMC-4からのデータ出力ぐらいかな、でも要るかな? というところである。 録音に手間をかけすぎて、本来しようとしていたことができなかった。まあそれが、本来の姿であるが。 どこかに飛ばされたくて、自ら進んで「バーソロミュー・くま」の前に立つような人間であると自覚していたりする。 |
|
今回のGMC-4+Arduinoのテストで使用したスケッチを、(人の迷惑かえりみず)一気に載せる。と言っても、これで全部ではない。最後の似たような文が繰り返される部分は一部のみとし、以下は割愛した。 スケッチは概ね四つのパートに分かれる。 第一のパートは、#defineでプログラム中のピン表記と実際のピン番号を定義している部分。 よく見ると「P0」〜「P8」の順番と実際のピン番号の順番がずれている。これは、えっとね、配線の際、よく考えなかった結果なのよねー。こうしてハードの勘違いをソフトで吸収できるから、これでいいのだ。 第一パート末尾の「#define dly 40」は、出力ピンの状態を変えたあと、次の処理に移るまでの遅延時間。試行錯誤の結果、約40msに落ち着いた。これを30msにするとGMC-4の挙動がおかしくなる。原因としては、(1)信号を中継するフォトカプラが着いて来れない、(2)GMC-4側がキー入力に着いて来れない、(3)チャタリング対策としてGMC-4側があえて遅延を入れている、などが考えられるが、本当のところは不明。 第二のパートは、setup()関数の部分。 使用するピンをすべて出力に設定している。 第三のパートは、loop()関数の部分。 もうちっとスマートなやり方もあろうが、ここは愚直にテンキー入力をそのまま羅列している。 動作は、まずRESETしたあと、メモリアドレスを逓増しながら「0」〜「F」のデータを書き込み、次に書き込んだデータを順次読み出し、「F」を表示したところで約1秒待つ、の繰り返しである。 第四のパートは、キー入力をエミュレートする関数群。 clr()関数は、出力ピンをすべてLOW、つまりテンキーから手を離した状態にしている。 d0()関数以下で実際に出力ピンの状態を変えている。いったんclr()でピンの状態をクリアし、必要なピンをHIGHにしている。二つのフォトカプラをONにすれば、GMC-4は何らかのキーが押されたと認識する。 一回のキー入力で約80ms余りの時間がかかる。データ転送速度としては極めて遅いが、人手でテンキー入力するよりは遙かに速いので、これでよしとする。 さて、今回は動作テストということで愚直なスケッチを書いたが、Arduinoには他のパソコンから所定のデータを受け取り、適宜の処理を加えてGMC-4に渡すインターフェース役に徹してもらいたい。 というわけで、(1)どうやって外部からArduinoにデータを渡すか、(2)受け取ったデータをArduinoはどうやって解釈するか、の二点が当面の課題となる。 とか言っているうちに、できちゃう人はホホイのホイとスケッチを書いてしまうのであろうが、そこは無意味にハナシをややこしくしたがる自分のことである。何とか、ヘンなやり方で処理できないものであろうかと、思案する今日この頃である。 |
|
ArduinoでGMC-4をインターフェースする実験。
Arduinoから「0」〜「F」のデータをGMC-4のメモリに書き込み、次に書き込んだデータを読み出し、「F」のところで約1秒待つ、を繰り返している。GIFアニメのパラメータを調整し、実際の動作速度に近づけている。 http://art14.photozou.jp/pub/378/247378/photo/23772073.gif GMC-4とは、学研が6月末に発売した「大人の科学」シリーズvol.24のふろくの4ビットマイコンである。 1981年発売の「FX-マイコン」の復刻版。ウワサによれば、8ビットマイコンを使ってエミュレートしているらしい。「FX-マイコン」当時のマニュアルが概ね通用するようである。「FX-マイコン」同様、テンキーからプログラム入力する。しかし、スイッチを切ると、せっかく入力したプログラムは消えてしまう。 好奇心はご幼少の頃そのままであるが、なにぶん自分でメシを喰わねばならぬ大人である。いわば「頭はコドモ、体はオトナ」、逆コナンたる自分としては、タイムズマニー、いちいち同じ入力ばかりしていられない。 というわけで、テンキー入力をArduinoに肩代わりさせる実験である。 http://art13.photozou.jp/pub/378/247378/photo/23772086.jpg GMC-4の基板を眺めると「いじってください」と言わんばかりに、ランドパターンが肥大化し剥き出しになっている箇所がある。 とは言え、表面のオリジナリティは残したいので、0.3mmの穴を空けて裏面で配線することにした。テンキーはもちろん健在である。 http://art12.photozou.jp/pub/378/247378/photo/23772096.jpg 裏面にユニバーサル基板を貼り付け、Arduinoのシールド化した。 テンキーは5×4のマトリクスになっている。これを9個のフォトカプラでコントロールする。「RESET」や「INC R」なども入力できる。トランジスタのスイッチングでも良かったのかもしれないが、電気的にアイソレートされていない点がなんとなくテンキー打鍵感に乏しい。本当は、電磁石を用いてピンで打鍵したかったが部品が高く、リレーも手持ちになく、手近に大量にあったのが8個100円のフォトカプラである。なんでそんなものが大量にあったかというと、8個100円だったからである。それ以上の理由はない。 フォトカプラ側の電流制限抵抗器が1本しかないが、どうせ同時にONになるのは2個と決まっているので、適当な抵抗器を入れた。ちなみに抵抗値は、え〜っと、忘れた。ホンマに適当やな。 ざっとスケッチを書きArduinoにダウンロード、実行した結果が冒頭のとおりである。 とりあえずは、ArduinoでGMC-4をインターフェースできるようになった。これで、毎回いちいちキー入力しなくて済む。とはいえ、現状ではGMC-4の機械語をスケッチに描き込まなければならない。「RESET」や「INC R」も書き込むと、プログラムリストのほとんど倍の長さになる。それはそれで面倒である。アセンブラの出力をパソコンからArduinoに送信し、GMC-4に転送できるようになればラクチンである。 って、パソコンやArduinoを使って4ビットマイコンをコントロールするほうが、よほど面倒っぽいはずであるが、その点は面倒と感じないアンバランスさをすなわち「道楽」と呼ぶのである。何を開き直っているんでしょうね。 |
|
先月作ったAuduinoをケースに組み込んでみた。
5つの可変抵抗器のうち、音程を変化させるものはsparkfun「加圧メンブレンセンサー」に変更。押さえる場所によって0kΩから10kΩに抵抗値が変化する可変抵抗器である。 他の4つの可変抵抗器は、ツマミをカラフルにしたかったが手持ちになかったので、そのまま使用。 ケースは、当初、ありがちなタッパーを使うつもりであったが、百均ショップでこのオーバルな石鹸入れを見たときにピンときた。 工作は少々てこずったが、なんだか楽しいモノになった。 右に出ているのはUSBケーブル。スケッチの書き込み及び電源用である。 下に出ているのはモノラル出力。ヘッドフォンを十分ドライブできる音量が出る。 形状から「Ovaluino」と命名。「オーヴァリュイーノ」と発音する。「卵形のArduino」ぐらいの造語である。 が、面倒なので「おまる」と呼ぶことにする。なんか意味が違ってくるような気がするが、まあいいか。 http://art11.photozou.jp/pub/378/247378/photo/23230110.jpg 裏返してみると、まさに石鹸入れである。水抜きのスリットからarduinoの基板が見える。 ビスひとつで基板を固定。USBケーブルを真横に出すにはケースの加工が厄介なので、基板が斜め上を向くように固定している。 4つの足が具合よく指にかかってホールドしやすい。 http://art14.photozou.jp/pub/378/247378/photo/23230118.jpg さて演奏であるが、操作性は学研のSX-150とよく似ている。 レガートのみの回転式可変抵抗器とは異なり、レガートにもスタッカートにも音程を変えられる点はSX-150と同じである。 しかし、SX-150のリボン抵抗器は一箇所だけの接触であるが、「おまる」は2箇所以上を押さえて複雑に音程を変化させられる点が異なる。 エフェクトなしのチープな音でも結構ハマる。現在、「海ゆかば」の練習をしているところである。 |





