まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

2012年10月

ソレノイド駆動メモ

ツイッターで今日話してたのをメモ。
 マイコンでサインペンを5mm程度アップダウンするための機構について、いくつか考えた。
(1)モーター+低速なギアボックス+クランク  モーターは回りっぱなしなので位置を検出するセンサが必要
(2)サーボモーター ラジコン用の小さなサーボ。舵角を調整できるしArduinoにはservo.hといったライブラリがある。
(3)ソレノイド。電磁石の原理でシャフトを動かすことができる。

例えば、以下で扱っているソレノイドは6V、保持電流0.53A、5gまでOK
【MD-252-1】ソレノイド

マルハ電機 DCソレノイド
そのままではマイコンでは駆動できないのでトランジスタを使う。
トランジスタによるドライブ回路
リレー等はこれでも良いが、シャフトを引っ張ったままにする保持電流が0.5Aもあるので小電力トランジスタでは駆動できない。増幅率を上げるダーリントン接続はオススメしない、と以下にあった。
電子回路におけるリレー使用上のご注意 

モーター駆動用のMOS-FETモジュールもある。
パワーMOS-FETモジュール MP4401 120V3A(12Apk)/ch

昔はMini-ZのFET貼替えなどやって遊んでいた。以下が参考になる。並列接続もできる。
http://minase.on.arena.ne.jp/mniz/

HAT3004→HAT3010→SP8M4

PS/2キーボード変換器の製作(19) HEXファイルにパッチを当てる

前回、Arduino LeonardoではUSBキーボードに関するHID Report Descriptorではふつうの日本語キーボード等とは違い、キーの上限を101に制限していることがわかった。これが原因で日本語キーボードの[¥]や[ろ]に対応するコードを送っても無視されていた。
 このHID Report Descriptorの記述はArduino IDE1.0.1のソースにあるHID.cppの中で定義されてある。これはコンパイル済みなのでいじれない。そこでArduino IDEが生成する、マイコンに書き込むイメージファイルである.HEXファイルにパッチを当てることにした。

 Arduino IDE1.0.1でコンパイル時に生成される.hexファイルの所在は以下の方法で知ることが出来る。
Arduino開発環境が使えなくなってハマった件

例えばこのようなディレクトリの中に生成される。(MacOSX)
/var/folders/r5/h8nsfjps4kzdltsm9t4p0qr00000gn/T/build2978712088924621678.tmp/sketch_oct06a.cpp.hex

.hexファイルはひとつしかないので、これをコピーして以下のパッチを当てる。
25行目、
:100180008103950675081500256505071900296581
 ↓
:10018000810395067508150025FE0507190029FE4F

 パッチ当て後はチェックサムも変更しなければならないのでawkで作ったツールで確認した。
[awk]インテルHEXフォーマットのチェッカ

 こうやって作った.hexファイルを書き込む。色々試行錯誤して、結局AVRISPmkIIを使った。
 
$ /Applications/Arduino1.0.1.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino1.0.1.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega32u4 -cavrispmkII -Pusb -b57600 -e -Uflash:w:ok.hex:i

書き込み用ツールavrdudeはArduinoIDE内のものを、confファイルも同様。ここでは-eでフラッシュメモリを消去してから書き込んでいる。-Uオプションで消去をスキップしたらverifyでエラーが出たため。

以下、ログ
avrdude: Version 5.11, compiled on Sep  2 2011 at 18:52:52
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "/Applications/Arduino1.0.1.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/takesita/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : usb
         Using Programmer              : avrispmkII
         Overriding Baud Rate          : 57600
avrdude: usbdev_open(): Found AVRISP mkII, serno: 000200081404
         AVR Part                      : ATmega32U4
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    10     8    0 no       1024    8      0  9000  9000 0x00 0x00
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500V2
         Description     : Atmel AVR ISP mkII
         Programmer Model: AVRISP mkII
         Hardware Version: 1
         Firmware Version Master : 1.10
         Vtarget         : 5.0 V
         SCK period      : 8.00 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e9587
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D8
avrdude: safemode: efuse reads as CB
avrdude: erasing chip
avrdude: reading input file "ok.hex"
avrdude: writing flash (6676 bytes):

Writing | ################################################## | 100% 2.75s

avrdude: 6676 bytes of flash written
avrdude: verifying flash memory against ok.hex:
avrdude: load data flash data from input file ok.hex:
avrdude: input file ok.hex contains 6676 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 2.01s

avrdude: verifying ...
avrdude: 6676 bytes of flash verified

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D8
avrdude: safemode: efuse reads as CB
avrdude: safemode: Fuses OK

avrdude done.  Thank you.


 これで書き込んだLeonardo(Davinci)をPCに接続し、前回のキー入力テストを行うと、ちゃんと¥マークが入力できた。成功!

 なお、Arduino IDEのソース中ではLEDの状態を受信する部分は定義されていないので、USB経由の指示で、接続したPS/2キーボードのLEDを制御することができないようだ。

PS/2キーボード変換器の製作(18) USBキーボードの無視されるキーについて

正確にはArduino Leonardoで送信するキーのコードの一部が無視される現象について。

 WindowsXPで日本語キーボードが使える状態にして[¥]、[ろ]キーに対応するUsageコード0x89,0x87を送信する。普通の日本語キーボードでは期待通りの表示。だがArduino Leonardoから対応するコード0x89,0x87を送信しても無視される。この動作はUbuntu12.04をインストールした日本語キーボード接続のPCでも同様。
 USBlyzer というのを使ってパケットを監視してみた。これは有料だがお試し期間がある。
すると、日本語キーボードを接続したときは0x89を含むパケットにInternational3、0x87を含むパケットにInternational1の注釈がはいる。 しかしArduino Leonardoの場合は0x89、0x87とも注釈がApplicationとなっている。おなじキーボードデバイスなのに違う扱いを受けているようだ。どこかに違いがあるはずだが、ディスクリプタをよく理解していないので時間がかかりそう。キーボードに種別があるような記述は見つけていないし、ディスクリプタ中に現れるbCountrycodeは日本語キーボードでも0だったため、使われる地域の指定は無関係だった。他にあるのか。

 なお、調査中にわかったのだが、日本語キーボードの全角/半角キーはUsage 0x94にコードが割り当てられているが、実際に全角/半角の動作に切り替わるのは0x35[`]だった。

追記:なんとなくわかってきた。

https://gist.github.com/3854088

普通の日本語キーボードのHID Report Descriptorでは

Logical Minimum 0
Logical Maxmum 255
Usage Minimum (Undefined)
Usage Maximum 255

だけど、Arduino Leonardoは

Logical Minimum 0
Logical Maxmum 101
Usage Minimum (Undefined)
Usage Maximum 101 (アプリケーションキーまで)

となっている。0x89や0x87のコードを送っても無視されるのは多分このせい。

これらの記述はHID.cppの最初の方にある。これは……パッチを当てるしかないのか?


以下、資料: 
USB Descriptor
マウス付きUSBキーボードのディスクリプタ構成を調べる
HIDクラス
http://linux.die.net/Mobile-Guide/mobile-guide-p2c1s6-keyboard.html
USBキーボードのキーコード
アーカイブ: HID デバイスのハードウェア ID
Device Class Definition for Human Interface Devices (HID) [pdf]
HID Usage Tables[pdf]HID Usage Tables

PS/2キーボード変換器の製作(17) USBキーボードの任意コードの送出

Arduino Leonardo+IDE1.0.1ではKeyboard.press() / release()でUSB HIDキーボードのキーを押したような動作ができるが、引数としてアルファベットはASCIIコードを受け付け、HID Usage IDに変換してから送出しているので送れないキーがある。できれば余計な変換なしでHID Usage IDをそのまま送りたい。
 キーボードのコードを送信している部分 HID.cpp内のKeyboard_::sendReport(KeyReport* keys)はUSBAPI.hではprivateで宣言されている。USBAPI.hをコピーしてここだけpublic宣言にすればダマせるかなとやってみたがそんなのは通用しなかった。ここはコンパイル済で提供されているのでいじると大げさだしそんな実力はない。ということで、sendReport()内で呼び出してるHID_SendReport()は隠されてないのでこれを呼び出すArduinoライブラリを作ってみた。

https://gist.github.com/2ad9f7a713f46149e72f

ほぼHID.cppからのコピペですよ。

PS/2キーボード変換器の製作(16) ArduinoIDE1.0.1

Bootloaderメモ:
ArduinoのブートローダをいじってHIDのみホストに認識させることはできないだろうか?
dfu-programmer

ATmega 32u4 bootloader without ISP connection

USBメモ:
Arduino Leonardoを使ってUSBキーボード相当を実現しようとすると日本語キーボードの一部(¥、_)に対応するコードが送信できない。keyboard.press()を実現している部分をArduinoIDE1.0.1のソースから持ってきてそのままのコードを送れるように書き換えた。
ただしコンパイルが通った程度&汚いのでとりあえず置いとく。今週ちゃんと書きなおす。

https://gist.github.com/3827425

SSR(ソリッド・ステート・リレー)実験メモ

USBでパソコンと連動するACタップがあるが、秋月電子のソリッド・ステート・リレー(SSR)キット 8Aタイプを使って似たようなものを実験してみた。昔はMacintoshの電源と連動するSyncTapというのがあったなあ。
2012SSR01

 キットの制御線は+5V、GND、CTRL。+5VとCTRLを直結しUSB-Bコネクタの1pinへ、GNDは4pinへ。AC100V周りのプラグ、レセプタクル、ケーブルはホームセンターで買ってきた。

2012SSR02

 負荷は100V/70Wのはんだごて。USBケーブルでノートPC(Dell Latitude D630)に接続し、電源ON/スリープ解除で通電、電源OFF/スリープ状態で切れることを確認した。ノートPCによってはスリープ状態でUSBへの給電が切れない機種(MacBookProなど)もあるので注意。

キットは他にもある。
ソリッド・ステート・リレー(SSR)キット 40Aタイプ

ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ

色々知らなかったことがあるのでメモ:
・SSRは交流を制御する。普通のリレーと同じではない
・誘導性の負荷(コイル、モーター、スイッチングACアダプタ)だと誤点弧という現象が起きやすいらしい。スナバ回路で抑止。
・最小動作電流というのがある。

ソリッド・ステート・リレー(SSR)キット 25A(20A)タイプの質問と回答
 
 ACアダプタでそんなに消費電力が大きくないものを制御しようと思ってたので、ちょっと実験してみないとわかんないなあ。 

記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ