itsukichang

フロントエンドが得意なエンジニア.ダーツと旅行とギターが好き

研究の手順を考える

  • 興味あることの中でネタを考える.アイデア出し

  • (とりあえずプロトタイプを作ってみる テンションあがる)

  • 関連してそうな既存研究を探しまくる

  • 論文を読む ←←←←←←←←←←

↓               ↑

  • A4一枚くらいで要約を書く→→→

  • 読みながらアイデアを膨らませていく

  • 完全に新規なものならGo. 似たようなのあるなら保留 or 既存研究達が達成していない課題問題を見いだしてみる.今その界隈で何が達成できていないか.何が問題か.何が必要とされているか.

  • その中で自分が作るものでは何が達成できそうか,どんな知見が得られそうか考える

  • 活路が見えたらGo (見えそうにないなら保留.はじめにもどる)

bad version?

  • 興味あることの中でネタを考える.アイデア出し

  • つくる

  • 完成する

  • 論文の事考えだす

  • 自分が作ったものが論文になるように無理矢理大義名分考えだす

  • ここで初めて既存論文のチェックをする

  • 既存研究達の未達成部分を自分が作ったものに無理矢理こじづける

  • しかし,そもそも問題提起の時点で曖昧なので論文書き出すと導入の部分で躓く.

  • 自分が作った理由にできそうな問題が書いてある論文を引用しだすが,色々矛盾が発生する

うーん

ここまでじゃないけど今自分が若干badルートを走ってる気がすのデス.
上の2つで何が大きく違うかって,研究着手する時点で,論文の「はじめに」的な部分での研究背景を書けるかどうかかな.
それがただの開発と研究の違いなのかなと思った.
とりあえず既存の関連論文,文献を読み漁るのは絶対.
イデアを過信しすぎないこと.捨てる勇気を持つ.
が,とりあえずプロトタイプぐらいなものは作ってみたくなるのよね.


手順中に「似てるもの」って書いたけど,もの自体がそもそも似てたらoutで,扱う問題は同じだけどアプローチが違ったらokというのが個人的な線引きなんだけど,どうなんだろう.

こんなことを

この時期に考えいる時点で死が見える^o^
20歳の時点で一回間違えることによって気づくことができたんだと考えたらいいのかもしれない(ポジティブ).

AVR入門 -I/O出力編

前回まででAVRを使ったプログラミングをするための準備ができました.
ので,今回は実際に回路を組んでプログラムを書いて,実践的にAVRを学んでいきましょう.

LED点滅

マイコンでのHelloWorldといえば,LEDの点滅,通称Lチカですね.
点灯→delay→消灯→delay→点灯…を繰り返すシンプルなアルゴリズムです.
これをC言語で書いてAVR上で実現してみましょう.

回路

まず回路を組みましょう.
回路はAVRマイコンにライタとLED,抵抗を繋げるだけです.
マイコンとライタを正しく繋ぎ,PD0のピンにLEDと抵抗(220ohm程度)を繋いでGNDに持っていきましょう.

プログラム1

とりあえずコードを載せます.解説は後ほど.

#include <avr/io.h>
#include <util/delay.h>

int main() {
	
	DDRD = 0b00000001; //ポートの設定
	
	while(1) { 				//無限loop
		PORTD = 0b00000001; //点灯
		_delay_ms(1000);    //1秒待つ
		PORTD = 0b00000000; //消灯
		_delay_ms(1000);    //1秒待つ
	}
	
	return 0;
}

これをmain.cに書き,ビルドしてAVRマイコンに書き込みましょう.
やり方は前回までの記事を参考してください.
LEDが1秒毎に点滅しはじめましたか?

重要ワード

ここで今回のLED点滅に重要な部分を見てみましょう.

  • DDRD

なにやら大文字のワードに01の数字が代入されていますね.
まず簡単そうな右辺から見てみましょう.0bというのはC言語で2進数を表記するときの接頭語です.
ほかにも0xをつけると16進数,0をつけると8進数を表す事が出来ます.基本ですね.
つまりこの0b00000001というものは2進数8桁,つまり8bit=1byte文のデータであり,1ビット目が1になっています.

さて,左辺のDDRDというのは,AVRのDポート(PD0,PD1,PD2….PD7)の入出力設定を行う部分です.
AVRではひとつのアルファベット(A,B,C,Dのいずれか)に8つのポート(例:PA0~PA7の8つ) が用意されており,各ポートの設定はDDRDのビットに対応します.1ビット目が0, 2ビット目が1, 3ビット目が2…といった具合です.
(例:ポートDだと, PD0の入出力設定がDDRDの1ビット目,PD1の入出力設定がDDRDの2ビット目…)

つまりここで行っている,

DDRD = 0b00000001; 

という文はポートDの0番,PD0を1に設定し,その他(PD1~PD7)を0に設定しているということなのです.
この設定の数値(0 or 1)は0ならばそのポートが入力モード,1ならばそのポートが出力モードに設定されます.
arduinoで言う

pinMode(0,INPUT);
pinMode(1,OUTPUT);

と同じことをしています.

まとめると,DDRDはポートDの入出力設定を行うもの(レジスタといいます)で,今回はPD0を出力設定にしている.という訳です.これは他のポートも同じで,DDRA,DDRB,DDRCなどを設定すると,それぞれ対応するポート(PA@,PB@,PC@ @は0~7)の入出力設定ができます.

  • PORTD

無限ループの中にPORTDというキーワードがありますね.
これは各ポートの出力値を決めるものです.考え方は先ほどのDDRDと同じで,各ビットが各ポートに対応しています.
この値が1ならばHigh,0ならばLowの出力を行います.
ここで行っている

PORTD = 0b00000001;

というものはポートDの0番(PD0)の出力をHighにするということなんですね.
(ちなみにポートが入力モードであった場合,1に設定すると内部プルアップモードになります.詳しくはまた後日.)
すると下の全部0の部分ももう分かりますよね.PD1~7はもちろん,PD0もLowになります.

arduinoで言う

digitalWrite(0, HIGH);
digitalWrite(0, LOW);

と同じなんですね.

  • _delay_ms

これは関数名から推測できると思いますが,指定したミリ秒delayが生じる関数です.
2行目で読み込んでいる,に定義されています.

arduinoで言う

delay(1000);

と同じですね.

まとめ

一見ちょっと小難しそうに見えますが,分かってしまえばarduinoと同じことをしているのが分かりましたね.
基本的にデジタルにIOを使う時は,ポートの設定・入出力の管理を行うだけなので本質は同じです.
さて,このコードでもちゃんとLEDが1秒毎に点滅するのですが,もうちょっとマイコンっぽく書いてみましょう.

プログラム2

AVRのようなマイコン使ってプログラムを書く時はPCと違ってメモリに気を使わなくてはなりません(大きさが全然違いますから…)
またCPUもPCに比べると非常に低速なので,処理はできるだけスマートに書く必要があります.
つまり省メモリ・高速が基本な訳です.
今回のような簡単なプログラムではそこまで気を使う必要はありませんが,今後大規模な開発にあたることを想定して,ちょっと書き方を覚えておきましょう.

  • ビット演算

省メモリ・高速化の基本は,まずビット演算を使用することです.
ビット演算にはAND OR XOR シフト 反転などがあります.
詳しく書くと切りがないので,このビット演算の細かいところはググってください.わかりやすいサイトがたくさんあります.

さて,この使うといい事があるらしいビット演算を使って,先ほどのプログラムをちょっと変えてみましょう.

#include <avr/io.h>
#include <util/delay.h>

int main() {
	
	DDRD = 0b00000001; //ポートの設定
	
	while(1) { 				//無限loop
		PORTD ^= 0b00000001; //点滅
		_delay_ms(1000);    //1秒待つ
	}
	
	return 0;
}

ループの中身が変わっていますね.見ていきましょう.

PORTDのイコールの前に^という記号がついています.
これはXOR演算子です.(XORは計算の対象となる両方のビットが異なるときに1を返す.両方同じなら0を返す)
はじめPORTDは0b00000000となっています.ここに0b00000001をXOR演算すると,1ビット目が異なっているので1ビット目は1になります(点灯).
次にもう一度回って来たとき,PORTDは0b00000001となっており,ここに0b00000001をXOR演算すると,1ビット目が同じになっているので1ビット目は0になります(消灯).
つまりループする度にPORTDの1ビット目が変化するということです.
これでコードを2行減らすことができましたね.

まとめ

今回はAVRのIOポートを使った基本的な出力を扱いました.
ポートの設定,HIGH, LOWの指定.といった非常に基本的なことですが,これでとりあえず7セグLEDなどを制御することができますよね.
次回は入力の扱い方を見ていきましょう.

AVR入門 -Mac環境構築

前回Windowsでの環境構築方法(AVR入門 -Win環境構築 - いつきの技的日記)を書きましたが,Arduinoユーザの方にはMac使いの方も多いはず.
わざわざbootcampとかしないで,MacでAVR開発したい!っていう人向けの記事です.
※ちなみに僕の環境は,OS10.6でXcodeはVer3です. Xcode4の場合はあまり変わらない気もしますが,新しいMacを手に入れ次第追記しますね><

必要なもの

今回は単純にAVRだけに注目して書きますね.

  • ハードウェア
  • AVRマイコン: 今回はATtiny2313で.
  • AVRライタ: 純正のAVRISPmk2が使えます.しかもUSB接続するだけです.普通に使えます.
  • 部品と電源

ハードウェアはwindowsの場合と同じものが使えます.便利ですね.

  • ソフトウェア
  • Xcode: なんとXcodeが使えます!便利!
  • CrossPack for AVR: 今回の肝心要です.MacでAVR-GCC(コンパイラ)やavrdude(書き込みツール)を使えるようにしてくれる便利な環境です.

CrossPack - A Development Environment for Atmel’s AVR Microcontrollers

とりあえずCrossPack for AVRをダウンロード&インストールしましょう.

準備

テンプレートの用意

CrossPack for AVRのインストールが完了したら,usr/local/ に[CrossPack-AVR]と[CrossPack-AVR-(date)]というディレクトリが出来ています.
このディレクトリ内にXcodeでAVRプログラミングを行うためのテンプレートがあります.
それをXcodeのProject Templatesにコピーしましょう.
以下にリンクファイルを作るコマンドを記述しておきます.この通り実行すればokです.

$ cd /Developer/Library/Xcode/Project\ Templates/
$ mkdir AVR
$ cd AVR
$ ln -s /usr/local/CrossPack-AVR/etc/templates/TemplateProject Firmware
Xcode起動

上記コマンドが無事実行できたら,Xcodeを起動してみましょう.
新規プロジェクトのテンプレート選択画面に先ほど作成した[AVR]という項目があるので,それを選択しましょう.
プロジェクトが作成されたら,ファイル構成は以下のようになっていると思います.

main.cにコードを書きます.
もうひとつのMakefileにはコンパイルの手順や対象ファイルの設定などが記述されていますが,とりあえず必要な変更点があります.
Makefileの20行目ほどのところに,DEVICE, CLOCK, PROGRAMMER, OBJECTS, FUSES という記述があります.
これはそれぞれ,使用するAVRマイコンの種類,クロックの種類,AVRライタ(プログラマ)の種類...などを設定するものです.ひとつずつ見ていきましょう.

makefileの設定
  • DEVICE

今回はATtiny2313を使用しているので,DEVICE = attiny2313 に変更しましょう.

  • CLOCK

動作クロックです.ATtiny2313は内部クロックが8MHzなので,8000000に設定しましょう. CLOCK = 8000000 です.

  • PROGRAMMER

今回は純正のAVRISPmk2を使っているので, PROGRAMMER = -c avrispmkII -P usb と記述しましょう.

  • OBJECTS

これは一連のコンパイルの流れで使用するオブジェクトファイルの指定です.
ここはとりあえずデフォルトのままでokです. OBJECTS = main.o

  • FUSES

fuseはAVRのチップの動作を設定するパラメータのことです.
書き込みの際にはプログラムデータとは別にこのfuseの設定を行う必要があります.
fuseにはビットによってそれぞれ様々な役割があるのですが,慣れないうちはデフォルトの設定を推奨します.(このfuseの設定を誤るとAVRへの書き込みができなくなったりするので...)
そのデフォルトのfuse設定は以下のサイトで調べる事ができます.
Engbedded AVR Fuse Calculator
まずAVRの種類を選びます.

selectボタンを押せば,とりあえずデフォルトのfuse設定が画面下部に出るのでそれをチェックしましょう.

画像の赤で囲まれた部分が今回必要になる設定です.
そのままコピペして,FUSES = -U lfuse:w:0xe4:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m と変更しましょう.

  • まとめ

ここまでの変更でmakefileの20行目付近は以下のようになっていると思います.

DEVICE = attiny2313
CLOCK = 8000000
PROGRAMMER = -c avrispmkII -P usb
OBJECTS = main.o
FUSES = -U lfuse:w:0xe4:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m

これはattiny2313を対象にavrispmk2を使った時の設定ですので,マイコンやライタを変更した場合はその都度編集しましょう.
CLOCKはマイコンのデータシートで,FUSESは先ほどのサイトで確認することができます.

ビルド

main.cに適当なコードを書き,とりあえずビルドしてみましょう.ビルドできなかった場合はコードやmakefileを見直してみてください.
ビルドが成功する事が確認できたら,xcodeの[ターゲット]にある[firmware]をダブルクリックしてターゲットの設定を行いましょう.
カスタムビルドコマンドの引数にを一旦削除し,flash と書き,再びビルドしてみましょう.
AVRに対してプログラムが書き込まれるはずです.

失敗したら

main.cのコードを見直す.
makefileを見直す.
マイコンとライタの接続が正しいか見直す(前回の記事の「ATtiny2313とAVRISPmk2の仕様」を参考).
Xcodeのバージョン...?
OSのバージョン...?

AVR入門 -Win環境構築

最近AVRはじめたので,備忘録的に環境構築から簡単なプログラムをいくつか組むまでの流れを書いてみます.
なかなかまとまった情報が少ないAVRですので,これから始める人の手助けになれば幸いです><
Arduinoと比べてどうなっているか,ということをできるだけ書きます.

必要なもの

Arduinoの場合
  • ハードウェア
    • Arduino本体 (Uno, duemilanove, miniなど): 約3千円
    • usbケーブル: 本体に付属なので0円
    • 電子部品色々: ledとかボタンとかで初期投資500円~1000円
    • 電源: Unoなら7V~12Vのものを用意しましょう.: 1000円くらい

という感じで約4000円くらいで十分に遊べる環境が整います.
逆に言うと,一つのプロダクト内にArduinoを埋め込んでいくと単価が4000円以上になってしまいます.

  • ソフトウェア

インストールするだけ!

AVRの場合
  • ハードウェア

ICです.Arduinoの上にも載っている足がいっぱいついた部品です.
種類がいくつもあります.代表的なものにATTiny2313, ATMega88, ATMega168, ATMega328などがあります.
それぞれスペックや値段が違います.価格はここにあげたものだと100円から300円までくらい.

    • 電子部品色々: これはArduinoと同様.必要なものをそろえましょう.
    • AVRライタ:

プログラマとも呼ばれます.AVRマイコンにプログラムを転送(書き込み)するための機器です.PCとの接続にUSBを使うものとCOMポートを使うものがあります.純正品のAVRISPmk2をはじめ,様々なメーカーから多様なライタが販売されています.また自作することもできます.しかし,はじめは純正品がおすすめです.1000円~3000円くらいで売っています.純正品は秋月電子で3000円.

ライタと部品だけ始めに買ってしまえば,あとはプロダクトの数だけAVRマイコンを増やせばいいのでArduinoと比べた場合のコストは一目瞭然ですね.ただその代わりArduinoより最初の導入や言語の扱い方が難しいのでしっかり勉強する必要があります.

  • ソフトウェア

AVRはアセンブラC言語でプログラミングが可能です.いきなりアセンブラに挑戦するのはちょっと難易度が高いので,はじめはArduinoで書いたプログラムに近いC言語をお勧めします.
C言語で書いたプログラムをコンパイルするために,コンパイラの導入が必要です.
いくつか種類がありますが,WinAVRがお勧めです.WinAVR

コンパイラさえ入れてしまえば,メモ帳でプログラムを書いてコマンドラインからコンパイルすることもできますが,コードの管理や扱いやすさから統合開発環境の使用をお勧めします.AVRマイコンを製造しているAtmel社が提供しているAVR Studioという環境があるのでこれを使いましょう.
AVRStudio
現在(2013/1)のバージョンは6で,名称もAVR StduioからAtmel Studioに変わっています.
Atmel StduioになってからMicrosoft.NET Frameworkを使用しているので結構重いです.
(僕は古いネットブックを使っているので,AVRStudio4を使っています.)

    • 書き込みソフト:

統合開発環境でプログラムを書き,無事コンパイルが完了すると.hexファイルというものが書き出されます.
このhexファイルをライタを使ってAVRマイコンに送る事で初めてプログラムが動作します.
AVRマイコンにhexファイルを書き込むために,純正のライタ(AVRISPmk2)を使っていればAVRStudioを使って開発・書き込みの両方ができるのですが,自作したものや各メーカーが独自に作っているものだと別途書き込みソフトが必要になる場合があります.
その書き込みソフトにavrdudeというものがあるのですが,これはCUIなものではじめての人にはとっつきにくいので,GUI版が開発されています.
GUI版は,千秋ゼミというサイトで,多くの環境とプログラマに対応したもので,現在も日々開発が続けられているものです.
この環境を使ってみたい方はリンク先のサイトを熟読してツールを入手してください.
また,ただツールをDLするだけではなく自分の環境(PCのスペックなど)を沿えた動作報告をすると良いでしょう;)
http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/

今回使うもの

ここまででとりあえず必要なものをあげましたが,選択肢が多いのでとりあえず初心者向けに絞って解説します.

とりあえずATTiny2313を買いましょう.

  • AVRライタ

純正のAVRISPmk2を買いましょう.

  • ソフトウェア

WinAVRとAVR Studio(Atmel Stduio)をインストールしましょう.

WinAVR

WinAVR
特に躓くところはないです.

AVR Studio

AVRStudio
こちらも特に問題なくインストールできるはずです.

開発手順

  • 1. ライタのドライバインストール

AVRISPmk2を手に入れたら,まずPCに差し込みましょう.
するとドライバのインストール云々の画面がでるので,自動にインストールを選択して完了するまで待ちましょう.

  • 2. AVRStudio起動

ドライバがインストールできたら,AVRStudioを起動しましょう.

  • 3. プロジェクト作成

新しいプロジェクトを作りましょう.ダイアログで[new project]を選択(もしくはツールバーのproject->new project)し,project typeを[AVR GCC],project nameに適当な名前(helloAvrとか)を入力し,とりあえず[finish]を押しましょう.

  • 4. 使用ライタ,AVRの設定


画像の(1)の部分のボタンを押して,使用するライタの設定を行います.
PlatformからAVRISP mk2を選択し,PortでUSBを選択し,[Connect]を押しましょう.
するとAVRの設定画面(画像の(2)の部分のボタンを押した時に出るものと同じもの)が表示されるので,[Main]タブでDeviceをATtiny2313に.
Device選択の下部にある[Programming Mode and Target Settings]をISP modeに.ISP Frequencyを[Settings]ボタンを押して125.0kHzに変更しましょう(この周波数は書き込む時の書き込み機側のデータ転送クロックです.一般的にターゲットとなるAVRのクロックの1/4以下に設定するそうです.).

  • 5. プログラム記述

好きなコードを書きましょう

ツールバーのBuildから[Build]を選択.コードに間違いが無ければ,画面下部のウィンドウに「Build Succeeded」と表示されます.
これで無事に.hexファイルが書き出されました.

ここまでソフトウェア的な設定を行っていましたが,実際にhexファイルをAVRマイコンに書き込むためには,AVRライタと物理的に接続させなければなりません.
まず,今回使用しているATtiny2313とAVRISPmk2の仕様を図に示します.

ATtiny2313にはPA,PB,PDというようなポートと,VCC, GNDといったポートがあるのが分かります(実際には各ポートにさらにいくつかの役割があるのですが,ここでは分かりやすいようにとりあえず必要なものだけを記述してあります.詳細は,データシート).
PA,PB,PDなどのポートはI/Oに使用します.VCC, GNDはその名の通りAVRマイコンの電源として使います.
ちなみにATtiny2313の動作電圧は1.8V~5.5Vです.必要な電源を用意しましょう.ボタン電池CR2032(3V)などでも十分動きます.
またPA2,PD0,PD1,PB7,PB6,PB5にはそれぞれ()で別の役割も書いてあります.こちらに注目しながら,AVRISPmk2の方も見てみましょう.
VCC,MOSI,GND,MISO,SCK,RESETという端子になっています.
VCC,GNDは電源として,MISO,MOSIはそれぞれデータの入出力に使われます.
また,SCKはクロック信号, RESETはリセット信号です.
これらの端子をAVRマイコンの対応した所に接続します.
つまり,AVRマイコンのVCC端子にAVRISPmk2のVCC, GNDにGND, MOSIにMOSI, MISOにMISO, RESETにRESET, USCKにSCKを繋ぎます.
(MISO,MOSIがクロスになっていない点に注意.単純に同じ名称の部分に繋ぎます.)

  • 8. 書き込み

これで最後です.
使用ライタの,AVRの設定であった画像の(2)の部分のボタン(AVRと書かれたICの形をしたボタン)を押してProgramタブを選びます.
画面中部のFlashという部分の[Program]ボタンをクリックすれば,書き込みが行われます.

何事も問題なければ,AVRにプログラムが転送され,あなたが書いたコードの通りの振る舞いをはじめます!

まとめ

以上がAVRマイコンを扱うための手順です.
とりあえず,有名なマイコン(ATtiny2313,ATmegaシリーズなど)と純正のライタ(AVRISPmk2)を買って,WinAVRとAVR Studioを使っておけば間違いないです.特に躓くところもないでしょう.

必要なものリスト

テスト

上記の手順を試してみるために,以下のサンプルプログラムを書き込んでみましょう.
回路はPD0から抵抗とLEDをつないでGNDに接続するだけです.

#incldue <avr/io.h>

int main() {
	DDRD = 0b00000001;
	while(1) {
		PORTD = 0b00000001;
	}
	
	return 0;
}

LEDが点灯すれば成功です!

次回

プログラムの書き方,簡単なプログラム(LED点滅,ボタン)などを試してみましょう.
[Arduinoをはじめよう]に沿って色々なプログラムを解説できるといいなぁ.