2018年06月

Raspberry Pi Zero セットアップメモ

OTG接続でハマったので忘れないようにメモ

■用意するもの
 ・Pi Zero本体
 ・マイクロSDカード
 ・USB-マイクロUSBケーブル
 ・
RASPBIAN(OS)
 ・BonjourまたはiTunesをインストール

 ・Win32DiskImagerまたは DDWin等、イメージファイルをSDカードに書き込むソフト
 ・RNDISドライバー
  http://domotique.caron.ws/cartes-microcontroleurs/raspberrypi/pi-zero-otg-ethernet/
  から"RPI Driver OTG"を入手して解凍しておく
 ・
teraterm(ssh接続するのに必要)
■手順
 ・SDカードにRASPBIANイメージファイルを書き込む

 ・SDカードのbootフォルダに以下
  config.txtの編集→"dtoverlay=dwc2"を末尾に追記
  cmdline.txtの編集→"rootwait"の記述のすぐ後 "modules-load=dwc2,g_ether"を追記
  ◦ファイル"ssh"を作成
 ・Pi ZeroにSDカードを挿入
 ・HDMIポート隣のUSBポートとPCを接続する
 ・シリアルデバイスとして認識され
COMポートが付番されるのでデバイスマネージャから
  対象のシリアルデバイスを選択-ドライバの更新-
RPI Driver OTGの場所を指定してインストール
 ・成功するとネットワークアダプタに"USB Ethernet/RNDS Gadget"が追加される
■teratermで接続
 ・teratermを起動
  ホスト名:raspberrypi.local、サービス:SSH を選択して接続
  警告画面が出るが無視
  その後の認証画面でユーザ名:pi パスワード:raspberryでログイン可能

 
Bonjourがインストールされていれば、ホスト名:raspberrypi.localで接続出来る
 はずだが、設定当初はinvalid hostと表示され何度やってもログイン出来なかった。
 結局、PC再起動、
Bonjourをアンインストール、iTunesの再インストールを
 行ったら、ログイン可能になったがどこに原因があったのかわからない。
■WSL(Ubuntu)で接続
 ・WSLからはBonjourが利用出来ないようなのでIPアドレスで接続する。
 ・$ssh pi@IPアドレス
 ・パスワードを求められるので
raspberryと入力 
 注:コマンドプロンプトのipconfigから取得できるIPアドレスでは接続出来ない。
   一度
teratermから接続してifconfigコマンドで取得したIPアドレスで接続する。
   
■Raspberry Piの再起動とシャットダウン
 ・$ sudo reboot
 ・$ sudo shutdown -h now  

GASで日本語の曜日を使う

曜日の配列を作成。
formatDate(date, timeZone, format)を利用して曜日を数値として取得。
配列から取り出す。
以下例
var weekname = ["dummy","月","火","水","木","金","土","日"];
Logger.log(weekname[Utilities.formatDate(new Date(), "JST", "u")]); 
formatDate(date, timeZone, format)

GAS(GoogleAppsScript)でスクリプトを決められたスケジュールで動かす

手始めにセントレアの駐車場満空情報を30分おきにスプレッドシートに記録してみる。

■準備
 ・空のスプレッドシートを新規で作成する(名前は何でも構わない)
 ・シートのURLからspreadsheets/d/********/edit#gid~の*部分(シートのID)を控える
■作業(スクリプトエディタ上)

var Spreadsheet = SpreadsheetApp.openById('準備で控えておいたID');
var sheet = Spreadsheet.getSheets()[0]; //先頭のシートを指定

//xpathを使用して現在の満空情報を一度セルにセットする。
sheet.getRange(1, 5).setFormula('= IMPORTXML(\"http://www.centrair.jp/access/parking/\",\"//*[@class=\"\"state-1f\"\"]/img/@alt\")'); 
sheet.getRange(1, 6).setFormula('= IMPORTXML(\"http://www.centrair.jp/access/parking/\",\"//*[@class=\"\"state-2f\"\"]/img/@alt\")'); 
sheet.getRange(1, 7).setFormula('= IMPORTXML(\"http://www.centrair.jp/access/parking/\",\"//*[@class=\"\"state-sp\"\"]/img/@alt\")'); 

//後は最終行に取得した満空情報をセットしていく
var data = sheet.getDataRange().getValues(); //入力のある最終行
sheet.getRange(data.length+1, 2).setValue(sheet.getRange(1,5).getValue());

以下略

後は[編集]-[現在のプロジェクトトリガー]から実行したいスケジュールを作成すればよい。
本当はURLFetchなんかを利用してスクリプト内で全て情報取得できるはずだが、難しくて断念。

Google Spreadsheetでマクロを使う

ちょっとした作業ならExcelよりも便利に感じてきた。

以下記述例
//入力データが無くなるまで繰り返す
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
for (var i = 0; i < data.length; i++) {
Logger.log(data[行][列]);
}

※data.lengthはデータが入力されている最後の行まで数えてくれる
 行・列は0から始める

スクリプトエディタ
sheets_macro01

記述例でセットしたログは[表示]→[ログ]から確認可能
sheets_macro02


マクロの記述はJavaScriptらしいので
JavaScriptが得意な人には使いやすいのかもしれない。

リファレンス↓
Class SpreadsheetApp