に投稿 コメントを残す

Arduino を用いた “ねこ鍋型猫体重計” の製作

料理用のはかりと市販のアルミ製 “ねこ鍋” と Arduino Uno を用いて、猫専用の体重計を作りました。

なぜ、ねこ鍋型体重計?

去る2月のとても寒い日に、当ラボのスタッフが弱って行き倒れている三毛猫を保護したのが始まりです。病猫の容体を把握するためには体重を正確に測り続けることが必要です。ところが、人間用の体重計は誤差が 500g 程度もあり、病猫用にするには精度が不十分です。また、台所用のはかり (キッチンスケール) は精度が 0.1g から 1g 程度と高いものの、病気の保護猫を秤皿に乗せてじっとさせておくのが至難の技です。もちろん獣医さんに連れて行けば体重は測ってもらえるのですが、猫は病院が大嫌いで、とくに保護猫はキャリーに入れるだけでも一大事です。

というわけで、猫用の体重計を市販の製品 (キッチンスケール、ねこ鍋) を組み合わせて自作することにしました。

特徴

次の条件をみたすことを考えました:

  1. 市販のアルミ製ねこ鍋を秤皿に用いて、猫が勝手に入ってくれるようにする。
  2. ねこ鍋には毛布やおもちゃが入れてあっても正確に測れる。
  3. 猫が入ってから電源を入れても測れる。

上の条件1をみたすために、ねこ鍋を単純に台所用のはかりに乗せたのでは安定が悪く、はかりの台座の拡張が必要でした。また、条件2、3をみたすために、マイクロコントローラ (Arduino Uno) を用い、風袋(猫体重を測る際に差し引かれるべき、毛布やおもちゃの重量) の値を電源断の間も保持するようにしました。

Arduino Uno を用いたため、

  1. PC で連続的に体重データを読み込むことも可能

になりました。また、液晶ディスプレイの表示スペースに空きがあったので、

  1. 温湿度計と時計の機能

も持たせました。

実際に製作した、ねこ鍋型体重計の様子

写真の美猫はみちつなちゃんで、Instagram: @azumakuniyuki さんにご撮影/ご提供いただきました。ありがとうございます。

ねこ鍋型体重計の取説

取扱説明書 (PDF) はここにあります。

ねこ鍋型体重計の製作

ここまで記事を読んできて同じものを自作してみたいと思われた方は、以下もお読みください。自作したくないという方は、ありがとうございました、お読みになる必要はありません。

なお、ここで製作した “ねこ鍋型猫体重計” と同じものを MewPro Scale という名前で、当ラボで受注生産しております。ご興味のある方は info@mewpro.cc にご連絡ください。8000円 (消費税と送料別) で納期約1週間で承ります。

次の材料を使いました:

  • ねこ鍋: Petio クールアルミキャットボウル (幅X奥行X高さ 35×7.7×35cm)
  • 台所用のはかり (キッチンスケール): HBLIFE デジタルキッチンスケール 1g単位 最大10kgまで 計量可能 風袋引き機能付き
  • クリアパイン集成材 1R円形 300mmɸ x 18mm
  • Arduino Uno (互換機 Seeeduino R4.2 を用いました)
  • キャラクタLCDディスプレイ 16×2
  • ロードセル用24ビットADコンバーター HX711
  • 温湿度センサー AM2320
  • リアルタイムクロック DS3231
  • モーメンタリースイッチ、配線部材など

キッチンスケールの表示部を取り除き、そこに HX711 を収め、ロードセルからのリード線をはんだ付けします。クリアパイン集成材を切断し、キッチンスケールをはめ込みます。

底面はアルミテープで接着します。

Arduino Uno に表示/センサー部を載せた自作のシールドを装着し、HX711 と接続します。(Arduino Uno には専用のソフトウエアがインストールされています。ソースコードは、まだ公開されていませんが、必要な方はご連絡ください。)

動作確認とロードセルの校正をしたあと、ねこ鍋を接着します。

完成です。

に投稿 コメントを残す

HVprog2の使い方

HVprog2 は、HVSP/PP や ISP、TPI、PDI でのプログラムができる Atmel STK500 のクローンです。 本記事では HVprog2 の使い方を説明します。

注意: 本記事は GoPro とかジェンロックと無関係です。 AVR マイクロコントローラに関する記事です。

前記事では、Atmel 純正 STK500 のソフト、ハード両面にわたる改造に関して述べました。改造前と改造後の Atmel STK500 に触発されて、それらのクローンとして設計したのが本記事のプログラマ HVprog2 です。

Atmel STK500 にはすでにハードウェアのクローンとして HVprog という名のプログラマがあり、HVSP/PP や ISP でのプログラムができると称しています。HVprog2 は HVprog の改良版にあたるので似たような名前にしましたが、HVprog2 は実際に AVR チップを HVSP/PP や ISP でプログラムできますし、それだけではなく TPI や PDI でもプログラムできます。

純正STK500と改造STK500、HVprog、HVProg2の比較

下の表は4つの AVR プログラマを比較した表です:

純正STK500 改造STK500 HVprog HVprog2
回路図 公開 不要 (*1) 公開 公開
Atmel純正ファームウェア 搭載可 不可 搭載可 搭載可 (*2)
ScratchMonkeyファームウェア 不可 搭載可 不可 搭載可 (*2)
RSTDISBL ヒューズの復元 不可 (*3)
HVSP/PP、ISP でのプログラム 信頼できない (*3)
TPI/PDI でのプログラム 不可 不可 可 (*2)

注1: 改造STK500は単に純正STK500からいくつかの部品を除去したり換装したりして作られています。

注2: Atmel純正のファームウェアは、プログラマのマイクロコントローラが ATmega8535 の場合に使えますが、この場合にはTPI/PDIでプログラムすることはできません。マイクロコントローラが ATmega16/32/64/128 か ATmega164/324/644/1284 の場合には ScratchMonkeyファームウェアを用いて、HVSP/PP や ISP だけでなく、TPI/PDI でもプログラムすることができます。

注 3: RSTDISBL (リセット無効化) ヒューズを復元するためには、ターゲットの電源電圧を制御する必要があります。HVprog にはそのための回路がありませんので、リセットを無効化した場合には元に戻せません。それだけではなく、STK500とHVprogの回路図を精査するとわかるように、同じソフトを使うにも関わらず前者は XTAL1 の信号を反転させていますが後者はそのままです。反転されていない信号をトリガとする HVprog はこの結果ありとあらゆる局面でタイミングに問題が生じ、信頼できないプログラマになってしまっています。

HVprog2 の概要

HVprog2の回路図です:
HVprog2

もしもあなたが ScratchMonkey のファームウェアだけしか使わないつもりなら、IC2 74HC165 とそのバイパスコンデンサ C3 は実装する必要はありません。これらの部品は Atmel 純正のファームウェアがハードウェアのバージョンを認識するためにだけ存在しています。

IC1 には DIP IC ソケットを使うことを推奨します。そうすれば、将来、マイクロコントローラを高性能なものに換装したりすることが容易になるからです。


次の写真は、HVprog2の製作例です。
プリント基板は当ショップで売っているものを使いました。
HVprog2

このプリント基板はスルーホール用の部品を可能な限り使うように設計しましたので半田付けは比較的容易なはずです。

JP1と印刷された6ピン(上側右)は PC に接続するためのコネクタで、非常に普及している Sparkfun FTDI ブレークアウトボードのピンの順に配列されています: 5V 版のFTDIブレークアウトをここに接続した場合、HVprog2のすべてのロジックは 5V で動作します(HVSP/PP と TPI は 5V ロジックであることが必要です)。一方、3.3V 版のFTDIブレークアウトを接続した場合、HVprog2 は 3.3V ロジックで動作し、これはPDIでプログラムするための電圧になっています。

HV_PROG と印刷された20ピン(下側右)はターゲットに接続するためのコネクタです。これらのピンはAVR Dragonの同名のピンと同じ順に並べてあります。つまり、AVR Dragon の網羅的なドキュメントをHVSP/PPでプログラムする際に参照して、ブレッドボードなどで配線できるということになります。

ソフトウェア

HVprog2にファームウェアを書き込むには、ジャンパ JP2 を 1-2 (SELF) 側にセットします。いま書き込もうとしているHVprog2とは別の ISP プログラマを、 ISP と印刷された 6 ピン(中央近くの左)に接続し書き込んでください。

上述したように、いまのところ、HVprog2に実装したマイクロコントローラに応じて2種類のファームウェアが利用可能です:

  1. ATmega8535 の場合は Atmel 純正の STK500 用のファームウェア
  2. ATmegaATmega16/32/64/128 または ATmega164/324/644/1284 の場合は ScratchMonkey

場合 1. Atmel 純正のファームウェアは Atmel Studio 4/5/6/7 のどの版をダウンロードしてもその中に含まれています: ファームウェアのバイナリファイルは STK500.ebn という名前ですが、このファイルのフォーマットは avrdude などの普通の書き込みソフトでそのままでは使えません。EBN2HEX.exeを使って “.ebn” を “.hex” に変換すれば書き込めるようになります (EBN2HEX.exe公式と思われるサイトを見つけることができませんでした。ご自分でGoogleなどで検索してダウンロードしてください)。ちなみに、ATmega8535のヒューズは、S8535C と CKOPT は unprogrammed に、SPIEN は programmed にして、 SUT_CKSEL=”Ext. Crystal/Resonator High Freq; Start-up time: 16K CK + 64ms” とした場合に動作することを確認しています。

場合 2. ScratchMonkeyを使います。必要なものの準備やコンパイル、アップロードの仕方は前記事に書いてあります。

ターゲットとの接続

HVSP/PP. HVSPの場合でもPPの場合でも、Device Connection Sheets, AVR Dragon’s manualに書いてあるとおりに結線してください: HV_PROGという同名のコネクタを参照のこと。
注意: VCC と JTAG を結線する必要はありません。HVprog2 にはそのコネクタがありませんので。


ISP. ISP でプログラムするには ISP コネクタを使います (JP2 は 2-3 にセットしてください)。
注意: HVprog2 の ISP6 ピンヘッダに出ている VCC にはつねに FTDI の VCC から電源が供給されています。


TPI/PDI. HVprog2 は 純正のSTK500 や改造STK500 のクローンなので、avrdude に前記事でやったのと同じ変更が必要です。

TPIのマイクロコントローラをプログラムするには、510オームの抵抗が2つ外付けで必要になります。HVprog2 自体は 5V版の FTDI ブレークアウトボードで PC と接続する必要があります。TPI ターゲットとの接続は次の回路図を参照してください:
TPI
5VとMOSIとMISOとSCKとGNDは “ISP” コネクタにあります (JP2 は 2-3 にセットしてください)。VTARGET は “HV_PROG” の 19ピン、RESET5V は “HV_PROG” の 5ピン、RESET12V は “ISP” の 5ピンまたは “HV_PROG” の18ピンにあります。回路図上の TPI コネクタはリセット無効化ヒューズがプログラムされていない(リセットが有効)の場合に接続してください。リセット無効化ヒューズがプログラムされている(リセットが無効)の場合には、ターゲットの電源を制御する必要がありますので、回路図上の TPI HV コネクタに接続してください。

PDIのマイクロコントローラをプログラムするには、510オームの抵抗が2つ外付けで必要になります。HVprog2 自体は3.3V 版の FTDI ブレークアウトボードで PC と接続する必要があります。PDIターゲットとの接続は次の回路図を参照してください:
PDI2
(破線内の部品は必要ありません。)

3V3とMOSIとMISOとSCKとGNDはすべて “ISP” にあります (JP2 は 2-3 にセットしてください)。

に投稿 コメントを残す

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 コア(”Mighty Core”)が必要です。ここに書いてある説明にしたがってインストールしてください。”Mighty Core” がインストールできたら、IDE のTools メニューで board: “Mighty Core”->あなたのマイクロコントローラー, clock: “External 7.3728MHz”, pinout: “Standard pinout” を選び、ソースコードをコンパイルしてできた hex ファイルをあなたのマイクロコントローラーに焼いてください。

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

  • 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 というファイルの該当する箇所を見ながらあなたの手でパッチを当てる必要があるはずです。

(2021/8/16 追記: こちらmariusgreuel さんの avrdude v6.3.1.1 を fork してパッチを当てたものを用意しました。Windows 用のバイナリも Releases に置いてあります。)

パッチの第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 改造基板が繋がっているシリアルポートを表しています。

楽しんでね!

に投稿 コメントを残す

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 の場合や配線が長くなる場合、動作の保証はありません。しかし、たいていの場合、大丈夫ではないかと期待しますが、配線はなるべく短くするようにしたほうがいいですよ。

関連資料