PSoC Memoの最近のブログ記事

PSoC(CY8C24423)でPWM8のブロックを使い、一定時間おきに割り込みをかけて
処理をするときのメモがまだなかったので、書いておきます。

ここではPSoCデザイナでC言語を使う場合についての例をあげます。

(あまり詳しくないので間違っているところもあるかもしれませんが、以下で動きました)

PSoC_interrupt_PWM8.png
■あらかじめPWM8_1を配置し、各種値を設定しておいてください。

 上記の画像の場合はSysClk freq、VC1、VC2、VC3で設定を行い、
 SysClkの6MHzを15回割ったものをさらに16回割り、さらに250回分割しています。
 (これでVC3は100Hzになります。Global Resourcesのところで設定)

 次に、上記周波数をPWM8に入力します。(PWM8のClockの設定がVC3)
 PWMタイマの値は100回で満了になるようにしているので、
 1秒ごとに割り込みが入る設定です。
 (User Module Parametersのところで設定)

 ※100Hzは1秒に100回で、100回たまったら割り込みします。


その後は以下のような操作が必要になります。(「続き」に記載)

2007年3月のPSoCセミナー、他の方がどんな風に記事を書いているのかなぁ
と思ったのでその関連の記事を集めてみました。(暇人とかいわないで;;)
なかなか読んでみると面白いです。

 先日のセミナーの評価ボードには4つのPSoCがついており、それぞれがI2Cでつながっています。
そこでI2Cの練習をしてみることにしました。

 I2CにはPSoCのユーザモジュールI2CHWを使ってみました。
これを使い2つのPSoC間でI2C通信をしました。
(でもまだいまいち使い方がわかりません・・・。)


◆今回のI2CHWを使ったサンプルの動作(データシートのサンプルを改変)
1.マスターからスレーブに"AB"を送信
2.スレーブが"ABC"として応答(3つめをCに書き換え)
3.マスターはスレーブから返された"ABC"をUSBUARTでPCに送信
これだけです。

7SEGLED.jpg

 先日のセミナーの評価ボードには7SEG LEDもついていました。
せっかくなのでこれを使ってPSoCデザイナのLED7SEGモジュールを使ってみました。
目的は特になく、ただなんとなく以前から7SEGのモジュールを使ってみたかったので^^;

 今回のサンプルは、順番に7SEG LEDの表示が変わるというだけのものです。
ユーザモジュールを使うと、いとも簡単に4桁の数字を7SEGに表示できるので、けっこううれしいです。
(自前でやると地味に大変なのです・・・)


7seg_module.png
↑設定はこんな感じ

先日のセミナーの評価ボードではUSBも扱えるので、これを使って
PSoCのUSBUARTモジュールの実験を行いました。
USB接続なのにパソコン側からはRS232のようにして扱うことができるというものです。

基本的にサンプルコードを少し変えて動かしてみただけですが、うまくいきました。

今回のサンプルは、
1.Tera Termなどを使ってCOMポートに接続します。
2.COMポートからデータを送信
3.その送信された文字をPSoCがそのまま返す
というだけのスクリプトです。

また、
LED1・・・初期化中から点灯
LED2・・・初期化完了から点灯
LED3・・・通信中に点滅
のようになっています(テスト用)

usbuart_module.png
↑設定はこんな感じ

PSoC_USBUART.jpg


◆ドライバのインストール
PC側にはドライバのインストールが必要です。

ドライバはプロジェクトと同じディレクトリの中の"libディレクトリ"にinfファイル(ドライバ情報のファイル)が生成されるので、それを指定してインストールしてやればOKです
(Thanks Sakaさん)

以前の記事で紹介したPSoCセミナーのときに使用した評価ボードを使い、少し実験してみました。


評価ボードにはADXL322という2軸の加速度センサがのっているのでその値を取得してLCDに表示してみることにしました。


PSoCExpressADXL322_d.png
評価ボードではこのような座標になっているので
向こう側に傾ければXの値が正、手前に傾けるとXの値は負になります。
また、左に傾けるとYの値が正、右に傾けると負になります。
LCDに表示される値がこのように変化すればいいことになります。


PSoCExpressADXL322_e.jpg
難しいと思ったのですが、PSoC Expressを使い、加速度センサの値をLCDに表示させるものを
適当に作ってみたら動いたのでここに載せておきます。

※以前書き忘れましたが、PSoC Expressで開発を行うと自動的にPSoCデザイナのプロジェクトも生成されるので、PSoCデザイナでコードをみたり編集したりすることができます。
(逆はできない。つまりPSoCデザイナ→PSoC Expressは不可)
それらのファイルもアップロードしたせいもあり、ファイルサイズは少し大きくなっています。


PSoCセミナー

| トラックバック(0)

3月7日、PSoCセミナーに行ってきました。会場はパシフィコ横浜です。
時間は13時より、18時前ぐらいまででした。

今回のセミナーではPSoC Expressを使った実習がメインでした。
評価基板を使い、LED、LCDの制御やCapSense、AD変換、I2C通信のサンプルを作って動かしました

PSoC Expressを使うとコードをほとんど意識することなく設計ができ、
慣れればかなりはやく開発できるらしいです。
PICだと66時間かかる設計をPSoC Expressを使うと1時間程度でできてしまう例も紹介されていました。
(でも慣れるまではちょっと大変かもしれないと思いました(笑))

前回のセミナー(PSoCデザイナを使ったCapSenseのセミナー)より、実習の時間が長かったため、時間が足りなくなることもなく、評価ができ、有意義でした。

PSoC Expressは今日が初めてで、わからないところも多いのでこれからいろいろ実験できたらいいなと思っています。


◆写真

PSoCSemi20070307.jpg
↑セミナー会場の様子

PSoCSemi_CY3121.jpg
↑評価ボード。PSoCが4つついており、さまざまな評価ができる。
評価ボードは4箇所に分かれている。
左上:CapSenseの評価などが可能
右上:USBを使った評価などが可能
左下:LCD・2軸加速度センサを使った評価などが可能
右下:7segLEDの評価などが可能
また、他にもLED、スイッチ、可変抵抗、ワイヤレスUSBの接続できるコネクタも用意されている。
ジャンパピンをつなぐことでPSoC間でのI2C通信の評価もできる


PSoCExpressSS.png
↑PSoC Expressを使った開発(イメージ)

◆いきさつ
PSoCにはIrDAモジュールというものがあります。
これさえ使えば簡単に赤外線通信(IrDA)ができます。
今のところ使い道は思いつきませんが、できたらおもしろそうです。

ところが、IrDAモジュールを使って通信したかったのですが、モジュールの使い方がわからずうまくいきませんでした。

とりあえず悩んでいてもおもしろくないので、IrDAではないですが、赤外線を使い、自前で通信させてみました。とりあえず動いたので、これを修正・拡張していけばそれなりに実用的なものができると思います。
(しかし、そのうちIrDAモジュールを使えるようにしたいものです・・・)



◆回路図
回路はこのように簡単なものです。

PSoCIrTestC.png


・送信側
赤外線LEDをトランジスタを使いON / OFFしているだけです。
Active Highであり、ポートに1を出力すれば赤外線LEDが点灯します。
逆に0を出力すれば赤外線LEDは消灯します。

・受信側
赤外線がフォトトランジスタに入ると、フォトトランジスタに電流がながれ、
PSoCのピンの電圧が下がり、ピンの読みが0になります。
それ以外のときは5Vに接続されているのでPSoCのピンの読みは1となります。



◆ソフトウェア
上記回路を使い、任意のデータ1byte送信するだけの物を作ってみました。

・送信側では一定時間ごとに割り込みを発生させ、そこでデータの送信処理をしています
・受信側では一定時間ごとに割り込みを発生させ、そこでデータの受信処理をしています

上位ビットから処理(送信または受信)します。
チェックサムなどは一切入れていませんし、符号化もしていません。

また、今回通信速度はデバッグ用に落としてみました。
4Hzごとに割り込みをかけてそこでデータを送信しているため、サンプルのビットレートは4bpsです(笑)
割り込み間隔をもっと短くすれば通信速度を上げることができると思います。



◆写真

PSoCIrBuhin.jpg
↑使用したフォトトランジスタ {TPS611] と 赤外線LED [TLN105B]



PSoCIrTest.png
↑正しく送受信できた

PSoCリンク集

| トラックバック(0)

PSoCを扱う際に参考になるサイトをいくつかピックアップしておきます。

Cypress


PastelMagic
Wiki、フォーラムなどもあり充実しています

Dr.Matrix.jp
ユーザモジュールの解説がわかりやすいです

迷走の果て・Tiny Objects
PSoCに関する記事がなんと100エントリー以上もあります

PSoC.info
赤外線送受信の記事などが役に立ちそうです

doggie's blog
PRoCなど、めずらしいデバイスの記事も多いです

Bluefish Webpage
電気工作のページにPSoCその他たくさんの記事があります

PSOC チュートリアル計画
わかりやすいチュートリアルが公開されています

Project C3 Wiki
USBUARTに関する非常に詳しい説明があります。

前回の実験(ここの下のほうの文章)
PSoCのSDカードモジュールでは読み取り速度が遅すぎてだめだったので、
WAVEデータをPSoCのROMに書いてDA変換するだけのプログラムを書いてみました。

スピーカの接続は以下のような簡易的なものです。
wave_sp.png
↑P0_5にDA変換した結果を一定間隔で出力する


今度はちゃんと動きました。
問題は読み取り速度だけのようで、再生自体は簡単でした。

ROMのサイズの関係上(今回使用したCY8C29466は32KBです)
8bitモノラル、8kHzのWAVEファイルを再生しました。

再生の際、WAVEファイルを読み取り、一度テキスト(以下のようなC言語のソースコード)
に変換するプログラムをC#でつくり変換しました。
SDカードが使えないと不便です。

変換例)
const unsigned char wave_table[] = {
128,128,128,128,127,125,125,126,129,130,129,129,135,137,138,137,132,121,110,108,
114,119,120,116,120,132,137,141,136,135,134,126,124,130,142,131,121,117,125,139,
・・・(略)・・・
};

後はこれを適当な間隔で読み取り、DA変換してあげるだけです。
以外にもあっさりと鳴りました。

当然ながら音質はかなり悪いですが、一応鳴ったので良しとします。
(でもなんかすごいくやしいorz)

◆リンク
参考にさせていただきました。
H8で音声データを扱ってみよう


WAVEファイルについて
WAVE形式のファイルフォーマット

WAV ファイルフォーマット

Ryuzのプログラミング講座<第1回 Waveファイルのフォーマット編>




PSoCのDA変換モジュールDAC8を使ってみました。
使い方は簡単で、以下のサンプルソースのようにすれば大丈夫です。

このサンプルではP0[3]の出力電圧が変化します。
ディレイもいれてあるのでテスターを当てて調べてみると、
電圧がだんだん高くなっていき、また下がる様子がわかります。
(0[V]→5[V]の繰り返し)

今回はPSoC、CY8C29466で実験しました。
このデバイスはアナログ出力が
P0[2]~P0[5]
のポートでしかできないので注意が必要です。
(私はLCDモジュールをPort0で使っているのでちょっと困りました。)


◆ソースコード



◆DAC8で変換する際の注意点
DAC8を動かす際、周波数の設定に注意する必要があります。
分周しないでVC1 = 24MHzのままやってしまったりすると動作しません(常に2.4V前後になってしまったりする)
VC1 = SysClk / 16では大丈夫でした。

参考記事:PSoCフォーラムの記事


PSoCのLCDのユーザモジュールは標準ではカーソルが表示されません。

今回は、LCDを扱う際、カーソルのON/OFFをしたい場合どうしたらよいか、メモしておきます。
どうするかというと、LCD_1.asmに少し追加するだけでOKです。

追加すると、APIが増えたような感じで、手軽にカーソルのONとOFFができます。

lcd_cur.png
↑LCDへのカーソルの表示


◆概要

ロータリーエンコーダとは、下の写真のように「回す」ものです。

encoder.jpg

マイコンにつけて使うと、使いやすいインターフェイスを実現できます。
実際に、身の回りのものでは電子レンジなどに使われています。

私はいままではあまり気にしていませんでしたが、秋月のあるキットに使われており、
けっこう使いやすい(回して操作するのが面白い)ことがわかったので使ってみたくなりました。

そこでネットで検索したところ、わかりやすいサイトがでてきたので、ロータリーエンコーダを買って
PSoCにつなげてみました。



◆リンク

参考になるサイトは以下のとおりです。


ロータリーエンコーダを使う
↑ロータリーエンコーダの仕組みや配線方法がわかります。

ロータリーエンコーダの使い方
↑ロータリーエンコーダを使う際、どのように実装したらよいのかがわかりやすいです。


基本的にはこれらのサイトさえ見てしまえば、大丈夫だと思います(笑)
特にChaNさんのインクリメンタル型ロータリーエンコーダの回転方向を演算により判定する方法
は役に立ちました。A相と B相をバイナリコードとして見るということと、その処理の方法がポイントでした。

前回、SDカードのユーザモジュールのデータシートに載っているサンプル(SDカードへのテキストデータの書き出し)を動かしてみました。
今回は書き込みではなく、SDカードのテキストデータを読み出すプログラムを作ってみました。

データシートを見ながら作ってみたのが次のコードです。前回のコードを改変して使用しました。
また、読み取ったテキストデータを見るために、シリアル通信を使っています。

PSoCのSDカードのユーザモジュールを使ってSDカードを読み書きしてみました。
ユーザモジュールを使えば簡単にSDカードの読み書きができます。
しかもFATに対応しているので、書き込んだデータをパソコンで見ることもでき非常に便利です。


sd_module.png
↑PSoCのSDカードのユーザモジュール

 PSoCで外部EEPROMを使う場合、どのようにしたらよいのかメモしておきます。
今回はI2C接続のものを使いました。

 さて、今回は使うデバイスはシリアルI2C EEPROM 24C256(マイクロチップ)です。
サイズは小さいですが、1個 160円だったのでこれにしました。
(最初はアトメル製 256kビットEEPROM 24C256にしようかと思ったのですが、
秋月の店員さんが間違えて、こちらになってしまいました(苦笑))


 I2Cで読み出しや書き込みをしたいので、
PSoCのユーザモジュール"I2Cm"を使いました。
psoc_i2cm.png
↑PSoCのユーザモジュール"I2Cm"



 また、接続は次の図の通りにしました。
SDAはPSoC側のP1[5]、SCLはP1[7]に接続しました。
(PSoCはCY8C27443-28PXIを使用)

eeprom_c.png
↑EEPROMの接続(周辺部分のみ)



 PSoCデータロガー(?)の続報です。

 以下が、以前の記事で書いたとおに、PSoCデザイナでのAD変換の設定を直した後計測された温度データです。
前回は変な値が記録されて、がたがたのグラフになっていましたが今回は大丈夫です。

 測定場所は屋内の、あまり日の当たらない部屋です。(午前中のみ日が入る)
この部屋は測定中に暖房をつけなかったのでずっと寒いままです。
もう少し温度の変動があると思いましたが、あまり変わりませんでした。
午後に多少温度が上がる程度で、午前4時ごろに少し冷え込みますが、あまり面白くないデータでした。


sensor_temp_0114_0115.png
↑測定された温度データ。1つになるのは1月5日の16時ごろに少し温度が上昇していること。いったい何が・・・?
最初のほうの温度データが高いのは、暖かい部屋から温度センサを移動してから時間があまりたっていないため、センサがまだ周囲の温度になじんでいないためです。

以前の記事でとりあげたように、PSoC実験ボードを使い明るさを記録するものをつくりました。

■測定方法
明るさの測定はCdSを使います。明るさ測定の回路は以下の通りです。
CdS_Setsuzoku.png

抵抗で電圧を分圧し、電圧をAD変換することで数値(明るさ)を得るだけの簡単なものです。
今回の接続の場合、明るければ明るいほど数値は小さく、暗ければ暗いほど数値は大きくなります。
今回、AD変換には6bitのものを使っているので数値は0~2^6-1、つまり0~63がでてきます。

■測定間隔
1分おきにデータを外部EEPROMに記録することにしました。

■読み出し
PCへのデータの読み出しはシリアル通信を使いました。
PC側のソフトウェアはTeraTermを使いました。それをCSV形式のファイルで保存し、Excelでグラフを作成しました。

SensorLogyomidasi.png
↑CSV形式でデータが送られてくる

 最近は温度センサの出力を使って遊んでいます。

 さて、ある日温度センサの出力をPSoCでAD変換してみました。
ほぼ正しい値がでるものの、どうも値がふらふらしてしまい安定しません。
まれに異常な値が出ることもあります。

 これでは困るのでネットで検索してみたところ、
PSoCフォーラムの記事に気になることが書いてあったので参考にして
AnalogColumn_Clock_0 を TMR Clock、CNT Clock と同じ VC2 に直したところ、
安定して動くようになりました。

(データシートにも書いてあるらしいです。データシートに

CAUTION It is imperative that the same clock be used for all three blocks or this user module will not function correctly.

という記述がありますが、これでしょうか。よくわかりませんが、直ってよかったです。)


PSoC_ADCINC12.png
↑ユーザモジュールのパラメータしか見ていないため、気づいていませんでした。
最初はVC1になっていました。PSoCって難しい・・・。