前回失敗したこちらの件、すこしだけ進展したので報告です。色々やっていてどれが功を奏したのかが不明なのですが、効果がありそうだったのがこちら。まずローカルファイルシステムに出来上がっているxcoceprojをXcodeで直接開きます。GeneralのIdentityのBundle Identifierに他と被らなそうな名称を入力します。この入力した値に合わせて、ionicのconfig.xmlの中のidを変更します。一度ionicのビルドをしておきます。Xcodeのビルドボタンを押すとエラーが出るもののFix Issueボタンが出るので画面に従って押します。その後もう一度ionic run iosすると、ios実機に転送され、実行できました。が、livereloadを指定するとフリーズします。何でだろう。 “””
Ionic2でハイブリッドなアプリ開発:iosデバイスで自動的に画面をローテーションさせる
iosデバイス用にビルドして転送をすると、デフォルト状態でportraitが強制され、縦画面になります。cordovaのホームページによるとdefaultを指定せよとの事なのですが、上手くいきませんでした。が、以下の指定で解決です。
platformの外側に書かないと有効になりませんでしたのでご注意を。 “””
Raspberry PiでIoTなシステム開発:ローカルのnodeで開発したプロジェクトをrsyncでリモートに同期させる
Raspberry Piで動作させるNode.jsのプロジェクトをリモートで開発すると、いつでも環境を持ち歩かないと開発できなくなります。そこでハードウェア固有の事項が絡む部分以外は、Mac上のNodeで開発をする事にしました。で、ある程度形になったのでRaspberry Piに転送しようと思うのですが、開発しながらリモートのファイルをいじることもあり得るので、SFTPでの上書き更新では無く、rsyncによる同期を試してみることにします。参考にしたのはこちら。rsync でディレクトリの同期(バックアップ) – maruko2 Note. rsyncがデフォルトでsshに対応しているので、Raspberry Pi側にサーバを追加する必要が無いのがお手軽でよいです。遅いらしいですが、LAN有線なので気になりませんでした。
kawauchiyasuo-no-MacBook-Pro:~ yasuo$ rsync -av -e ssh kt/ pi@raspberrypi.local:/home/pi/ktpi@raspberrypi.local's password: building file list ... done./.DS_Storeapp.jsapp.js.mapapp.tscolors.d.tscourse.js(中略)typings/main/ambient/typings/main/ambient/node/typings/main/ambient/node/index.d.tswww/www/.DS_Storewww/index.htmlsent 492485 bytes received 47852 bytes 72044.93 bytes/sectotal size is 4055183 speedup is 7.50
結構なファイル数を更新しても数秒でした。試しにファイル3つだけ更新して同期させると以下の通り。
kawauchiyasuo-no-MacBook-Pro:~ yasuo$ rsync -av -e ssh kt/ pi@raspberrypi.local:/home/pi/ktpi@raspberrypi.local's password: building file list ... doneapp.jsapp.js.mapapp.tssent 16119 bytes received 194 bytes 4660.86 bytes/sectotal size is 4055202 speedup is 248.59
一瞬です。毎回パスワードの入力をしないといけないのが面倒ですね。このあたりはssh keyで対応できるのでしょう。 “””
Raspberry PiでIoTなシステム開発:やっぱりRaspberry Pi2の電源は強くなっている
Raspberry PiでIoTなシステム開発:Raspberry Piの起動を安定させる方法 | 法務ネット:弁護士 川内康雄 以前、Rapberry Pi2の電源が安定するようになったかの実験を行いましたが、今度はUSBドングル2本同時使用でも安定するかを実験してみました。機材はこんな感じです。IO DataのWN-G150UMとWN-G300UA。この2つは通信速度が違いますが使用されているチップがRealtekの8192cuなのでどちらかが使えればもう一方も使えるという関係があります。このうち一つはhostapd用のインターフェースに、もう一つはインターネットにつなげるためのルーターのクライアントインターフェースとして使用しました。再起動を繰り返して毎回ちゃんとインターフェースが使用可能か確認したところ、5回連続で成功しました。
wlan0 Link encap:Ethernet HWaddr 34:76:c5:5d:34:91 inet addr:192.168.10.1 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: fe80::e49a:83c8:afde:dccb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:27 errors:0 dropped:0 overruns:0 frame:0 TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:112 (112.0 B)wlan1 Link encap:Ethernet HWaddr 34:76:c5:41:45:58 inet addr:192.168.1.106 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::e35f:e672:4924:1b6c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:113 errors:0 dropped:4 overruns:0 frame:0 TX packets:81 errors:0 dropped:1 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:28439 (27.7 KiB) TX bytes:14511 (14.1 KiB)
やっぱりPi2の電源は強くなっていると思います。さてPi3はどうなんでしょうか?”””
Raspberry PiでIoTなシステム開発:nvmでnodeをインストールしたときのエイリアスと実体の関係
nodeをsystemdで起動させようとしたのですが、nvmでインストールしたnodeが何処にインストールされているのか分からなかったので調べてみました。
pi@raspberrypi:~ $ ls -laF /usr/local/bintotal 40drwxrwsr-x 2 root staff 4096 Mar 5 09:11 ./drwxrwsr-x 11 root staff 4096 Mar 5 09:10 ../-rwsr-xr-x 1 root root 31264 Feb 11 11:43 gpio*lrwxrwxrwx 1 root staff 30 Mar 5 09:11 node -> /usr/local/nvm/v5.7.1/bin/node*lrwxrwxrwx 1 root staff 29 Mar 5 09:11 npm -> /usr/local/nvm/v5.7.1/bin/npm*lrwxrwxrwx 1 root staff 25 Mar 5 09:10 nvm -> /usr/local/nvm/nvm_bin.sh*
この通り、エイリアスは/usr/local/binにあって、実体は/usr/local/nvm/(バージョン番号)以下に入っています。”””
Raspberry PiでIoTなIT:スタートアップ時にsystemdを使ってnodeを自動起動させる
headlessで運用するRapsberry Piのシステムを開発中です。基幹となるサービスがnodeで動くので、システム起動時に自動的に起動するように設定してみました。RaspbianがWheesyまでのときはinsservでよかったのですが、Jessieからはsystemdに変わっています。insservでも起動できるのは確認しているのですが、折角ですのでsystemdでの起動に挑戦してみます。参考にしたのはこちら。Systemdを使ってさくっと自作コマンドをサービス化してみる – Qiita Node-RED.service まずserviceファイルを書きます。
pi@raspberrypi:~ $ sudo nano /etc/systemd/system/node-kt.service
rootで起動するのがセキュリティ的に望ましくないことは分かってはいるのですが、システムレベル、ハードウェアレベルにアクセスしないといけない関係上、やむを得ずrootにしています。
[Unit]Description=Node.js kawacchi timer serverAfter=syslog.target network.target[Service]ExecStart=/usr/local/bin/node /home/pi/kt/app.jsRestart=alwaysRestartSec=10 # Restart service after 10 seconds if node service crash$StandardOutput=syslog # Output to syslogStandardError=syslog # Output to syslogSyslogIdentifier=nodejs-ktUser=rootGroup=root[Install]WantedBy=multi-user.target
保存したところ、systemctlコマンドで認識できました。
pi@raspberrypi:~ $ sudo systemctl list-unit-files --type=service | grep nodekmod-static-nodes.service static node-kt.service disabled
systemctlのstartからスタートでき、stopで停止できました。
pi@raspberrypi:~ $ sudo systemctl start node-ktpi@raspberrypi:~ $ ps -ax | grep node 1280 ? Ssl 0:02 /usr/local/bin/node /home/pi/kt/app.js 1342 pts/1 S+ 0:00 grep --color=auto nodepi@raspberrypi:~ $ sudo systemctl stop node-kt
enableするとよく分かりませんがどこかに登録されたようです。
pi@raspberrypi:~ $ sudo systemctl enable node-ktCreated symlink from /etc/systemd/system/multi-user.target.wants/node-kt.service to /etc/systemd/system/node-kt.service.
再起動したところ、プロセスが走っていました。外部からこのnodeへのアクセスも成功しています。
pi@raspberrypi:~ $ ps -ax | grep node 692 ? Ssl 0:03 /usr/local/bin/node /home/pi/kt/app.js 937 pts/0 R+ 0:00 grep --color=auto node
以前のinitスクリプトを各方式よりも簡単でわかりやすいように感じました。serviceの記法も直感的でよいと思います。 “””
Raspberry PiでIoTなシステム開発:nodeからwifi接続をコントロールする
nodeからRaspberry Piのwifi接続をコントロールしたいなぁ、でもexecをいちいち叩いていくのは面倒だし、と思っていたら、moduleを作ってくれている人がいました。ネットには神が沢山います。wifi-control このmoduleは実際にはnmcliのフロントエンドに過ぎないので、使用するためにはまずnmcliをインストールします。
pi@raspberrypi:~ $ sudo apt-get install network-managerReading package lists... DoneBuilding dependency treeReading state information... DoneThe following packages were automatically installed and are no longer required: fuse libfuse2Use 'apt-get autoremove' to remove them.The following extra packages will be installed: dconf-gsettings-backend dconf-service dns-root-data dnsmasq-base glib-networking glib-networking-common glib-networking-services gsettings-desktop-schemas iputils-arping libdbus-glib-1-2 libdconf1 libgudev-1.0-0 libjim0.75 libmbim-glib4 libmbim-proxy libmm-glib0 libmnl0 libndp0 libnetfilter-conntrack3 libnm-glib4 libnm-util2 libpam-systemd libpcap0.8 libpolkit-agent-1-0 libpolkit-backend-1-0 libpolkit-gobject-1-0 libproxy1 libqmi-glib1 libsoup2.4-1 libteamdctl0 modemmanager policykit-1 ppp usb-modeswitch usb-modeswitch-dataSuggested packages: avahi-autoipd libteam-utils comgt wvdialThe following NEW packages will be installed: dconf-gsettings-backend dconf-service dns-root-data dnsmasq-base glib-networking glib-networking-common glib-networking-services gsettings-desktop-schemas iputils-arping libdbus-glib-1-2 libdconf1 libgudev-1.0-0 libjim0.75 libmbim-glib4 libmbim-proxy libmm-glib0 libmnl0 libndp0 libnetfilter-conntrack3 libnm-glib4 libnm-util2 libpam-systemd libpcap0.8 libpolkit-agent-1-0 libpolkit-backend-1-0 libpolkit-gobject-1-0 libproxy1 libqmi-glib1 libsoup2.4-1 libteamdctl0 modemmanager network-manager policykit-1 ppp usb-modeswitch usb-modeswitch-data0 upgraded, 36 newly installed, 0 to remove and 13 not upgraded.Need to get 190 kB/5,431 kB of archives.After this operation, 20.8 MB of additional disk space will be used.Do you want to continue? [Y/n] YWARNING: The following packages cannot be authenticated! libdbus-glib-1-2 libdconf1 libgudev-1.0-0 libmbim-glib4 libmm-glib0 libndp0 libmnl0 libnetfilter-conntrack3 libnm-util2 libnm-glib4 libpam-systemd libpcap0.8 libpolkit-gobject-1-0 libpolkit-agent-1-0 libpolkit-backend-1-0 libproxy1 libqmi-glib1 glib-networking-common glib-networking-services dconf-service dconf-gsettings-backend gsettings-desktop-schemas glib-networking libsoup2.4-1 libteamdctl0 libjim0.75 dns-root-data dnsmasq-base libmbim-proxy modemmanager policykit-1 network-manager ppp iputils-arping usb-modeswitch-data usb-modeswitchInstall these packages without verification? [y/N] y
「インストールするのか?本気かよ」みたいな聞き方をされると不安ではありますが、ここはレポジトリを信頼するしか無いのです。ボットになったらどうしましょ。
Setting up policykit-1 (0.105-8) ...Setting up network-manager (0.9.10.0-7) ...The following network interfaces were found in /etc/network/interfaceswhich means they are currently configured by ifupdown:- eth0- wlan0- wlan1If you want to manage those interfaces with NetworkManager insteadremove their configuration from /etc/network/interfaces.Setting up ppp (2.4.6-3.1) ...Setting up iputils-arping (3:20121221-5) ...
ご丁寧にもinterfacesに書いてあったらダメよと指摘してくれましたので、interfacesからwlan1の設定を削除しておきました。
var WiFiControl = require('wifi-control');export var init = () => { // Initialize wifi-control package with verbose output WiFiControl.init({ debug: true }); var settings = { debug: true || false, iface: 'wlan1', connectionTimeout: 10000 // in ms }; WiFiControl.configure(settings);}export var scanForWiFi = () => { // Try scanning for access points: WiFiControl.scanForWiFi( function(err:any, response:any) { if (err) console.log(err); console.log(response); });}
公式のサンプルに従いこんな感じ。するとこんな感じでスキャン結果が取得できました。
WiFiControl: Debug mode set to: trueWiFiControl: Determining system wireless interface...WiFiControl: Host machine is Linux.WiFiControl: Executing: nmcli -m multiline device status | grep wlanWiFiControl: Automatically located wireless interface wlan1.WiFiControl: Debug mode set to: trueWiFiControl: AP connection attempt timeout set to: 10000msWiFiControl: Wireless interface manually set to wlan1.WiFiControl: Scanning for nearby WiFi Access Points...WiFiControl: Nearby WiFi APs successfully scanned (11 found).{ success: true, msg: 'Nearby WiFi APs successfully scanned (11 found).', networks: [ { ssid: 'aterm-d014ce-g', channel: '6', signal_level: '70', security: 'WPA1 WPA2' }, { ssid: 'AP-2F-YA-2.4GHz', channel: '13', signal_level: '47', security: 'WPA1 WPA2' }, { ssid: 'AP-2F-YU-2.4GHz',
“””
Raspberry PiでIoTなIT:光電センサの接続回路・12VLEDルームランプの接続回路の定数FIXさせました
「かわっちタイマー」と名付けたバイクジムカーナ用タイム計測機を数年前から製作していて、現在そのバージョン3を開発中です。V3はRaspberry Piで実装する予定で以前から回路を考えていたのですが、最終以下の内容でFixする事にしました。電源部。ストロベリーリナックスさんのモジュールです。実装面積が小さいので重宝しています。光電センサ入力部。ノイズ対策のためフォトカプラを使用しています。LEDルームランプのドライブ部。2SK975はTo-92みたいなパッケージですが、それなりに電流を流せるのに3.3V駆動できて便利です。圧電スピーカードライブ部。実測したところ3倍ぐらいに昇圧されていました。※2016/04/14 エラー発見です。ハードウェアPWMのピン番号はBCM18/WiringPi1です。おまけ:スイッチサイエンスのバニラ基板を使って実装します。面積が小さいので予めの計画が重要ですね。ぎりぎり収まりました。あと数個ぐらいなら部品を追加できるかもしれません。“””
Raspberry PiでIoTなIT:新しく認識されたインターフェースをavahiに自動的に認識させる
Raspberry Piにwifiドングル二本差し、Ethernetも接続して、ネットワークインターフェースが3個になりました。ここで困った現象が発生したのですが、電源断からのスタートアップで、avahiがインターフェースを登録してくれません。スタートアップ完了後に、systemctlからavahi-daemonをリスタートさせるとインターフェースを認識してサービスを配信します。Raspberry Piの最初に必ずやる初期設定メモ (Raspbian) » GeeksDev 最初はここに書いてあるような
AVAHI_DAEMON_DETECT_LOCAL=0
の問題かと思ったのですが、
sudo /etc/init.d/avahi-daemon status
で起動を確認できましたし、0にしても解決しませんでした。そこでサービスだけ再起動したら繋がるのだからavahi-daemonによる認識の問題かと思いmanを見てみると、自動登録の設定項目がありました。avahi-daemon.conf(5): avahi-daemon config file – Linux man page use-iff-running= Takes a boolean value (“”yes”” or “”no””). If set to “”yes”” avahi-daemon monitors the IFF_RUNNING flag bit which is used by some (modern) network drivers to tell user space if a network cable is plugged in (in case of copper ethernet), or the network card is associated with some kind of network (in case of WLAN). If IFF_RUNNING is set avahi-daemon will automatically announce its services on that network. Unfortunately far too many network drivers do not support this flag or support it in a broken way. Therefore this option defaults to “”no””.「ほとんどのインターフェスが非対応かバグあり」とあるので望み薄かと思ったのですが、コメントアウトを外してyesに変更してみると、pi全体の再起動の直後からホスト情報が配信されています。ちなみにですがstatusの結果は配信されないときも配信された時も以下の通りで変化無しでした。わかりにくい、、、
pi@raspberrypi:~ $ sudo /etc/init.d/avahi-daemon status● avahi-daemon.service - Avahi mDNS/DNS-SD Stack Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled) Active: active (running) since Thu 2016-04-14 10:48:56 JST; 9min ago Main PID: 379 (avahi-daemon) Status: ""avahi-daemon 0.6.31 starting up."" CGroup: /system.slice/avahi-daemon.service ├─379 avahi-daemon: running [raspberrypi.local] └─420 avahi-daemon: chroot helperApr 14 10:57:19 raspberrypi avahi-daemon[379]: Joining mDNS multicast group ....Apr 14 10:57:19 raspberrypi avahi-daemon[379]: New relevant interface eth0.I....Apr 14 10:57:19 raspberrypi avahi-daemon[379]: Registering new address recor....Apr 14 10:57:29 raspberrypi avahi-daemon[379]: Joining mDNS multicast group ....Apr 14 10:57:29 raspberrypi avahi-daemon[379]: New relevant interface eth0.I....Apr 14 10:57:29 raspberrypi avahi-daemon[379]: Registering new address recor....Apr 14 10:57:30 raspberrypi avahi-daemon[379]: Registering new address recor....Apr 14 10:57:30 raspberrypi avahi-daemon[379]: Withdrawing address record fo....Apr 14 10:57:30 raspberrypi avahi-daemon[379]: Leaving mDNS multicast group ....Apr 14 10:57:30 raspberrypi avahi-daemon[379]: Joining mDNS multicast group ....Hint: Some lines were ellipsized, use -l to show in full.
“””
Raspberry PiでIoTなIT:Raspberry Piの基板の穴は2.6mm
Raspberry Piを筐体に固定する場合、初代Piはマウンティングホールが無く、何らかのケースを介して固定する必要がありました。A+やB+以降は固定穴があり、パターンも絶縁されているので固定が簡単になりました。この穴のサイズですが、海外では2.5mmと書いている記事もありますが、日本で普通に入手できるビスとしては2.6mmが適合します。スイッチサイエンスさんのバニラ基板の固定用スペーサーも2.6mmのネジが切ってあるものが付いていました。10mmのスペーサーを介して2mmぐらいのベースボードに固定する場合には、2.6mm x 20mmでぴったりです。ホームセンターで購入すると割高になるので、「ネジのナニワ」さんで購入しました。ここは小学生の頃からお世話になっています。“””