OSとはハードウェアの抽象化を行うプログラムのことである

OSの本質を考える上で、抽象化という概念をイメージすると理解しやすいように思う。

抽象化とは、内部のことをとやかく言わないで、外界とのインターフェースを通じて対称とやりとりをする仕組みをつくることと言える。


数学の関数もこれとまったく同じ構造といえる。

この数式は、xに具体的な値を入力すると、関数が実装している具体的な手続きにもとづいて(この手続きは遮蔽されていてもよい)、yが出力されてくるということを意味している。

コンピュータシステムにおいても、抽象化の概念は大変重要だ。
Operating Systemはハードディスクなどのハードウェアとアプリケーションソフトウェアとの間に入って、ハードウェアを仮想化している。
このようにOSがハードウェアを抽象化することのメリットは、ハードウェアに対しての具体的な操作をOSが一手に引き受けることで、アプリケーションは共通のシステム・コールという入力を使用すればよくなるからである。OSが無い場合のことを考える。
OSが無い場合、アプリケーションがハードウェアを利用する場合、ハードウェアを使用するための方法を具体的に実装する必要が出てくる。先ほどのようにハードウェアとの間にOSが存在し、共通の規格であるシステム・コールを発行しさせえすればよかったのとは大違いである。

この話を発展させると、「インターフェースがあるところには抽象化がある」と言えるのではないだろうか。なにもOSだけの話ではない。流通システムを例にとると、お店(小売業者)にとって、流通システムとは生産者との間のインターフェースであり、各地に点在する生産者からダイレクトに買い付けるよりも問屋に注文した方が、細かい連絡や事務手続きが省けて、かつ大量注文が可能である。しかし、そのかわり流通システムを介すると、そこでお金が発生する。それは当然の事である。

OSも流通業者と考えれば、コストが発生するのは当たり前である。この場合のコストとは、お金ではなく、CPUへの負荷である。OSが細かいハードウェアの制御を一手に引き受けてくれるので、OS自体がCPUに負荷をかけることは避けられないのである。エアコンなどの家電製品に組み込まれるプログラムは、組み込みプログラムといってOSを利用せず、直接ハードウェアを制御していることが多い。この利点は、OSを動かすコストを回避できる点にある。OSを使用するかしないかは利用できる資源によってケースバイケースと言える。


以上をまとめると、OSはハードウェアとアプリケーションの位置して、ハードウェアを抽象化する。そして、アプリケーションに共通の規格であるシステムを提供する事で、アプリケーションがハードウェアを容易に制御できるようにするプログラムのことをいうのである。

(注)図中の矢印は一方行であったが、逆方向のやり取りがあってもかまわない。

Day23 ルータのポート解放を行い、サーバーを外部に公開(びびりなのですぐにポートを閉じたが。。)

WAN側から特定のポートでアクセスがあったとき、LAN側の特定のIPアドレスにつなぐようにルータの設定をすることができる。
私のbuffalo airstationでは以下の通りである。



普段、raspberry piをインターネットに接続させず、家の中のLANだけで遊んでいるときは以下の様な環境になっている。ルーターも含めて、LAN内のすべてのデバイスにはプライベートIPアドレス(192.168.11で始まる番号)が割り当てられている。


WANとLANの関係を考慮すると以下のようになる。ルーターがプライベートとグローバルのIPアドレスを同時に持っていて、LANとWANの仲立ちをしていることに注意。



ssh用にポートを解放してssh接続したときのイメージ図。手元にあるiphoneなどのスマートフォンで4G回線などの外部回線で外から、raspberry piにアクセスする時のイメージ。

ルーターはポート番号ごとにアクセスの制限をかけていることを認識する事が一番大事である。


【参考文献】
画像は以下のサイトから頂いた。
素材のデータベース
Digipot



Day22 SSHの公開鍵認証設定の続き

Day21では、鍵の作成をMacでおこなってハマってしまった。そこで見方を変えて、Raspberry Piで鍵を作成して、秘密鍵をMacに渡すという方針を取った。

#piにて
#鍵作成
ssh-keygen -t rsa

これで、~/.ssh/以下に、公開鍵(id_rsa.pub)と秘密鍵(id_rsa)が追加される。
#まずは、公開鍵の内容を~/.ssh/authorized_keysに追記
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#追記が終われば公開鍵は消去してよい
rm ~/.ssh/id_rsa.pub

#次に、~/.sshのディレクトリに対するアクセス権を700、~/.ssh/authorized_keysのアクセス権を600に変更する。これにより、他のユーザからはこれらのディレクトリやファイルを閲覧できなくなる。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

最後にMacの~/.ssh/に秘密鍵'(~/.ssh/id_rsa)を移動する。
ログアウトしてMacに戻ってから、

#-Pのpを大文字にしないとハマる

#Macのホームディレクトリ(~)にサーバー(pi)の~/.ssh/をダウンロード
scp -P hogenumber pi@192.168.11.7:~/.ssh/authorized_keys ~/



あとは、piにログインして、鍵の後始末と、パスワードによるログインを禁止するだけ。
#再度piにログイン
ssh -p hogenumber pi@192.168.11.7

#追記が終われば秘密鍵も消去してよい
rm ~/.ssh/id_rsa

#パスワードによるログインを禁止する
sudo vim /etc/ssh/sshd_config

52 PasswordAuthentication yes
52 PasswordAuthentication no
に変更

#sshサーバを再起動
sudo /etc/init.d_ssh restart


あとは接続のテストだけ。
勿体ぶるようだが、確実に鍵の効果を検証するため、一度~/.ssh/id_rsaをホームディレクトリに入れておいて、エラーになるかを見てみる。デフォルトで~/.sshの鍵を探すようになっているので、この方法をとった。

あらかじめ、鍵のアクセス権は600に変更しておく
sudo chmod 600 ~/id_rsa

#id_rsaを指定せずにログインを試みる
ssh -p hogenumber pi@192.168.11.7
Permission denied (publickey).

それでは、鍵を指定しみる。
ssh -p hogenumber -i ~/id_rsa pi@192.168.11.7

すると、以下のウィンドウが開くので、piで鍵を作成するときに入力したパスワードを入力する。
すると、ログインに成功する。
Last login: Mon Mar 31 08:59:43 2014 from 192.168.11.2

pi@raspberrypi ~ $ 
exit


Macの~/.ssh以下にid_rsaをおいておけば、いちいち指定しなくても自動で読みにいく。そこで、~/id_rsaを~/.ssh/に移動させる。
mv ~/id_rsa ~/.ssh

ログインのテスト


ssh -p hogenumber  pi@192.168.11.7
Last login: Mon Mar 31 08:59:43 2014 from 192.168.11.2

pi@raspberrypi ~ $ 


うまくいった。



iphoneのiOS用SSHクライアントであるpromptからパスワードログインを試みるとはじかれることを確認してみる。


ばっちり。

promptでssh接続したいときは、Macの時と同様、サーバーで鍵を作成し、公開鍵の内容をサーバーの~/.ssh/authorized_keysへ追記、秘密鍵をpromptに登録すればよい。

piで作った秘密鍵をMacに落としておいて、
itunesを開いて、AppsのPromptを選択肢、id_rsaをAddで追加すればよい。
あとは、iphone上でpromptを開いて、ipアドレス、ポート番号、ユーザ名、パスワード(この場合、鍵作成時のパスワード)を入力して、最後に鍵マークをクリックして先ほどアップロードしたファイルを選択すればok。
あとはお好みで、他のパソコンにも鍵を入れておいても良い。
これでサーバーのセキュリティに関しての、一通りの作業は終了した。


###############################################################

最後にひとつ議論しておく。
鍵の作成を今回のようにサーバーで行うか、クライアントで行うかというのは実はどちらでもよいそうだ。

以下のサイトが詳しい。
秘密鍵と公開鍵は、サーバー側(ssh接続される側)で作ろうがクライアント側(sshコマンドを打って接続しに行く側)で作ろうが、どっちでもいいそうな。

通常は、クライアントで作成して、サーバーに公開鍵を送信する事が多いようだが、大量に鍵を作成するときは面倒なので、サーバー側で作成して、クライアントに配布するという形式を取る事もあるそうだ。






Day21 sshのルートログインの禁止とSSHの公開鍵認証設定

ここまでの作業
Day19:rootとpiのパスワードを設定
Day20:sshのポート番号の変更

今回は、sshのルートログインの禁止とSSHの公開鍵認証設定を行います。

#####sshのルートログインの禁止#####
sudo vim /etc/ssh/sshd_config

27 PermitRootLogin yes

27 PermitRootLogin no
に変更

#sshサーバの再起動

vim /etc/ssh/sshd_config

これでrootログインはできなくなった。



#####SSHの公開鍵認証設定####

日経Linux『誰でもできる! Raspberry Piで楽しもう』日経BP社 2013のp62 - 66を参考にした。

まずは、手元のMacで鍵を生成する。
kappa$ ssh-keygen -t rsa

デフォルトのままでEnterを2回押すと、~/.ssh/に公開鍵(id_rsa.pub)と秘密鍵(id_rsa)が生成する。
kappa$ ls ~/.ssh

id_rsa      id_rsa.pub  known_hosts


これから、この公開鍵(id_rsa.pub)をサーバーの自分がいつもログインするpiユーザの支配下に送り込み、そして、piの~/.ssh/authorized_keysに公開鍵の内容を追記する。

#サーバーに公開鍵を送信(piユーザーのホームディレクトリ)
kappa$ scp -P hogenumber id_rsa.pub pi@192.168.11.7:~/ 



ここからはRasPiにログインしてからの操作。
#~/.ssh/の作成し、公開鍵を移動させる。
mkdir ~/.ssh
mv ~/id_r~/.ssh/


#公開鍵の内容を追記(authorized_keysファイルがなければ新規作成される)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#####パスワードログインを無くして、いよいよ公開鍵認証のみでログインできる状態にする####
sudo vim /etc/ssh/sshd_config

 51 #PasswordAuthentication yes
 52 PasswordAuthentication no

これでok.
#サーバー再起動
 sudo /etc/init.d/ssh restart
あとは、Macからログインしてみるだけだ!
と思ったらハマった。
以前サーバー構築した時も同様のところでハマったのでピンと来た。
そこで、raspiはモニターにつないでスタンドアロンの環境で以下の作業をして、いろいろ考えてみる事にした。
(続く)


Day20 sshポートの変更

sshのデフォルトポートは22番だが、このまま世界に公開すると、たくさんの悪い人から狙われます。そこで、49152–65535番の間は動的/プライベートポート番号と言われるように、こちらの自由に割り当てることができる。そこで、この間のどれかをsshの接続用に割り当てることにする。

cd /etc/ssh

#バックアップ作成
sudo cp sshd_config sshd_config_backup

#sshサーバーの設定ファイル(sshd_conf)の編集
sudo vim sshd_config


 4 # What ports, IPs and protocols we listen for

 5 Port 22

# What ports, IPs and protocols we listen for

 5 Port hogenumber(49152–65535番)

に書き換える。

#sshサーバーの再起動
sudo /etc/init.d/ssh restart

#ログアウトして動作チェック
exit


# 開発機(mac)から、デフォルトポート(22)でssh接続を試みる
kappa$ ssh pi@192.168.11.7
ssh: connect to host 192.168.11.7 port 22: Connection refused

# -p 設定したポート番号 のオプションを付けてで接続してみる。
kappa$ ssh -p hogenumber(49152–65535番 pi@192.168.11.7 
pi@192.168.11.7's password: 

うまくいった。

Day19 Raspberry Piのセキュリティ設定

今回から、Raspberry Piを自宅サーバーとして外部に公開することを意識した作業を開始する。

まずは、Raspberry Piのセキュリティ設定をしなくてはならない。セキュリティといっても、内容は多岐にわたるが、まず行うべきなのがユーザアカウントに関するものである。rootのパスワードはないわ、piユーザのパスワードはみんな知っているわ、sshでパスワードの総当たりに脆弱だわと、問題が多く、デフォルトではとても外部に公開はできません。そこで、最低限抑えておきたいところを設定してきます。

まず、ネットで情報を収集。

#このサイトはとてもまとまっている


#SSH接続に関しての設定

#sshの設定ファイルのセキュリティに関しての細かい設定方法
IT備忘録


############## rootのパスワード設定 #################

#rootのパスワード設定
sudo passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

############## piのパスワード設定 #################

sudo passwd pi
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

##############piユーザのsudo使用時に常にパスワードが必要にする###############
piユーザはデフォルトではsudoコマンドでパスワードが必要とされていません。これは危険なので変更します。まずは、visudoで使用するエディタをvim(3番)に変更します

#visudoのエディタ変更
sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode

#visudoでsudoの設定を変更
sudo visudo
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL                                       

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
pi ALL=(ALL) NOPASSWD: ALL              #ここをコメントアウトして、新たに設定を付け足す。

こんな感じ
#pi ALL=(ALL) NOPASSWD: ALL
pi ALL=(ALL) PASSWD: ALL

:wq

#テスト
$ sudo su

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
[sudo] password for pi: 

これでうまくいった。


組み込み自作OS-Macにて-Step1-その5

##############「Hello World」のソースコード(1.2.1 - 1.2.9)###################
ここhttp://kozos.jp/kozos/osbook/osbook_03/01/bootload/に、本書第1章で作成するプログラムのソースコードがおいてある。今回は、環境構築のテストが目的なので、そのまま流用させてもらう。

#クロス開発のソースコードは~/12step/src/01/bootloadに置く
cd ~/12step/src/
mkdir 01
cd 01
mkdir bootload
cd bootload


#ここにソースコードをダウンロードしてくる
#main()関数 main.c(1.2.2)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/main.c

#スタート・アップ startup.s(1.2.3)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/startup.s

#割り込みベクタの定義 vector.c(1.2.4)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/vector.c

#各種ライブラリ関数のヘッダ・ファイル lib.h(1.2.5)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/lib.h

#各種ライブラリ関数の本体 lib.c(1.2.5)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/lib.c

#シリアル・デバイス・ドライバのヘッダ・ファイル serial.h(1.2.6)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/serial.h

#シリアル・デバイス・ドライバの本体 serial.c(1.2.6)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/serial.c

#様々な型の定義 defines.h(1.2.7)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/defines.h

#リンカ・スクリプト ld.scr(1.2.8)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/ld.scr

#ビルド方法 Makefile(1.2.9)
curl -O http://kozos.jp/kozos/osbook/osbook_03/01/bootload/Makefile


#################Makefileの編集(1.2.9)#########################
本書では、各種ライブラリを/usr/localにインストールしているが、今回の私の環境ではこれらをすべて、~/12step/toolsにおいている。そこでMakefileを編集して、~/12step/toolsに読みに行くようにする。
#以下の合計3カ所をコメントアウトして書き換えた
vim Makefile










ドライバに関しては、USBシリアルケーブルをMacに接続した後、以下のコマンドを実行することで調べることができる。
ls /dev/tty.*
で調べたものを書いた。私の環境は、/dev/tty.usbserial-FTB3L7SJであった。

#####################ビルド(1.3)########################
#/Users/kappa/12step/src/bootloadにてmakeを実行
make

#うまくいったら、kzloadという実行形式ファイルが生成しているはず。。
ls
Makefile   kzload     ld.scr     lib.h      main.c     serial.c   serial.o   startup.s  vector.o
defines.h  kzload.elf lib.c      lib.o      main.o     serial.h   startup.o  vector.c

できた!

kzloadというファイルは、ELF形式というフォーマットで、h8writeでそのままH8/3069Fマイコン・ボードのフラッシュROMに書き込むことはできないそうだ。h8writeでフラッシュROMに書き込めるのは、モトローラSレコード・フォーマットという形式のファイルだそうだ。
ELF形式に変換するには、objcopyというコマンドが必要であるらしい。そして、binutilsをインストールした時に、objcopyも一緒にビルドされているとのこと。なんて、便利なんだろう。
それでは、以下のコマンドでフォーマット変換を行う。
~/12step/tools/h8300-elf/bin/objcopy -O srec kzload kzload.mot

ls
Makefile   kzload     kzload.mot lib.c      lib.o      main.o     serial.h   startup.o  vector.c
defines.h  kzload.elf ld.scr     lib.h      main.c     serial.c   serial.o   startup.s  vector.o

このコマンドは長いので、Makefileに記述がされている。よってmake imageというコマンドでいけるとのこと。

#一度消去して
rm kzload.mot

#Makefileに頼る
make image
~/12step/tools/bin/h8300-elf-objcopy -O srec kzload kzload.mot
ls
Makefile   kzload     kzload.mot lib.c      lib.o      main.o     serial.h   startup.o  vector.c
defines.h  kzload.elf ld.scr     lib.h      main.c     serial.c   serial.o   startup.s  vector.o


##################フラッシュROMへの書き込み(1.3.2)#####################
を~/12step/toolsにおいてあるkz_h8writeを用いてフラッシュROMへ書き込む

sudo ~/12step/tools/kz_h8write -3069 -f20 kzload.mot /dev/tty.usbserial-FTB3L7SJ

これまた、Makefileに記載があるので、make writeでもよい。
make write

そして、ここでまたハマった。
ハマったのは2カ所。
・1カ所目
ボード本体に電源のケーブルを挿入していなかった。
・2カ所目
ボード状のスイッチを左から「ON, ON, OFF, ON」にしていなかった。「ON, ON, OFF, ON」にすることで、CPUが書き込みモードで起動するようだ。あまりにも困ったものだから、著者のサポートページをよく読んだら、書いてあった。

マイコン・ボードの右上には,4連のディップ・スイッチがあります. これらはCPUの動作モード設定ピンに直結しているスイッチで,CPUの動作モードを 指定することができます.またディップ・スイッチのすぐ右には, リセット・ボタンがあります.

まず,ディップ・スイッチを左から,ON,ON,OFF,ONの状態(上,上,下,上)に してください. この状態で電源ONすると,フラッシュROM書き込みモードとしてCPUが起動します.

PCとH8/3069Fマイコン・ボードをシリアル・ケーブルで接続します. さらにマイコン・ボードに電源アダプタを接続し,電源を入れます. H8/3069Fマイコン・ボードには電源のON/OFFボタンがありませんので, 電源アダプタを接続するとそのまま電源ONになります.

H8/3069Fマイコン・ボードの電源を入れたらフラッシュROM書き込みモードで起動して いますので,h8writeを実行することで,シリアル経由でフラッシュROMに 書き込みができます.


写真を貼付けておく。

電源とシリアルコネクタに注目
ディップ・ スイッチに注目

うまくいくと、以下のようなログが表示される。
sudo make write
../../../tools/kz_h8write -3069 -f20 kzload.mot /dev/tty.usbserial-FTB3L7SJ
=================================================
 H8/3069F Flash Writer for KOZOS (Version 0.2.1)
 Copyright(C) 2011-2012 Shinichiro Nakamura
=================================================
Bitrate sequence: Done.
Inquiry device: Done.
Select device: Done.
Inquiry clock mode: Done.
Select clock mode: Done.
Select bitrate: Done.
Waiting for erase done:......
Programming:.....
Program: Done.

Complete.


#######picocomを用いてボードを起動し、シリアル通信を行う(1.3.4 - 1.3.10)###########

ディップ・スイッチを「ON, OFF, ON, OFF」に変更し、リセットボタンを押す。リセットボタンは、ディップ・スイッチの右隣にある。

あとは、通信をするだけ。
以前、Arduinoでシリアル通信をするために、picocomというコンパクトなシリアル通信の端末エミュレータをインストールしてあったので、それを使用する。

picocom -r -l /dev/tty.usbserial-FTB3L7SJ
picocom v1.7

port is        : /dev/tty.usbserial-FTB3L7SJ
flowcontrol    : none
baudrate is    : 9600
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : yes
nolock is      : yes
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,

Terminal ready
Hello World!                  #スイッチを押すたびにHello World!が出力される!!!!
Hello World!

Hello World!

#######cuを用いてボードを起動し、シリアル通信を行う(1.3.4 - 1.3.10)###########
cuはMacでデフォルトでついているエミュレータである。

sudo cu -l /dev/tty.usbserial-FTB3L7SJ
Connected.
Hello World!               #やはりスイッチを押すたびにHello World!が帰ってくる。
Hello World!
Hello World!
Hello World!
Hello World!

~.                                 #終了するときは、~.と入力してEnterを押せばいい。


Disconnected.


以上で、MacによるStep1は終了した!!!!!!!!!!!!!!!!!
一日で終わって本当に良かった。
これも、ネット上に丁寧にログを残してくださっている皆様のお陰。


###################追記1##################

最後に環境変数PATHに$HOME/12step/tools/binを追加していたが、普段は必要ないので、コメントアウトしておく方がよい。そうでないと、クロス開発用のgccが優先されてしまう。
#export PATH=/opt/local/bin:/opt/local/sbin:$PATH

export PATH=$HOME/12step/tools/bin:/opt/local/bin:/opt/local/sbin:$PATH

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

#export PATH=$HOME/12step/tools/bin:/opt/local/bin:/opt/local/sbin:$PATH
のように戻しておくこと。


##################追記2##################
いろいろ検証してみたが、どうやらPATHに~/12step/tools/binを必要はないようだ。
なぜなら、makeファイルの中で
PREFIX  = ~/12step/tools
としており、これにより、
BINDIR  = $(PREFIX)/bin

BINDIR  = ~/12step/tools/bin
となるためである。


###############追記3####################
最終的なディレクトリ構成をメモしておく。
http://kozos.jp/kozos/osbook/osbook_03/ に習った形式で進める予定。
tree -L 2 ~/12step/

#12step/src以下に開発プロジェクトを進めて行く
tree -L 2 ~/12step/src


以上


【参考文献】
坂井 弘亮『12ステップで作る組込みOS自作入門』カットシステム 2010

組み込み自作OS-Macにて-Step1-その4

###############フラッシュROM書き込みツール(1.1.11)###################

Sourceforge(http://sourceforge.jp/projects/kz-h8write/)でshintaさんが開発されているh8writeの改良版であるkz_h8write-v0.2.1.zip (Date: 2012-12-19, Size: 491.1 KB)をダウンロードする。そして、~/12step/build/以下に解凍してPackageFilesという名のディレクトリを手に入れる。

cd /Users/kappa/12step/build/PackageFiles/src

#ビルド。Makefileは/Users/kappa/12step/build/PackageFiles/srcディレクトリ内にすでに存在している。
make

#生成した実行ファイルを~/12step/toolsへ移動させる
mv kz_h8write ~/12step/tools/




その5から、次から実際にマイコンをつないでテストをしてみる。

組み込み自作OS-Macにて-Step1-その3

##########GCCのインストールについて(1.1.9)###########
GCC4.5以降のバージョンでは、gmp, mpfr, mpcの三つのライブラリが事前にインストールされており、ビルドするときにそれらを--with-gmp=のようにして指定する必要があるという(AVR-GCC4.5導入編)。よって、まずは、gmp, mpfr, mpcの三つをインストールすることから始める。


##########gmpのインストール(1.1.9)##########
gmp : GMP (The GNU MP Bignum Library) は多倍長計算を非常に高速に行うライブラリ(GMPの使い方より)。gccに必要のようである。

cd ~/12step/build/
tar jxvf gmp-5.0.5.tar.bz2
cd gmp-5.0.5

./configure --prefix=$HOME/12step/tools/gmp

make
make check

make install

###########mpfrのインストール(1.1.9)###################
cd ~/12step/build
tar zxvf mpfr-3.1.1.tar.gz
cd mpfr-3.1.1

./configure --prefix=$HOME/12step/tools/mpfr --with-gmp=$HOME/12step/tools/gmp

make
make check

make install

###########mpcのインストール(1.1.9)###################
cd ~/12step/build/
tar zxvf mpc-0.9.tar.gz 
cd mpc-0.9

./configure --prefix=$HOME/12step/tools/mpc --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr

make
make check
make install



###########gccのインストール(1.1.9)###################
はまった。参考にさせていただいていたサイトのgccのビルドの項目のうち、./configureの--with-mpcの記述を変更したら、うまくいった。おそらく、--with-mpc=/usr/local/mpcではなくて、--with-mpc=$HOME/12step/tools/mpcであろう。

cd ~/12step/build/
tar zxvf gcc-4.7.1.tar.gz 
cd gcc-4.7.1

./configure --target=h8300-elf -disable-nls --disable-threads --disable-shared --disable-werror --enable-languages=c --prefix=$HOME/12step/tools --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr --with-mpc=$HOME/12step/tools/mpc

make
ここで、またはまった。libgcc.mvars: No such file or directoryというエラーが出る。このエラーはすでにネット上で多く報告されている。gcc-4.3.x以降ではビルドの際に,ビルドディレクトリと ソースディレクトリを別にしないと「libgcc.mvarsが無い」というエラーになって しまうとのこと。ここにもここには、「v4.3以降は、ソースディレクトのトップ以外のディレクトリでビルドしないと以下のエラーになる仕様だそうです」とわざわざ書いてある。
そこで、GCCのディレクトリを消去して

cd ~/12step/build/
tar zxvf gcc-4.7.1.tar.gz 
cd gcc-4.7.1
mkdir build
cd build

../configure --target=h8300-elf -disable-nls --disable-threads --disable-shared --disable-werror --enable-languages=c --prefix=$HOME/12step/tools --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr --with-mpc=$HOME/12step/tools/mpc

make
としてみた。すると、今度はlibssp/ssp.cに関連するエラーが出て、止まってしまった。
--disable-libssp
がはいっていた。そこで、

cd ~/12step/build/
tar zxvf gcc-4.7.1.tar.gz 
cd gcc-4.7.1
mkdir build
cd build

../configure --target=h8300-elf -disable-nls --disable-threads --disable-shared --disable-werror --enable-languages=c --prefix=$HOME/12step/tools --with-gmp=$HOME/12step/tools/gmp --with-mpfr=$HOME/12step/tools/mpfr --with-mpc=$HOME/12step/tools/mpc --disable-libssp

make

としてみた。どうやらこれでうまくいくようだ。
あとはインストール
make install

###############確認###################
tree ~/12step




##############パスを通す(注意)######################
後々判明したが、わざわざパスを通さなくてもMakefileに~/12step/tools/binに読み込むように記述を行うため、このパートはスキップすればよい。メモのために一応残しておくが。
ls ~/12step/tools/bin








# $HOME/12step/tools/binにはパスを通しておく。とよい。
vim ~/.bash_profile

#前

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

#後
#export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PATH=$HOME/12step/tools/bin:/opt/local/bin:/opt/local/sbin:$PATH

設定ファイルの変更を反映させる
source ~/.bash_profile

これで、例えば、h8と打ちかけてTabキーを押すと以下のようになる。







【参考文献】
坂井 弘亮『12ステップで作る組込みOS自作入門』カットシステム 2010

TabキーでMacの操作を楽にする

WindowsのGUI操作でTabキーを多用していた私は、いちいちクリックしにいかなくてはならないMacの操作に閉口していた。今回はその解決法がわかったので書いておく。

OS X Mountain Lion: Full keyboard access
テキスト入力時に覚えておくと便利かもしれない Mac のキーボードショートカットとか
 

実際の設定画面は以下の。
一番下の、All controlsを選択すればよい。
あとは、Windowsの感覚でTabキーをGUIで使用できる。

組み込み自作OS-Macにて-Step1-その2

##############セルフ・コンパイラ(1.1.6)###############
Xcodeを入れてあれば、Macであらたにセルフ・コンパイラをインストールする必要は無い。


##############クロスコンパイラ・コンパイラ(1.1.7)###############

こちらの二つのサイトの実行例を大部分参考にして進めました。


#クロスコンパイラをインストールするディレクトリを作成
cd ~ 
mkdir 12step 
cd 12step 
mkdir build src tools

#ディレクトリ構成はこんな感じ
#buildはインストールツールをビルドする場所、srcはこれから開発するプログラムを億場所、toolsはクロスコンパイラなどをおいておく場所。今回のプロジェクトが終了したら、~/12stepをまとめて消去すれば、環境を元に戻す事ができる。
sudo port install tree
tree 12step

#ソースコードのダウンロード
cd ~/12step/build/
curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2
curl -O http://ftp.gnu.org/gnu/gmp/gmp-5.0.5.tar.bz2
curl -O http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz
curl -O http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.1.tar.gz
curl -O http://ftp.gnu.org/gnu/gcc/gcc-4.7.1/gcc-4.7.1.tar.gz

#現在のディレクトリはこんな感じ
tree ~/12step










################これからそれぞれのツールをインストールしていく(1.1.8)############
#################binutilsのインストール(1.1.8)#################
#binutilsとはGNUが提供しているプログラミングに必要なツール群である。様々なオブジェクトファイルや、アセンブラ、リンカが含まれる
#ソースコードのアーカイブを解凍して、ディレクトリに入る
cd ~/12step/build
tar jxvf binutils-2.19.1.tar.bz2 
cd binutils-2.19.1

#--target=h8300-elfとは、H8のクロス開発用にbunutilsをビルドするということ
#--prefix=$HOME/12step/toolsとは、インストール先の指定を表している
#--disable-werrorは一部の環境ではビルドエラーを会費できるようである
./configure --target=h8300-elf --disable-nls --disable-werror --prefix=$HOME/12step/tools

#makeではエラーログらしきののが出るが、怯まずに前へ進む
make
make install

#tools以下に新しくディレクトリができて、インストールが成功していることが確認できる
tree -L 2 ~/12step/
















# tools/bin以下には各種ツールがインストールされている
ls ~/12step/tools/bin


【参考文献】
坂井 弘亮『12ステップで作る組込みOS自作入門』カットシステム 2010

組み込み自作OS-Macにて-Step1-その1

本書では推奨されていなかったが、ネット情報によるとクロスコンパイル環境の構築が可能とのことであった。そこで、まずは慣れ親しんだMacから着手した。

############まずはネットの情報を集める。#############

・このブログの内容が基本となる。本書のサポートページにもリンクされている
2010-12-26 MacでH8開発環境構築 - 12ステップ本を試す

・こちらのブログはより最近の環境(2012年)で試されている
2回目のC言語で『12ステップで作る組込みOS自作入門 』の通りに組込みOSを作ってみた

・slideshareにもよいスライドがある
http://www.slideshare.net/sandai/12step-1-14296356

・Macでの環境構築が大まかにまとめられている
まいんど工作室

・マックでシリアル通信を利用するための情報がまとめられている
Mac でシリアルコンソールを利用する方法



#######それでは今回のプロジェクトで使用する、ハードウェアを整理する。(1.1.1 - 1.1.5)###########

・試した環境
MacBook(Mac OS X 10.9.2)

・用意したもの
iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)0.5m ブラックスケルトン BSUSRC0605BS

(以下のものは組み込みOSセットを購入して揃えた)
Fネット対応マイコンLANボード H8/3069F
超小型スイッチングアダプタ GP05-US0510
ストレートケーブル RCM-09PS-GR-1.8M-LF  #シリアル通信に使用。Macでは使用しない

###########USBシリアルケーブルをMacbookで使用可能になるように、ドライバをインストールする############

「iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)0.5m ブラックスケルトン BSUSRC0605BS(以下USBシリアルケーブル)」は、メーカーであるBuffaloからMac用公式ドライバーが提要されていない。しかし、内臓チップのメーカーがドライバーを提供しているので、そちらをインストールする。Lion以降のOS Xを使用している場合は64bit ver.をインストールするのがミソ。
下のサイトにいく。
http://www.ftdichip.com/Drivers/VCP.htm
Virtual COM Port Drivers

ドライバーが追加されていることを確認するには、USBシリアルケーブルをMacbookに接続した後(もう一方はどこにも接続しなくてもよい)、下のようにドライバファイルを調べる。
$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port   /dev/tty.usbserial-FTB3L7SJ

/dev/tty.Bluetooth-Modem

/dev/tty.usbserial-FTB3L7SJが存在すれば、インストールは成功している。



とりあえず、今日はここまで。


【参考文献】
坂井 弘亮『12ステップで作る組込みOS自作入門』カットシステム 2010

12ステップで作る 組込みOS自作入門

以前から興味があった、『12ステップで作る 組込みOS自作入門』に挑戦する決意をした。

PC上でプログラムを作成する場合、環境によりセルフ開発とクロス開発に分類される。
セルフ開発とは、プログラムの開発環境と実行環境のプラットホームが同一になる開発である。一方、クロス開発は、開発環境と実行環境が異なるものを指す。クロス開発の場合、開発するPCのことをホストと呼び、プログラムが実際動作するデバイスをターゲットと呼ぶ。


本書に取り組む際には第1章で扱われている開発環境の構築が第一関門となりそうだ。クロス環境を用意するため、ハマるところが満載の予感がする。

1stステップ 開発環境の作成
1.1 開発環境の構築
1.2 「Hello World」のソース・コード
1.3 「Hello World」を動かしてみよう!

本書ではUbuntu9.10, Fedora11,  FreeBSD, Windows XP + Cygwinの4つの環境が推奨されている。

今後は、まずこれらの環境で開発環境を構築できるかどうか試して行く事から取りかかる。

【参考文献】
坂井 弘亮『12ステップで作る組込みOS自作入門』カットシステム 2010

Day18 Raspberry PiのIPアドレス固定方法

Raspberry PiのIPアドレス固定を行う方法には次の二つがある。
(1)Raspberry Piの/etc/network/interfacesファイルの設定
(2)ブロードバンドルータのdhcpの設定


(1)Raspberry Piの/etc/network/interfacesファイルの設定
/etc/network/interfacesをルート権限にて編集を行う。dhcpはコメント合うとして、新たにstaticを割り当てる。
この場合、モバイルルータの設定は行わないので、DHCPにより他機に対してリースされたアドレスがRaspberry Pi自身で定めたIPアドレスとバッティングしないように、Raspberry Pi自身の設定は、できるだけ大きいものにするのがよい。さらには、DHCPで割り当てるIPアドレスの範囲を限定するような設定をモバイルルータ内で行う事ができれば、raspberry piとの衝突は避ける事が可能である。

(2)ブロードバンドルータのdhcpの設定(オススメ)
DHCPにおいて特定のコンピュータに固定のIPアドレスを割り当てたい場合は、IPアドレス払い出しの予約が可能である場合が多い。具体的な方法は、ルータごとに異なる。
http://www.atmarkit.co.jp/fwin2k/win2ktips/542dhcpaddr/dhcpaddr.html
WHR-G301NではDHCPリースの画面の中に「手動割当に変更」があるので、それをクックする事で、IPアドレスを選択的に固定することができる。または「リース情報の新規追加」で、IPアドレスとMACアドレスを追加すればよいです。
【参考文献】
日経Linux『誰でもできる! Raspberry Piで楽しもう』日経BP社 2013

Day17 Raspberry PiでLチカ(Python GPIOライブラリ)

今回はRaspberry Piを使ったハックで、頻用されるPythonのGPIOライブラリを用いたLチカを紹介する。このライブラリはRaspbianならデフォルトでインストールされている。
ハマった点は二つ。
1 ソースにGPIO.setmode(GPIO.BOARD)を入れないとエラーがでる。ちなみにユーザーガイドには入っていない(不思議)。
2 GPIO.cleanup()を最後に実行しないと、GPIOピンが解放されず、次回実行時にピンが使用されていると警告が出る。GPIOの解放は、どのような言語を用いるにせよ、必須であると考えられる。解放しない場合、割り込みとして、エラーメッセージがでる。

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, True)
time.sleep(5)
GPIO.output(7, False)
time.sleep(5)
GPIO.output(7, True)
time.sleep(5)
GPIO.output(7, False)
time.sleep(5)
GPIO.cleanup

【参考文献】
http://www.thirdeyevis.com/pi-page-2.php
Japanese Raspberry Pi Users Group『Raspberry Pi[実用]入門』技術評論社 2013

Day16 CapslockをCtrlに変える

RaspbianでCapslockをCtrlキーに変える方法を書く。なお、もとあるCtrlキーの機能はそのまま。

$ sudo vim /etc/default/keyboard

XKBOPTIONS="terminate:ctrl_alt_bksp"

XKBOPTIONS="terminate:ctrl_alt_bksp, ctrl:nocaps"

あとは、リブートして設定ファイルを読み込むだけ。
$ sudo reboot
なお、この方法はDebianで通用するようである。

【参考文献】
http://gaobin.hatenablog.com/entry/2013/05/18/232617

Day15 Raspberry PiでLチカ(WiringPi)

C言語のWiringPiライブラリを用いてLチカを行う。330Ωの抵抗とLEDを直列に接続している。WiringPiは独自のピンの指定方法があるため、注意が必要である。詳しくは、こちらのサイトを参照されたい(https://projects.drogon.net/raspberry-pi/wiringpi/pins/
/* led.c */
#include<wiringPi.h>
#define PIN 7 //using 7 pin(GPIO4)
int main(void){
//setup
wiringPiSetup();
pinMode(PIN, OUTPUT);

//Blinking the LED
while(1){
// turn the led on
digitalWrite(PIN, 1);
//wait for 1000 msec
delay(1000);
// turn the led off
digitalWrite(PIN, 0);
//wait for 1000 msec
delay(1000);
}
return 0;
}

コンパイルでは、wiringPiをリンクするようにオプションを付加する。
$ gcc -o led led.c -lwiringPi

ルートで実行
$ sudo ./led

【参考文献】
http://mas-home.hatenablog.com/entry/2013/01/06/204616
林和孝『Raspberry Piで遊ぼう』ラトルズ 2014

Day14 Raspberry PiでLチカ(WiringPiに付属のgpioユーティリティ)

WiringPiに付属のgpioユーティリティでLチカをする方法。
#WiringPiのインストール
#まずは、libi2c-devというI2Cの開発用ライブラリが必要
$ sudo apt-get install  libi2c-dev

#次にgitをインストール
$ sudo apt-get install git-core

#WiringPiのソースファイルをダウンロード
$ git clone git://git.drogon.net/wiringPi

#コンパイル
$ cd wiringPi
$ ./build

#動作確認
$ gpio -v


ここからいよいよwiringPiを用いたLチカを行う。
#モード設定(-gの指定によりSoCのGPIOポート番号が使用可能)
$ gpio  -g mode 4 out

LEDを点灯させる
$ gpio -g  write 4 1

Day13 Raspberry PiでLチカ(シェルスクリプト)

Raspberry PiでLチカをした。抵抗は330Ωを使用。


ルート権限でコマンドを実行しないとGPIOポートにアクセスできない。
$ su

GPIO4を使用する。以下のコマンドで、/sys/class/gpio/gpio4が生成する
#  echo 4 > /sys/class/gpio/export

GPIO4の入出力の設定をする。今回はoutにする。
# echo out > /sys/class/gpio/gpio4/direction

/sys/class/gpio/gpio4/valueに1(点灯) 、0(消灯)を書き込むことでLEDの挙動を制御できる
# echo 1 > /sys/class/gpio/gpio4/value
# echo 0 > /sys/class/gpio/gpio4/value

GPIOの使用が終わったら、終了を宣言する。以下のコマンドで、/sys/class/gpio/gpio4が消失する
# echo 4 > /sys/class/gpio/unexport


# exit

この過程をシェルスクリプトにすると以下のようになる。


#!/bin/bash
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
while :
do
echo "1" > /sys/class/gpio/gpio4/value
sleep 0.5
echo "0" > /sys/class/gpio/gpio4/value
sleep 0.5
done

複数回このシェルスクリプトを実行するときは、あらかじめ、
$ echo "4" > /sys/class/gpio/unexport

を実行しておかないと、リソースビジーというエラーが出る事に注意。


【参考文献】
林和孝『Raspberry Piで遊ぼう』ラトルズ 2014

Day12 Rasbianのディスクイメージのバックアップ

Raspbianの設定をいろいろいじる前に、要所要所でバックアップしてイメージディスクにしておき、後でリストアする方法を書く。

まずは、手元のMacに外付けでRaspbianの入ったSDカード(8G)を接続する。

#######SDカードの名前を確認(この作業は、母機を壊さないために一番大事)#######
#ディスクをチェク
$ df -h
Filesystem      Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2   238Gi  105Gi  132Gi    45% 27682929 34621941   44%   /
devfs          188Ki  188Ki    0Bi   100%      649        0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%        0        0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%        0        0  100%   /home

/dev/disk1s1    56Mi   19Mi   37Mi    34%      512        0  100%   /Volumes/boot

#マウントをチェック
$ mount
/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)

/dev/disk1s1 on /Volumes/boot (msdos, local, nodev, nosuid, noowners)

#Macならdiskutilコマンドが便利。ちゃんと8GBのSDカードが/dev/disk1に割り当てられていることが確認できる。
$ sudo diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *256.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            255.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *8.0 GB     disk1
   1:             Windows_FAT_32 boot                    58.7 MB    disk1s1

   2:                      Linux                         7.9 GB     disk1s2


#####SDカードの内容をddコマンドによりディスクイメージにまとめる#####

#ディスクのアマウント
$ diskutil umountDisk /dev/disk1s1

#イメージの作成(カレントディレクトリにファイルは生成する)
$ sudo dd if=/dev/rdisk1 of=raspbian_140323.img bs=1m

#ファイルサイズの確認
$ du -h raspbian_140323.img  
7.4G raspbian_140323.img

#圧縮
$ tar -zcvf raspbian_140323.img.tar.gz raspbian_140323.img

#ファイルサイズの確認
$ du -h raspbian_140323.img.tar.gz
934M raspbian_140323.img.tar.gz
  

#####別のSDカードにリストアする####

#圧縮したイメージを解答
$ tar zxvf raspbian_140323.img.tar.gz

#デバイス情報を調べる
$ diskutil list

#アマウント
$ sudo diskutil umount /dev/disk1s1

#先ほどのイメージを用いてリストア
$ sudo dd if=raspbian_140323.img of=/dev/rdisk1 bs=1m

#アマウント
$ sudo diskutil umount /dev/disk1s1

【参考文献】
http://shokai.org/blog/archives/7943

Day11 キーボード設定

Day10までは、家庭内LANを介してsshでRaspberry piに接続していた。今回、わけがあってキーボードとディスプレイを直接本体に接続してスタンドアロンで操作を行う必要があった。そこで日本語キーボードの設定が必要となったため、手順をまとめておく。


# raspi-configに接続
$ sudo raspi-config

「4 Internationalisation Option」
「13 Change Kyboard Layout」
「Generic 105-key (Int) PC」
「Japanese」
「The default for the keyboard layout」
「No compose key」
「Yes」

の順番に設定を行う。最後に、「Finish」で終了すると、設定が日本語キーボードに対応するようになる。


【参考文献】
http://www.orsx.net/blog/archives/4314
http://www.raspberrypi.org/forum/viewtopic.php?f=82&t=48522

Arduinoをはじめようキットの構成

Arduinoの勉強のとっかかりとして、

Arduinoをはじめようキット
http://www.amazon.co.jp/%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-Arduino%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86%E3%82%AD%E3%83%83%E3%83%88/dp/B0025Y6C5G

を購入しました。
このキットには以下のパーツが付属していました。

・Arduino Uno R3(マイコンボード) 1個
・堅いジャンパワイヤ 1セット
・柔らかいジャンパワイヤ10本セット 1セット
・1kΩ抵抗(茶黒赤金) 3本
・330Ω抵抗(橙橙茶金) 1本
・10kΩ抵抗(茶黒橙金) 2本
・270Ω抵抗(赤紫茶金) 1本

・ブレッドボード 1個
・USBケーブル 1本
・LED 3個(3種類)
・タクトスイッチ 1個
・CdSセル1個
・MOS-FET 1個
・ダイオード 1本

・ガイドシート 1枚


抵抗のカラーの見方は以下のサイトが参考になりました。
http://bbradio.sakura.ne.jp/code1/code1.html

電池ホルダーを買った

Arduinoに入力する電池ホルダーを購入した。

以下のプログラムをアップロード。

void setup(){
  Serial.begin(9600);  //ボーレート(1secに行う変復調の回数)を9600に設定
}
void loop(){
  float vt = (float)analogRead(A0)/1023 * 5.0;
  Serial.println(vt);
  delay(1000);  // Wait for 1 second
}

電池一つなら、以下の通り。

入力結果が1.57V安定する。
下の電池ホルダーは、直列に3個の電池をつなぐことができるもの。



回路を組んでみた。

 1.57×3= 4.71(V)の値に近い4.73Vが出力される。
電子ホルダーのような電子工作の部品は100円以下で手に入るので、積極的にパーツ屋さんに足を運んで、パーツを揃えると良いと思った。

Arduinoでアナログ入力ー乾電池を例に取ってー

乾電池の電圧を測定することは、アナログ入力を学ぶのに最適。

//電圧測定のスケッチ
void setup(){
  Serial.begin(9600);  //ボーレート(1secに行う変復調の回数)を9600に設定
}
void loop(){
  float vt = (float)analogRead(A0)/1023 * 5.0;
  Serial.println(vt);
  delay(1000);  // Wait for 1 second
}


 analogReadによる戻り値は、0から1023まで。電圧が最高で5V(1023)、最小で0V(0)である。そこで、戻り値を1023で割ったものに、5を掛けることで、実際の電圧を測定することができる。

下の写真のように乾電池(単4、1.5V)のプラス側をArduinoのA0に、乾電池のマイナス側をArduinoのGNDに接続した。




シリアルモニターの出力結果は以下の通り。ノイズが入ってしまうが、うまく測定できると1.57Vと測定される。
【参考文献】
高本孝頼『みんなのArduino入門』リックテレコム 2014 pp86 - 88.

Arduinoでシリアル通信

Mac(開発機)とArduinoの間は、USBケーブルで接続されている。USBケーブルは電源の供給だけではなく、シリアル通信という通信手段を用いた情報のやりとりが可能である。

以下のプログラムはシリアル通信を行い、LEDのON/OFFをコントロールするものである。



#define LED_PIN 13

void setup(){
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  int inputchar;
  inputchar = Serial.read();  //シリアル通信で読み込む

  if(inputchar != -1){  //読み込んだ値が-1でなければ以下を実行
    switch(inputchar){
      case 'o':      //oを読み紺んだ場合
      Serial.print("LED ON");
      Serial.println("");    //改行
      digitalWrite(LED_PIN, HIGH);
      break;
      case 'p':      //pを読み込んだ場合
      Serial.print("LED OFF");    //改行
      digitalWrite(LED_PIN, LOW);
      break;
    }
  }
}

ビルド&アップロードをしたら、Tools > Serial Monitor をクリック。窓にoやpを入力すると、それに応じてLEDの点灯をコントロールすることができる。



IDEを用いないで、InoとpicocomによりSerial通信をターミナル上で行う。

#作業ディレクトリ作成
$ mkdir Serial_ino
$ cd Serial_ino

#プロジェクトの生成
$ ino init

#デフォルトでsrc/に生成されるプロトタイプのスケッチを消去
$ rm src/sketch.ino

#新たにスケッチを作成
$ vim src/Serial.ino

#ビルド
$ ino build

#アップロード
$ ino upload

#Serial Monitorとしてpicocomというアプリケーションを使用する。Macportsからインストール。
$ sudo port selfupdate
$ sudo port install picocom

#シリアル通信を実行
$ ino serial


'o'や'p'を入力すると、リアルタイムに通信が行われ、LEDの点滅に反映されるのが楽しい。

【参考文献】
高橋隆雄『たのしい電子工作 Arduinoで電子工作をはじめよう』秀和システム 2013
Massimo Banzi (著), 船田 巧 (翻訳)『Arduinoをはじめよう 第2版』2012



Ino コマンドラインからArduinoのスケッチをビルドとアップロードするツール―その2


今回は、Inoを用いてスケッチをビルドし、アップロードを行ってみたいと思う。
まず、IDEで同様のことを行うときに、どのようなファイルが生成するのかを見てみたいと思う。

まず、以下のようにプログラムを書いて、ファイルを適当なディレクトリに保存
#このとき生成したファイルを調べる
$ ls /Users/kappa/Documents/1403/Blinking_LED/
Blinking_LED.ino

arduinoのスケッチは.inoという拡張子のファイルがその実体のようである。

ならば、vimで編集した.inoのファイルをinoを用いてビルドすることが可能なはず。
まずは、適当にディレクトリを作って、その中にvimでスクラッチを作成。


それではビルドを行う。まずはボード指定。どのようなボードが登録されているか確認。デフォルトがUnoになっているので、特にいじらなくてよさそう。
$ ino list-models

万が一Uno以外のものであれば、-mのオプションをつけて、ボードの種類を指定すればよい。
例: ino build -m nano  

それでは実際にビルドを行う。

おっと、プロジェクトがないと言っている。インターネットで調べたところ、プロジェクトというもの(実体はディレクトリの集合)を作成しなくてはならないようだ。

それでは気をとりなおして、カレントディレクトリを空にした後に、ino initを入力。

ここで、先ほどBlinking_LED.inoを作成。
プロジェクトのルートディレクトリにおいて、以下のコマンドを実行。
$ ino build

かなり長いログがでたということは、それだけ様々な処理をやってくれている証拠。頼もしい。
ビルドして、生成したファイルは.build以下に存在する。
$ ls -al

最終的なビルドによる成果物は、ビルドのログの一番最後に出てくるfirmware.hexであろう。
このファイルは、Blinking_LED_Ino/.build/uno以下に存在する。


最後に、arduinoにアップロードを試みる。
$ ino upload

無事、基板上のLEDが点滅した。


IDEと違い、慣れ親しんだコマンド上で様々な作業ができる点はとても良い。IDEを使っていて、遮蔽された感じがいやだったが、このツールも結局はsrcディレクトリにスケッチをおいて、ドキュメントルートでino init, ino build, ino uploadとコマンドを三回うつだけだ。その意味ではIDEとやっていることに大差はないが、生成してくるファイルをlinuxコマンドで逐一確認できる点は学習効果が高いように感じる。

参考文献にはシリアル通信についても記述があるので、参考にしていずれやってみたいと思う。

【参考文献】
Massimo Banzi (著), 船田 巧 (翻訳)『Arduinoをはじめよう 第2版』2012