‘RaspberryPi’のエントリ

ウェザタイ on ラズパイ。通信対戦ができるようになった。

デスクトップ版のWTとも対戦ができる。ってことはモバイル版とデスクトップ版との対戦も可能ってことで。ただ、どうもローカルPCクライアントからUWPのサーバには接続できないっぽい。製品版では別に構わないけどデバッグはめんどくさい。

Raspberry Piでウェザタイを動かす計画。一通りロジックは移植し終わったのて、画面も少し作ってみた。

2週間前の状態がこれ。モバイルバッテリー付けて持ち運べるようになった。

今はこれ。キーボードを付ければ打ち込める。

キーボード関連等、Windows依存の実装があるが、そこさえ作ってしまえば同じアプリがRaspberry Pi上のWindows 10 IoT、Windowsストア (UWP)、Android、iOSで動くので、一石四鳥といえる。Xamarin MacってのもあるっぽいけどMacでも動いたりするかなあ。

対戦機能も、Windowsストアならサーバ・ホスト両方できそうかな。Androidとかでも、少なくともゲストはできる見込み。

で、折角のラズパイなのでハードウェアも動くはず、ってことでお決まりのLEDを試す。キーボードを押すとON/OFFする。

ここまで下準備ができてくると、やりたかったあの企画も近づいてくる。ある程度できたらイメージを載せてみよう。

はっぱさんとラズパイワークショップ。近場によい感じの作業スペースがあったのでそこで情報交換をした。MacでどうやったらWindows 10 IoT開発ができるかが争点だったが、なんとか別PCでWindows 10 IoTまでインストールまで持っていければあとはMacでのVisual Studioで開発できるのでは、という推測をしつつSDカードカードを購入。

→結局MacのVisual StudioではUWPプロジェクトは作れなかった。

そしてそろそろ必要になってきたってことでマクセルのモバイルバッテリーを購入。3Aまでいけるのでラズパイも余裕。

モバイルバッテリーを取り付けた様子。これで完全にワイヤフリーになった。

とりあえずウェザタイをラズパイで動かすのが当面の目標だが、せっかくやるならモバイル対応も同時にできるとよい。ってことで前からやりたかったXamarin.Formsを試してみる。

Visual Studio 2017でクロスプラットフォームプロジェクトを作るとShared ProjectとUWP/Android/iOS用のプロジェクトができる。とりあえずWindows 10 IoTで動かすためにUWPを中心に。PCで実験してからラズパイに持って行けるのがすごく便利。

クロスプラットフォームのやり方はいろいろあって、まずはWPFでも使っていたPortable Class Library(PCL)はそのまま使える。で、WPF用の共通プロジェクトはShared Projectにして、ifdefでなんとかするかな。PCLでインターフェースを定義、プラットフォーム依存プロジェクトで実装を定義、でDependency Injectionでやるのが綺麗らしいけど、クラス数が多すぎてめんどい。

Shared Projectはそれ自体はDLLでもスタティックライブラリでもなくて、各プロジェクトに勝手にマージされるイメージっぽい。それはいいとして、ifdefのdefine値は各プラットフォームで定義されていると思ってたんだけどそういうわけではない、んですかね。とりあえず自分で各プロジェクトに_UWP__とか定義した。

XAMLの方のクロスプラットフォームはどうかというと、本を読んでいるとXamarin Formsで共通にするかプラットフォーム依存でそれぞれ作るかの2択で、やれることはそんなに変わらないように見えた。なので当然Xamarin Formsでやるんでしょ? って感じだったが、実際やってみると・・・これはプラットフォーム依存の方が楽かも、って思える。コーディング中に画面イメージが出ないのはまあ仕方ないとして、何かちょっとでも変なコードを書くとインテリセンスが動かなくなったり、とにかく不安定。まあ、何をするとおかしくなるのかを学習しながら作っていけばなんとかなる、のか? あと、コード変更した後いちいちBuild&Deployを手動でやらないと新しいバイナリでデバッグできないのは何か設定とかないのかな。

少し心配だったGPIO周り。XamarinのUWPで動くかな、と思っていたが普通にUWPのプロジェクトからGPIOのライブラリは参照できた。最終的に動くのはXamarinがエミュレーションしたものではなくてUWPそのものなのかな?

ひとまずUWP on Xamarin.Formsで作った最初の画面。

Raspberry Piでウェザタイもどきを動かそうとしているのだが、Windows 10 IoTを使えばC#が使えるということで実験。

MSのページに従ってWindows 10 IoT Core DashboardからSDカードにイメージを転送して起動。するのだが、しばらく起動中のままになり、最終的にBAD SYSTEM CONFIG INFOでブルースクリーンになる。その後起動するとBCDがおかしいエラーで何もできなくなる。何度かSDカードを作り直すがダメ。ネットを調べるとアンペアが足りないとか出てくるが、Surfaceの充電器のUSBポートでもダメ。

余談だが、一度Windows IoTを入れるとSDカードに大量のパーティションができる。どうやってフォーマットすればいいのか分からないのでパーティションを全削除したらWindowsから認識されなくなった。これはXperiaにつないだらフォーマットしてくれた。

で、結局SDカードとの相性がだめだったようで、TOSHIBAの16GBはダメでELECOMの16GBで起動したらちゃんと起動した。

→追記。TOSHIBAのSDカードがクラス4だったからだと推定。SDカードがすぐ欲しかったのでコンビニで買ってきたらクラス4だった。ELECOMは電器屋でちゃんと?買ったものなので当然クラス10。

公式7インチタッチスクリーンだと画面が逆になってしまうのを直すため、Windows 10 IoT Core Dashboardからデバイスポータルを起動。が、インストール時に設定したパスワードが通らない。どうもあのパスワードではなく「p@ssw0rd」らしい。パスワードは変更しておいて、デバイスポータルからようやく画面を反転。

次。PCからリモートで操作する方法を探してみると、Windowsストアアプリがあるらしい。Windows IoT Remote Clientでリモートデスクトップのように操作できた。これでなんとか使い始められそう。

WT3.2の開発もほぼ完了。ということでラズパイの環境を整備。秋葉原で買ってきたラズパイ用7インチタッチLCDとケースを取り付けてみた。

LCDの電源もラズパイから取れるし、一体型で持ち運びもOK。何より裏蓋も取り外し可能ってことでなかなか使い勝手が良い。

裏で動いているウェザタイonラズパイプロジェクトを開始しよう。

久々にはっぱさんとアキバへ。今回の目的はしばらく前から気になっていたBEEP秋葉原店。路上にベーマガっぽい絵が描かれていて、地下の店に入るとレトロなPC、ゲーム、本がいっぱい置いてある。MSXやx68があったり、昔PC6001でやっていたタイニーゼビウスのテープが置いてあったり、PCやファミコンなどのゲームもいろいろ。ただ、見ていて楽しいんだけど、さすがに買っても遊べないので買う物はあまり・・・。ベーマガも結構置いてあったけど、国会図書館で読めるからなあ。本気で通っている人はアーケード基板とか家で遊べるようにしてたりするんですかね。

もう一つの目的のRaspberry Pi。とりあえずArduinoのときに買うのを保留にしていたカメラモジュールを買ってみた。どのくらい使えるか分からないけど試してみよう。

ちょっと前にRaspberry Piを買っていたのでいじってみる。

Raspberry Piは小さいコンピュータで、SDカードに入れたOSを起動できる。また、電子部品を付けられるピンがあるので電子工作ができる。本当はArduinoにWi-Fiとカメラを付けてラジコンをパワーアップさせたかったんだけど、モーター2個とBluetoothを付けた時点で他の部品をつけられなくなってしまったので、最初からWi-Fiが付いていてカメラ用端子の付いているRaspberry Piを試そうかと。

Raspberry PiとSDカードを買ってきて、HDMIでディスプレイ、USBでマウスとキーボードをつなぐ。PC側でRaspbian(デフォルトのLinux)をSDカードに入れて準備完了。あとはRaspberry Piを起動してOSをインストール。パスワードを設定したりWi-Fiの設定をして、そこからはPCからSSHで操作できるようになった。

なんだけど、家ではWi-Fiルータ、外でテザリングでつなごうとすると、どうしてもDHCPになってつなぎにくい。ディスプレイをつないでifconfigとかはかなり面倒。てことでまず最初のプログラムとして、Raspberry Piを起動したらIPアドレスをWebに通知するようにしてみた。初Pythonだけど、いろんなコピペなのであまりよく分かってはいない。

# coding: utf-8
import urllib2
import subprocess

url = 'http://xxxxx/cgi-bin/xxxxx.cgi?ip='
cmd = "hostname -I"
ip = subprocess.check_output(cmd,shell=True)
urllib2.urlopen(url + ip)

あとは、Raspberry Piを起動すると勝手にpiユーザでログインするみたいなので、piユーザの.bashrcに以下を入れてみた。

python /home/pi/xxx.py &

Web側はとりあえずCGIにしたが、自作のライブラリをいろいろ使っているのでここには載せきれない。もらったIPアドレスをファイルに書き込んで、標準出力に出すだけのものをさくっと作った。

これでIPアドレスが分かるようになったので、ディスプレイもマウスとキーボードも使う必要がなくなった。便利。