まごころせいじつ堂

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

2012年12月

ArduinoIDE1.0.3 USB-HID特に変わらず

やっと今日Arduino1.0.3のソースがダウンロードできたので、USB0-HIDのキーボード部分をチェックした。

// Keyboard
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)	// 47
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x85, 0x02,                    //   REPORT_ID (2)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
   
	0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    
	0x95, 0x08,                    //   REPORT_COUNT (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
    
	0x95, 0x06,                    //   REPORT_COUNT (6)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x65,                    //   LOGICAL_MAXIMUM (101)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    
	0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0,                          // END_COLLECTION

そんなわけで LOGICAL_MAXIMUM(101) 、USAGE_MAXIMUM(101) →0x65 で変わらず。
なんで毎回制限してんだろ?日本語キーボードなど国際化無視?
 

FONTXメモ

マイコンで漢字表示をしたいと思い、漢字ROMのフォントはないだろうかと色々探したが見つからなかった。古い漢字ROMを搭載したパソコンから吸い出すという手もあるが。

 グラフィックスを扱えるLCDや安いサーマルプリンタで使えそうなDOS/V時代のFONTXについてメモ。

FONTXの使いかた 

グラフィックLCDモジュール 日本語フォント編 

IPAフォントを元としたLXで使える32/24/16ドットフォント

 漢字フォントを内蔵している機器(VFDやサーマルプリンタ)はJISまたはShiftJISで扱っていることが多いようだ。

マイコンとPS/2キーボードを繋ぐあれこれ

PS/2やADB(Appleの古いキーボードI/F)をUSBに変換する。AVR用。
https://github.com/tmk/tmk_keyboard 

Adafruitの新製品。
NEW PRODUCT! E1115 PS/2 Keyboard to TTL Serial Converter 

うう、色々先を越された。

A2 Thermal Printer メモ

低価格の58mmサーマルプリンタ。レシート用紙に印刷する。
ESC/POS Thermal Printer and Mono (or .Net)

Serial Thermal Printer

Adafruitから購入できる。
Mini Thermal Receipt Printer -

Sparkfunにもありますね。
Thermal Printer COM-10438

以下は説明書(pdf)。ところどころ誤記があったので注意。
取扱説明書(Adafruit)

取扱説明書(Sparkfun)
 
 
 実際に使ってみたところ。5Vだとこのくらいの速度。9Vだともっと速い。
ただし、DTS/RTSによるハードフローがないのでグラフィックスの出力が私にはうまくできなかった。XON/XOFFによるソフトフローはあるのだろうか?ということでしばらく放置中。
自在に動かせるようになればとてもおもしろそうなんだけど。

 

A/Dコンバータの勘違い(植木算)とLM35DZを使った場合の誤差

植木算 -Wikipedia

 Arduino(ATmega328や32U4)のADCはAREFで与えられた基準電圧を0〜1023の値で取得できる。何も考えずに分解能10bit、1024で割っていたが本当は1024-1だった。
※追記:なんか考えてたら分解能による限界のような気もしてきましたがいちおうこのままで出しておきます
 
やばい。とある装置は今日持っていったばっかりで手元にないので検算してみる。ツッコミ大歓迎。

※追記 2021.9.5
23.7 ADC Conversion
Result "0x000 represents analog ground, and 0x3FF represents the selected reference voltage minus one"
10年誤解してた。÷1024でいいんだ。ォァー


AREFが1.1V(INTERNAL)、3.3V(EXTERNAL)、5V(EXTERNAL)の場合の1ステップあたりの電圧を計算した。有効数字は6桁で計算。

1.1V ÷ 1024 = 1.07422mV (誤り) ×1000すると1.07422V
1.1V ÷ 1023 = 1.07527mV (正しい) ×1000すると1.07527V
※1023が示す電圧の範囲は、1.07527V〜1.10000V

1.1Vで 1.05mVの差

3.3V ÷ 1024 = 3.22266mV (誤り) ×1000すると3.22266V
3.3V ÷ 1023 = 3.22581mV (正しい) ×1000すると3.22581V
※1023が示す電圧の範囲は、3.22581V〜3.30000V

3.3Vで 3.15mVの差

5.0V ÷ 1024 = 4.88281mV (誤り) ×1000すると4.88281V
5.0V ÷ 1023 = 5.00489mV (正しい) ×1000すると4.88759V
※1023が示す電圧の範囲は、4.88759V〜5.00000V

5.0Vで 4.78mVの差

今回はAREFで3.3Vを使用、LM35DZは1℃あたり10mV。
10〜50℃あたりで使用することを考えると、100mVから500mVを観測することになる。
値が大きいほど誤差は大きくなるので、500mVで考える。

誤ったプログラム 500mV ÷ 3.22266mV = 155.15.. 表示値は156 (切り上げだから)
正しいプログラム 500mV ÷ 3.22851mV = 154.87.. 表示値は155になるはず

 156(誤った値) × 3.22581mV(正しい1ステップあたりの電圧) = 503.226mV
その差 3.226mV → 間違ったプログラムでは50℃付近で約0.3℃高く表示される。

で、いま使ってるセンサLM35DZの誤差は25℃付近で±1.5℃、Typ±0.6℃。グレードが低いのは承知の上で使っているので±2℃程度は気にしない。

ということで室温の範囲内なら問題ないでしょう。

LM35DZを複数繋いだ温度ロガーと誤差

温度センサLM35DZを複数個繋いだロガーやっとできた。

これまでの記事:
LM35DZを複数つないだ時の問題 お詫びとハードでの解決
温度センサLM35DZを複数Arduinoに繋いだ時のトラブル
LM35DZによる温度測定とanalogReference()

マイコン風雲録さんのanalogReadEx()関数で解決しました。ありがとうございました。
Arduino:温度センサー Processing + Firmata LM61BIZとLM35DZとDS18B20のメモ[マイコン風雲録]

Arduino UNOのA0〜A5ポートにLM35DZを接続。信号線は10KΩでGNDに。

 ログ時刻はRTCをつないで頑張るつもりだったが、Arduino UNOではI2Cの端子がアナログポートとかぶるのであきらめた。Arduino Microだとアナログポートはたくさんあるし次はこれ使おう。
で、肝心のタイムスタンプはTeraTermに任せた。ログを取るときに□タイムスタンプのチェックボックス入れるか、teraterm.ini内のLogTimestamp=onにする。
参考:
TeraTermログの行毎に自動的にタイムスタンプを付与する

※追記:@maris_HYさんにSPI接続のRTC教えてもらいました。
DS3234搭載のリアルタイムクロック・モジュール

以下を追加・修正した。
・Setup()内で5秒の待ち。シリアルモニタ(TeraTerm等)を立ち上げる時間を待つため
・別のセンサを付けることを考慮して、A0〜A5ポートの入れ替えを最初のほうで定義した。
・温度測定の結果は先頭に連番を付けるようにした
・Arduinoが生きているかどうか分かるようLEDを点滅させる処理を追加
・LM35DZセンサの誤差を補正できるようにした(Adj[]で定義)

さて、これで安定して測定できるようになったが、温度センサを一箇所にまとめても数℃の誤差が出る。これはセンサについてまわるので素子のばらつきと思われる(安いグレードだし)が、ADCの基準電圧が内部リファレンス1.1Vと外部リファレンス3.3Vではどう違うだろうか。

ADCの基準電圧1.1Vと3.3Vについて200回測定し、平均を求めた。
$ gawk -f 20121130.awk lm35dz1v1.txt
AVG1= 188.02
AVG2= 190.65
AVG3= 193.33
AVG4= 191.77
AVG5= 192.27
AVG6= 194.555

1.1V÷1024で分解能は1.07mV
6.54ステップのゆらぎ 約7.00mV

$ gawk -f 20121130.awk lm35dz3v3.txt
AVG1= 60.2977
AVG2= 61.1395
AVG3= 61.4512
AVG4= 61.214
AVG5= 60.9488
AVG6= 61.8791

3.3V÷1024で分解能は3.22mV
1.58ステップのゆらぎ 約5.10mV

 ということで、ATmega328の内部1.1Vよりも外部の定電圧レギュレータによる3.3Vの方がより正確。外部5Vも使えるが、USBから給電して使う場合はそちらに影響されるので3.3V参照のほうがよさそう。
 または、基準1.1Vの方がセンサの誤差に対してより敏感なのかも。ちょっとこの辺はLM35DZの良いグレードの品で比較しないといけないんだろうけど資本切れです。


プログラムはこちら。
※analogReference()の箇所がINTERNALになってますが3.3V参照ではEXTERNALでした。ただしINTERNAL設定でもAREFにかかっている電圧が優先になるようです。

https://gist.github.com/4176111


20121201terrmal

一晩測ってExcelに持っていった。おおよそ期待通り。上がったりしている箇所はストーブを使った時間。
記事検索
プロフィール

hardyboy

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