« [iPhone][AVR]iPhoneにAVRマイコン(Atmel ATtiny2313)をつないでみた | Main | [AVR]ATmega644P版ArduinoであるところのSanguinoのキットが到着したので作ってみた »

2008.10.25

[iPhone][AVR]iPhoneにAVRマイコン(Atmel ATtiny45)をつなぎ温度計測してみた

ATtiny2313にはADCが無いから、LM35DZLM60のようなアナログセンサーがつなげないじゃん、ということで、ADCはもとより、温度センサーまで内蔵かつ8ピンDIPで小さいATtiny45を使ってみた。

Iphoneavr04

↑写真は、Dock Connectorの中にどう納めようかと置いてみただけ。

ちなみに、SOIC版のATtiny2313であるATtiny2313-20SUは、国内ではマルツでしか手に入らないみたいだけど、店頭には置いておらず通販専用商品とのことなのでご注意あれ。

ATtiny45はATtiny45で、ADCや、温度センサーはあっても、USARTが無くてiPhoneとシリアル通信ができないじゃん、と思いきや、ソフトウェアで実装する方法があるとのこと。

ICのblog: Tiny26Lでシリアル通信

オプティマイズ: 最新AVRチップ(ATtiny45等のソフトウェアUARTサンプルコード)

また、BASCOM-AVRにも任意のUSART/UARTポート以外のGPIOをシリアルポートとして機能させることができる、ソフトウェアUART機能があるということを知った。以下のソースを見ての通りすげー簡単だ。

というわけで、ソフトウェアUARTが簡単に書けるBASCOM-AVRで書いてみた。

動作は、ATtiny45内蔵の温度センサーから値を取得し、それをソフトウェアUARTポートとして設定したPB1から「9600bps/8/1/NONE」で繰り返し送信するというもの。

BASCOM-AVRのForumにあったスレッド「ATTiny44 ADC reference selection」を参考にさせてもらった。

$regfile = "attiny45.dat"
$crystal = 8000000

$hwstack = 24
$swstack = 16
$framesize = 32

Dim Lsb_adc As Byte                                         'ADC least significant byte
Dim Msb_adc As Byte                                         'ADC most significant byte
Dim Adc_value As Word At Lsb_adc Overlay
Dim I As Byte
Dim Summary As Integer
Dim Offset As Word

Offset = 281

Config Portb.3 = Output                                     'LED

Open "COMB.1:9600,8,N,1" For Output As #1                   'PB1 used for serial output
Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1

'ADC Ref 1.1V / Use Temperature Sensor
Admux = &B10001111

Start Adc

Do
   Summary = 0

   For I = 1 To 100

      Set Adcsra.adsc                                       'Start conversion

      While Adcsra.adsc = 1
         'Wait conversion to complete
      Wend

      Lsb_adc = Adcl                                        'Get least significant byte
      Msb_adc = Adch

      Summary = Summary + Adc_value

   Next I

   Summary = Summary / 100                                  'Average
   Summary = Summary - Offset

   Print #1 , Summary

   Set Portb.3                                              'LED Flash
   Waitms 200
   Reset Portb.3
   Waitms 500
Loop

End

Iphoneavr05

しかし、取れる値がどうも変だ。ADCから来る最下位が1度に相当するとのことでおおざっぱだし。

すzのAVR研究: 内部温度計のキャリブレーション

こちらのページでの検証によると、ATtiny45等の内蔵温度センサーならびに内蔵基準電圧はアテにならないそうだ。確かに変だ。5Vで動作させているときと、iPhoneの3.3Vで動作させているときで値が全然違うし。8MHz動作と1MHz動作でも全然違う。何だかよく分からない。

よく分かってないので、プログラムや自分の操作が変かもしれない(どこか変だったら教えてください)。

しかし、まがりなりにもATtiny45をiPhoneのDock Connectorからの電源供給で動作させ、内蔵の温度センサーから温度を取得して、iPhoneに送信、iPhoneで受信して表示というところまではできた。勉強になった。

精度的に使いものにならないので、基準電圧を外部から供給し、温度センサーを外部につないでどうなるか、それがDock Connectorに内蔵できそうかという模索に逆戻りだね。

|

« [iPhone][AVR]iPhoneにAVRマイコン(Atmel ATtiny2313)をつないでみた | Main | [AVR]ATmega644P版ArduinoであるところのSanguinoのキットが到着したので作ってみた »