作業日誌
目次
過去の日記
ご意見†
1月10日 PSoCいろいろ覚え書き†
久しぶりに(?)いじっていたら、いろいろと忘れてるところがあったのでメモ。
ADC†
ADCを使って値をとりたいと思っていたんだけど、なぜか見当違いの値しか取得できない。
プログラムも何回も見直したし、配線もちゃんと確認した。つもり
…よくよく見てみると、バッファのPGAがスタートされていなかった。。
痛いミスorz
UART受信割り込み†
シリアルポートから何かデータが来たら、ADCの結果を返すプログラムを作ろうと思って、こんなのを書きました。なんでもいいからデータが来ればいいので、データ自体には何の意味もないので、こんな感じにしてみた。
(1)
void isr_rx_interrupt(){
LED_Invert();
while( ADCINC_fIsDataAvailable == 0 );
d=ADCINC_bClearFlagGetData();
UART_PutChar(d);
}
しかし、最初の1回はちゃんと動くのに、2回目からは返事が無い。LEDも変わらない。
データをロードしてないから、受信レジスタ辺りの処理をしていないからかな?と思い、
(2)
void isr_rx_interrupt(){
LED_Invert();
temp=UART_cGetChar();
while( ADCINC_fIsDataAvailable == 0 );
d=ADCINC_bClearFlagGetData();
UART_PutChar(d);
}
としてみる。おぉ!動いたぞ!
しかし、あまりスマートじゃないな〜と思いつつ、データシートを見ると、UART_CmdReset(void)が使えそうと想像。受信バッファをリセットするって書いてある。
(3)
void isr_rx_interrupt(){
LED_Invert();
UART_CmdReset;
while( ADCINC_fIsDataAvailable == 0 );
d=ADCINC_bClearFlagGetData();
UART_PutChar(d);
}
としてみるが、(1)と同じ症状に。バッファはリセットするけど、フラグはリセットしてくれないってことなのだろうか・・?
とりあえず今は(2)で実装しています。
スイッチ†
スイッチは、Tutorialに書いてありますが、なんだか頭が混乱するので、ヘッダファイルにまとめてみました。
chk_activelow_switch.h
内部プルアップ抵抗(スイッチの先がGND)のバージョンです。
スイッチが押されたら1、押されていなかったら0 (int型)を返します。
Device Editorで、該当ピンをPull Upにしてください。
これで次回以降からは頭が混乱しないことを祈りつつ。。
12月03日 簡易昇圧回路†
乾電池1本or2本でマイコンを動かしたいなーと思うときは結構あると思いますが、
低電圧動作マイコンを使うかか昇圧回路を組むしかありません。
安く・簡単に乾電池1本で5V弱を作る方法があったのでメモ
http://www.kansai-event.com/kinomayoi/koneta/batchg_dcdc.html
作り方†
・コンビニとかで売っている、乾電池で携帯電話を充電できるものを買ってくる
・ばらす
・一か所はんだ付け
・完成
この商品、安くて小さいのに、なかなか優秀な昇圧回路を持っています。
(EVOLTA電池2個セットで609円。つまり本体のみは300円弱)
本体から携帯電話へ端子が3本伸びていて、携帯電話側でそのうち2本をショートさせて、回路を完成させる。という構造なので、改造する場合は手動で端子をつなげてやる(はんだ付けする)必要あり。
今回はDocomo FOMA用を買ったので、外側2個でした。
ネタ元は上記サイトですが、最近の商品は回路が少し変更になっているようです。
・回路サイズが大きくなっている気がする
・LEDが常時点灯になっています。
入力が1.0Vのとき、出力電流が20mA、電圧4.4Vでした。
精度がいる時には怪しいけど、そこまで電圧の精度がいらない時には便利かもw
11月16日 Designerの逆襲†
以前、PSoCデザイナーを起動すると、ツールバーやらメニューバーやらスタートページすら表示されなかったことがありました。
何回再インストール/インストールを繰り返しても治らず、手動でフォルダとディレクトリを消しまくって何とか治ったんですが、
またやってくれました。
今回は、LEDモジュールのピンがなぜか「AnalogInputでHigh Z analog」の入力扱いになってしまいます。
デバッグ用にLEDを使用しているのですが、これのせいでLEDが光らず何度も無駄な苦労を、、、
再現度は毎回で、設定を直して保存しも、ロードすると戻ってしまします。
この病気にかかるLEDがあれば、かからないLEDもあってよくわからんです。
とりあえず、もう直すのは日課になってしまいました。。。
11月12日 wait関数†
少し時間を待って欲しいな〜って思う時がよくあるので、空ループにかかる時間を調べてみて、時間待ち関数を作ってみた。
void wait_msec(unsigned int wait){
unsigned int i,j;
for(i=0;i<wait;i++){
for(j=0;j<560;j++){
;
}
}
}
この関数の引数に入れた値×1msの時間待ち関数です。
ただ、引数の値が大きいと、誤差がだんだんでかくなっていきます。
そこまで精度のいらない用途向けってことで。。
*上のソースはCPUクロックが24MHzのとき限定です!
CPUクロックが変わると、空ループの時間が変わってきてしまいます。
それを(ある程度)考えて、ヘッダファイル作ってみました。
wait_msec.h
使い方
wait_msec_prescalerっていう変数に、CPUクロックのperiodをと同じ値を代入してください。
ただし、1,2,4,8,16のいずれかです。でないと、正しく時間を測れません、、
CPU_clkのperiodの値ってどこかのレジスタに入ってないのかな・・?そしたら楽なのに。
(作り直す気があれば)ほかのperiodにも対応したいです。
10月18日 SPI通信のメモ†
SPI通信する際には、MISO、MOSI、SClk、CSの4線がいる。(言い方が少し違う場合もある)
SPIM/SPISの入力クロックは、ほしいビットレートの2倍必要
1.CSで通信するslaveを選択
2.SClkで同期をとりつつ、MOSI線でmasterからslaveへデータを送り、MISOでslaveからmasterへデータを送る。要はパケットを交換する。
今回の目標は、slaveからデータを受け取りたい。
そんときmasterは、
・空パケット(orなんでもいい)を送る。
・送り終わったら、受信バッファにデータが入ってるから、それをロードする。
って流れ。
で、ふと疑問が。SPIMモジュールに、CSの線が見当たらない!
その場合slaveたくさんぶら下がってるときはどうするんだろう?
それに1対1でも、CSのエッジが通信の開始の合図だから、ずっとHI/LOWだと同期とか大丈夫なんだろうか・・?
というわけでLEDモジュールを使って自作でCS作ってみた。
"LED"って名前がついてるけど、要はそのピンをHI/LOWにするだけだから、LED以外にも結構使えるモジュール。
一応master側のプログラム
while( ! (SPIM_bReadStatus() & SPIM_SPIM_TX_BUFFER_EMPTY ) );
_CS_On();
SPIM_SendTxData( ' ' );
while( !(SPIM_bReadStatus() & SPIM_SPIM_RX_BUFFER_FULL));
_CS_Off();
d=SPIM_bReadRxData();
送信バッファが空になるのを待って、CSをON(アクティブLOW)にして、空パケット送りつけて(この場合はスペース)、受信バッファにデータが来るのを待って、CSをOFFにして、バッファからデータを読み込む。という流れ。
ってここにも書いてありました。
8月29日 テルミンもどき†
ずっと昔に、距離センサの出力に応じてPWM周波数が変化するプログラムを作ったので、さっそくさっき作ったアンプとつないでみる。
思ったとおりに動いてくれて(奏でてくれて)一安心w
対象まで10cm以下のときは1.8kHz、50cm以上の時は340Hz。ダイナミックレンジが広いので、少し手を動かすだけでうわんうわん鳴ります。
ただ、デフォルト時は340Hzがずっとぶーーーって鳴ってるので、余り気持ちのいいものじゃないです。
音量ももっと簡単に変えられるようにしないと・・
(というか、それがないとテルミンもどきじゃないか・・)
8月29日 オーディオアンプその2†
昨日の、カップリングコンデンサうんぬんの話は、オシロで計ってみたら違ってました。
PWM波形を、コンデンサ通さずに入力すると、0〜5Vの波形になる。
でも、オペアンプの入力はゼロを基準としてプラマイ0.4Vまでなので、0〜0.4Vの矩形波に見えていたよう。
コンデンサ通した時は、ボリュームを上げていくと、出力の音量は、最初は上がるのに後半下がっていく。
これをオシロで見てみると、入力が正のときは出力は電源電圧5Vになる。入力が負のときはグランド0Vになるはずなんだけど、なぜかだんだん電圧が上昇していって5V弱までになる。
これじゃ正のときと負のときの電圧差が少ないから、出力音量は変わらない。ということかな。
とりあえず、入力最大定格のプラマイ0.4Vに0〜5Vという大きすぎる電圧を入れてるのが原因かと思い、入力を分圧させてやって0.4V以下にすると、この現象は起こらなくなった。
ようは定格ちゃんと守れってことか・・さっき見直すまで見落としてましたorz
一応完成(?)したので、オーディオプレイヤーから音楽を鳴らしてみる。
ノイズは、注意して聞かなければ気にならないレベル。
音量も、結構大きくまでだせる。
曲の変わり目に「ブッ」って音が出るけど、これは何だろう?。
でもまあ、そこそこいい感じ♪
8月28日 オーディオアンプ†
院試が終わったので、前から作ろうと思ってたオーディオアンプを作ってみました。
ものづくりプロジェクトの時に一度作ってあるから、今回は簡単に作れる!と思ったけど前回作った時の資料が無かったからまた調べなおしorz
(ほぼ)完成した回路
左右2chです。
一応、汎用オーディオアンプを目指したのでジャンパピンの抜き差しで用途が得られる。
一応、汎用オーディオアンプを目指したのでジャンパピンの抜き差しで用途が得られる仕様にしました。
入力のジャンパピンで、オーディオ入力とマイコンからの信号の両方に対応。
1chしか使わない時は、電源ラインのジャンパピンで、使わないチャンネルをユニット(?)ごとオフ。
入力はプローブでつまむ形にして、回路を直接見れる(聞ける?)。
後いくつか追加要素はあるけど今日はここまで。
入力のカップリングコンデンサ†
ネットでいろいろ回路図を見ていると、入力に、電解コンデンサをつける回路、つけない回路、というパターンがあった。
たぶんこういう考えなんだろう。
オーディオのプラマイ数十mVの信号を、直流バイアスするために電解コンデンサを使用。
マイコン出力は0〜5Vだから、バイアスの必要が無い(ように出力させる?)からコンデンサ要らない。むしろバイアスかけると電源電圧以上になってしまいリミットしてしまう。(ボリュームを増やしていくと、最初は一気に上がって、だんだんリミットされる分が多くなって音が小さくなるという変わった動きw)
実際に試してみてもそうなった。
↑間違いでした。(2009/08/09)
入力のレベル†
オーディオのプラマイ数mVの信号を電源電圧まで持っていくのがオーディオアンプだとしたら、マイコンのディジタル出力0〜5Vは馬鹿でかい。
実際、音量用の可変抵抗を気持ちほんの少し動かしただけで、すぐにmax音量になってしまった。
それ以前の段で、分圧しなければいけない。大体50分の1ぐらい。
7月16日 PSoC First Touch with CyFi LOW-POWER RF†
通称無線PSoCが届いたそうなので、とりあえず試してみました。
(↑先生、ありがとうございます!)
詳しくはTutorialに書く(?)として、ここでは要点だけ。
開封
いろいろ入ってますね〜
接続
左が、RF Expansion Card(無線通信・温度センサ付)とボタン電池pack。
右が、PC Bridge(無線通信・PCとのUSB通信)
今回使わなかったのは、MultifunctionBord(PSoC first touchと同じもの)、乾電池packです。
結果
子機(?)に取り付けられた温度センサの値を、パソコンに表示。
室温→手であっためる→室温
1秒インターバルでログをとってるんですが、結構安定して、(見た感じ)正しい値が取れてる。
デモに入ってるファームウェアを動かして、PCでは今回インストールしたソフトを使って、という、すっごい簡単にできてしまったことに驚きです。
とりあえず、今日は、付属PDFの3.2.2まで進みました。
- 略称
フルネーム | 略称 |
PC Bridge | FTPC |
RF Expansion Card | FTRF |
MultiFunction Expansion Card | FTMF |
- 書き込み(後で再確認)
書き込み先 | Device Family | Device |
FTPC | 24x94 | CY8C28494-24LFXI |
FTRF | 27x43-*XI | CY8C27443-24*XI |
- SCDでの温度センサの設定
- Sensor Data Format Sign-Magnitude Integer
- Sensor Bit Range
- Starting Bit -> 0
- Length -> 2
- Scaling/Multiplication Factor
6月02日 PCとPSoCの通信その1(とりあえずテスト)†
PSoCとPCとの通信は今までAcknowrichを使っていたけど、自作でそれっぽいソフトを作ってみました。
フォームを作るのが簡単らしいC#を使い、基板は自主課題のときのを再利用。
↑ポートを選んで接続し、チェックボックスにちょぼを入れると、
↓該当箇所のLEDが光ります。
それだけです(ぇ
チェックボックスの状態が変化すると、その状態に応じた値がシリアルポートからUARTでPSoCに送られ、PSoCの出力の値が変わるという仕様です。
これだけだとありがたみ(?)が感じられないけど、制御の方法をいろいろ変えてみたり、マトリクスLEDにつなげばいろいろと表示ができて応用もきいて楽しそうです。
5月11日 東京タワー改造†
東京タワーの模型を買ってきました。
空けてみると抵抗とLEDとLR44電池x3(合計4.5V)がつながってます。
というわけで今回(初回)はこれをマイコン&フルカラーLEDでイルミネーション化したいと思います。
(ついでにマイコンの勉強も)
- ATTINY13-20PUという8ピンのAVRマイコンを使用。
- LEDはRGB3色でカソードコモン
- 出力ピンはRGB3本とPWM1本の計4本
- RGBピンはそれぞれのLEDのアノードへ
- PWMピンはLEDのカソードへ
- →アノードがHかつカソードがLのときだけ光る
プログラム†
- PWMのデューティ比を増減させ、だんだん明るくなる→だんだん暗くなるの繰り返し。
- 1回ごとに違う色で光る。
PWMを1個しか使っていないので、デューティ比は色ごとに変えられない。
でもとりあえず光ったので完成ってことで(ぇ