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に別のサンプルソースコードがあるのでそれ使ってもいいと思います。

エアコンをネットから操作するデバイスを作ってみた

冷房が効いた部屋に入るときの涼しさのために、エアコンをネットから操作するデバイスを作ってみた。まあもう気付いたら秋になってしまったのですが。とりあえず完成したので、公開してみます。

動画はこちら

参考サイトやプログラム

AVR-Ethernetのページにのっている回路を参考に赤外線LEDを追加したものです

コードはtuxgraphics.orgのeth_tcp_client_server-4.3をベースにRemoteIRを追加したような感じになっています。

webから操作

iPhoneなどから操作出来るようになっています。これで外出先からでもエアコンのon/offが可能。

ダイキンのエアコンに対応させる

自室で使っているエアコンはダイキン製で当然RemoteIRは対応していません
テレビのリモコンのフォーマットはすでにいろんなサイトで情報が載っていますが、エアコンのリモコンはテレビとは違うもフォーマットなので、いくら調べても情報が出てきません。
そこでまずリモコンから出ている信号の解析から始めました。ロジックアナライザがあれば簡単に解析できそうですがロジックアナライザは持ってないので、他に解析する方法はないか調べたらPSP-1000で動作するPSP IR wave viewerを発見。これを使ってリモコンの信号の解析をしました。

これをPCに取り込んで信号を解析してみると、テレビのリモコンのフォーマットに似ていた。フォーマットは似ていたのでRemoteIRをちょっと改造してリモコンがら出ているデータと同じ信号がでるようにしてやるとうまくエアコンが動いてくれました。これで赤外線系は完成。メーカーによってフォーマットが全然違うから他のエアコンに対応させるのはちょっと大変だ。
ソースコードはGithubにUPしてみました。
https://github.com/strobo/eth_air_controller
ちなみに開発環境はFedora15 avr-gccのバージョンは4.5.3
あとMake: Tokyo Meeting 07行きたい

sparkfunのBluetoothモジュールBluetooth Mateのメモ

大阪の日本橋に行ってきたときに衝動買いしたBluetooth MateをUbuntu11.04と接続してみる。忘れないようにメモしておく。

ubuntu11.04で接続した時のメモ
rfcomm bind 1 

このコマンドでBluetoothMateと接続

  • /dev/rfcomm1を使って通信できます
  • 電源投入後60秒間コマンドモード移行待ち状態でその間にペアリングして"$$$"と送信してやるとコマンドモードに入り設定の変更ができます。コマンドはRN-41 AT Command Set(PDF)を参照。
  • 60秒過ぎると"$$$"でコマンドモードには入れなくなる。
  • コマンドモードから抜けるには"---"
  • ビットレートはデフォルトで115200
  • UART経由でも"$$$"でコマンドモードに入れる。こっちはいつでも"$$$"でコマンドモードに入れるみたい。ただしbluetoothでどことも接続していない時のみ。
screen /dev/rfcomm1 115200

この方法では接続できなかった。参考サイトの「Ubuntu/Bluetoothシリアルポート」のように、minicomを使えばうまく接続することができた

GoogleSketchUpでロボットの設計

GW前半はほとんどロボットの設計をしてた

頭が無いのはたぶん気のせいです・・・
次の作業は各パーツを2D図面に展開する作業だ。この作業でGW後半が潰れてしまいそう。本当はGW中に組み立てまでやりたかったのだが、予定が遅れまくっている・・・

LEDライトなどを考えてた

わりとどうでもいい話です。chanさんのサイトでタッチセンサの実験というページを見つけて何か面白いもの作れないかなと思い、気づいたらGoogleSketchUpでこんなLEDライトをモデリングしてた。


操作方法(上から見たときの図)

USBから電源を取ってリチウムイオンバッテリーに充電し、3つのLEDを点灯させる。
タッチセンサとフィルムまでの間に薄い板があってもちゃんと反応するのかはテストしてみないとわからないなあ
このライトをAmazon.co.jp: JOBY ゴリラポッド GP1: 家電・カメラに取り付ければ意外といい作業用LEDライトになったりして

リニア・鉄道館に行ってきた

3/14に開館したリニア・鉄道館に行ってきました。やはり春休みの土曜日とあって人は多かったです。12:00時点で駐車場に入る車の列が出来ていましたが入場待ちはなくすんなり入ることが出来ました。
リニア・鉄道館
P4020362
N700系シミュレータや在来線シミュレータは抽選で選ばれるようになってました。私は残念ながら外れてしまいました。N700系シミュレータは本格的。180°スクリーンで結構な迫力がある。抽選に外れても後ろから見るだけなら誰でもOK。それと在来線シミュレータは完全に某ゲーム「電車でG○」
あと鉄道ジオラマは入場待ち30分だったので見送り。

正面から撮った写真はググればいくらでも出てくるから。あまり誰も撮らなさそうなところを撮ってきました、下の方ばっかり撮ってたからちょっと睨まれてたのは内緒だ

まずこの車両
P4020336

連結部分下のコネクタは信号線かな
P4020330

こっちはパワー系のコネクタと勝手に推測
P4020333

100系の下面 ちょっとこれは撮影に失敗気味
P4020339

300系のコネクタと車軸
P4020340

300系のモーター   の横に付いてるやつ。これはなんだろうか
P4020352

300系の台車(回転中)
P4020353

へぇ〜
P4020354

300系の車軸 ギアがカコイイ
P4020358

もっと撮りたかったんですが、途中でカメラのバッテリーが切れてしまった。
その他の写真はFlickrにアップしています。全30枚
Flickr - リニア・鉄道館