コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for the ‘V850’ Category


hatena bookmark

黙々と配線をするターン!

dsc06160.JPG
コンソール基板とCPU基板を繋ぐためのパラレルケーブル。

dsc06161.JPG
コンソール側の配線完了。
回路図ひかずにもそもそとやっているのでこれで正しいのかは知らん。
ハードが出来上がったところで回路図まとめないとなあ。

dsc06164.JPG
下になるCPU側基板と接続。

dsc06163.JPG
今回はここまで。


hatena bookmark

ホビーとしての電子工作はなにかと下火に見えるけれども、それはアマチュア無線やラジオ工作といった世界から覗き込んだものでジャンルによってはまだまだ盛り上がっている場所があるんじゃないかと思う。
一つがマイコン制御のLED点滅等を用いたアートの世界。次が真空管アンプ等のアナログオーディオ自作の世界。んでもう一つが、ビンテージシンセサイザークローンのような楽器作成の世界。
特に音の世界は古きアナログの世界もビンテージだのアナログ音源だのといった別価値を今も持っているのがポイントかもしれない。WEBで軽く眺めてもページが沢山ヒットする。
そんなこんなで楽器を作ってみようかと思い立った。
もちろんちゃんとしたのを作ろうと思ったら限りなく奥が深いし、とてもじゃないが私には手が出ないような世界が待っている。でもそんなクオリティを求めなければ適当なピコピコ音とかならば直ぐに作れるはず。
最初に思い立ったきっかけは、MIDIデータを弄っていてMIDIケーブルの通信ってシリアルだったよなーと思い出したあたりから。単純なシリアル通信なので、8bitマイコンでやりとりができる。なら、受け取って音を鳴らす「俺音源」とか作れそうだよなとか考えた次第。
自作曲のオケを自作楽器で鳴らすというのも粋そうではある。めざせ初音ミクのバッキング。

で、取り敢えず以前作ったV850の 8bit D/A 音声出力ルーチンがあるので、それを使ったリズムマシンもどきでも作ってみようかなというのが最初のお題。
構想としては

・4小節 8個のスイッチで 2分音符の分解能
・それが3トラックで 24個のパターンスイッチ
・LCDモジュールでテンポの指定をしたり音色を切り替えたりする
・出力はV850内蔵の8bit D/Aコンバータをつかったモノラル音声

とかいったあたり。8bit以上のD/Aコンバータを接続するとか、パターンプログラミングできるようにするとか、発展の余地はあるけれどもまずは背伸びせず小さな所から作成していきましょ。
ああ、MIDI出力はそのうち付けたい。

dsc06150.JPG
今回使う V850 ボードはInterface付録のものではなく、NECのテストボード。入手性の問題と、MINICUBE2での開発のしやすさから選択。先日サンハヤトがこの基板の取り扱いを中止しちゃったけれども、まだ入手経路はあるので大丈夫かと。

dsc06151.JPGdsc06153.JPG
パーツあれやこれやを準備。

dsc06155.JPG
基板にパーツを挿してレイアウトを検討していく。
これらのメカニカルスイッチをぱちぱちやるものが作りたいというのが今回のテーマ。

dsc06158.JPG
というわけで、今現在は制作中。
パターンスイッチのマトリクス配線が終わったあたり。

ちょびちょびと進行していくのですよ。


hatena bookmark

続いては、V850マイコン基板を用いた音声時計の話題。

クリプトンのボーカルシンセサイザーであるVOCALOID2「初音ミク」に歌わせた音声を波形データとして持っておき、現在の時刻を音声出力するボイスクロック。
動画の方ではWindowsアプリ版とマイコン版の二つを作る様子が描かれているけれども、今回は後者のマイコン版についての解説。
miku_clock_1

V850基板はおなじみ Interface 2007/5月号付録のもの。
追加回路は以下のもののみ。
miku_clock_2
VCCは3.3Vね。V850基板の R4 をショート(正確には0Ωを実装)させ COM2-39 から 3.3V を得るのがオススメ。
D/Aコンバータからの出力は電流が少ないために直接スピーカーをドライブさせることはできずオペアンプ等での増幅が必要。といってもインピーダンスが高いアンプなら大抵なんとかしてくれるので、ピンジャックを繋いで直接音声入力がある装置に繋いでしまっても割と大丈夫だったりする。
その様に省略してしまうととても簡単な回路になるので、アナログ回路や電子工作自体に慣れてない人にもお勧め。
miku_clock_3

ソースコード: miku_clock_v850.zip

プログラムは、以前作ったコメベーダーのサウンド部分と入力部分を使い回しているので案外さっくりと作ってあったり。
InterfaceのV850基板にはサブクロックとして 32.768kHz の水晶を載せる場所があり、それを実装すると時計としての精度を上げることができるのだけれども、今回はメインクロックの 20MHz をカウンターで計測しての時計としている。こちらの方が作りやすいでしょ、といいながら単に私が 32.768kHz の水晶を持っていないだけなのだけれども。

SW1とSW3が時刻合わせで、SW1を押すと「時」がインクリメントされていきSW3を押すと「分」がインクリメントされていく。秒については起動したとき0で以後アジャストする手段は無し。このへん手抜き。
SW2が時刻読み上げのボタンなので、これは押しやすい実装にするが吉。

V850基板は手元にあるんだけどー、といった人にぜひお勧めしたい手頃さなのでお試しあれ。


hatena bookmark

組み込み開発における開発手法のひとつ、について。

組み込みのマイコンにおけるソフトウェア開発も、コードがある程度の規模になってくるとだんだん面倒になってくる。
主な理由がターゲットへのダウンロードと、ターゲットデバッグによるのだが、大抵の場合はダウンロードに時間がかかったりターゲットデバッグに苦労させられたりする。特にデバッグの様な頻繁にチェック&エディットが必要なターンに、毎回ダウンロードしていたのでは結構な時間を消費してしまう事になる。
そういった場面を想定して上手いこと開発を行うにはどうしたら良いのだろうかというのは、開発者のスキルの見せ所なのではないだろうか。

私はできるだけ PC 上で開発するようにしている。
PC上であれば高速にコーディングやデバッグができるので、かなり理想的な開発速度を得ることができる。
ではどうやって?

V850_interface
これが今回 V850 上で作成したコメベーダーの概略図。
インベーダーゲームを作成するのに必要な要素として考えると「画像」「音声」「入力」の三つであることがわかる。そしてそれぞれの要素を用意していたわけだが、それらの動作を司るルーチンとして “kome_*_drv” というルーチンを用意して処理をまとめてある。
そこより上位のコードにおいてはこれらドライバルーチン「だけ」を介してシステムリソースにアクセスする形に抽象化することで、ハードウェアの仕様を「ある程度」忘れることができる。そのことによって、上位コードはインベーダーゲームというアプリケーションの実現のみに思考を割くことができるというわけ。

さて、上の図を眺めていて欲しい。
上位のコードはドライバルーチンのみをコールしているので、ターゲットへの依存性は無くなっている。ハードウェアをドライバルーチンが抽象化しているためだ。
ならば “kome_*_drv” とインタフェースは全く同じで、おおよそ同じ動作をしてくれるルーチンを用意すれば、上位コードについてはPC上でも開発・動作可能なのではないか。
SDL_interface
そこで、このようにPCで開発できるようインタフェースは同じだけれども、中身が違うドライバルーチンを用意した。画面を表示したり、音声を出力したりするためのメディアライブラリとして libSDL を使用している。

komevader_sdl_windows
これで、Windows上で開発ができることとなる。
実際コメベーダーに関しては先にこのような仕組みを作ってあり、ゲーム部分の開発とデバッグは Windows 上で全て済ませてしまっている。

今回、下部分を SDL に頼ったが、この SDL 自体オープンソースかつ他機種向けに用意されているので、コメベーダーSDL版もコードの変更無しで様々な機種に持っていく事ができる。
komevader_sdl_macosx
MacOSX版

kv_ss_linux_01.jpg
Linux版(スクリーンショットは PS3 Linux のもの)

komevader_sdl_gp2x
OS に Linux を使っている韓国産オープンソースゲーム機 GP2X。

とまあ、こんな風に C言語基調で機種依存性を減らすように組み立てると色々できるというお話。多少無駄なコードは増えるけれどもね。

こんな開発の仕方もあるんですよというお話までに。
SDL版のソースコードは GP2X の方に置いておく。


hatena bookmark

てなわけで、V850とCPLD CRTCによるインベーダーゲームの完成です。
タイトルはプロジェクト名だった「コメベーダー」をそのままタイトルにしてしまいました。考えるの面倒だったので。

まずは作成成果物の提示ということで、動作している所を紹介するムービーとスクリーンショットから。

ムービーはニコニコ動画にあるのと同じもの。

コメベーダースクリーンショット1 コメベーダースクリーンショット2 コメベーダースクリーンショット3

作成成果物としてのソースコード。

komevader V850 ソースコード

komevader CPLD VHDL ソースコード

CPLDは以前から変わっていないはず。
V850のソースコードも画面周りはCPLDとSRAMが無いと意味がないので参考程度に。でも、音声出力周りは使い回しが効くんじゃないかと。


hatena bookmark

トータルでは長いこと続けてきたインベーダーゲームとそれを動作させるハードウェアの制作ですが、ついに完成。
動作の様子はニコニコ動画にアップしてあるので、見てやってくださいな。

ニコニコ動画はアカウントがなくて見れないよ、という方用の動画や、ソフトウェア部分のソースコードと解説などはまたこのあと少しずつ用意していく予定。


hatena bookmark

V850 KOMEVADER snapshot
これまでの色々な要素はこれを作るために必要なものだったから。
といった感じで、V850+CPLD CRTC 基板によるインベーダーゲームを制作中。
スクリーンショットは、一応V850+CPLD CRTC 基板実機で動いているものを撮影しているけれども、まだまだ未完成品。

今はソフトウェア作成のターンなので、なかなかここに進捗とかが書きづらく間が空いてしまう次第。(ソフトウェアは本業なもんでいまいち語る事がないのです)

ちなみに、Interface誌の V850 アプリケーションコンテストに応募する予定はありません。
テレビゲーム製作は既に記事になっていることだし。


hatena bookmark

波形合成だけでCPU負荷を食いつぶしてしまうのは流石にまずいのでいくらかの高速化を考えてみる。
高速化といえばアセンブラで最適化を目指す方向で。

基本的には、発声させる波形データを加算合成するだけなのだが、加算後の値が上限を超えないように制限する必要がある。(サチュレーション)
V850 には飽和加算と飽和減算の命令があるのだけれども、(当然ながら)32bit レジスタに対して行われる。さらに、音声データは8bitで 0時 0x80、+1 0x81, -1 0x7f といったデータである(データ、出力共に)。レジスタ内では 0 時 0x00000000 で +1 は 0x00000001、-1 は 0xffffffff なわけだから、飽和加算・減算の命令を使おうとするとその前後でレジスタ拡張と値のシフトをする必要がある。これが結構手間となる。

そもそもで、CPUが32bitでデータが8bitなのだからいっぺんに4データを処理できるんじゃないの?という話がある。それができたら単純に4倍速だ。
でまあ、そういったパッキングビットに対し、論理演算を重ねて飽和加算・減算をするアルゴリズムというのはちゃんと存在している。グーグル先生に「飽和加算」と訪ねると即座に見つかる情報だ。

Read the rest of this entry »


hatena bookmark

テレビ出力の方が一息ついたので今度は音声の出力。
V850ES/JG2 には DAコンバータが 2ch ついていて、こいつらのセトリングタイムが 100kHz くらいは余裕であるので音声の出力に使える。
でも、電圧的には Vdd 範囲でも電流がほとんど得られないのでスピーカーを駆動させるためにはどうしてもオペアンプを通す必要があるわけだ。


コードの茂みの奥で見えにくいけれども DIP8ピンのICが刺さっている。これはオペアンプではなくて PSoC(CY8C27134)。
PSoC のアナログ部分を使ってゲイン値のプログラム可能な簡易アンプとして使おうという作戦。ついでにローパスフィルタも付けちゃえ。
他に部品が要らないのでラクチンラクチン。実験には最適。
流石にパスコンぐらいは付けないと、スピーカーから盛大なノイズが聞こえるけれどもね。


基板にまとめた。
ついでにタクトスイッチを二つつけて、ソフトウェアでゲイン値を変更できるようにする。簡易ボリュームやね。
PSoCのプロジェクトファイル
psoc_amp_070714.zip
V850側の音声ドライバは、DMA を使って DAC にデータを流し込む方式。
カウンタ TP2 を使って 8kHz のトリガを使い、DMA はそのトリガが来たら 1byte を DAC のレジスタへ転送をする。
一般的な音声ドライバの構成。

わかりにくいので図にするとこんな感じ。複数CH の重ね合わせができるように作ったのだけれども、どうしても 1声しかでなくてしばらく悩んでいた次第。どうやら、音声を合成してバッファに用意する部分の処理が重くて、メインに戻って来れていないのが原因だったらしい。コンパイラの最適化をかけることでなんとか回避。
そのうち高速化を考えるにしても、今のところは気をつけて使う様にすれば良いか。
サンプルソースコード
audio_drv_070714.zip
サンプルでは P4.0〜P4.2 に繋いだスイッチを押すと、エアキャップ(プチプチ)をつぶす音が出る様に作ってある。でも、タクトスイッチのクリック音の方が大きくて全然楽しく無い罠。
音声データは 8kHz MONO の wav ファイルの内、波形データ部分を取り出したものを ROM に焼き込んで、それをならしている。


だんだんゴテゴテとしていくけれども、これで必要な要素は揃った。

hatena bookmark

細かい調整も終わり、ひとまず CPLD CRTC も予定通りに仕上がった感じ。
高機能じゃないけれどもね。
cpld_ctrc_070706.zip


表示しながらの画面描画実験。
フラッシュビデオ その1

するするとシャッターの様に描かれていくのは、CRTCとCPUのSRAMバスアービトレーションを行っていないから。
CRTCが画面を描いている時というのは一生懸命SRAMからデータを読んでいる時である。そんなときにCPUから読み書きしようとするとバスが衝突してとんでもないアドレスを表示してしまうことになるし、CPUも思ったところに思ったデータが書けないことになる。
そこで、CRTCがSRAMからデータを読み出している期間はCPUからのアクセスを遮断している。この時、CPUがSRAMにアクセスできるのはCRTCが画面を描いていない時、つまりVBLANK期間だけとなる。
その隙を狙って描画するのだが、このテストコードではその VBLANK期間にだいたい5〜6ラインくらい描いているようだ。
CRTCのENABLEを下げて無効にすると画面は真っ暗になるが、フルタイムでSRAMにアクセスできるので 1枚画をその隙に転送するとか、画面をクリアするとかに使う。


そんな様子を眺めていてもつまんないだろうから、もちょっと見れるように即興でライフゲームを作ってみた。
フラッシュビデオ その2

まあ、ライフゲームを見て楽しいかどうかは人によるとは思うけれども。

一応ソースコード。やっつけ風味。
crtc_life_demo.zip