Ogaki Mini Maker Faire 2016に出展します

ギリギリの告知ですが12月3日4日に開催されるOgaki Mini Maker Faire 2016に出展します

ommf.iamas.ac.jp

当日はVESCとCANtact-miniを使った何かを展示します。
USB-CAN変換アダプタのCANtact-miniについてはもし欲しい方がおられましたら自己責任という条件付きですが、販売も行います。


f:id:Strobo:20161129143139j:plain



準備不足感もあり荒削りな出展しなってしまうかもですが、よろしくお願いします。

USB-CAN変換アダプタCANtact-mini

2年ぶりの更新ですが, まずは生存報告, 生きてます.
生きるのって大変ですね.


とある事情でUSB-CAN変換アダプタが必要になりそうでしたのでつくってみました.
当初はハードウェアからファームウェアまですべて自作する計画でしたが, 調べていくうちにCANtactと呼ばれるUSB-CAN変換アダプタを発見. ハードもファームもいい感じに完成しておりクリエイティブ・コモンズで公開されていたので, 方針変更. CANtactをベースにサイズを小型化したCANtact-miniを作者さんのEric Evenchick氏に感謝しつつ再設計してみました.

回路図

f:id:Strobo:20160919174537p:plain

基板

f:id:Strobo:20160919174633p:plain
f:id:Strobo:20160919171615p:plain

Linuxから使う

f:id:Strobo:20160818231430j:plain:right:w320

CANtactはPCから見るとUSBシリアル変換デバイスとして見え, SLCANと呼ばれるプロトコルでお話することでシリアル-CANの変換を実現しています.

LinuxにはSLCANのドライバが内蔵されているのでcan-utilsをインストールするだけでCAN通信を行うことができます.以下にLinuxで簡単なCAN通信を行うコマンドを書きます.

CANインターフェースの設定

modprobe can
slcand -o -c -s6 /dev/ttyACM0 can0
ifconfig can0 up

送信

cansend can0 123#DEADBEEF

受信

candump can0

Windows, Macから使う

f:id:Strobo:20160820235310j:plain:right:w320

Win, MacにはSLCANのドライバは実装されていないのでアプリレベルでSLCANを実装する必要がありますが, CANardと呼ばれるPython製のライブラリを利用する事でCANtactを使用できます.

BeagleBoneBlackで通信距離(ほぼ)無限のLTEラジコンB3Rを作った

f:id:Strobo:20140814124452j:plain
AR.Drone等のカメラ映像を見ながら操作できるラジコン製品が増えています。このラジコンは通信にWiFiを使うことで機体の操作だけでなく同時に映像の送信も可能になっています。しかしWiFiで通信している以上、通信可能範囲は操作端末の周囲数百メートルが限界です。そこでWiFiではなくLTEを使用したラジコンであるBeagleBoneBlackRover略してB3Rを開発しました。LTEで通信しているのでLTEの電波が入る範囲ならば操作端末の位置に関わらずラジコンの遠隔操作が可能です。例えば日本にあるLTE圏内のラジコンをインターネットを通して海外から遠隔操作することも可能になります。

オンボードカメラの映像


B3Rの構成

B3Rの構成は以下の図の様になっています。
f:id:Strobo:20140814030043p:plain
以下各要素について解説していきます。

ラジコン

f:id:Strobo:20131106203053j:plain:w320:right
Hobbykingから半完成のラジコンTurnigy Trooper SCT 4x4 1/10 Brushless Short Course Truckを購入しました。半完成モデルなので通信機とコントローラとバッテリーが付属しておらずそのままでは動作しません。しかし今回はその通信機を自分で開発するので問題ありません。

ESC

ESCは購入したラジコンに付属していたのでそのまま使用します。BBBからPWM信号をESCに入力するとモーターの速度が制御できます。このESCには電源スイッチが繋がっておりこのスイッチでESCの電源を操作できる。今回はBBBからESCの電源を操作したいので、スイッチを取り外しFETを繋いでBBBからESCの電源を操作できるようにした。これでBBBの電源が切れると同時にFETがOFFになりESCの電源も切れるので多少安全になる。ただしBBBがFETに繋がっているポートをHighにしたままフリーズした場合はFETはOFFにならないのでESCも停止しない。この方法はもう少し改良が必要かもしれない。
このESCには通信機やサーボモーター用に6Vの電源も用意されています。この6V出力はステアリング用サーボーモーターの電源とした。

PDU

PDUはDC-DCコンバータ、電流、電圧検出回路で構成されています。DC-DCコンバータはOKL-T/6-W12N-CでBBB, USBハブ, webカメラ, LTE-USBモデムに電力を供給します。
電流、電圧検出回路はバッテリー電圧と電流を計測する回路。BBBのADCは最大1.8Vなのでバッテリーの電圧を分圧してBBBで計測できるようにしている。電流検出は0.01Ωのシャント抵抗とLT6106CS5を使用してESCの定格である30Aまでの電流を計測する回路とした。

f:id:Strobo:20140814125710j:plain:w640

Battery

B3Rのバッテリーは7.3V2200mAhを2個並列に接続している。これは動作時間を長くする為。もう一つはバッテリーが一つの場合、モーターが回転し始める瞬間にBBBが再起動してしまう問題を回避するためです。
BBBが再起動する問題はモーターが回転を始める瞬間は電源電圧が一瞬低下することが原因。電源電圧がDC-DCコンバータの最低動作電圧の6Vを下回ってしまうとその先に繋がっているBeagleBoneBlackが停止してしまう。BeagleBoneBlackの停止するとESCも停止する。ESCが止まるとモーターも止まり。その後電源電圧が回復しBBBが起動する。この様な流れでモータが回転を始める瞬間BBBが再起動してしまうように見えていた。今のところバッテリーを並列に繋いでいる事で回避出来ているが、保護回路無しのリチウム電池の並列接続はあまりいいやり方ではない。本当なら電源を別にするべきかなと。

BBB

B3R全体の制御を行う部分でBeagleBoneBlack Rev.A5Cを使用しています。ディストリビューションは細かいカスタマイズが可能なGentooを使用しています。Gentooを使用すれば不必要なプロセスを止めやすくBBBの消費電力を減らすことができます。全体の制御プログラムはGoで、UDP通信やストリーミングを行う部分はCで開発しました。
BeagleBoneBlackのセットアップ等は以下のサイトを参考にしました。
カーネル/VM式 ARMマイコン入門(関東版)
Gentoo Linux Documentation -- Gentoo on the BeagleBone Black
Raspberry PiでL-03Dを使ってみる

USB HUB

BBBのUSBポートは1つしかない為2つ以上のUSB機器を使用したい場合はUSBハブを使用する必要があります。そしてBBBのUSBポートの電流供給能力は800mAありますがUSBハブ, webカメラ, LTE-USBルータを同時に使用すると800mA を超えてしまい、BBBのUSB機能が停止してしまいます。そこでUSBハブを改造してDC-DCコンバータから5V電源を直接供給できるようにしました。これによりBBBのUSBポートに3つの機器を同時に接続しても問題なく動作するようになりました。

USB-LTE Router

USB-LTE RouterにL-03Dを使用しiijmioのsimを差してインターネットに接続しています。前回の記事UDP hole punchingの実装をしてみる - ELECTLOGICで書いたようにiijmioの回線ではグローバルIPアドレスが割り振られません。これでもTCPなら双方向で通信できますが、UDPの場合はそれができません。そこでUDPホールパンチングを使用してプライベートIP環境での双方向UDP通信を実現しました。これにより低遅延での操作が可能です。

WebCamera

WebCameraはLOGICOOL ウェブカム HD画質 120万画素 C270を使用。映像をYUV422形式でBBBに取り込み。YUV422からYUV420へ変換した後VP8でエンコード。その後UDPで操作端末へ送信しています。

Servo Motor & Motor

これらは購入したラジコンに付属していた物をそのまま使用した。問題があるとすれば、モーターが回転する時の音がうるさいこと。

ケース

f:id:Strobo:20140814124533j:plain:w320

ケースはアルミ板とアクリル板を組み合わせて設計しました。防水設計にはなっていないので雨天時は動かせません。アクリルに透明なシール エーワン ラベルシール 光沢フィルム・透明 ノーカット 10シート 28791にロゴを印刷して貼付けています。さらに野外で動かす物なのでUVカットの透明フィルム エーワン UVカット透明カバーフィルム 6シート 35041をロゴの印刷されたフィルムの上に重ねて貼付けています。

f:id:Strobo:20140814125915j:plain:w640
アクリルカバーを外したところ。右上のPDUから出ている白い配線は電源スイッチへ繋がっている


まだいくつかの改良や追加したい機能などがありますが、映像のストリーミングと最低限の操作が出来る様になったのでひとまず公開してみました。次はGPSと測域センサを載せて自動操縦をさせたい。

自作モバイルブースター作ったよ

この設計を始めたのが今年の4月ごろ。このときはまだeneloopモバイルブースターの類似製品は少なく、バッテリーの容量もあまり大きな物がなかった。この時発売されている物ではiPadをフル充電できる外付けバッテリーはなかったように記憶している。
そこで、hobbykingで手に入る大容量バッテリーを使ってiPadをフル充電可能なモバイルブースターを作ろうと考えた。
その後、設計中や部品注文後にあんな物こんな物が次々発表されてモチベーションがガクッと落ちたりしたんだけどね
そんな訳で作ったのがこちら

特徴は

  • 大容量のバッテリー
  • バッテリーは交換可能
  • 右下のLEDでバッテリー残量表示
  • 充電回路内蔵 (まだ動かしてない)
  • 3つのUSBポート (まだ1つ実装してない)
  • 最大3Aの出力
  • 3種類の過電流保護

と、こんな感じです。
ソースコード、回路図は公開しますが、まだまだ未完成なのでどんどん変更しています。参考にする場合は自己責任で。
回路も設計ミスがあり現在公開している回路と上の写真の回路は少し違うものになっています。(赤色の配線)
ソフトウェアはChaNさんとmucrobuilderさんのコードをベースにして作成しました。デバッグにはねむいさんのブログ記事やopenocd関連ファイルを使用、参考にさせていただきました。

ソースコード/EAGLE Project file : strobo/u-battery

回路とかハードとか

基盤はFusionPCBに注文。3500円。安い。部品はDigi-Keyでバッテリーはhobbykingから注文しました。

基盤に乗っている主な回路は5V DC-DCコンバータ。バッテリーの監視回路や充電回路、電流計測回路と、あと最後にマイコンです。
バッテリーはの電圧は11.1V容量は5000mAhです。同じ11.1Vのバッテリーなら動作するので、もっとコンパクトにしたいなら1600mAhぐらいの小さなものに交換することも可能なのが便利なところ。
あとリチウムポリマーバッテリーなので取り扱いには十分注意しないとだめです。今は専用の充電器で充電しており、内蔵の充電回路は使っていません。

使っている主なIC

本当ならマイコンはAVRでも性能的には十分ですが、ARMの勉強も兼ねてLPC1114を使いました。

過電流保護は

  1. バッテリー監視IC内 (電流は任意で設定可能)
  2. DC-DCコンバータIC内 (3.5A)
  3. OPアンプとLPC1114を組み合わせた回路

の合計3つですが。2と3はほとんど同じ所を計測しているので3はなかったことになるかもしれない。

気になること

  • DC-DCコンバータ内(BD9876)の過電流保護はデータシートによると、過電流検出電流 min 3.5A typ 6Aとなっているんだけど、「6Aまで流れないと保護回路が動かないこともある」なのか「3.5A - 6Aの範囲なら保護回路が動く」という意味なのかどっちだろう。普通なら後者かな
  • バッテリー監視ICを使ってバッテリーの電圧を計測しているんだけど、データシート11ページの「Calibration of Cell Voltage Monitor Amplifier Gain」ってところの計算がうまくいかない。ちゃんと理解できてないだけかもしれないけど。これができないとバッテリーの正確な電圧が分からないのでバッテリー残量の計算に問題がでるかもしれない。

今は「Cell Voltage」のところの計算式でバッテリーの電圧を計算している、これでもテスターで直接計った値とだいたいあっているので今のところ大丈夫みたい

iOS端末の充電に関してはiPhoneやiPadの充電器の自作について - ELECTLOGICを参照。ただD+/D-に電圧がかかっていると充電してくれない物もあるので1ポートだけ、D+/D-に電圧をかけていない5Vのみのポートにしました。

おまけ

iPhoneのストップウォッチと組み合わせると爆弾のように見えてしまうの図

iPhoneやiPadの充電器の自作について

普通に5V供給してやるだけでは、充電してくれないようなので。充電モードにするのにどんな細工が必要かちょっと調べてみた。
軽くググったら以下のサイトがUSB端子の各電圧について書いてある。

各サイトの示すUSB端子電圧には多少ばらつきがあるけど、だいたいD-は2.75V D+は2.0Vで良さそうだ。

D+ D-
2.0V 2.75V

まだ実際にテストしてないので試すときは自己責任で

追記

英語版wikipediaのUSBのページiPod/iPhoneの充電電流について書かれていた。
(D-)=(D+)=2.0Vの時500mA
(D-)=2.8V (D+)=2.0Vの時1000mAになるようだ。

LPC1343のデバッグ環境の構築

ねむいさんのブログにSTM32VL-DiscoveryVersaloon化する記事があったので、Versaloon化したSTM32VL-DiscoveryでLPC1343のデバッグをしてみようとした。まあ結局記事に書いてある方法と同じように試したけど、うまく行かなかったので自己流で最新のVersaloonファームウェアの用意からopenocdのビルド、インストールまでやりました。ちなみにUbuntu11.10上で行なっています

まずSTM32VL-Discoveryの改造

やってることはねむいさんのブログの記事と同じです

UARTブートローダを有効にするためのジャンパーの配線とUARTの配線
ファームウェアの書き込みが終わったらジャンパーは外します

firmwareの準備と書き込み

ここからやり方が変わります

STM32VL-DiscoveryのST-Linkに書き込むファイルの準備
svn checkout -r 1054 http://vsprog.googlecode.com/svn/trunk/ vsprog-read-only

バージョンによってうまく動かないことがあります。私はrev1054を使いました。とりあえずうまく動いてます

makefile を書き換え

vsprog/dongle/firmware/Projects/Versaloon/GCC/makefile 18行目 HW_BOARDの値を変更

HW_BOARD = STM32VL_Discovery
ブートローダーを使わないのでリンカスクリプトを書き換える

vsprog/dongle/firmware/Projects/st-discovery.ld 17行目 0x8002000 から 0x8000000 に変更

FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 56K

makeでVersaloon_GCC-STM32VL_Discovery-0x0000.binが生成される
あとは生成されたファイルをFlashLoaderDemonstratorを使って書き込みます。書き込み方法はねむいさんのぶろぐ | SWD専用Versaloonクックブックを参照

openocdのインストール

insightを使うためのarmv7mx.patchを用意

ねむいさんのぶろぐ | ARMマイコンをInsightとOpenOCDを使ってデバッグする環境を整える(2013年度前半版)からopenocd_misc.zipをダウンロードする
展開すると3つファイルがありますが使うファイルはarmv7mx.patchのみです

openocdインストールスクリプトとパッチの用意

Versaloonの旧フォーラムからoocd-16-aug-2011.tar.gzをダウンロードして展開
armv7mx.patchを展開したフォルダoocd-16-aug-2011に移動

openocd_update_0.5.0の書き換え

openocd_update_0.5.0の56と57行目の間に追加
patch -p1 < ../armv7mx.patch;
openocd_update_0.5.0を実行
sudo sh openocd_update_0.5.0
うまくいけばopenocdのインストールまで勝手にやってくれます。 openocdのcfgファイルもねむいさんの(ryからダウンロード insightのダウンロードと設定もねむ(ry insightでデバッグ 最後に、ねむいさんのブログがものすごく役に立ちました。ねむいさんありがとう

GCCでLPC1343用のバイナリをビルドする

結構前に買ってずっと放置されていたlpcxpresso nxp 1343をそろそろ使ってみる。OSを何度も変更する自分にとってはlpcxpressoIDEのプロダクトコードの入力とかめんどくさいので、GCCでlpc1343のバイナリを作成します。

ビルドした環境

Sourcery G++ Liteは適当にインストールしてpathを通しておく。

Lチカサンプルコードと必要なファイルの入手

http://ics.nxp.com/support/lpcxpresso/からLPC1300 Seriesの下のリンクからExample Projectsをダウンロード

適当なフォルダ(ここではblink)を作って、examples.lpc13xx.zipからLチカに必要な以下のファイルをコピー

  • CMSISv1p30_LPC13xx/src/core_cm3.c
  • CMSISv1p30_LPC13xx/src/system_LPC13xx.c
  • CMSISv1p30_LPC13xx/inc/core_cm3.h
  • CMSISv1p30_LPC13xx/inc/system_LPC13xx.h
  • CMSISv1p30_LPC13xx/inc/LPC13xx.h
  • blinkly/src/blinkly_main.c
  • blinkly/src/clkconfig.c
  • blinkly/src/clkconfig.h
  • blinkly/src/config.h
  • blinkly/src/gpio.c
  • blinkly/src/gpio.h
  • blinkly/src/timer32.c
  • blinkly/src/timer32.h

あといくつかのファイルを以下のリンクから持ってきてblinkにコピー

firmware.binをUSB経由で書き込み、動作させるためにlpcrcを用意しblinkに配置

GCCでビルドしたfirmware.binはそのままでは問題があるようでlpcrcでfirmware.binを書き換えないといけない。書き換えるとうまく動作した。よく調べてないので理由はよくわからないけど動いているから問題はないはず。

Makefilehttps://github.com/vsergeev/mbed-cmsis/blob/master/Makefileを修正した
以下のMakefileをblinkに保存
Makefile

# LPC1343 make Sample

PROJECT=lpc13xx_blink
OBJECTS=LPC1xxx_startup.o LPC13xx_handlers.o core_cm3.o system_LPC13xx.o blinky_main.o clkconfig.o gpio.o timer32.o
LSCRIPT=linkscript.ld

OPTIMIZATION= 0
DEBUG= -g
# Compiler Options
GCFLAGS = -Wall -fno-common -mcpu=cortex-m3 -mthumb -O$(OPTIMIZATION) $(DEBUG)
GCFLAGS += -D__RAM_MODE__=0
#GCFLAGS += -Wcast-align -Wcast-qual -Wimplicit -Wpointer-arith -Wswitch
#GCFLAGS += -Wredundant-decls -Wreturn-type -Wshadow -Wunused
LDFLAGS = -mcpu=cortex-m3 -mthumb -O$(OPTIMIZATION)  -Wl,-Map=$(PROJECT).map -T$(LSCRIPT)
ASFLAGS = $(LISTING) -mcpu=cortex-m3 --defsym RAM_MODE=0

# Compiler/Assembler/Linker Paths
GCC = arm-none-eabi-gcc
AS = arm-none-eabi-as
LD = arm-none-eabi-ld
OBJCOPY = arm-none-eabi-objcopy
REMOVE = rm -f
SIZE = arm-none-eabi-size

#########################################################################

all: $(PROJECT).bin

$(PROJECT).bin: $(PROJECT).elf
	$(OBJCOPY) -O binary -j .text -j .data $(PROJECT).elf $(PROJECT).bin
	mv $(PROJECT).bin firmware.bin
	./lpcrc-linux firmware.bin

#$(PROJECT).hex: $(PROJECT).elf
#	$(OBJCOPY) -R .stack -O ihex $(PROJECT).elf $(PROJECT).hex

$(PROJECT).elf: $(OBJECTS)
	$(GCC) $(OBJECTS) $(LDFLAGS) -o $(PROJECT).elf

stats: $(PROJECT).elf
	$(SIZE) $(PROJECT).elf

clean:
	$(REMOVE) $(OBJECTS)
	$(REMOVE) $(PROJECT).hex
	$(REMOVE) $(PROJECT).elf
	$(REMOVE) $(PROJECT).map
	$(REMOVE) $(PROJECT).bin
	$(REMOVE) $(OBJECTS)
	$(REMOVE) firmware.bin

#########################################################################
# Default rules to compile .c and .cpp file to .o
# and assemble .s files to .o

.c.o :
	$(GCC) $(GCFLAGS) -c $<

.cpp.o :
	$(GCC) $(GCFLAGS) -c $<

.S.o :
	$(AS) $(ASFLAGS) -o $@ $<
#########################################################################

ファイルの修正

いろんなところからファイルを集めてきたのでファイルを少し修正します

スタートアップコードの修正

LPC1xx_startup.cはmain()を呼ぶ前にSystemInit()を呼び出すように変更
38と39行目の間にextern void SystemInit (void);を追加

extern void SystemInit (void);

60と61行目の間にSystemInit();を追加

SystemInit();
リンカスクリプトの修正

linkscript.ldの30行目あたりにMEMORYの記述を追加

MEMORY
{
	flash(rx): ORIGIN = 0x00000000, LENGTH = 32k
	sram(rwx): ORIGIN = 0x10000000, LENGTH = 8K
}

あとはmakeコマンドでバイナリが作成されます。

書き込み

firmware.binの書き込みはhttp://hp.vector.co.jp/authors/VA000177/html/LPCXpresso.htmlに書いてあるのでそれを参考に、USBコネクタ取り付けて、firmware.binを書き込む

やっと動きましたー。やったね!
ここまで書いてあれだけど、こんな面倒なことをしなくてもhttps://github.com/microbuilder/LPC1343CodeBaseに別のサンプルソースコードがあるのでそれ使ってもいいと思います。