Rasberry Piを使う === ## i2cバスの有効化とWiFi ``` sudo apt-get install i2c-tools sudo modprobe -r i2c-bcm2708 # i2c devむけ sudo apt-get install python-smbus python3-smbus 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< no > apache2 > password http:///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 と書くのが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 ```