忍者ブログ
RoboCup Junior Japan Rescue Kanto OB

             2005~2013
明日は工場見学。

学校8時集合だそうです。

遅刻した子は置いてけぼり・・・

置いてけぼり食らうと、恐怖の課題地獄なんだとか。コワイコワイ。

明日は何人地獄を見ることになるでしょうかね(笑)


今日の記事は、またまたNBCについてです。

とりあえず一番基礎的なライントレースができるようになった。という話を以前しました。

まぁこのライントレースプログラムについてちょっと書いていこうと思います。

今回、作製したプログラムは、ほんっとにライントレースの基本だけを行ったプログラムです。

センサーの数は3つ。ギャップや直角などの対応プログラムは一切入っていません。

っていうかそんなもの入れる気力がありません。


というのも・・・プログラムがこんなに長くなってしまうんです(笑)

#include "NXTDefs.h"
 
//sensor set
#define kurosiro1 450
#define kurosiro2 450
#define kurosiro3 380
#define sirogin1 630
#define sirogin2 670
#define sirogin3 630
 
//vl set
dseg segment
    motorA byte  100
    motorC byte  100
    curveA byte  100
    curveC byte  100
    sensor_1vl sword
    sensor_2vl sword
    sensor_3vl sword
dseg ends
 
 
//fnc set
subroutine FRONT
OnFwd(OUT_A,motorA)
OnFwd(OUT_C,motorC)
return
ends
 
subroutine BACK
OnRev(OUT_A,motorA)
OnRev(OUT_C,motorC)
return
ends
 
subroutine RIGHT
OnFwd(OUT_A,curveA)
OnRev(OUT_C,curveC)
return
ends
 
subroutine LEFT
OnRev(OUT_A,curveA)
OnFwd(OUT_C,curveC)
return
ends
 
 
//main
 
thread main
dseg segment
 
dseg ends
 
 
SetSensorType(IN_1,IN_TYPE_REFLECTION)
SetSensorType(IN_2,IN_TYPE_REFLECTION)
SetSensorType(IN_3,IN_TYPE_REFLECTION)
 
Loop:
ReadSensor(IN_1,sensor_1vl)
sub sensor_1vl, kurosiro1,sensor_1vl
ReadSensor(IN_2,sensor_2vl)
sub sensor_2vl, kurosiro2,sensor_2vl
ReadSensor(IN_3,sensor_3vl)
sub sensor_3vl, kurosiro3,sensor_3vl
NumOut(1,LCD_LINE1,sensor_1vl)
NumOut(1,LCD_LINE2,sensor_2vl)
NumOut(1,LCD_LINE3,sensor_3vl)
 
call FRONT
 
brtst GT,Loop,sensor_2vl
 
brtst GT,curvel,sensor_1vl
brtst GT,curver,sensor_3vl
 
 
jmp Loop
  
curvel:
call LEFT
jmp Loop
 
curver:
call RIGHT
jmp Loop
  
 
endt


これは、只普通に右のセンサーが黒くなったら右回転、

左のセンサーが黒くなったら左回転というプログラムしか入っていません。

なので実質使っているセンサーは2つですね(笑)


ちゃんと楽してNXCと同じ関数を使用したのにこの長さって・・・(笑)

やっぱりNXCと比べると格段に難しくなっているのがわかります。

でも、関数はNXCと同じですし、そもそもどういった動きをするかはわかっている訳なので、

見れば、大体何がどうなっているのかはわかりますよね。NXCの経験者なら・・・。


まぁこの辺は簡単だからいいのですけど、例えば配列だったり、関数に引数を使ってみたり、戻り値・・・なんてことになると


途端に意味不明になります。(それがASMです(笑))

これで本当にレスキューのプログラムが書けるのか・・・とてつもなく不安です。


あ。このプログラムのファイル挙げときますね。

それではー。


(^・ω・)ノRadiumProduction in RoboCupJunior
やっぱりアセンブラだ・・・(汗)


Cだったら 

int x[10];

で定義できる筈の配列が大変なことに・・・

初期値の入力はCと同じようにできるのですが、

まず配列そのものの定義を

x byte[]

でやって、

そのあと要素の数を

arrinit x, 0, 9

で定義しないといけないみたいです。



しかも、配列とは変数とは違ってCのように普通に呼び出せないようになっていて、

Cでいう

i=x[0];



x[0]=i;

なんていう風な書き方できないみたいです。




それと同じようなことをしようと思ったら、

どうにも配列専用の命令を使わないといけないらしく

i=x[0];

の場合は

index i, x, 0 



x[0]=i;

の場合は

replace x, x, 0,i


としないといけないっぽいです。

これはめんどくさい・・・つまり配列でデータをやり取りするにはいちいちbuf変数に置換する必要があるわけですね。


あーぁ。やっぱASMかぁ(笑) 

まだ道のりは長いです・・・

(^・ω・)ノRadiumProduction in RoboCupJunior
今、NBC内で「Cでいう配列」を探すという作業に明け暮れています。

あるっぽいんだけど・・・使い方が微妙に謎。

Cと同じでいいのかなぁ。

(^・ω・)ノRadiumProduction in RoboCupJunior 

P.S頭逝った状態で適当な記事を投稿した訳です、が「今、明け暮れている」って日本語的にどうなんだろう。

因みにまだ使い方わかりませーん。
最近はマイコンサボってNXTで遊ぶようになりました。(若干PICに飽きたというところもあるのですが・・・)


という訳で今日はNBCで遊んでみました。

まずは単純にライントレースを・・・

と思ったら、意外とめんどくさい・・・

まだほとんどなんもやってないのでわからないんですが、さら見した感じだと、

C言語でいうif文的なにかは無論ないっぽいんですね。NBCならあると思ったのに・・・


あるのはジャンプと条件ジャンプだけ。うーん。やっぱりCとは違うんだなぁ。ASM寄りなのは間違いないですね。


という訳でプログラムもROBOLABNXCとは全然違う考え方で作らないといけません。だって分岐もループもないし・・・

あれですね。ROBOLABでいうと、イベントとジャンプの羅列みたいなプログラムになりますね。


ASMやった時も大分死にましたが、今回もすごくそんな感じの臭いがします。


でも僕が何で、NBCを使うようになったかというと、非常に大きい理由はこれです。

「プログラムの処理速度がNXCと比べて格段に早い」

同じBricxCCなのに・・・こっちのほうが10倍以上はやいです。センサーの読み込みも3倍以上早いですし・・・

まぁ元々NXCはそこまで処理の早い言語形態ではないですから・・・仕方ないですけど。


という訳で今後もしばらくはNBCを続けていこうと考えています。

でも、どうやらNBCI2Cのラインはできないっぽいので結局RobotCを使うことになるのかもなぁ・・・

RobotCの処理速度が馬鹿みたいに遅くない限りはRobotCを使うことになると思います。

うーん。手を出す言語が多すぎるのも困りものだなぁ・・・


(^・ω・)ノRadiumProduction in RoboCupJunior



今日、とりあえずNBCに触れてみたのですが、
 
なんだ・・・こりゃ・・・

#include "NXTDefs.h"
 
dseg segment
  UF byte
  pwr sbyte
  OM byte OUT_MODE_MOTORON+OUT_MODE_BRAKE
  RM byte OUT_REGMODE_IDLE
  RS byte OUT_RUNSTATE_RUNNING
dseg ends
 
  thread main
  set UF, UF_UPDATE_MODE 
  setout OUT_A, OutputMode, OM, RegMode, RM, RunState, RS, UpdateFlags, UF
  
   endless:
   set pwr, 100
   UpdateSpeed:
   set UF, UF_UPDATE_SPEED+UF_UPDATE_MODE
   setout OUT_A, Power, pwr, OutputMode, OM, UpdateFlags, UF
   jmp endless
   exit
   endt

只、モーターAを回転させようと思っただけなのに・・・

気が付いたらこんな長いプログラムが(笑)


・・・この先が不安すぎます><。




(^・ω・)ノRadiumProduction in RoboCupJunior

P.s:どうやら普通にOnFwd(OUT_A,100);でも動くっぽいです(笑)
カレンダー
02 2024/03 04
S M T W T F S
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
最新CM
[05/09 ONE RoboCuper]
[05/07 HDD ほしいよー]
[04/21 ブラック3辛]
[12/26 bols-blue]
[06/08 ONE RoboCuper]
かうんた
カウンター カウンター
らじぷろ目次
らじぷろ検索機
プロフィール
HN:
Luz
性別:
男性

PR

忍者ブログ 2007-2021,Powered by Radium-Luz-Lα+-Rescatar in RadiumProduction [PR]


Related Posts Plugin for WordPress, Blogger...