まごころせいじつ堂

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

2012年11月

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と入力した時は表示されるフォント(と言っていいのか)が若干異なる。

 ということでえらい簡単に動作確認できた。

メモ:秋月電子で買える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()で確認
 
 うう、デジタル温度センサに逃げたくなった……
記事検索
プロフィール

hardyboy

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