Raspberry Pi 2 に Windows 10 IoT Core を乗せて Hello world するまで

詳細は、公式 Windows IoT – Get Started と、翻訳 Raspberry Pi 2へのWindows 10 IoT Core Insider Preview版のインストール方法 ≫ DesignSpark を見てもらうとして、RasPi に Windows IoT を乗せるときに躓きそうな点を補足しておきます。

micro SD カードに Windows IoT Core を焼く

Widows 10 が乗るのは、Raspberry Pi 2 のみで、それ以前のものはダメな訳ですが、Get Started からダウンロードできる、Windows_IoT_Core_RPI2_BUILD.zip の中にある Flash.ffu ファイルを焼くことができるのは Windows 10 TP だけです。Raspberry Pi に Linux を入れるときに Win32DiskImager などを使っていると思うのですが(Linux のコマンドを使って書き込むこともできます)、Windows IoT の場合は、Windows 10 にある dism コマンドというものを使います。

diskpart
list disk

を使って、ここに出てくるドライブの番号(micro SDカードのドライブ番号)を使って、dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck のように書き込みます(PhysicalDriveN の部分は、ドライブ番号に従って、PhysicalDrive3 のように書き換えます)この時、Windows 8.1 にある dism コマンドには /ApplyDrive スイッチがなくて書き込めないのです。この /ApplyDrive スイッチは、Windows 10 TP にしかありません。公式サイトには、最新の Windows TP より高いものと書いてありますが、ちょっと前のバージョンでも大丈夫でした。

朗報です、VMWare Player に Windows 10 TP を入れて micro SD カードをドライブとして認識させてから、同じように dism コマンドを使って書き込むことができます。これで、実機の Windows 10 がなくても RasPi に Windows 10 IoT が入れられます。

ちなみに、一度書き込んだ micro SD カードを Win32DiskImager でバックアップを取って、再び書き込むと正常に動作しました。なので、雛形の SD カードを作っておいて、コピーを取って増産することは可能です。

Windows 10 IoT Core を起動する

PC から micro SD カードを焼いたら、Rapberry Pi 2 に差し込んで起動します。Boot Windows 10 IoT Core Insider Preview にある通り、

  • micro SD カード
  • LAN ケーブル
  • HDMI ケーブル
  • 電源用の USB ケーブル

を差して起動します。スターンドアローンなのだから、と思って LAN ケーブルを差し込まずに立ち上げると、起動に失敗します。リモートデバッグ用のサービスが常に立ち上げって来るためか、IP が必ず必要になります。ただし、2度目以降の場合には、LAN ケーブルがなくてもうまく立ち上げります。

USB コネクタにマウスを差しても無反応です。Raspberry Pi のサイトでは xbox のコントローラを差しているシーンがあるので、後からの設定で可能かもしれません。

初回の起動は時間がかかって 2,3 分かかります。何度か真っ黒な画面になりますが、右上にカラー指標の表示が出ていれば大丈夫です。

https://pbs.twimg.com/media/CD3M_BqVAAAKJ4c.jpg

Windows IoT Core Watcher で接続する

このままでは何もできないので、RasPi に接続します。接続する方法は2種類あって、

  • Windows IoT Core Watcher
  • PowerShell

があります。Windows IoT Core Watcher は、Windows 8.1 のブラウザ(Windows 10 の H” を使っても ok です)を使ってアプリをデプロイしたり、プロセスを見たりできます。PowerShell のほうは、普通にリモートログインする方法なので、通常の Windows サーバーと同じように扱えます(中身は違うでしょうが、コマンド自体は大体同じはずです)。

Windows_IoT_Core_RPI2_BUILD.zip を解凍したときの、WindowsDeveloperProgramForIoT.msi を実行すると、Windows IoT Core Watcher がインストールできます。RasPi にインストールした状態では、ホスト名が minwinpc になっているので、ping 等で確認すればよいでしょう。公式サイトにたくさんの minwinpc が並んでいるのはネットワーク上にたくさんの RasPi があるからです。

image

注)Windows 10 IP + Visual Studio 2015 RC の環境や、素の Windows 8.1 の環境に入れても、この画面がでないことがあります。この場合は http://minwinpc/ を直接開けば大丈夫です。つまりは、80 ポートがマネージャ用に常に利用されているということです。

あるいは、

Raspberry Pi ? View topic – WindowsIoTCoreWatcher
https://www.raspberrypi.org/forums/viewtopic.php?f=105&t=109192

を参考にして、

sn -Vr WindowsIoTCoreWatcher.exe
corflags WindowsIoTCoreWatcher.exe /32BIT+ /FORCE

を実行してください。64bit版の Windows の場合に上記の現象が発生するとのこと(おそらく、MS開発者の環境が 32bit なのでは?という推測がw)

繋げたい RasPi を選択して、右クリックから Web Browser Here を選択すると、B Web Management というのが開かれます。アプリのデプロイ用の画面やパフォーマンス、プロセスを見ることができます。

image image

左上にシャットダウンや再起動のボタンがあるので、これを利用すればよいでしょう。画面自体はマウスが効かないので、触れないので。まあ、所詮マイコンレベルなので、USB 給電のケーブルをぶちッと抜いても大丈夫です。たまにファイルが壊れるようですが、だいたいが復旧してくれます。

PowerShell でログインする

Windows IoT – Use PowerShell to connect to a Windows IoT Core device. のようにすると、PowerShell を使って RasPi に接続できます。この例では Windows 10 TP からになっていますが、Windows 8.1 からでも大丈夫です。

image

初期のホスト名は minwinpc なので

Set-Item WSMan:\localhost\Client\TrustedHosts -Value minwinpc
net start WinRM
Enter-PsSession -ComputerName minwinpc -Credential minwinpc\Administrator

とすると、管理者権限でログインができます。パスワードの初期値は、p@ssw0rd です。

Hello World を作る

IoT 絡みの最初としては Lチカなので、https://github.com/ms-iot/samples の Blinky を動かしても良いのですが、あえて Hello world. を動かしてみます。基本的なところは Windows IoT – HelloWorld にある通りですね。

Windows 8.1 に Visual Studio 2015 RC を入れます。Windows ストアアプリを作らないのであえば、Windows 8.1 でも大丈夫です。シミュレータ上で動かすので、Windows Phone 10 のアプリは作れるようですね。

.Net micro のようにテンプレートが分かれていないので、Windows Universal アプリで作ります。

image

ペタペタと Hello World のボタンとラベルを貼って、ボタンをクリックしたときのイベントを書きます。実際には RasPi からボタンをクリックできないのですが(多分、USB が反応していないだけだと思う)、まあ一通り作ります。

RasPi への動作は「リモートコンピュータ」で、RasPi のホスト名「minwinpc」を指定すれば ok です。このとき、Windows 認証のチェックを外しておきます。もうひとつ、ソリューションプラットフォームを「ARM」にします。RasPi では CPU が ARM なので、初期値の x86 では動きません。

うまくビルドとデプロイが成功すると、HDMI 接続されているディスプレイに Hello world が表示されます。

https://pbs.twimg.com/media/CD44CvOUUAAtGZA.jpg

Lチカの準備をする

Windows IoT – Blinky Sample を見ながらプログラムを組んでいきます。新規にプロジェクトを作るときは参照設定で、Windows IoT Extension SDK を入れておきます。

image

netduino を使って .net micro を扱ったことのある方は、だいたい似たような感じになっていることが分かるでしょう。Windows.Devices.Gpio 名前空間で GPIO の LOW/HIGH を設定すれば、そのまま完成です。タイマーイベントとか、タクトスイッチのイベントにはラムダ式を使えるので、そのあたりでは C# が便利です。

ひとまず、Netduino で作った TA7291P モータードライブを Netduino でリモート制御する | Moonmile Solutions Blog を、RasPi に直していこうかなと思っています。出来上がったら、ぼちぼちと追記していきますので。

追記

カテゴリー: RaspberryPi, Windows 10 | 3件のコメント

グリッパーアームロボットを Arduino で制御する準備

先日買った、ロボットアームは、以下のように5つのモータを7つの配線で制御している。電子部品は使わずに、電源を2つ持たせることでモーターを正逆転させるという古風かつ便利な仕組みです。image

左半分がモーターと電源を含む本体で、右半分がコントローラー。7本のコネクタを使ってコントローラーと接続さえている訳で、このコントローラ部分を Arduino に置き換える目標を立てます。が、ここの部分って、モーター電源と信号線を兼ねてしまっているので、どうせ H ブリッジ方式に切り替えるのだから、モーターから2線を受け取ってしまって、普通にブラシモーターを正逆転させる方式でもよいかな、と。

まあ、それでも思考実験的に考えると、配線はそのままにしてスイッチ部分をリレーに切り替えるのがベタなな手段だと思います。あるいは、コンデンサを使って増幅してやればいいと思うのですが、ですが、なんかあれこれと面倒臭そうなので、素直にモータードライバを使おうかなと。リレーでカチカチやってみたいのですが、これは購入した時点でいずれ。

カテゴリー: 開発 | グリッパーアームロボットを Arduino で制御する準備 はコメントを受け付けていません

ロボットアームを買ったので、改造計画を立てる

勢い余って組み立て式のロボットアームを買いました。ロボットアームって、ブーム自体は2,3年ぐらい前にあって、各社で発売されていたのですが結構高価だったのとブームが家庭用二足ロボットに移ってしまったのか、今日び非常に手に入りにくい状態でした…まあ、結構な値段だったので手が実験にせよ手が出なかったわけですが。

で、ebay なんかを眺めていると、↓なロボットアームが売っていてですね、もうちょっと調べていくと amazon にもありました。Amazon.co.jp | グリッパーアームロボット 40320C | おもちゃ 通販 今回買ったのは amazon ではないのですが、何故か色々な値段であちこちで売っています。在庫処分っぽい感じ。

https://pbs.twimg.com/media/CDZkJfZVIAAGG2d.jpg:large

発売元が、株式会社イスペット でメイドイン台湾です。amazon の評にもありますが、コントローラが非常に固くて子供に手には…つーか、大人の指にまめができそうなぐらいなんですけど、これはコントローラの接点で使っている金具の強度の問題ですね。曲げをもう少し緩くすればいい感じになるかと。モーターは5個入っていて、台座+アームの開け閉め+腕x3 という構成です。惜しいのは手首部分の回転が入っていないので、アームが回転しません。あと、モーター自体は普通のブラシモーターでサーボモーターではありません。つまり、電子回路制御ではないんですよね。廻しすぎるとギアが外れてカチカチなるようになっている(構造上そうなっている)ので、それはそれで良いのです。電池は、単1電池を4個という構成になっていますが、実はモーターを3Vで動かします。そう、モーターの駆動部分には電子部品を使っていないので、電源2個使ってモーターの正逆をする回路になっています。すごい。というわけで、全く電子部品を使っていないので、5,000円程度という格安な値段になっています。サーボモータを使っていないのも安い要因かと。

外枠はプラモデルの要領で作って、約2時間ほどかかります。部品はそれほど多くないのだけど、はめ込み式ではなくてビスで止めるので、ちょっと手間がかかります。ですが、後から外すこともできるわけで、改造はできそうですね。

現状の回路は、こんな感じになっています。電源を2つ反転させておいて、スイッチで切り替える古式ゆかしき方式。電子部品を使わないので、半田付けもないし難しい基盤も必要ありません。

image

ただし、これだと Arduino とかのマイコンからは制御しづらいので、適当にモータードライバを差し込んで、回路から制御できるようにしましょう。

ちなみに、今日1日試してみた感じでは、積木を詰める位の精度があります。単1電池4個分の重さもあって結構台座が安定しているので、アームをきりきりと動かすして何かを挟んで持たせることができます。こうなったら、車輪を付けて自走させてもいいんじゃないかってほどの安定性があります。

そんな訳でこれを参考にして、

  • LEGOと安価なサーボモータで別のアームを作る。
  • 手元の meArm の制御を Arduino に移す。
  • このロボットアームの Arduino 化&無線化

をやっていこうかなと。

ちなみに、このロボットアームの電子回路版を海外のサイトで見つけました。1万円位だったので、まあ、電子制御の部分は勉強がてら自分で作るのが良いかなと思って。

カテゴリー: Arduino | ロボットアームを買ったので、改造計画を立てる はコメントを受け付けていません

.NETラボ 4月号で発表した Bluetooth の話

[slideshare id=47146691&doc=arduinotankmeetsbluetooth-150418122039-conversion-gate01]

ざっと1時間で流していった発表資料です。本来ならば Bluetooth Low Energy のほうの実装を実演すると良かったのですが、デモのほうは Bluetooth 2.0 を使ってシリアル通信をやっています。コードは、部分的ではありますが、

  • Android アプリで BluetoothAdapter を使ってシリアル通信
  • Windows ストアアプリで RFCOMM クラスを使ってシリアル通信
  • WPF アプリで WinRT の RFCOMM クラスを使ってシリアル通信

の 3パターンが書いてあります。実は Windows Phone 10 TP を使っての通信もできています。

動かす Arduino Tank のほうは、HC-05 の Bluetooth 2.0 モジュールを使って通信させています。BT 通信を使うメリットとしては、「WiFi のようにアクセスポイントが必要ない」の一言に尽きます。家で使うとか、庭でアクセスするとかであれば無線LANを使えばいいのですが、あれこれと Raspberry Pi を使って meArm を動かして気づいたのですが、結構 WiFi だと実演が面倒なんですよね。BT の場合もアクセスポイントの混線の問題もありますが( BT の場合、実質 30 台ぐらい同時接続すると無理だと思う)、WiFi のほうが繋がりが悪くてよく切れます。あと、公園に持っていて手軽に動かせるのも BT の利点です。技適の問題もありますが、スライドにもあるように 2.4GHz 帯はラジコン電波の領域なので、Class2 までの弱い電波ならば大丈夫です。むしろ、WiFi の 5GHz のほうが問題だったりする訳なので、そのあたりは良識に任せてなんなんとしましょう。

スライドの後ろのほうには、Bluetooth の購入先が書いてあります。日本の販売店があまりないのは、値段が高いからっていうのと、手軽に eBay.com で揃えたほうが安く上がるためです。まあ、中国から送ってくるので、2,3週間は覚悟しないといけないので、そのあたり、手早く手に入れたい場合は日本の販売店で、故障も含めて大量に仕入れたい場合は中国で、という使い分けをします。ちなみに、ebay が常に安いわけではなく、中国の工場や互換品を買うと安く手に入りますが、アメリカや日本の製品だとあまり変わらないか高くつきます。このあたり、送料なんかも調べて買うとよいです。

image

ちなみに、Arduino Uno の互換ボードは 7$ ぐらいで買えるので、これも壊しても惜しくない値段で手に入れられます。Arduino Mini だと 3$ ぐらいだから、ユニバーサル基板に半田付けして大量に使うこともできますね。

Bluetooth LE のほうは、ヴィストン社で BLEduino や、あれから Koshian を手に入れたので、それのテストが終わったら、また発表したいと思います。

カテゴリー: Arduino, Bluetooth | .NETラボ 4月号で発表した Bluetooth の話 はコメントを受け付けていません

Arduino で TB6612FNG を使ってモーター2個を制御する

海外のモータードライバと言えば L293D が乗っていることが多いのですが、ぼちぼちと SN754410NE に切り替えるのか?と話題があって。こっちのほうは秋月電子で150円で買えます。

それとは別に、TB6612FNG を買ってみたのでお試しとして。手元にあるのはスイッチサイエンスのものではなくて互換品で 3$ 程度で買っています。

ブレッドボードで配線

それぞれのモーターに対して IN/OUTが2本ずつとPWM線があるので、結構本数が多いのが難点ですね。まあ、Arduino Tank を動かだけの2個のモーターならばいいけど、多脚ロボットにしてそれぞれの足にモーターが付いている、ということになると、ちょっと考えないといけないかも。I2C 経由にすればよいのですが。いずれ ロジコマ作ってみる【ぼーだー1】 ‐ ニコニコ動画:GINZA を参考にして作ってみたいところ。

image

回路図

無線化もあわせると、こんな感じ。

image

ブレッドボードに配線すると、こんな感じで動きます。

埋め込み画像への固定リンク

 

実験用のコード

まだ Bluetooth のコードは入れていないので後で。

#include <Wire.h>

const int motorA1 = 8;  // IN1
const int motorA2 = 9;  // IN2
const int motorAp = 10;  //
const int motorB1 = 7;  // IN1
const int motorB2 = 6;  // IN2
const int motorBp = 5;  //
const int STBY = 11;
void setup() {
  // put your setup code here, to run once:
  pinMode( motorA1, OUTPUT );
  pinMode( motorA2, OUTPUT );
  pinMode( motorAp, OUTPUT );
  pinMode( motorB1, OUTPUT );
  pinMode( motorB2, OUTPUT );
  pinMode( motorBp, OUTPUT );
  pinMode( STBY, OUTPUT );
  
  digitalWrite( motorA1, LOW );
  digitalWrite( motorA2, LOW );
  digitalWrite( motorAp, LOW );
  digitalWrite( motorB1, LOW );
  digitalWrite( motorB2, LOW );
  digitalWrite( motorBp, LOW );
  digitalWrite( STBY, HIGH );
  
  Serial.begin(9600);
  Serial.println( &quot;Motor Standby&quot; );
  delay( 1000 );
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(&quot;motorA forward&quot;);
  digitalWrite( motorAp, HIGH );
  digitalWrite( motorA1, HIGH );
  digitalWrite( motorA2, LOW );
  delay( 3000 );
  Serial.println(&quot;motorA stop&quot;);
  digitalWrite( motorAp, LOW );
  delay( 1000 );
  Serial.println(&quot;motorA back&quot;);
  digitalWrite( motorAp, HIGH );
  digitalWrite( motorA1, LOW );
  digitalWrite( motorA2, HIGH );
  delay( 3000 );
  Serial.println(&quot;motorA stop&quot;);
  digitalWrite( motorAp, LOW );
  delay( 1000 );

  Serial.println(&quot;motorB forward&quot;);
  digitalWrite( motorBp, HIGH );
  digitalWrite( motorB1, HIGH );
  digitalWrite( motorB2, LOW );
  delay( 3000 );
  Serial.println(&quot;motorB stop&quot;);
  digitalWrite( motorBp, LOW );
  delay( 1000 );
  Serial.println(&quot;motorB back&quot;);
  digitalWrite( motorBp, HIGH );
  digitalWrite( motorB1, LOW );
  digitalWrite( motorB2, HIGH );
  delay( 3000 );
  Serial.println(&quot;motorB stop&quot;);
  digitalWrite( motorBp, LOW );
  delay( 1000 );
}
カテゴリー: Arduino | Arduino で TB6612FNG を使ってモーター2個を制御する はコメントを受け付けていません

Adafruit Trinket を使ってモーター1個を動かす(TA7267BP編)

以前、8pino を使って DRV8830 を動かしてみましたが、I2C の信号線とモーターへの給電線が一緒になっているので、8pino 自体に無理がかかって I2C が暴走してダメでした。という訳で、電子回路への給電(5V あるいは 3.4V)とモーター自体への給電を分けて回路を組まないと駄目ですね、ってことで TA7267BP を使ってみます。秋月電子で 2個300円で買えます。先に試してみた TA7291P よりも少しだけ小さくていいかな、と思ったのですが、DRV8832DGQR というさらに小さいのがあるので、小型の場合はそっちを使ったほうがよさそう。表面実装用なので、半田付けが大変そうですが。一応、これも買ってみたので後で試してみます。

ブレッドボード

組み合わせとしては、手元の Trinket とつなげています。8pino と同じ ATtiny85 なので、同じ作りになります。これも小型化だけ目指すのだったら、チップだけ買えばいいわけで、【Arduino】ATtinyをArduinoで開発する – The jonki を参考にして、Arduino を使って焼き込むことができます。これも後で試す予定。

image

給電は別にしたいといいつつ、6番ピンの Vs と 7番ピンの Vcc に Trinket と同じ電池から給電してます。別電源にしたい場合は、6番ピン(左から6番目)へ 0~18V の間で電圧を掛ければok。

回路図

image

別給電にする場合

image

image

 

 

この状態で、モーター1個を制御できます。ピンは3本余っているので、HC-05 につなげて Bluetooth で無線化することも可能ですね。たぶん、Vs に対しては、PWM 制御ができると思うんですが、前後に動かすだけだったら、特に速度制御の必要はないかなと。

埋め込み画像への固定リンク

これを小さ目に組んで、プラレールの電源車…は高いので、ダイソーの100円の電車に乗せていきます。電池4個は大きいので、3Vのボタン電池を2個つなげるか、手元にあるミニヘリのバッテリーを使ってみる予定。

ちなみに動かしているのは美工社の工作セット 車軸付モーターギヤボックス2セット で480円です。遅めのギアまでくっついているので、工作には便利ですね。タミヤのギアボックスの一番遅い組み合わせ位の遅さで動きます。ラジコンとしては遅いけど、こういう風な実験で動かすときには、回転が遅いほうが途中で止められるので便利です。思ったより、でかかったけど。

カテゴリー: Arduino | Adafruit Trinket を使ってモーター1個を動かす(TA7267BP編) はコメントを受け付けていません

Arduino Nano と L293D で Arduino 戦車を作る

回路図はまた後で書くとして、Arduino Nano を使った Arduino 戦車です。正確には Arduino Nano の互換機なのですが、さっくりと動きました。

Arduino 戦車3号機

モータードライバに L293D を使って、無線化は HC-05 で 2号機と同じ構成です。5×7 cm のユニバーサル基板に、Arduino Pro Mini ごと乗っかっています。モーターへの給電を別系統にしようとおもったけど、面倒になって Arduino の 5V から取り出し。それのコネクタがないので、Vin/GND に AAAx4 を繋げてしまいます。

埋め込み画像への固定リンク

前?に乗っけているのは、超音波の距離センサ(HC-SR04)です。壁にぶつからないとか、そういうのに使う訳ですが、スケッチのほうはまだできていないので乗っけているだけ。

埋め込み画像への固定リンク

ユニバーサル基板自体が、Arduino Uno とそう変わらない大きさなので、モーターシールドを自作ても大きさはあまり変わりません。まあ、一体型になっているので、取扱い?が楽なのと、戦車のプラモデルに乗っけるのに小型化してみたかったというところです。ユニバーサル基板だと配線の関係で、かなりしんどいので、これから先はプリント基板を作ることになるかなと、KiCad を勉強中。

ただ、ここまでするんだったら、Mini を使わずに Arduino Uno のマイコン部分だけを使って適当なモータードライブと乗せて作るといいんだろうなと。それはまた別途作ってみよう。

最終的には、この構成に

  • サーボモーター制御 x4 or x6
  • 加速度センサ、ジャイロセンサ

も乗せていく予定です。

ひとまず、1,2,3号機を同時に動かしたいので、板とギアボックスで、あと2台さっさと作ります。BL モジュールは、HC-06 が x5 あるので、それを使っていきましょう。

カテゴリー: Arduino, Bluetooth | Arduino Nano と L293D で Arduino 戦車を作る はコメントを受け付けていません

L293D 利用して Arduino 戦車を作る

もうちょっと、中途を書こうと思ったのですが、ここ2週間あまりで一気に進みました。モーターの電源をマイコンから給電すると、モーターが動く瞬間にパルスが走って Arduino が落ちます。なので、別系統で電源を入れるようにするために、TA7291P を使ってみました。が、両方の車輪を回すのに2枚必要ならば、面倒だからもともとある L293D を使ってみようかな、と中国から10個ほど輸入しました。輸入って言ったって、ebay.com から買っているだけで、国際郵便で2,3週間で届きます。

Arduino 戦車1号機

回路図とか配線とかは後で出すとして、部品はこんな感じ。

  • L293D フルブリッジのモータードライブ(モーターが2個動きます)
  • LED 2個(動作確認用)
  • HC-05 Bluetooth モジュール
  • タミヤのギアーボックス
  • タミヤのキャタピラ
  • Arduino Uno 互換機
  • Arduino 用シールド基板
  • 100μF 電解コンデンサ、電源用のコネクタなどなど

ってことで、値段的には、3,000円掛かっていないと思います。まあ、その裏側で Bluetooth モジュールをつぶしたり、配線はしたものの動かないシールドが3枚あったりと、試作つぶれがあるわけですが、そのあたりは電子回路初心者なので仕方がない。でも、まあ、半田をひと巻き使い切るぐらいには、半田付けをしたのでそれなりには上手くなってきたかなと。いや、上手いかどうかは別として、半田付け自体に抵抗が無くなってきたのは確かです。

埋め込み画像への固定リンク

これは、先日の JXUG のライトニングトークスで発表したように Bluetooth 経由で PC や Android から動かせます。Bluetooth 2.0 のシリアル通信(SPP)を使っているために、iPhone では動きません。このあたりは、BLE 対応にして別途設計する予定です(手元に HM-10 のモジュールがあります)。

Arduino 戦車2号機用シールド

1台だけ作るのでは面白くないので、2台目も作りました。この度は、Bluetooth モジュールだけでなく何かのセンサーを付けれるように SCL/SDA のラインをあらかじめ入れてい有ります。右上のコネクタがそれです。LED は信号機っぽく、赤/黄/青 の 3つを付けています。

右下のジャンパーピンは、Arduino からの 5V 給電と、別給電を分ける仕組みです。保護回路は入れていないので注意が必要ですが。なんか、Arduino の 5V を並列で入れればモーターのほうも動くのでこうしています…が、ちょっとモーターの操作を厳しくやると(前進、後進を繰り返すとか)Arduino がリセットするので、やっぱりパルス対策は必要みたいですね。パスコンを適当に入れただけではダメなようです。

埋め込み画像への固定リンク

最初は、ユニバーサル基板に沿って、ずずメッキの線を引いていたのですが、だんだん面倒くさくなって空中配線しています。なんか、危なそうな配線なので、もうちょっとチップ回りの配線は考えたほうがいいようです。プリント基板を外注するのでもいいのですが、試作段階だし、ブレッドボードにちょっと毛が生えたぐらいのことしかやっていないので、このあたりは手配線でスピードを稼ぎたいところです。この配線自体は、Vcc と GND を逆にしてしまったので、途中でやり直しています(表裏を見るのを間違えたという)。結果、3時間以上掛かってしまっているという体たらく。

埋め込み画像への固定リンク

↓な感じで、モーターシールドを自作されている方もいるので、自分も頑張りたいところなんですよね。

Festina lente. – Arduino用モーターシールド自作の記録
http://mikilabo.tumblr.com/post/111652585283/arduino

勿論、モーターシールド自体を買ってしまって、そのうえにセンサーの類を乗っけてというのもいいんですが、最初のステップは実地で体得しておきたいところなので、手間暇かけてやっています。

Bluetooth 接続する

Bluetooth 2.0 を使ったシリアル通信なので、結構汎用的に使えます。Android から制御するのが、手軽なのですが、他にも色々できます。

Lumia 1520 に Windows 10 TP を入れて動かしてみたり、

埋め込み画像への固定リンク

デスクトップ PC に Bluetooth ドングルを差して、WPF から動かしてみたりすることができます。

埋め込み画像への固定リンク

スマートフォンや PC 絡みは結構簡単に拡張ができます。

お次は DualShock3 のコントローラーと Wii コントローラーで動かしたいところですね。Raspberry Pi の場合はそれなりに動かせるのですが、まだ Arduino では試していません。このあたりは、RasPi + Arduino のハイブリッドでもいいかもしれません。

ちなみに、Bluetooth 絡みは今週末の .NET ラボ勉強会で解説します。Bluetooth Low Energy の方も含めて(たぶん、BLE の実演のほうは無理かもしれんけど)、色々買い集めた Bluetooth モジュールなどの実物を見せながら、という感じでやっていきます。

カテゴリー: Arduino, Bluetooth | L293D 利用して Arduino 戦車を作る はコメントを受け付けていません

TA7291P モータードライブを Netduino でリモート制御する

HC-05 Bluetooth のインターフェースはシリアル通信なので Netduino からシリアル通信すれば良いだろう、ってことで試してみました。配線は TA7291P モータードライバと HC-05 を使ってモーターを無線制御 | Moonmile Solutions Blog とほぼ同じ。HC-05 との通信線が、D2, D3 に割り当てられていて COM2 で接続するところが違います。たぶん、COM1 は D1, D2 の組み合わせでないかと。Joe’s Blog: Using a Cheap Bluetooth Shield on the Netduino を参考にして作っています。

埋め込み画像への固定リンク

ブレッドボード

TA7291P は外部電源からモーターを動かすことができるので、単三2個の電池はモーターを動かすために接続します。
TA7291P_モーター1個_Netduino_ブレッドボード

回路図

電池のほうにもパスコンがあったほうがいいのか?一応、回路図を。
TA7291P_モーター1個_Netduino_回路図

C# のコード

public class Program
{
	public static void Main()
	{
		// write your code here
		new Program().main();
	}
	public void main()
	{
		OutputPort pin8 = new OutputPort(Pins.GPIO_PIN_D8, false);
		OutputPort pin9 = new OutputPort(Pins.GPIO_PIN_D9, false);

		// D2,D3 に接続すると COM2 がつながる
		SerialPort serial = new SerialPort(SerialPorts.COM2, 9600, Parity.None, 8, StopBits.One);
		serial.DataReceived += (s, e) =>
		{
			byte[] data;
			// 2バイト連続で送られてこないことがあるので、
			// 1バイトずつ読み込む
			// たぶん, writer.WriteString(&quot;MF&quot;) な感じで送っているから?
			byte data1 = (byte)serial.ReadByte();
			if (data1 == (byte)'M')
			{
				byte data2 = (byte)serial.ReadByte();
				switch (data2)
				{
					case (byte)'F': // 前進
						Debug.Print(&quot;motor forward&quot;);
						data = System.Text.Encoding.UTF8.GetBytes(&quot;forward-&quot;);
						serial.Write( data, 0, 8);
						pin8.Write(true);
						pin9.Write(false);
						break;
					case (byte)'B': // 後進
						Debug.Print(&quot;motor back&quot;);
						data = System.Text.Encoding.UTF8.GetBytes(&quot;back----&quot;);
						serial.Write( data, 0, 8);
						pin8.Write(false);
						pin9.Write(true);
						break;
					case (byte)'0': // 停止
						Debug.Print(&quot;motor stop&quot;);
						data = System.Text.Encoding.UTF8.GetBytes(&quot;stop----&quot;);
						serial.Write( data, 0, 8);
						pin8.Write(false);
						pin9.Write(false);
						break;
				}
			}
		};
		/// シリアル受信開始
		serial.Open();
		/// 無限待ち
		Thread.Sleep(Timeout.Infinite);
	}
}

new SerialPort でシリアルポートを初期化して、Read/Write します。Read は複数バイト取れるのですが、送信する(ストアアプリ)方で、writer.WriteString(“MF”) な感じで送信しているせいか、1バイトずつ送られてくることがあります。仕方がないので ReadByte を使って1バイトずつ読み込みます。まあ、これでもスピードは十分かと。

Write のほうもバイナリで送るので、Arduino のように println がないのでデバッグにはちょっと使いづらいのですが、Netduino の場合は Debug.Print することで、Visual Studio に出力することができます。ブレークポイントも置いてプログラムを止めることもできるので、実はデバッグは非常にやりやすいです。Android 実機を Xamarin Studio で操作している感覚で使えます。このあたりは、Netduino 自体の要求スペックが高いことと、.NET Framework であることが効果をあげていますね。プロトタイプ的に Netduino で探っていって、Arduino にコードを移すことも考えられるでしょう。…が、壊してしまうと Netduiono のほうが高いので、そのあたりは安い Arduino(びんぼうでいいのとか)をつかってバンバン試すってのもありですね。

カテゴリー: C#, Netduino | TA7291P モータードライブを Netduino でリモート制御する はコメントを受け付けていません

TA7291P モータードライバと HC-05 を使ってモーターを無線制御

昔から定番らしい、TA7291P を使ってモーターを駆動させます。DRV8830 の I2C 制御とは違って、GPIO ピンを2本使ってモータの正反転を制御します。ピンから送る信号を analogWrite を使ってパルスにすれば PWM 制御できるらしいので(本来の使い方ではないけど)モーターを可変でも動かせます。秋月電子で2個セットで買えます。

ただし、2個動かすならば L293D というモータードライバが、Arduino のモーターシールドには乗っています。2個のモーターを同時に自作しようかなと思ったのですが、L293D は日本では売ってません。でもって、この L239D の後継?っぽいのが、TB6612FNG ってやつで、これはスイッチサイエンスさんとかで売ってます。TA7291P もそうなのですが、制御線とモーターへの電力線が別に取れるので、結構な大電流をモーターに流すことができます。たぶん、モーターの回転によるパルスとがが制御線に与える影響も少ないかなと思うのですが、これは調べてみないとわかりません。DRV8830 を2個使ってモーターを動かしたときに、たまに I2C の信号が暴走してしまうらし、モーターが回りっぱなしになるんですよね。適切な抵抗とコンデンサを入れてやれば低減できるような気もするのですが、これはちょっと初心者には厳しい。センサーの類とかを同時につなげると良く分からない状態になりそうです。これは実地で調べていく予定。

ブレッドボードで組み立て

 

TA7291P_モーター1個_ブレッドボード

例によって、ブレッドボードの組み立てはこんな感じです。Frizing で TA7291P の部品を作って配置してみたのはいいけど、回路図のところが大きすぎて不細工なので…回路図のほうが後から。

image

端子はデータシートから。回路は モータドライバの使い方について -byうしこlog を参考にして作っています。Arduino の 8,9 ピンにつなげて正反転を制御しています。ここのピン番号がお好みで。Arduino から 5V 給電しているところに 100μF 程度のコンデンサを入れると Bluetooth から制御したときにモーターの動作が安定します。パスコンは、もっと計算しないと駄目かと思ったけど、意外とフィーリングで大丈夫そうなので、パスコンって何? を参照にして適当に(苦笑)。

例によって HC-05 を使って Bluetooth 制御するので、TX/RX をつなげておきます。

Arduino のスケッチ

#include <Wire.h>

const int OUTR1 = 8 ;
const int OUTR2 = 9 ;
const int OUTL1 = 10 ;
const int OUTL2 = 11 ;

void setup() {
  // put your setup code here, to run once:
  pinMode( OUTR1, OUTPUT );
  pinMode( OUTR2, OUTPUT );
  pinMode( OUTL1, OUTPUT );
  pinMode( OUTL2, OUTPUT );
  digitalWrite( OUTR1, LOW );
  digitalWrite( OUTR2, LOW );
  digitalWrite( OUTL1, LOW );
  digitalWrite( OUTL2, LOW );

  Serial.begin(9600);
  Serial.println( &quot;Motor Standby&quot; );
  delay( 2000 );
}

void loop() {
  int len = Serial.available();
  if ( len < 2 ) return ;
  int type = Serial.read();   // M/N or L
  int num  = Serial.read();   // MF/MB/M0, L0/L1

  if ( type == 'M' || type == 'N') {
    int mode = 0;
    switch ( num ) {
      case '0': mode = 0; break;
      case 'F': mode = 1; break;
      case 'B': mode = 2; break;
      default: mode = 0; break;
    }
    switch ( mode ) {
      case 0: 
        Serial.println(&quot;stop----&quot; );
        if ( type == 'M' ) {
          digitalWrite( OUTR1, LOW );
          digitalWrite( OUTR2, LOW );
        } else {
          digitalWrite( OUTL1, LOW );
          digitalWrite( OUTL2, LOW );
        }
        break;
      case 1:
        Serial.println(&quot;forward-&quot; );
        if ( type == 'M' ) {
          digitalWrite( OUTR1, HIGH );
          digitalWrite( OUTR2, LOW );
        } else {
          digitalWrite( OUTL1, HIGH );
          digitalWrite( OUTL2, LOW );
        }
        break;
      case 2:
        Serial.println(&quot;back----&quot; );
        if ( type == 'M' ) {
          digitalWrite( OUTR1, LOW );
          digitalWrite( OUTR2, HIGH );
        } else {
          digitalWrite( OUTL1, LOW );
          digitalWrite( OUTL2, HIGH );
        }
        break;
    }
  }
}

このスケッチは、モーターを2個使ったものですが、8,9 ピンを交互に LOW/HIGH してやれば反転します。両方 HIGH にするとブレーキがかかる状態ですが、ここでは制御していません。ここの digitalWrite 関数のところを、analogWrite 関数を使ってやれば、モーターの回転数を制御できます。ただし、マブチモーターぐらいだと、高速/中速/低速ぐらいしかできないだろうから(回転数が分からんし、あとはギアで変えてしまうし)Nゲージを動かすとか、プラレールを動かすとかぐらいならば、前後進だけでいいような気がします。これは、実際に Trinket mini を使って試す予定。

埋め込み画像への固定リンク

でもって netduino で試してみよう

Netduino、知ってますか? – Build Insider で連載が開始したようなので、Netduino でもやってみます。コードは、こんな感じ。Bluetooth にはつなげずに、単純に 8,9 ピンを使って正反転を繰り返しているだけです。

public class Program
{
	public static void Main()
	{
		// write your code here
		new Program().main();

	}
	public void main()
	{
		OutputPort pin8 = new OutputPort(Pins.GPIO_PIN_D8, false);
		OutputPort pin9 = new OutputPort(Pins.GPIO_PIN_D9, false);
		Thread.Sleep(1000);
		new Thread(() =>
		{
			while (true)
			{
				// 正転
				Debug.Print(&quot;motor forward&quot;);
				pin8.Write(true);
				pin9.Write(false);
				Thread.Sleep(3000);
				// 停止
				Debug.Print(&quot;motor stop&quot;);
				pin8.Write(false);
				pin9.Write(false);
				Thread.Sleep(1000);
				// 反転
				Debug.Print(&quot;motor back&quot;);
				pin8.Write(false);
				pin9.Write(true);
				Thread.Sleep(3000);
				// 停止
				Debug.Print(&quot;motor stop&quot;);
				pin8.Write(false);
				pin9.Write(false);
				Thread.Sleep(1000);
			}

		}).Start();
		Thread.Sleep(Timeout.Infinite);
	}
}

このくらいの制御だと、Arduino も Netduino も変わらないのですが、結構複雑な処理をするときには、Netduino のほうがやり易いかなと思ってます。が、Netduino の認知度が低いので、Arduino のほうがハック的なライブラリがたくさんあって、そういう点では Netduino で進めるのは結構大変なんですよね。ただし、ライブラリは結構揃っているようなので(I2C制御を苦戦している感じなので、それぐらいの習熟度ですが)それなりに組みやすいはずです。ちなみに、2年前に fez spider を知った頃にデバイスドライバーズさんに聞いたのですが、Netduino 系のは結構クロック数が早いので、他の組み込みのようにリアルタイムによるセンサー受信も可能だそうです。.NET だとガベージコレクションだとか、アセンブリで書くより遅いのでは?とおもわれるかもしれませんが(私もそう思っていました)センサーのデータ受信をできる程度にはうまく動くてくれるそうです。このあたりも、Arduino, Netduino で試してみたいところです。

埋め込み画像への固定リンク

カテゴリー: Arduino, Netduino | TA7291P モータードライバと HC-05 を使ってモーターを無線制御 はコメントを受け付けていません