マイコンでSDカードに記録したい

お昼に来来亭というラーメン屋で旨辛麺というとても辛いラーメンを食べた。
僕はこれが好きで時々食べに行く。
おいしいのだが、大体次の日に腹を下してしまう。
妻は辛い物に強いので平気な顔で平らげ、お腹も平気なようだ。
学生時代にココイチの10辛を食べに行ったことがあるが、妻(当時は妻ではなかったが)は平気な顔で食べていた。
僕はヒーヒー言いながら水を大量に飲みながらでないと食べることが出来なかった。
この違いはどこからくるのだろう。

*********************************************
これは多分冬休み中には無理だと思うが、記事タイトルの通り、マイコンでSDカードへの書き込みを行いたい。
前に室温を測定してその結果を随時パソコンにシリアル通信で送るという回路を作ったが、パソコンを立ち上げずに記録を行いたい。
少し調べてみると、sdカードの伝送プロトコルにはSPIモードとネイティブモードというものがあるらしい。SPIモードの方が単純で、マイコンと接続するなら実質SPI一択らしい。
いきなりSDカードと接続するのはハードルが高い。
そこでSPI通信を利用するD/A変換IC MCP4922を制御するところから始めようと思う。
既に購入済み。
 
ジャジャガッチ | 電子工作 | 00:07 | comments(0) | trackbacks(0) |

赤外線防犯センサ実証実験終了

今日はうちの猫を予防接種に連れて行った。
うちの猫は車が苦手なので、道中が大変。

**************************************
赤外線防犯センサの発光側と受光側のテスト回路が正常動作することを確認した。→「ジャジャガッチの勉強ノート
今はコンセントから電源をとっているけど、実用にするには電池駆動させる必要があるよな。
5Vが必要だから9V電池を三端子レギュレータで5Vにするか。
 
ジャジャガッチ | 電子工作 | 23:41 | comments(0) | trackbacks(0) |

コンデンサの電荷をトランジスタで迅速に放電する

ただいま午前3時。なんという不健康な生活。

*********************************
コンデンサの電荷をトランジスタスイッチで迅速に放電する回路を考えた。寝たら忘れそうなのでメモ。トランジスタQ1は信号反転用で、Q2が放電用。

回路定数は適当。眠いのでもう寝る。
ジャジャガッチ | 電子工作 | 03:16 | comments(0) | trackbacks(0) |

冬休みの自由工作

クリスマスイブイブに友達とたこ焼きパーティーをした。
妻がコーヒーを出してくれた。
僕はブラックコーヒーが飲めないので砂糖を大量に入れてくれと注文したところ・・・。

しょっぱい!しょっぱいよコレ!!

ものすごくびっくりした。何が起こったのかわからなくてコーヒーが腐った?とか、世の中には変わったコーヒーがあるものだ、とかいろいろな考えが浮かんでしまった。塩だよ、これ。
こういう漫画の中でしか見たことがないようなことをしでかしてくれる素敵な嫁です。

*************************************************
さて、今日から冬休み。
冬休みの自由工作で赤外線を利用した防犯センサを作ることにした。
人が通過したことを検知してブザーを鳴らすようなものを作りたい。

エレキジャックNo.12(2009)のステップ・ゴーゴーゴーで階段ダンス!という記事の回路が丸々使えるので楽。
詳しくは「ジャジャガッチの勉強ノート」参照。
ジャジャガッチ | 電子工作 | 19:48 | comments(0) | trackbacks(0) |

Windowsプログラミング 「子ウィンドウのプロシージャ内でIDを取得する」

ここ最近毎日ギレンの野望に没頭していて妻に少し呆れられているので少しは知的な活動もしていることを示さねば!
友達と飲んだ後、朝4時までプレイするほどはまっていたのでした・・・。
その日は死にそうだったけど。

**********************************************
スーパークラスを使って機能拡張したボタンを二つ用意する。
子ウィンドウのプロシージャ内でどちらのボタンが押されたかを知るためにはどうしたらよいだろう。
親ウィンドウならばLOWORD(wp)でIDを取得できた。

子ウィンドウならばGetDlgCtrlIDを使う。

case WM_LBUTTONUP:
        id = GetDlgCtrlID(hwnd);
        if(id==0)MessageBox(hwnd, "0", "BBB", MB_OK);
        if (id == 1)MessageBox(hwnd, "1", "BBB", MB_OK);
        break;

簡単だね。
ジャジャガッチ | C/C++ | 16:13 | comments(0) | trackbacks(0) |

Windowsプログラミング 「スーパークラス」

妻はブログに書かれると嬉しいらしい。

****************************
ボタンの機能拡張をサブクラスではなくスーパークラスでやってみる。
これは既に登録されているウィンドウクラスの定義を流用して自作のウィンドウクラスを作る方法だ。
まず既存のウィンドウクラスの情報を取得する。

GetClassInfo(g_hInst, "BUTTON", &wc);

ウィンドウプロシージャはデフォルトのものを保存しておき、自作のプロシージャをそのあとに登録する。
ButtonWndProc = wc.lpfnWndProc;
wc.lpfnWndProc = MyButtonWndProc;

あとは自作のプロシージャを定義してやるだけ。ウィンドウクラスの名前を付けるのも忘れずに。

サブクラスを使う方法=既存のウィンドウクラスをもとにウィンドウを生成し、プロシージャのアドレスだけを書き換える方法。
スーパークラスを使う方法=既存のウィンドウクラスの定義を流用して自前のウィンドウクラスを作ってしまう方法。

コード全体は続きから。
続きを読む >>
ジャジャガッチ | C/C++ | 15:57 | comments(0) | trackbacks(0) |

Windowsプログラミング 「白背景」

一年に一度くらい自分の笑い声で目が覚めてしまうことがある。
幸せだね、と言われます。

********************************************
これまで作ってきたプログラムでは、背景に気を使わなかったので見栄えがよくなかった。
背景を白く塗りつぶしてみる。
これは簡単。
WNDCLASSを定義するときに

wc.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);

としてやればよい。簡単簡単。
ジャジャガッチ | C/C++ | 15:50 | comments(0) | trackbacks(0) |

「ギレンの野望 アクシズの脅威V」ジオン公国編クリア

今月に入ってからギレンの野望をやっている。
ギレンの野望はガンダムの戦略シミュレーションゲームだ。
このゲーム非常に難しく、アクシズの脅威Vは難易度ノーマルでクリアしたことはなかった。
セーブデータを見ると数年前にvery easyでクリアしたデータはあった。
あまりに難しくて嫌になったのだと思う。
ジオンが好きなのでいつもジオンでプレイする。

史実に忠実なので、一年戦争序盤はザクで敵戦車・航空機を蹂躙することが出来る。
しかし時代が進むと連邦軍にもMSが配備され、戦闘が苦しくなる。
それでジリ貧になってゲームオーバー、というパターンが多い。

今日ようやくノーマルでクリアできたのでいくつかコツを書いておく。

・とにかく速攻
これは非常に重要。じっくり準備を進めていると敵も強力な兵器を開発してしまうので準備万端でなくてもとにかく攻め込む。
特別エリアに攻め込めばとりあえずその基地の生産はストップさせられる。
敵部隊数が多くても気にしない。航空機や戦車でかさ増しされている場合も多いし、
AIは馬鹿なので数が1/2程度でも結構勝てたりする。勝てそうになければ主力は撤退して航空機はエリア内を飛び回って戦術フェイズ5ターンを凌げば生産をストップさせ続けられてよい。
後方に増援を用意しておくことも忘れずに。
新勢力があらわれても最初の5ターンは動かないので、そこで出来るだけ領土を広げておくとよい。

・一機防衛
これも非常に重要。敵がこちらのエリアに攻め込んでくるときは、配備されている戦力と同程度の戦力を送り込んでくるため
一機で防衛する。すると敵も少ししか敵を送り込んでこない。
そこで後方に配備しておいた3部隊程度を送り込んで殲滅すれば少数戦力で防衛が可能になる。
このとき、送り込む部隊をあまり多くし過ぎると、その戦力に反応して対処できない数を送り込まれたりするので注意。

・特別エリアを制圧したらその周辺地域も制圧しておく
これも重要。特別エリアを制圧したら満足しがちだが、周辺地域の制圧も忘れずに。
これをしておくと一機防衛がしやすくなる上、侵攻が進むとエリア同士が繋がって効率的な輸送が可能になる。

・エース機(一機編成)にエースを乗せる

・基本的に委任はしない
局地戦はAIに任せることもできるがAIは馬鹿なので自分でやれば余裕な戦闘で苦戦したりする。
余程戦力差がない限り委任はしない。戦力差があっても戦略フェイズ1ターンで制圧するのと2ターンで制圧するのとじゃあ
その後が変わってくるので戦略的に大勢が決まっていない限りは基本委任しない。

・局地戦には優秀な指揮官をひとりは連れていく
周囲のユニットの能力を底上げしてくれる。

・無駄に兵器の補充をしない
部隊中の兵器が破壊された場合は戦略フェイズで補充が出来るが、直ちに必要でないならば補充はしない。必要な時に行う。
浮いた資金を兵器開発等にまわす。

速攻&一機防衛はとにかく重要。あとはおまけ。

今回は80ターンくらいで連邦軍本拠地ジャブローに攻め込むことが出来た。卑怯と言えば卑怯だが今回は生殺しで技術レベルを上げた。99ターンまで技術開発を続けた。プロトタイプギャンからガルバルディに改造しておく。ガルバルディは3機編成だが改造では1機しか出来ない。補充で3機に出来るがこれはしない。第二部に入れば自動的に補充されるから格安で兵器のアップグレードが出来る。
同様にS型ズゴックからズゴックEへの改造も行っておく。これだけ準備しておくと二部も楽に進められる。
これをしておかないと、一年戦争時の技術レベルでグリプス戦役を戦い抜かなくてはならなくなってしまう。
僕の場合は20ターンくらい準備出来たので第二部は10ターンくらいでエゥーゴ、ティターンズともに滅亡寸前まで追い込むことが出来た。ここで再び生殺しに入り、技術レベルマックスまで研究を進めると、あとのアクシズ、第三部ネオジオンは消化試合になる。

第一部をどううまく立ち回れるかでその後が決まってくる感じだな。
局地戦において少数の部隊で多数の部隊と戦うのはこれまでストレスだったのだが、今回はそれが結構楽しかった。
僕の戦略・戦術の教科書は銀河英雄伝説だが、銀英伝では補給の大切さや多数の部隊で少数の部隊を相手にするのが基本であることが書かれている。これを守る。補給基地は確保しておき、部隊はばらけさせない。敵は馬鹿なので補給も疎かだし、部隊をばらばらにしがちだ。ばらばらになった部隊をこちらの全部隊で攻撃すれば有利に進められる。
銀英伝でも似たような話があった。数の面では圧倒的に有利だった自由惑星同盟軍だが、艦隊をばらばらに配置して包囲殲滅作戦をとった。ラインハルト率いる帝国軍はこれを逆手に取り、包囲網の一部に全艦隊をぶつけることで局地的に多数で少数をたたくという状況を作り出した。まさにこれを実行している感があってとても面白かった。

次は連邦編をクリアしたいがそれは数年後かな。非常に疲れるゲームだ。
ジャジャガッチ | ゲーム | 09:42 | comments(0) | trackbacks(0) |

windowsプログラミング 「ボタンの機能拡張」

うちの夫婦は二人ともいい加減なので旅行に行く際、事前に計画を立てることをしない。
新婚旅行で一週間北海道に行ったときもほとんど計画を立てずに行った。
ホテルとレンタカーは事前に手配してなんとなくこの地方を廻る、ということだけ決めておいた。
絶対に行きたい!というところは五稜郭と旭山動物園くらいだったのでそれ以外はノープラン。
妻は美味しいものが食べられればそれで満足らしいし、僕はその日その時の気分でふらふらするのが好きだ。
だから特に問題が起こらないのだと思う。

計画を立てていなかったので旭山動物園は二日連続で行けて大満足だった。
大阪に旅行した時は途中で大阪に飽きたので、よし、京都行こう、と京都観光に切り替わった。
計画を立てた方がたくさんのところを廻れるのだろうが、性に合わない。
事前に調べないのでイマイチな店に入ってしまうこともあるが、雑誌に書いていないような穴場スポットを発見する喜びもある。

***********************************

今日はボタンの機能拡張。
例えばボタンを押し続けている間シリアル通信でメッセージを送信し続ける、などということはここまでの知識では出来ない。
そこで、既存のウィンドウクラスのウィンドウプロシージャを乗っ取ることをする。
これはサブクラス化と呼ばれるテクニックだ。

方法は簡単で、
SetWindowLong(hButton[0], GWL_WNDPROC, (LONG)NewButtonWndProc0);
とするだけ。第三引数が自作したプロシージャ。

プロシージャは例えば

LRESULT NewButtonWndProc0(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg)
    {
    case WM_LBUTTONUP:
        MessageBox(hwnd, "0", "0", MB_OK);
        break;
    }

    return CallWindowProc(ButtonWndProc[0],hwnd,msg,wp,lp);
}

処理しなかったメッセージはデフォルトのプロシージャの処理してもらうため、
ButtonWndProc[0] = (WNDPROC)GetWindowLong(hButton[0],GWL_WNDPROC);
で元のプロシージャを保存しておき、CallWindowProcで呼び出している。

先ほど例に挙げたシリアル通信の場合、
WM_LBUTTONDOWNでメッセージ送信を開始し、WM_LBUTTONUPで中止すればよい。

話を整理する。ボタンは元のウィンドウの子ウィンドウであり、子ウィンドウをクリックするとその旨が子ウィンドウ及び親ウィンドウに送られる。親ウィンドウにはWM_COMMANDが送られるのでボタンが押されたことはわかるが、より詳しいメッセージは送られない。そこで、子ウィンドウのプロシージャを乗っ取ってメッセージを横取りする、というわけである。

今回はサブクラス化の話をしたが、同じことはスーパークラスを用いても出来る。これは次回あたりに。

ソース全体は続きから。
続きを読む >>
ジャジャガッチ | C/C++ | 00:02 | comments(0) | trackbacks(0) |

Windowsプログラミング 「複数ボタン」

この前はんてんを買ってきた。
冬らしさを満喫するためだ。
冬はコタツでみかんを食べながらゲームをするに限る。
ただ、妻はコタツを出したがらないので毎年頑張って説得している。
コタツを出すと僕がコタツムリになってしまうのが嫌らしい。
でもコタツムリはやめられない。

*****************************

今日はウィンドウに複数のボタンをつけてみる。
ボタンを押すとWM_COMMANDメッセージが親ウィンドウに送られるのだが、
どのボタンが押されたかどうやって判断すればよいのだろうか。

結論から言えばCreateWindow()のHMENU型変数を入れるところにボタンを区別する整数を入れてやればよい。
どのボタンからメッセージが送られてきたかはWPARAMの下位ワードをチェックすればよい。
コールバックのところを抜き出すと

LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    static HWND hButton[2];

    switch (msg)
    {
    case WM_CREATE:
        hButton[0] = CreateWindow("BUTTON", "0", WS_CHILD | WS_VISIBLE, 50, 50, 50, 50, hwnd, 0, g_hInst, NULL);
        hButton[1] = CreateWindow("BUTTON", "1", WS_CHILD | WS_VISIBLE, 100, 50, 50, 50, hwnd, (HMENU)1, g_hInst, NULL);
        break;
    case WM_COMMAND:
        switch (LOWORD(wp))
        {
        case 0:
            MessageBox(hwnd, "0", "0", MB_OK);
            break;
        case 1:
            MessageBox(hwnd, "1", "1", MB_OK);
            break;
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wp, lp);
    }
    return 0;
}

ソース全体は続きから。
続きを読む >>
ジャジャガッチ | C/C++ | 21:18 | comments(0) | trackbacks(0) |
1/2PAGES | >> |

12
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH