2016年8月28日日曜日

Naze32をiOSから設定してみた。

MuitiWiiのときはWinタブ使って現地で設定していたけど、Winタブを手放してしまったので今回はiPadやiPhoneで使えるようにしてみた。

使用するアプリはMobile Flightで、このアプリはBluetoothとWifiに対応してるみたい。
今回は先日購入したBluetooth 4.0モジュール(BLE-CC41-A)を使ってみた。

まずはBLE-CC41-AをPCにつなぎ、ボーレートのセットアップ。
AT+BAUD=8でCleanflightデフォルトの115200bpsに変更。
ついでにBluetoothで検索をかけた時の名前を変更してみた。

あとはNaze32に接続するだけ。ブレークアウト基板付きのモジュールなので5Vから電源をとってみた。

通信距離がながければこの画面は面白いかも。

ただ今回はBluetoothなので設定メインということで。
主にPIDの設定とかモータの確認とかなんだけど、これで手軽に設定できそうだなぁ

2016年8月22日月曜日

Naze32のBlackBoxの容量アップをしてみた。

Naze32 rev6 10DOFにはフライトレコーダのBlackBoxとして2MBのSPI Flashが搭載されているんだけど、16MBのSPI Flashが余っていたので交換してみることに。

もともと搭載されているのはMicronの25P16VPっていう品番のSPI Flashなんだけど、余っていたのはWT3020用に買ったWinbondのW25Q128。WT3020の時の感覚でとりあえずメーカ有ってなくても(ryというアレで…

早速2MBのSPI Flashをはがすと、Please donateという文字が…
安い基板にはSPI Flashが乗ってないからなのか、安い10DOFを買ってこんなことをする奴を想定しているのか…

今回交換するSPI Flashは200milサイズなので結構でかい。
なのでパターン的にはこんな感じで結構ぎりぎり乗る感じ。

このフライトコントローラはCleanflightに書き換えていたのでCleanflightを開くとBlackBoxの容量が確認できる。
交換後は何もしなくても16MBとして認識されてる!
これでバッテリ1本の飛行時間でも余裕でフライトログが取れるようになったはず。
まだNaze32にしてから飛ばしてないけど…
いろいろ更新しないといけないしなぁ。

2016年8月21日日曜日

Naze32 rev6を買ってみた

クアッドコプタのフライトコントローラがMultiWiiというのも古くなってきた感じがしたのでNaze32 rev6をポチってみた。
ケース付きで17ドルぐらいだった。

ピンヘッダも自前でハンダしないといけないけどL字とストレート選べるので便利かも。

よーくシルクを見るとなんか偽物っぽい…

ケースにはCleanflightって書いてあるのでCleanflightで接続してみると

なんか違うじゃん…

とりあえずCleanflightに書き換えて見ようかな。
ちなみに今回購入したのは10DOFなので、6軸の加速度センサと、3軸の電子コンパスと、高度計用の気圧計が搭載されていた。そしてBlackBoxは2MBのSPI NAND Flashが搭載されているという構成。
2MBだと1バッテリ分記録できるか微妙なところらしいしなぁ。

2016年8月12日金曜日

Bluetooth 4.0 BLEモジュールをiOSで使ってみた。

iOSでSPPを使うには結構高級なモジュールが必要で前にMultiWiiの設定するのもWinタブを使ってたんだけど、Bluetooth 4.0のモジュールだと安いモジュールでもiOSとシリアル通信できるようなので試しにポチってみた。

TIのCC2540、CC2541を積んだモジュールが500円以下とかで出回っているので試しにポチってみた。HM-10とHM-11ってのが有ったけどHM-11の方は小さいけど高いのでとりあえずお試しということでHM-10にしてみた。

5Vでも使いたかったので、レギュレータ付きのブレークアウト基板に実装済みのものを買ってみた。

とりあえずUSBシリアル変換アダプタでPCに繋いでみた。

PCにつなぐとモジュールのLEDが点滅して接続待機状態に。
接続待機状態のときはPCからシリアル通信経由でATコマンドが使える。
デフォルトのボーレートは9600だった。
このATコマンドでモジュールの設定変更が可能みたい。

ATコマンドでAT+HELPでコマンド一覧が出せる。
とりあえず今必要なのはボーレートの設定ぐらいだったんだけど、AT+BAUDを見てみるとBAUD4になってるんだけど、HM-10の説明書ではボーレート9600はBAUD0のはずなんだけど…

そんでもってAT+HELPに出てきたURLにアクセスしてみたところこのモジュールはHM-10ではなくてBLE-CC41-Aって言うモジュールだということが判明。HM-10にはクローンが何種類か有るみたいだけどファームウェアも違うのね…
BLE-CC41-Aの説明書をみてみるとボーレートの設定番号が違うのでクローンのモジュールの場合は注意が必要かも。

続いてはiOSからの接続。
設定のBluetoothからは全く見えないので調べてみるとアプリ側で直接接続しないといけないっぽい?
LightBlueっていうアプリで検索してみたらうまく発見できた。

BT05って言うのがこのモジュールみたい。この名前は先程のATコマンドで変更可能。
タップするとうまく接続できた。モジュールのLEDが点灯に変わるっぽい。

ちなみにこのモジュール、ATコマンドで設定するとiBeaconにもできるっぽい。
MultiWiiに積んでたモジュールより低消費電力みたいだし、値段も余り変わらないし…
Bluetooth 4.0で便利になったなぁ

2016年7月24日日曜日

I2C接続のDCモータドライバ

3年ぐらい前にRaspberry Piを自走式にして遊んでいた時のシャーシにつけてたモータドライバが煙を吹いてお亡くなりになられたのでI2C接続のモータドライバでも作ってみようかと。
モータドライバを作ると言ってもL298Nを使ったモジュールはeBayでお安く買ったのが在庫有ったのでこれこいつをPWMで制御できる程度のものでいいかなぁと
多分こいつも3年ぐらい前に買ったやつで、壊れたモータドライバのがだいぶ熱を持つし、パワーが無かったので買ってたやつかも。

Attiny85がたくさんあったのでとりあえずI2Cスレーブのライブラリと格闘してPWMが2ch分動かせたんだけど、結局L298で2ch分動かすにはロジックICを使うしかな差そうなんだけど残りの2chのデジタル出力がうまく行かなくて断念…
Arduino Pro microも在庫有ったんだけどi2cの関係で調べていたらオープンソースなモータドライバを見つけてしまったのでパクらせてもらった…

Grove I2Cモータドライバとして普通に売られてるものなんだけど、回路図もプログラムも公開されてるっぽい。
Atmega8はESC修理用のやつが有ったのでそいつを使用してみた。
ただしTQFPなのだ…

まずはおもむろにユニバーサル基板の上にカプトンテープを貼ってとりあえずプログラムを書き込んだ。
最初に書き込んだのはこの後配線が大変なことになりそうだから…
DIPスイッチはI2Cのアドレス変更に使うみたい。

端子を付けて完成。
スズメッキ線で結構裏面を使ってしまった。

3年前に作ってホコリをかぶっていたシャーシに再びモータドライバが!
このモータって3Vじゃなかったっけと言いつつこのモータドライバだと4.8V以上だったはずなのでエネループ4本で駆動してみた。
ちなみにL298Nモジュールにレギュレータ載ってるけど、今回のように低い電圧で動かす場合はジャンパで外電源に切り替えて別なところから供給しないとうまく動かなかった。
多分レギュレータが悪い…(本来このモジュールは12V駆動を想定してるらしい)

モータドライバがI2Cになったことにより上に何載せても良さそう。
Raspberry Piでもいいし、ESP-WROOM-02でもいいし。


2016年7月17日日曜日

USBでDigisparkと通信してみた。

Arduinoは基本的にシリアルポートを持っていてSerial.printなどを使ってデバッグが進められたりPCから制御したりできるんだけど、DigisparkはV-USBでUSBに対応しているのでハードウェアなシリアルポートは持っていない。
一応DigiCDCを使えばUSBでの仮想シリアルポートも使えるようだけど安定性の問題からDigiUSBに取って代わられてるみたい。

DigiUSBはlibusbからDigisparkを通信できるようにしてるようなので、PC側は専用にツールを作らないといけなかったりハードルが高いかも。
一応PythonベースでArduinoのシリアルモニタのように使えるツールも公開されてるけど…

DigiUSBからDigisparkを制御する方法はC++やVC#での例も有ったので今回はVC#でDigisparkと通信してみた。

とりあえずGithubからサンプルをゲット。
こちらのセットの関数をフォームからゴニョゴニョするだけで簡単にGUIアプリからDigisparkを制御できそう。
ただしシリアルと違って受信イベントがないので定期的に読みに行くかしないと行けないかなぁ
とりあえずLEDのオンオフぐらい。

DigisparkもクローンがeBayでだいぶ安かったのでAttiny85取り用に何個か買って基板だけ放置されてたんだけど、最近Attiny85をお安くそこそこ手にれたので元に戻してみた。
クローンだとReset端子を入出力に使えないので今回の復活でちゃんとResetも使えるようにしたのでUSB接続でもIOが4ポート使える。

I2CもSPIもUSBのピンと被ってないし、センサのデータとか読み出せたりするかなぁ

2016年7月10日日曜日

Digisparkで測定器データをテンキーの代わりに入力

昨日に引き続き、最近ちょくちょくいじっているDigisparkで、ミツトヨのデジマチック出力をUSBキーボードとして認識させて入力するプログラムを作ってみた。
数値を入力したあとにエンターを押してくれるので、エクセルとかに測った数値を連続で入れるときは便利かも?

DigisparkはLEDがP1に接続されているのでこのピンはINPUT_PULLUPが使えないということでOUTPUTなREQを1番に割り当てた。
その他の入力ピンは外部プルアップを使わなくていいように、INPUT_PULLUPが可能な0,2,5を使用した。3と4はUSBで使用するのですべてのピンを使い切ったことに。
互換品のDigisparkとかでResetピンの5番ピンが使用できないやつがあるので、その場合はヒューズビット書き換えで5番ピンを使えるようにしておかないといけない。

とりあえず純正のスイッチ付きケーブルも使用できるように、P5につながってるスイッチがLOWになったときにデータを取得してUSBキーボードとして認識してるDigisparkがキーストロークするような感じにしてみた。純正ケーブルのスイッチは片方GNDに落ちてるのでINPUT_PULLUPしてLOWになったら反応という具合に。
ケーブルのピンアサインはフォーラムに落ちていたのを参考にさせてもらった。
#include "DigiKeyboard.h"
#define REQ 1
#define DAT 0
#define CLK 2
#define BTN 5//reset pin

void setup() {
  pinMode(REQ, OUTPUT);
  pinMode(DAT, INPUT_PULLUP);
  pinMode(CLK, INPUT_PULLUP);
  pinMode(BTN, INPUT_PULLUP);
  digitalWrite(REQ,LOW);
 }

void loop() {
  DigiKeyboard.update();
  if(digitalRead(BTN) == LOW){
    byte mydata[14];
    digitalWrite(REQ, HIGH);
    for(uint8_t i = 0; i < 13; i++ ) {
      uint8_t k = 0;
      for (uint8_t j = 0; j < 4; j++) {
        while( digitalRead(CLK) == LOW) {
          DigiKeyboard.update();
        }
        while( digitalRead(CLK) == HIGH) {
          DigiKeyboard.update();
        }
        bitWrite(k, j, (digitalRead(DAT) & 0x1));
      }
      mydata[i] = k;
    }
    digitalWrite(REQ,LOW);
  
    uint8_t sign = mydata[4];
    uint8_t decimal = mydata[11];
    //uint8_t units = mydata[12];

    char buf[7];
    for(int lp = 0; lp < 6; lp++){
      buf[lp] = mydata[lp+5] + '0';
    }
    buf[6] = 0;
    float num = (atol(buf));
    switch (decimal){
      case 2:
        num = num / 100;
        break;
      case 3:
        num = num / 1000;
        break;
      case 4:
        num = num / 10000;
        break;
      case 5:
        num = num / 100000;
        break;
    }
    if(mydata[1] == 0xF && mydata[2] == 0xF && mydata[3] == 0xF){
      DigiKeyboard.sendKeyStroke(0);
      if(sign == 8){
        DigiKeyboard.print("-");
      }
      DigiKeyboard.print(num, decimal);
      DigiKeyboard.sendKeyStroke(KEY_ENTER);
      DigiKeyboard.delay(60);
      while(digitalRead(BTN) == LOW){
        DigiKeyboard.update();
      }
    }
  }
}
前回はpowを使って小数点の位置を計算していたんだけどpowを使うとスケッチの容量がオーバーしてしまうのでswitch caseで対応した。さらに負の値のときのための計算も容量食うので"-"を入力するかどうかの判別をifでやるようにしたらだいぶ減ったのでこちらも変更。
前回よりもだいぶローテクになってるような気がしたんだけどこっちのほうがスケッチが小さくなったので盛り込んだ。

DigisparkのUSBキーボードエミュレーションはDigiKeyboard.update()を定期的に呼ばないと不明なデバイス扱いになってしまうので、データ受信部の中でタイムアウトとか設定していないのでとりあえずwhileの中でもDigiKeyboard.update()を読んでデバイスの認識がおかしくならないように対応。DigiKeyboard.update()がどの程度時間を食うのかわからなかったけど動いているので良しとしよう…
測定器がつながっていないと無限ループするけど不明なデバイスにはならない!

もしかしたら一旦数値をfloatにしているところも直せば小さくなるかもしれない。どうせキーを1文字ずつ打てばいい話だし…。でもこっちのほうが小数点の桁数が変わる時とかも楽だったのでそのまま。

一応2つ目から4つ目のデータが0xFかどうか確認するようにしておいた。変なデータが来ても安心?

純正のUSBインプットツールは結構高級品みたいだけどアイソレーションとかいろいろ高級な回路になってるのかなぁ?PCからノイズ乗ったりしたらUSBアイソレータとか使えばいいのかな?