Rasberry Piを使う

i2cバスの有効化とWiFi

 sudo modprobe -r i2c-bcm2708
 sudo modprobe i2c-bcm2708 baudrate=4000
 sudo  wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0 -Dwext -B

SDカードへの書き込み on OSX

 diskutil list
 > diskNがターゲットであることを確認
 sudo diskutil unmountDisk /dev/disk2
 sudo dd bs=1m if=raspbian.img of=/dev/disk2

OSXでのimageのmount

interfacesなどを先に変えたいことがある。

まず, OSXFUSEをインストール。次に、 https://github.com/alperakcan/fuse-ext2 をいれる。

 brew install homebrew/fuse/ext2fuse
 brew install homebrew/fuse/ext4fuse
 sudo dscl . append /Groups/operator GroupMembership `echo $USER`
 mkdir /Volumes/tmp
 ext4fuse /dev/disk2s2 /Volumes/tmp
 > sudoしないのがポイント

して各種操作をする。

 sudo umount /Volumes/tmp

で終わり。

SDカードへの書き込み on Windows

http://www.raspberrypi.org/downloads/ からダウンロードする。今は、Debian Wheezyを落とした。

http://shounen.ru/soft/flashnul/index.html をいれる。これが書き込みによい。

ここで、「管理者で実行したコマンドプロンプト」から、 同じディレクトリにこれらをいれて

 flashnul.exe -p
 Avaible physical drives:
 0       size = 2000398934016 (1863 Gb)
 1       size = 2000398934016 (1863 Gb)
 2       size = 180045766656 (167 Gb)
 3       size = 2000398934016 (1863 Gb)
 4       size = -1 ( -not avaible- )
 5       size = -1 ( -not avaible- )
 6       size = 7861174272 (7497 Mb)
 7       size = -1 ( -not avaible- )
 8       size = -1 ( -not avaible- )
 9       size = -1 ( -not avaible- )

 flashnul.exe 6 --load 2012-10-28-wheezy-raspbian.img
 Device size              = 7861174272 (7497 Mb)
 delta to near power of 2 = 728760320 (695 Mb), 9%
 Surplus size             = 6031872 (5890 kb)
 Really destroy data on drive PhysicalDrive6?  :

とする。ドライブ間違えるとすべてが消えるので注意。

resizeだけして再起動。

 User ID: pi
 Password: raspberry

で入って、

 sudo su -
 passwd pi
 passwd root
 ifconfig eth0
 ⇒有線でアドレス着いてること確認

GPS

シリアルの用意

""""""""""""""""""""""

秋月で昔買ったGT-730F/Lを使うことにする。

 [    8.848099] pl2303: Prolific PL2303 USB to serial adaptor driver

のように、PL2303の石で見えているので、Debianではそのまま、たたくことができる。 apt-get install cu してから、

cu -s 38400 -l /dev/ttyUSB0 でみえる。おっけー。

pythonからシリアル

さて、次に、pythonでこれをたたく。

 sudo apt-get install python-pip
 sudo pip install pyserial
 して
 >>> import serial
 >>> fd = serial.Serial('/dev/ttyUSB0',38400,timeout=1)
 >>> while True:
 ...  s = fd.readline()
 ...  print s

よめたー! ということでおっけーです。

音を鳴らす

 sudo modprobe snd-pcm-oss
 sudo modprobe snd-pcm   
 sudo modprobe soundcore
 sudo apt-get install madplay
 madplay hoge.mp3(適当なやつ)

なった!

しゃべらせる

http://shokai.org/blog/archives/6095 を参考にします。

 sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001

 cat >a.sh<<EOF
 #!/bin/sh
 TMP=/tmp/jsay.wav
 #cd /usr/share/hts-voice/nitech-jp-atr503-m001
 cd /usr/share/hts-voice/mei_happy
 echo "$1" | open_jtalk \
 -td tree-dur.inf \
 -tf tree-lf0.inf \
 -tm tree-mgc.inf \
 -md dur.pdf \
 -mf lf0.pdf \
 -mm mgc.pdf \
 -dm mgc.win1 \
 -dm mgc.win2 \
 -dm mgc.win3 \
 -df lf0.win1 \
 -df lf0.win2 \
 -df lf0.win3 \
 -dl lpf.win1 \
 -ef tree-gv-lf0.inf \
 -em tree-gv-mgc.inf \
 -cf gv-lf0.pdf \
 -cm gv-mgc.pdf \
 -k gv-switch.inf \
 -s 16000 \
 -a 0.05 \
 -u 0.0 \
 -jm 1.0 \
 -jf 1.0 \
 -jl 1.0 \
 -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
 -ow $TMP && \
 aplay --quiet $TMP
 rm -f $TMP
 EOF
 chmod 755 a.sh

icingaをいれて無線監視

基本的には https://wiki.icinga.org/display/howtos/Setting+up+Icinga+Web+on+Debian を参照する

 sudo apt-get update
 sudo apt-get install sudo lv less
 visudo
 sudo apt-get install icinga php5 php5-cli  icinga python zsh screen mtr fping
 Configuring icinga-common
 > no
 > apache2
 > password
 http://<server>/icinga/
 にアクセスできる(icingaadmin: password)

無線カード: GW-USValue-EZをつかった

 標準で認識する > wlan0
 sudo apt-get install iw
 sudo iwconfig wlan0 mode Managed
 sudo iwlist wlan0 scanning  | grep ESSID
  > 見えるESSIDのリスト
 やり方はいろいろあるけど、
 /etc/network/interfaces
 に
 iface wlan0 inet dhcp
     wpa-ssid beefbeef-home-air
     wpa-psk <password>
 と書くのが1つの手
 あるいは
 wpa_passphrase ssid pass
 したのを
 /etc/wpa_supplicant/wpa_supplicant.conf
 に書く
  • 次は、メールの転送環境を作ります。
 sudo apt-get install postfix
 > Local Only
 myhostname = 設定
 inet_interfaces = yyy.yyy.yyy.yyy, localhost
 relayhost = [xxx.xxx.xxx.xxx]
 あと、以下2つをコメントアウト
 #default_transport = error
 #relay_transport = error
 sudo service postfix restart

icingaの設定

 sudo vi objects/contacts_icinga.cfg
 emailを変更

 sudo vi objects/OurService.cfg
 define host {
  use                     generic-host
  host_name               EXTERNAL_google
  alias                   google_dns
  address                 8.8.8.8
 }
 define service {
  use                     generic-service
  host_name               EXTERNAL_google
  service_description     PING
  check_command           check_ping
 }
 define host {
  use                     generic-host
  host_name               EXTERNAL_unreach
  alias                   google_dns
  address                 254.1.1.1.1
 }
 define service {
  use                     generic-service
  host_name               EXTERNAL_unreach
  service_description     PING
  check_command           check_ping
 }

再起動する

sudo service icinga restart

bluetooth

 apt-get install bluetooth bluez-utils blueman  bluez python-dbus python-gobject bluez-compat
 hciconfig -a  
 lsusb
  Bus 001 Device 008: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
 sudo hcitool scan        
  DC:2C:26:XX:XX:XX       BSKBB06
 sudo bluez-simple-agent hci0 DC:2C:26:13:6C:31       
 sudo bluez-test-device list
  > ペアリング中のデバイス一覧
 sudo bluez-test-device remove DC:2C:26:13:6C:31

Mathematica

 sudo apt-get install wolfram-engine tightvncserver  

I2C

まず、i2c busのデバドラを組み込む。

 sudo modprobe i2c-dev  
 sudo modprobe i2c-bcm2708
 sudo lsmod | grep i2c
 i2c_bcm2708             3947  0
 i2c_dev                 5594  0
 sudo vi /etc/modules
 > 以下を追加
 > i2c-dev
 > i2c-bcm2708
 sudo vi /etc/modprobe.d/raspi-blacklist.conf
 > blacklist spi-bcm2708
 > blacklist i2c-bcm2708
 とあるので、i2cをコメントアウト。

以上で、

 ls -alt /dev/i2c-*                                   [~]
 crw-rw---T 1 root root 89, 1 12 27 00:07 /dev/i2c-1
 crw-rw---T 1 root root 89, 0 12 27 00:07 /dev/i2c-0

となる。

 sudo apt-get update
 sudo apt-get install i2c-tools
 i2cdetect -y 1
 > -yは以下のエラーのy/nを確認しない。
 WARNING! This program can confuse your I2C bus, cause data loss and worse!
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 70: -- -- -- -- -- -- -- --
 sudo i2cget -y 1 0x48 0 w
 > 0x48のアドレスからword型で読み込む
 > 0の部分はDATA-ADDRESSで読むだけなら0で
 0x200b
 > エンディアンをなおすと0x0b20
 python -c 'print(int("0x0b20",16) * 0.00625)'
 17.8

http://www.analog.com/jp/mems-sensors/digital-temperature-sensors/adt7410/products/product.html

これでとりあえずOK!温度は取れました!

LCDディスプレイの接続

acm1602を接続する ピンアサインは次の通り

=== ===========
pin description
=== ===========
1   GND
2   VCC 3V-5V
3   抵抗10k
4   SCL
5   SDA
6   BL-VCC 3-5V
7   BL-VDD
=== ===========

BLは5Vを食わせると電流が流れすぎる。 3.3Vを想定して15ormはいっているということは0.22A流したいようなので、 23ormにすればよい。ので、7ormくらいの抵抗を入れる。

まず、今回の環境では、10kの半固定抵抗についてはおおよそ2kくらいに調整するのがいいっぽい。 (VCC - LCD間の抵抗値)

RasberryPIから直に電源を供給すると電流が大きすぎるので外部の5V<->3.3Vの レギュレータを用意。

ところがうまく認識しない。(i2cdetectで出てこない) http://avr.gawakaru.jp/archives/735 を先人の知恵が。

  • デフォルトの通信速度では通信がつまずくことがある
  • Write専用で一度でもReadを掛けるとモジュールがフリーズする。製品に添付の資料にも明記しているが、Readを掛けた時の状態に付いては記載がない。

ということらしいです。

結論からいうと、

 sudo modprobe -r i2c-bcm2708
 sudo modprobe i2c-bcm2708 baudrate=50000

したうえで、 /etc/modprobe.d/以下の適当なconfに(なんでも読みこまれる)

 sudo vi /etc/modprobe.d/option.conf  
 options i2c_bcm2708 baudrate=50000

と記載する。なるほど。

その後のコントロールですが、たとえば、以下のようにします。

 なんか、最近のOSではうまくいかないので、
 sudo raspi-config
 “8 Advenced Options” -> “A7 I2C”
 するといいかも。。。
 それで、
 /boot/config.txt
 dtparam=i2c_arm_baudrate=50000
 sudo vi /boot/config.txt
 # from
 device_tree=bcm2708-rpi-b.dtb
 device_tree_param=i2c1=on
 device_tree_param=spi=on
 # end
 sudo modprobe i2c-dev
 sudo modprobe i2c-bcm2708
 sudo apt-get install i2c-tools
 # Clear Display: 画面の初期化
 sudo i2cset -y 1 0x50 0x00 0x01 b
 # 列等の設定: 8bit コード、2列, 5x8表示
 sudo i2cset -y 1 0x50 0x00 0x38 b
 # カーソルは表示、ただし、部リンクしない(Display)
 sudo i2cset -y 1 0x50 0x00 0x0e b
 sudo i2cset -y 1 0x50 0x00 0x06 b
 sudo i2cset -y 1 0x50 0x80 0x31 b
 sudo i2cset -y 1 0x50 0x80 0x32 b
 sudo i2cset -y 1 0x50 0x80 0x33 b
 sudo i2cset -y 1 0x50 0x00 0xc1 b
 sudo i2cset -y 1 0x50 0x80 0x35 b
 sudo i2cset -y 1 0x50 0x80 0x36 b
 sudo i2cset -y 1 0x50 0x80 0x37 b
  • Mode
=== ========= ==============
num MoveDir   文字全体Shift
=== ========= ==============
04  0:      -
05  0:      YES
06  1:      -
07  1:      YES
=== ========= ==============

Displayについて

8 - 0x0f

=== === ===== ====== =====
num bin disp  cursor blink
=== === ===== ====== =====
08  000 -     -      -
09  001 -     -      -
0a  010 -     -      -
0b  011 -     -      -
0c  100 -     -      -
0d  101 -     -      -
0e  110 -     -      -
0f  111 -     -      -
=== === ===== ====== =====

シフト

=== === ===== =====
num bin Shift Left
=== === ===== =====
18  10  -     -
1c  -   -     -
=== === ===== =====

18で左にシフト 1cで右にシフト

テンキーを使う

=================

https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-0G4J

を買った。 ここにある解説の通りの結線となっている。 3行x4列のパットで線が7本しか出ていないが、 要はマトリックスの結線になっている。 Raspiに適当にさしてやり、それぞれスキャンする必要がありそうだ。

まず、結線を考える。

=== ====== ====
pad symbol GPIO
=== ====== ====
1   COL2   17
2   ROW1   22
3   COL1   10
4   ROW4   9
5   COL3   11
6   ROW3   23
7   ROW2   24
=== ====== ====

にする。特に深い意味はない。

zsh
 for i in {17,22,10,9,11,23}; do (echo $i > /sys/class/gpio/export );sleep 1; done
 for i in {17,22,10,9,11,23}; do (echo $i > /sys/class/gpio/export );sleep 1; done