タグ別アーカイブ: arduino

温度センサーIC LM19を使う

ここでは温度センサーIC LM19(National Semiconductor)を使ってRaspberry piで温度監視を行う事例を紹介します。

LM19仕様

  • パッケージ:TO-92
  • 動作電源電圧:2.4V~5.5V
  • 使用温度範囲:-30℃~+130℃
  • 精度:±2.5(@30℃)

接続例

スクリーンショット 2014-01-21 4.24.02
LM19からの出力はアナログ電圧のためRaspberry piでは直接扱うことができません。そこで一旦I2Cインターフェイス基盤でアナログ電圧を読み取り、その結果をI2Cをとおして取得することにします。
ICのデータシートを参考に出力には抵抗とコンデンサをつないでいます。

Python script


import i2cinterface99
ii = i2cinterface99.i2cinterface99()
state,value = ii.analogRead(0) #read A0 Pin 
if state == True:
 volt = value / 1023.0*3.3 #3.3V電圧でインターフェイス基盤を動作している場合のAD変換式
 temp = (1.8641 - volt)/0.0117 #ボルトから温度への変換の式
 print "%d deg/C" %(temp) #摂氏表示
else:
 print "I2C error"

温度への変換式はICのデータシートに記載されている−10℃〜65℃における推奨式を元にしています。
上記スクリプトをsudo python ファイル名.py で実行します。
温度センサーの値を読み取った結果がコンソールに表示されるはずです。
I2Cインターフェイス基盤にLCDを接続していれば、LCD上に温度の値が表示されるようにしてもよいでしょう。

今回行った実験では、LM19の測定値が温度湿度センサーDHT11による測定値とほぼ同じであることが確認できました。

CIMG2381

汎用AVR ライター基板

CIMG2381
8ピンのATtinyから28ピンATmega,40ピンまで対応するAVR ISP mkIIと接続可能な汎用のボードを紹介します.
AVRライターアダプター(Think About PCB)
リンク先のプリント基板の色は緑ですが、当方が購入した際は写真の様な赤いレジストでした。

この基板を使えばAtmel studioはもちろん、Arduino IDEを使ってのプログラムの書き込みも可能です.ゼロプレッシャーソケットを使うことでマイコンの挿抜も楽に行えます.同じプログラムを持ったマイコンを複製する際にとても便利ですね。
写真では28ピン対応にしてあります.ATtinyとATmegaを使うのであればこれでOKですね。
ターゲットのマイコンのモデルを変更する場合にはジャンパー線を繋ぎ変えます.単純なボードですが様々な種類のAVRに対応できるところがいいですね。

スクリーンショット 2013-12-15 6.55.18

MacでAVR 開発環境を構築する

AVR マイコンATtiny,ATmegaをプログラミングするのに一般的にはAtmel studioを使います。Atmel studioはWindows用の開発環境のためMacを使っては別の環境を考える必要が有ります.

ここではArduino IDEを使っての開発環境を提案します.書き込み機にはAVR ISP mkIIを使います.ATmegaまたはATtinyがターゲットになります.マイコンの書き込みのための信号線(MISO,MOSI,SCK,RESET,Vcc,GND)を引き出すのはブレッドボードでもユニバーサル基板を使ってもどちらでも結構です.28ピンDIPパッケージATmegaについてはAVR LCD Boardを使うのも良いかもしれませんね。AVR ISP mkIIのソケットに対応したピン配のヘッダピンを載せる事が可能です.
CIMG2359

xcodeを使ってC言語でプログラミングする方法もありますが、入出力のポート設定とかビット操作とか正直面倒なところが有ります.そこでプログラミングのハードルがぐっと下がるArduino言語を使ってプログラミングが出来るように環境を構築します.
Arduinoと言ってもその中身はAVR ATmegaなわけでATmegaだけでなくATtinyシリーズのプログラミングも出来てしまうのです。Arduino用に公開されているスケッチを参考にして自分だけのプログラムを作るのも簡単です。とことん小型化するのならATtiny13を、ポートの数はもう少し欲しいなと思えばATtiny2313を、ある程度機能を充実したいのならATmega328と言った具合に自分の使いたいチップを選ぶ事が可能です.

それではMacでAVRをArduinoでプログラミングする環境を構築しましょう。まずはMacからプログラムを書き込むためのArdudoをインストールします.Terminalを起動して下記コマンドを実行してください。MacPortsはすでにインストール済みという前提です。

MacBook:~ user$ sudo port install git-core libusb avrdude

無事インストールが出来ていれば 
MacBook:~ user$ which avrdude
のコマンドを実行すると
/opt/local/bin/avrdude
と返ってくるはずです。

これでUSBに接続するAVR ISP mkIIが使えるようになります.
OS Xの以前のバージョンSnow Leopard のころはUSBにISP mkIIを接続するだけで他のドライバーを必要とせず使えていたのですが、最新のOS XバージョンであるMavericks ではavrdudeが必要となるようです.

次にArduino IDEをインストールします.Arduino公式サイトからダウンロード&インストールします.ここで注意が必要なのが最新バージョンではなく0.2xのバージョンを使う事です。ArduinoさいとのDownloadページから行くと最新バージョンのダウンロードを紹介されます(2013.12.15時点での最新バージョンは1.0.5です)。ページの下の方に行くとちょっと分かりにくいのですが、以前のバージョンのダウンロードへのリンクが見つかります.
Previous IDE Versions
そこで002xのバージョンをダウンロードします.当方は0022で動作確認しました。

最新バージョンと旧バージョンは同じMacに上書きされませんので、必要に応じてバージョンの使い分けも可能です。
旧バージョンを立ち上げるたびに、新しいバージョンへのアップデートを促されますがそれは無視します。
スクリーンショット 2013-12-15 6.54.09
Arduinoのターゲット設定ファイルを確認します。これはArduino UNOやLeonardoといったボードごとまたはATmega328やATtiny2313といったチップごとの固有の設定を記述しています.動作クロック、プログラムの最大サイズ、チップのフューズビットの設定などが書かれています.実際に接続するターゲットデバイスまたはチップとこの設定が異なるとうまく書き込むことができません.

設定ファイルは /Users//Documents/Arduino の中のatmega,atmega64,attinyのそれぞれの中にboards.txtがありそこに記述されています。ターゲットがATmega328だとしたら、atmegaフォルダ内のboards.txtを開くと
avr328p.name= ATmega328P / Int.8MHz
から始まる設定が見つかるはずです.もし”#”でコメントアウトされていたら”#”を削除して有効にしてください。逆に使わない設定はコメントアウトする事でIDEで表示されなくする事も出来ます。
スクリーンショット 2013-12-15 6.55.18
ここで示される”ATmega328P / Int.8MHz”がArduinoIDEのTools>Boardで表示される名前になります.具体的な設定はそれ以降に書かれます.各項目は次のようになります.

  • vr168p.upload.maximum_size=16384
  • 書き込めるプログラムの上限サイズになります.チップごとに決まっています.

  • avr168p.bootloader.low_fuses=0xe2
  • フューズビットを書き換える事でチップの動作を細かく設定します.チップごとに内容が異なりますので詳しくはターゲットとするチップのリファレンスを参照してください.

  • avr168p.bootloader.high_fuses=0xdd
  • フューズビットを書き換える事でチップの動作を細かく設定します.チップごとに内容が異なりますので詳しくはターゲットとするチップのリファレンスを参照してください.

  • avr168p.bootloader.extended_fuses=0×07
  • フューズビットを書き換える事でチップの動作を細かく設定します.チップごとに内容が異なりますので詳しくはターゲットとするチップのリファレンスを参照してください.

  • avr168p.bootloader.path=dummy
  • これは変更する事は無いでしょう

  • avr168p.bootloader.file=dummy.hex
  • これは変更する事は無いでしょう

  • avr168p.bootloader.unlock_bits=0x3F
  • これは変更する事は無いでしょう

  • avr168p.bootloader.lock_bits=0x3F
  • これは変更する事は無いでしょう

  • avr168p.build.mcu=atmega168
  • これは変更する事は無いでしょう

  • avr168p.build.f_cpu=8000000L
  • 動作クロックを宣言しています。実際にチップが動いているクロック速度とここでの宣言が異なっているとDelay関数などの時間制御でずれが生じます。

  • avr168p.build.core=arduino:arduino
  • これは変更する事は無いでしょう

  • avr168p.build.variant=atmega_int
  • これは変更する事は無いでしょう

ターゲットがATtinyシリーズの場合も同様にattinyフォルダ内のboards.txtファイルの中で対象とするチップ設定が有効になっているか確認します.

これでAVRマイコンへArduino言語でプログラミングする環境は出来上がりです.Arduino IDEを使ってプログラミングし、チップに書き込む際はTools>Boardからターゲットのチップを選択、Uploadボタンを押します.プログラムに間違えが無く、ISPおよびチップとの接続が問題なければ無事書き込めるはずです.
書き込みエラーになる原因の一つにチップ側への給電を忘れている事が有ります.ISP mkIIへはUSB経由で給電されます。ターゲットのチップは別の電源で給電する必要が有ります。このときの電圧はUSB電圧と同じでなくても構いません。ターゲットを動かすことを想定した電圧(例えば3.3V)でも構いません.チップの動作電圧の範囲で給電しましょう。

ここではMacからAVR ISP mkIIを介してAVRチップへArduino IDEでプログラミングする手法とその環境に付いて説明しましたが、同様のことはWindowsでも可能です。Atmel studioは難しいな、ArduinoIDEを使いたいと思った方はWindowsでも是非トライしてみてください.

IMG_1900

温度センサーADT7310をRaspberry piで使う

温度センサーADT7310をRaspberry piで使ってみます.
秋月電子で売られている同タイプの温度センサーにはI2Cインターフェイスに対応したADT7410もあります。
ここではSPIに対応したADT7310を使います。
IMG_1900

スクリーンショット 2013-12-14 5.55.12

事前にRaspberry piでSPIが使えるようシステムの設定を済ませておきます。
ここではPythonで制御します

import spidev
import time
spi_ch = 1
spi = spidev.SpiDev()
spi.open(0,spi_ch)
spi.max_speed_hz=(100000)   #クロック周波数を設定
spi.xfer2([0x08,0x80])  # センサーを16ビット精度に設定
time.sleep(0.5)
spi.xfer2([0x54]) #連続モードにセット
time.sleep(1) #ADT7410が測定データをAD変換するための時間を待つ
ret = spi.xfer2([0xff,0xff]) #ダミーの2バイトをセンサーに書き込んで2バイトの温度データを読み取る
temp = ret[0]<<8 | ret[1]
temp /= 128.0      #℃に変換
print "temparature:",temp
print "stop:",spi.xfer2([0x50]) #連続モードを停止
spi.close()

無事動作すればコンソールに現在温度を表示するはずです。定時観測に使う場合はこのプログラムに測定結果をメールなどで飛ばす処理を加えたスクリプトにしてcronで定期的に呼び出すようにすると良いでしょう。
ADT7310の制御コマンドは他にも有りますが、順番など含めて動作を確認できたのが上で紹介したコマンドの流れになります.使いこなしによっては他のコマンドも使えると思います。いろいろと試してみてください。

Raspberry piにはSPIで使えるCE信号がCE0とCE1の二つしか無いと言う事はSPIデバイスを二つ使えるという事ですね。液晶デバイスなどSPIシリアルを持ったモジュールなども有りますので使いこなしてみるのも面白いでしょうね。

今回はSPIシリアルを持った温度センサーを使いました。同タイプの温度センサーモジュールにはI2Cインターフェイスを持ったものが有ります.他にも気圧センサーなどもSPIとI2Cのどちらかを選択することができます.もっと多くのモジュールをつなげたい、ほかのセンサーも同時に使いたいと言った時にはI2C対応のモジュールを検討してみると良いでしょう。(それでもI2Cアドレスが競合してしまっては使えないので気をつけましょう)

Raspberry pi とArduinoとのI2C通信

ここではRaspberry pi をマスター、ArduinoをスレーブとしたI2C通信について紹介します.

接続を簡単にするためにArduino側は3.3V動作にします。Arduino Unoは5V動作なのでI2Cレベルコンバーターを間に挟むなどの対応が必要です.Google検索で得た情報では、コンバーターなしで接続して良いとかどうとか、海外のブログで見つけましたが確認はしていません.

そこで3.3Vで動作しながらArduino IDEからもプログラミング可能なI2Cインターフェイス基板を使います.これはATmega328が使われていて、標準のシールドは使えないものの中身的にはArduinoと同様だともいえます。

接続は下記の通り
AVR board <-> Raspberry pi
27 SDA <-> 3
28 SCL <-> 5
GND <-> GND
Vcc <-> 3.3V

レベルコンバーター不要、電源もRaspberry pi 側からもらうので結線も楽チンですね。

さてハードウェアの接続の次はソフトの準備です。

Arduino側のコード。Arduino IDEは0.22、PCはMac OS X 10.9で確認。
WireライブラリーはArduino 1.01でメソッドが変更になっていますのでご自分の環境に合わせて適宜修正して使ってください。
wire.read wire.write がそれぞれ wire.receive wire.send に変更


#include 

#define SLAVE_ADDRESS 0x04
int number = 0;
int state = 0;

void setup() {
    pinMode(0, OUTPUT);
    pinMode(1, OUTPUT);
    digitalWrite(0, LOW); // set the LED off
    digitalWrite(1, LOW); // set the LED off
    // initialize i2c as slave
    Wire.begin(SLAVE_ADDRESS);

    // define callbacks for i2c communication
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
}

void loop() {
    delay(100);
}

// callback for received data
void receiveData(int byteCount){

    while(Wire.available()) {
        number = Wire.receive();
        if (number == 1){

            if (state == 0){
                digitalWrite(1, HIGH); // set the LED on
                state = 1;
            }
            else{
                digitalWrite(1, LOW); // set the LED off
                state = 0;
            }
         }
     }
}

// callback for sending data
void sendData(){
    Wire.send(number);
}

I2Cから文字”1″を受け取ったらI2Cインターフェイス基板上のLEDをオンオフ切り替えを行うものです.受け取った文字列をそのままマスターに送り返す機能も持っています.
Raspberry piからsudo i2cdetect 1でArduinoが認識されているかどうか確認しましょう。
上のコードを使った場合、04にスレーブが検出できれば、上手く動作している事になります。

次にRaspberry Pi側のサンプルコードを紹介します.こちらはPythonで記述しています.



import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# This is the address we setup in the Arduino Program
address = 0x04

def writeNumber(value):
    bus.write_byte(address, value)
    # bus.write_byte_data(address, 0, value)
    return -1

def readNumber():
    number = bus.read_byte(address)
    # number = bus.read_byte_data(address, 1)
    return number

while True:
    var = input("Enter 1 - 9: ")
    if not var:
        continue

    writeNumber(var)
    print "RPI: Hi Arduino, I sent you ", var
    # sleep one second
    time.sleep(1)

    number = readNumber()
    print "Arduino: Hey RPI, I received a digit ", number
    print

スレーブ側に一文字送信して、スレーブ側から送り返してくる文字を端末に表示する簡単なスクリプトです.連続して文字を送りつけると、通信がこけることがあります.エラーでスクリプトが停止します.ここでは動作確認のためのスクリプトの紹介に止めますが、実際に運用する事を考えた場合にはI2C通信のところでtry,except文によるエラー処理を入れておくのは言うまでもありませんね。

I2Cインターフェイス基板には制御に便利なPython ライブラリーが付いています.LCDの表示制御、DIOのインアウト、アナログ入力、電子ブザー出力。Raspberry piを使って何かを制御して、それを簡単に表示する、小型機器の応用に便利です.
専用ライブラリーについて

CIMG2359

AVR LCDボードのコスト比較

AVR LCDボードとArduinoボードを使った場合とのコスト比較を行いました。

最小限の構成(クロックはマイコン内蔵発振回路を使用)ではAVR評価ボードは1280円となり大変安いことがわかります。これをベースに必要な機能を追加することになります。プログラムのアップロードにはISPが必要になります。ATMEL純正プログラマーのAVR ISPmkIIは実売3,000円であり安心して使うことが出来ます。一台あれば使いまわすことが出来便利です。もちろんArduinoIDEとの組み合わせでも使えます。複数のマイコンを使った制御を行う場合、何種類ものプロトタイプを行う場合にはコストをセーブすることが出来ます。

Arduinoボードを使った場合シリアルUSB変換、レギュレーター、外部発振子搭載などがされています。アプリケーションによっては必ずしも必要でない機能です。一台目の学習用としては大変重宝しますが、何台も作る場合には若干高めのコストが難点になります。LCDとの接続を簡単にしたシールドもありますが、モジュール単体に比べると高くなります。
LCD表示は利用する機会が多いでしょう。コネクター接続だけでマイコンとの接続が済んでしまうAVR LCD評価ボードを使うととても便利です。
評価ボードについて

2台目以降の学習用、プロトタイプ、製品への搭載などに使えます。

AVR開発環境

AVRマイコンを使うための開発環境について説明します。

ATMEL STUDIO

ATMEL社の純正の統合開発環境が無料で使うことが出来ます。WindowsPCにインストールします。C言語、アセンブラでプログラミングすることが出来ます。ターゲットの回路との接続は、ISP(In-System Programmer)を使う。例ではAtmel社純正のAVRISPmkIIを使っています。ISPとPCの接続はUSBケーブルで、ターゲットとの接続はISPの6芯ケーブルで行います。ATMEL STUDIOはプログラムのコンパイル、アップロードの他に、AVRマイコンチップのフューズビットの設定を行うことが出来ます。フューズビットを書き換えることで、クロックの分周を行うかどうか、外付け発振子の有無などを設定することが出来ます。

ATMEL社のウェブサイト

Arduino IDE

プログラミング及びプログラムのアップロードにArduino IDEを利用することが出来ます。Windows以外にMacOSX、Linuxでも開発を行うことが出来ます。ArduinoIDEは0.22でサポートしていることを確認しています。1.00では動作しませんでした。ArduinoIDEを使うことで、Arduino言語が使えること、豊富なライブラリーが利用できることから、プログラミングが容易になり、開発期間を短縮することも出来るでしょう。

ターゲットとの接続はISPを利用します。フューズビットの書き換えはATMEL STUDIOを利用するのが良いでしょう。マイコンの初期設定(フューズビット)のまま使うのであればATMEL STUDIOを使うことは無いでしょう。

IMG_3149

Arduino開発環境

Arduinoボードを使った開発環境の例を説明します。

ArduinoIDE


統合開発環境であるArduinoIDEはWindows,MacOSX,Linuxのそれぞれに対応。インストールも操作もいたって簡単です。
プログラミングはC言語ライクなArduino言語を使用。PCとArduinoボードとの接続はUSBケーブル一本の手軽さ。
スケッチをアップロードした後は、PCとの接続を切り離しArduinoボードだけで動作することが出来る。

Processing

Javaを単純化しグラフィック機能に特化した言語、Processingを使ってArduinoを動作することが出来る。Arduinoボードにはセンサーモジュールのデータの取り込み、アクチュエーターの駆動などを受け持つと良いだろう。取り込んだデータはArduinoとの通信によってPC側で取得し、視覚表現(ビジュアライゼーション)を行うのに非常に便利である。Open GLを使った3D表現も簡単に行うことができる。

予めArduinoボードにはStandard FirmataスケッチをArduinoIDEからアップロードしておく。その後PCではProcessing環境の上で、Arduinoボードを操作するプログラムを走らせることになる。PC(Processing)でArduinoを動作させるため、Arduinoボード単独での動作は出来ない。

cropped-topbanner1.jpg

Arduinoを使うことのメリット・デメリット

ここではArduinoとAVRマイコン単体で回路を組む場合を比較した時のメリットとデメリットについて紹介します。

メリット

・USBケーブルでPCに接続するだけで始められる(Unoボード)
・Arduino IDE
シンプルで分かりやすい統合開発環境はWindows,Mac,Linuxで使えます。
・Arduino言語
C言語に近いArduino言語はプログラミング初心者にも容易にプログラミング可能なように設計されている。I/Oピンの入出力設定もAVRに比較して簡単に理解できる
・開発に便利なライブラリーが揃っている
シリアル通信、LCDキャラクターディスプレイなどを取り扱うためのライブラリーが豊富にある。ライブラリーを使うことでプログラミングが容易になり、開発工数を削減することが出来る。
・Arduinoボード上に必要な物が実装されている
USBシリアル変換、電源レギュレーター、クロック用発振子が実装されている。
・シールドで機能の拡張が容易
機能を拡張するためのシールドが多く市販されている。LCD表示をする物、SDカードへのアクセスするためのもの、GPS,MP3プレイヤーなど。Arduinoボード上にシールドを積み重ねるようにして接続することができる。これらを上手く利用することで、ハンダ付けなどの作業が一切不要となる。

試作検討、学習用としては重宝します。

デメリット

・Arduinoボード形状が筐体設計の制約となる。
・AVRマイコンで構成した場合よりも若干のコストアップとなる。Unoボード 2520円(2012年6月、スイッチサイエンス価格)
・特定の機能を実現することを考えた場合USBシリアル変換など必ずしも必要となるわけではない機能が余計となってしまう。

製品として小ロット生産を考えた場合はこれらがデメリットとなるでしょう。

IMG_3157

Arduino ボード

Arduinoボード、互換ボードにはいくつかあります。ここでは代表的な2機種について紹介します。

Arduino Uno

ボードにはATmega328マイコンの他に、シリアル通信のためのUSBシリアル変換IC(FTDI)、3.3V電圧を取り出すレギュレータ、16MHz水晶発振器、ブレッドボード上の回路との接続に便利なピンヘッダソケットが実装されています。写真左上:USBコネクター、左下:AC-DCアダプターからの給電用DCジャック

UnoボードはUSBコネクターからの給電にも、DCジャックからの給電のどちらにも対応しています。

実売価格 2,520円

USBケーブルで UnoとPCをつなぎ、ArduinoIDEを立ち上げればすぐにプログラミングを始めることが出来ます。

ブレッドボードとの組み合わせ、回路検討過程。

Arduino Uno についてArduinoサイトの情報

Arduino Fio

ボードにはATmega328、リチウムポリマーバッテリー充電IC、無線通信モジュールXbee用ソケット、3.3Vレギュレータを搭載。

実売価格 2,495円

写真右上のUSBコネクタはリチウムポリマーバッテリーの充電に5V電圧を給電するためのものです。スケッチ(プログラム)のアップロードには使えません。アップロードのためには無線通信モジュールXbee経由で行うか、またはUSB-シリアルアダプタを別途用意して行う必要があります。

写真右下はリチウムポリマーバッテリーの接続コネクターです。リチウムポリマーバッテリーの取り扱いによっては発煙、発火する場合もあり十分に注意が必要です。

基板にはケースなどへの取り付け用の穴が空いていないため、固定するのには工夫が必要になります。

ボード裏面には無線通信モジュールXBeeの取り付けコネクターが実装されています。写真はXBeeを取り付けた状態。

Arduino FioについてArduinoサイトの情報