2015年12月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

最近のトラックバック

Arduino

2014年9月 9日 (火)

bitDuinoでメロディを奏でてみた

Tonecycle_test

※bitDuino10書込み環境に圧電スピーカーを接続した様子

 現在ATtiny10とATtiny13AをサポートするArduino互換機環境のbitDuinoですが、tone関数でメロディを奏でてみたいとがんばってみました。ATtiny13Aを使用するbitDuino13では元のtone関数の無くても何とかなるし使いにくい第3引数duration(発音の長さ)を廃止して空きメモリを増やしています。またATtiny10を使用するbitDuino10では、どうしてもフラッシュに入るサイズに出来なかったので、周波数を引数にするtone関数の代わりに、直接的にクロックサイクル数を引数にするtoneCycle関数を実装しました。最新のサポートファイルをダウンロードしてお使いください。

 またそれぞれにサンプルスケッチを用意しました。ライブラリのサンプルではないので、普通にスケッチフォルダに保存して試してみて下さい。実際に音を出すには圧電スピーカーが必要です。サンプル中、bitDuino10はD2(4番ピン)とGND(2番ピン)、bitDuino13ではD4(3番ピン)とGND(4番ピン)に圧電スピーカーを繋げています。tone関数、toneCycle関数のいずれでも使用するピンは自由ですので、スケッチを自作する場合には接続ピンを変更する事も可能です。それからオリジナルのtone関数のサンプルスケッチではメロディデータを普通の変数で配列に持っていますが、bitDuinoでは変数や配列に使えるSRAMも小さいので、PROGMEM constキーワードとpgm_read_word_near関数を駆使しています。toneCycle関数用のサンプルスケッチではpitches.hの中身もそれに合わせて値を変更しています。

 下はtoneCycle関数用サンプルスケッチのtoneCycleMelody.inoです。LEDは繋がなくても音は出ます。

 #include <avr/pgmspace.h> 
 #include "pitches.h"
// notes in the melody:
PROGMEM const unsigned int melody[] = {
  NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4,0, NOTE_B4, NOTE_C5};
// note durations: milli seconds 
PROGMEM const unsigned int noteDurations[] = {
  250, 125, 125, 250, 250, 250, 250, 500 };
#define led 1
#define spk 2
 
void setup() {
  pinMode(led,OUTPUT);
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < (sizeof(noteDurations)>>1); thisNote++) { 
    unsigned int noteDuration = pgm_read_word_near(noteDurations+thisNote); 
    toneCycle(spk, pgm_read_word_near(melody+thisNote));
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level) 
    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    delay(noteDuration); 
    // stop the tone playing:
    noTone(spk);
   digitalWrite(led, LOW);   // turn the LED on (HIGH is the voltage level)
   delay(noteDuration>>2);
  }
} 
void loop() {
  // no need to repeat the melody.
}
 

 バッハのメヌエットを奏でてみた動画はこちら。 

2014年8月27日 (水)

世界最小?のArduino互換ボードを作ってみた(暫定版)

Bv9hdw4cqaafebs_2

 と言う訳で、おそらく世界最小だと思われるArduino互換ボードなのですが、要はATtiny10のArduino化です。まずは下のオプションファイルをダウンロードして下さい。

 このファイルを解凍し、Arduinoのスケッチを保存するフォルダに hardware というフォルダを作成してその中に入れて下さい。その後Arduino IDEを立ち上げるとマイコンボードに bitDuino13 (internal 9.6 MHz clock) とbitDuino10 (internal 8 MHz clock)が追加されます。ATtiny10は後者のマイコンボードになります。

 今回も詳細な使い方はkosaka kimioさんの記事「米粒AVR(ATtiny10)をArduino IDEで使う。暫定レポート2」 をご参照願います。現行Arduino IDEのコンパイラ(1.0.5)ではATtiny10に対応していないので、Windows/macともにそれぞれの方法でコンパイラを差し替える必要があります。Windowsではフォルダごと交換、macでは元のフォルダの名前を変更し、シンボリックリンクを作成する事で差し替えをします。私はmacを使っているのですが念のためArduino IDEを複製してそちらのコンパイラを差し替えました。

 今回のオプションファイルは3月に暫定公開したATtiny13AをArduino化するbitDuinoを元にしています。そこへkosaka kimioさんのATtiny10をサポートする仕組みを追加しさらにdelayMicroseconds関数のインラインアセンブラ化などを施しています。
 
  • 経過時間関係の関数がデフォルトでは使用不可
    millis() とmicros()がそのままでは使えません。一応setup関数内にstartTimer();と書けばこれらの関数のタイマーを設定をして動く様にしました。ATtiny13A(bitDuino13)では動作していそうですが、ATtiny10(bitDuino10)ではどうもおかしい様です。今後修正して行きたいところですが、あまり使う場面も無いかなぁと思っています。
  • delay()関数があまり正確ではない
    本来のArduinoではタイマーで管理されたmillis()関数を利用して実現されているのですが、これをCPUサイクルから求めたdelayMicroseconds()関数を利用する様に変更しています。また引数はlong型ではなくint型で受け取るので、使用出来る数値範囲が狭まっています。
  • ピン番号を指定する関数で使用可能範囲をチェックしていない
    digitalRead(),digitalWrite(),analogRead(),analogWrite()などの関数でピン番号の指定出来る範囲のチェックをしていません。間違わない様に気をつけて下さい。
  • Tone()関数は詰め切ってないので音痴かもw
    ATtiny10(bitDuino10)では未チェックです。 代わりにtoneCycle関数を実装しました。
  • その他
    ATtiny10(bitDuino10)ではshiftOut(), shiftIn(),pulseIn()等の関数が未チェック。

 書き込みに当たっては、テストをしやすい基板を作成し、AVR ISP mkIIと5VACアダプタが繋がる様にしてあります。
 動画のマイコンは秋月の実装済みモジュールですが、これを連結ピンに差し替えて足をつけていない基板に書込んでいます。ICクリップが繋がる様にするのも良さそうです。
 細かいチェックはまた今後して行こうと思いますが、みなさんも実際に使ってみて下さい。

2014年7月 5日 (土)

知らないとソン!? Arduinoの小ネタ色々

 知っている人には当たり前だけど、知らないでいるとソンしちゃうかもっていうArduinoの小ネタを集めてみました。

 2015/2/10 追記:Arduino IDE 1.6.0が公開されました。1.5.x Betaからのバージョンアップですが、Betaが取れて今後はこちらがメジャーバージョンになる様です。しかしながら、以下の記事は1.0.x系(最終?バージョンは1.0.6)を対象に書かれている部分も有りますのでご注意下さい。

◯回路と連動したスケッチ(プログラム)の小ネタ

■アナログ入力ピンはデジタル入出力ピンとしても使える
 意外とこれを知らずにArduinoのピンが足りないと悩んでる方が多いんですよね。Arduino Unoの場合、アナログ入力ピンの0〜5番をデジタル入出力ピンの14〜19として使えます。
 例えば出力に使いたければ pinMode(14,OUTPUT); と設定して、digitalWrite(14,HIGH); で出力などと普通のデジタル入出力ピンと同様です。
 これはArduino mini/Pro/Pro mini/FioなどATmega328P/168使用のマイコンボードでも同じに使えます。
 またArduino Mega 2560ではアナログ入力ピンの0〜15をデジタル入出力ピンの54〜69として使えます。Arduino LeonardoはUnoと似ていますが、番号はちょっとずれてアナログ入力ピンの0〜11番がデジタル入出力ピンの18〜29として使えます。もっともアナログ入力ピン番号6〜11は元々デジタル入出力ピンの場所にあるのですが。

その際、A0〜A5などとマクロ定義されたピン番号を使うと便利
 上記の小ネタ、マイコンボードが違うと配置上は同じアナログ入力ピンなのにデジタル入出力ピンとして使う番号が違っていると共通化出来なくて不便ですね。そこであらかじめシステムで設定されているマクロA0〜A5を使うと、その違いを吸収出来ます。先の例なら pinMode(A0,OUTPUT); と設定して、digitalWrite(A0,HIGH); で出力という感じです。これならArduino Uno/Mega/Leonardoなどで共通のスケッチを書く事が出来ますね。Arduino Unoだけで使う場合でも一々何番に対応するのか思い出さずに済みます。

INPUT_PULLUPを使うとプルアップ抵抗を省略出来る
 デジタル入出力ピンで押しボタンスイッチなどを繋ぐ場合、押されていない時の入力電圧を作るためプルダウンあるいはプルアップ抵抗が必要ですよね。ところがこの内のプルアップ抵抗はマイコンチップ内部に同等の機能を持ってるのです。ピンモードの設定でINPUT_PULLUPキーワードを使用すると有効になるので、外部のプルアップ抵抗を省略出来ます。
 例えば pinMode(2,INPUT_PULLUP); といった感じ。これで2番ピンがマイコン内部の抵抗を介して電源レベルに繋がるので、あとは2番ピンにボタンを繋ぎ、ボタンのもう片方をGNDに繋げばOKです。digitalRead(2) ではボタンが押されていない時にHIGH、押された時にLOWになるので、それに対応したコードを書いてください。
 こちらの記事もご参照ください。「意外と知られていない?INPUT_PULLUP」

◯Arduino言語の小ネタ

Arduino言語のベースはC++
 これは多くの方がお分かりかと思いますが、Arduino言語のベースはC++です。これにArduinoの独自のファイル群が裏で付け足されているので、ユーザーが書くスケッチ(プログラム)は非常に簡潔になる様に出来ています。C++そのものは奥の深い割と難しい言語かもしれませんが、Arduinoでは(C++以前の)C言語をちょっとかじった位の知識で書ける様に出来ています。
 ところでArduino IDEそのものはJAVAで開発されていて、IDEの元になったProcessingはその言語もJAVAベースです。なのでArduino言語もJAVAベースと勘違いされやすいですが、C++ベースなのでお間違いなく。

printしたい文字列はF関数で囲むと変数メモリの節約になる
 シリアルやLCDに文字列を出力したい場面も結構有りますね。ところがやたらとprint関数を使うとSRAM(変数などに使われるメモリ)を無駄に消費してしまいます。なぜかというと、たとえ出力したい物が""で囲んだ文字定数だとしても、AVRマイコンの仕組み上、起動時にFlash(プログラムが格納されるメモリ)からSRAMに丸々コピーされ、それが実行時に読み出されるからです。
 そこで、print関数に書く文字定数は(マクロ定義された)F関数で囲みましょう。これを使うと直接Flashから読み出しながらprintしてくれるので、SRAMの消費を抑えられます。例 Serial.print("TEST"); Serial.print(F("TEST")); といった感じです。特にバグも無さそうなのに動作が不安定の場合、SRAMが不足している事が考えられますので、こちらの対策をしてみて下さい。

◯Arduino IDEの小ネタ

ライブラリはArduino IDEフォルダのlibrariesに入れるより、スケッチフォルダにlibrariesフォルダを作って入れる方が楽
 Arduinoの魅力は各種センサやアクチュエータ(出力機器)のライブラリが色々発表されている事ですね。そこでそれらのライブラリをダウンロードして取り込む必要が有るのですが、どこに保存したら良いでしょうか?Arduino IDE標準のライブラリが置かれているフォルダを探し出して、そこに入れ込む方もいらっしゃる様です。でもこれって結構めんどうな場所にありますよね。
 実はスケッチを保存しているフォルダにlibrariesフォルダを作成してそこにダウンロードしたスケッチを置く事が出来ます。Windowsなら「ドキュメント」→「Arduino」→「libraries」、macなら「書類」→「Arduino」→「libraries」になると思います。Arduino IDEが置かれているフォルダは管理者権限が無いと開けなかったり面倒ですが、スケッチを保存しているフォルダならアクセスも簡単ですね。
 ところで、残念ながら今の所librariesフォルダは階層管理する事が出来ません。ダウンロードしたライブラリ毎のフォルダを直接librariesフォルダの中に置いて下さい。本当はlibrariesフォルダの下にSparkFunとかAdafruitとかSeeedStudioなんてフォルダを作ってまとめたいんですけどね。

ライブラリを手動でフォルダに入れた時は、Arduino IDEを再起動しないと認識しない
 さて、ライブラリを適切なフォルダに保存したのに、Arduino IDEにそのライブラリも「スケッチの例」も出て来ないと焦った方もいらっしゃるでしょう。ライブラリは起動時にチェックされてIDEのメニューに登録される様なので、その場合、一旦Arduino IDEを終了し、再度立ち上げて下さい。

■ライブラリの取り込みには「Add Library…」を使うと便利
 ここまでライブラリの取り込み方法を説明して来ましたが、実はArduino IDEのメニューから「スケッチ」→「ライブラリを使用」→「Add Library…」を使うと簡単です。ダイアログからフォルダもしくはzipファイルを選択するだけでスケッチフォルダの下のlibrariesフォルダにコピーを作成し、直に使用可能に設定してくれます。これは便利ですね。

■追加マイコンボードのサポートファイルもスケッチフォルダに置ける
 ライブラリ程ダウンロードする機会は少ないと思いますが、Arduino互換機で専用のサポートファイルをダウンロードして使う場合が有ります。その時もArduino IDEのあるフォルダには追加せず、スケッチフォルダの下に「hardware」フォルダを作ってそこに置く事が出来ます。ライブラリ同様Arduino IDEを再起動させて認識させましょう。

Arduino IDE左下にカーソルの現在位置行番号が表示される
 本当に小ネタ中の小ネタですが、気が付かないと分からないのでご紹介です。Arduino IDEの左下に表示されてる数字、なんだろう?と思われた方も多いはず。これがカーソルの現在行番号なんですね。ちなみに右には選択しているマイコンボード名とシリアルポート名が表示されています。

スケッチをアップロード出来ない原因のほとんどは、マイコンボードやシリアルポートの選択間違い
 Arduinoあるあるネタですね。自分では間違ってないつもりでもまったくの思い込みだったなんて事が結構あります。上のネタに有る様にArduino IDE右下の表示で確認出来ます。そこが間違っていないようならこちらの記事をご参照下さい。「Arduinoトラブルシューティング アップロード編」

インデントの自動整形が出来る
 インデントが綺麗に整ったコードはとても読みやすいですね。だけどコードを作成している時にいちいち揃えるのは面倒と思う方もいらっしゃるでしょう。そんな方のための機能がメニューの「ツール」→「自動整形」です。書式のお作法に特にこだわりが無い様でしたらこれで十分。

ArduinoをAVRライターにする事が出来る
 Arduinoのマイコンチップに書かれているブートローダーがおかしくなったりした時の修復や、自作でArduinoを作りたい時などにAVRライターが必要になります。今では買っても3000円ちょっとですが、1台Arduinoを持っているならそれをAVRライターとして使う事が出来ますので、活用しましょう。Arduini IDEのメニュー「ファイル」→「スケッチの例」→「Arduino ISP」でスケッチを呼び出してArduinoに書込むだけでArduinoをAVRライターとして使う事が出来ます。
 詳しくはこちらの記事をご参照ください。「Arduino を AVR  プログラマ(ISP: In-System Programmer)として使う」
 上記記事中にArduini Unoが出て来ませんが、Arduino Duemilanoveと同様に使用出来ます。原文(英語)ではUnoも追加されています。
 もし、AVRライターで書き込みに失敗してマイコンチップが反応しなくなったら、こちらの記事を参考に修復をお試しください。「ATmega48/88/168/328用のヒューズリセッターをArduinoで作る」

◯マイコンボードの機種別

Arduino Unoを使いたいのにUSBケーブルを忘れたら、プリンタ用のUSBケーブルを転用する
 Arduino Uno(あるいはArduino Mega 2560)を買ったり、学校や職場から持ち帰ったのにUSBケーブルを買い忘れた/持ち帰り忘れたなんて事態の時には、パソコンとプリンタを繋ぐUSBケーブルを見てみて下さい。そこにUSBの標準A-標準Bケーブルがあるはずです。これがArduino Unoにも使えますね。諦めずに楽しい週末工作を。

Arduino Pro MiniとArduino Miniは別の製品
 小型のArduinoとして人気のArduino Pro Miniですが、Arduino IDEで選択する時にちょっと探しにくいです。マイコンボード選択のリストでは Arduini Mini が先に出て来ますが、こちらは別の製品です。もうちょっと下に Arduino Pro or Pro Mini がいくつか出て来ますので、こちらから該当のスペックの物を選んで下さい。回路的にはほとんど同等の物なのですが、スケッチの転送速度が違っているので、正しく選ばないとスケッチのアップロードが出来ません。
 ちなみにArduino Pro MiniはアメリカのSparkFunがライセンス生産していて、Arduino MiniはイタリアのArduinoチーム本家の製品です。何故か日本ではライセンス生産版の方が数多く流通している様ですね。

Japaninoは最新のArduino IDEでも使える
 学研「大人の科学マガジンVol.27 テクノ工作セット」 付録のJapaninoは書店で買えるArduino互換機で、説明書(雑誌本体)が付いているのでこれから入る方も結構いらっしゃる様です。ところが残念な事に発売からかなり時間が経っているので、ダウンロード出来る対応IDEのバージョンが随分古い物になってしまいました。折角ですから最新のIDEで使いたい物ですね。実は最新Arduino IDEでも「ツール」→「マイコンボード」→「Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega168 」もしくは「Liliypad Arduino w/ ATmega168」を選べば使えます。
 専用IDEと同様に「マイコンボード」のリストに「Japanino」を表示させて選択出来る様にしたい方は、Japanino_サポートファイル「japanino_.zip」 をダウンロードして解凍し、スケッチフォルダに「hardware」フォルダを作って、その中に解凍した「Japanino」フォルダを置いて下さい。
 USBシリアル変換チップのドライバもメーカーサイトから最新版をダウンロードした方が良い様です。CP210x USB - UART ブリッジ VCP ドライバ

Arduino Leonardoの0,1ピンに出ているシリアルはSerialではなくSerial1
 基板形状やピンソケットの配置はArduino UnoにそっくりなArduino Leonardoですが、色々とUnoとは違う所があって中々の曲者です。その内の一つがシリアル機能の扱いですね。UnoではPCとの接続もピンソケットの入出力ピン0,1番もSerialで兼用されていますが、LeonardoではPCとの接続にはSerialで変わらない物の、ピンソケットの入出力ピンはSerial1を使ってアクセスします。XBeeなどのシリアルを使ったデバイスとの通信にはスケッチの該当箇所を変更しないといけませんのでご注意ください。
 その他Arduino Leonardoには、気が付きにくいUnoとの違いも色々あるので、いずれ1つの記事としてまとめたいと思っています。

 さて、色々な小ネタをご紹介しましたが、いかがでしたでしょうか?もし追加でこれも入れて欲しいなど、ご要望・ご意見がありましたら、ぜひTwitterの@maris_HYへご連絡ください。よろしくお願いします。
 もちろんこちらのブログにコメントいただいても結構です。ただし投稿後、こちらの手作業で公開するまでは書込まれたコメントが表示されませんので、ご注意ください。
2014/07/09 追加マイコンボードのサポートファイルの項目とJapaninoサポートファイルのダウンロードを追記しました。

2014年6月15日 (日)

WaveシールドをArduino MegaやArduino Leonardoで使える様にしてみた

 AdafruitのWaveシールドは音声再生が出来るArduino用シールド(拡張基板)としてはかなり昔に開発され、半田付けによる組み立ても必要なキットでありながら、書籍Prototyping Labでも紹介されるなど長く人気を保っている製品です。

Uno_wave
Arduino UnoとWaveシールドV1.1
※ピンソケット、ICソケットなど自前の部品を足してあります。
 ところが、元々Arduinoの本流のArduino DuemilanoveやArduino Unoを対象に作られているため、Arduino MegaやArduino Leonardoでは、簡単に使用する事が出来ません。そこで、今回はこのWaveシールドをArduino MegaやArduino Leonardoで使える様にしてみました。

Arduino Megaで使う
 まずはArduino Megaで使ってみましょう。その前になぜこのWaveシールドがArduino Megaでそのままでは使えないかについて説明しなければいけませんね。このWaveシールドでは音声ファイルが入っているSDカードへのアクセスにSPIという通信方式が使われています。それに使用するSS,MISO,MOSI,SCKの4つのピンがあり、Arduino Unoではデジタル入出力ピンの10〜13に割り当てられています。ところがArduino Megaではこれがシールドが刺さっていない50(MISO),51(MOSI),52(SCK),53(SS)に出ているのです。使用すべきピンがArduino基板とシールドで違っているのでは正しく動くはずが無いですね。
 そこでArduino MegaでWaveシールドを使うにはこれらのピンをなんとかしてシールドの該当部分に繋がなくてはいけないという訳です。
 ところで、このSPIのピンのうちMISO,MOSI,SCKは実はArduino UnoでもArduino MegaでもArduino Leonardoでも6ピンヘッダのICSP端子にも繋がっているのです。なので、Arduinoチーム純正のEtherシールドやワイヤレスSDシールド等では、この端子を使ってSPI通信をする仕様になっています。
 実はこの事を利用して10〜13番ピンでSPI通信をするシールドをArduino MegaやArduino Leonardoで使える様にする変換シールドが製品として存在します。製品名がちょっと面白い?のですがトランスモグリシールドと言います。SparkFun Electronics製でスイッチサイエンスから入手する事が出来ます。
 このシールドをシールドを使えばMISO,MOSHI,SCKの配線を上手く繋ぎ直してくれるので、あとはArduino Megaの53番ピン(SS)をWaveシールドの10番ピンにジャンパワイヤで繋げばOKです。これだけでWaveシールドをWaveHCライブラリ(wavehc20110919.zip)で使用する事が出来ました。

Mega_wave
Arduino Mega 2560+トランスモグリシールド+Waveシールド

 またトランスモグリシールドの代わりになるシールドを自作する事も可能です。こちらの記事をご参照ください。

Arduino Leonardoで使う
 さて、こんどはArduino Leonardoですが、最初はArduino Megaと同じ手法で行けると思っていました。MISO,MOSI,SCKはトランスモグリシールド等で解決させるとしてSSはどこに出ているのかと回路図をチェックした所、なんとArduino LeonardoのSSピンはUSBシリアルの受信表示用LEDにのみ繋がっていて、ピンヘッダやピンソケットには出ていなかったのです。これは困りました。Waveシールドのライブラリ(WaveHC)はSDカードをSPI通信で有効にするピン(CS)を制御するためにSSピンを使う事に固定されいたのです。つまり表に出ていないピンをWaveシールドに接続しないと動かす事が出来ません。私は電子工作でなんとか出来なくも無いですが、見栄えも悪くなりますし、それが出来る人も非常に限られてしまいますね。
鳴かぬなら
 鳴かせてみよう
  Leonardo

まりす
 WaveシールドのライブラリがLeonardoに対応していない事態に臨んで。
 そこで、仕方なくライブラリに手を入れる事にしました。ライブラリで該当箇所を探り当て、CSピンをSS含め任意のピンに繋げられる様、改良を施しました。
 実際に変更したファイルはSdReader.h,SdReader.cpp,ArduinoPins.hの3つです。これをzipにまとめました。オリジナルのファイルと差し替えてお使いください。

※追記のライブラリファイルをお使いください。

 スケッチは、SdReader card; と書かれている所を SdReader card(CSのピン番号); とカッコ内にSDカードのCSとして使いたいピン番号(Waveシールドの場合、10)を追加する修正をして下さい。
 また、Serial通信をしている場合、Arduino Leonardoのお約束として、 Serial.begin(ボーレート); の直後に while (!Serial) { ; } を追加して下さい。
 これでArduino LeonardoでWaveシールドを使える様になります。

Leonardo_wave
Arduino Leonardo+トランスモグリシールド+Waveシールド

 またこのライブラリの改良を施せば、上記のArduino Megaで必要だったSSピン接続用のジャンパワイヤを不要に出来ます。もちろん今まで通りUnoで使用する事も問題有りません。

教訓。SPIを使ったArduino用のライブラリを作成する場合、ハードウェアSPIモジュールのSSピンは当てにせず、CSピンを任意に割り付け出来る様に書かないとLeonardoで使えない物になる。

◇2014/06/26 追記
DACの使用ピンも任意に変更出来る様にしました。
SdReader card(10);  // SDカードのCSピンを指定
WaveHC wave(2,3,4,5); // DACのLCS,CLK,DI,LATピンを指定
の様にスケッチを変更出来ます。
下のファイルをダウンロードしライブラリ全体を差し替えて下さい。

2014年5月21日 (水)

ATmega48/88/168/328用のヒューズリセッターをArduinoで作る

 Arduinoにも使われているAtmelのAVRマイコンは、6本線のISP接続で簡単にプログラム転送などが出来るのですが、クロックソースを設定するヒューズビットの値を間違って書込んだりすると、ISPでは中々回復するのが難しい事態に陥る事が有ります。そんな時の救世主としてヒューズリセッター(その名の通り、ヒューズ設定を出荷時状態に戻す)という装置が有ります。今回は、 「Arduino-based AVR High Voltage Programmer」をベースに必要な時に簡単に組めて、なおかつ動作の確認をしやすくしたものを作ってみました。

 まずはArduinoに次のファイルをダウンロード・解凍し、スケッチをアップロードして下さい。

 その後、一旦Arduinoをパソコンから外し、回路の組み立てをします。

■材料
  • ヒューズリセットしたいAVRマイコン(ATmega48/88/168/328)チップ
  • Arduino (テストはUnoで行っていますが、他でも大丈夫なはずです)
  • 12V電源
  • ブレッドボード
  • NPNトランジスタ(テストでは2SC1815を使いました)
  • 1kΩ抵抗 x 2本 (R1,R4)
  • 10kΩ抵抗 x 2本 (R2,R3 ※トランジスタに合わせて1kΩ〜10kΩ程度で調整して下さい)
  • ジャンパーワイヤ 適宜

■回路図
Ez_hvfuse_schmatics_1024

 簡単に作れる様に保護抵抗は最小限にしました。D0,D1はシリアルモニタと通信する為に空けてあります。そのためピン数が足りないのでPAGELはプルダウン固定ですが、FlashやEEPROMのプログラミングをしない仕様なので問題有りません。

■実態配線図
Ez_hvfuse_ecb
こちらはECB配列のトランジスタ(2SC1815等)を使った場合

Ez_hvfuse_ebc
こちらはEBC配列のトランジスタ(2N3903等)を使った場合

もちろんブレッドボードは図の様な小型な物でなくてもかまいません。

 回路の組み立てが終わったら間違いないかチェックし、パソコンと12V電源を接続します。
 それからArduino IDEを立ち上げ、シリアルモニタを出します。シリアルモニタの下の設定は「CRのみ」(「改行なし」以外なら他でもOK)「9600bps」を選択します。
Ez_hvfuse_screenshot

 出て来たメッセージに「D」をタイプしてEnterキーで送信するとチップの型番を自動判定してくれます。ここで対象のチップが見つからないとメッセージが出た場合はただちにArduinoから12V電源とUSBケーブルを抜いて回路のチェックをして下さい。
 正しくチップが認識されたら、ヒューズの規定値書込みコマンド「W」を送信→確認の為の「Y」を送信します。するとチップに出荷時のヒューズが書込まれます。
 最後に「R」を送信して、ヒューズが正しく書込まれているか確認して下さい。
 もし、Lock bitsがFF以外になっていて、ヒューズ設定が書込まれない場合、「C」コマンドでチップ全体のクリアが出来ます。ただしLock bitsだけでなくFlashやEEPROMの内容もクリアされます。これでヒューズビットの書き換えが出来る様になるので、再度「W」コマンドを実行します。
 その他、「L」「H」「E」「K」コマンドで、ヒューズビットやLock Bitsの値を指定して書込む事も出来ます。

 普段はほとんど使う必要の無いヒューズリセッターですが、いざと言う時に欲しくなりますよね。なのでArduinoを使ってなおかつ正しく動作しているかをモニタしながら作業出来る様に構成してみました。

2014年5月 9日 (金)

bitDuino用フルカラーLED(RGBLED)ライブラリを作りました。

先日ATtiny13AをArduino IDEで使う としてbitDuinoを(暫定)公開しました。ところがATtiny13AはPWMポート(analogWrite出来るピン)を2つしか持っていないので、フルカラーLED(RGBLED)を使おうと思うとPWMポートが足りません。そこで、タイマーオーバーフロー割り込みを使ったフルカラーLED(RGBLED)のライブラリを作りました。

「bitRGBLED_2014_05_09.zip」をダウンロード

  • 対象はbitDuino13Aと前回も紹介したこちらのATtiny45/ATtiny85
  • bitDuino13AではanalogWrite関数やtone関数と併用出来ません。
  • ATtiny45/ATtiny85では0番,1番ピンのanalogWrite関数と併用出来ます。
  • 内部でdigitalWriteを使っているので、どのピンにも割り付け可能です。
書式
◇初期設定
initRGBLED(赤のピン番号, 緑のピン番号, 青のピン番号);
 これでフルカラーLEDのピン番号を紐付けします。またタイマーの初期化をします。ピン番号は0〜5のどのピンでもかまいません。
◇個別LEDの輝度設定
setRGBLED(RGBの色番号,輝度);
 これはほぼanalogWrite関数と等しいのですが、RGBの色番号は0〜2になります。現状、赤→0, 緑→1, 青→2を指定して下さい。デジタルI/Oピン番号では無いのでご注意。
◇フルカラーLEDの輝度一括設定
setRGBLED(赤の輝度, 緑の輝度, 青の輝度);
 RGBを一括で設定します。
以上の3つの関数で出来ています。引数はいずれもbyte値です。
サンプルスケッチ RGB_fade
#include <bitRGBLED.h>

const byte LED_R = 0;
const byte LED_G = 1;
const byte LED_B = 2;

void setup(){
  initRGBLED(LED_R,LED_G,LED_B);
}

void loop(){ 
  for(byte c=0;c<3;c++){
    for(byte i=0;i<255;i++){
      setRGBLED(c,i+1);
      delay(2);
    }
    for(byte i=255;i>0;i--){
      setRGBLED(c,i-1);
      delay(2);
    }    
  }
}

サンプルスケッチ colorWheel
#include <bitRGBLED.h>

const byte LED_R = 0;
const byte LED_G = 1;
const byte LED_B = 2;

void setup(){
  initRGBLED(LED_R,LED_G,LED_B);
}

void loop(){ 
  byte i;
  for(i=0;i<255;i++){
    setRGBLED(i,255-i,0);
    delay(2);
  }
  for(i=0;i<255;i++){
    setRGBLED(255-i,0,i);
    delay(2);
  }
  for(i=0;i<255;i++){
    setRGBLED(0,i,255-i);
    delay(2);
  }
}

いずれもライブラリに収録されています。

2014年3月28日 (金)

ATtiny13をArduino IDEで使う(暫定版)

 明日2014/3/29はArduino誕生10周年だそうです。

 だからと言う訳でもないですが、ここの所取りかかっていたATtiny13AをArduino IDEで使うためのオプションファイル集を暫定公開したいと思います。

 本当はtinyDuinoって名前にしたかったんですが、既にしっかりしたプロジェクトになっているので、混同されても困ると思い別の名前にしました。小林茂先生が開発されたArduino FIOも元々ガンダムのファンネルから来ているらしいので、まぁビットも悪く無いでしょうw

 さて使い方ですが、上記のファイルをダウンロード→解凍し、Arduinoのスケッチを保存するフォルダに hardware というフォルダを作成してその中に入れて下さい。
その後Arduino IDEを立ち上げるとマイコンボードに bitDuino13 (internal 9.6 MHz clock) が追加されます。
書き込みの方法は、kosaka kimioさんの記事「Arduino IDEでATtiny他の開発(Arduino-ISP編)」をご参照ください。とりあえず暫定公開なので(^^;

 上記記事でもATtiny13AをArduino IDEで使う事が出来、私自身もそれを参考に使ってみました。その時は一応目的のプログラムを動かす事が出来たのですが、残りのプログラムエリアがとても少なかったので、さらに応用するために今回の専用オプションファイル集を作成するに至った訳です。

 今回はATtiny13Aでなるべくフリーエリアを多く使いたいために、元はさまざまなAVRマイコンに対応していたソースコードをばっさり切ってATtiny13Aに特化させています。そのため若干の制約や注意点があります。
  • 経過時間関係の関数が使用不可
    millis() とmicros()がおそらく使えません。これで使うタイマーを設定していないので、正しい値が取れないと思います。これらの関数はライブラリにして必要な場合使える様にしたいと思っています。
  • delay()関数があまり正確ではない
    本来のArduinoではタイマーで管理されたmillis()関数を利用して実現されているのですが、これをCPUサイクルから求めたdelayMicroseconds()関数を利用する様に変更しています。また引数はlong型ではなくint型で受け取るので、使用出来る数値範囲kが狭まっています。
  • ピン番号を指定する関数で使用可能範囲をチェックしていない
    digitalRead(),digitalWrite(),analogRead(),analogWrite()などの関数でピン番号の指定出来る範囲のチェックをしていません。間違わない様に気をつけて下さい。
  • Tone()関数は詰め切ってないので音痴かもw
  • その他
    shiftOut(), shiftIn(),pulseIn()等の関数は未チェック
 他に、専用のソフトウェアシリアルライブラリも作成してあります。
 こちらは解凍してArduinoのスケッチを保存するフォルダにlibrariesフォルダを作成して、その中に置いて下さい。
古い(Arduino IDE 1.0以前の)ソフトウェアシリアルライブラリを元に作成していますので半二重です。受信は1バイト受け取るまで待機します。また送信中に受信出来ません。printメソッドを使うと直ぐにFlashが足りなくなりますw

 と言う訳で、暫定公開版ですが、お試しください。

2012年5月31日 (木)

ArduinoにLCDを信号線3本で繋ぐ (IDE 1.0対応)

 同じタイトルで前に書いた記事のライブラリを、LcdCore使用のIDE1.0以降にも対応させたので、ご紹介します。

 回路は前と変わっていません。

Lcd164_v100

 シフトレジスタの74HC164を使い、Arduinoの使用ポート数を減らしています。また、74HC164のコントロールに使うData線を、LCDのRSとしても使用することでも使用ポートを増やさない工夫になっています。

 ライブラリは以前のものをLcdCoreライブラリ使用タイプに変更しています。IDEは0022, 0023, 1.0, 1.0.1どれでも使えます。

サンプルスケッチ

#include <LcdCore.h>
#include <Lcd74HC164.h>

Lcd74HC164 lcd(2, 3, 4); 

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}

今回も標準のLiquidCrystalライブラリを使ったスケッチの一部(includeと変数生成部)を書換えるだけで簡単に使えるようになっています。

Lcd74HC164
Lcd74HC164型の変数を生成します。

【構文】

Lcd74HC164 生成する変数名(data, clock, enable)

【パラメータ】

data: 74HC164のData(A,B)ピンおよび、LCDのRSピンに接続するArduino側のピン番号
clock: 74HC164のCKピンに接続するArduino側のピン番号
enable: LCDのenableピンに接続するArduino側のピン番号

「Lcd74HC164_20120528.zip」をダウンロード

このライブラリを使用するには、下のライブラリも必要になります。

「LcdCore_20120528.zip」をダウンロード

このライブラリの記事はこちらです。

2012年5月28日 (月)

秋月のI2C接続キャラクタLCDモジュールACM1602NIをArduinoで使う

さて、引き続いてですが、最近発売された秋月のI2C接続キャラクタLCDモジュール「ACM1602NI」用のライブラリです。先ほどの分割したLcdCoreライブラリと組み合わせて使います。

「LCD_ACM1602NI_20120528.zip」をダウンロード

スケッチ例

#include <Wire.h>            // Arduino IDE のI2Cライブラリ
#include <LcdCore.h>         // LCDコアライブラリ
#include <LCD_ACM1602NI.h>   // 秋月I2C液晶用のI/Oライブラリ

LCD_ACM1602NI lcd(0xa0); // 0xa0はI2Cアドレス

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}

前回同様、スケッチはincludeの定義と変数設定部分の変更だけです。

とりあえず回路図は省略しますので、液晶付属のデータシートなどを参考にしてください。

5/29 追記

参考回路図

Acm1602ni

動作チェックした回路では、プルアップ抵抗(R1,R2)2.2KΩ、コントラスト調整VR 10KΩを使いました。また、電源が3.3VならバックライトLED用に抵抗を付加しなくても基板内の抵抗(15Ω)で十分の様です。

ArduinoのLiquidCrystalライブラリをコア部分とIO部分に分割する。

大分以前の記事になりますが、「ArduinoにLCDを信号線3本で繋ぐ」で、ArduinoのLiquidCrystalライブラリの改造をしました。この時は、丸々LiquidCrystalライブラリをコピーして書換えたのですが、その後未発表ながら、他の接続方式でLCDを駆動するライブラリをいくつか書いてきました。

ところが、この作業、実際に新規にコードを書く部分は少ないものの、もしやマクロ定義でバッティングしないかと、わざわざ定義名をそれそれ書換えて、その作業が結構面倒でした。また、それぞれにコマンドを発行する部分も重複するので何種類かのLCD出力をしたい場合、コードメモリも無駄に消費してしまいます。

そこで、今回、LiquidCrystalライブラリをコア部分とIO部分に分割することにしました。

「LcdCore_20120528.zip」をダウンロード

こちらがコア部分(LCDコマンドの発行部分)のライブラリです。
他のIO部分のライブラリと組み合わせて使い、スケッチ上では「#include <LcdCore.h>」を書く以外には特に何もする必要はありません。

「LCDIO_20120528.zip」をダウンロード

こちらがI/O部分のライブラリです。
このライブラリをLcdCoreライブラリと同時に使うことにより、元のLiquidCrystalライブラリと同様に動作します。

構文、パラメータについては、Arduino 日本語リファレンスの「LiquidCrystal()」をご参照下さい。

スケッチ例

#include <LcdCore.h> // コアライブラリ
#include <LCDIO.h>   // I/Oライブラリ

LCDIO lcd(12, 11, 5, 4, 3, 2); // LiquidCrystal→LCDIO 

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}

スケッチもこの様にLiquidCrystalライブラリ使用のものから「#include ~」と「~ lcd(12, 11, 5, 4, 3, 2);」を差し替えるだけでOKです。

その他のカテゴリー