タグ別アーカイブ: avr

CIMG2381

汎用AVR ライター基板

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

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

AVRのフューズビットをMacで書き換える方法

AVRをプログラミングした時に、想定したスピードで動作しないことがあります.delay関数などで動作タイミングを制御した際にこれが見られることがあります.これはマイコンを動作させているクロックスピードの設定とプログラム側で想定していたクロック速度との違いがあるときに起ります。

内蔵の発信器でクロックを作っているか
外部発信器でクロックを作っているか
クロックの分周比の設定

などによってマイコンの動作速度が変わります。どのクロック信号を使うか、分周比をどうするのか、予めチップ側にその設定を行っておき、どうじにプログラミング側でもそれの応じた設定になっていないといけません。

また、検討時には動作していたものが実機に載せた時に動かないというトラブルも有ります.動作電圧が実機では3Vで動かすつもりがデバッグでは5V電源だったときにも起こりえます.これはマイコンチプの設定で指定電圧よりも供給電圧が下がった時に自動的にシャットダウンする機能が働いていることがあります.

これらの設定はマイコンチップのフューズビットを適切に書き換える事で変更することができます.

一般的にはWindows OSで動作するAtmel Studioを使ってフューズビットの書き換えを行うのですが、Macを使っている場合にはAtmel Studioを使うことができません.そこでここではCrossPack-AVRを使いながらフューズビットの書き換えを行う方法を紹介します。
必要なものはターゲットのAVRとMacとを接続するUSBで動作するAVRライターです。ここではAVR純正のライターであるAVR ISP mkIIを使いました。
CIMG2359

ターゲットのマイコンはATmega328Pです。ISPとの接続に便利なAVR boardを使っています.

さっそくMac上で環境を作りましょう。まずはCrossPack for AVR をインストールします.
CrossPack AVRのサイト

上記リンク先を参考にダウンロードとインストールを行います.
PATHも通しておきましょう
export PATH=$PATH:/usr/local/CrossPack-AVR/bin

CrossPack AVRはxcodeの統合環境によるプログラミングやgccを使ったプログラム作成ができるとのことですが、ここではフューズビットの書き換えのみについて以下に説明します.

インストールが終わったら次にUSBからISPが使えるようにするためのavrdudeをインストールします.

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

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

ここでavrdudeの設定ファイルを確認します.
/opt/local/etc/avrdude.conf (環境によっては別の場所に有る事もあるようです)
ここには使用するISP(AVRライター)の情報が記載されています.

programmer
  id    = "avrispmkII";
  desc  = "Atmel AVR ISP mkII";
  type  =  "stk500v2";
  connection_type = usb;
;

なんていうのがそれぞれのライター(プログラマ)の設定になります.上の例は今回用いたAVR ISP mkIIの設定になります.他にも多くのプログラマの設定がデフォルトでされていますので、お使いのライター、プログラマがあるかどうか確認しておいてください。見つけたらid=”"の中をメモしておいてください.ここに出ているid名はあとで使います。

次にCrossPack AVRで雛形を作ります.Terminalを起動したらカレントディレクトリーをDesktopにでも移動しましょう。ユーザーディレクトリでも構いませんが、あとで見失わないところに置いておきます。

cd /Users/user name/Desktop 
avr-project temp
cd temp/firmware

デスクトップにフォルダが現れます。この場合はtempという名前のフォルダになります.
temp>firmwareを開きます。Makefileというのがありますのでこれを編集します.

DEVICE     = atmega328p #ターゲットのマイコンチップを指定します
CLOCK      = 8000000 #動作クロックを指定します.
PROGRAMMER = -c avrispmkII #使っているライター(プログラマ)を指定します。avrdude.confで確認したid名です
OBJECTS    = main.o
FUSES      = -U hfuse:w:0xd9:m -U lfuse:w:0xe2:m -U efuse:w:0xff:m #設定するフューズビットを指定します.

上の例では
ターゲットはATmega328P
動作クロック8MHz
プログラマーにはAVR ISP mkII
フューズビットは、内蔵8MHzクロックを使用、BODレベルは無し(電圧が降下しても自動シャットダウンしない)
の設定になっています.デバッグ時に5V電源で動作していて、実機で3Vにした時に動作しない場合はこのBODレベルが3V以上になっていることが予想されますので、フューズビットを適宜書き換えてみてください.

ArduinoIDEからはフューズビットの書き換えが上手く反映されない場合にもこの方法を試してみると良いでしょう.

スクリーンショット 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アドレスが競合してしまっては使えないので気をつけましょう)

CIMG2359

AVR LCDボードのコスト比較

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

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

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

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

I2Cinterface説明図5

LCDキャラクターディスプレイモジュール比較

一般的に入手が容易なLCDキャラクターディスプレイモジュールの比較を紹介します。

1)超小型LCDキャラクタディスプレイモジュール(16×2行バックライト・オレンジ)
SD1602HUOB(-XA-G-G)

○小型
○バックライトが明るく見やすい
☓LCD上部にFFCがあり、ケースへの収まりが悪い

基板上のピンは直列16ピン

2)LCDキャラクタディスプレイモジュール[16×2行][バックライト付白抜き]
[SC1602BBWB-XA-GB-G]

○黒い枠があり、ケースへの収まりが良い
○青色のバックライトは明るく、日中でも目立つ
△(1)のモジュールよりもサイズが大きい

基板上のピンは2列x7ピン=14ピン

3)LCDキャラクタディスプレイモジュール(16×2行バックライト付)
[SC1602BSLB(-XA-GB-K)]

暗所で撮影

明るい場所で撮影

(2)のバックライト違いだが見え方は随分異なる

○黒い枠があり、ケースへの収まりが良い
○バックライトは弱いが日中の視認性は良い
△(1)のモジュールよりもサイズが大きい

基板上のピンは2列x7ピン=14ピン

いずれのモジュールもマイコンとの接続には複数のピンを接続する必要がある。ブレッドボードなどでの試作では配線が手間になることも。モジュールとの接続をコネクタ化した汎用的な基板を作っておくと試作検討もすっきりと進みます。
オリジナル基板について

AVR マイコンチップ 8bitシリーズ

AVR8ビットマイコンのシリーズには大きく分けて2つあります。大容量化、I/Oを拡張したMegaシリーズと高機能化・低消費電力化・低電圧対応したTinyシリーズです。I/Oピン数、パッケージタイプ、メモリー容量などによって更に細かく分類されます。ここでは代表的な2機種について紹介します。

上:ATTiny2313

下:ATmega 328P

ATmega 328P

  • 参考価格 250円(小ロット購入時)(*1)
  • 最大動作周波数:20MHz
  • FLASH:32KB
  • 28ピンDIP
  • 14デジタルI/O
  • 6アナログインプット

Adruino Unoにも使われているマイコンです。

ATTiny2313

  • 実売価格 100円(小ロット購入時)(*1)
  • 最大動作周波数:20MHz
  • FLASH:2kバイト
  • 20ピン DIP
  • 18ピン  I/O

LCDキャラクターディスプレイモジュールを使ったプログラミングではATTinyではメモリー容量が不足することがあります。ATmegaならメモリー容量が十分あり、余裕を持ってプログラミングすることが出来ます。ATtiny2313にはA/Dコンバータがありません。アナログ電圧の測定が必要な場合は他のモデルをつかうことになります。

シリーズの詳しい内容、使用についてはAtmel社のサイトをご確認下さい。
Atmel Corporation

*1)量産用として相当数量を購入する場合はこの価格ではありません。紹介した価格は秋月電子通商2012年6月時点の価格を掲載しています。

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を使うことは無いでしょう。

atmegapinassign

AVRマイコンを使う上でのメリット/デメリット

AVR ATMega328はフィジカルコンピューティングとして有名なArduinoボードでも使われているマイコンです。AVRマイコン単体で使う場合とArduinoボードで使う場合の比較した場合のメリット・デメリットについて紹介します。

AVR単体のメリット

基板のデザインが自由に出来る

センサーなどのデバイス、モジュールや他機器との接続のためのコネクター等をAVRマイコンと同一基板上に実装することが出来ます。所望の筐体に合わせて基板の形状を決めることが出来ます。これは製品化を考えたときに使いやすいといえるでしょう。

マイコンの選択肢がある

仕様の必要に応じてマイコンのモデル(ATmega,ATtiny…)を選択することが出来ます。必要十分なマイコンを選定することはコストダウンにもつながります。

マイコンの細かな設定が可能

フューズビットを操作することが可能。例えばクロック用外部発振器の有無を選択することが出来る。

量産、小ロット生産

 コストダウン、基板の最適化、仕様の絞り込みができることから、量産および小ロット生産に向いている
AVRマイコンの最小構成であれば100円(小ロット生産時)から実現可能。(ArduinoボードはUnoが2,520円)

AVR単体のデメリット

AVR開発環境

開発環境であるATMEL STUDIO(2012年6月時点での最新版はATMEL STUDIO6)はArduino IDEに比較して難しく習得へのハードルが若干高い。
例えば、入出力ピンの設定、ピンへの入出力にビット操作で行うなど。

ただしこのデメリットもArduinoIDE(0.22でサポート、1.0はサポートされていない)を使うことで解消できる。Arduino言語が使えること、Arduino用のライブラリーが利用できることのメリット(習熟の容易さ、開発期間の短縮)は大変大きい。同じマイコンATMega328を使うことでArduinoでプロトタイプしたものをほとんど変更なくAVRへ移植するといった開発プロセスを行うことも可能。

PCとの接続

試作用の基板またはブレッドボードを使って、PCからプログラムをアップロードするための回路を構成する必要がある。

接続例1

接続例1ではブレッドボード上にAVRISPmkIIコネクターとATmegaの配線とその他部品との配線を行なっています。ArduinoボードはUSBポートを備えているのでそのままPCとの接続ができることを考えると、AVRを使う上ではその準備に手間がかかるといえよう。


接続例2
接続例2ではAVR試作検討用基板(写真下)をオリジナルで起こしたもの。基板上にはISPコネクター、水晶発振器(オプションで発振器の実装有無が選択)、LCDモジュール用コネクターを実装し、よく使うであろう機能に絞って基板上に構成しました。これによって省スペース、LCDモジュールとのコネクター接続による一体化、コストダウンを行うことが出来ました。(写真ではISPコネクターをハーネスで延長しています)

AVRボードについて

幾つかのI/Oピンも基板上のランドに出していますので、外部機器との接続とLCDに表示する回路構成であればこのボードを使って試作から製品化まで利用することも可能でしょう。

atmel2

AVRマイコンチップのフューズビットの書き換え

ATMEL STUDIO6を使ってAVRマイコンチップのフューズビットの書き換えについて説明します。

AVRマイコンとPCを接続したあと、ATMEL STUIDIOのTool > Device programing をクリック。

Tool、Deviceを使用しているものに合わせ、Applyをクリックする。Device SignatureのReadをクリックしエラーが出なければ接続が成功。

フューズビットの書き換えのために Interface setting > Fuses をクリック。クロック周波数の分周を行うかどうかの設定は”CKDIV8”のチェックボックスで指示します。外部クロック、内蔵クロックの切り替え等は”SUT_CKSEL”のプルダウンメニューから選択します。マイコンの初期状態では”INTR・・・”になっていました。ここでは外部発振子を使う設定に変更しましょう。

”EXTXOSC_8MHz…”を選択します。