2012年1月31日火曜日

Contents

label:電子工作

トランジスタ2石アンプ
http://hamachan-pon.blogspot.com/2011/04/blog-post.html

LT Spiceの導入
http://hamachan-pon.blogspot.com/2011/04/ltspice.html

LEDバーサライタの製作(上から順に古い)
http://hamachan-pon.blogspot.com/2011/01/led.html
http://hamachan-pon.blogspot.com/2011/03/led_23.html
http://hamachan-pon.blogspot.com/2011/04/ledmarkii.html
http://hamachan-pon.blogspot.com/2011/04/ledmarkii_05.html

DCモータのPWM制御
http://hamachan-pon.blogspot.jp/2012/08/dcpwm.html

UbuntuでのAVR開発
http://hamachan-pon.blogspot.jp/2012/11/ubuntuavr.html

STM32F4 DISCOVERYことはじめ
http://hamachan-pon.blogspot.jp/2015/09/stm32f4-discovery.html

label:ControlSystem

モータのPID制御1(サーボ制御の基礎,P制御)
http://hamachan-pon.blogspot.jp/2013/12/pid1p.html

モータのPID制御2(偏差無し制御,I制御)
http://hamachan-pon.blogspot.jp/2015/04/pid1i.html

STM32F4 DISCOVERYでのPID制御
http://hamachan-pon.blogspot.jp/2015/09/stm32f4-discoverypid.html

倒立振子シミュレーション(MATLAB/Simulink)
http://hamachan-pon.blogspot.jp/2016/01/matlabsimulink.html

多入力多出力系とは
http://hamachan-pon.blogspot.jp/2016/05/blog-post.html

シンプルな外乱オブザーバ
https://hamachan-pon.blogspot.jp/2016/10/blog-post.html

4ストロークエンジンの物理モデル
https://hamachan-pon.blogspot.jp/2017/04/4.html

カルマンフィルタの基礎式を代数とベイズ定理から見る
https://hamachan-pon.blogspot.jp/2017/04/blog-post.html

label:課題

積分の近似式(台形公式/シンプソン公式)
http://hamachan-pon.blogspot.com/2011/05/blog-post.html

ガウスの消去法(上から古い)
http://hamachan-pon.blogspot.com/2011/06/1.html
http://hamachan-pon.blogspot.com/2011/06/2.html
http://hamachan-pon.blogspot.com/2011/06/3.html

lagrange補間
http://hamachan-pon.blogspot.jp/2012/11/lagrange.html

label:Programming

C言語によるWindows用(Win32)オセロ
http://hamachan-pon.blogspot.com/2011/06/windows.html

X-Windowによる数学関数のグラフ表示
http://hamachan-on.blogspot.com/2012/01/blog-post_17.html

Newton-Roaphson法による方程式の求解
http://hamachan-pon.blogspot.com/2012/02/newton-roaphson.html

Euler法による一階常微分方程式の解法(CR回路を例に)
http://hamachan-pon.blogspot.jp/2012/03/eulercr.html

C言語でニューラルネット(関数近似)
http://hamachan-pon.blogspot.jp/2015/08/c.html

C言語でニューラルネット(2次元平面での分離)
http://hamachan-pon.blogspot.jp/2015/08/c2.html

パーティクルフィルタによるグリッドマップマッチング
http://hamachan-pon.blogspot.jp/2016/06/blog-post.html

ニューラルネットで雑な手書き文字認識
https://hamachan-pon.blogspot.jp/2016/08/blog-post.html

label:LaTeX

UbuntuでLaTeX
http://hamachan-pon.blogspot.jp/2012/06/ubuntulatex.html

よく使うLaTeX文法
http://hamachan-pon.blogspot.jp/2012/06/latex.html


label:other

MacbookAir2012にUbuntu
http://hamachan-pon.blogspot.jp/2012/07/macbookair2012ubuntu.html
http://hamachan-pon.blogspot.jp/2012/08/usbmacbookair2012ubuntu.html

2012年1月17日火曜日

数学関数のグラフ表示

今回は数学関数をX-WindowSystemでグラフ化する方法を載せたいと思います。
グラフ化することによって視覚的にわかり易くなり、実数解が存在するか程度ならすぐに分かります。

ではひとまず定義。



これが表示用の関数です。

ウィンドウの大きさは480*480で、うち上下左右40pxは空白部とします。
また、数値解析における分割数は100分割で、400px内を100分割して直線で結ぶ感じです。
つまり4pxは直線だけど大きい目で見たら曲線に見えるよね、って感じかな。

線を引くためには始点と終点が必要になりますが、終点は現在の計算点、始点は前回の計算点とします。
0→1、1→2、2→3点という風になります。

以下プログラムリスト。
Linuxの人はindentコマンドで整形するなりなんなりしてくだされ。

ちなみにindentコマンドは
sudo apt-get install indent
より
indent FILENAME -OPTION
で使えます。
OPTIONは-krをつかうと幸せ。

こんな感じになります。



以下リスト。

睦月

新年明けましてもう17日となりましたが、あけましておめでとうございます。

どうにか生きながらえております。

先日、成人式がありました。僕の誕生日は今月20日なので成人してるわけでは無いのですが。
中学校時代の同級生と久々に会いましたが、案外わかるもんなんですね。
望んだ理系が多くてなんか嬉しかった感じです。N氏やT氏やR氏など。

一緒に何か作れたら良いなと思ってます。
なかまになりたそうにそちらを見ます。

半期に渡る「週1でA4を10数枚」のレポートを出される授業がなんとか終わったので久しぶりの更新に至った次第です。

ちなみにこれを書いている最中にIbus標準の変換機能が悪すぎて泣いたのでmozc入れました(笑)。

sudo apt-get install ibus-mozc
で一発です。
Ibusの設定でインプットメソッドの選択→mozc→追加で使用可能です。上に持って行ってください。

少し打っただけでもすごい優秀で涙が出てきます。
閑話休題。

先程のN氏、T氏、R氏は情報理工の専門なのでちょっと(というかかなり)知識が及ばないと感じたため、逃げて専門の理工を伸ばす方向に決めたいと思います。

そこで次回からの更新予定。(すべて物理系のシミュレーションです。ちなみに開発環境はUbuntuLinux。X-WindowSystemとC言語中心です。)

1.数学関数のグラフ表示
2.Newton-Roaphson法により方程式の数値解を求める。
3.Euler法による一階常微分方程式の解法とそのグラフ化。(CR回路を例に)
4.Euler法による二階常微分方程式の解法とそのグラフ化。(ばね・ダンパ系を例に)
5.ばねによる二階常微分方程式のリアルタイムシミュレーション。
6.振り子によるに会場微分方程式のリアルタイムシミュレーション。
//7.落下、衝突のリアルタイムシミュレーション。
//8.衛生軌道のリアルタイムシミュレーション。

を考えています。
1~6は龍大理工機械の授業である通称KOJと同じモノなので載せていいか微妙なところです(笑)。まるまるコピーではないにしろCopyRightとかないのかな。

7,8はオリジナルであり作成中なので若干更新が滞る可能性があります。


また、授業ではリアルタイムシミュレーションにおいてEuler法を用いましたが、誤差が大きいため値が発散していきます。そのため同時にRunge-Kutta法でも数値計算を行う予定です。

誤差が大きいと時間が経つにつれて振り子が運動量保存則を無視して一回転したり、床でのバウンドがどんどん高くなっていったりします(笑)。


こんな感じで新年の挨拶は終わらせていただきます。
ではまた。

2011年8月26日金曜日

picasaアドレス変更?

いつもbloggerに画像を上げる時にはgoogleのサービスであるpicasaを使っていたんですけど
どうやら現在、一部を除いてブログに画像が表示されていません。

クリックでもリンク先へ飛べないので調べたところ、どうやら画像のアドレスが変わっているようです。
さすがに全部の画像を貼り直すのはとても面倒なので他の方法を考えたんですけど、
残念ながら手作業でリンク先を変更するしかないようです。

調べても引っ掛からなかったから他の人はこんな現象起こってないのかなぁ。
最近Androidケータイに変えてそこから一度更新したので、
それが悪さをしたんじゃないかと思う反面、アドレスの先頭が変わってるので単なる変更の可能性も……。

特にgoogleからのアナウンスはないみたいですね。
と言っても訳後でないと読めませんけど(笑)


すぐに戻すにはちょっと時間が足りないのでぼちぼちって感じですねー。
電験の終わる9/4日以降かな?


夏休みはいろいろする予定だったんだけど遊んで終わっちゃいそうだなぁー……。
そして電験の得点率が6割を越しませんorz
一教科受かればそれでいいんだけどなー。


ここでgalaxy SII tips。
galaxy SIIではホームボタンと電源ボタンでスクリーンショットが撮れます。
これはiPhoneと同じみたいですね。
初期から入っている操作なのでアプリのダウンロードの必要はありません。
操作は、ホームボタンを先に押し、すかさず押したまま電源ボタンを押すことで撮ることができます。

ちょっとしたポップアップが出るので撮れたかどうか確認できます。
画像はギャラリー内に。
でもあんまり使う機会がなさそうってのもあるんだよなぁ。

以上、今回も携帯からの投稿でした。

2011年8月15日月曜日

Android

先日、携帯電話がスマートフォン、サムスン製のgalaxySIIに変わりました。
現在のところ活用できるほど何も入れていませんが、
これからいろいろ入れていく予定です。

iPhoneでなくAndroidを選んだ理由はまあ、
よくある回線の問題や開発の容易さが大きかったかな。

iPhoneのアプリはMacintoshでしか開発できないからなぁ。
その分Androidはプラットホームを選ばないし簡単。
言語もjavaだし。

そんな感じでプログラミングの練習がてら
いつものオセロでも作ってみる感じです。


そのあとはチェスとかかなー?
もちろんそっちの専門ではないので対人打ちだけですけど。
Aiはかなり敷居が……。

他にはARとか触っていけたらいいなーなんて。

今回、ケータイからの投稿なのでこのくらいで。

2011年8月4日木曜日

キーボード掃除

今日から夏休みに入って時間が出来たので前からやろうと思ってたキーボードとの掃除を。

使ってるのがNEC LaVie LLのノートPCなので、 キーを掃除するためには結構面倒な感じで外さなきゃいけないんですよね。

ノートのキーボードはどうやらパンタグラフ(?)みたいな感じになっているようです。
これやる前に必ず写真撮っておきましょう。Insertあたりは結構覚えてないもんです。


壊さないように慎重に取り外し……。





十数分かけて全部取り終えました。
良く見るとスペースキーの場所に何か書いてます。



"H"と"I"かな?もしかしたら組み立て中にイニシャルを書いたとか?笑

ちなみに取り外しはキーの角に指を入れて左右片方ずつ取れば割れずに全部とれました。
シールを引きはがす感じ?

最初の方はストローを加工して水平に上に引っ張って取ってましたけど
時間かかるし手でいったら案外割れずに済んだってのが真実です。

まずはあまり使わないキーで試してみましょう。
(InsertとかPauseとか右Ctrlとか右Altとか……)


実は結構汚いキーボードの内側。



埃やら髪の毛やらがびっしりです。
これを歯ブラシで軽くこすりながら掃除機で吸うこと数分……。

結構きれいになりました。(しかし画像なし)
変な汚れは手元にあったエタノールで処理しました。
さっきのサイン(?)も消えました。

キーの方も同じくエタノール使いながら汚れを綿棒やらで取ります。

そして今までPCを使ってきた勘で組み直し。
ノート特有のONテンキーの数字に助けられつつ……なんとか組み直し完成。




こんな感じになりました。
正解と見比べてみると……。

Enterすぐ左のカッコふたつのキーが逆になってました。笑
はじまりが下にあるって見ただけでなんか違和感あるのに……。

キーを取ってつけ直し。
そんな感じでキーボードの掃除終了でした。

キーの装着の方は、片方のツメに見ながらはめ込むと
反対側は位置が固定されるのでそのまま押すだけで入ります。

あとEnterキーは出来れば外さない方がよかったかな。
補助用(?)にShiftとかEnterなどの大きなキーには金属の棒が入ってるんだけど、
それをつけるのが至難でした。

まわりからも掃除機で吸えるのでEnterだけ付けたままでもよかったなー。

それと掃除機を近づけ過ぎると固定用のプラスティックも外れたのでそこも要注意かな。


夏休み初日に何やってんだろ(笑)

2011年6月23日木曜日

Windowsプログラミングによるオセロ

学校の課題の休憩中にWinAPIの練習がてらいつものオセロを作ってみました。

Drawing関数はInvalidateRect()とかでWM_PAINT内で処理させた方がよかったかな。

最初に何よりも迷ったのがVisualC++でのWinプロジェクトの作成。
コンソールだとウィンドウとか出せないので、Winプロジェクトを作る必要があるんだけれど、
わざわざそんな初歩的なこと書いてないし、
なにより参考HPが基本的に以前のVerのVisualStudioだったりとか。

新規プロジェクト→Win32→Win32プロジェクトから作れます。
コンソールアプリケーションじゃだめ。

中身自体は空のプロジェクトでOK。そのあといつものように.cppを追加しとけば大丈夫。
とりあえずAPIの基本的な動き方はわかった(つもり)ので、
これからチェスとか作れればいいなぁなんて。

ちょっと前にもあったけどネタ。
http://www.gizmodo.jp/2011/06/667.html

これに対応する予定は今のところありません(笑)


以下リスト。

#include<windows.h>
#include <tchar.h>
#include<stdlib.h>
#include<stdio.h>


//const
#define WINDOW_WIDTH (430)
#define WINDOW_HEIGHT (340)


//grobal
RECT g_windowPos;
int board[10][10] = {0};
int buf_board[10][10] = {0};
int rev_board[10][10] = {0};
static int act = 1,wait = 2;//1 = player1,2 = player2
int rev_act = 2,rev_wait = 1;


//Prototype
HWND Create(HINSTANCE hInst);
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp);
void OthelloInit(HWND hWnd);
void Drawing(HWND hWnd);
int Algo(int x,int y,HWND hWnd);
void Check(int x,int y,int i,int j,int *flag);
void REV(int flag,HWND hWnd);
int NUMSTONE(int color);


//Start
int WINAPI WinMain(HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR lpCmdLine,
int showCmd)
{
HWND hWnd;
MSG msg;


//Create Window
hWnd = Create(hInst);


if ( hWnd == NULL){
MessageBox(NULL,_T("Creating Window is failed"),_T("ERROR"),MB_OK);
return 1;
}


//Show Window
ShowWindow( hWnd, SW_SHOW);
UpdateWindow(hWnd);


OthelloInit(hWnd);


//Message Loop
while( 1 ){
BOOL ret = GetMessage( &msg,NULL,0,0);//Get Message
if( ret == 0 || ret == -1){
//if get Message of Shutdown,
//or failed GetMessage() (return -1),EndLoop
break;
} else {
//Message
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return 0;
}


HWND Create(HINSTANCE hInst){
WNDCLASSEX wc;


// Window Class
wc.cbSize = sizeof(wc); //const size
wc.style = CS_HREDRAW | CS_VREDRAW; //style
wc.lpfnWndProc = WndProc; //window procedure
wc.cbClsExtra = 0; //Extra Info1
wc.cbWndExtra = 0; //Extra Info2
wc.hInstance = hInst; //Instance handle
wc.hIcon = (HICON)LoadImage( //Icon
NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,
0,0,LR_DEFAULTSIZE | LR_SHARED
);
wc.hIconSm = wc.hIcon; //child Icon
wc.hCursor = (HCURSOR)LoadImage( //Mouse Cursor
NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,
0,0,LR_DEFAULTSIZE | LR_SHARED
);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//Window Background
wc.lpszMenuName = NULL; //Menu Name
wc.lpszClassName = _T("Default Class Name");//Window Class Name


//Submit Window Class
if ( RegisterClassEx( &wc ) == 0){
return NULL;
}


//Window's location
g_windowPos.left = (GetSystemMetrics( SM_CXSCREEN ) - WINDOW_WIDTH )/2;
g_windowPos.top = (GetSystemMetrics( SM_CYSCREEN ) - WINDOW_HEIGHT )/2;
g_windowPos.right = g_windowPos.left + WINDOW_WIDTH;
g_windowPos.bottom = g_windowPos.top + WINDOW_HEIGHT;


//Create Window
return CreateWindow(
wc.lpszClassName, //Window Class Name
_T("Sample Program"), //Title bar
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, //Window type
g_windowPos.left, //X
g_windowPos.top, //Y
WINDOW_WIDTH, //Window Width
WINDOW_HEIGHT, //Window Height
NULL, //Parent Window handle
NULL, //Menu Handle
hInst, //Instance Handle
NULL //Extra Data
);
}


//Window Procedure
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
static int x,y;
static BOOL draw = FALSE;
HWND hButtonWnd;
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);


switch( msg ){
case WM_LBUTTONUP:
x = LOWORD(lp);
y = HIWORD(lp);
if(x >= 20 && x <= 55+34*7 && y >= 20 && y <= 55+34*7){
Algo(x,y,hWnd);
Drawing(hWnd);
}
return 0;
case WM_RBUTTONUP:
if(act == 1){
act = 2;
wait = 1;
}else if(act == 2){
act = 1;
wait = 2;
}
Drawing(hWnd);
return 0;
case WM_CREATE:
hButtonWnd = CreateWindow(
_T("BUTTON"),_T("UNDO"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
310,20,100,30,hWnd,(HMENU)1000,hInst,NULL);
hButtonWnd = CreateWindow(
_T("BUTTON"),_T("RESTART"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
310,260,100,30,hWnd,(HMENU)2000,hInst,NULL);
break;
case WM_COMMAND:
switch(LOWORD(wp)){
case 1000:
REV(2,hWnd);
Drawing(hWnd);
break;
case 2000:
OthelloInit(hWnd);
return 0;
}
break;
case WM_CLOSE:
if( MessageBox(hWnd,_T("shutdown?"),_T("checking"),MB_YESNO ) == IDNO){
return 0;
}
break;
case WM_DESTROY://when Window Destroy
PostQuitMessage(0);
return 0;
}


//other Messages is DEFAULT
return DefWindowProc(hWnd,msg,wp,lp);


}


void OthelloInit(HWND hWnd){
int i,j;


act = 1;
wait = 2;
for (i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
board[i][j] = 0;
}
}


for (i = 0;i <; 10;i++){
board[i][0] = 8;
board[i][9] = 8;
board[0][i] = 8;
board[9][i] = 8;
rev_board[i][0] = 8;
rev_board[i][9] = 8;
rev_board[0][i] = 8;
rev_board[9][i] = 8;


}
board[4][5] = 1;
board[5][4] = 1;
board[4][4] = 2;
board[5][5] = 2;
rev_board[4][5] = 1;
rev_board[5][4] = 1;
rev_board[4][4] = 2;
rev_board[5][5] = 2;


EnableWindow(GetDlgItem(hWnd,1000),FALSE);


Drawing(hWnd);
}


void Drawing(HWND hWnd){
int i,j;
char word[50];
RECT rc;
HDC hDC;
HBRUSH hBrush;
HPEN hPen;
WCHAR prev_word[50];


hDC = GetDC(hWnd);
/*
GetClientRect(hWnd,&rc);
InvalidateRect(hWnd,&rc,FALSE);
*/
hPen = CreatePen(PS_NULL,0,0);
hBrush = CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hPen);

SelectObject(hDC,hBrush);
Rectangle(hDC,310,160,400,200);
DeleteObject(hPen);
DeleteObject(hBrush);

//GetStockObject(BLACK_PEN);
SelectObject(hDC,(HPEN)GetStockObject(BLACK_PEN));
for (i = 0;i < 8;i++){
for (j = 0;j < 8;j++){
hBrush = CreateSolidBrush(RGB(0,255,0));
SelectObject(hDC,hBrush);
Rectangle(hDC,20+34*i,20+34*j,55+34*i,55+34*j);
DeleteObject(hBrush);
switch(board[i+1][j+1]){
case 1:
hBrush = CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
Ellipse(hDC,22+34*i,22+34*j,53+34*i,53+34*j);
DeleteObject(hBrush);
break;
case 2:
hBrush = CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
Ellipse(hDC,22+34*i,22+34*j,53+34*i,53+34*j);
DeleteObject(hBrush);
break;
}
}
}
SetRect(&rc,310,100,400,150);
switch(act){
case 1:
DrawText(hDC,_T("Black turn"),-1,&rc,0);
break;
case 2:
DrawText(hDC,_T("White turn"),-1,&rc,0);
break;
}

sprintf_s(word,30,"black = %d\nwhite = %d",NUMSTONE(1),NUMSTONE(2));
mbstowcs_s(0,prev_word,30,word,_TRUNCATE);
SetRect(&rc,310,160,400,200);
DrawText(hDC,prev_word,-1,&rc,DT_WORDBREAK);
ReleaseDC(hWnd,hDC);
}


int Algo(int x,int y,HWND hWnd){
int locx,locy,i,j,flag;
for(i = 0;i < 8;i++){
if (x >= 20+34*i && x <= 55+34*i){
locx = i+1;
}
if (y >= 20+34*i && y <= 55+34*i){
locy = i+1;
}
}


if(board[locx][locy] != 0){
return -1;
}


if(locx >= 1 && locx <= 8 && locy >= 1 && locy <= 8){


/*置き石判定*/
flag = 0;
REV(flag,hWnd);
for (i = -1;i <= 1;i++){
for(j = -1;j <= 1;j++){
Check(locx,locy,i,j,&flag);
}
}
if(flag != 0){
REV(flag,hWnd);
board[locx][locy] = act;
if(act == 2){
rev_act = act;
rev_wait = wait;
wait = act;
act = 1;
} else {
rev_act = act;
rev_wait = wait;
wait = act;
act = 2;
}
}
}
return 0;
}


void Check(int x,int y,int i,int j,int *flag){
int k,num;
if(board[x+i][y+j] == wait){
num = 0;
while(1){
if(board[x+i][y+j] == wait){
num++;
} else if (board[x+i][y+j] == act){
for(k = 0;k < num;k++){
board[x-i*k][y-j*k] = act;
}
*flag = 1;
break;
} else if(board[x+i][y+j] == 8 || board[x+i][y+j] == 0){
break;
}
x += i;
y += j;
}
}
}


void REV(int flag,HWND hWnd){
int i,j;
if(flag == 0){
for(i = 0;i < 10;i++){
for(j = 0;j &t; 10;j++){
buf_board[i][j] = board[i][j];
}
}
} else if(flag == 1){
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
rev_board[i][j] = buf_board[i][j];
}
}
EnableWindow(GetDlgItem(hWnd,1000),TRUE);
} else if(flag == 2){
act = rev_act;
wait = rev_wait;
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
board[i][j] = rev_board[i][j];
}
}
EnableWindow(GetDlgItem(hWnd,1000),FALSE);
}
}

int NUMSTONE(int color){
int i,j,num;
num = 0;
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
if(board[i][j] == color){
num++;
}
}
}
return num;
}