--- Raspberry Pi ---
2016年05月28日(土)
Raspberry PiでAR8600 MK2をリモート操作
ネットをぶらぶらしてて、AR8600 MK2をRaspberry Piから操作できるツールを見つけた。
しかも、AORのサイトで。

http://www.aorja.com/receivers/ar8600mk2.html


仕組みは、Raspberry PiとAR8600 MK2をRS232Cケーブルで接続してRaspberry Piからコマンドを送って制御する。
音声はAR8600 MK2の出力をAudioケーブルでRaspberry Piへ入れる。
これらの処理をサービスとして起動してクライアントソフトからRaspberry PiにアクセスしてAR8600 MK2を操作したり音声を聞いたりする。
クライアントソフトはJAVAで作られてるんで、WindowsやLinuxで使える。

必要なものは全部揃ってるんで、さっそく試してみることに。
必要なもの...
 AR8600 MK2
 Raspberry Pi・・・今回はPi2を使用。
 USB HUB
 Serial to USB converter・・・Arvel(Buffalo) SRC06-USB
 Jack 3.5mm male-male audio cable
 Mono-ST変換アダプタ
 USB audio adapter・・・PLANEX PL-US35AP

Serial to USB converterは、これ一つ持っているとメチャメチャ重宝するかな。
十数年前から仕事,プライベートで愛用している。。。
(写真は、ねじ止めの出っ張りが干渉するんで中継を付けてある)

USB audio adapterは、こちら。
こっちも、Raspberry Piで音を扱おうとすると必需品かも。

PLANEX PL-US35APは、Raspberry PiでSpec-Recorderを動かした時に使えることを確認済み。
 ↓を参照してね。
 ラズパイ2で流星の電波観測(HRO)


肝心のRaspberry Piへのインストールは、添付のインストラクションマニュアル(RPI_AR8600MK2_setup_instructions.txt)どおり。

まずは、とりあえず、SRC06-USB(005)とPL-US35AP(006)が認識されていることを確認。
------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 001 Device 006: ID 0d8c:0008 C-Media Electronics, Inc.
pi@raspberrypi2 ~/Tools/aorlan $
------------------------------------------
ダウンロードしたファイルを解凍した結果
------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ ls -l
合計 68
-rwxr-xr-x 1 pi pi   142  3月  3  2014 aorlan
-rwxr-xr-x 1 pi pi 50879  3月 31  2014 arlan
-rwxr-xr-x 1 pi pi    46  3月 11  2014 chk_dev.sh
-rw-r--r-- 1 pi pi    95  3月 31  2014 lanserv.conf
-rwxr-xr-x 1 pi pi    84  3月 11  2014 oss_inst.sh
pi@raspberrypi2 ~/Tools/aorlan $
------------------------------------------
インストール
------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ ./oss_inst.sh
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  alsaplayer-common alsaplayer-gtk
以下のパッケージが新たにインストールされます:
  alsa-oss alsaplayer-common alsaplayer-gtk alsaplayer-oss oss-compat
  oss-preserve
アップグレード: 0 個、新規インストール: 6 個、削除: 0 個、保留: 127 個。
451 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,318 kB のディスク容量が消費されます。
続行しますか [Y/n]? Y
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main alsa-oss armhf 1.0.25-1 [32.7 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main alsaplayer-oss armhf 0.99.80-5.1 [31.4 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main alsaplayer-gtk armhf 0.99.80-5.1 [194 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ wheezy/main alsaplayer-common armhf 0.99.80-5.1 [179 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ wheezy/main oss-preserve armhf 1.1-6 [9,128 B]
取得:6 http://mirrordirector.raspbian.org/raspbian/ wheezy/main oss-compat armhf 2+deb7u2 [5,072 B]
451 kB を 7秒 で取得しました (62.8 kB/s)
以前に未選択のパッケージ alsa-oss を選択しています。
(データベースを読み込んでいます ... 現在 91501 個のファイルとディレクトリがイン ストールされています。)
(.../alsa-oss_1.0.25-1_armhf.deb から) alsa-oss を展開しています...
以前に未選択のパッケージ alsaplayer-oss を選択しています。
(.../alsaplayer-oss_0.99.80-5.1_armhf.deb から) alsaplayer-oss を展開しています...
以前に未選択のパッケージ alsaplayer-gtk を選択しています。
(.../alsaplayer-gtk_0.99.80-5.1_armhf.deb から) alsaplayer-gtk を展開しています...
以前に未選択のパッケージ alsaplayer-common を選択しています。
(.../alsaplayer-common_0.99.80-5.1_armhf.deb から) alsaplayer-common を展開して います...
以前に未選択のパッケージ oss-preserve を選択しています。
(.../oss-preserve_1.1-6_armhf.deb から) oss-preserve を展開しています...
以前に未選択のパッケージ oss-compat を選択しています。
(.../oss-compat_2+deb7u2_armhf.deb から) oss-compat を展開しています...
man-db のトリガを処理しています ...
menu のトリガを処理しています ...
mime-support のトリガを処理しています ...
desktop-file-utils のトリガを処理しています ...
alsa-oss (1.0.25-1) を設定しています ...
alsaplayer-oss (0.99.80-5.1) を設定しています ...
alsaplayer-gtk (0.99.80-5.1) を設定しています ...
alsaplayer-common (0.99.80-5.1) を設定しています ...
oss-preserve (1.1-6) を設定しています ...
oss-compat (2+deb7u2) を設定しています ...
menu のトリガを処理しています ...
pi@raspberrypi2 ~/Tools/aorlan $
------------------------------------------
デバイスファイルができていることを確認。
------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ ./chk_dev.sh
crw-rw---T 1 root dialout 188, 0  1月  1  1970 /dev/ttyUSB0
crw-rw---T+ 1 root audio 14, 19  5月 15 10:08 /dev/dsp1
pi@raspberrypi2 ~/Tools/aorlan $
------------------------------------------
ここで、AR8600 MK2にアクセスするシリアル通信の設定(lanserv.conf)を変更。
------------------------------------------
#-*- make-backup-files: nil -*-
tcpport=48752
udpport=48752
timeout=15
bps=19200          <--- これを9600に。
user=a
pass=b
------------------------------------------
------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ more lanserv.conf
#-*- make-backup-files: nil -*-
tcpport=48752
udpport=48752
timeout=15
bps=9600
user=a
pass=b
pi@raspberrypi2 ~/Tools/aorlan $
------------------------------------------
ということで準備完了。で、さっそく起動。。

が...そう簡単にはいかへんかぁ。。
エラーでサービスを起動できてへんやん。。
------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ ./aorlan
mkfifo(), vfifo: File exists
mkfifo(), sfifo: File exists
audio: Invalid argument
pi@raspberrypi2 ~/Tools/aorlan $
------------------------------------------
Audioのデバイスがマズイみたいやけど、デバイスファイルもあるし。。

どうやって起動してるんか、aorlanの中を見てみると...
------------------------------------------
#!/bin/sh
export TERM=vt102
export SHELL=/bin/ash
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
export HOME=/root

./arlan /dev/ttyUSB0 /dev/dsp1
------------------------------------------
試しにAuidoのデバイスファイルを変えてやってみた。
------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ ./arlan /dev/ttyUSB0 /dev/dsp
mkfifo(), vfifo: File exists
mkfifo(), sfifo: File exists
sfd=10, nsFd=13, ncFd=19, audio=11, udp=12
------------------------------------------
無事、起動。。

自分の環境に合わせてカスタムするんは当然やろ?!ってことやね。。
変更したファイルは↓。
lanserv.conf
 ボーレート 19200を9600に変更。
aorlan
 arlanの引数の/dev/dsp1を/dev/dspに変更。
chk_dev.sh
 ついでに/dev/dspのチェックを追加。

サービスも起動できたんで、クライアントのPCから使ってみる。
今回は、Windows10 (64bit)のPCを使用。
「AR8600Edev.jar」をダブルクリック。

------------------------------------------
pi@raspberrypi2 ~/Tools/aorlan $ ./aorlan
mkfifo(), vfifo: File exists
mkfifo(), sfifo: File exists
sfd=10, nsFd=13, ncFd=19, audio=11, udp=12
USER a
PASS b
200 command=e`, command_args=`
250 set escchar `
200 command=g3, command_args=3
100 command ignored, because RPI has no appropriate hardware.
200 command=s8000, command_args=8000
200 command=f3, command_args=3
100 command ignored, because RPI has no appropriate hardware.
200 command=t1, command_args=1
270 timestamp setting, arg=1.
200 command=l1, command_args=1
260 lm_value setting, arg=1.
200 command=s8000, command_args=8000
200 command=f3, command_args=3
100 command ignored, because RPI has no appropriate hardware.
200 command=b1400, command_args=1400
240 set abuf_siz 1400
200 command=p1, command_args=1
UDPrec: remoteAddress = 192.168.0.3
210 start rec audio.
audio:abuf_size = 4096
 real:abuf_size = 1400
------------------------------------------

音は結構悪いかも。。
それに、残念やけど、自分の環境やと安定して動作せぇへんかった。
数分使ってたら、Raspberry Piがハングアップ?してPingすら通らへんようになった。
なんか設定マズイんかなぁ。

ということで、使うのを断念して。これまでどおりの使い方で。。

必要なものはほぼ同じ。
 AR8600 MK2
 USBデバイスサーバー・・・Silex SX-DS-4000U2
 USB HUB
 Serial to USB converter・・・Arvel(Buffalo) SRC06-USB
 Jack 3.5mm male-male audio cable
 Mono-ST変換アダプタ
 USB audio adapter・・・PLANEX PL-US35AP
ソフトは、WiondowsのAR86ctrlを使用。

http://ar86ctrl.kbox14.de/

単純にシリアル通信と音声をUSBデバイスサーバーにつなげて、LANに流すだけ。
そしたらLAN経由でAR8600 MK2を操作できる。




2015年11月26日(木)
$5 PC ... Raspberry Pi Zero
Raspberry Pi Zeroというのが出るみたい。

Raspberry Pi Zero: the $5 computer
https://www.raspberrypi.org/blog/raspberry-pi-zero/


サイズ的には今流行りのStick PCと同じくらいなんやろか。

ハードの知識がない自分にとっては、格安のハードが出てくれるのはウレシイ。
例えば、USBカメラをパンチルトできるWEBカメラにしたり、センサー端末にしてアチコチに設置したり...安いんで単機能なデバイスとしてイロイロな使い方ができる。と思う。。
2015年06月21日(日)
Raspberry Pi 2でWindows 10 IoTを動かす
やっとRaspberry Pi 2でWindows 10 IoT Core Insider Previewを動かすことができた。

動かしてみた感想は、組み込み向けだけあって、5000円でWindows 10のPCが手に入るというんとはちゃうかった。
用途としては、ChumbyのようなNetworkガジェットとか、リモートコントロール用の制御ボックスとか、そんな分野に使うためのもんみたいや。
それやったら、わざわざWindowsである必要ないやん!とか思うけど、たぶん組み込み経験がないVisual StudioでPCソフトを作っている人たちにとってのメリットなんかなぁと思う。
そやけど、これをメリットと感じるかデメリットと感じるかは...


事前準備として、Windows 10のPCを用意して、そのPCにVisual Studioをインストール。
Visual Studioは、無料のVisual Studio Community Edition 2015 RCを使った。

https://www.visualstudio.com/ja-jp/downloads/visual-studio-2015-downloads-vs.aspx


で、ここから本題...

手順は、公式サイトに書かれている内容そのもので、だいたいこんな↓感じ。。

http://ms-iot.github.io/content/en-US/win10/SetupRPI.htm

1. PCでの操作:Webブラウザで
(1) Microsoft Connectにログイン。
(2) Windows Embedded Pre-Release Programsのアンケートに答える。
   これでダウンロードファイルが表示されるようになる。
(3) Windows 10 IoT Core Insider Preview Image for Raspberry Pi 2 をダウンロード。

2. PCでの操作:Explorerで
(1) ダウンロードしたファイル Windows_IoT_Core_RPI2_BUILD.zip を解凍。
   Flash.ffu
    Windows 10のイメージ
   WindowsDeveloperProgramForIoT.msi
    Raspberry Pi 2を管理するPC側のツール(WinIoTCoreWatcher)

----------------------------------------------------
C:\Temp のディレクトリ

2015/06/13  14:30    <DIR>          .
2015/06/13  14:30    <DIR>          ..
2015/06/13  14:30       844,890,112 Flash.ffu
2015/06/13  14:30            26,002 license.rtf
2015/06/13  14:30               767 ReadMe.txt
2015/06/13  14:30         4,186,112 WindowsDeveloperProgramForIoT.msi
               4 個のファイル         849,102,993 バイト
               2 個のディレクトリ  48,683,806,720 バイトの空き領域

C:\Temp>
----------------------------------------------------


3. PCでの操作:DOS窓で
(1) SDカードをPCに装着。
(2) DOS窓を管理者権限で起動して手順通りにコマンドを入力する。
   この操作でSDカードのDiskナンバーを確認。

----------------------------------------------------
C:\Temp>diskpart

Microsoft DiskPart バージョン 10.0.10130

Copyright (C) 1999-2013 Microsoft Corporation.
コンピューター: xxxxx

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン       74 GB  1024 KB
  ディスク 1    オンライン      931 GB      0 B
  ディスク 2    メディアなし       0 B      0 B
  ディスク 3    メディアなし       0 B      0 B
  ディスク 4    メディアなし       0 B      0 B
  ディスク 5    メディアなし       0 B      0 B
  ディスク 6    オンライン     7600 MB      0 B

DISKPART> exit

DiskPart を終了しています...

C:\Temp>
----------------------------------------------------


(3) 解凍したフォルダーに移動して、指定のコマンドを入力。
   flash.ffuがイメージなんで、これをSDカードに書き込む。
   ディスク 6 がSDカードのディスク。

----------------------------------------------------
C:\Temp>dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDrive6 /SkipPlatformCheck

展開イメージのサービスと管理ツール
バージョン: 10.0.10130.0

Applying image
[==========================100.0%==========================]
操作は正常に完了しました。

C:\Temp>
----------------------------------------------------


4. Raspberry Pi 2での操作など
(1) SDカードをRaspberry Pi 2に装着して、Raspberry Pi 2を起動。
   HDMIでモニタを接続しておく。マウスもついでに。
(2) 起動が完了するのに5分以上かかった気がする。それほど待った。。
   IP アドレスはDHCPで取得するんでルーターとかでDHCPを活かしておく。
(3) 起動完了後に操作できたんは、タイムゾーンを変更することくらい。
   ShutdownとRebootも操作できたげと、ShutdownしてもRebootする。。
   PowershellからShutdownコマンドを投げればShutdownできるのかも。。

これで無事、Raspberry Pi 2でWindows 10 IoT Core Insider Previewが動作してることになるけど、このままやと何もできへん。



で、次は...

5. PCでの操作:WindowsDeveloperProgramForIoT.msiをインストール
   これでWinIoTCoreWatcherというツールが使えるようになる。

6. PCでの操作:WinIoTCoreWatcherを使う
   これを起動すると接続しているRaspberry Pi 2の情報が表示される。
    右クリックして表示されるメニューからあれこれアクセス。
    アクセス時にIDとPWを聞かれたら、以下を入力。
     ID・・・minwinpc\Administr
     PW・・・p@ssw0rd



(1) Web Browser Here



(2) Open Network Share



(3) Telnet Here....何も表示されへんかった。。

7. PCでの操作:PowerShellを使うとリモートであれこれできるみたい。
2015年03月08日(日)
ラズパイ2で流星の電波観測(HRO)
Raspberry Pi 2の性能を活かして、電波観測(HRO)の環境を構築した。

インストールの練習を兼ねて、Linuxで流星の電波観測(HRO)で書いたように、Linux PCに観測用のソフト「Spec-Recorder」をインストールして動作を確認。
そやから、今回は安心してRaspberry Pi 2へインストール。
これで、わざわざ高いPCを使う必要はないし、格安でHROの環境を構築できる。

インストール方法は、添付のRead me.pdfに書かれているとおり。
sr.confファイルも修正。



動作結果は、下のとおり。どこか設定が悪いのか、Warningが出てるけど、とりあえず放置。。
-----------------------------------
$ python main.py
HTTP server is unavailable
del_ogg is unavailable
filename will not be written
CSV file will be saved
data will be analyzed
OS = Linux,BSD,etc
Spec_Recorder Ver.1.21
Executed freq_exec.py
executed freq_send_mail.py
Audio fileneme is ocv1503081615.ogg
Waiting 5 minutes
Filename is ocv1503081615.ogg
Recording start
sox WARN alsa: can't encode 0-bit Unknown or not applicable

Input File     : 'default' (alsa)
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:00:58.88 [00:00:00.00] Out:2.82M [   ===|===   ]  Clip:0  1
In:0.00% 00:01:09.03 [00:00:00.00] Out:3.31M [     =|=     ]  Clip:0  1
In:0.00% 00:01:19.19 [00:00:00.00] Out:3.80M [  -===|===-  ]  Clip:0  1
In:0.00% 00:01:29.26 [00:00:00.00] Out:4.28M [  -===|===-  ]  Clip:0  1
:
-----------------------------------

今回もFM放送で動作を確認。



Raspberry PiにはAudio入力の端子はついてないんで、市販のUSB Audioを追加。
たまたま昔買って手元にあったPLANEX PL-US35APを使っているサイトがあったんで、その通りに設定。
参考にしたサイト
http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/RaspberryPi/%C6%FC%CB%DC%B8%EC%B2%BB%C0%BC%C7%A7%BC%B1/

-----------------------------------
pi@raspberrypi2 ~ $ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0d8c:0008 C-Media Electronics, Inc. 
pi@raspberrypi2 ~ $ cat /proc/asound/modules 
 0 snd_usb_audio
 1 snd_bcm2835
pi@raspberrypi2 ~ $ amixer
Simple mixer control 'PCM',0
  Capabilities: pvolume pswitch pswitch-joined penum
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 151
  Mono:
  Front Left: Playback 44 [29%] [-20.13dB] [on]
  Front Right: Playback 44 [29%] [-20.13dB] [on]
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined penum
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
  Capabilities: pswitch pswitch-joined penum
  Playback channels: Mono
  Mono: Playback [on]
-----------------------------------

2015年03月02日(月)
やっと到着。 ラズパイ2
一月遅れになったけど、ようやくラズパイ2が届いた。

買ぅて何に使うん? っていういつもの無意味な自問を繰り返してる間に在庫がなくなってて。
で、このままやといつになっても買われへんかもと思って、とりあえず発注しといたんが、3週間経った今日、ようやく到着。

到着を待ってる間に使い道も決まって、ちょっと残念。
Windows10が出たらこれで遊ぼうと思って、Windows Developer Programにも登録してるのに。。
落ち着いたら、もう一台買う?!

Raspberry Pi 2 Model B

2014年11月09日(日)
Raspberry Pi にLCD液晶を付けて時計を作ってみた
LCD液晶の動作を確認するために時計のサンプルを作ってみた。
使用したLCD液晶は、トラ技2014年7月号に掲載されていたもの。

ストロベリー・リナックス http://strawberry-linux.com/

I2C低電圧キャラクタ液晶モジュール(16x2行) メーカー品番:SB1602B
http://strawberry-linux.com/catalog/items?code=27001

使い方は、ストロベリー・リナックスで公開されている資料と
使用されているコントローラー(ST7032i)のデータシートを参考に。



I2Cのアドレスを確認

--------------------------------------------
pi@raspberrypi ~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi ~ $
--------------------------------------------


そうそう、I2Cを使うのに、libi2c-dev だけではダメみたいで、i2c-tools もインストールしてた。

下のソースが時計のサンプル。
アイコン表示の動作を確認するために、26秒間だけ動作。

ソース

--------------------------------------------
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <wiringPiI2C.h>

#define LCD_ADDRESS 0x3e
#define LCD_CMDADRS 0x00
#define LCD_DATADRS 0x40

// Prototype
int lcd_init(int fd);
int lcd_write(int fd, char* buf, int line);
int lcd_clear(int fd);
int lcd_icon(int fd, int num, int disp);

/**
 * main
 *  Initialize ST7032i (LCD Controller)
 *  ICON Control
 *  Write DATE,TIME
 */
int main(void)
{
	int fd_lcd;           // ST7032i (LCD Controller)
	char disp_buf[17];    // Display Buffer
	int icon_num;         // ICON Number
	int icon_disp;        // ICON (1:display 0:clear)

	int loop;

	time_t timer;
	struct tm *local;
	char wday_buf[7][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

	/** Device open */
	if((fd_lcd = wiringPiI2CSetup(LCD_ADDRESS)) == -1) { return 1; }

	/** Initialize ST7032i (LCD Controller) */
	if (lcd_init(fd_lcd) == -1) { return 1; }

	icon_num  = 0;
	icon_disp = 1;               // ICON display
	for (loop=0; loop<26; loop++) {
		/** ICON */
		if (loop == 13) {        // 0-12:Display 13-:Clear
			icon_num  = 0;
			icon_disp = 0;       // ICON clear
		}
		lcd_icon(fd_lcd, icon_num, icon_disp);
		icon_num++;

		/** CLOCK */
		timer = time(NULL);
		local = localtime(&timer);
		sprintf(disp_buf,"%4d/%02d/%02d %s",
		        local->tm_year+1900, local->tm_mon+1, local->tm_mday, wday_buf[local->tm_wday]);
		lcd_write(fd_lcd, disp_buf, 1);

		sprintf(disp_buf,"%02d:%02d:%02d",
		        local->tm_hour, local->tm_min, local->tm_sec);
		lcd_write(fd_lcd, disp_buf, 2);

		sleep(1);        // 1sec
	}

	/** LCD clear */
	lcd_clear(fd_lcd);

	return 0;
}

/**
 * sub:lcd_init
 *  ex. ST7032i dataseet (Command , Initilaize flowchart)
 */
int lcd_init(int fd)
{
	delay(40);                                          // 40msec

	/** Function Set (8bit bus mode, 2-line mode,normal font,normal instruction mode) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00111000);
	delayMicroseconds(30);                              // 26.3usec

	/** Function Set (IS=1 : extension instruction mode) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00111001);
	delayMicroseconds(30);                              // 26.3usec

	/** Internal OSC frequency (BS=Low, Freq=183Hz, VDD=3.0V) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00010100);
	delayMicroseconds(30);                              // 26.3usec

	/** Contrast set (lower 4bit) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b01111010);
	delayMicroseconds(30);                              // 26.3usec

	/** Power (ICON ON/Boost ON/Contrast higher 2bit) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b01011111);
	delayMicroseconds(30);                              // 26.3usec

	/** Follower control (Fon ON/Rab1 ON) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b01101010);
	delay(200);                                         // 200msec (for Power stable)

	/** Display ON/Cursor ON/Blink ON */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00001111);
	delayMicroseconds(30);                              // 26.3usec

	/** Clear Display */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00000001);
	delay(2);                                           // 2msec

	/** Entry Mode Set (Cursor moves to right) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00000110);
	delayMicroseconds(30);                              // 26.3usec

	return 0;
}

/**
 * sub:lcd_write
 */
int lcd_write(int fd, char* buf, int line)
{
	int cnt;
	char addr;

	/** Set DDRAM Address */
	if (line == 1) {
		/** Line 1 (0x00) */
		addr = 0b10000000;
	} else {
		/** Line 2 (0x40) */
		addr = 0b11000000;
	}
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, addr);

	/** Write Data To DDRAM */
	for (cnt=0; buf[cnt]!=0; cnt++) {
		wiringPiI2CWriteReg8(fd, LCD_DATADRS, buf[cnt]);
	}

	return 0;
}

/**
 * sub:lcd_clear
 */
int lcd_clear(int fd)
{
	/** Clear Display */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00000001);
	delay(2);                                           // 2msec

	/** Return Home */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00000011);
	delay(2);                                           // 2msec

	return 0;
}

/**
 * sub:lcd_icon
 */
int lcd_icon(int fd, int num, int disp)
{
	char icon;

	// ICON address table (Lower 4bit)      OFFSET : ADDR: BIT : ICON
	char icon_addr_buf[13] = { 0x00,          // 0 : 00H : S1  : ANT
	                           0x02,          // 1 : 02H : S11 : TEL
	                           0x04,          // 2 : 04H : S21 : SP
	                           0x06,          // 3 : 06H : S31 : CON
	                           0x07,          // 4 : 07H : S36 : UP
	                           0x07,          // 5 : 07H : S37 : DN
	                           0x09,          // 6 : 09H : S46 : KEY
	                           0x0b,          // 7 : 0BH : S56 : ?
	                           0x0d,          // 8 : 0DH : S66 : BAT
	                           0x0d,          // 9 : 0DH : S67 : BAT
	                           0x0d,          // A : 0DH : S68 : BAT
	                           0x0d,          // B : 0DH : S69 : BAT
	                           0x0f           // C : 0FH : S76 : ?
	                         };

	// ICON bits table (Lower 5bit)         OFFSET : ADDR: BIT : ICON
	char icon_bits_buf[13] = { 0b00010000,    // 0 : 00H : S1  : ANT
	                           0b00010000,    // 1 : 02H : S11 : TEL
	                           0b00010000,    // 2 : 04H : S21 : SP
	                           0b00010000,    // 3 : 06H : S31 : CON
	                           0b00010000,    // 4 : 07H : S36 : UP
	                           0b00001000,    // 5 : 07H : S37 : DN
	                           0b00010000,    // 6 : 09H : S46 : KEY
	                           0b00010000,    // 7 : 0BH : S56 : ?
	                           0b00010000,    // 8 : 0DH : S66 : BAT
	                           0b00001000,    // 9 : 0DH : S67 : BAT
	                           0b00000100,    // A : 0DH : S68 : BAT
	                           0b00000010,    // B : 0DH : S69 : BAT
	                           0b00010000     // C : 0FH : S76 : ?
	                         };

	if (num > 12) { return 1; }

	/** Function Set (IS=1 : extension instruction mode) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00111001);
	delayMicroseconds(30);                              // 26.3usec

	/** Set ICON Address */
	icon = 0b01000000 | icon_addr_buf[num];             // Lower 4bit
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, icon);
	delayMicroseconds(30);                              // 26.3usec

	/** Write Data To RAM */
	if (disp == 1) {
		/** ICON display */
		icon = icon_bits_buf[num];
	} else {
		/** ICON clear */
		icon = icon_bits_buf[num] ^ icon_bits_buf[num];
	}
	icon = 0b00000000 | icon;                           // Lower 5bit
	wiringPiI2CWriteReg8(fd, LCD_DATADRS, icon);

	/** Function Set (IS=0) */
	wiringPiI2CWriteReg8(fd, LCD_CMDADRS, 0b00111000);
	delayMicroseconds(30);                              // 26.3usec

	return 0;
}
--------------------------------------------

--------------------------------------------
gcc -o lcdsample lcdsample.c -l wiringPi
--------------------------------------------



2014年11月03日(月)
Raspberry Pi にRTCを追加
Raspberry Pi単体で動くようにしようとLCD液晶とRTCを追加した。

購入したLCD液晶はトラ技2014年7月号に載ってたのを。
RTCも同じサイトで扱っていたもの。

ストロベリー・リナックス http://strawberry-linux.com/

M41T62 リアルタイムクロック(RTC)モジュール
http://strawberry-linux.com/catalog/items?code=12062




M41T62のドライバーを確認してみると...ない?!

--------------------------------------------
pi@raspberrypi /lib/modules/3.10.25+/kernel/drivers/rtc $ ls -l
合計 316
-rw-r--r-- 1 root root  7001  1月  8  2014 rtc-bq32k.ko
-rw-r--r-- 1 root root 12226  1月  8  2014 rtc-ds1305.ko
:
:
-rw-r--r-- 1 root root  8048  1月  8  2014 rtc-isl12022.ko
-rw-r--r-- 1 root root 15377  1月  8  2014 rtc-isl1208.ko
-rw-r--r-- 1 root root 10558  1月  8  2014 rtc-m41t80.ko
-rw-r--r-- 1 root root  8059  1月  8  2014 rtc-m41t93.ko
-rw-r--r-- 1 root root  7363  1月  8  2014 rtc-m41t94.ko
-rw-r--r-- 1 root root  7587  1月  8  2014 rtc-max6900.ko
:
:
-rw-r--r-- 1 root root  9175  1月  8  2014 rtc-s35390a.ko
-rw-r--r-- 1 root root 12472  1月  8  2014 rtc-x1205.ko
pi@raspberrypi /lib/modules/3.10.25+/kernel/drivers/rtc $
--------------------------------------------


ネットで検索してみると、どうやらrtc-m41t80が対応しているみたい。
http://code.metager.de/source/xref/raspberrypi/linux/drivers/rtc/rtc-m41t80.c

M41T62を認識できてるか確認したら...出た!
--------------------------------------------
pi@raspberrypi ~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi ~ $
--------------------------------------------


ということで、M41T62をRTCとして設定。
--------------------------------------------
pi@raspberrypi / $ sudo modprobe rtc-m41t80
pi@raspberrypi / $
pi@raspberrypi / $ sudo su
root@raspberrypi:/# echo m41t62 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
root@raspberrypi:/#
--------------------------------------------


現在の時刻をハードウェアクロックに設定。
--------------------------------------------
pi@raspberrypi / $ date
2014年 10月  5日 日曜日 12:00:08 JST
pi@raspberrypi / $ sudo hwclock -w
pi@raspberrypi / $ sudo hwclock -r
2014年10月05日 12時01分58秒  -0.057212 seconds
pi@raspberrypi / $
--------------------------------------------


Raspberry Pi起動時にハードウェアクロックからシステムクロックを設定するように、/etc/rc.lodalに以下を追加。
--------------------------------------------
echo m41t62 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 1
hwclock -s
--------------------------------------------


問題は、NTPサーバーで時刻校正した結果をハードウェアクロックに反映する仕組みになってないってこと。



LCD液晶は、そのうちに。
2014年09月23日(火)
Raspberry Pi にレベルメータ
センサーとかで読み取った内容を表示しようと、レベルメータを付けてみた。

使えそうなLEDを探してたら10セグメントのLEDが見つかって、その隣にレベルメータICってものが出てた。
で、これらを使おうと思って必要な部品を探そうとしたら、キットも売ってた。

あれこれ部品を買い集めるのも面倒なんで、このキットを買って、超簡単にレベルメータを実装。

コンパクトレベルメータキット SK-LV39
http://eleshop.jp/shop/g/g7AD113/



GPIO 18はH/W PWMとして使えるんで、この信号をレベルメータに入れる。
レベル調整は、キット基板上の半固定抵抗で。

--------------------------------------------
#include <wiringPi.h>
#define LED_PIN 1         // GPIO 18
#define DELAY_TIME 500    // usec
#define LOOP_CNT 10

int main(void)
{
	int pwm;
	int cnt;

	if(wiringPiSetup() == -1) return 1;
	pinMode(LED_PIN, PWM_OUTPUT);

	for (cnt=0; cnt<LOOP_CNT; cnt++) {
		// Up
		for (pwm=0; pwm<=1023; pwm++) {
			pwmWrite(LED_PIN, pwm);
			delayMicroseconds(DELAY_TIME);
		}
		// Down
		for (pwm=1023; pwm>=0; pwm--) {
			pwmWrite(LED_PIN, pwm);
			delayMicroseconds(DELAY_TIME);
		}
	}
	return 0;
}
--------------------------------------------



2014年08月17日(日)
Raspberry Pi その後
Raspberry Piを買ってから2ヶ月。
ほとんど触ることもなく。

Raspberry Pi以降にインストールしたもの。


・I2C通信を行うためのライブラリ。
--------------------------------------------
pi@raspberrypi ~ $ sudo apt-get install libi2c-dev
--------------------------------------------

・GPIOを制御するためのC言語ライブラリ。
--------------------------------------------
pi@raspberrypi ~/Workspace $ git clone git://git.drogon.net/wiringPi
pi@raspberrypi ~/Workspace $ cd wiringPi/
pi@raspberrypi ~/Workspace/wiringPi $ ./build
--------------------------------------------

・赤外線リモコンを使用するためのライブラリ。
--------------------------------------------
pi@raspberrypi ~ $ sudo apt-get install lirc
--------------------------------------------
Raspberry Pi起動時にlircを起動するよう設定

変更するファイル:
  /etc/modules
変更内容:
  ファイルの最後にlirc〜の2行を追加。
  (GPIO 22,23を使用した場合)
--------------------------------------------
pi@raspberrypi /etc $ more modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
lirc_dev
lirc_rpi gpio_in_pin=23 gpio_out_pin=22
pi@raspberrypi /etc $
--------------------------------------------

で、これらを使って何種類かの機能を実装してみた。


・shutdownボタン

1秒間隔でスイッチの状態をチェックして3秒間の長押しでシャットダウン。

rc.localからバックグラウンドで起動。
--------------------------------------------
/home/pi/Workspace/shutdown/shutdown_btn &
--------------------------------------------
ソース
--------------------------------------------
#include <wiringPi.h>
#include <stdio.h>
#define BUTTON_PIN 0    // GPIO 17
#define SLEEP_TIME 1    // sec
#define SHUTDOWN_CNT 3

int main(void) {
    int dat = 0;
    int cnt = 0;

    if(wiringPiSetup() == -1) return 1;
    pinMode(BUTTON_PIN, INPUT);

    while(1) {
        dat = digitalRead(BUTTON_PIN);
        if(dat == 0) {
            cnt = 0;
        } else {
             cnt++;
             if(cnt >= SHUTDOWN_CNT) {
//                 printf("Shutdown!!dat=%d , cnt=%d\n", dat, cnt);
                 system("shutdown -h now");
                 break;
             }
        }
//        printf("dat=%d , cnt=%d\n", dat, cnt);
        sleep(SLEEP_TIME);
    }
    return 0;
}
--------------------------------------------
デバッグ時の状態
--------------------------------------------
pi@raspberrypi ~/Workspace/shutdown $ sudo ./shutdown_btn
dat=0 , cnt=0
dat=0 , cnt=0
dat=0 , cnt=0
dat=0 , cnt=0
dat=1 , cnt=1
dat=1 , cnt=2
Shutdown!!dat=1 , cnt=3
--------------------------------------------

・温湿度モニタ

DHT11温湿度モジュールを使ったて温湿度モニタ。


ソース

こちらのをそのまま使用。(GPIOは変更)
http://www.rpiblog.com/2012/11/interfacing-temperature-and-humidity.html

実行中の表示
--------------------------------------------
pi@raspberrypi ~/Workspace/dht11 $ sudo ./dht11
Interfacing Temperature and Humidity Sensor (DHT11) With Raspberry Pi
Humidity = 38.0 % Temperature = 29.0 *C (84.2 *F)
Humidity = 39.0 % Temperature = 28.0 *C (82.4 *F)
Humidity = 39.0 % Temperature = 28.0 *C (82.4 *F)
:
--------------------------------------------

・赤外線リモコン

温湿度をモニタして扇風機やエアコンを制御するのが目的やけど、リモコンを覚えさせることができへんかった。
TVは制御できるのに...


GreenFanの電源スイッチをONした時の受信結果
--------------------------------------------
pi@raspberrypi ~ $ mode2 -d /dev/lirc0
space 2993751
pulse 8957
space 4557
pulse 553
space 583
pulse 533
 :
 :
space 1695
pulse 573
^C
pi@raspberrypi ~ $
--------------------------------------------
受信はできてるように見えるのに、覚えさせようとしたら、タイムアウトになる。。


・無線LANモニタ

手元にあったUSBの無線LANモジュール(コレガ CG-WLUSB300AGN)をRaspberry Piに挿してみたら使えたんで、アクセスポイントのモニタソフトを作成。

無線LANモジュールの認識状況
--------------------------------------------
pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 07aa:003f Corega K.K. CG-WLUSB300AGN
pi@raspberrypi ~ $
--------------------------------------------
モニタソフトの実行結果 (同じ内容をファイルへ保存)
--------------------------------------------
pi@raspberrypi ~/Workspace/wlanmon $ sudo ./wlanmon
2014/08/16 21:24:09
Cell,Address,Ch,Freq(GHz),Quality(%),Signal(dBm),Enc,ESSID,Cipher,Auth
01,70:73:CB:BB:xx:xx,36,5.18,34,-86,on,"xxxxxxxxxxxxx",CCMP,PSK
02,70:73:CB:BB:yy:yy,11,2.462,42,-80,on,"yyyyyyyyyyyyy",CCMP,PSK
03,00:01:8E:9F:zz:zz,1,2.412,40,-82,on,"zzzzzzzzzzzz",,
04,00:1D:73:40:**:**,2,2.417,40,-82,on,"************",TKIP,PSK
05,28:C6:8E:0F:**:**,48,5.24,90,-47,on,"",CCMP,PSK
06,00:1D:73:A6:**:**,2,2.417,34,-86,on,"************",TKIP,PSK
07,34:76:C5:1B:**:**,1,2.412,42,-80,on,"************",TKIP CCMP,PSK
08,00:0D:02:CC:**:**,7,2.442,31,-88,on,"***************",,
pi@raspberrypi ~/Workspace/wlanmon $
--------------------------------------------
ちなみに上の結果に対応する生データ
--------------------------------------------
pi@raspberrypi ~/Workspace/wlanmon $ sudo iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: 70:73:CB:BB:xx:xx
                    Channel:36
                    Frequency:5.18 GHz (Channel 36)
                    Quality=24/70  Signal level=-86 dBm  
                    Encryption key:on
                    ESSID:"xxxxxxxxxxxxx"
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
                              36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    Extra:tsf=000004c8c0ad50f7
                    Extra: Last beacon: 1680ms ago
                    IE: Unknown: 000D736B326272206E6574776F726B
                          〜中略〜
                    IE: Unknown: 200100
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    IE: Unknown: 2D1AEF111BFFFFFF0000000000000000000000000000000000000000
                          〜中略〜
                    IE: Unknown: DD0B0017F20100010100000007
          Cell 02 - Address: 70:73:CB:BB:yy:yy
                    Channel:11
                    Frequency:2.462 GHz (Channel 11)
                    Quality=30/70  Signal level=-80 dBm  
                    Encryption key:on
                    ESSID:"yyyyyyyyyyyyy"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s
                    Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    Extra:tsf=000004e402adea2f
                    Extra: Last beacon: 2180ms ago
                    IE: Unknown: 000D736B326272206E6574776F726B
                          〜中略〜
                    IE: Unknown: 32043048606C
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    IE: Unknown: 2D1AAD511BFFFFFF0000000000000000000000000000000000000000
                          〜中略〜
                    IE: Unknown: DD0B0017F20100010100000007
          Cell 03 - Address: 00:01:8E:9F:zz:zz
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
:
:
--------------------------------------------
iwlist wlan0 scan の結果

無線LANドライバの種類によって出方が違うみたい。
例えば、MINTなノートPC内臓の無線LANの場合は、上のCell 02と同じAPやのに...
--------------------------------------------
eth1      Scan completed :
          Cell 01 - Address: 70:73:CB:BB:xx:xx
                    ESSID:"xxxxxxxxxxxxx"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Frequency:2.462 GHz (Channel 11)
                    Encryption key:on
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=65/100  Signal level=-61 dBm  
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    Extra: Last beacon: 80ms ago
--------------------------------------------

Raspberry Piとブレッドボードを組み合わせたケースをレゴブロックで作ってみた。

裏面と側面に作業性を考慮した隙間を作って排熱に気を付けて、ついでにLEDの近くは透明のブロックを使って LEDの状態を見られるように。


2014年06月15日(日)
Raspberry Pi
とうとう買った。

まずは部屋の温度をロギングして...というのが目的で。。

先々週の暑い日に思い立って、先週末に発注。
昨日、無事に初期設定が完了して使える状態になった。

情報はネットに豊富に出てるんで、参考本はええかなと思ってたけど、ちょうどトラ技7月号でRaspberry Piが特集されていたんでトラ技を

ついでに本屋さんで眺めた本は↓の3つ。

・Raspberry Piで遊ぼう
オールカラーで絵や写真がふんだんにあって、重くて高い!
SSHやSCPの使い方まで丁寧に書かれてるんで、Windowsしか知らへん人向きかも。

・Raspberry Piアイデア実験室
回路図とかも載ってるんで、普通に参考になると思う。

・トラ技7月号
要所要所に回路図,ブロック図,タイミング図,フローは載っとるし、コードのコメントも解りやすく書かれているんで、ソフトが苦手なエレキ屋さんにもハードが苦手なファーム屋さんにも役立ちそう。
何といっても安いし必要な情報は入ってる。


やったこと。

・http://www.raspberrypi.org/からRaspbianをダウンロードしてSDカードに書き込んで
・SDカードをRaspberry Piに装着して電源投入。
・電源はスマフォに付いてたのを使用。
・初回起動時にraspi-configが立ち上がって、一通りの初期設定を。この時、SSHの有効化とUpdateを実施。

その他の設定は...

・IPアドレスを固定設定。(/etc/network/interfaces)
・xrdpをインストールしてRemote Desktopできるように。
・ksnapshotをインストールしてScreen Shotを採れるように。

ここまでしといたら、Raspberry Piにモニタやキーボートとかを繋ぐ必要がないんで、邪魔にならへんところで動かして作業ができる。

この後は、トラ技の記事を参考に、必要な部品を調達して週末に備えようかと。



Remote Desktopでアクセス

SCPでアクセス

SSHでアクセス