2014/12/23

RaspberryPi B+の立ち上げ

先日RaspberryPi B+を立ち上げた時に、キーボードの設定でつまづいたので備忘録として記録しておきます。

参考資料


1.用意するもの


ここを参考に準備しました。
  • マイクロSDカード(推奨:8GB class 4 SD card) - 手持ち品が2GBだったので近所のコンビニで8GB品を購入
  • キーボード&マウス(USBタイプ) - 手持ち品を利用
  • ディスプレイ&HDMIケーブル - 手持ち品を利用
  • 電源(マイクロUSBタイプ) - 手持ち品を利用

2.OSイメージの準備


RaspberryPiはマイクロSDカードに格納されたOSイメージを読み込むことにより起動する仕組みのようです。従ってマイクロSDカードが必要です。
OSイメージは下記URLからダウンロードできます。 OSイメージは色々あるのですが、普段Debianを使用しているのでDebian/Wheezyベースの"RASPBIAN"にしました。
またSDカードへの書き込みもLinuxPC(Debian)ベースで行うことにしました。

以下、LinuxPC(Debian)での作業です。
$ wget http://downloads.raspberrypi.org/raspbian_latest
→ファイルサイズは934MByte。
$ mv raspbian_latest 2014-09-09-wheezy-raspbian.zip
→wgetがファイル名をraspbian_latestに変更してしまったので元に戻しました。

・SHA1の確認(951a9092dd160ea06195963d1afb47220588ed84)

$ sha1sum 2014-09-09-wheezy-raspbian.zip
951a9092dd160ea06195963d1afb47220588ed84  2014-09-09-wheezy-raspbian.zip
→合っている

・ファイルの解凍

$ unzip 2014-09-09-wheezy-raspbian.zip
Archive:  2014-09-09-wheezy-raspbian.zip
  inflating: 2014-09-09-wheezy-raspbian.img
2014-09-09-wheezy-raspbian.imgは約3.1GB。
マイクロSDカードをSDカードリーダに差し、SDカードリーダをLinuxPC(Debian)に接続。

・マイクロSDカードのデバイス名を確認。

$ dmesg |tail
[6822806.212809] sd 5:0:0:0: [sdb] Write Protect is off
[6822806.212818] sd 5:0:0:0: [sdb] Mode Sense: 03 00 00 00
[6822806.214045] sd 5:0:0:0: [sdb] No Caching mode page found
[6822806.214154] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[6822806.218921] sd 5:0:0:0: [sdb] No Caching mode page found
[6822806.219032] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[6822806.220504]  sdb: sdb1
[6822806.224348] sd 5:0:0:0: [sdb] No Caching mode page found
[6822806.224500] sd 5:0:0:0: [sdb] Assuming drive cache: write through
[6822806.224651] sd 5:0:0:0: [sdb] Attached SCSI removable disk
→SDカードリーダのデバイス名は/dev/sdb

・OSイメージをマイクロSDカードに書き込む(参考URL

$ sudo dd bs=4M if=2014-09-09-wheezy-raspbian.img of=/dev/sdb
[sudo] password for XXXX:
781+1 レコード入力
781+1 レコード出力
3276800000 バイト (3.3 GB) コピーされました、 758.91 秒、 4.3 MB/秒

これでマイクロSDカードの準備は完了です。

3.RaspberryPiB+起動


マイクロSDカードをRaspberryPiB+に挿入。HDMIコネクタにモニタ、USBポートにキーボードとマウスを接続し、マイクロUSBコネクタにACアダプタを接続して電源投入する。

起動メッセージが流れていくので少し待つ。
しばらくすると、Raspbianの基本的な設定を行う画面が表示されます。

私は、以下の設定をしました

  • ファイルシステム拡張 →実行
  • ユーザ"pi"のパスワード変更 →実行
  • Locale変更 →日本語(UTF-8)を追加
  • timezone変更 →Asia/Tokyo
  • キーボード変更 →106-Keyboardがない!迷った挙句デフォルト設定のままとした。
 →finish
 →再起動
 →ユーザ"pi"に新パスワードでログインする
 →"startx" (X環境に)
 →キーボードのキーアサインがおかしい
 →検索して下記URLを発見

 Raspberry Piクイックスタートアップガイド (日本語)の補足

なるほど、"Generic 105-key (Intl) PC → Other → Japanese"を選択すれば良いのか。。

$ sudo raspi-config
で、もう一度設定画面に入りキーボードの設定を実施。すぐには反映されないようで、RaspberreyPiを再起動したらキーボードのキーアサインが正常になった。

4.rootパスワードの変更


ユーザ"pi"でログイン後、以下のコマンドを実行し、新パスワードを入力するとrootのパスワードが変更されます。
$ sudo passwd

5.OSの最新化


RJ45コネクタにイーサケーブルを接続。(IPアドレスはDHCPで自動設定されるので、DHCPサーバの環境が必要)以下のコマンドを実行する。
$ sudo apt-get update
$ sudo apt-get upgrade

以上

2014/10/25

JJYシミュレータの試作(AVRマイコン)

 すこし前に購入した電波時計モジュール(40KHz) [MAS6180-40KHZ]を使って電波時計を作ってみることにしました。電波時計モジュールから出力されるパルス信号をAVRマイコンでデコードして7segLEDかLCDに表示するつもりです。
 ところが実際にデバッグを始めたところ困ったことが発生。電波時計モジュールから出力されるパルス信号がノイズだらけでデコードできないようなのです。電波時計モジュールとAVRマイコンを窓際に持っていくと正しいパルスが出てくるのですが、マイコンデバッグ用PCに接続するためにPCが設置されている場所まで持っていくと出力パルスが怪しくなります。原因として考えられるのは以下の2点です。

 1)電波が弱いため窓際でないと正しく受信できない。
 2)PCが出すノイズに邪魔される。

 PCの電源を落とすとだいぶ改善されるので2)の要因が大きいのだと思います。

 PCなしではマイコンのデバッグができないので、電波時計モジュールのパルス出力を疑似出力する「JJYシミュレータ」なるツールをAVRマイコンで試作することにしました。

構成


  • いつものAVRマイコン(ATmega168/328マイコンボードキット)を使用します。
  • ATmega168/328マイコンボードキットのPB5ピンにはLEDが実装されているので、このピンをパルス出力ピンにします。
  • パルス出力のフォーマットはNICTの長波JJY送信方法を参考にしました。
  • 時刻情報はタイマ1で生成した10Hzから生成します。
  • 時刻合わせ機能はありません(プログラム上で初期値を定義し、常に初期値からスタート)
  • タイマ0で40kHzを生成し、PD6(OC0A)ピンに出力します。このときパルス出力で送信OFF/ONを制御します。
  • パルス出力の状況はシリアル(RS232C)に出力します。
今回はパルス出力だけで良かったのですが、遊びで40kHz出力もつけてみました。

使ってみて


 まだ本来の目的(パルス出力を使って電波時計のデバッグ)は試していません。
 替わりに40kHz出力を試してみたところ見事に動きました。PD6ピンに15cmぐらいの線材を接続し市販電波時計に近づけてみたところ同期してくれました。10cmぐらい離しても同期します。
 本物のJJYの電波形式(A1B)とはちょっと違う40kHzの矩形波のON/OFFですがうまく動きました。
 頭では分かっているけど、実際に動いている所をみると電波は面白いというか不思議ですね。

シリアル出力例


<<< JJY Simulator >>>
 Copyright (c) 2014 Being. Ver0.1

00M 2016/02/29 23:14
M00100101M001000011M000000110M000000110M_________M000000000M 2016/02/29 23:15
M00100110M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:16
M00100111M001000011M000000110M000000100M000010110M001000000M 2016/02/29 23:17
M00101000M001000011M000000110M000000100M000010110M001000000M 2016/02/29 23:18
M00101001M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:19
M01000000M001000011M000000110M000000110M000010110M001000000M 2016/02/29 23:20

2014/10/07

黒部ダムに行ってきました(紅葉)

10/4(土)に黒部ダムに行ってきました。紅葉は色づき初めの段階で来週あたりから本番を迎えそうな感じでした。

黒部ダムの放水風景


放水を真上から見た図


紅葉


2014/10/01

【その後】Shure SE425ケーブル交換

先日ケーブルを交換したShure SE425ですがとても快調です。

交換前のケーブルはゴワゴワしていて絡まりやすく使いにくかったのですが、交換後のケーブルは柔らかく絡まりにくいです。

2014/09/15

SE425断線→ケーブル交換で直った。

 通勤時に使用しているイヤホン「Shure SE425-CL-J」が調子悪くなった。右側の音だけ聞こえたり、聞こえなかったりするのだ。

 右耳にかかるケーブルのあたりをいじると音の聞こえ具合が変わるので、ケーブルかイヤホン本体のコネクタが怪しい。パッと見、どちらが悪いのか分からなかった。音を出しながら被疑箇所を丹念にチェックすれば何となく分かるとは思うが、イヤホンなので耳にかけないと音を確認できず、耳にかけるとチェックがしづらく、どちらが悪いのか判断できない状態でいた。

 SE425は断線対策としてケーブルだけ交換ができる仕様となっている。ダメ元で交換用ケーブルを買ってみるのも手だと思うが、交換ケーブルが4,000円もするので、なかなか手を出せない。

 そんなこんなでモヤモヤしていたのだが、状況は悪くなり聞こえない時間のほうが多くなってきた。どうするか。。。

 ケーブルを外してコネクタ部分を掃除してみたが、接触不良は直らない。このモデルはスケルトンタイプなので中の構造が見える。イヤホン本体をまじまじと見たが、特に問題となりそうな所はない。ケーブル側は耳にかかるあたりの導線が緑色に変色している。(ケーブルの被覆は問題ないが、中の導線が緑色に変色している部分がある)汗などの水分がケーブル内部に入り込んで導線を腐食させたのだろうと推測される。なんとなくケーブルのほうが怪しそう。

ダメ元で交換用ケーブルを買うことにした。shure純正の「EAC64CL」です。
 →Amazonで購入。
 →届いたので、ドキドキしながらケーブル交換。
 →やった!直った。(←イマココ)

2014/08/18

7segLED時計の試作(AVRマイコン)

AVRマイコンと4桁7segLEDを使った時計を試作しました。今回は時刻合わせ機能も入れてあります。

用意するもの


1秒の作り方


前回と同じ方法で作ります。

回路図


今回は4桁7segLEDをダイナミック点灯方式で使います。以下に回路図を示します。

図1 7segLEDボード回路図

手持ち部品がアノードコモンタイプの7SegLEDとNPNトランジスタのみだったので一般的なエミッタ接地ではなく、コレクタ接地(エミッタフォロワ)回路になっています。

図2 ボード間接続図

プッシュスイッチにプルアップ抵抗がありませんが、AVR内蔵のプルアップで代用しています。

機能


時計表示機能
 24時間表記で時分を表示します。4桁LEDなので秒数は表示できません。
 秒数は7seg LEDの小数点を点滅させることで表現します。
 秒数により点滅する小数点の位置を変え、大まかな秒数が把握できるよう
 にします。
  00-14秒:1桁目の小数点を点滅、2-4桁目は消灯
  15-29秒:2桁目の小数点を点滅、1桁目は点灯、3-4桁目は消灯
  30-44秒:3桁目の小数点を点滅、1-2桁目は点灯、4桁目は消灯
  45-59秒:4桁目の小数点を点滅、1-3桁目は点灯

日付表示機能

 Bボタンを押すと年(4桁)を表示します。
 さらにBボタンを押すと月日を表示します。
 さらにBボタンを押すと曜日を表示します。

日時修正機能

 Aボタンを長押し(3秒)すると日時修正モードに入ります。
 年→月→日→時→分→秒の順に入力します。
 Bボタンを押すことにより各値がインクリメントされます。
 秒修正時はBボタン押下で00秒に設定されます。
 3秒間何も操作しないと時計表示モードに戻ります。(そこまでに
 入力した値は反映されます)
 曜日は入力しません。(年月日から自動計算されます)
 うるう年を認識します。(2/29はうるう年のみ入力を受け付けます)

オートディマー(減光機能)

 夜間(23-06時)は減光モードになります。ボタンを押すと通常モードに
 なります。5秒間何も操作しないと減光モードに戻ります。

状態遷移図


上述の機能を状態遷移図化したものを以下に示します。

図3 状態遷移図

完成


こんな感じで動きます。

2014/07/05

時計もどきの試作(AVRマイコン)

AVRマイコンとLCDを使った時計もどきを試作しました。なぜ「時計もどき」かと言うと、時刻合わせを行う機能がないからです。

用意するもの


1秒の作り方


マイコン内蔵クロックは精度が悪いため時計には使わないほうが良いでしょう。マイコンボードには20MHzのX'talが搭載されているのでこれを使います。20MHzクロックはマイコン内部で1/8(=2.5MHz)にされ、CPU Coreの動作クロック、およびタイマ/カウンタの動作クロックとして使われます。タイマ/カウンタは20mS周期(=50Hz)でタイマ割り込みを発生させます。プログラムはタイマ割込50回で秒針を1進めるようになっています。


図1 クロック構成

回路図


今回使用したLCDモジュールはマイコンとI2Cバスで接続します。図2に回路図を示します。


図2 回路図

I2Cバスのアクセス方法


マイコン内蔵のTWI機能を使ってI2Cバスにアクセスします。TWIの使い方は面倒そうだったのでAVR315付属のサンプルコードを使いました。ただし、avr-libcで使う場合は割り込み関係のソースを少し修正する必要があります。以下に修正ポイントを示します。

リスト1 TWI_Master.cの冒頭 修正ポイント:1~4行目、7行目を追加

リスト2 TWI_Master.cの割込みルーチン 修正ポイント:9~11行目、14行目を追加

完成


こんな感じで動きます。 電源入れたまま10日ほど放っておいたら10秒遅れました。月差に換算すると30秒ぐらいなのでまあまあの精度です。

2014/06/22

神代植物公園:あじさい

神代植物公園にあじさいを見に行ってきました。


撮影場所:神代植物公園
撮影日:2014/06/21

2014/05/28

Deep Mandelbrotの使い方

 Deep Mandelbrotの引数に'-c'があります。これは色の指定ができます。

-c specify color mode (0-255) [default: 0] or 'auto'

 上記によると入力可能な値は0-255,autoに見えますが、実際に入力可能な値は0-21,autoのようです。それ以外の値を指定するとエラーになります。また0とautoは同じ結果になるようです。

 実際にどんな色になるのか試してみたのでご覧ください。

c=auto (default)


c=0 (default)


c=1 (pink on light steel blue)


c=2 (shades of green)


c=3 (mistyrose and midnightblue)


c=4 (mistyrose, red on midnightblue)


c=5 (grey, dark green, mistyrose)


c=6 (dark slate grey and maroon on bright background)


c=7 (White/DarkBlue/Rose/DarkGreen/Gold)


c=8 (Ice/blue/dark-red)


c=9 (Red/White)


c=10 (DarkBlue/DarkRed)


c=11 (Sand, DarkBlue/RedBrick)


c=12 (Ice, DarkRed)


c=13 (shades of dark red)


c=14 (shades of dark red + dark gold)


c=15 (pink+blue on bright)


c=16 (shades of grey)


c=17 (shades of grey + dark blue)


c=18 (shades of grey + magenta)


c=19 (shades of grey + green)


c=20 (shades of grey + red)


c=21 (darkred,steelblue,gold)


c=255 (Linear functions)


2014/05/27

マンデルブロ集合ギャラリー

 Deep Mandelbrotを使って作成した画像です。


centerx = 0.3007100003
centery = 0.02006000303
radius  = 0.00000000001
maxiter = 30000

centerx = 0.3007100002979624312
centery = 0.02006000303424897
radius  = 0.0000000000000000001
maxiter = 30000

centerx = 0.300710000297962431204
centery = 0.020060003034248969999
radius  = 0.000000000000000000001
maxiter = 30000

centerx = 0.005002063072287
centery = 0.849947000274766
radius  = 0.000000000000001
maxiter = 30000

centerx = 0.00500206307228665347
centery = 0.84994700027476510513
radius  = 0.00000000000000000001
maxiter = 30000

centerx = -1.484
centery =  0.0
radius  =  0.00000000000000000000000000000000000000000000001
maxiter = 600000

2014/05/25

Deep Mandelbrotの紹介

Deep Mandelbrot」というソフトを紹介します。

■ソフトの目的


マンデルブロ集合を表示するソフトです。

■特徴


  • マルチスレッド対応
  • libgmpを用いた任意精度計算
  • PNG形式の画像を出力
  • 画像品質を向上させるオーバサンプリング
  • 簡単な動画作成機能(*1)
 *1: 私はまだ試したことがありません。

■入手先


 ページの最後のほうにある"Download"から"mandelbrot-1.0.tar.gz"を入手ずる。

■コンパイル方法


 基本的には"mandelbrot-1.0.tar.gz"の中に入っている"INSTAL"ファイルに記載されている手順を実行すればOKです。私はいつものごとくdebian/wheezy上でコンパイルしました。

(1) ライブラリの準備
 コンパイルには以下のライブラリが必要とのこと。

  • libgd2-xpm-dev
  • libgmp3-dev
 自分のdebianに入っていない場合は以下のコマンドでインストールします。
# apt-get install libgd2-xpm-dev
# apt-get install libgmp3-dev

(2) makeする
 makeが成功すると./docの下に"mandelbrot"という実行ファイルが出来ます。

# cmake .      (cmakeがない場合はapt-get install cmakeを実行)
# make
# make install (必要な場合)

■使い方


 引数"-?"を付けてコマンドを実行すると使用方法が表示されます。
$ mandelbrot -?
Deep Mandelbrot v1.0, (C)2008-2010 by Herbert Haas and Tim Horton
 Started: Sat May 24 19:46:25 2014
Deep Mandelbrot v1.0, (C)2008-2011 by Herbert Haas and Tim Horton

USAGE: mandelbrot [OPTIONS] 

 -?                 print this help
 -v                 be verbose during execution
 -V                 be even more verbose during execution
 -d                 create distance data file for further analysis
 -H                 create histogram file for further analysis
 -g                 create a PNG version with a white grid
 -i        maximum iteration depth (1-999999) [default: 200]
 -t    number of threads to be used (1-30) [default: 4]
 -o        filename for computed image (no file extension needed)
 -f         create PNG with data from this file (no computation)
                    (e.g. the result of a distance file (-d option) can be used)
 -s   amount of oversampling (1-8) [default: 2]
 -w          image pixel width (10-10000) [default: 500]
 -h         image pixel height (10-10000) [default: 500]
 -c     specify color mode (0-255) [default: 0] or 'auto'
 -m      color of Mandelbrot set (if not black) as six hexadecimal
                    digits, e. g. ffa500.

 -M          create movie using  frames
 -x       target of movie on x-axis in percent of current image
 -y       target of movie on y-axis in percent of current image
                 NOTE: valid x/y-parameters: {-100..+100}, with respect to the
                 center of the current frame {0,0}
 -r         radius of last movie frame in percent of first frame

 NOTE:
   Command line parameters overwrite the correspondig settings in .
   If only -w OR only -h is given, then the other parameter is assigned the same value.

■使用例


(1) デフォルト
 引数を何もつけずに実行するとマンデルブロ集合の全体図を出力します。

$ mandelbrot
$ ls
mandelbrot.png
$
図1 mandelbrot.png

(2) コンフィグファイルを指定して実行
 コンフィグファイルのサンプルが./doc/input_files/にあります。

$ ls doc/input_files/
README  neck  satellite  seahorse
$
リスト1 seahorse (コンフィグファイル)
# seahorse
centerx = -0.7435669
centery = 0.1314023
radius = 0.0011439
maxiter = 500
  • 表示したい位置の中心座標(centerx,cenery)
  • 半径(radius)
  • 計算の繰り返し上限値(maxiter)
$ mandelbrot seahorse
$ ls
seahorse.png
図2 seahorse.png

(3) コンフィグファイルと引数の組み合わせ例

$ namdelbrot -g seahorse       // PNG画像に座標目盛を付けます
$ namdelbrot -w 2000 seahorse  // PNG画像を2000x2000ピクセルで出力します
$ namdelbrot -i 3000 seahorse  // 計算の繰り返し上限値を3000にします(*2)
$ namdelbrot -s 3 seahorse     // オーバサンプリング値を3にします
 *2 : コンフィグファイルのmaxiter値と競合しますが、引数の値が優先されます

2014/04/12

PWM制御でLED点滅

 今度はLED点滅にPWM(Pulse Width Modulation)を使ってみます。

ゴール


  • LEDの点滅周期は約2秒(点灯1秒、消灯1秒)
  • PWM制御で「ふわっと点灯」、「ふわっと消灯」を実現する

ふわっと点灯、ふわっと消灯


 「ふわっと」を実現するため、LEDの明るさを制御します。LED輝度制御方法として今回はPWMを使います。PWMは変調方式の一つで、パルス波のDuty比(点灯と消灯の比率)を変化させることにより変調を行う方式です。簡単に言うと、
  • LEDを超高速点滅させる
  • 点滅時のDuty比を変えることにより明るさを調節する
となります。
 「超高速点滅」とは、例えば1秒間に1,000回点滅のように点滅してることが人間に認識できないほど速くします。
 「Duty比を変えることにより明るさを調節」というのは、例えばDuty比=90%(点灯90%,消灯10%)とDuty比=10%(点灯10%,消灯10%)ではDuty比=90%のほうが明るく見えるということです。

AVRでのPWM制御について


 AVRはタイマ/カウンタをPWMモードにすることにより、PWM制御を行うことができます。8bitタイマと16bitタイマがありますが、Duty比の指定は8bit(=256段階)あれば十分なので8bitタイマであるTimer/Counter0を使います。タイマの動作モードはFast PWM Mode (WGM2:0=3)を使います。このモードはパルス波周期が256 timer clock固定で、Duty比はOCR0Aレジスタで指定できます。Timer clockを1MHzにすると、LEDの点滅回数は1秒間に3,900回ぐらいになります。タイマで作ったPWM信号はOC0A(PD6ピン)に出力されます。

LEDとPD6ピンの接続


 参考文献2を見るとマイコンのPB5端子の先にLEDが接続されています。PD6端子でLEDを制御するため、PD6端子とPB5端子を接続する必要があります。どちらの端子もマイコンボードのコネクタに接続されているので、コネクタ上で接続するのが簡単です。
図1 コネクタ上の接続(PB5端子とPD6端子)

 なお、PD6端子とPB5端子がショートしないようにプログラム上でPB5端子をInputに設定しておきます。

プログラム


 例によってdebian環境(avr-gcc+avr-libc)で作成しています。

リスト1 main.c

/*
 * LED点滅プログラム(PWM制御)
 *
 * For AE-ATmega borad
 *
 * Ver0.1 2013/04/12
 */

/*
 * AE-ATmega boardはPORTB bit5にLEDが接続されている。
 * このLEDをPWM制御で点灯させるため、タイマ出力であるPORTD Bit6を
 * LEDに接続する。(ショートしないようにPORTB bit5は入力モードに
 * しておく)
 */

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

int main() {
  unsigned char i = 0;

  DDRB = 0x00;          // PORTB bit5を入力モードにする
  DDRD = _BV(DD6);      // PORTD bit6を出力モードにする

  /* Set 8-bit Timer Register */
  TCCR0A = _BV(COM0A1) | _BV(WGM01) | _BV(WGM00);
  TCCR0B = _BV(CS00);

  /* タイマ設定
   * clkI/O      : 1MHz (= 内蔵OSC 8MHz + CLKDIV8)
   * プリスケーラ: なし
   * モード      : Mode3 (高速PWM/0xFF)
   * OC0A端子    : 非反転モードで使用
   */

  while(1) {
    while(i<0xFF) {     // 2mSec間隔で輝度を上げていく
      OCR0A = ++i;
      _delay_ms(2);
    }
    _delay_ms(1000);    // 最高輝度で1秒保持

    while(i>0x00) {     // 2mSec間隔で輝度を下げていく
      OCR0A = --i;
      _delay_ms(2);
    }
    _delay_ms(1000);    // 最低輝度で1秒保持
  }
}

動画1 点滅の様子

参考文献


  1. Atmel ATmega48P/V 88P/V 168P/V datasheet
  2. ATmega168/328マイコンボード回路図

【備忘録】時系列データの編集方法(R言語, tidyverse)

TimeSeries.knit 1 サンプルデータ作成 2 日付単位に集計する 2.1 月毎集計 2.2 四半期毎集計 ...