Posted on

Atmel STK500 の改造

本記事では Atmel STK500 スターターキットを改造し、 HVSP/PP や ISP だけではなく、 TPI や PDI でもプログラムできるようにします。

注意: GoPro や Genlock は本ブログでよく話題にされていますが、この記事は全くそれらと関係ありません。

イントロダクション

Atmel STK500は2001年に発売されて以来、現在まで使われている寿命の長い製品です。ただし、今日ではほとんどのユーザが STK500 を単にプログラマとして用いていると思われ、DIP パッケージのマイクロコントローラを試すためのスターターキットとしては用いていないのではないかと思います。

STK500のボード上には2つのマイクロコントローラ ATmega8535L (主)、ATtiny2313V (従) が搭載されており、次の特徴があります:

  • HVPP (High Voltage Parallel Programming) プログラマ
  • HVSP (High Voltage Serial Programming) プログラマ
  • ISP (In-System Programming) プログラマ

本稿で述べる改造では、主マイクロコントローラの ATmega8535L をフラッシュメモリの容量が大きい、ピン互換のマイクロコントローラに換装し、従マイクロコントローラの ATtiny2313V は除去します。後者の改造が可能なのは、Atmel が2009年以降は現在に至るまで主マイクロコントローラ用の新しいファームウェアを提供しておらず、従マイクロコントローラの唯一の役割であるところの主マイクロコントローラのファームウェアを更新するという機能はもはや不要であるとみなされるからです。STK500 のボードにメモリ容量の大きなマイクロコントローラが載ってしまえば、オープンソースのファームウェア、たとえばMatthias Neeracherさんが作ったScratchMonkey (Orangkucing Labでそれを改良しました)が動かせて、しかも TPI や PDIプログラマの機能も追加できます。

ハードウェアの改造

純正のSTK500から次の4つの部品を除去します:

  • U200 : ATtiny2313V
  • U202 : ATmega8535L
  • C200 : 47n のコンデンサ
  • R200 : 10k の抵抗

Remove orange parts. Add red parts.
オレンジ色の部品を除去。赤色の部品を追加。

(上図は Atmel の公式ページの “STK500 component placement: STK500_asm.pdf”からとりました。部品番号は同様に公式回路図 “Atmel STK500 schematic: STK500.pdf”に合わせてあります。)

上記の部品を除去した後のボードは次の写真のようになります:

After removing four parts from STK500
STK500から4つの部品を除去

そして次の部品を実装します:

  • U202 : ATmega1284P
  • R213 : 0 オームのジャンパ (はんだで橋をかけてしまっても可です)
  • J200 : 2×3 ヘッダーピン

新しく実装するマイクロコントローラはATmega8535とピン互換ならなんでも大丈夫です。具体的には ATmega16/32/64/128 や ATmega164/324/644/1284 ファミリーから選んでください。この稿では、もったいないくらい高機能な ATmega1284P を使いましたが、表面実装のマイクロコントローラの細かいはんだ付けで将来、何度も外したり付けたりを繰り返したくないと思ったからです。

これらの部品をはんだ付けし終わったら、STK500 のハードウェアの改造は完成です。改造後の写真が次です:

A STK500 mod board. A sticker (1) indicates the 1st pin of ISP6 connector.
STK500 改造後の基板。(1) と記されたシールはJ200 ISP6コネクタの1ピンの目印です

ソフトウェア

U202に実装した主マイクロコントローラにファームウェアを焼くには、別のISPプログラマが必要です。本稿では、どうやってファームウェアを焼くかとか、そもそもISPプログラマとは何かとかについては説明しません。そういうことに関してはたぶん、この記事の読者のほうが筆者よりも詳しいと思われます。:)

ですから、別のISPプログラマを新しくJ200に実装したISP6ピンヘッダに接続し、ここからダウンロードしたファームウェアを焼くだけです。 (このリンク先は ScratchMonkey を筆者がフォークしたブランチです。近い将来、トランクにマージされることを期待しているところです。)ソースコードをコンパイルするためには Arduino IDE とその DIP-40 core というのが必要になります。ここにある説明を参照してください(英文です)。ただし、STK500 は水晶発振子として 7.3728MHz のものを用いていますので、board.txt ファイルは次の行を含むように編集しないといけません:

ATmega1284-7372800.name=ATmega1284-7372800Hz
ATmega1284-7372800.upload.tool=avrdude
ATmega1284-7372800.build.mcu=atmega1284
ATmega1284-7372800.build.board=AVR_ATMEGA1284-7372800
ATmega1284-7372800.build.f_cpu=7372800L
ATmega1284-7372800.build.core=arduino:arduino
ATmega1284-7372800.build.variant=ATmega1284
ATmega1284-7372800.upload.maximum_size=128000

付記: 上記の例はマイクロコントローラとして ATmega1284 を用いる場合です。他のマイクロコントローラを実装した場合は、例を参考に編集してください。

参考のために書いておくと、マイクロコントローラのヒューズは次のように設定して動作しています:

  • CKDIV8/CKOUT unprogrammed
  • SPIEN programmed
  • SUT_CKSEL = FSOSC_16KCK_65MS_XOSC_SLOWPWR

さて、STK500 改造基板は今や Atmel Studio 4/5/6/7 や avrdude (ISPの場合は stk500v2、HVPPの場合は stk500pp、HVSPの場合は stk500spを指定して) に純正の Atmel STK500 として認識されるはずです。

その上、今やこの改造基板は TPI や PDI のプログラマにもなっているのです。このことの詳細は次章以降で述べます。

STK500 改造基板を TPI/PDI プログラマとして使う — そのソフトウェア

残念ながら Atmel Studio は STK500 改造基板を TPI/PDI プログラマとしては認識しません。TPI/PDIプログラマとして使いたいときには、avrdudeのソースコードにパッチを当てて、STK500 改造基板はいつも avrdude から使うという風にしないといけません。

avrdude へのパッチは8個の部分からなります:

avrdude はいろいろな版がいろいろな形で配布されているため、ここに示したパッチは参考程度です。あなたがお持ちのavrdude のソースコードにpatchコマンドを動かして自動的に適用できるわけではなく、stk500v2.c というファイルの該当する箇所を見ながらあなたの手でパッチを当てる必要があるはずです。

パッチの第1の部分(1254,1263) は PGMTYPE_STK500 でも XPROG (TPI と PDI)を呼び出すようにします。

第2の部分 (3712,3719) と第3の部分 (3724,3736) では flash や eeprom の容量を計算し、第4の部分 (3795,3801) と第5の部分 (3806,3811) は計算した容量を STK500改造基板に申告するための変更です。

パッチの残りの部分は TPI のヒューズをプログラムする際に “書き込み前の神秘的な消去” が必要なための変更です。

STK500 改造基板を TPI/PDI プログラマとして使う — その接続

パッチ済みのavrdudeが用意できたので TPI/PDI のマイクロコントローラがプログラムできるようになりました。


TPI のマイクロコントローラをプログラムするには 510 オームの抵抗が外付けで2個必要です。次の回路図のように接続してください:
TPI
5V、MOSI、MISO、SCK、GND は J200 ISP6 コネクタにあります。VTARGET は基板上で “VTG” と印刷されているどのピンにも出ています (“VTARGET” ジャンパはセットしてください)。RESET5V は “PROG DATA” の5ピン、RESET12V は “ISP6PIN” または “ISP10PIN” に出ています。リセット無効化ヒューズがプログラムされていない時(リセットが有効の時)は、上の回路図で TPI と記されたコネクタの信号を使ってください。 リセット無効化ヒューズがプログラムされている時(リセットが無効の時)は、高電圧TPIはターゲットの電源電圧を制御する必要がありますので、上の回路図でTPI HV と記されたコネクタの信号を使ってください。


PDI のマイクロコントローラをプログラムするには、510オームの抵抗が外付けで2個必要なだけでなく、4回路入りの5V入力トレラントなトライステートバッファ 74LVX125 が1個必要になります。 次の回路図で示す接続を使ってください:
PDI2
3V3 は “VADJ” または “EXPAND0” コネクタの13ピンに出ています (“AREF” ジャンパはセットしてください)。MOSI、 MISO、SCK、 GND は J200 または “ISP6PIN” または “ISP10PIN” に出ています。MOSI_GATE は “ISP6PIN” や “ISP10PIN” の RESET ピンに出ています。

付記: PDI プログラミングは 3.3Vロジックです。STK500 は 5V ロジックですので、何らかのロジックレベル変換が不可避です。自動レベル変換のチップが世の中にいろいろありますが、筆者がMAX3002、GTL2003、TXB0104、FXMA108 を実際に使ってみたところ、このうちの一つたりともまともに動きませんでした。74LVX125のようなトライステートバッファを使わざるを得ないのは残念なことです。まったく、 Atmel の PDI ってなんてナイーブで馬鹿げたプロトコルなんだろうか!!


この稿を終わるにあたり、avrdude の起動時の引数の例をいくつか挙げておきます:

avrdude -c stk500v2 -p t10 -P /dev/tty.usbXXXXX -vvvv # 詳細な通信ログと tiny10 のシグニチャを表示する
avrdude -c stk500v2 -p x128a1 -P /dev/tty.usbXXXXX -U flash:w:hehehe.hex:i # hehehe.hex を xmega128a1 の flash メモリに書き込む

ただし、例で tty.usbXXXXX は STK500 改造基板が繋がっているシリアルポートを表しています。

楽しんでね!

Posted on

MewPro Genlock Dongle の使い方

Genlock Dongle と MewPro のデモを確認し、接続方法を説明します。

2台の GoPro Hero 3+ Black なら Dual Hero System を使うと、ビデオや写真を genlock で撮ることができます。しかし、3台以上の場合、今まではそういうことができませんでした。MewPro Genlock Dongle は GoPro カメラ本体のハードウェアのエミュレーターです。Dual Hero System と通信して、それが生成している genlock のために必要な垂直同期、水平同期の信号を盗み出します。

Dongle の動作デモ

4台の GoPro を同期しながら撮影する様子のデモ映像です。電源オンとオフ、撮影モードや設定の変更、撮影が同期しています。

このデモ映像を撮る際に必要だった道具を以下に記します。

数量
GoPro Hero 3+ Black n
MewPro n-1
Genlock Dongle 1
USB 充電パック 1
配線材

(注: n はカメラの台数です。このデモでは n=4です。)

上記の道具は次のように接続しました。

Single dongle configuration
Dongle 1台設定

  • TRIG: Dual Hero が録画の開始/停止のために生成します
  • VSYNC: Dual Hero が各フレームの同期のために生成します
  • HSYNC: Dual Hero が各走査線の同期のために生成します
  • GND: 信号線のグランドです
  • UART の信号線 (TXO/RXI) は MewPro と Dongle が用い、GoPro #0 の設定やモードの変更を他の GoPro に共有させることができます。 (*)
  • RESET は接続はしなくても構いませんが、エラーが起こったときのことを考えると利用価値があります。Arduino Pro Mini のどれかのリセットボタンを押すと、全部のボードがリセットされます。これはすべてのボードをいったん取り外してから再装着するのと同じ効果があります。

Dongle は Dual Hero の USB コネクタから電源をとって動作しているので、市販の USB 充電パックまたはACアダプターをそこに接続する必要があります。

* 注意: GoPro #0 がモードや設定、録画の開始/停止などの全てをコントロールします。GoPro #0 からの指令は他の GoPro たちに UART の信号線で伝達されます。これは上意下達的で、フィードバックはありません。したがって、もし他の GoPro のどれかがビジーの場合、指令が無視されることも起こり得ます。しかしながら、UART の信号線は TRIG とか VSYNC、HSYNC とは関係ないので、この程度の信頼性でも、ビデオの画質や撮影自体には何の影響もありません。

もう一つ別の接続方法

上で説明した Dongle 1台設定は普通の状況では充分で、多数台の GoPro をフレームに固定した撮影器材を新たに制作するような場合には、もっとも少ない部品でできるという意味でお勧めできます。しかし、そうではない場合、例えばもう GoPro を何台も固定した器材を作ってあるとかいう場合、もう一つ別の接続方法も可能ですので、考慮してみてください。

数量
GoPro Hero 3+ Black n
MewPro n
Genlock Dongle 2
USB 充電パック 1
配線材

(注: n はカメラの台数です。このデモでは n=4です。)

接続は次のようにします。

Double dongle configuration
Dongle 2台設定

1台ではなく2台の Dongle を使う利点は、配線がより対称的になる (MewPro #0 と Dongle #1 の間の UART 信号線は対称ではありません) ということと、GoPro #0 の背面により大きな余裕ができることです。

Dongle 2台設定の動作している様子のデモ映像もあります。電源オン、モード変更、撮影、電源オフの様子です。

配線の方法

Dongle が1台設定でも2台設定でも、Dongle #1 と MewPro #i (i=0,1,2,…,n) の間の配線は次のようになると分かります。
wiring

1台設定と2台設定は、MewPro #0 があるかないかだけしか違わないことが分かります。

ここで示した配線は、すべてあなた自身が半田付けする必要があります。その際、次の図で確認してください。

Wires to Dongle #1
Dongle #1 の配線
Wires to MewPro
MewPro の配線
Wires to MewPro 2
MewPro 2 の配線
Wires of MewPro Cable
MewPro Cable の配線

付記: 当ラボでは GoPro Hero 3+ Black が4台で、配線が 30cm 程度までしか動作を確認していません。もし、それより多数の GoPro の場合や配線が長くなる場合、動作の保証はありません。しかし、たいていの場合、大丈夫ではないかと期待しますが、配線はなるべく短くするようにしたほうがいいですよ。

関連資料

Posted on

英文サイトをご覧ください

日本語の文書は下にある「MewProとアプリケーションの使い方」「MewPro Genlock Dongle の使い方」「Atmel STK500 の改造」「HVprog2の使い方」「ポケモンGOでの「かくれているポケモン」活用法」を含むごく少数の記事しか翻訳していません。

恐れ入りますが英文サイトの方をご参照くださいますようにお願いいたします。

付記: 当サイトの “Contacts” に記されているアドレスへのお問い合わせでは、日本語か英語での対応が可能ですので、お気軽にお問い合わせください。

Posted on

MewProとアプリケーションの使い方

MewPro (ミュープロ) を最初に使う方法を説明します。GoPro (ゴープロ) カメラの制御の基本も説明します。今回はセンサーの説明はしません(センサーの例はこのあとのポストで説明することになると思います)。

注: MewPro は、GoPro というビデオカメラに接続して、ビデオカメラを制御するためのオープンソース/オープンハードの電子工作キットです。販売はこちらのページで行っています(もちろん、日本国内にも発送します)。


必要なもの

MewPro を GoPro のコントローラーとして使うためには次のハードウェアが必要です:

GoPro Hero 3+ Black (ゴープロ ヒーロー 3+ ブラック)
これ以外の機種は MewPro では動きません。Hero 4 Black はサポートできるはずですが、お約束はできません。
MewPro
表面実装のパーツや Herobus コネクタ、Arduino Pro Mini 3.3V 8MHz (アルドゥイーノ プロ ミニ 3.3ボルト 8メガヘルツ) がハンダ付けしてあるもの。もっと高性能なマイコンがいいのなら、MewPro のアプリケーションは Teensy 3.1GR-KURUMI をサポートしています。
Arduino Pro Mini 用の臨時 FTDI ヘッダー
このサイトのショップから MewPro をお求めの場合には、このヘッダーが商品のパッケージに含まれています。
Sparkfun FTDI Basic Breakout – 3.3V と USB ケーブル
FTDI ボードは 3.3V 版にしてください。互換品で構いません。


注意: Arduino Pro Mini の代わりに Teensy 3.1 を使う場合には、Arduino Pro Mini 用の臨時 FTDI ヘッダーと Sparkfun FTDI ボードは不要です。このサイトのショップにはArduino Pro Mini / Teensy 3.1 変換基板がありますのでご購入をご検討ください。

Teensy の場合の警告: Teensy 3.1 を MewPro で使う場合、基板の VUSB と VIN の間のパターンを切ってください (Teensy のハンダ用パッドがたくさんある側にカットするための特別なパッドとその隙間があります)。MewPro は RAW に GoPro 本体のバッテリーから約3.8Vを受けています。ですから、もし VUSB (5V) を MewPro の RAW につなぐと GoPro 本体のバッテリーに 5V がかかることになります。これでは GoPro が壊れます。

ソフトウェア:

Arduino IDE 1.5.7 beta またはそれの新版
Arduino IDE の古い版は Wire ライブラリーにバグがあるため MewPro が動きません。
MewPro アプリケーション
これはオープンソースのソフトウェアです (MIT ライセンス)。 改変や配布が好きなように行えます。


注意: あなたがもし Teensy 3.1 または GR-KURUMI を使うというのなら、あなたは間違いなく「ハッカー」です。というわけで、そんなおかたは Arduino IDE の代わりにどんなソフトウェアを使えばいいかなんてとおの昔にご存知ですね。


接続

Arduino IDE を PC にインストールし、それを起動します。Arduino IDE で [File]→[Open...]→ とし MewPro.ino を開きます。

注意: MewPro.ino には以下のファイルがタブとして含まれています。 a_Queue.inob_TimeAlarms.inoc_I2C.inod_BacpacCommands.inoe_Shutter.inof_Switch.inog_IRremote.inoh_LightSensor.inoi_PIRsensor.inoj_VideoMotionDetect.inoもし、Arduino Pro Mini の中でどんなことが起こるかを理解したいのなら、これらのファイルを読めばよいということです。

MewPro を PC に FTDI ボードと臨時ヘッダーを使って接続します。
IMG_5942
さらに GoPro Hero 3+ Black に接続します。
IMG_5943

Arduino IDE の中で次を選びます。[Tools]→[Board]→[Arduino Pro or Pro Mini]、[Tools]→[Processor]→[ATmega328 (3.3V, 8MHz)]、[Tools]→[Port]→[(FTDI を接続したポート)]. そして “Verify” をクリックして MewPro スケッチをコンパイルし、”Upload” をクリックして Arduino Pro Mini にアップロードします。

注意: Teensy 3.1を使う場合 c_I2C.ino のコンパイルができません。最初の4行を次のように変更してください。
#if defined(__MK20DX256__) // Teensy 3.1
#include <i2c_t3.h> // *** please comment out this line if __MK20DX256__ is not defined ***
#else // Arduino Pro Mini
//#include <Wire.h> // *** please comment out this line if __MK20DX256__ is defined ***


GoPro をコントロール

Arduino IDE のウインドウで “シリアルモニター” を開きます (右上隅の “虫眼鏡” アイコンをクリックします)。右下隅のプルダウンメニューで [57600 baud] を選び、真ん中のメニューは[Newline]、左はチェック入れて[Autoscroll]とします。

11.57
@‘ (アットマーク1文字) をシリアルモニターの入力窓に入力し、リターンキーを押します。

12.00
camera power on” というメッセージが表示され、GoPro Hero 3+ Black の電源がオンになります。

シリアルモニター” に表示されるメッセージは、Arduino と GoPro の間の通信の詳細を表しています。もし、これが MewPro と GoPro を初めてつないだ場合なら、あたかも間違いが起こっているかのような “>01 08” というのが繰り返して表示されます。これは MewPro のボード上にある I²C EEPROM の正しい初期化がまだされていないからです。そこで、もう1つの1文字コマンド ‘!’ (びっくりマーク) をシリアルモニターの入力窓に入力しましょう。

12.001

すると GoPro からいままでとは違うメッセージが表示されます。
12.002
“role change” というのは BacPac™ としての役割が変更になったことを表します。今回は役割が “マスター” になりました。(Dual Hero BacPac™ における役割に関しては、ちょっと前のポスト (英文) をご覧ください)。

役割が “マスター” のとき、カメラ本体のシャッターボタンは押すことができなくなっています。しかし、コンポジットビデオ信号を Herobus コネクターを通して出力させるコマンド “VO1″ を使うことができるのはこの役割のときだけです。”マスター” のとき、MewPro はこのコマンドを GoPro に向けて自動的に送出しますが、その様子が上のスクリーンショットで分かります。

次に役割を “スレーブ” に変更します。そのためには、1文字コマンド ‘!’ をもう一度入力してください。’!’ コマンドは “マスター” と “スレーブ” の役割を切り替えます。
12.003
12.010

上のスクリーンショットでは、GoPro本体からいろいろな情報が引き出せた様子がわかります。

さて、これで MewPro ボード上の I²C EEPROM は “スレーブ” として正しく設定されました。役割が “スレーブ” のときには、GoPro 本体のシャッターボタンを押すことができます。ですから、MewPro はこの役割で普段お使いになることをおすすめします。

これ以後は、Arduino から GoPro のほとんどすべての操作をすることができます。I²C コマンドの一覧は 以前のポスト (英文) にあります。

“SY1” と入力してみましょう。その次には “SY0” を入力してみましょう。 (録画が始まります! 録画が停止します!!)

もう終わりにしたければ “PW0” と入力しましょう。 (GoPro の電源がオフになるはずです。)

それではお楽しみください!


最後に注意: “SY1” コマンドは GoPro が電源投入時と異なるモードにある際には動作しません。つまり、カメラ本体の mode/power ボタンを指で押したり、”CM” (SET_CAMERA_MODE) コマンドを送出した場合、以降の “SY” コマンドは動作しなくなります。これは GoPro のファームウェアの制約で、MewPro 側ではどうにもなりません。この制約を回避するには、モードを変更する際には “DM” (SET_CAMERA_DEFAULT_MODE) で変更先のモードを指定し、”PW0” コマンドで電源をオフにします。そのあと ‘@‘ コマンドで電源をオンにすれば “SY1” コマンドが動作します。