まごころせいじつ堂

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

電工:ファストン端子

平べったいACプラグの先みたいなのに着脱するのをファストン端子という。
普通はこんなコードコネクタボディで接続するけど、省スペースを狙ってサイズの合うメス端子を探してやってみた。
ベター小型コードコネクタボディ (MonotaRO)

312ファストン端子というのが、ACプラグとうまく接続できそう。
312型ファストン端子 (MonotaRO)
こちらの平型端子は小さかった。
平型端子 (MonoTARO)

2013faston

 で、ケーブル(心線が1.25mm2径のより線)を圧着してみたのだがスッポ抜けた。説明をよく見ると適合電線3.0mm2〜と書いてある。失敗。

 あと、圧着はより線の場合よらないでするらしい。

圧着工具 (Wikipedia) 

電工関係は独学だときびしいなあ。危ないし。

lcd.write(0)でerror: call of overloaded 'write(int)' is ambiguousと言われる

キャラクタ液晶を扱うライブラリLiquidCrystalには、ユーザ定義文字を設定するcreateChar(num,data)という関数がある。これを試したらなぜかエラーになった。

createChar(num,data) Arduino日本語リファレンス
createChar() (原文)

Arduino1.0.3で以下のメッセージ。(MacOSX) Windowsでも同様

sketch_jan04b.ino: In function 'void setup()':
sketch_jan04b:18: error: call of overloaded 'write(int)' is ambiguous
/Applications/Arduino1.0.3.app/Contents/Resources/Java/libraries/LiquidCrystal/LiquidCrystal.h:82: note: candidates are: virtual size_t LiquidCrystal::write(uint8_t)
/Applications/Arduino1.0.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:49: note:                 size_t Print::write(const char*)

??サンプルがそのまま動かないのナンデ? 0x00に書き換えても同様。

調べたら定数0を指定した時だけの問題。lcdに限らない。
call of overloaded 'write(int) is ambigous?

lcd.write(0); を lcd.write((byte)0);にして解決。1〜の定数を指定した時はエラーが発生しない。
もちろん、変数で指定した場合は問題ない。
サンプルのコピペでちょっとハマッてしまった。
 2013smile

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に持っていった。おおよそ期待通り。上がったりしている箇所はストーブを使った時間。

Arduino MicroとLED付き押ボタンスイッチ

秋月電子のLED付き押ボタンスイッチが以前から気になっていた。今回入手してこれまた最近発売されたArduino Microと組み合わせてブレッドボード上で組み立ててみた。

LED付き押しボタンスイッチ(白・正方形・赤色LED)ST12-401FCG (秋月電子)

Arduino Micro 5V 16MHz (ATmega32u4 - ピンヘッダ付き) (スイッチサイエンス)
まだスイッチサイエンスが扱う前だったのでAdafruitから買った。Arduino Leonardoの時みたいに品薄になるんじゃないかなあと思ってたらそんなことはなかった。



 Arduino MicroはATmega32U4を使ったブレッドボード上で使える小さなArduinoで、Arduino Leonardo相当の機能。Arduino IDE 1.0.2から使える。([ツール]→[マイコンボード]で指定) 通電するとmicroUSBコネクタ下にある青LEDが光る。

2012micro1

 Arduino IDE 1.0.2では、Leonardoでtone()を使った時の問題が修正されたらしいので圧電ブザーも繋いでみた。これで電子ゲームっぽくなる。
 Arduino Microのピンアウトはこちらを参照。
Arduino Micro

 電源はArduino MicroのUSB経由でもらっている。
タクトスイッチ部分はA0,A1,A2,A3を使用。analog入力で読んでいる。A0〜A3はINPUT_PULLUPでプルアップ指定し、スイッチはONでGNDに接続。
LED部分はタクトスイッチとは独立して制御できる。12(PWM),11(PWM),10(PWM),9(PWM)で明るさを変化させている。アノード(+)側を端子に接続し、カソード(-)は330Ωの抵抗を通してGNDへ。
圧電ブザーは4(PWM)へ、隣のSCL,SDA端子をまたいでGNDに接続。
 2012micro2

 LED付き押ボタンスイッチは普通のブレッドボードに5個まで並べて挿せるようだ。LEDの(+)、(-)端子は細くて接触不良を起こしやすいので、挿す前に少し広げておく。
 ブレッドボード2枚で作れた。
2012micro3

確認用のソースは以下。動作開始時にブザーが鳴り、LEDが点滅する。ボタンを押すとその場所のLEDが消え、ブザーが鳴る。

☆toneのサンプルスケッチではpatches.hをincludeしているのだが、単体のソースで動くようにコピペして貼り付けました。

気になる点:いちばん左端のLED (A0ポート)が消灯する割合が高いような。
あと、以下の行間違い(というより当初の意図どおりではなかった)。点滅の具合が変わります。
int t=random(0,16)*16;
アナログポートA0〜はデジタルポートとしても使えるはずなのだが、上手くいかなかったのでアナログ入力で誤魔化しています(100以下でボタンが押されていると判定)。私の勘違いで上手く使えなかったのかもしれないし、なんかあるのかもしれない。

// LED tactswitch+Arduino Micro
// 20121124 K.Takesita
//

// copy from pitches.h
/*************************************************
 * Public Constants
 *************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978


const int SW0 = A0; //A0
const int SW1 = A1; //A1
const int SW2 = A2; //A2
const int SW3 = A3; //A3

const int LED0 = 12;
const int LED1 = 11;
const int LED2 = 10;
const int LED3 = 9;

int button[4] = { SW0,SW1,SW2,SW3 };
int light[4] = { LED0,LED1,LED2,LED3 };
int bright[4] = { 128,128,128,128 } ;
void setup() {
  pinMode(SW0,INPUT_PULLUP);
  pinMode(SW1,INPUT_PULLUP);
  pinMode(SW2,INPUT_PULLUP);
  pinMode(SW3,INPUT_PULLUP);
  
  pinMode(LED0,OUTPUT);
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  
  tone(4,NOTE_C4,100);
}
void loop(){

  for(int i=0; i<4; i++) {
    if (analogRead(button[i])<100) {
      tone(4,NOTE_A4,10);
      analogWrite(light[i],0);
    } else {
      int t=random(0,16*16);
      analogWrite(light[i],t);
    }
  }

  delay(100);
}


シリアル接続7セグメント4桁LEDとUSB-TTLシリアルコンバータケーブル

 Sparkfunの7-Segment Serial Displayというのを使ってみた。最近改版されたらしい。

7-Segment Serial Display - Blue(Sparkfun)
※Sparkfunの写真は上下逆。

スイッチサイエンスから購入できる。
シリアル接続7セグメント4桁LED(青) (スイッチサイエンス)

シリアル、I2C、SPIでマイコンと接続、0〜Fの表示だけでなく任意のセグメントも表示可能で輝度も調整できるらしい。ATmega328で制御していて、Arduinoブートローダもあるので単独でも動作できるようだ。
2012led1
2012led2

 が、いきなりマイコンに接続して使うのもなんなのでUSB-TTLシリアルコンバータケーブルというのでPCから直接いじってみた。ストロベリーリナックスからUSBケーブルの様なシリアル変換器が出ている。5V品と3.3V品がある。

USB-TTLシリアルコンバータ(5V) (ストロベリーリナックス)
FTDI USB TTL Serial Cables (FTDIchip)

2012led4

黒 ー GND
茶 ← *CTS
赤 → Vcc電源出力 Max75mA
橙 → TXD
黄 ← RXD
緑 → *RTS

MacOSXだと/dev/tty.usbserial-なんとか という風に見える。

 では7セグLEDの実験。端子の取り付けはちょっと悩んだが、上にある10個はLEDの見える側にメス、右側のI2Cと電源はブレッドボードに載せられるようオスのピンヘッダを半田付け。I2Cと電源は左側にも配置してある。
 2012led3
 USB-TTLシリアルコンバータケーブルからの電力供給は弱そうで保護もないので、5V電源は別に取っている。ここではUSBミニコネクタ経由で5Vを給電。
7セグLEDの+、ー端子に電源接続、上の10個ある端子の右端にUSB-TTLシリアルコンバータの4番ピン(橙)、USB-TTLシリアルコンバータの1番ピン(黒)をGNDに接続。これだけ。
電源を接続しただけでは何も表示されない。Arduino IDEのシリアルモニタ経由で
cdef
と入力すると写真の様に表示される。
2012led5

キー入力順に左から右に出力され、4文字目を表示した次は1文字目の位置から出力される。cdefと入力した時とCDEFと入力した時は表示されるフォント(と言っていいのか)が若干異なる。

 ということでえらい簡単に動作確認できた。
記事検索
プロフィール

hardyboy

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