実験の最近のブログ記事

コンパイラを作るための技術の基礎を学んでもらうために、 簡単な関数電卓プログラム作成を課題とする。 基本は、printf( "%d" , eval( "1+2*3") ) みたいな計算プログラムを作成する。

計算式から、計算処理を行う場合、演算子の優先順位を正しく処理できることが求められる。 一般的には、計算の機械語を生成する場合、データを準備して計算という方法であり、 逆ポーランド記法変換が行われる。 たとえば、"1+2*3"は、"1,2,+,3,*" といった表記に改められ、変換後の式は スタックを用いて、「値はpush,演算子はpop,pop,計算して,push」という 単純なルールで処理すれば、計算を行うことができる。

字句解析と構文解析

このような、計算式の処理を実行する場合、"1","+","2","*","3"という 字句に切り分ける処理を、字句解析という。 この結果から、"式*式"なら掛け算、"式+式"は足し算といった、 前後の字句の組合せから、式から構文木を生成する処理は、構文解析という。 コンパイラであれば、この後、最適化、コード生成などが行われる。

C言語であれば、コンパイル前後には以下の処理が行われる。

  • プリプロセッサ処理
    ↓(#の無いCコード)
  • コンパイル処理
    ↓(中間コード)
  • リンク処理 ← ライブラリ
  • 機械語

字句解析と正規表現

字句(トークン)の切り出しでは、正規表現なども用いられる。

簡単な正規表現
 . 任意の文字
 * 直前の0回以上の繰り返し
 + 直前の1回以上の繰り返し
 [0-9a-z] カッコの中の文字のいずれか - は範囲を示す。
 (a|b|c) 丸カッコの|区切りのうちのどれか。
 (例) C言語の変数の正規表現 [a-zA-Z_][a-zA-Z0-9_]*

構文解析の方法

構文解析では、構文を状態遷移として考え、この式の後にくる可能性のある状態は? という考えで解析を行う。 このような構文は、一般的にバッカス記法(BNF)などで表現されることが多い。 また、簡単な構文解析であれば、

  • 再帰下降パーサ
  • LR構文解析法

などが用いられる。

再帰下降パーサ

簡単な再帰下降パーサの演習として、1桁の数字と+,*演算子の処理プログラムを 考える。

  加減,乗除の式のバッカス記法(BNF)
  exp_加減 ::= exp_乗除 '+' exp_乗除
            | exp_乗除 '-' exp_乗除
            | exp_乗除
            ;
  exp_乗除 ::= DIGIT '*' exp_乗除
            | DIGIT '/' exp_乗除
            | DIGIT
            ;
  DIGIT   ::= [0-9]
            ; 

練習として、上に示す再帰下降パーサに、 (1) "(",")" を含めた場合の、BNF 記法を考え、 (2) 式を読みやすくする空白を処理できるように してみよう。

インターネットでは、様々な情報が提供されているが、 これらの情報を効率よく見つけ出すには、労力を要する。 このため、インターネット上の情報サイトでは、 RSS(Rich Site Summary) と呼ばれる XML をベースとした、サイトの概要情報を提供している。 これらの RSS の情報は、 フィードリーダ というソフトを使うことで、 そのタイトル・概要をシンプルに表示してくれることから、 読者が興味のある記事を見つけやすくなる。

今回は、これらの RSS 形式のデータを活用するために、 自分の作成した情報の RSS データを作成したり、 一般に公開されている RSS フィードを読み込み解析し、 2次利用できるようにしたり、自分たちの使うインターネットと連動できる プログラム開発を、文字列処理の得意なプログラム言語である、Perl や PHP を用いて 作成することを目指す。

RSSと解析ライブラリ

RSSには、その発展の歴史の中から、少しづつ書式を変えながら発展してきた。 最初は、RDF と呼ばれる形式であったが、RSS 2.0 に発展する中で、 XML 形式による書式となった。 この他にも、RSS の問題点を改良した Atom 形式なども提案されている。

RSSのデータ形式は様々で、全ての形式に対応したプログラム作成は本来難しい。 しかし Perl や PHP では、便利なパーサ・ライブラリがあるので、RSSの情報の中から、 希望する情報だけを簡単に抽出することが可能となっている。

Perl で RSS 形式のデータを扱うために、今回は "XML::FeedPP"モジュールを使用する。 このライブラリは、RSS/RDF/Atom など様々な フィード形式に対応している。 XML::FeedPP の解説サイトには、データを入力・出力するなどの手続きの例が、 いくつか記載されているので、これらのサンプルプログラムを元にプログラムを作成せよ。

#!/usr/bin/perl

# 使用するモジュールを選ぶ
use XML::TreePP ; # use 文は C言語の #include みたいなもの。
use XML::FeedPP ;

# 日本語の文字コード変換モジュール
use Jcode ;

# 読み込むフィード
my $source = 'http://use.perl.org/index.rss'; # my は局所変数宣言

# RSSデータを解析し読み込ませる
my $feed = XML::FeedPP->new( $source );

# 記事全体の情報を表示
my $title = $feed->title() ;

# Jcode->new( "文字列" ) に対する変換コード(以下が利用可)
#   ->utf8 , ->unicode , ->jis , ->sjis , ->euc 
print "Title: ", Jcode->new( $title )->utf8 , "\n";
print "Date: ", $feed->pubDate(), "\n";

# 個別の記事の情報を表示
foreach my $item ( $feed->get_item() ) {
    print "URL: ", $item->link(), "\n";
    my $title = $item->title() ;
    print "Title: ", Jcode->new( $title )->utf8, "\n";
}
# foreach文は、配列要素すべてに対する処理ループを実行
# foreach $要素 ( @配列 ) { ... }

実験方法

プログラムの実験にあたり、 ファイルの編集にはファイル共有機能を使用し、 プログラムの実行にはターミナルソフト(TeraTerm)を使用する。

最初に、実験端末に TeraTerm がインストールしてなければ、 このページ先より入手し、インストールを行うこと。

サーバに接続し、プログラムを実行するには、TeraTermPro.exe を実行し、 Host:「tsaitoh.ei.fukui-nct.ac.jp /KR=UTF-8 /KT=UTF-8」, Service:SSH で接続し、 別途指定された ユーザ名 , パスワード を利用し、Login せよ。

ファイルを編集する際には、Windows 端末のファイル共有にて、 「¥¥tsaitoh.ei.fukui-nct.ac.jp¥ユーザ名」にてアクセスし、 login 画面が出たら、ユーザ名とパスワードを入力せよ。 Windows のエディタで、ファイルを編集し保存する際には、 「文字コード: UTF-8 , 行末コード: nl」を指定すること。

(( 前述の feed.pl を実行する場合 ))
$ perl feed.pl

最初の課題

上記のプログラムを動作させ、得られる結果などを確認せよ。 RSSフィードの http://..../...xml などは、Firefox などのブラウザであれば、 わかりやすいように表示をしてくれる。さらに、"ページソースを表示"などを実行すれば、 元々の XML 形式のデータを見ることもできる。

まずは、プログラムの内容などを確認したうえで、 インターネット上に掲載されている RSS フィードにどのようなものがあるか調べ、 これらの情報をどのように活用したら便利かアイデアを検討せよ。

1208030929_707x512.jpg

明日はオープンキャンパス。 展示用に、色々と面白いものができてきた。 まずは小松先生の労作、LEDマトリックスのシンプルなテト◯ス・ゲーム。

電子情報棟では、学生実験などでのノートパソコンのネットワーク接続手段 として、FERECのルータを活用している。 アクセスポイントのSSID,パスワードを知っている利用者であれば、 WiFi接続後に、Web認証が要求されるので、 自分の学籍番号ベースのIDとパスワードを入力すれば、 ネットワークが利用できるようになる。

ただし、ネットワーク接続によるトラブルを避けるために、 http,httpsしか利用できないようにFirewall機能を設定してある。 特別の登録IDを設定すれば、Firewallの条件を変えることもできる。

IEEE.802.11n対応ハイパワーAPに更新

これまでは、主要な実験室にはハイパワーのアクセスポイント、 実験的に導入していた部屋には、小型のアクセスポイントを設置していた。 元々の機材は11a.b.gに対応していたが、フロアや実験室の場所によっては、 電波が弱く接続が困難であった。

今回、業務用の11n対応のハイパワーアクセスポイントに変更し、 電波条件もかなり改善し、電子情報棟のすべての教室・大きな実験室では、 十分な電波強度でアクセスポイントに接続が可能となった。

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

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

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

今日から、専攻科1年の4週実験が始まった。 Arduinoを使って制御をテーマに実験をおこなってもらう。 実験の概要説明の後、歯みがきロボコンで使ったオムニホイールやら、 興味があったら触ってもらおうと購入しておいた、3軸加速度センサーの 説明を行い、自分たちのテーマを決めてもらった。 簡単なArduinoの実験後の相談で、オムニホイールの車体制御に決まったようだ。

3軸加速度センサーの実験

学生さんが3軸加速度センサーを使わないことが決まったので、 プロコンなどでも使ってもらうために、こちらで実験してみる。 購入しておいたセンサーは、MMA7260Q搭載三軸加速度センサモジュール。 データシートを見ると、Vcc=3.3[V]となっているので、以下のように配線した。

(( MMA7260Q ))
Vcc : 3.3[V]
GND : GND(0V)
  X : A0
  Y : A1
  Z : A2
GS1 : GND // 1.5Gまでの測定の場合
GS2 : GND
*SLP: 3.3[V] // SleepさせないのでHIGH

動作確認のためのプログラムで、以下を記述。

void setup() {
  Serial.begin( 9600 ) ;
}

int x = 0 , y = 0 , z = 0 ;
void loop() {
  x = analogRead( 0 ) ;
  y = analogRead( 1 ) ;
  z = analogRead( 2 ) ;

  Serial.print( x ) ; Serial.print( "," ) ;
  Serial.print( y ) ; Serial.print( "," ) ;
  Serial.println( z ) ;
}

このプログラムを動かすと、加速度なしの状態で330〜350ぐらいの範囲で 激しく変動している。1G加速度方向では500ぐらいの値が出ている。 このままではノイズが激しいし、オフセットを引いてノイズ除去を行った。 指数移動平均 の手法(α=1/16)を使用。

int base = 335 ; // 中心値
int x = 0 , y = 0 , z = 0 ;

void loop() {
  x = (15 * x  +  (analogRead( 0 ) - base) )  /  16 ;
  y = (15 * y  +  (analogRead( 1 ) - base) )  /  16 ;
  z = (15 * z  +  (analogRead( 2 ) - base) )  /  16 ;

  Serial.print( x ) ; Serial.print( "," ) ;
  Serial.print( y ) ; Serial.print( "," ) ;
  Serial.println( z ) ;
}

この状態で、平置きするとZ軸方向で165の値が得られた。 様々な方向にブレッドボードを移動して、方向に応じた加速度の変化も確認できた。
# それにしてもノイズ変動が大きいなぁ...

Processing + Firmata

試しに、Processing でデータを収集しながら、表示するプログラムを手抜きで 書いてみた。

Arduinoには、"SimpleAnalogFirmata"を書き込んでおく。
[開く]-[Firmata]-[SimpleAnalogFirmata] で Compile & Writeしておく。

(( Processing ))
import processing.serial.* ;
import cc.arduino.* ;

Arduino arduino ;

color black = color( 0 , 0 , 0 ) ;
color white = color( 255 , 255 , 255 ) ;

void setup() {
  size( 400 , 400 ) ;
  println( Arduino.list() ) ;
  arduino = new Arduino( this , Arduino.list()[ 0 ] , 57600 ) ;
}

int m = 335 ;
int x = 0 , y = 0 , z = 0 ;

void draw() {
  background( white ) ;
  stroke( black ) ;
  
  x = arduino.analogRead( 0 ) - m ;
  y = arduino.analogRead( 1 ) - m ;
  z = arduino.analogRead( 2 ) - m ;

  //println( x + "," + y + "," + z ) ;

  int xx = int( x * sqrt(3.0)/2.0 - y * sqrt(3.0)/2.0 ) ;
  int yy = int( - x * 0.5 - y * 0.5 + z) ;
  line( 200 , 200 , 200 + xx , 200 - yy ) ;
}

もっとサクサク動くかと思ったが、カクカクだなぁ。 draw() だと、リアルタイムに描画処理の中から呼び出されないかな... Processingを使い込んでいないからなぁ...

払下げPCのセッティング

情報処理センターの払下げPCのセッティングを行う。 払下げ時のパスワードを変更し、 ウィルス対策ソフトを入れ、Microsoft Updateとなった。 最後に、BIOSのNetworkBootを停止させる。 でも、実験で必要そうなソフトを追加インストールしないといけないし、 Sambaのドメインに登録して、使えるようにしたいしな...

10台まとめてセッティングだけど、きびきびと動かないマシンじゃ、 待ち時間が長い。んで、複数台並行作業なんだけど、どのマシンはどこまでやったのか... という状態で、作業のヌケがありそう...

専攻科1年の実験の補足説明の時間があったので、 Arduinoの制御実験の結果を受け、制御用のサンプリングデータの数学的話をする。 モータ制御で、速度値を積算すれば速度の積分で距離になる話や、 加速度センサーの値を積分し速度、さらに積分で距離という話。 こういった2重積分でセンサー誤差の蓄積による問題点を解説する。

また、サンプリングデータの平滑化として、単純移動平均や指数移動平均などの話をする。 積分の逆の話として、データの直前値との差が微分といった話と、 幅広く説明した。 さすがに専攻科生だけあって、データのノイズ対策について質問したら、 フーリエ変換してフィルタリング...といった話も出てきたが、 簡単な計算でも何ができるのかという点で、興味を持って聞いてくれたみたい。

超音波センサー壊れてる

専攻科の実験の第3クール目の担当ということで、 オムニホイール車体の制御をArduino Nano で制御をテーマとした。 ただ、同じプログラムばかりでは面白くないだろうと、 昨年度創造工学演習のものづくり用に購入していた、超音波センサーPINGを 使って、身近なものを追いかける車体を作ってもらおうと考えた。

んで、Arduinoの使い方は、簡単に理解してもらえて、PINGを試すが、動かない。 最小配線にして、低電圧源にして動かすけど、ダメ。 3個買ってあったので、交換試験をするけど3個とも動かない。 5000円ほどしたんだけどなぁ...×3で15,000円。 昨年の創造工学の実験中にすでに壊れていたとしか思えない...
# ちょっと涙目...

毎度ながら、面白そうなものを売り出してくれる学研さんだが、 次号は4ビットマイコンだそうな。 Data メモリ 8word, プログラムメモリ 40word 搭載で、 電子オルガンやらモールス電文発生などのサンプルも掲載となっている。

内容によっては、2年、3年の計算機アーキテクチャネタには十分だろうし、 実験にも使えると予想される。 ということで、個人的に購入するだろうな...

追記:関連授業&実験の先生に宣伝しているうちに、思わず予約購入ボタンを押しちゃった....楽しみ...

2016年11月

    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      

アーカイブ

Google

このアーカイブについて

このページには、過去に書かれたブログ記事のうち実験カテゴリに属しているものが含まれています。

前のカテゴリはプログラミングコンテストです。

次のカテゴリは研究です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。