コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for the ‘PSoC’ Category

PSoC MiniProg を持っている身としては、PSoC FirstTouch Kit があまり面白くないなーと前回書いたわけですが・・・。

dsc00420.jpg
逆に考えるんだ。この FirstTouch Kit プログラマが CY8C24894(USBドライバ内蔵PSoC) のEvalKit だと考えるんだ。

ぐぐっていて見つけたのが FirstTouch Kit プログラマにはISPパッドが出ていると言う話。
dsc00421.jpg
ここね。

dsc00422.jpg
ここにプログラム用のピンヘッダを取り付け。

dsc00425.jpg
自作ファームが書き込めるというわけ。まあ、これくらい潰しても惜しい物でもなし。
ちなみに基板上のLEDはパターンをおっかけたら Port7-0 だとわかった。

んではさっそくサンプルコードを書いてみよう。
Cypress にある ApplicationNote 2298 のUSBサンプルコードから、HIDキーボードの Example2 を多分に参照。新規プロジェクトからHIDキーボードのテンプレートを使用してサクっと作成。

プロジェクトファイル: usb_key_sample1.zip

dsc00426.jpg
接続すると USB の HIDキーボードとして認識された。

今回作成したコードは、”babel ” の6文字を繰り返しひたすら入力するキーボード。(それはキーボードなのか?)
babel-1.jpg
仕事で行き詰まっている仲間のマシンにぷすっと挿すとほがらかな空気が生まれるかもしれません。生まれないかもしれません。

ちなみにストロベリーリナックスの CY8C24894 基板、1つ買ってあるんだよなあ。いつか遊ぼうと思っていたのだけれども、こんなのが先になってしまったあたり。

dsc06288.JPG

最近流行のUSBタイプ Eval KIT。
MiniProgの代わりに使えるのかな?と思って秋月で買ってきてみたのだけれども

……
………
できないじゃん。
CY8C21434しか認識しないらしい。(ちょっと調べれば見つけられたのにね)
PSoC programmer の Firm UPdate は FirstTouch を繋ぐと Enabled になってしまい、未来的にアップデートさせる気ナッシング。
あくまで添付の評価ボード専用ということらしい。

そのへん割り切った上で購入されたし。あまりお勧めしない。
ちなみに、今MiniProgは絶賛品切れ中で秋月はおろかCypressのOnlineShopでも手に入らなかったりする。(Cypressでは日常茶飯事だぜ)
$98 のブレッドボードが付いたEvalBoardとかならMiniProg付きで在庫があるけどね。個人的には割とお勧め。
取り合えず、今日本国内で MiniProg を小売りで扱っている店が無いことになるのかな?チップワンストップにはあるっぽいけど、あそこは基本個人客をとらないから。

つーか、この PSoC FirstTouch を買ってユーザー登録すると DIP の CY8C29466 と CY8C27443 が2本ずつもらえるキャンペーンをやっているのだけれども「次はプレゼントのチップで独自の設計を楽しもう。」という煽りはどうよ。FirstTouchでプログラミングできるのなら問題ないけれども。

昨年まではPSoCもアセンブラで組んで遊んでいたのだけれども、昨年末だったかにPSoCのCコンパイラライセンスを秋月電子で買って以来ざくざくとC言語でファームを作成するようになっていった。16000円だったなり。
そのおかげでPSoC工作が一層楽しくなり、是非ともPSoCをオススメして行きたい!と日々思うのだけれども、Cコンパイラの値段がちと気がかりでお勧めし辛く感じていた今日この頃。
こないだ、CQ出版から出た数少ないPSoC解説本「PSoCマイコン・トレーニング・キット」が、解説本・Miniプログラマ・EvalBoard・Cコンパイラライセンス込み込みで11,550円(税込)なのでこれをお勧めするのが筋かなあと思ってCypressを見に行ったら状況が変わっていた。

このあたりの下の方参照。
これまでPSoCのコアであるM8CのコンパイラはImageCraftの物で、秋月電子で売られていたのもこのコンパイラのライセンスだったのだけれども、2008年4月を持ってHI-TECHのコンパイラがCypressの推奨標準コンパイラとなったらしい。知らんかった。
で、ここからなのだけれどもHI-TECHのCコンパイラはお値段 $1495 といつもの感じのがっくり価格なのだけれども、最適化がなされない Lite Ver. ってのがあって、これは制限無しのフリー利用が可能なのだそうですよ。
つまり、PSoCでマイコン工作をするにあたり、有料なのはプログラマだけで良く、開発環境もCコンパイラも無料で利用できるようになっていたというわけなのです!!
プログラマも MiniProg か PSoC FirstTouch で言い訳だから投資は3〜4000円程度。金銭的敷居はぐーーーーーんと低くなり、まったく問題無くなってしまったというわけですな。

さっそく HI-TECH の Cコンパイラ Lite. 版をインストールして試してみたら、確かに ImageCraft の奴よりバイナリが大きくなるけど 5%くらい?な感じで多少という風情。これならがしがし使えると思いましたよ。

これで PSoC をガンガン勧められるというもんだ。

愚民養成ギプス。
kome_gumin01.jpg
三軸加速度センサーをスイッチにして、こいつを振ると音が鳴るという仕組み。
もちろん、振る方向で三種類の音を鳴らし分けることができるぞ。ということなんだけれども、実際は振動が混ざりまくりで要らぬ音声が暴発気味に出てしまうのが難点。
コイツを作りたくて作業を始めたところがあるので、一応の完成系。

gumin01.png
ぷちぷちの時より基板を大きめにとってあるので、C1815をエミッタフォロアにして電流増幅してみた。小型スピーカーを直に繋げる事が一応できるっぽ。

kome_gumin02.jpg
加速度センサーの入力でPSoCの足が全部埋まっているあたり。こうなると引き回せる足が限られるので、ある程度ユーザーモジュールを配置して設計した後で回路が決定するあたり。

ソースコード: gumin02.zip

∞ぷちぷち、ぷち萌え「ヤンデレ編」
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

まずは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言語が使えるとやっぱ便利だわ。

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

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

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

この 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
キャラクター玩具として組み立てる。

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

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

テレビ出力の方が一息ついたので今度は音声の出力。
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 に焼き込んで、それをならしている。


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