ホーム » 2011 (ページ 6)

年別アーカイブ: 2011

2025年5月
 123
45678910
11121314151617
18192021222324
25262728293031

検索・リンク

職場の事務用ファイル共…(11/09)

  • 11/09 職場の事務用ファイル共有サーバ、ディレクトリの内容を見るだけでも激遅。見たいファイル見つける度に30秒近く待たされる。どうもディレクトリアクセスが遅いようなので、探したいフォルダごっそりコピー。 #fnct

この記事は、twitter の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。


LEGOエネルギーセットで太陽光追尾

機械工業会さんとの連携事業の講習会用に、 LEGOのエネルギーセットで作った、ソーラートラッカーのプログラムを書いてみた。

3番ポートにつないだEnergy Meter から、電圧Vinを読み込む。 太陽電池に明るいライトをあてると、2[V]〜5[V]ぐらいの電圧が観測できる。 しかしデータは0.5秒ぐらい毎に、±1[V]ぐらいは簡単に変動するため、 この電圧だけで太陽光追尾をさせると、方向が安定しないことが予想される。 このため、平滑化が重要となる。 LEGO MindStormsのデータハブを使って、平滑化の処理を記述したのが、下図。 単純移動平均では、過去の測定値を保存する必要があるので、 指数移動平均を用いる。

移動平均によりある程度安定した電圧を元に、 太陽光の方向に動かすために、現在方向、+10度、-10度の3方向で電圧を測定し、 最も電圧の高い方向に向くようにしたプログラムを以下に示す。


このプログラムでは、横方向の追尾だけなので、同様の処理を縦方向にも 記述すればいい。 ただ、LEGOエネルギーセットの太陽電池の発生電圧は、予想外に不安定であり、 追尾には難しい。

ある程度ずれた方向から、ライトの方向を追尾させる実験をしてみたが、 時間と共に あさっての方向に動いてしまう場合があった。 原因は、ライト方向からずれて発電量が足りない状態で、 蓄電池への充電が不十分だと、エネルギーメーターが一時的にリセットされる場合がある。 さらにリセット復帰後の一瞬は測定電圧が高めに観測されるようである。 このため、発電量が少ない状態で、さらに発電量が減る方向を向いた時に、 リセット&復帰で一時的に高い電圧で測定されると、その発電量の少ない方向に 向いてしまう。

太陽電池の電圧は、負荷の影響で変動もするため、太陽電池の電圧情報を元に 太陽光追尾を行うのは困難と思われる。 よってLEGOのこの実験環境でも、LEGOの光センサーの光量に応じて方向を変えるように すべきであろう。

専攻科・生産システム実験で…

専攻科の後期実験で、昨日から4週実験の担当。 例年、組み込み系の制御実験として、 H8/Arduinoで歯みがきロボコンネタをやっていた。 でも、最近は Arduino を使うと、ライントレースなんか簡単すぎなので、 通信やら加速度センサーを使ってもらうネタとした。

車体は、オムニホイールの既存車体を使ってもらい、 1台のArduinoで制御。 一方、リモコン側ということで加速度センサーをハンドルにみたてて 操作してもらう。 車体側Arduinoと、リモコン側Arduinoは、 有線のシリアルケーブルで接続する。 加速度センサーに応じた速度情報を一方的に車体側に送るだけだと、 通信プログラムが単純すぎるので、 車体側のセンサー(ライントレース用のセンサーとか、自分でつける距離センサーとか…) の情報をリモコン側に送り返し、 車体を見なくてもある程度、操作できるようにすること。

ということで、昨日の1日目は、Arduinoと基本的な入出力の説明。 第1週2日目の今日は、 加速度センサーと信号の平滑化の説明と、 シリアル信号の説明などを行う。 今回の実験ではあまり関係ないかもしれないけど、 パリティチェック・CRCチェック・チェックサムなどの説明も行う。 また簡単な通信プロトコルを決める必要もあることから、 途中のデータが欠落した場合のデッドロック状態や、 スタートヘッダの必要性も説明する。

OSと割り込み

先週のジョブ・プロセス・スレッドの説明に引き続き、 プロセスの実行方式の説明から、割り込みなどを中心とした説明を行う。

プロセスの実行方式には、ジョブ方式やTSS方式、リアルタイム方式があることを 説明し、マルチタスクでのメモリ量による処理速度の違いを説明する。 例えとして、主記憶4GBのマシンで、メモリ使用量1GBのプロセスA,B,Cを実行する。 この場合、プロセスが入力待ちなどがあると動かせないので、ジョブ方式では あらかじめ入力データは随時よみこめるようにする必要がある。 ジョブ方式では、1つが終わったら次の処理を起動するので、問題がない。 しかしTSS方式では、みかけ上並行処理をしているようにプロセスの切り替えを するので、若干遅くなる。 しかし、主記憶が2GBという状態では、TSS方式では3つめのCの処理では、 メモリが不足し仮想メモリ機能が必要となる。これに伴い一時停止中の プロセスを補助記憶に保存したり復活させたりという処理が加わるため、 とたんに処理速度が低下する。

こういったOSの処理では、割り込み機能が重要となる。 割り込みとは処理速度の違うものの間での受け渡し時に重要。 割り込みでは、信号が入ったら割り込み許可を確認後、 処理番地(PC)保存・CPU内情報(レジスタ)を行なってから、割り込み処理に切り替わる。 割り込み処理が終了すれば、CPU情報・処理番地情報を元に戻し、本来の処理にもどる。 割り込みには、入出力割り込み・タイマ割り込み・エラー割り込み、ソフトウェア割り込みなどがある。

マルチタスク機能は、タイムスライス時間後にタイマ割り込みが発生するように設定することで実現する。 タイマ割り込み時には、OSが実行待ち行列からプロセスを選んで処理を切り替える。 中断したプロセスは待ち行列の最後尾にいれられ、順次処理が繰り返されることになる。 入出力処理が行われる場合は、プロセスは入出力待ち状態となり、スケジューラは 待ち行列より処理を選んで実行する。時間が経過して入出割り込みが発生すると、 OSが入出力待ちのプロセスを実行状態に戻す。

現時点なら中学お受験で…(11/06)

この記事は、twitter の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。


2011年11月6日(第241回)

  • オープンキャンパスの様子 交流コーナー
  • 高専の授業料について

共用体と列挙型

構造体のビットフィールドの説明の次として、共用体・列挙型・typedefなどの説明を行う。

共用体

共用体は、複数のデータの中でどれか1つを保存するような処理で使われる。 基本的に構造体の宣言とほぼ同じだけれど、 各要素のメモリ領域を個別に確保するのが構造体。 共用体は各要素の領域は1つで記憶領域が共用される。

union Data {
char  string[ 10 ] ;
int  number ;
double real ;
} ;
union Data x ;
strcpy( x.string , "hoge" ) ;
x.number = 123 ;
x.real = 2.3456 ;  // 記憶場所は1つだけ

今回は実用っぽいネタということで、以下の処理を示す。 共用体だけでは、中身が解らないので一緒にデータを区別する情報を保存することで、 配列に違うデータを保存する方法。

struct Data {
int type ;
union {  // さりげなく無名共用体...
char string[ 10 ] ;
int  number ;
double real ;
} ;
} ;
void setString( struct Data* p , char s[] ) {
p->type = 1 ;
strcpy( p->string , s ) ;
} ;
void setInteger( struct Data* p , int x ) {
p->type = 2 ;
p->number = x ;
} ;
void setReal( struct Data* p , double x ) {
p->type = 2 ;
p->real = x ;
} ;
void print( struct Data* p ) {
switch( p->type ) {
case 1 : printf( "%s" , p->string ) ; break ;
case 2 : printf( "%d" , p->number ) ; break ;
case 3 : printf( "%f" , p->real ) ; break ;
}
}
void main() {
struct Data table[ 3 ] ;
setString( &table[ 0 ] , "abc" ) ;
setInteger( &table[ 1 ] , 1234 ) ;
setReal( &table[ 2 ] , 23.45 ) ;
for( int i = 0 ; i < 3 ; i++ )
print( &table[ i ] ) ;
}

列挙型

プログラムで、例えば1週間の情報の日月火という曜日を扱う場合、 以下のような記述となることも多い。

#define SUN 0
#define MON 1
:
#define SAT 6
int week ;
for(...) {
if ( week == MON ) {
//月曜日の処理...
}
}

この時、#defineの羅列で数字を規則的に連番を振るのは面倒となる。 これをやってくれるのが列挙型。

enum WEEK {
SUN , MON , TUE , ... , SAT
} ;
enum WEEK week ;
for( ... ) {
if ( week == MON ) {
// 月曜日の処理...
}
}

列挙型変数には、列挙型の要素名の定数以外は代入できないし、 コンパイラによってはswitch文で対応要素の処理が未記載だったら 警告してくれるなど、間違った記載をできないようなチェックが便利。

typedef…

typedefは、自分で定義した型に新しい名前をつける機能。 通常は以下のように使う。

typedef unsigned int  uint_t ;
uint_t x ; // xは符号なしint型となる。
typedef struct DATA {
char name[ 10 ] ;
int  age ;
} Data ;
Data saitoh ;
strcpy( saitoh.name , "saitoh" ) ;
saitoh.age = 47 ;
typedef enum WEEK {
SUN , MON , ... SAT
} Week ;
Week wday ;
wday = MON ;

OSの基本と資源管理

先週で説明の終えていなかった、機械語の生成の話の説明の後、OSについての具体的な説明を行う。

機械語の生成

先週末にコンパイラ方式とインタプリタ方式の話の次段階として、 機械語などはCPUやOSに依存する補足をして、 Javaにおける仮想マシンを用いたバイトコードインタプリタなどの説明を行う。

プログラムの機械語の実行の説明として、コンパイラによる中間コードの生成や、 リンカによる中間コードとライブラリの結合の話を行う。 また、リンクにも静的リンクと動的リンクがあり、 通常はプログラムの中にライブラリが埋め込まれる静的リンクがとられる。 しかしマルチタスクでは、メモリ中にライブラリの機械語が複数でてくると、 メモリのムダになるので、OSにライブラリを展開してもらう動的リンク方式があることを説明。動的リンクを使えば、ライブラリの修正アップデートも簡単といった利点を説明。

OSとは、

OSとは、基本ソフトウェアとよばれ、 (a)制御プログラム(狭義のOS,カーネル)と、(b)開発環境(言語プロセッサ等)、(c)ユーティリティ(CUI/GUI等)から成ることを説明する。

OSの機能として、周辺装置とのデータのやり取り・制御方法を共通化することで、 プログラム作成の労力削減が可能となる。 もう一つの重要な機能は、不用意なことをできなくすることによるデータの保護であり、 ハードを壊すような制御などを実行させない。 他のプロセスの動きを阻害するようなメモリアクセスをさせない。 他人のファイルを権限もないのに読めるようなことをさせない。…といった保護が重要。

これらの共通化や保護の対象となるものを資源(resource)と呼ぶ。 たとえば、キーボードやハードディスクといった周辺機器(物理的なリソース)、 計算に必要となる主記憶(メモリ)、CPUを利用する時間(抽象的なリソース)などがある。

プログラムの動く単位として、利用者視点でトータルの1つのサービスを提供する処理は、 ジョブと呼ばれる。これに対し、CPUが他の処理から保護する仕事の単位はプロセスと呼ばれ、ジョブは複数のプロセスで実現される場合もある。 一方、並行処理では複数のプロセスで実行するのが普通だが、共通のメモリ情報を使いながら動く処理は記述が面倒となる。 これに対しスレッドは、並列する複数の処理で同一メモリを利用できるものを指す。 複数のスレッドで1つのプロセスを構成する。

2011年10月30日(第240回)

  • オープンキャンパスの様子 環境都市工学科
  • 高専ロボコン東海北陸地区大会について

個人的なのもあるとはい…(10/26)

  • 10/26 個人的なのもあるとはいえ、LinuxサーバUpdateするのに、10台も触らないといけないって、なぜぇ〜 #fnct
  • 10/26 iPadで使える電子回路シミュレータを試す(3) http://tinyurl.com/3jh4e8e #fnct
  • 10/25 以前の卒研で使っていた、USB-IOの改良版 USB-IO2.0 なんて商品が出ている。 http://tinyurl.com/3w9h5lo #fnct だけど、ArduinoのUSBシリアル経由で ポート触るほうが、自由度高いかな…
  • 10/24 Bluetooth内蔵 Arduino。USBコネクタ無しだけど、BTシリアルで… http://tinyurl.com/3pqk95n #fnct

この記事は、twitter の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。


システム

最新の投稿(電子情報)

アーカイブ

カテゴリー