コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for the ‘PSoC’ Category


hatena bookmark

∞ぷちぷち、ぷち萌え「ヤンデレ編」
kome_putimoe01.jpg
∞ぷちぷちの押しスイッチと内部スピーカーを利用、それ以外を外部のPSoCとROMで構成している。
とにかく小さくまとめるのが目的なので 8pin の CY8C27143 を利用。音声データをまとめたら 44KB ほどになってしまったので 1Mbit 容量のATMEL 24C1024 を利用。1Mだとアドレスが 9bit になるんだけれども、そこはI2Cアドレスを1bit割り当てるらしい。なので感覚的には512kbit(64KB)が2バンクある感じ。今回必要なのは44KBなので、片方のバンクのみで収まる。
∞ぷちぷちのボタン電池3VだとシリアルROMが駆動しないので、電源は外から供給。ちょっと残念な点。(最近低電圧版のシリアルROMが秋月で売られているのでそれを利用するといけるのかも)

mikuputi.png
回路図はこんな。
kome_putimoe02.jpg
ハンダが汚いとなぜか評判なのだけれども、フラックスが目立つから?
まあ、結構試行錯誤で作った試験基板的な作品なのと、このあたりから全て無鉛ハンダに切り替えたあたりも理由かと。無鉛ハンダだとユニバーサル基板をハンダブリッジさせようと思ってもなかなかできないのよね。というか、避けたほうが無難。

block1.png
内部ブロックは簡単に書くとこんな。
カウンターで 8khz の割り込みを発生させて、そのたびにDACに 1byte 渡すことで発声。バッファに32byteとってあって、I2C受信バッファから32byteをコピーし、次の32byteをくれとI2Cに要求。ROMからの読み出しは 8khz×32byte の間で十分間合うのでタイミングはシビアでもない。

ソースコード: putiputi.zip


hatena bookmark

まずはI2CシリアルROMにデータを書き込む必要がある。
そのためにPSoCマイコンとPCをシリアルで繋ぎ、PCから流し込んだデータをPSoCのI2C経由でシリアルEEPROMに書き込むという作業を行う。

今回書き込むのは音声データなのだけれども、8bit 8khz モノラルと規定しておく。
8khzのwav形式データを作成して、RIFFフォーマットからDATAチャンクのみを取り出す。つまり音声データだけ取り出して、その他情報は捨てたいわけなのです。
そのために適当にDATAチャンクを取り出す使い捨てコードを作成。

Cのソースコード: wavsprit.c

これを使ったりしてあらかじめデータを用意しておく。

i2crom_writer.png
回路図はこんな感じ。
PCからの一方通行でデータを流し込めば良いので RX だけ接続してある。
LCDモジュールは別段必要でもないのだけれども、書き込んだデータ量を確認するためにアドレスを表示させている。
シリアルはゆっくり目の 4800bps で接続、これ以上早くするとEEPROM書き込みが間に合わなくてデータ欠落が起こるみたい。

ソースコード: i2crom_writer.zip

先日秋月でPSoCのCコンパイラを購入したので、今回からC言語で作成している。ご了承あれ。
アセンブラも楽しいけど、短時間でぱぱっと組みたいときC言語が使えるとやっぱ便利だわ。


hatena bookmark

マイコン電子工作の Hello, World! と言えばLEDぴかぴか。それにセンサーが扱えるようになると色々な事ができるようになるのだけれども、音を出すというのは案外面倒だったりもする。
音を自在に出すことができる様になればいろんなおもちゃが作れるのではないかと思うのです。
ボイスレコーダーキットを利用するのも良いけれども、ここはマイコンで手作りしてみましょ。

実は長らく、音の出るおもちゃを作るにはどうしたら良いのかと考えていたのだけれども、たどり着いたのが PSoC とシリアルROMの組み合わせ。これがそこそこコンパクトでそれなりな長さの音声が出力できる組み合わせかと。
PSoCを使うのは使い慣れているというのと、8bitDACユーザーモジュールを持っているから。
シリアルROMは秋月で160円の256KB I2C シリアルROMを使うと、ビットレート8kHzで 4Sec ほどの音声がならせる。一言二言には十分な長さ。

というわけで以下の制作物の回路図とソースコードを次記事にて置いとくのです。


hatena bookmark

この 2ヶ月間はVOCALOID2の「初音ミク」(とニコニコ動画)にかかりっきりで、コメを噛めとしての記事が完全に停滞していたあたり。
でもその間に電子工作をしていなかったかというとそんなこともなく。
というわけで、それら成果(と呼ぶにはちとしょぼい)を、後出しで掲載。
ニコニコ動画の空気がわからないと面白くないと思われるけれども、そのへんはご容赦。

まずはこちら。

初音ミクにネギを振らせるおもちゃを作ろうという各種工作動画があってその一つ。
コメを噛めらしくサーボモーターをマイコンで制御して動作させようという試み。
servo_miku_1

サーボモーターは電源とコントロール線の 3本のコードがあって、コントロール線に与える信号で回転位置の指定を行っている。
この信号は、50Hz(20ms)周期のパルスで、パルスの幅によって回転位置が決定する。
servo_miku_4
そのパルスの幅は周期の 1/10〜2/10 となっている。
この信号をマイコンで作り出せば良いのだけれども、そのためには割り込みかPWMかソフトウェアタイミングか、まあ如何様にもやり方がある。
今回はPSoCのPWMモジュールを使ってハードウェアにおまかせしてみた。CPUからは回転角を変えたくなったときにPWMカウンター設定を変更すれば良い。

PSoCのソースコードはこの後のPC経由Wiiリモコン制御の時に上書きして半分消してしまったので省略。すんません。

servo_miku_2
サーボモーターをパネルに取り付け。
servo_miku_3
キャラクター玩具として組み立てる。

マイコン制御なので動作パターンもプログラミング次第というのがうれしい。
これ自体は他愛もないおもちゃだけれども、こういうのが積み重なってメカトロニクス制御になっていくのではないかと思う次第。

これ自体は大したものではなく、面白いと感じるかどうかは「初音ミク」と「ネギ回し」で楽しめるかどうかといったところですが。


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 に焼き込んで、それをならしている。


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