Hatena::ブログ(Diary)

滴了庵日録 このページをアンテナに追加 RSSフィード

2017/02/21(Tue)

1/16 M1エイブラムスの解析

改造用に1/16 M1エイブラムス(童友社)を借りてきた。デカい。

基板をオレオレ基板に交換して遊ぼうと思う。

写真

分解

デカいわりに中はわりとスッカスカ。基板はメイン基板と無線基板の2枚。

駆動系がマブチ260ぽいモータが2個で、いかにも非力に見える。が、駆動電圧を測るとほぼ7.2Vフルなので260ではないのかもしれない。その他にLEDが4個(左右のヘッドライトテールライト)。底面の前のほうにはわりと大きいスピーカを備えている。

写真


砲塔にはモータ3個とリミットスイッチ1個とLED1個。モータは砲塔の回転用と砲身の上下用、そして砲撃アクション用であり、マブチ130モータのように見えるが、こちらも砲撃アクションは約7.2V、砲塔回転と砲身上下も約5Vで駆動されているので、通常の130ではないかもしれない。砲身の上下はクランク機構によるもので、モータを回し続けると上下動を繰り返すというわりと残念な仕様である。機銃を持った米兵が砲身の上下と連動して左右に動く機構になっている。謎仕様である。砲撃アクションはカムとバネによるもので、1回転(1回の砲撃)を検出するためにリミットスイッチが設けられている。

写真


メイン基板にはRX5 ATS305Rというラジコン用の制御チップが使われている。黒い樹脂で封止された子基板が刺さっているが、サウンドデータが入っているのではないかと思われる。電源は7.2Vのニッカドバッテリー

写真


無線基板は27MHz帯ということしか分からないが、どうせWiFiBluetoothで置き換えるので、深く詮索しないことにする。

写真


まとめると、メイン基板に接続されているデバイスは、バッテリー1個、モータ5個、スピーカ1個、LED5個、リミットスイッチ1個、および無線基板である。

メイン基板のコネクタ

メイン基板のコネクタは全て日圧のXHを使用。電源のみ基板に直接ハンダ付け。

XHは2.5mmピッチなので、ユニバーサル基板でもオレオレ基板が作りやすそうである。

(厳密には2.54mmピッチではないので、12ピンのコネクタは刺さらないかも…)

J1
ピン番号ケーブル色接続先
1右駆動輪-
2左テールライト アノード
3左テールライト カソード
4左ヘッドライト カソード
5左ヘッドライト アノード
6右駆動輪+
7左駆動輪+
8右テールライト カソード
9右テールライト アノード
10右ヘッドライト アノード
11右ヘッドライト カソード
12左駆動輪-
J2
ピン番号ケーブル色接続先
1砲撃+
2砲撃-
3×N.C.
4×N.C.
5砲撃 リミットSW
6砲撃 リミットSW
7砲塔ライト アノード
8砲塔ライト カソード
9スピーカ+
10スピーカ-
J3
ピン番号ケーブル色接続先
1砲塔回転-
2砲塔回転+
3砲身上下-
4砲身上下+
J4

無線部との接続。改造に不要なので解析しない。

2017/02/17(Fri)

Milkcocoa ESP8266 SDKの非同期化ハック

問題点

ESP8266でMilkcocoaを使うためのライブラリとしてMilkcocoa ESP8266 SDKがあります。

たいへん分かりやすく使いやすいライブラリだけども、同期処理(ブロッキング処理)なのが困りものです。下のコードを見てください。

loop(){
  // 以下をloopの中で必ず実行します
  milkcocoa.loop(); // ここに1秒間もとどまる
  
  // 以下の処理が回らない
  (略)
}

このようにloop()の中で、必ずMilkcocoa::loop()を実行する必要があります。そして、このMilkcocoa::loop()は、一度入るとタイムアウトまで最大1秒間も戻って来ません。これは本来、組込み系ではやってはいけないことです。loop()が止まってしまうので、その間は他の処理を進めることができません。

問題の原因箇所

それでは、Milkcocoa ESP8266 SDKのコードを追ってみます。

関数の呼び出し階層は以下のようになります。

  1. Milkcocoa::loop()
  2. Adafruit_MQTT::readSubscription()
  3. Adafruit_MQTT_Client::readPacket()

そしてAdafruit_MQTT_Client::readPacket()の中で、delay()を繰り返してタイムアウトまで待っています。ここが原因箇所です。

原因の解消案

何もせずにdelay()で待つから処理が止まるわけです。スレッドが使えれば並行処理できますが、Arduinoはシングルスレッドです。C#のような強力な非同期処理機構もありません。

そこで、苦し紛れのハックですが、MQTT_Client::readPacket()でdelay()を呼ぶ代わりにユーザー定義の関数を呼び返してやることにします。呼び返す関数の名前はsubloop()とでもします。ユーザーはスケッチの中でsubloop()関数を定義します。

解消案の実装

修正するライブラリ側のソースは1つだけです。

Adafruit_MQTT_Client.cpp

(略)
extern void subloop();  // スケッチ側で定義

uint16_t Adafruit_MQTT_Client::readPacket(
(略)
    //delay(MQTT_CLIENT_READINTERVAL_MS); // 待たない
    subloop();  // スケッチを呼び返す
  }
  return len;
}
(略)

スケッチ

loop(){
  // 以下をloopの中で必ず実行します
  milkcocoa.loop();
  
  (略)
}

subloop(){
    // Milkcocoaの待ち中に繰り返したい処理をここに
}

参考URL

2017/02/15(Wed)

BLEいろいろ

チップとモジュールとボードの関係

BLEはチップ、モジュール、ボードがいろいろあって分かりにくいので、(1)Nordic勢、(2)その他のARM勢、(3)非ARM勢 に分けて主なものを整理してみた。(クリックで拡大)

その1

その2

その3

けっきょく、どれを選べばいいのか?

(1) マイコンなんか知らん勢

  →Konashi使っとけ

(2) BLEよく分からんからUARTにしろ勢

  →RN4020でも使っとけ

(3) スクリプトで簡単に開発したい勢

  →BluegigaとかLairdとか

(4) C言語でお手軽に開発したい勢

  →Nordic系のmbedか、ESP32でArduinoか、あるいはEZ-BLEか

(5) ガチでC言語で開発する勢

  →NordicのSDK使っとけ

(6) しがらみで採用するデバイスが決まる勢

  →あきらめましょう

2017/02/13(Mon)

nRF52のSoftDeviceについて

SoftDeviceとは

NordicのnRF52のSDKによる開発でBLEの機能を使うためにはユーザーアプリケーションとは別にSoftDeviceなるものをあらかじめROMに書き込んでおく必要がある。SoftDeviceとは何かというと、要するにBLEのプロトコルスタックライブラリであり、アプリケーションとは独立してROM/RAMの別エリアに配置されるらしい。

SoftDeviceの入手

nRF52に対応したSoftDeviceには以下のものがある。

  • S132 BLE ペリフェラル&セントラル (nRF52832であれば通常これを使う)
  • S140 S132の拡張。Bluetooth5のサポート (nRF52840用?)
  • S212 ANT (このSoftDeviceはサードパーティー製)
  • S332 ANT と BLE (このSoftDeviceはサードパーティー製)

ちなみに、Laird製のnRF52搭載モジュール BL652 には、S132 v3.0.0が、独自ファームウェアとともにあらかじめ書き込まれている。

S132は、NordicのnRF52832のページの[DOWNLOADS]の[Soft Devices]からダウンロードできる。

SoftDeviceの書き込み

SoftDeviceの書き込みにはnRFgo Studioを用いる。nRFgo Studioは、NordicのnRF52832のページの[DOWNLOADS]の[PC software]からダウンロードする。

または、Keil uVisionから書き込むこともできるらしい

2017/02/12(Sun)

nRF52-DKを使ってBL652をデバッグ

nRF52-DKボードをJ-Linkデバッガとして使ってBL652をデバッグする方法をメモ。

BL652の線を引き出す

BL652モジュールの端子は0.75mmピッチの端面スルーホールである。

まずはなんらかの方法で線を引き出す。

UEW(ウレタン線)で引き出す

やり方はChaNさんのページに詳しい。端面スルーホールは見にくいので実体顕微鏡があると吉。2万円くらいの安いやつでも十分役に立つ。

BL652


ブレークアウトボードを使う

残念ながら市販のものは見つからないが、shrhdkさんがGitHubでブレークアウトボードのガーバデータを公開されている。これをFusionPCBやEleclowなどに発注すれば、UEWよりはラクできれいにハンダ付けできる。ただし、お金と時間はかかる。

ブレークアウト基板

nRF52-DKで外部基板をデバッグする方法

Nordicのオンラインドキュメントによると、nRF52-DKボードは外部基板のプログラム/デバッグをサポートしている。nRF52-DKボードのオンボードJ-Linkで外部基板をデバッグするには、debug outコネクタ(P19)に外部基板を接続する。


外部基板が給電されると、nRF52-DKボード上のデバッガチップはそれを検知して、オンボードのnRF52832の代わりに外部基板をプログラム/デバッグする。P19は一般的な10ピンのCortexデバッグコネクタであるが、狭ピッチなP19の代わりに、2.54mmピンヘッダのP20を使うこともできる。もしP19とP20の両方の給電を検知したら、P19のターゲットをプログラム/デバッグする。


P19とP20の位置は下図の通り。(上記オンラインドキュメントより)

nRF52-DK


要するに、外部基板の給電を検知して、勝手にターゲットが切り替わるということである。基板上のジャンパで設定したり、ソフトウェア側で設定したりという必要はない。


原文は、オンラインドキュメントの nRF52 Series > nRF52832 > nRF52 Development Kit (for nRF52832) > Development Kit content and key features v1.1.0 > Hardware description > Debug output を参照。

結線

デバッガ結線

ここではP20の2.54mmピンヘッダからの結線について説明する。

最低限必要なのは以下の4本

  • GND DETECT → ターゲットのGNDに接続
  • VTG → ターゲットの電源電圧(VDD_nRF)に接続
  • SWD CLK → ターゲットのSWDCLKに接続
  • SWD IO → ターゲットのSWDIOに接続

加えて、nRF52-DKボードから外部基板に給電する場合には以下の2本を結線

  • GND → ターゲットのGNDに接続
  • VDD → ターゲットの電源電圧(VDD_nRF)に接続

注意すべきは、GND DETECT とは別にGNDの結線が必要だという点。GND DETECTをBL652のGNDにつないだだけでは動かなかった。


BL652のピン配置は下図の通り。(BL652データシートより)

BL652ピン配置

プログラムとデバッグ

nRF52-DK自身のプログラム/デバッグと何も変わらない。

uVisionであれば、[Flash]>[Download]でプログラム。

[Debug]>[Start/Stop Debug Session]でデバッグ。


※ BL652にはSoftDevice S132が最初から書き込まれている。そのためSDKのサンプルコードはSoftDevice無し用(blankフォルダ)ではなく、S132用(s132フォルダ)を使うこと。