‘電子工作’のエントリ

しばらくXamarin.Forms使ってみて分かってきたこと。

1. F5を押してもビルドされない問題

F5を押すとすぐに実行されてしまうので、手動でビルド、デプロイ、実行していたが、Configuration ManagerでUWPプロジェクトのビルドとデプロイにチェックが入っていないためだった。デフォルトでオフになっているのかな。

2. Release版だと例外が発生する問題

Shared ProjectのMainPageを起動するときにSystem.PlatformNotSupportedException: ‘Arg_PlatformNotSupported’ 例外などが発生。Releaseで動かした場合だけなんだけど、そのまま例外をスルーすると動くっぽい。なんだろう。

3. Xamlのインテリセンスが死ぬ

一番困ってるのがこれ。たまに動くんだけど、何かしているといつのまにかインテリセンスが死んでいる。UWPプロジェクトを選択しているときはインテリセンスが正常に動いたことがない。”ContentPage was not found”みたいなのが出てインテリセンスの選択肢がほとんどない。Android/iOSプロジェクトを選択していると動くことも多いけど、いつの間にかインテリセンスのウィンドウが出なくなる。一応そんなときはAndroidやiOSのプロジェクトから共有プロジェクトの参照を消してビルド、もう一回共有プロジェクトの参照を追加してビルドすると出るようになったりする。かも?

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アドレスが分かるようになったので、ディスプレイもマウスとキーボードも使う必要がなくなった。便利。

はっぱさんとMaker Faire Tokyo 2016に行ってきた。

初めてなので混雑を避けて2日目の午後1時くらいに行ったのだが,丁度良い混雑具合で暑くもなく良い感じだった。イベント系はスルーして展示だけ一通り見て回ったのだが,とにかく膨大で疲れた。行く前は,まあコミケな感じでサークルとか個人とかで作ったものを売ってるのかな,と思ってたけど,実際は,大学の研究室とか,工学部学園祭の全国大会的な感じ? 想像より本格的だった。

電子工作では,元々Arduino,Rapsbery Pi,IchigojJamしか知らなかったけど,それぞれの種類,組み合わせるボードにいろいろなものがあったり,他のフレームワーク,電子ブロック的な物とか。あとはVRなんかは流行りでいたるところでやっていた。電子じゃない工作では,ピタゴラ装置みたいなのとか,キーボードを打つとBB弾が出せるとかは面白そうだった。

てことで今回は様子見で行ってみた感じだけど,作るモチベーションをだいぶ溜められた。

今,「Make: Electronics」を読んでいるのだが,その中で,ユニバーサルプレートの表裏で線を交差させることはできない。穴を経由してショートするから。と書いてあった。あれ,そういえば,と以前作ったボードを見ると,表裏で交差させたので問題がある。実際には線はプレートから少し浮いているのでショートはしていないんだけど,あまりよくない状態ってことですね。

普通の本だと交差するところはラッパー線を使う,くらいしか書いていなくて,表通せばいいじゃん,って思ったのだが,この本はやってはいけないことがいろいろ書いてあって勉強になる。

スマホでラジコンを操作しながらラジコン視点が見えるようにしてみた。iPod Touchで撮影した動画をWindows Mobileに飛ばして見ている様子をAndroidで撮影するという夢の共演。

前回の通り,Windows 10 MobileからArduinoラジコンをBluetooth経由で操作している。で,今回はラジコンに設置したiPod Touchからビデオ画像をWi-Fiでとばして,Windows 10 Mobileのアプリにリアルタイム表示した。ラジコン視点の画像が手元に表示されて割と楽しい。

このままだとWi-Fiにつながってないと遊べないが,SIM搭載したAndroidをテザリングモードにしてWi-Fiルータ化すれば,外でも同じ事ができる。スマホを3種類持ち歩くことになるけど。

とりあえずラジコン部分はこれで完成。iPod Touchからの画像はRGB生データで取得できるので,この情報をうまく使えば自律操作ができる。そこが最終目標。

前回,ラジコンを作るところまでいったが,操作するのはWindowsのPCだった。やっぱり操作するのはスマホの方がいいな,と思ってAndroidアプリを作ることを考えていたんだけど,そういえばWindows 10 Mobileがあった。てことで操作アプリをUWPしてみた。

Windows版では今まで通りSPPを使用してCOMポートのシリアル通信でBluetoothに繋いで,さくっと移植完了。でもWindows 10 MobileではCOMポートが何番か調べられないなあ,と思っていたらモバイルではSPPを使えないっぽい。てことでここを参考にRFCOMMでアクセスするように変更。Socketにするだけでやることは同じですね。

こんな感じ。Windows 10 MobileはWindowsで普通にデバッグできるからすごく楽。

201606192159

201606192159

新しいはんだごての力を得て,自作Arduinoシールドが完成。

シールドの設計図。分かりにくいが,Drv1とDrv2がモータードライバTA7291P x2で,U5とU6がBluetoothモジュールRN42をXBEE変換したものを2.54mmピッチに変換したもの。基板作り自体初めてなのでこれでも3回くらい設計をやり直している。これで完璧,と思って部品を置いてみたら部品同士が当たってショートしちゃう,とか,パズルみたいだった。

2016052901

※回路に重要な問題があるので後の日記を参照のこと。

シールドの部品面。モーターなどの線はピンソケットにして取り外せるようにしておいた。線自体はジャンパーワイヤーを切ったものをはんだでつなげて熱収縮チューブで保護することでさくっと刺せるように。

2016052902

シールドのはんだ面。新しいはんだごての力を借りてようやくこんな感じ。まだまだ修行しないと。設計上線がクロスする箇所は絶縁したコードを使うのが普通っぽいけど,表面を経由したり表の抵抗を経由したりで回避した。

2016052903

ラジコン化したもの。前の実装では表と裏の部品が相互に邪魔して配置に制約があったのだが,ユニバーサルプレートを2枚重ねにしてネジが競合しないようにしたことで自由に配置できるようになった。ちなみに金属のやつは撮影用のiPod Touchを置くスペース(仮)。

2016052904

表詳細
2016052905

裏詳細
2016052906

Arduino。今までブレッドボードで動かしていたモーターとBluetoothをシールド化すべく,設計をした。少し線を付け始めたのだが,どうもソケットが溶けたりハンダが酸化したりする。いろいろ調べてみたところ,WEBはんだ付け講座ではんだごての選び方が乗っていて参考になった。使っていたのは太洋電気の入門セットなのだが,初心者こそ高い道具を,ということでHAKKOのFX-600に買い換え。その後しばらく練習したところ,かなり快適。古いのはランドにちょっと付けているといろいろダメージが残ってしまっていたが,新しいのは大丈夫。

アキバで買ってきた測距モジュール「GP2Y0A21YK」とサーボ「SG92R」とユニバーサルアームを使ってラジコンをバージョンアップ。サーボに測距モジュールを付けて回せるようにした。ついでに今後のためにiPodを設置する場所を用意。測距モジュールから測定した左右の障害物情報をBluetoothで,iPodから取得した画像をWi-FiでPCに送りつけて,PC側で前後左右に車を自律制御するというのが目標。途中からArduinoでロボット工作をたのしもうを参考にやっているが,だいたいPart1+αができた。

はっぱさんとアキバでArduinoワークショップ。前回までのワークショップで,電子工作が本格的になってきたため作業スペースを確保しないと進められないという課題がでていた。その後,ベーマガイベントはんだづけカフェというのを知り,今度行ってみようという話になっていた。ここは無料の電子工作スペースで,はんだづけを中心とした電子工作ができる。というところでとりあえず行ってみたのだが,さすがに無料だけあってスペースが確保できず。

まあその辺りは予想していたので,もう一箇所調べておいたAssemblageに行ってみた。こちらは有料だからか閉店間近だからかゆったり工作できた。

とりあえずはっぱさんにラジコンを見てもらい,はっぱさんのArduinoシールド作りを見学。せっかくだから私も秋月電子で購入した測距モジュールのピンソケットはんだづけをしてみる。さすがにはんだ環境は快適。次の目標はこれを使って障害物を検知するところかな。

Arduinoでラジコンを作った。

前回,車とダブルギアボックスを使って車が動くようになったのだが,これだと左右の前輪がつながっているのでうまく曲がらない。そこで,ボールキャスターを使って左右に曲がるようにした。

さらに,BluetoothモジュールRN-42を使ってPCから操作できるようにした。

表裏はこんな感じ。

2015051701

2015051702

構成としては以下の通り。

  • タミヤのユニバーサルボード,タイヤセット,ボールキャスター,ダブルギアボックスで基本の車を作成
  • 単4電池とボックスでモータの電源を確保,6P電池とジャンパピン付きスナップでArduino用の電源を確保
  • モータードライバTA7291Pを2個使って,モーター,Arduino電源,モータ電源を接続
  • RN-42 Bluetooth 2mmピッチ変換モジュールXBee用2.54mmピッチ変換基板でブレッドボードに載せる

RN42については,買ったものがXBee用の2mmピッチだったので,2.54mmピッチに変換。秋月電子の変換ボードは3.3Vレギュレータ付きなので,電源は5Vそのままつなげるが,ArduinoからRN42へのシリアル通信は3.3Vに変換しないといけないので適当に抵抗で電圧を落とす必要がある。はんだ付けも多少慣れたけど2mmピッチは小さすぎて辛い。

2015051704

RN42の使い方はWebを探すと先人が情報を残してくれているが,Macのコンソールが一番楽そうなのでMacから繋いでみる。RN42を配線して電圧をかけると赤LEDが点滅し,それだけでMac上でBluetoothデバイスとして見つかる。ペアリングすると赤LEDが点灯するので,コンソールから「screen /dev/tty.RNBT-DF42-RNI-SPP 115200」を実行。キーボードで通信ができる。

回路図。Fritzingを使用して作図。ごちゃごちゃするのでGND省略してるけど,適当にArduinoのGNDか電池のマイナスにつなぐ。

2015051705

プログラム。どうしてもハード部分がメインになるのでソフト部分は超適当だけど,上げておこう。

int rpositive = 9;
int rnegative = 6;
int lpositive = 11;
int lnegative = 3;
int led = 13;
int lspeed = 0;
int rspeed = 0;
char inByte = 0;

void setup()
{
  Serial.begin(115200);
  pinMode(lpositive, OUTPUT);
  pinMode(lnegative, OUTPUT);
  pinMode(rpositive, OUTPUT);
  pinMode(rnegative, OUTPUT);
  pinMode(led, OUTPUT);

  analogWrite(lpositive, 0);
  analogWrite(lnegative, 0);
  analogWrite(rpositive, 0);
  analogWrite(rnegative, 0);
}

void loop()
{
  if (Serial.available() > 0)
  {
    inByte = Serial.read();
    if (inByte == 'w')
    {
      // forward
      lspeed += 50;
      rspeed += 50;
      Serial.println('f'); 
    }
    else if (inByte == 's')
    {
      // backward
      lspeed -= 50;
      rspeed -= 50;
      Serial.println('b'); 
    }
    else if (inByte == 'a')
    {
      // left
      lspeed += 50;
      rspeed -= 50;
      Serial.println('l'); 
    }
    else if (inByte == 'd')
    {
      // right
      lspeed -= 50;
      rspeed += 50;
      Serial.println('r'); 
    }
    else if (inByte == 'z')
    {
      // stop
      lspeed = 0;
      rspeed = 0;
      Serial.println('s'); 
    }

    if(lspeed > 200)
    {
      lspeed = 200;
    }
    if(rspeed > 200)
    {
      rspeed = 200;
    }
    if(lspeed < -200)
    {
      lspeed = -200;
    }
    if(lspeed < -200)
    {
      lspeed = -200;
    }

    if(lspeed >= 0)
    {
      analogWrite(lpositive, lspeed);
      analogWrite(lnegative, 0);
    }
    else
    {
      analogWrite(lpositive, 0);
      analogWrite(lnegative, -lspeed);
    }
    if(rspeed >= 0)
    {
      analogWrite(rpositive, rspeed);
      analogWrite(rnegative, 0);
    }
    else
    {
      analogWrite(rpositive, 0);
      analogWrite(rnegative, -rspeed);
    }
    
    if(lspeed != 0 || rspeed != 0)
    {
      digitalWrite(led, HIGH);
    }
    else
    {
      digitalWrite(led, LOW);
    }

    delay(100);
  }
}

次はスマホからBluetooth接続できるようにしてスマホから操作するかな。

昨日買ってきたパーツで車を動かしてみた。タミヤのダブルギアボックス,モータードライバTA7291P 2個をつないで,1.5V単4電池4本でモーターの電源を確保。Arduinoは9Vの角形乾電池とジャンパーピン変換で電源を確保。これで左右のタイヤの方向を変えて曲がることができるようになり,USBを使わなくなったので動かしやすくなった。

この前はタンクを買ったのだが,結局タミヤのユニバーサルボードとタイヤセットを合わせることで,自由度があがりそうだったのでそちらに乗り換えた。裏表に部品を実装できるようになったので配線が楽。

2015051101

2015051102

はっぱさんとArduinoワークショップの三回目を開催。アキバでBluetoothやモーターの足りない部品を揃えた。

その中で,はっぱさんがIchigoJamを見つけて購入。ボードを組み立ててテレビにつなぐとBASICプログラムを実行できるというもの。ベーマガに投稿していた我々としては見逃せない。マニュアルを見つつ二人で懐かしがっていると,電子工作マガジンにBasic Magazine復活の噂を見つけてこちらは私も購入。2ページだけだけど復活している。しかも投稿プログラムまで募集しているとは。こういった方面で盛り上がるのはいいですね。

昨日買ってきた「タミヤ タンク工作基本セット」を使ってモーター制御を試してみた。タンクのモーターにモーター制御IC「TA7291SG」をつなぐ。ここにArduinoの電源をつなぐとArduinoが壊れるので別途モーター用の電源がいるのだが,3V電池じゃ出力不足という情報があり,ACアダプタから延ばしたUSBから電源を取ることに。「ブレッドボード用ミニBメスUSBコネクタDIP化キット」を購入してきたので初のはんだ体験。はんだというと鉛のイメージだったんだけど最近は鉛じゃないんですね。

2015041301

とりあえずやってみたがうまく付けられてるのかな。まあ出力は5Vがちゃんと取れていたので大丈夫だろう。

で,Arduinoからモーター制御IC用電源と,PWMで制御入力を入れて,プログラムをちゃちゃっと入力。

サイズ大きいけど動画も見られます。なんか出力不足なのか遅いけど,前後に動くようになった。次はモーター2個にして左右に曲がれるようにしたり,Bluetoothでスマホからラジコンみたいに動かしたい。

これで来週の情報処理試験エンベデッドも準備OKだ。きっと。。

はっぱさんとArduino勉強会の2回目。前回はLEDの実験だったが,今回はモーターがテーマ。動くものができると楽しいですよね。

アキバに部品を見に行くのが目的だったが,山手線が動いていない関係で新橋で下車。ついでなのでタミヤのプラモデルファクトリーへ行ってみる。20数年ぶりのミニ四駆とか,工作キット,プラモデルなどなんでもあって飽きない。

その後アキバに行ってはっぱさんいきつけの部品屋めぐり。いきあたりばったりだったが一通りモーターを動かせる部品を購入。したところで時間切れ。Bluetoothまではいけなかった。

以前買ってきてそのままだったArduinoを使って何かしようということで,はっぱさんとLEDをチカチカさせてみた。経験者であるはっぱさんと実習したことでだいたいのことが分かったので,部品をそろえて面白いことをやってみたい。

2015011101

2015011102

今日は,はっぱさんが持っている赤+緑LEDとタクトスイッチx2で,片方のスイッチで赤がだんだん明るくなり,もう片方のスイッチで緑がだんだん明るくなるようにして,赤緑黄を自在に光らせられるようにした。これだけでもかなり楽しい。ちなみにはっぱさんがやっていたのは10年以上前なので青色LEDはさすがにない。

アメリカで衝動買いしたArduino UNOをはっぱさんに渡してきた。一人でやってもモチベーションが上がらないので道連れに。Arduinoは小型のマイコンで、ハードウェアをつなげてソフトウェアを組み込むことでいろんなことに使える。とはいえまだ本体しかないので、いろいろ揃えていかないと何もできないかな。