Home > 電子工作

2013.12.31

回転マウント開発

2013年も今日で最後ですが、本年度最初のブログ更新です。

いま、こんなもの作っています。

カメラをリモコンで回転させることができるマウントです。

友人からの依頼で開発を始めましたが、開発自体が面白く感じるようになり、試行錯誤のすえ3号機まで辿り着きました。

DSC02371

回路はブレッドボードで動作確認をしています。ブレッドボードのお陰で試行錯誤はかなり楽になりました。

上の写真が開発中のカメラマウントです。マイコンはAVR社のATMEGA328Pを使用しています。

無線でコントローするためにXBeeモジュールを使っています。

ソフト開発にはArduinoを使っています。Arduinoのお陰で開発はかなり楽になったと思います。Arduinoは様々な周辺回路の例や、動作を確認できるサンプルソフトがあり非常に参考になります。先人の方々には感謝です。

DSC02370

上の写真が開発中のコントローラです。マウントと同じくATMEGA328PにXBee無線モジュールが主な構成です。

DSC02417

モータのようなメカ部品を使った工作は初めてなので、カメラを回転させる機構は単純ながら苦労しています。

軸のブレないしっかりとした構造にするためアルミ板でステッピングモータとベアリングのホルダを作成しています。

1号機、2号機は回転軸のブレが大きいため、振動による画像の乱れがかなり激しいものでした。

三号機でかなり改善されましたが、いろんな方が車載動画の振動を軽減するために試行錯誤されているようで、まだまだ課題は多いです。

回転軸はカメラ三脚で使用されている1/4インチネジを6mmΦのアルミ棒から作っています。

DSC02434

マウントのケースはタカチ製のアルミケースを加工して作っています。マウンタ自体もカメラ三脚で固定できるようの1/4インチネジ穴を底面に開けています。

DSC02461

コントローラも市販のタカチのアルミケースを加工して作っています。

DSC02462

電子部品をすべて実装するにはギリギリの大きさで部品のレイアウトは苦労した部分です。

DSC02441

テプラでスイッチの説明文字を貼り付けています。

DSC02442

コントローラは単4電池二本で動作させています。マイコンで電離電圧を監視させてバッテリー容量不足を警告できるように考えていたのですが、ソフトの開発が間に合っておらず、とりあえず液晶表示には電池電圧を表示させています。その他、カメラの角度や動作モードが表示できます。

DSC02464

これは回転マウントとしては三つ目の作品です。完成までおおよそ二ヶ月位かかっていると思います。

下の動画は一番最初に作ったものです。

これは、三日ほどで完成しました。そのうち1日は部品の購入に秋葉原や、ホームセンター巡りに費やした時間です。

一号機はサーボーモータを使った簡単なものでした。ほとんどArduinoの参考回路とサンプルソフトをベースにしています。Arduinoがなければ3日で動作させることは不可能だったと思います。

Arduinoは以前から多少は興味があったのですが、本格的に使ったのは初めてでした。正直、予想を超えて使える環境でした。

現在は4号機を開発中です。今度は電子コンパスと加速度センサを利用して面白い使い方を考えています。

2012.02.12

GadgetSeed開発ページ

半年以上放置状態だった「GadgetSeed開発ページ」に新ネタを書いてみました。

2011.04.30

h8monのバージョンアップ(Ver.0.90)

3年前に公開したルネサスエレクトロニクスのマイコン、H8/3069用モニタh8mon Ver.0.80にTFTPブート機能を追加し「h8mon Ver.0.90」として公開しました。

 

暫くお休みしていた電子工作ネタも、少しづつ公開していこうと思っています。h8monの詳細は今後、GadgetSeed開発ページでお知らせしようと思います。

取り敢えず大雑把な概要をここに紹介しています。

 

ついで?にブログのプラットホームもWordPressに変えてみました。(^^;

2010.12.30

またまた放置してしまった

本ブログ、すでに1年7ヶ月も放置状態でした。
しばらく激務状態で、工作のモチベーションもいまいちあがらず、気がつけば1年以上。本ブログも2010年度初更新です(^^;

これではイカンと思い、12月から電子工作を再開しています。
中途半端だったGadgetSeedも、プラットホームを新たに再開しようと思っています。…再開できるかな?(^^;;

2009.04.11

オリジナルな汎用コンピュータ

時々投稿していた電子工作ネタの専用サイトを作ってみました。
「オリジナルな汎用コンピュータ」を作ろうという、無謀(^^;な試みですが、それなりに形になってきたので公開に踏み切りました。
GadgetSeed – H8/300H用OS「GadgetSeed」とGadgetSeedのプラットホーム「GadgetBase」の開発ページで公開中です。

2008.06.01

h8monのマニュアル

しばらく放置していましたが、h8monのマニュアルを書いてみました。
gdbでの使い方も少し書いていますが、具体的な使い方は次回に解説しようと思います。((^^;)さっぱり工作ネタに進まないなぁ)

2008.05.11

H8クロスコンパイラcygwin版

h8monとgdb使ったデバッグ方法の解説を予定していましたが、やっぱりすべてWindowsで実行できるH8マイコンの開発環境もあった方がよいかな?と思い作ってみました。

cygwin用のH8クロスコンパイラを公開します。

cygwinはLinuxに比べるとかなり遅いのでクロスコンパイラのコンパイルもすごく時間がかかりました。(Core2 Duo 2.2GHzでも5,6時間かかりました。)

インストールは以下のように行います。

1. /usr/local/h8300-elf/bin をPATHを追加する。

ホームディレクトリの .bashrc に以下を追加するのが良いと思います。

export PATH=$PATH:/usr/local/h8300-elf/bin

追加直後は以下のようにして変更を反映させます。

$ source ~/.bashrc

次のログインからは自動的にPATHが設定されます。

2. カレントディレクトリを「/」に移動し h8cross-elf.tgz を解凍する。

以下は h8cross-elf.tgz がホームディレクトリにダウンロードされている場合のコマンド例です。

$ cd /
$ tar xvfz ~/h8300-cross-elf_20080511.tgz

3. 動作確認をします。cygwinのコンソールから”h8300-elf-gcc -v”と入力すると以下のようなメッセージが出力されます。

~$ h8300-elf-gcc -v
Using built-in specs.
Target: h8300-elf
Configured with: ../configure –target=h8300-elf –prefix=/usr/local/h8300-elf –enable-languages=c –with-newlib –with-headers=/usr/local/src/h8300-elf-cross/newlib-1.15.0/newlib/libc/include/
Thread model: single
gcc version 4.2.1
~$

と、いう訳でgdbについては次回解説予定です。(^^;

2008.05.07

こんにちはH8の世界

H8マイコンで動く”Hello, world!”を作ってみます。

ここで紹介するのは、以前に公開したh8monが書き込まれているAKI-H8/3069Fマイコンボードで動作するものです。

とは言ってもOSも無ければ標準出力も無い環境です。とりあえず出力はh8monでもコンソール入出力に使っているRS232Cで行うこととします。

方法としては直接SCI1(RS232C)を制御してアスキーコード文字列を出力することが考えられますが、以下のようなソース(hello.c)でも文字を出力することが出来ます。

void putch(char ch)
{
asm("mov.l	#0, er2");
asm("trapa	#2");
}
static void print(char *str)
{
while(*str) {
putch(*str);
str ++;
}
}
int main(void)
{
print("Hello, H8 world!\r\n");
return 0;
}

このソースだけではまだ実行は出来ません。スタートアッププログラムが必要なのですが、まずはmain()を解説します。

printf()のような標準入出力関数は(使う方法はあるのですが)使えません。printf()の代わりの文字列出力関数としてprint()を書きました。中は文字列の終わり(0)まで一文字づつputch()に引数として渡しているだけです。

putch()の中身はインラインアセンブラで書かれています。
内容はer2レジスタを0にして、「trapa #2」を実行しています。

実はh8monではtrapa #2でSCI1から文字を入出力することが出来ます。er2を0にするとer0に書かれたデータが出力されます。er2を1にするとSCI1が受信したデータをer0に書き込みます。つまり戻り値として参照できます。
(このコードはあまり良い例ではありません。このコードは引数がer0で渡されて、他のレジスタが破壊されないことを期待しています。実際にそうなるのですが、本来は「拡張アセンブリ構文」を使うべきです。今回はソースの見易さを優先してこのようにしています。)

以下はスタートアップルーチン(start.s)です。

	.h8300h
.section .text
.global	_start
.extern	_stack_bottom
.extern _bss_start
.extern _bss_end
_start:
;	mov.l	#0x600000,er7		; Set SP
mov.l	er0,@-er7
mov.l	er1,@-er7
;; .data section initialize
mov.l	#_dataRAM_start,er0
mov.l	#_dataRAM_end,er1
mov.l	#_dataROM_start,er2
bra	loop11
loop1:
mov.l	@er2,er3
mov.l	er3,@er0
add	#4,er0
add	#4,er2
loop11:
cmp.l	er0,er1
bf	loop1
;; .bss section initialize
mov.l	#_bss_start,er0
mov.l	#_bss_end,er1
mov.l	#0,er2
bra	loop21
loop2:
mov.l	er2,@er0
add	#4,er0
loop21:
cmp.l	er0,er1
bf	loop2
mov.l	@er7+,er1
mov.l	@er7+,er0
jsr	_main		; Goto main()
;	rts
trapa #3
.end

各セクションを初期化してmain()をコールしています。最後の「trapa #3」はh8monに処理を戻すための物です。h8monではソフトウェアブレークとしてtrapa #3を使用しています。スタックポインタ(er7)の初期化も必要なのですが、上記ではコメントにしています。この場合、スタックポインタはh8monが設定する初期値(0xFFFF20:内蔵SRAM)で動作します。

以下はリンクスクリプト(h83069.lds)です。

OUTPUT_FORMAT("elf32-h8300")
OUTPUT_ARCH(h8300h)
ENTRY("_start")
MEMORY
{
ram(rx)		: o = 0x400000, l = 0x080000
}
SECTIONS
{
.text :	{
*(.text)
*(.strings)
*(.rodata)
*(.rodata.str1.1)
_dataROM_start = . ;
} > ram
.data ALIGN(4) : {
_dataRAM_start = . ;
*(.data)
_dataRAM_end = . ;
} > ram
.bss ALIGN(4) : {
_bss_start = . ;
*(.bss)
*(COMMON)
_bss_end = . ;
} > ram
}

プログラムを0x400000番地に配置するようにしています。この番地にはAKI-H8/3069FマイコンボードではDRAMが実装されています。h8monでは起動後、DRAMが使用できるようにBSC(バスコントローラ)を初期化しています。

最後にMakefileです。

CROSS   = h8300-elf-
CC	= $(CROSS)gcc
AS	= $(CROSS)as
LD	= $(CROSS)gcc
OBJCOPY	= $(CROSS)objcopy
CFLAGS	= -mh -g -O2 -Wall
LDSCRIPT= h83069.lds
LDFLAGS = -mh -Wl,-Map,$*.map -Wl,-T$(LDSCRIPT) -nostartfiles
PROGRAM	= hello.mot
OBJS          = start.o hello.o
SRCS          = start.s hello.c
.SUFFIXES:	.mot .exe .a .o .c .s .h
.c.o:
$(CC) $(CFLAGS) -c $<
.elf.mot:
$(OBJCOPY) -Osrec $< $@
all: $(PROGRAM)
$(PROGRAM): $(OBJS) $(START) $(LDSCRIPT) $(DEPEND)
$(LD) $(LDFLAGS) -o $*.elf $(START) $(OBJS) -lgcc
$(OBJCOPY) -Osrec $*.elf $*.mot
clean:
rm -f -r $(OBJS) $(PROGRAM) $(DEPEND) *.mot *.map *.elf *~

以前紹介したクロスコンパイラでコンパイルできます。

makeコマンドでコンパイルすると「hello.mot」が出来るはずです。

h8monでは「l」コマンドでhello.motをロードすることが出来ます。ターミナルソフトは「Tera Term Pro」がおすすめです。h8monでlコマンド入力後、「ファイル送信」機能かhello.motファイルをドロップして転送します。

h8monのgコマンドでロードしたプログラムを実行します。

実際に動かした画面は以下のようになります。

H8/300(H) 3069F Monitor Ver. 0.80
(c)2003,2004,2007 Takashi SHUDO
Virtual vector table area : FFBF20 - FFC01F
Monitor used RAM area     : FFC020 - FFC475
Monitor stack end address : FFC608
Build date                : 11:27:06 May  3 2008
>l
Please send S-records data.
Load address     : 400000 - 4000B2
Excution address : 400000
Done.
>g
Hello, H8 world!
Break.
PC = 400062      CCR = 84
R0 = 00FF0000    R1 = 00FFC090   R2 = 00FFC0F0   R3 = 00FFC09D
R4 = 00000000    R5 = 00000000   R6 = 00000000   R7 = 00FFFF20
400062 : 57 30                         trapa    #0x3:3
>

「Hello, H8 world!」の文字が出力されています。今回のソースはここに置いておきます。

ここまで読んでくれた方、お疲れ様でした。次回はh8monの目玉?である、gdbを使ったソフトの実行、デバッグを予定しています。(いつになったは工作の話になるんだろう(^^;;;)

2008.05.03

H8のモニタを作ってみた

以前紹介したH8マイコンボード「AKI-H8/3069Fマイコンボード」は数多くあるH8マイコンシリーズの中でもH8/3069と言われるCPUを使っています。H8/3069はフラッシュメモリを512Kバイト内蔵していて、RS232Cからソフトウエアを書き換えることが出来ます。ただし、フラッシュメモリは寿命があるため書き換え回数もメーカ保証は100回程度です。(実際はもっと書き換えても大丈夫なようです。)

ソフトウェアを作るには、何度も試行錯誤が必要なので、ソフトを修正するたびにフラッシュメモリを書き換えているとすぐにフラッシュメモリの寿命が尽きてしまいます。

そこで、モニタソフトを作ってみました。安直な名前ですが取り敢えず「h8mon」と命名し、以下に公開しました。

h8monはS-Record形式のH8用プログラムのダウンロードと実行のほか、レジスタ、メモリの参照、編集や、ブレークポイントの設定、ステップ実行機能、逆アセンブル表示機能と、おおよそソフトウェア開発に必要な機能は網羅していると思います。
その他、仮想割り込みベクタやgdbのstub機能も持ちます。(これらは後ほど解説しようと思います。)

h8monは、以前公開したクロスコンパイラでコンパイルできます。
以下はコンパイルの例です。

$ tar xvfz h8mon-0.80.tar.gz
$ cd h8mon-0.80
$ make

正常にコンパイルが終了すれば、ファイル「h83069mon-0.80.mot」が出来ます。
これをAKI-H8/3069Fマイコンボードキット付属のフラッシュ書き込みツール等で、フラッシュメモリに書き込みます。正常に書き込みが完了すれば、AKI-H8/3069Fマイコンボードをモード5で動作させます。

RS232Cは適当なターミナルソフトを下記の設定で接続してください。

ボーレート:115200 bps
データ:8ビット
パリティ:なし
ストップビット:1ビット

うまく動けば、ターミナルソフトに下記のようなメッセージが出力されます。

H8/300(H) 3069F Monitor Ver. 0.80
(c)2003,2004,2007 Takashi SHUDO
Virtual vector table area : FFBF20 - FFC01F
Monitor used RAM area     : FFC020 - FFC475
Monitor stack end address : FFC608
Build date                : 11:20:02 May  3 2008
>

「h」と入力すると簡単なヘルプメッセージが出ます。
次回は、h8monを使ったプログラムの動かし方、デバッグ方法を解説する予定です。(っていうか全然工作の話出てない…。(^^;;;)

2008.05.01

H8マイコンのソフトウェア開発環境

とにかく相手はコンピュータなので、動かすにはソフトウェアが必要です。H8マイコンのような、小さなコンピュータのソフトウェアはクロスコンパイラというものを使って作ります。クロスコンパイラはパソコンで動作しますが、コンパイルして出来上がる実行ファイルはH8マイコン用になります。

詳しいことは、ネットで調べてもらうとして…。

コンパイラやリンカ、デバッガはgnuのgcc、binutils、gdbを、ライブラリはRedHatのnewlibを使います。既に多くのサイトでgccを使ったH8マイコンのソフトウェア開発環境の構築方法が紹介されていますが、手順が結構面倒ですし、開発用ソフトウェアをソースファイルからコンパイルすると遅いPCだと数時間も時間がかかってしまいます。

また、日々進化するgnuのツール類からすると既に古くなっている情報も多いので、比較的新しいバージョンでクロスコンパイラを構築してみました。

開発環境(クロスコンパイラ)はLinux上で構築しています。Vine linux 4.2上で動作を確認しているrpmパッケージを作ってみましたので、インストールすると直ぐに使えます。これらは以下で公開しました。

linux PCへインストールするには、以下のファイルをダウンロードします。

binutils-h8300-elf-2.17-4.i386.rpm
gcc-h8300-elf-4.2.1-2.i386.rpm
newlib-h8300-elf-1.15.0-2.i386.rpm
gdb-h8300-elf-6.1.1-2.i386.rpm

root権限でインストールします。以下はインストール時のコマンド例です。

# ls
binutils-h8300-elf-2.17-4.i386.rpm gdb-h8300-elf-6.1.1-2.i386.rpm
gcc-h8300-elf-4.2.1-2.i386.rpm newlib-h8300-elf-1.15.0-2.i386.rpm
# rpm -ivh *.rpm
準備中... ########################################### [100%]
1:gcc-h8300-elf ########################################### [ 25%]
2:binutils-h8300-elf ########################################### [ 50%]
3:gdb-h8300-elf ########################################### [ 75%]
4:newlib-h8300-elf ########################################### [100%]
#

次回はH8クロスコンパイラを使ったソフトウェアの動かし方と、モニタソフトについて解説する予定です。つづく(といいな(^^;;;

Next »