Arduinoで遊ぼう - カラーセンサー(TAOS TCS230)
Posted by arms22 on 2009年01月31日

千石電商日本橋で購入したTAOSのカラーセンサIC、「TCS230」をArduinoで使ってみました。
TCS230は光-周波数コンバータで、光の強さを矩形波(デューティサイクル50%)で出力するICです。矩形波の周波数は光の強さに正比例しています。TCS230は8x8のフォト・ダイオード・アレイをもち、そのうち16個は赤フィルタ、16個は青フィルタ、16個は緑フィルタ、16個はフィルタなしとなっている。フォト・ダイオードをS2/S3端子で選択し、OE端子をLowにするとOUT端子から光の強さ応じた周波数で矩形波が出力される。TCS230から出力される矩形波はArduinoのpulseIn関数で読み取る。
例によってまたまたライブラリを作成しました。
ダウンロード: ColorSensorライブラリ
http://xfind.hp.infoseek.co.jp/electric/arduino/ColorSensor001.zip
使い方
1.ColorSensorライブラリをarduino-0012/hardware/libraries/以下にコピーする。
2.新しいスケッチを作成する。
3.メニューからSketch > Import Library > ColorSensorを選択する。
サンプルスケッチ:
#include <ColorSensor.h>
uint8_t _pinLED = 5;
ColorSensor myCS = ColorSensor(4,3,2);
void setup(){
pinMode(_pinLED, OUTPUT);
digitalWrite(_pinLED, LOW);
Serial.begin(9600);
}
void loop(){
// LED on
digitalWrite(_pinLED, LOW);
delay(50);
// measure color
myCS.measureColor();
// LED off
digitalWrite(_pinLED, HIGH);
Serial.print("Red = ");
Serial.print(myCS.redValue());
Serial.print("Hz Green = ");
Serial.print(myCS.greenValue());
Serial.print("Hz Blue = ");
Serial.print(myCS.blueValue());
Serial.println("Hz");
delay(900);
}
1秒間隔で各色ごとの光の強さを周波数に変換しシリアルでPCに送信しています。測定前にはLED点灯させ測定対象に光をあてます。そしてその反射光を調べます。測定対象とカラーセンサの距離によって出力される周波数が変わるのを確認してみてください。
各色フィルタ毎に光の強さに対する感度が異なります。光の強さと周波数の関係は次の表のとおりです。

Irradiance responsivityの行を見てください。赤フィルタはテストコンディションがλp=640nmの場合、550Hz/(μW/cm2)の感度をもち、それ以外の場合は91~26Hz/(μW/cm2)の感度をもっています。次にOutput frequencyの行を見てください。テストコンディションがEe=34.6μW/cm2、λp=640nmの場合、出力は19kHz(typ)となっています。この出力周波数19kHz(typ)を赤フィルタの感度550Hz/(μW/cm2)で割ると、34.6μW/cm2となります。
またカラーセンサは赤外線(640nm以上)にも反応するため正確な色判定を行いたい場合、外付けの赤外線フィルタを取り付ける必要があります。
TAOS TCS230 データシート
http://www.cohsei.co.jp/PDF/taospdf/PRODUCTS/TCS230-e32.pdf
売り上げランキング: 2431



Arduinoで遊ぼう - ウォッチドッグタイマを使う
Posted by arms22 on 2009年01月25日

Arduinoでウォッチドッグタイマを使うにはavr/wdt.hをインクルードし、wdt_enable関数、wdt_reset関数を使う。
#include <avr/wdt.h>
void setup(){
wdt_enable(WDTO_2S);
}
void loop(){
do_something();
wdt_reset();
}
ウォッチドッグタイマは計時が完了したら割り込み、リセット、または割り込み+リセットを発生させる。wdt_enable関数は計時完了時にリセットを発生させる様、ウォッチドッグタイマを設定する。しかしリセットを発生させず割り込みだけ発生させるようにすれば簡易タイマとして、またウォッチドッグの割り込みはシステムをスリープから起動させる為にも使える。例によってウォッチドッグタイマを使う為のWatchdogライブラリを作成した。
ダウンロード:Watchdogライブラリ
http://xfind.hp.infoseek.co.jp/electric/arduino/Watchdog001.zip
使い方
1.Watchdogライブラリをarduino-0012/hardware/libraries/以下にコピーする。
2.新しいスケッチを作成する。
3.メニューからSketch > Import Library > Watchdogを選択する。
サンプルスケッチ:ウォッチドッグタイマ
#include <Watchdog.h>
void setup(){
Watchdog::systemResetEnable(true);
Watchdog::enable(Watchdog::TimeOut2s);
}
void loop(){
do_something();
Watchdog::timerReset();
}
サンプルスケッチ:簡易タイマ
1秒周期で繰り返しcycle1s関数が呼び出されます。
#include <Watchdog.h>
void cycle1s(void){
static bool flag = 1;
digitalWrite(13,flag);
flag = !flag;
}
void setup(void){
pinMode(13,OUTPUT);
Watchdog::attachInterrupt(cycle1s);
Watchdog::systemResetEnable(false);
Watchdog::enable(Watchdog::TimeOut1s);
}
void loop(void){
}
サンプルスケッチ:スリープからの復帰
ウォッチドッグ割り込みによりスリープ動作から復帰し、LEDを0.5秒周期で点滅させます。
#include <Watchdog.h>
#include <Sleep.h>
void setup() {
pinMode(13,OUTPUT);
Watchdog::systemResetEnable(false);
Watchdog::enable(Watchdog::TimeOut250ms);
}
void loop() {
digitalWrite(13,HIGH);
Watchdog::timerReset();
Sleep::powerDown();
digitalWrite(13,LOW);
Watchdog::timerReset();
Sleep::powerDown();
}
avr-libc: Watchdog timer handling
http://www11.ocn.ne.jp/~akibow/avr-libc-user-manual-1.4.3/group__avr__watchdog.html
-Arduinoで作る「会話」するモノたち
オライリージャパン
売り上げランキング: 56322
Arduinoで遊ぼう - digitalWrite関数をハックする
Posted by arms22 on 2009年01月25日

digitalWrite関数は指定したピンにHIGHまたLOWを出力する関数だ。Arduinoボード上に書かれているピン番号をdigitalWrite関数に指定すればそのピンの出力が変わる。
AVRマイコンのどのポートのどのビットかなんて気にしなくても、Arduinoボード上のピン番号を指定するだけでいい。AVRマイコンの違いをうまく吸収し、デジタルポートというシンプル機能を提供してくれる。
その反面、ピン1つ出力を変化させるのに1回のdigitalWrite関数の呼び出しが必要で、高速なピン制御には向かない。今回、そんなdigitalWrite関数をハックし、高速なピン制御の方法を紹介する。
まずはdigitalWrite関数の実装を見てみよう(arduino-0012/hardware/cores/arduino/wiring_digital.c)。
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
if (val == LOW) *out &= ~bit;
else *out |= bit;
}
注目すべきポイントは三つ。digitalPinToBitMask関数、digitalPinToPort関数、portOutputRegister関数だ。digitalPinToBitMask関数はピン番号をレジスタのビットマスクに、digitalPinToPort関数はピン番号をポート番号に、portOutputRegister関数はポート番号をポートレジスタのアドレスに変換する。これらの処理は一度行ってしまえばよくて、2度目以降はピン番号から得られたポートレジスタに直接書込むことで高速にピン制御を行うことができる。
実際にshiftOut関数を高速化してみた。これで3倍は速くなっているはず。
void shiftOut(uint8_t dataPin,
uint8_t clockPin,
uint8_t bitOrder,
byte val)
{
int i;
uint8_t bit_data = digitalPinToBitMask(dataPin);
uint8_t bit_clock = digitalPinToBitMask(clockPin);
volatile uint8_t *out_data = portOutputRegister(digitalPinToPort(dataPin));
volatile uint8_t *out_clock = portOutputRegister(digitalPinToPort(clockPin));
for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST){
if(val & (1 << i))
*out_data |= bit_data;
else
*out_data &= ~bit_data;
}else{
if(val & (1 << (7 - i)))
*out_data |= bit_data;
else
*out_data &= ~bit_data;
}
*out_clock |= bit_clock;
*out_clock &= ~bit_clock;
}
}
オリジナルのコード(arduino-0012/hardware/cores/arduino/wiring_shift.c)。void shiftOut(uint8_t dataPin,
uint8_t clockPin,
uint8_t bitOrder,
byte val)
{
int i;
for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
今回、紹介した高速化はArduino 012でのみ動作確認しています。012以降のバージョン、また012以前のバージョンにおいて動作するかどうかは未検証です。またdigitalWrite関数をハックし内部関数の直接呼び出しを行っています。012以降のバージョンでこれらの関数がなくなってしまう可能性もあり、著しく互換性を落としてしまう諸刃の剣であることもご理解ください。digitalPinToBitMask関数、digitalPinToPort関数、portOutputRegister関数を使うにはpins_arduino.hをインクルードする必要があります。
Arduino - DigitalWrite
http://www.arduino.cc/en/Reference/DigitalWrite
-Arduinoで作る「会話」するモノたち
オライリージャパン
売り上げランキング: 55559
Arduinoで遊ぼう - Arduinoをスリープさせる
Posted by arms22 on 2009年01月19日

Arduinoでスリープ機能を使うにはavr/sleep.hをインクルードし、set_sleep_mode関数、sleep_mode関数を使う。こんな感じ。
#include <avr/sleep.h>
void loop() {
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode(); //ここでsleep
}
このままでも特に問題ないんだけど、生のavr-gccが見えてよくない。Arduinoっぽくないのでスリープ機能を使うためのSleepライブラリを作成した。ダウンロード: Sleepライブラリ
http://xfind.hp.infoseek.co.jp/electric/arduino/Sleep001.zip
使い方
1.Sleepライブラリをarduino-0012/hardware/libraries/以下にコピー。
2.新しいスケッチを作成。
3.メニューからSketch > Import Library > Sleepを選択。
4.スリープさせたいタイミングでスリープメソッドを呼ぶ。
Sleepライブラリでサポートしているスリープメソッドは次の6つ。
メソッド | |
アイドルモード | idle |
ADCノイズ低減モード | noiseReduction |
パワーセーブモード | powerSave |
スタンバイモード | standBy |
パワーダウンモード | powerDown |
パワーダウン+外部割り込みによる復帰モード | powerDownAndWakeupExternalEvent |
各スリープ動作に於ける動作クロック範囲と復帰起動要因

サンプルスケッチ:パワーダウン+外部割り込みによる復帰
#include <Sleep.h>
void setup() {
pinMode(2,INPUT); // INT0
pinMode(13,OUTPUT); // LED
}
void loop() {
digitalWrite(13,HIGH); // sets the LED on
delay(3000); // waits for a second
digitalWrite(13,LOW);
Sleep::powerDownAndWakeupExternalEvent(0);
}
パワーダウンモードと外部割り込み(INT0)による復帰起動のサンプルを解説します。pin2は外部割り込み(INT0)の端子です。入力モードに設定します。pin13はLEDに接続されています。出力に設定します。スケッチでは起動後LEDを3秒点灯させてから、LEDを消灯し、外部割り込み(INT0)が発生するまでパワーダウンモードに入ります。外部割り込み(INT0)が発生したら復帰起動します。powerDownAndWakeupExternalEventメソッドの引数は外部割り込みの番号です。

上記スケッチ用の接続図です。pin2を10kΩ程度の抵抗でプルアップし、プッシュスイッチ経てGNDに接続します。スイッチオフ時はプルアップ抵抗によりpin2はHiになり、スイッチオン時はpin2はGNDに接続されLowになります。外部割り込み(INT0)はpin2の
サンプルスケッチ: パワーダウン+外部割り込みによる復帰
http://xfind.hp.infoseek.co.jp/electric/arduino/sketch_090115a.pde
avr-libc:
http://www11.ocn.ne.jp/~akibow/avr-libc-user-manual-1.4.3/group__avr__sleep.html
Arduino Playground - ArduinoSleepCode
http://www.arduino.cc/playground/Learning/ArduinoSleepCode
-Arduinoで作る「会話」するモノたち
オライリージャパン
売り上げランキング: 8025
Arduinoで遊ぼう - 日付と時刻を表示する
Posted by arms22 on 2009年01月18日

前回のキャラクタLCDモジュールに日付と時刻を表示させてみました。正確な時刻が必要だったり、Arduinoの電源を切った後も時刻を保持したい場合は外付けのRTC(リアルタイムクロック)を使用します。今回の実験では正確な時刻やバックアップは必要なかったので、Arduino.ccのDateTimeライブラリを使用しました。DateTimeライブラリはこちらからダウンロードできます。
DateTimeライブラリはArduinoに日付と時刻を提供するソフトウェアライブラリです。外付けのハードウェアは必要ありません。起動時に1度、外部から時刻情報を設定してやる必要があります。また1日に数秒~十数秒時間がずれます。Arduinoがリセットされれば時刻は無効になります。
使い方
1.DateTimeライブラリをarduino-0012/hardware/libraries/以下にコピーします。
※ DateTimeライブラリにはDateTimeとDateTimeString、2つのライブラリが含まれています。2つともlibrariesにコピーしてください。
※ DateTimeライブラリの使い方はサンプルスケッチを参考にしてください。
サンプルスケッチ
#include <DateTime.h>
#include <DateTimeStrings.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);
time_t prevtime;
void setup() {
prevtime = DateTime.makeTime(0,0,9,17,1,2009);
DateTime.sync(prevtime);
}
void loop() {
while( prevtime == DateTime.now() ){
delay(100);
}
DateTime.available();
digitalClockDisplay();
}
void digitalClockDisplay(){
lcd.setCursor(0,0);
lcd.print(DateTimeStrings.dayStr(DateTime.DayofWeek));
lcd.print(" ");
lcd.print(DateTimeStrings.monthStr(DateTime.Month));
lcd.print(" ");
lcd.print(DateTime.Day,DEC);
lcd.print(" ");
lcd.print(DateTime.Year+1900,DEC);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.print(DateTime.Hour,DEC);
printDigits(DateTime.Minute);
printDigits(DateTime.Second);
}
void printDigits(byte digits){
lcd.print(":");
if(digits < 10)
lcd.print('0');
lcd.print(digits,DEC);
}
setup関数で今の時間を設定します。本来パソコンなど外部機器から時刻情報を設定するのですが、今回はDateTimeライブラリのmakeTimeメソッドで時間を作成しました。時間の設定はsyncメソッドを行います。prevtimeには1970年1月1日からmakeTimeで指定した日付時刻(2009/1/17 9:00)までの経過秒数が格納されています。
loop関数では時間が更新されるのを待って、digitalClockDisplay関数でキャラクタLCDモジュールに時間情報を表示しています。
時間情報の取得はDateTimeのHour,Minute,Second,Year,Month,Dayプロパティを参照します。これらのプロパティはavailableメソッドで更新されます。
2009/01/18追記
DateTimeStringクラスのdayStrメソッド、monthStrメソッドを使えば曜日、月の英語名が得られます。DateTimeStrings.cppの次のマクロを有効にすれば長い名前が得られます。
dt_LONG_MONTH_STRINGS
dt_LONG_DAY_STRINGS
次のマクロを有効にすれば短い名前が得られます。dt_SHORT_DAY_STRINGS
dt_SHORT_MONTH_STRINGS
サンプルスケッチ: DateTime
http://xfind.hp.infoseek.co.jp/electric/arduino/sketch_090116b.pde
Arduino Playground - DateTime
http://www.arduino.cc/playground/Code/DateTime
Arduinoで遊ぼう - キャラクタLCDモジュール
http://arms22.blog91.fc2.com/blog-entry-203.html
Beagle Board関連情報まとめ
Posted by arms22 on 2009年01月13日

Beagle Boardはテキサス・インスツルメンツの戦略マーケティング担当者がボランティア・グループとともに生み出した、3インチ四方でUS$149の小型・高性能・低消費電力のシングル・ボード・コンピューター。ARM Cortex-A8ベースでTMS320C64x+ DSP(430MHz)とOpenGL ES 2.0 2D/3Dグラフィックス・プロセッサー・コアPowerVR SGX530を集積し、128MB DDR RAM、256MB NANDフラッシュ・メモリー、256KB L2 キャッシュを内蔵したOMAP3530プロセッサー(600MHz/1200 Dhrystone MIPS)を搭載している。USB 2.0 OTG、DVI-D、S-Video、MMC+/SD/SDIO、ステレオ入出力、RS-232C、JTAG、I2C、I2S、SPIなどのコネクターを備えていて、Linuxが動くという。
Genie’s Blog 3.0
http://netsynth.org/blog/?p=271=1
兎に角パワフルな組み込みLinuxボードのようです。今度、仕事でも使えるか検討してみよう。
追記2010/1/26
Redstar - Beagle Board直販
http://www.redstar.co.jp/bb.htm
Beagle Board で Linux をブートする
http://www.ibm.com/developerworks/jp/linux/library/l-beagle-board/index.html
BeagleBoard-JP
http://elinux.org/BeagleBoard-JP
Cerevo tech blog
http://tech.cerevo.com/blog/archives/tag/beagleboard
Beagle Boardの紹介から、購入、Linuxの動作まで丁寧に解説されています。とりあえずここを読んでおけば導入で躓くことはないはず。
BeagleBoard.jpのホームページ予定地
http://www.beagleboard.jp/
BeagleBoard.jp blog
http://blog.beagleboard.jp/
BeagleBoard.org
http://beagleboard.org/
本家BeagleBoardのページと日本BeagleBoardのページの予定地。日本ブログの方ではOMAP3530の3つのコア(ARM社のCortex-A8、Imagination Technologies社のPowerVR SGX 530、TI社のC64x+ & ビデオアクセラレータ(IVA2))の解説があります。
BeagleBoardでAndroidを拡張してみる
http://groups.google.co.jp/group/android-group-japan/browse_thread/thread/266881d37a70e880?pli=1
Android-Embedded-Japan: BeagleBoard
http://groups.google.co.jp/group/android-embedded-japan/browse_thread/thread/f08fbcd351e941a3
部活動録: BeagleBoard
http://lbdaberi.blogspot.com/search/label/BeagleBoard
Beagle Boardが届きました
http://www.yapan.org/diary/2009/01/beagle-boardが届きました.html
SDカードからBeagle Boardをブートする
http://www.yapan.org/diary/2009/01/sdカードからbeagle-boardをブートする.html
Ångströmを起動してみた
http://www.yapan.org/diary/2009/01/ångströmを起動してみた.html
Gainer、Funnel I/O作者の小林さんのブログ。Ångströmの起動まで一通り試されておられます。
今のところ一通り動作確認させるための情報はそろっている感じ。大まかな作業の流れは次の通り。
1.Beagle Board購入(Digi-Key)
2.必要機材購入(HDMI-DVIケーブル、シリアルケーブル)
3.ターミナルで動作確認
4.Ångström起動、動作確認
5.Android起動、動作確認(おまけ)
Beagle Boardとのシリアル接続にちょっと変わった(?)ケーブルが必要そう。電子工作している人なら簡単に自作できる。
2009/1/14追記
TIのBeagleBoardとDLP Pico Projectorで、どこでもLinux
http://jp.makezine.com/blog/2009/01/ti_beagleboard_dlp_pico_projec.html
BeagleBoardとArduinoを搭載したアイアンマンスーツ
http://jp.makezine.com/blog/2008/12/iron_man_suit_powered_by.html
画面作成からデバイス制御まで――基本機能の全容
日経BP社
売り上げランキング: 555
価格: ¥ 3,150
オライリージャパン
売り上げランキング: 849
価格: ¥ 2,310
Arduinoで遊ぼう - キャラクタLCDモジュール
Posted by arms22 on 2009年01月12日

2013/2/27
最新記事はこちら! >> ArduinoでキャラクタLCDに文字を表示させる
一年程前に共立電子デジットで買ったHD44780コンパチのキャラクタLCDモジュールをArduinoで制御してみました。Arduino 012にはLiquidCrystalというHD44780(or コンパチ)用のライブラリが含まれています。LiquidCrystalライブラリを使えば簡単にキャラクタLCDモジュールを使うことができます。
使い方
1.新しいスケッチを作成します。
2.メニューからSketch > Import Library > LiquidCrystalを選択します。
3.次のようにArduinoとキャラクタLCDモジュールを接続します。
※Arduino日本語リファレンスより。
サンプルスケッチ
#include <LiquidCrystal.h>
LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);
void setup(){
lcd.print("Hello Arduino");
}
void loop(){
}
コンストラクタにキャラクタLCDモジュールのRS、R/W、Enable、D4~7端子と接続するArduinoの端子番号を指定します。あとはprintメソッドで文字列を送信します。
キャラクタLCDモジュールは改行コードを受け取っても自動的には改行は行わないので、2行目に文字を表示する場合は、setCursorメソッドを使ってカーソルを2行目に設定してやる必要があります。
サンプルスケッチ: LiquidCrystal
http://xfind.hp.infoseek.co.jp/electric/arduino/sketch_090110a.zip
HD44780搭載キャラクタLCDモジュール
http://arms22.blog91.fc2.com/blog-entry-59.html
Arduino日本語リファレンス: LiquidCrystal
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=718
マイクロファンラボ: 文字LCDの利用
http://www.microfan.jp/arduino/clcd
Arduinoで遊ぼう - 秋月電子32x16LEDドットマトリクス(2)
Posted by arms22 on 2009年01月12日

前回の続き。今回は秋月電子のLEDドットマトリクス表示基板を3つカスケード接続して、Arduinoで制御しています。
前回リリースしたLEDドットマトリクス表示基板制御用のライブラリを更新しました。カスケード接続する表示基板の数に合わせて、ヘッダファイルの次のマクロの値を変更します。
#define AKI_MATRIX_CASCADE (1)
サンプルスケッチ
#include <AkiMatrix.h>
/*
Hello Matrix
by arms22 <http://arms22.blog91.fc2.com/>
Demonstrates the use of the AkiMatrix library
pin 0: sin1 (row)
pin 1: sin2 (led1)
pin 2: sin3 (led2)
pin 3: clk
pin 4: latch (inverted)
pin 5: strob
*/
AkiMatrix myMatrix = AkiMatrix(0,1,2,3,4,5);
void setup()
{
int x,y;
for(y=0;y<AKI_MATRIX_NUMBER_OF_ROWS;y++){
for(x=y&1;x<AKI_MATRIX_NUMBER_OF_COLS;x+=2){
myMatrix.bitWrite(x,y,HIGH);
}
}
myMatrix.setOutputEnable(true);
}
void loop()
{
myMatrix.hsync();
delay(1);
}
AkiMatrix002.zip
http://xfind.hp.infoseek.co.jp/electric/arduino/AkiMatrix002.zip
Arduinoで遊ぼう - LEDドットマトリクス
http://arms22.blog91.fc2.com/blog-entry-206.html
オライリージャパン
売り上げランキング: 3176
今年は何を作る?今何を作ってる?
Posted by arms22 on 2009年01月10日

Make: Japan:のブログの記事を読んで僕も今年何をMakeするか発表しちゃうよ!
※あきたり、面倒くさくなって途中で放り出しちゃうかもしれないけど。。
まず1つ目。電車の発車時刻を表示する電光掲示板。これは僕が専門学生のころ知り合った友人と一緒に開発しているプロジェクトだ。もっぱら最寄り駅の発車時刻を表示するだけなんだけど、こいつを沢山スタックさせて本物さながらの電光掲示板を作るのが目標なんだ。
家庭やオフィス、公共機関(病院や区役所など)にこいつがあれば、あわてて駅に走ることもなくなると思うよ。
2つ目。スターバックスの紙コップを再利用したアンプ内蔵スピーカ。去年は3つ(!)も作ったのに作り方の詳細な手順を公開できなかったので、今年はinstructablesで作り方を紹介したいと思う。もしくはスタバアンプの製作キットを作るとか。。
あと気になるところでBeagle Board。最近あちこちで話題になってます。こいつもちょこっとさわってみようと思う。
3つ目はBeagle BoardとWEBカメラを使った冷蔵庫の在庫確認システム。USBカメラとノートPCを組み合わせて作っちゃった人がいるみたいだけど、Beagle Boardを使えばもっとコンパクトで低消費電力のものが作れそうな気がする。
ここ最近のBeagle Boardの盛り上がり(Androidを移植したとか、アイアンマンのスーツとか)みてると、Arduino並に導入が簡単でソフトも簡単に作れて、使えるライブラリがいっぱい入ったBeagle Board+Arduino=Beagluinoみたいなボードの登場を予感させられる。
Make: Japan: 今年は何を作る? 今何を作ってる?
http://jp.makezine.com/blog/2009/01/not_new_years_resolutions_what_are.html
自作USBデバイスを開発したい人にオススメの本
Posted by arms22 on 2009年01月09日

自作USBデバイスを作るにあたって、参考にした本を紹介します。
※今週はあまり作業がすすまなかったので、積読本の消化にあてました。
―USBインターフェースの基礎から応用までを
豊富な設計・製作例を通して学ぶ
CQ出版
売り上げランキング: 131792
価格: ¥ 2,940
各種USBコントローラの使い方・解説、USBデバイスドライバの開発、USBデバイスの設計&製作例が沢山載っています。回路図も沢山あるので、使ってみたいUSBコントローラの回路図がすぐに役に立つと思います。USBN9602/03/04、EZ-USB SX2、EZ-USB FX2、USBホストSL811FC、FT8U232/245など。
―各種USBコントローラの使い方と
基本ソフトウェアの作成法
CQ出版
売り上げランキング: 75903
価格: ¥ 2,520
↑の本と似通った内容なのでどちらか1冊あれば十分かな。中身をみて参考にしたいコントローラの解説があるほうを選べばよい。FT232/245/2232の解説が欲しい人はこっちかな。。けどFT232はBMのほうだったり、、BMのほうはシンクロナスビットバンモードが使えません。
技術評論社
売り上げランキング: 59279
価格: ¥ 2,814
PICで作ることが決まっているならこれ!本書ではUSBフレームワーク、USB関連レジスタの説明・使い方が丁寧に解説されています。本書で解説されているUSBフレームワークのバージョンは1.1です。最新のUSBフレームワークのバージョンは2.0。バージョン2.0ではファイル構成が大きく変わっていますが、コード自体それほど変わっていなさそうなので、本書の解説は役に立ちます。
なんでも作っちゃう、かもストア: USB関連書籍
http://astore.amazon.co.jp/nandemotukuty-22?_encoding=UTF8&node=29
なんでも作っちゃう、かも。: 自作USBデバイス
http://arms22.blog91.fc2.com/blog-category-24.html
なんでも作ってみたい人にオススメの本-Make:
Posted by arms22 on 2009年01月06日

冬休みの間に読もうと思ってまとめて買っておいた「Make: Technology on Your Time」。まとまった時間がとりづらくてじっくり読めていないけど、とりあえず全部よんだ。気になったプロジェクトがいくつかあったので、作ってみたいリストに加えておいた。
1つ目は、Vol 05の服の色に合わせて色が変わるペンダント。
ケース製作が大変そうだけど、LilyPad Arduinoを使えばそれなりに見栄えがするものができそう。あと共立電子で売っているLEDランプ型GaAs系太陽電池と組み合わせれば電池レスにできるかもしれない。
2つ目は、Vol 04の風力発電機。
発電用のモータの入手と設置場所が最大の課題だけど作ってみたい。まずは自転車に取り付けられる小型の風力発電機を作ってLEDライトをつける所から始めようかな。
電子工作をはじめて「なにを作ったらいいのかわからない人」、「とりあえずなんでも作ってみたいって人」はMake:のプロジェクトを真似するところからはじめると楽しいと思うよ。
Arduinoで遊ぼう - 秋月電子32x16LEDドットマトリクス
Posted by arms22 on 2009年01月03日

秋月電子の32x16LEDドットマトリクス表示基板をArduino Duemilanoveで制御してみました。制御プログラムはArduino IDEで使えるようライブラリにしています。AkiMatrix001.zipを下記URLからダウンロードし、ご自由にお使いください。
LEDドットマトリクス表示基板の回路図です。表示基板上にはシフトレジスタ(74VHC595)2つ、トランジスタアレイ(TD62783)2つ、16bit定電流LEDドライバ(TB62706)2つが実装されています。表示基板はSIN1、SIN2、SIN3、CLOCK、LATCH、STROBEの6つの信号を使って制御します。
ライブラリの使い方
1.AkiMatrix001.zipを展開し、arduino-0012/hardware/librariesにコピーしてください。
2.Arduino IEDを起動し、メニューからSketch > Import Library > AkiMatrixを選択してください。
サンプルスケッチ
#include <AkiMatrix.h>
const uint8_t hello_tbl[][8] = {
{9,9,201,47,233,41,201,0},
{0,20,148,85,84,84,148,0},
{0,0,1,2,2,2,1,0},
{0,0,0,0,0,0,0,0},
};
const uint8_t the2009_tbl[][8] = {
{0,0,0,0,0,0,0,0},
{0,192,32,0,192,32,224,0},
{0,24,165,165,164,164,25,0},
{0,99,148,148,228,132,99,0},
};
/*
pin 0: sin1 (row)
pin 1: sin2 (led1)
pin 2: sin3 (led2)
pin 3: clk
pin 4: latch (inverted)
pin 5: strob
*/
AkiMatrix myMatrix = AkiMatrix(0,1,2,3,4,5);
void setup()
{
myMatrix.bitBlt( 0,0,hello_tbl[0],8,8);
myMatrix.bitBlt( 8,0,hello_tbl[1],8,8);
myMatrix.bitBlt(16,0,hello_tbl[2],8,8);
myMatrix.bitBlt(24,0,hello_tbl[3],8,8);
myMatrix.bitBlt( 0,8,the2009_tbl[0],8,8);
myMatrix.bitBlt( 8,8,the2009_tbl[1],8,8);
myMatrix.bitBlt(16,8,the2009_tbl[2],8,8);
myMatrix.bitBlt(24,8,the2009_tbl[3],8,8);
myMatrix.setOutputEnable(true);
}
void loop()
{
myMatrix.hsync();
delay(1);
}
コンストラクタには表示基板制御用の端子を6つ(SIN1、SIN2、SIN3、CLOCK、LATCH、STROBE)指定します。setup関数で表示するパターンを書き込みます。ver001ではbitBlt関数、bitWrite関数をサポートしています。bitBlt関数はまとまったデータの書き込みに、bitWrite関数はドット1つ1つ指定してデータを書き込みます。マトリクスの座標系は左上原点です。
bitmapのフォーマットは次の通り。

setOutputEnable関数でマトリックスの表示を有効にします。
loop関数ではhsync関数を繰り返し呼び出す必要があります。hsync関数を1回呼び出す毎に1行分のデータをシフトレジスタに転送します。
AkiMatrix001
http://xfind.hp.infoseek.co.jp/electric/arduino/AkiMatrix001.zip
サンプルスケッチ: Hello 2009
http://xfind.hp.infoseek.co.jp/electric/arduino/sketch_081230a.zip
Arduinoで遊ぼう - フルカラーLED
http://arms22.blog91.fc2.com/blog-entry-196.html
Arduino - LibraryTutorial
http://arduino.cc/en/Hacking/LibraryTutorial