LEGO 8043 インプレッション2
LEGO 8043 の記事をなぜか編集しても反映されないので新エントリー
http://www.nicovideo.jp/watch/sm13971072
http://www.youtube.com/watch?v=RH9dq1GFa1I
にトラックよじよじが出来るようにした8294をうpした。
メモリリーク解消?
メモリリークについて乱読してみて、C言語ではWHILE文よりもGOTO文のほうが利用するスタックの量が少ないとしているページがあったのでためしてみたらはい正解。カウント210とかも超えて新記録です。
NXCふざけるなよ!!!!!\(^o^)/フザケンナ
while(true)文なんて機械操作の基本だろ!!!!!\(^o^)/キホンダイジ
変数5くらいしか無い制御文でとまるなや!!!!/(^o^)\ナンテコッタイ
全部GOTO文で組めというのか?NXCに対する信頼が大幅に低下。あーあ。
#define GYRO_Offset 590
task main()
{
int status = 0;
int x = 0;
int syuturyokukakudo = 0;
int genzaikakudo = 90;
SetSensorHTGyro(S4);
int pow =0;
goto ERROR;
ERROR:
status=SensorRaw(IN_4);
NumOut(60,LCD_LINE3,status);
genzaikakudo=genzaikakudo + (status-GYRO_Offset)/10;//100msごとの数値に直す。
syuturyokukakudo = 90 - genzaikakudo;
NumOut(60,LCD_LINE4,genzaikakudo);
NumOut(60,LCD_LINE5,syuturyokukakudo);
RotateMotorEx(OUT_AC,30,-syuturyokukakudo,0,false,false);
x = x + 1;
NumOut(60,LCD_LINE6,x);
Wait(100);
goto ERROR;
}
memory leak対策
メモリリークが起こっていると仮定して、
グローバル変数を使わないとか変数をダイエットしても劇的には改善せず。
一行ごとの計算項目数を減らしてみたり、INT変数を割ったときに端数が出ないように工夫してみたが
まるでダメ。sensorからの取得をSensor(S4)でやってみても逆に止まりやすくなるなど全く不明。
**********************************
#define GYRO_Offset 590
task main()
{
int status = 0;
int x = 0;
int syuturyokukakudo = 0;
int genzaikakudo = 90;
SetSensorHTGyro(S4);
int pow =0;
while(true){
status=SensorRaw(IN_4);
NumOut(60,LCD_LINE3,status);
genzaikakudo=genzaikakudo + (status-GYRO_Offset)/2;//100msごとの数値に直す。
syuturyokukakudo = 90 - genzaikakudo;
NumOut(60,LCD_LINE4,genzaikakudo);
NumOut(60,LCD_LINE5,syuturyokukakudo);
RotateMotorEx(OUT_AC,30,-syuturyokukakudo,0,false,false);
x = x + 1;
NumOut(60,LCD_LINE6,x);
Wait(500);
}
}
倒立振子バグ対策。
バグ対策をするためにそもそのバグっているのかを確認。
カウンターを設けて処理を一回回すごとにカウント1するようにした。
うんバグっている。
何もしなくても70買い目の処理くらいでバグるし、
ひどいときは3回目の処理つまり0.3秒くらいでバグる。
処理が複雑すぎるわけで無し、単純に変数を使い過ぎててメモリーエラーを起こしているのか?
当然日本語で書かれた文章がなく、暗礁に乗り上げる。
日本のNXC環境は貧弱すぎ。
以下が使えるか?
でもこれはフリーなメモリーの数を戻り値にしているだけのようだが・・・。
9.159 ex_FreeMemory.nxc 1598
9.159 ex_FreeMemory.nxc
This is an example of how to use the FreeMemory function. x = FreeMemory();
***************************************************************
#define GYRO_Offset 590
int status = 0;
int x = 0;
float P = 1;
float kp = 0;
float D = 0;
float kd = 0 ;
int syuturyokukakudo = 0;
int genzaikakudo = 90;
task main()
{
SetSensorHTGyro(S4);
int pow =0;
while(true){
status=SensorRaw(IN_4);
NumOut(60,LCD_LINE3,status);
genzaikakudo=genzaikakudo + (status-GYRO_Offset)/10;//100msごとの数値に直す。
syuturyokukakudo = 90 - genzaikakudo;
NumOut(60,LCD_LINE4,genzaikakudo);
NumOut(60,LCD_LINE5,syuturyokukakudo);
RotateMotorEx(OUT_AC,30,-syuturyokukakudo,0,false,false);
x = x + 1;
NumOut(60,LCD_LINE6,x);
Wait(100);
}
}
倒立振子2
全然ダメ。ぴーぴー行って止まる。
#define GYRO_Offset 590
int status = 0;
int x = 0;
float P = 1;
float kp = 0;
float D = 0;
float kd = 0 ;
int syuturyokukakudo = 0;
int genzaikakudo = 90;
task main()
{
SetSensorHTGyro(S4);
int pow =0;
while(true){
status=SensorRaw(IN_4);
NumOut(60,LCD_LINE3,status);
genzaikakudo=genzaikakudo + (status-GYRO_Offset)/10;//100msごとの数値に直す。
syuturyokukakudo = 90 - genzaikakudo;
NumOut(60,LCD_LINE4,genzaikakudo);
RotateMotorEx(OUT_AC,20,syuturyokukakudo,0,false,false);
Wait(100);
}
}
倒立振子へ戻って
#define GYRO_Offset 590
int status = 0;
int x = 0;
float P = 1;
float kp = 0;
float D = 0;
float kd = 0;
int kakudo = 0;
int furuikakudo = 0;
int genzaikakudo =90;
int furuikakudo =0;
task main()
{
SetSensorHTGyro(S4);
int pow =0;
while(true){
if(ButtonPressed(BTNLEFT, false)){
P = P + 0.1 ;
}
if(ButtonPressed(BTNRIGHT, false)){
kp = kp + 0.1 ;
}
status=SensorRaw(IN_4);
NumOut(60,LCD_LINE3,status);
kakudo= (status-GYRO_Offset)/10;//100msごとの数値に直す。
P=(kakudo)*kp;
D=(kakudo-furuikakudo)*kd;
pow = P + D;
NumOut(60,LCD_LINE4,pow);
RotateMotorEx(OUT_AC,20,pow,0,false,false);
Wait(100);
furuikakudo=kakudo;
genzaikakudo(90)+kakkudo
POW=genzaikakudo-kakudo
}
}