自主課題11
目次
コメント†
12月16日(金)†
ちょくちょく進捗†
やったこと†
- LEDマトリクスの表示のバグ直し
先週ぐらいから今まで正しかった表示がなぜか乱れていた。ADCモジュールを動作させようと色々設定を確認していて、Timerの設定を見るとVC3を設定していたはずのClockがVC1となっていた。ClockをVC3に設定し直すと正しく表示されたため、表示が乱れていたのはそのせいだったと思われる。Timerの設定は、なにかの拍子に設定を変えてしまったのかも。また、空欄にしていたTimerのパラメータを先輩に指摘され、埋めてもらった。空欄にしとくと勝手に設定されるからよくない。
- 加速度センサからの値取得
LEDマトリクスの表示を直し、何回か試していたらADCモジュールが正しく起動し加速度センサからの値が取得できた。今まで動作しなかった原因は不明。あと、PGAモジュールのReferenceをVSSからAGNDにした。入力がアナログの値なのでAGNDの方がよさそうとのこと。
- 加速度センサからの値に応じてパターンを動かす機能実装
ようやくADCモジュールが機能し加速度センサからの値が取れたため、傾けた方向に応じてパターンを動かす機能の実装に入った。センサに敏感になりすぎないように判定にマージンを設けた。また、動きが速くなりすぎないように適当に待ち時間を作った。
- 縦方向の移動
まず、傾きを検出したらビットシフトで縦方向に動かす関数を作った。
pattern[i] = pattern[i] << 1;
上のようにただビットシフトするとシフトしまくって、すぐにオーバーフロー(orアンダーフロー)で0になってしまう。そのため、下記のように端まで行ったら反対側から出てくるようにした。
if(pattern[i] == 0)
{
pattern[i] == 0b00000001;
}
境界条件の記事で言うループ型である。目標は堆積型であるが、LEDマトリクスは案外小さいため、堆積型にすると判定がめんどくさそう動きが少なくなりそうなのでループ型でも良いかもしれない。また、この書き方だと1列に1ビットしか光が存在できないので1列に複数個の光を存在させるためには工夫が必要だ。これこそむつかしそう。イメージも沸かない。
- 横方向の移動
横方向の移動は前回のパターンの引数を変えて実現した。例えば、右方向の移動なら下記のようにした。
buf[i] = pattern[i];
if(i==0) pattern[i] = buf[7];
else pattern[i] = buf[i-1];
これで動かしてみると、横方向へ動いているのはわかるがパターンがぐちゃぐちゃになってしまう。原因はよくわからない。うぐぐ。
また、縦方向だけ、横方向だけなら一応動くのだが、縦横両方を入れて実行すると2,3ビット動いた時点で動きが止まってしまう。この現象もよくわからないのでコードの処理を詳しく追ってみる必要がある。
はじめてしったこと†
おもったこと†
- やっとセンサから値とれた!
- Timerの設定変えた覚えが無い...再確認はするものだ。
- なぜ今までADCモジュールがうまく動かなくて、なぜ今回はうまく動いたのか?なぞ。
- 横方向の動きはいけそうなのにうまくいかなんだ...
- 先輩の、問題切り分けの技術がすごかった。プログラムがどこまで動いてどこで止まっているかを逐一チェックするやりかたは是非真似したい。
- やべえ時間ねえ。
つぎやること†
- 縦方向に複数ビットの光を存在させる境界条件を考える。
- 横方向の移動を正しく実現する。
- 緑色LEDの使い方を考える。赤だけでも難儀しとるのにどうしまひょ。赤色が完璧にできたら同じ処理を適応、でいいんだけどね。おもしろい使い方ないかしら。
- 作業日誌への画像の載せ方聞くの忘れた!
12月13日(火)†
初期パターンと境界条件の提案†
ちょっと考えてみたことを忘れないようにメモ。
初期パターンについて†
- 固定
電源を入れたらいつも同じパターンが光る。
- ランダム
電源を入れたらランダムに初期パターンを生成する。
- リセットスイッチ
リセットスイッチをつけて、スイッチが押されたら初期パターンに戻るorパターンをランダムに生成。
ピンはまだ余ってるのでリセットスイッチも一応可能。どうせ動いてバラバラになるので固定でいいかな。どんなパターンにするかは要考察。光らせる点が多すぎると詰まって動きが少なくなるし、少なすぎると物足りなさそうだから実際動かしながら適当に調整する。
境界条件について†
光が端まで来た時の挙動をどうするかについていくつか考えてみた。
- 堆積型
端は壁で、端まで来た光はそこで止まる。普通の万華鏡を模倣するならこっち。壁に当たってる光にせき止められる光の挙動とか何気に大変そう。
- ループ型
端まで来た光は反対側の端から出てくる。こっちのがいけそう?
- 奈落
端まで来た光はそのまま流れていき奈落の底へ。光がなくなっちゃうのでパス。
12月9日(金)†
自主課題研究8日目。
やったこと†
はじめてしったこと†
画像を添付したいのですが管理者パスワードが必要みたいですね。今度教えていただけますでしょうか。
おもったこと†
- なんでうごかへんねん。ただ光るだけのとこすら挙動あやしくなってるやん...
つぎやること†
- PCと通信して、ADCで値取得できているか問題を解決する。
- 値取得とLED点灯の両立。
12月2日(金)†
世界秩序の崩壊(ブレッドボード編)†
自主課題研究7日目。
加速度センサを繋げるために、アナログ入力の出来るピンを確保した。配線とプログラムを変更した。が、先週のような正しい動作をしない。使っていなかったピンの設定を変えなければと気づいた。しかし1列どうしても光らない。その1列に対応するピンに5V電圧をかけると正しく光った。配線やLEDの問題ではない。ということはPSoCから信号が出ていない?プログラムをどれだけ見ても、ピンの設定を確認しても正しいはず。どういうことだ?遂に取り出したる最終兵器ディジタルテスタ。PSoCの足に端子を当ててみると、なんと5Vが出ていた。ブレッドボード内部が断線しているようだった。まさに世界秩序の崩壊、常識とされていたことが常識では無くなった瞬間だ。それからブレッドボード上のPSoCの位置を変えてみると正しく動作した。何も信じられない...
そして後半やっと加速度センサの搭載を始めた。加速度センサがどんなものか、オシロスコープで波形を見てみた方が早いと、波形を見せてもらった。それでちょっと遊んだら、ADCモジュールの設置と設定に入った。その後、何とか加速度センサを使ってLEDの制御をしてみたかったが、うまくいかず終了。来週はこの続き、モジュールへの命令を見直し、ADCが値をちゃんと取れているかテストする。
ちなみに、全体のピン数はデコーダ(74HC138)のおかげで足りそうです。
やったこと†
- 加速度センサを接続するために配線とプログラムを変更
- 加速度センサの概要と配線
- ADCとPGAモジュールの設置と設定
今回は、加速度センサからx軸とy軸の2入力なのでDUALADC8というモジュールを使う。(11.12.09追記)
はじめてしったこと†
- ブレッドボードを信用してはいけない!
加速度センサを接続するために配線とプログラムを変更したところ、ドットマトリクスに指定したパターンがうまく表示されなかった。原因を探ってみると、Port1はデコーダに繋いでいて3ピンしか使ってなかったため、ピン設定が正しく行われていなかった。しかし、ピン設定を変えても1列だけどうしても点かなかった。悩んだ挙句テスタで検査してみたところ、原因はブレッドボード内部が断線している模様。場所を変えてみると正しく動作した。ブレッドボードを信用してはならない!
- ADCモジュールを使うにはPGAモジュールを通さないといけない
PGA(Programmable Gain Amplifier)モジュールとはゲインを設定できる増幅器で、ピンとADCへの入力の間に挟む。増幅が必要ない場合は1倍でOK。
- ADCで取得できる加速度センサの値
ADCにデータを取得させる命令cGetData()は8bitのデータを返す。よって、0から255まで表せる。加速度センサの場合、傾けなければ127をいう値を取りそれを基準に+側に傾くと値が増加し、−側に傾くと減少する。
- 思い出した指摘。PGAとADCをスタートさせるAPIの引数は、基本"HIGHPOWER"にしとく。(11.12.06追記)
おもったこと†
- ブレッドボード内部断線には無駄に悩んで疲れた。何も信用ならん。
- 加速度センサおもしろい。傾けながらオシロスコープで波形見るだけで遊べる。
- プログラム内でのモジュール動かし方がよくわからん。データシート読むの疲れる。
つぎやること†
- PSoCをPCに繋いでADCが加速度センサの値を正しく取れているか確認。
- 加速度センサの挙動をLEDに反映させる。
- ADCモジュールのパラメータ(Clock等)とAPIの引数について調べて適切な値を入れる。(11.12.09追記)
11月25日(金)†
もくもくと†
自主課題研究6日目。
まずダイナミック駆動用タイマ割込み実装。PSoC入門:PSoC First Touch編を見ながら見よう見まねでやってみたらできた。途中、普通にコンパイルできてるのにエラーだと思って悩んでた。自分でも謎... その後、緑LEDもつけてみようということで緑LED用のケーブルを作った。緑のピンには規則性が無いのでブレッドボードでの配線がつらかった。ちゃんと光った。緑にもPSoCのPort0全部使ってみたけどピン足りるかな...
赤、緑ともにダイナミック駆動で光らせることができたので、次からは加速度センサを使ってパターン作りのプログラムを考える。
11.12.01追記
先生のコメントを読んで。
加速度センサはアナログ入力対応のピンに繋げねばならないが、アナログ入力対応ピンは無駄に点灯パターン出力につかっちゃってるので配線しなおし... プログラムもちょっと変えねば。
後で使うことがあるかもしれないから必要ないならなるべくアナログ対応ピンを残しておく方がいい
というアドバイスを参考に、単純に下のポートから使っていったら裏目った。まあ、センサからの出力で使うのはx, y方向の2つだけだからピン数は足りそう。
今までモジュールはTimerしかつかってなかったが、ADCモジュール使うことになりそう。PSoCならではっぽくてわくわく。
やったこと†
- タイマ割込み実装
- 緑LED用のケーブル作り
- 緑LED点灯のプログラム作り
はじめてしったこと†
- ダイナミック駆動用タイマ割込みの間隔
長すぎるとチラつく。短すぎると周りのLEDにノイズが入るみたい。今回は24MHzのSysClkを適当に分周して9375Hzのクロックを作り、それをPeriod 20で使った。綺麗に見えたため今後この設定を維持する。
おもったこと†
- タイマ割込みってループの代わりみたい。タイマ割込みの長所は、ループ間隔を詳細に設定できるってところだけ?
- ピンが増えてきてブレッドボードの配線がつらかった。
つぎやること†
- 加速度センサ導入
最初の方の回に加速度センサをもらうの忘れたのでもらうとこから。
- 光の移動を実装
11月18日(金)†
そしてダイナミック駆動へ†
自主課題研究5日目。
138をもらってブレッドボードに配線してからはプログラム書いては試しの繰り返し。今回から特定の場所を光らせることを考え始めて、やっと慣れてきた。まず列の選択。関数にしてループの中に入れてカウントアップ。次に行のパターン。配列を用意して決めておく。そしてループ内で行と列を対応させればダイナミック駆動。そんな感じで進んだ5にちめ。
先生「あとはタイマ割込みすればいいじゃん」
ある時間間隔ごとにダイナミック駆動用のプログラムを裏で動かしとくって感じ?詳細は次回、乞うご期待。
やったこと†
- 3to8デコーダ(74HC138)を使ってPSoCからLEDマトリクス(列)の制御
- 行も対応させてダイナミック制御するプログラム作り
はじめてしったこと†
おもったこと†
- ダイナミック駆動って、行のパターンを配列で作っておけば、ループ内で配列の添え字と選択する行を対応させるだけじゃん。
- 特定のトコを光らせるには、どこを1にしてどこを0にすればいいかやっと分かってきた。落ち着いて考えれば簡単。
- ライタへのPSoC抜き差しがつらかった。PSoCの足折れたし指に刺さったし...今回調子悪かったけど次からブレッドボード上で書き込む。
- 光った!パターンが動くとそれっぽい。
つぎやること†
- 緑LEDのダイナミック駆動も同様に実装
- ダイナミック駆動部分をタイマ割り込みへ
11月11日(金)†
書き込み器作りつづきと自分の道†
自主課題研究4日目。
書き込み基板に抵抗とLEDとSWつけて光らせた。プログラムは回りくどいけど納得。後半は自分が使うLEDマトリクスのテスト用ケーブルを作った。そして、ブレッドボード上で光らせてみた、赤だけ。また配線ミスっていた。落ち着こう。
いよいよ別々の道へ分かれていく。その中でも有益な知識を共有できたら良い。
やったこと†
- 書き込み器作りの続き(抵抗、LED、SW)
- PSoCにてLEDのSW制御
- LEDマトリクスのテスト用ケーブル作り(とりあえず赤だけ16ピン)
- LEDマトリクス光らせてみた(!)
はじめてしったこと†
- カラーコードの見方ぼんやりと(黒0茶1赤2)
- PRT○DRの使い方→変数に代入で読み出し、値代入で書き込みもできる。
- Pull down→ループ開始の度'L'にしとく。初期値設定みたいな。
おもったこと†
- ライタできた。はじまりだ。
- SW制御は回りくどいけど難しくはない。
- ケーブル作りは単純作業。無心になれて嫌いじゃない。また配線ミスったけど。
- ドットマトリクスも光っていよいよだ。
つぎやること†
- ドットマトリクスの構成理解
- PSoCでドットマトリクス制御(まず1色)
10月28日(金)†
制作案発表と書き込み器作り†
自主課題研究3日目。
発表では色んなアイデアが出ておもしろかった。できたらみんなで遊びたいと思った。
はんだ付けなんて中学校以来なので緊張した。ソケットとピンの接続をミスった。ちくせう。けどはんだ付けの練習になったかと。。。
項目があるとここに書くことが無くなる。ここの自由欄廃止かも。
11.10.29追記
ソケットとピンの接続をミスった原因は絵をいい加減に描いたためと考える。分かりやすい絵を描き落ち着いて配線する。
やったこと†
はじめてしったこと†
おもったこと†
つぎやること†
10月21日(金)†
自主課題研究2日目。
PSoC入門:PSoC First Touch編の前に簡単な実習を行った。家でインストールしてちょっと動かしてみた時のエラーが根本的なものらしく、Designerの再インストールに多くの時間が取られもったいなかった。
PWMの実習では、決めた音の高さを出す時はPWMへのクロックは固定でPeriodで調整した。PulseWidthはPeriod/2としてなるべくデューティー比50%を実現した。
Tutrialの途中までやったので続きをやっとく。来週は発表なのでアイデアを探し寝かせることにする。
やったこと†
- PSoC Designerの再インストール
- LEDつけるだけ
- PWMでLEDの明るさ制御
- 周波数をPWMで設定しブザーで鳴らす
はじめてしったこと†
おもったこと†
つぎやること†