まごころせいじつ堂

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

メモ:秋月電子で買えるRTC(RealTimeClock)

データロガーを作ろうとしてるけど、タイムスタンプも欲しいよねということで調べた。秋月電子ではDIP基板に載せてモジュール化したものが2種類ある。

リアルタイムクロック(RTC)モジュール RTC-8564NB 
RTC-4543SA使用32kHz出力シリアルRTC基板モジュール RTC-4543SA

大きな違いは、RTC-8564NBがI2C、RTC-4543SAは独自シリアルI/Fでマイコンと通信する点。

RTC-4543SAはまだ実験してないのでメモ:
■[電子工作][プログラミング]RTC-4543(RTC-4543SA/SB)を使う(後編) (99円のへたれ日記!) 
シリアル出力リアルタイムクロック(RTC-4543SA)を使ってみた (明日から本気だす(´・ω・`))

RTC-8564NBはArduinoで実験してみた。
2012RTC

RTCモジュール上の端子にハンダを盛ってSDA,SCL信号はモジュール内でプルアップする。
スケッチについてはエレキジャックの記事を参照した。
リアルタイムクロックの最近のブログ記事 (エレキジャック・フィジカルコンピューティング)
RTC-8564NBモジュール(1)
RTC-8564NBモジュール(2)

Arduino1.0.2では以下のソースを一部修正。
ardsens090010.txt

Wire.send()はWire.write()に、Wire.receive()はWire.read()に書き換えが必要。
実行するとシリアルに時刻が出力される。そのままでは値がおかしいので
t213000[enter]
d121113[enter]
と入力すれば 2012年11月13日 21時30分00秒と設定される。

ところで、Arduino UNOではSCL,SDA端子がAnalog A5,A4の端子と一緒なので同時には使えない(@maris_HYさんありがとうございました)。
[SCL=A5,SDA=A4]
Arduino LeonardoではAREF端子の上のほうにSDA,SCL端子が増えている。Arduino UNO R3では互換のためにSDA,SCL端子はあるけどA4,A5の端子がそのまま引き出してあるだけ。ということでアナログ6ポートと同時に使うためにはLeonardoが必要。
が、手持ちのバニラシールドはこの増設部分が半分ずれてるのよね。ということでR3対応のものを取り寄せ中。
Arduino用バニラシールド基板ver.2(白) (スイッチサイエンス) 

Arduino IDE1.0.2 1.0.1との違い調査

Arduino IDE 1.0.2がリリースされた。
Download the Arduino Software

 リリースノートが和訳されている。
2012/11/5 Arduino-1.0.2リリース

 Arduino IDE 1.0.1でいじって気付いたLeonardo周りについて変化がないか確認した。

(1)USB HIDキーボードの送出可能コード範囲
ソースのHID.cppから該当箇所を確認。送出可能なコードの指定部分は0x65(101)で以前と変わらない。

(2)割込み
Arduino Leonardoの外部割り込み番号とピンの割り当てが異なる

これも変わらなかった。
PIN2かPIN3にスイッチを付けてGNDに落とし、割込みがかかるか調べる。

Arduino UNO R3:
INTNUM=0,INTPIN=2でPIN2○ PIN3×
INTNUM=0,INTPIN=3でPIN2○ PIN3△ (保証外動作)
INTNUM=1,INTPIN=2でPIN2× PIN3○ (保証外動作)
INTNUM=1,INTPIN=3でPIN2× PIN3○ 

Arduino Leonardo:
INTNUM=0,INTPIN=2でPIN2× PIN3△
INTNUM=0,INTPIN=3でPIN2× PIN3○
INTNUM=1,INTPIN=2でPIN2○ PIN3×
INTNUM=1,INTPIN=3でPIN2△ PIN3△ (不安定)

今後の実験はArduino IDE 1.0.2に移行する。

LM35DZを複数つないだ時の問題 お詫びとハードでの解決

前回の続き。
温度センサLM35DZを複数Arduinoに繋いだ時のトラブル

こちらの方がADCの動作を考慮した読み捨ての回数を記事にされていた。
Arduino:温度センサー Processing + Firmata LM61BIZとLM35DZとDS18B20のメモ[マイコン風雲録]

ログを分析しようとしててあっと気付いた。
 for(int i=0;i<=NUM_LM35;i++) {
 だめだ……チャネルは6個しかないのに7個目読んでる……

 というわけでADC読み取りの最後が順番によらず跳ね上がるのは私のプログラムが原因でした。未定義のチャネル読んでる。申し訳ありません。

 ところで、チャネル読み込みの初回が順序に関わらず少し上がる現象は間違いなく起こっている。これを改善できるかどうか、以前も参考にした
■AVR(Arduino)にLM35温度センサをつなげた場合に正しくA/D変換出来ないトラブル(2012年2月15日)[SIESTA HOMEPAGE]
を参考に、LM35DZの出力に10KΩをぶら下げた。テスタでちゃんと信号-GND間が10KΩ程度か確認。
2012_10Kohm

 これで一晩ランニング。
比較のため前回とまったく同じヘボいコード(ADC0〜6まで読んでしまうもの)で実施。
この結果、最初に読んだチャネルが跳ね上がるという現象はなくなった。

□前回の生ログ(Arduino Leonardo、3V3リファレンス版) ※間違ったADCの7番目は除去
60702 72 73 74 74 73 74
121405 72 73 74 73 73 74
182107 72 73 73 73 73 73
242809 72 73 74 73 73 73
303512 72 73 73 73 73 73
364215 72 73 73 73 73 73
424918 72 73 73 72 73 73
485620 105 73 73 73 72 73
546323 71 73 73 73 72 73
607026 128 73 73 73 73 73
667727 72 73 73 73 73 74
728430 72 73 73 73 72 73
789133 72 73 73 73 72 73
849836 71 72 73 72 73 73

□今回の生ログ(Arduino Uno R3、1V1リファレンス版)
1759184 135 127 136 122 124 125 
1760387 135 128 136 122 124 124 
1761589 134 128 136 121 125 124 
1762791 135 127 136 122 125 124 
1763994 135 127 136 121 124 124 
1765196 134 127 135 122 125 123 
1766398 134 128 136 121 124 124 
1767602 135 127 136 122 125 124 
1768804 135 128 136 122 124 124 
1770006 134 127 135 122 124 124 
1771209 135 128 136 122 124 124 
1772411 135 128 136 122 125 124 
1773614 134 127 136 122 125 124 
1774816 135 128 136 122 125 124 

 LM35DZ直結の時は最初のADC読み取りで跳ね上がる現象が見られたが、10KΩをぶら下げることによりなくなった。しかし、各センサの値にむらがあるように見える。ADC0とADC2が値が大きい。

・今後の調査方針
(1)温度センサを束ねて同じ条件に
(2)ログをしっかり取ってawkで分析
(3) マイコン風雲録さんのanalogReadEx()で確認
 
 うう、デジタル温度センサに逃げたくなった……

ソレノイド駆動メモ

ツイッターで今日話してたのをメモ。
 マイコンでサインペンを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アダプタでそんなに消費電力が大きくないものを制御しようと思ってたので、ちょっと実験してみないとわかんないなあ。 

BeagleBoard-xMにUbuntu12.04をインストール

しばらく放置していたBeagleboard-xMにUbuntu12.04LTSをインストールしてみた。
用意したのは4GB Class10のmicroSDカード。あと必要なのはHDMIケーブル(1920x1080のディスプレイに接続)、イーサネットケーブル、USBキーボード、5V2A程度のACアダプタ。
2012xM01

2012xM02
 
参考にしたのはこちら。というよりまったく同じ手順。
BeagleBoard-xMにUbuntu 12.04をインストールしてみる [beagleboard](とりあえずやってみる) 
BeagleBoardUbuntu

(1)イメージファイルを以下からダウンロード:
http://cdimage.ubuntu.com/releases/12.04/release/ubuntu-12.04-preinstalled-desktop-armhf+omap.img.gz

(2)空のmicroSDカードをMacOSXに接続し、アンマウント (あらかじめdfコマンドで調べSDカードがdisk2であることを確認)
$ sudo Diskutil unmountDisk disk2
Unmount of all volumes on disk2 was successful

(3)ddでまるっとコピー
$ sudo dd bs=4m if=ubuntu-12.04-preinstalled-desktop-armhf+omap.img of=/dev/disk2
482+1 records in
482+1 records out
2024800256 bytes transferred in 1035.518590 secs (1955349 bytes/sec)

こうして作成したmicroSDカードをBeagleBoard-xMに接続し、初回起動。以下のconfig画面が出るまで約8分かかった。
2012xM03
 この後もしばらく時間がかかる。設定が終わってもアイコンなど出てこないので、静かになったなーと思ったらいったんシャットダウンしてから再起動する。そうすれば画面左側にメニューなど出る。なおUSBマウスは後から接続しても認識する。
2012xM04

画面の解像度は1280x720だった。これはご家庭の液晶テレビにちょうどよいか?

2012xM05
 
Firefoxでyahoo!も見れる。dfで確認してみた。
Youtubeやニコニコ動画を見ようとsudo apt get install flashplugin-installerやってみたがflashそのものが見つからなくなっている。adobe.comにはtarで配布されてるものもあるけどあきらめた。

 最初の起動はBeagleboard-xM Rev.Bで行い、設定が済んだmicroSDカードをRev.Cボードに接続しても問題なく動作した。Rev.B、Rev.Cの両方に対応しているようだ。
 ちょっと反応が鈍いけど、ちゃんとUbuntuが動く。驚き。
記事検索
プロフィール

hardyboy

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