なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

Arduino IDEでブートローダの書き込みエラー(avrdude: stk500v2_recv_mk2: error in USB receive)

Posted by arms22 on 2015年08月23日 0  0

IMGP0984
ブートローダ書き込み用アダプタとAVRISP-MKIIのクローン(FRISK USBTiny MkII

Arduino IDEバージョン1.6.5(以下、Arduino 1.6.5)を使ってATmega328pにArduinoのブートローダの書き込み(ツール→ブートローダを書き込む)を行うと下記エラーが発生する。

avrdude: stk500v2_recv_mk2: error in USB receive

LUFAベースのAVRISP-MKIIとArduino 1.6.5に内包されているavrdudeバージョン6.0.1の組み合わせでこのエラーが発生する。AVRFREAKSのフォーラムで関連する投稿を見つけた。

LUFA based AVRISP-MKII doesn't work with avrdude 6.0.1
http://www.avrfreaks.net/forum/lufa-based-avrisp-mkii-doesnt-work-avrdude-601

Arduino 1.0.6を使うと正常に書き込むことができる。Arduino 1.0.6に内包されているavrdudeバージョン5.11ではこの問題は発生しないようなので、暫くは1.0.6と1.6.5を使い分ける必要があるようだ。

Arduinoで光学式マウスのCMOSセンサーを乗っ取って移動距離を計測する

Posted by arms22 on 2015年01月07日 1  0

IMGP0612

昨年末の話。勤務先の大掃除の日にいらなくなった光学式マウスを頂戴してきたので、マウスに内蔵されているCMOSセンサーを使って移動距離を計測する実験を行いました。この記事ではArduinoを使ってセンサーから座標を取得し、マウスの移動した距離をシリアルモニタに出力する方法を紹介します。

IMGP0601

写真はマウスを分解したところ(マウスの型番はFMU−HOP1-PW)。真ん中の8本足のICが今回の主役CMOSマウスセンサー「PAN3101」。PAN3101はDSPを内蔵したローコストの光学式マウスセンサーの1つで、ICに内蔵されたCMOSカメラで机やマウスパッドの表面を連続して撮影し、その映像から移動方向や距離を測定します。シリアルインターフェースを通してレジスタの値を読むことで現在のX/Y座標を知ることができます。PAN3101の横の細長いICはUSBインターフェースだと思います。

PAN3101の仕様

  • 電源:4.75V〜5.5V
  • システムクロック:18.432MHz
  • 速度:21インチ/秒
  • 解像度:400 or 800カウント/インチ
  • フレームレート:3000fps
  • 動作電流:10mA(移動中)、5mA(停止)、100uA(パワーダウン)
  • インターフェース:2線式シリアル
※CMOSカメラの画素数は不明。
※このICはカメラ映像を抜き出すことはできない様子。

IMGP0598

IMGP0597

ICの裏側にピンホールが開いていてプラスチック製のレンズが取り付けられている。


ハードウェア


IMGP0617

USB ICとマウスセンサの間のSCLK/SDIOのパターンをカットしSCLK/SDIOにワイヤに接続します。USBケーブルが接続されていたスルーホールをArduinoとの中継ポイントとして利用するためUSB ICに接続されているD+/D-のパターンもカットします。

次のようにArduinoと接続します。PAN3101のピン割り当てはデータシートを参照してください。
マウス to Arduino
VDD(7) 5V
SCLK(4) 2番
SDIO(3) 3番
GND(6) GND

ライブラリ


幸いにもArduino用のライブラリを見つけることができました。OptiMouseはPAN3101以外にAgilentのADNS-2051・ADNS-2083・ADNS-2610に対応しています。

OptiMouse
https://github.com/zapmaker/OptiMouse


スケッチ


//使用するデバイスに合わせてインクルードするヘッダファイルを選択すること
#include "PAN3101.h"
// #include "ADNS2051.h"
// #include "ADNS2610.h"
// #include "ADNS2620.h"
// #include "ADNS2083.h"

//ピン割り当て
#define SCLK 2
#define SDIO 3

//PAN3101デバイス作成
PAN3101 Optical1 = PAN3101(SCLK, SDIO);
// ADNS2051 Optical1 = ADNS2051(SCLK, SDIO);
// ADNS2610 Optical1 = ADNS2610(SCLK, SDIO);
// ADNS2620 Optical1 = ADNS2620(SCLK, SDIO);
// ADNS2083 Optical1 = ADNS2083(SCLK, SDIO);

//マウスの現在値
signed long x = 0;
signed long y = 0;

void setup()
{
  //シリアルポートを初期化
  Serial.begin(38400);
  //マウスセンサ初期化
  Optical1.begin();
}

void loop()
{
  signed char tx, ty;

  //最後のモーションステータスを取得(PAN3101とADNS2051のみ対応)
  //Optical1.updateStatus();

  //注意事項
  //updateStatusコマンドを使う場合、
  //PAN3101.hのDelta_Yを0x18に、Delta_Xを0x17に変更すること。

  //モーションステータスビットがセットされていれば
  //if (Optical1.motion())
  {
    //dX/dYレジスタを読み出して現在値に加算する
    //dX/dYレジスタには前回読み出してからの相対値が格納されている
    //dX/dYレジスタは8bit(-127〜128)なのでオーバーフローする前に読み出すこと
    tx = Optical1.dx();
    x += tx;
    ty = Optical1.dy();
    y += ty;

    //dX/dYレジスタに値がセットされていれば
    if (tx || ty)
    {
      //現在値をmmに変換してシリアルポートに出力する
      Serial.print("x=");
      Serial.print((25.4 * (float)x) / 800.0);
      Serial.print("mm y=");
      Serial.print((25.4 * (float)y) / 800.0);
      Serial.println("mm");
    }
  }
}
スケッチをアップロードしシリアルモニタを開くとマウスの移動した距離が次のように出力されます。
x=46.99mm y=5.11mm
x=47.05mm y=5.02mm
x=47.05mm y=4.95mm
x=47.09mm y=4.86mm
x=47.12mm y=4.79mm
x=47.15mm y=4.70mm
x=47.15mm y=4.64mm
x=47.18mm y=4.57mm
x=47.18mm y=4.54mm
x=47.21mm y=4.51mm
今回使用したマウスは2007年頃の製品で同じICを使ったマウスを手に入れるのは難しいと思います。けれども安いマウスはどれも同じようなセンサーを使っていると思うので取りあえず光学式マウスを見つけたらバラしてICの型番を確認してみてください。そしてGoogleで検索すればきっと対応するライブラリが見つかると思います。

参考リンク


PAN3101
http://www.pixart.com.tw/upload/PAN3101_V10_20051121170653.pdf

Interfacing an optical mouse sensor to your Arduino
http://www.martijnthe.nl/2009/07/interfacing-an-optical-mouse-sensor-to-your-arduino/


↓最近は青色LEDを採用した光学式マウスが主流になってきているみたいですね。

iBUFFALO 有線BlueLEDマウス Mサイズ レッド BSMBU16MRD
バッファロー (2013-06-28)
売り上げランキング: 745


↓いわゆるPCゲーマー向けのマウスは高速・高解像度のセンサを搭載したモデルが多いようです。こいつも1度バラしてみたい。

LOGICOOL ゲーミングマウス G300r
ロジクール (2013-04-19)
売り上げランキング: 83

Arduinoと音声合成ICでしゃべる温度湿度計

Posted by arms22 on 2014年11月27日 0  0

久しぶりのArduinoネタです。Arduinoと音声合成IC「AquesTalk pico」を使ってしゃべる温度湿度計を製作しました。

IMGP0189

LCDは使わずボタンを押すと音声で温度と湿度を通知するという仕組みにしてみました。取りあえず動作確認用にブレッドボードに組んで余っていたMDF板に固定。



動いている様子。若干語尾が聞き取り辛いですが「22.0度、70%なり」と言っています。


ハードウェア・回路図



しゃべる温度湿度計回路図

メイン基板はArduino Duemilanove、音声合成ICにATP3010、温度湿度センサはSHT11、スピーカ駆動に秋月のD級アンプモジュールを使用しています。

ArduinoとATP3010はI2Cで接続します。ATP3010の4番端子を10K抵抗でプルダウンさせることでI2Cで通信ができます。SCL/SDAは10K抵抗でプルアップします。ATP30xxは声種が異なるものがいくつか販売されており、外部クロックが不要なICもあります。その場合16MHzの発振子は接続不要です。

SHT11はI2Cのような通信方式を採用していますが互換性がありません。Arduinoの2番にDATA、3番にCLKを接続します。DATAは10K抵抗でプルアップします。

回路図上ではD級アンプモジュールは省略しています。可変抵抗の出力端子をアンプモジュールのIN+に接続し、IN-はGNDに接続します。


ライブラリ


Arduino用 音声合成LSIライブラリ
http://blog-yama.a-quest.com/?eid=970151

Arduino Playground - Bounce
http://playground.arduino.cc/Code/Bounce

Arduinoで遊ぼう - デジタル温度・湿度センサー「SHT11」
http://arms22.blog91.fc2.com/blog-entry-489.html

Sleepライブラリ - github
https://github.com/arms22/Sleep


スケッチ



#include <AquesTalk.h>
#include <Wire.h>
#include <Sensirion.h>
#include <Bounce2.h>
#include <Sleep.h>

// 端子定義
const uint8_t dataPin = 2;
const uint8_t clockPin = 3;
const uint8_t speakPin = 6;

// 温度・湿度・露点温度格納用変数
float temperature;
float humidity;
float dewpoint;

// SHT1xデバイス
Sensirion tempSensor = Sensirion(dataPin, clockPin);

// 音声合成デバイス
AquesTalk atp;

// 発声ボタン
Bounce spkbtn;

void setup()
{
  // シリアルポート初期化
  Serial.begin(9600);

  // ボタン初期化
  pinMode(speakPin, INPUT);
  spkbtn.attach(speakPin);
  spkbtn.interval(20);
}

void loop()
{
  String str;

  spkbtn.update();

  if(spkbtn.fell())
  {
    // 温度・湿度・露点温度を計測し、変数に格納する
    tempSensor.measure(&temperature, &humidity, &dewpoint);

    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.print(" C, Humidity: ");
    Serial.print(humidity);
    Serial.print(" %, Dewpoint: ");
    Serial.print(dewpoint);
    Serial.println(" C");

    str = "<NUMK VAL=" + String(temperature, 1) + " COUNTER=do> ";
    str+= "<NUMK VAL=" + String((int)humidity) + " COUNTER=pa-se'nto>nari";
    Serial.println(str);

    // 発声開始
    atp.Synthe((const char*)&str[0]);

    // 自己発熱で精度が落ちないよう十分な時間を待って次の計測を行うこと(4秒以上)
  }

  sleep(10);
}



PAM8012使用2ワットD級アンプモジュール
http://akizukidenshi.com/catalog/g/gK-08217/

音声合成LSI ATP3011F4-PU(かわいい系の女声)
http://akizukidenshi.com/catalog/g/gI-05665/

音声合成LSI 「AquesTalk pico LSI」
http://www.a-quest.com/products/aquestalkpicolsi.html

Dotsduino(ドッツデュイーノ)ケース

Posted by arms22 on 2013年11月09日 0  0

Dotsduinoケース

Maker Faireのレポート記事でも書きましたが、DotsduinoケースのモデルデータをThingiverseにアップしました。以前にDotsduinoのキットを買ったよ〜って方は3Dプリンターで出力してみてください。3Dプリンターを持ってない人は3Dプリンターを持っている友人・知人を探してプリントしてみてください。

このデータはABSでプリントすることを前提に内径を少し大きくしています。PLAでプリントした場合、マトリクスのはめ合いが少し緩いかもしれません。その場合はテープなどをマトリクスの周りに1〜2周貼ってはめ合いを調整してください。

Dotsduino Case by arms22 - Thingiverse
http://www.thingiverse.com/thing:177871

Arduinoで遊ぼう - OAuthを使って安全につぶやくライブラリ「Stewitter」

Posted by arms22 on 2013年07月07日 45  1

2013年7月7日 StewitterライブラリがStewgate Uに対応しました。StewGate SG-1は7月末でサービス終了します。Stewitterライブラリをお使いの方はライブラリを更新し、トークンを新しく取得し直してください。

2012年1月15日 StewitterライブラリがArduino 1.0に対応しました。それに合わせてサンプルスケッチを書きなおしました。

イントロダクション



ArduinoからTwitterにつぶやくライブラリ「Stewitter」を作りました。OAuth認証をArduinoで実装するのは大変なので、OAuth認証を肩代りしてくれるプロキシ「StewGate U」を使ってTwitterへメッセージをポストします。

stewgate-u-log.png

StewGate U: Throw your stuff into the stewittering pot.
http://stewgate-u.appspot.com/

StewGateはアクセンス・テクノロジーのギークが作ってくれたサービスです。

株式会社アクセンス・テクノロジー - StewGate
http://omake.accense.com/wiki/StewGate


トークンを取得する


StewGateを使ってつぶやくときはユーザ名とパスワードの替わりにトークンを使います。トークンは次の手順で取得します。
  1. StewGateのページからTwitterにログインします。
  2. "連携アプリを認証"ボタンを押します。
  3. StewGateのページに戻ったらダッシュボードに移動します。
  4. ダッシュボードに移動するとトークンが表示されます。

トークンをクリックすると簡単な使い方が表示されます。
http://stewgate-u.appspot.com/api/post/

POSTデータ:
_t = 76856766df853e490ee3db911610f10e

msg = "あなたの送信したいメッセージ"
* UTF-8、URLエンコード済みにしてください。
* メッセージに "%(name)s" を含めると、トークンの名前に置換されます。


応答:
OK (ポスト成功)
エラーメッセージ (ポスト失敗)
"_t="の後のアルファベットと数字の部分がトークンなのでメモしておきましょう。
76856766df853e490ee3db911610f10e



Stewitterライブラリのインストール


次のURLからStewitterライブラリをダウンロードしてください。Arduino IDEを起動しメニューからスケッチ→ライブラリを使用→Add Library…を選択してください。

https://dl.dropboxusercontent.com/u/14188987/arduino/libraries/Stewitter.zip

またArduino 1.0.4以前をお使いの場合はZIPファイルを解凍し、Arduinoのライブラリフォルダ(~/Documents/Arduino/libraries)に直接コピーしてください。ライブラリフォルダがない場合は作成してください。

このライブラリはNeoCatさんのTwitterライブラリをベースに作成しました。

ArduinoからTwitterにPOSTするライブラリ
http://d.hatena.ne.jp/NeoCat/20090505/1241466723


サンプルスケッチ1:メッセージを送信


#include <SPI.h>
#include <Ethernet.h>
#include <Stewitter.h>

// MACアドレス
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// "YourToken"をあなたのトークンで書き換えてください。
Stewitter twitter("YourToken");

// メッセージ(日本語もOK)
char msg[] = "こんにちは世界!私はアルデュイーノ!";

void setup()
{
  delay(1000);

  Ethernet.begin(mac);

  Serial.begin(9600);
  Serial.println("connecting ...");
  
  // twitterに接続して、メッセージを送信
  if (twitter.post(msg)) {
    // 完了を待つ
    int status = twitter.wait();
    // status が 200なら正常に完了
    if (status == 200) {
      // レスポンスを表示
      Serial.println(twitter.response());
    } 
    else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } 
  else {
    Serial.println("connection failed.");
  }
}

void loop()
{
}


サンプルスケッチ2:最後のメンションを取得する


#include <SPI.h>
#include <Ethernet.h>
#include <Stewitter.h>

// MACアドレス
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// "YourToken"をあなたのトークンで書き換えてください。
Stewitter twitter("YourToken");

void setup()
{
  delay(1000);

  Ethernet.begin(mac);

  Serial.begin(9600);
  Serial.println("connecting ...");

  // twitterに接続して、 最後のメンション(@yourname の入ったメッセージ)を取得
  if (twitter.lastMention()) {
    // 完了を待つ
    int status = twitter.wait();
    // status が 200なら正常に完了
    if (status == 200) {
      // 最後のメンションを表示
      // ex) 20100111082341|874453678|whosaysni|@yourname whats up?
      Serial.println(twitter.response());
    } 
    else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } 
  else {
    Serial.println("connection failed.");
  }
}

void loop()
{
}



Arduinoをはじめようキット
スイッチサイエンス
売り上げランキング: 709


Arduino イーサネットシールド
スイッチサイエンス
売り上げランキング: 14,505


Arduino電力計 - 一日の消費電力を表示させる

Posted by arms22 on 2013年06月23日 7  0

目次

  1. Arduino電力計 - プロトタイプ
  2. Arduino電力計 - 回路図とスケッチ
  3. Arduino電力計 - サージ対策
  4. Arduino電力計 - Pachubeにデータをアップロードする
  5. Arduino電力計 - ケースに組み込む
  6. Arduino電力計 - 2系統対応の回路図とスケッチ
  7. Arduino電力計 - 分電盤に接続
  8. Arduino電力計 - 一日の消費電力を表示させる



IMGP8552

Arduino電力計のスケッチを改良して、一日の消費電力を表示できるようにしたよ。表面のスイッチで表示を切り替えれるようにしてある。スイッチは両面テープで固定した。雑ですみません。。

IMGP8553

ついでに過去8日分の消費電力も表示させたよ。これで1週間の消費電力のパターンが分かるはず。できれば時間帯別の消費電力も表示させたいところ。というのも家の電気料金メニューは利用時間帯で電気代が大きく異なるからね。朝10時から17時までの間は電気代が特に高くなるので、この時間はなるべく消費電力を抑えたい。

一日の消費電力の表示に対応したスケッチはこちら。

Download: Watt meter /w Arduino
https://code.google.com/p/arms22/downloads/detail?name=watt_meter-1.1.zip

ArduinoでキャラクタLCDに文字を表示させる

Posted by arms22 on 2013年02月27日 6  0

IMGP7702

Arduino IDE標準のLiquidCrystalライブラリを使ってLCDを制御する方法を解説します。このライブラリは日立のHD44780ドライバと互換性のあるLCDを制御することができます。電子部品屋さんでよく見かけるほとんどのLCDはHD44780ドライバ互換なので、このライブラリが使えます。


Arduinoに接続する



今回、秋月電子の超小型LCDキャラクタモジュールを使いました。このLCDはピン配置が変則的で「14,13,12…3,2,1,16,15」と並んでいます。データシートをよく確認して間違えないよう接続してください。

可変抵抗はLCDのコントラストを調整する為に使います。可変抵抗の真ん中のピンをLCDのVOピンに接続します。LCDに何も文字が表示されない場合は抵抗の値を調整してください。

Arduino-LCD

LCD vs Arduino
RS - ピン2
RW - GND
E - ピン3
DB4 - ピン4
DB5 - ピン5
DB6 - ピン6
DB7 - ピン7

RWピンは読み込みモードと書き込みモードを切り替えます。LCDからデータやレジスタ値を読み出す場合に使用しますが滅多に使いません。GNDに接続しておくと書き込みモードになります。

LCDにはRS,E,RW,D4〜D7の7ピンを使う4ビットモードとRS,E,RW,D0〜D7の11ピンを使う8ビットモードの2つのモードがあります。8ビットモードは4ビットモードに比べてデータ転送速度が倍になります。しかし低速なマイコンでは転送速度を上げてもあまりメリットがありません。4ビットモードを使った方が使用するピン数が減らせてワイヤリングの手間も省けるので良いでしょう。


LCDシールドキットを使う


ワイヤリングが面倒になったらLCDシールドキットを使うことをおススメします。ちょっとした文字の表示やデバッグ作業に便利なシールドです。

IMGP7705

スイッチサイエンス - LCDシールドキット
http://www.switch-science.com/products/detail.php?product_id=724


ライブラリのインポート


Arduino IDE標準のLiquidCrystalライブラリを使います。ファイルメニューから"スケッチ→ライブラリを使用→LiquidCrystal"を選ぶと自動的にインポートされます。

Arduino - LiquidCrystal Library
http://arduino.cc/en/Reference/LiquidCrystal


サンプルスケッチ


文字と数値を表示するサンプルです。begin()でキャラクタLCDの文字数と行数を指定します。print()で文字・数値を表示します。改行は無視されるので、2行目に文字を表示したい場合はsetCursor()でカーソル位置を設定します。

#include <LiquidCrystal.h>

// 接続ピンをして指定してライブラリを初期化
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

//LCDシールドキット
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // 行と列を設定
  lcd.begin(16, 2);
  // メッセージを表示
  lcd.print("Hello, Arduino!");
  // 3秒待つ
  delay(3000);
}

void loop() {
  // カーソル位置を2行目に設定
  lcd.setCursor(0, 1);
  // リセットしてからの秒数を表示
  lcd.print((float)millis() / 1000.0, 1);
  // 100ms待つ
  delay(100);
}



LCDシールドキット(青)
LCDシールドキット(青)
posted with amazlet at 13.02.22
スイッチサイエンス
売り上げランキング: 10,427


Arduinoでガジェットを作ろう!―たのしい電子工作
高橋 隆雄
秀和システム
売り上げランキング: 54,023


たのしい電子工作 Arduinoで電子工作をはじめよう!
高橋 隆雄
秀和システム
売り上げランキング: 12,603

ArduinoでSDメモリカードを読み書きする

Posted by arms22 on 2013年02月20日 28  0

IMGP7671

以前公開した「Arduinoで遊ぼう - SDメモリカードを読み書きする」の内容が古くなっていたので、新しく書き直しました。今回はArduino IDE標準のSDライブラリを使ってSDメモリカードを読み書きする方法を解説します。

最近のSDメモリカードは1GBを超える容量のものが非常に安価に発売されています。SDライブラリを使えばArduinoからも簡単に読み書きできるので、大規模なデータロギングに最適なストレージと言えます。


注意すべきこと



SDメモリカードの動作電圧は2.7~3.6Vです。SDカードにもよりますが書き込み時に電流は、100mAを超えて流れるものがあります。SDカードの電源は十分な容量を確保してください。

また5V動作のArduinoでSDメモリカードを使用する場合、Arduinoの出力電圧を5Vから3.3Vに変換する必要があります。今回、抵抗による分圧回路を使っていますが、信号がナマってしまってうまく通信できない場合があります。このような場合、電圧の変換には5Vトレラント機能が付いたバッファIC(74LVX245または74VHC125)や専用IC(2電源レベルシフタ)を使うことをお勧めします。

SDメモリカードには次の3種類の規格があります。
  • SD - 最大2GB。FAT12・FAT16ファイルシステムを使用。
  • SDHC - 2GB〜32GBまで。FAT32ファイルシステムを使用。
  • SDXC - 32GB〜2TBまで。exFATファイルシステムを使用。
SDライブラリはSDとSDHCのみ対応しており、SDXCの読み書きはできません。またファイルシステムはFAT16とFAT32に対応しています。FAT12やexFATでフォーマットされたカードの読み書きはできません。


ピン配列


次の図はSDメモリカードとmicroSDメモリカードのピン配列を表しています。

SD-pinout

SD端子microSD端子機能説明
91DAT2未使用
12DAT3/CSチップセレクト
23CMD/DIデータ入力
3VSSグランド
44VDD電源
55CLKシリアルクロック
66VSSグランド
77DAT0/D0データ出力
88DAT1未使用

SDカードにはSDモードとSPIモードとよばれる2つのモードがあります。SDモードはSDカードの速度を最大限にいかした転送を行うモードです。SPIモードはCS/DI/CLK/DOの4つの端子を使った転送モードです。低速なマイコンとの通信に使われます。SDライブラリはSPIモードでSDカードにアクセスします。


Arduinoに接続する


SDメモリカードとの接続にはサンハヤトのmicroSD変換基板を使いました。変換基板が手に入らない場合は、SDカードアダプタ(micorSD-SD)にヘッダピンやワイヤを直接半田付けすると良いでしょう。電圧変換には抵抗分圧回路を使いました。抵抗値は1.8KΩと3.3KΩ。
Arduino-SD-connection

Arduino vs SDメモリカード
ピン11 - DI (MOSI)
ピン12 - DO (MISO)
ピン13 - CLK (SCK)
ピン4 - CS


シールドを使ってArduinoに接続する


もっとお手軽・簡単に使いたい場合は、SDメモリカードスロットを搭載したシールドを使うと良いでしょう。例えば、イーサネットシールドワイヤレスSDシールドマイクロSDシールドなどです。これらのシールドには電圧変換用にバッファICなどが使われています。
シールドによってSDカードのCSに接続されているピンが異なるので注意すること。

IMGP7680
Arduino イーサネットシールド R3
CS -> 4


arduino-wireless-shield-sd
ワイヤレスSDシールド
CS -> 4


sparkfun-sd-shield
SparkFun マイクロSDシールド
CS -> 8



SDライブラリのインポート


Arduino IDE標準のSDライブラリを使います。ファイルメニューから"スケッチ→ライブラリを使用→SD"を選ぶと自動的にインポートされます。

Arduino - SD Library
http://arduino.cc/en/Reference/SD

Arduino IDE 1.0.x以降では、複数ファイルの読み書きが同時に行えるようになりました。

SDライブラリにはいくつか制限があります。
  • ファイル名は8文字+3文字までです。例えば「filename.txt」はOKですが、「filename_2013.text」はNGです。
  • ファイルシステムはFAT16またはFAT32のみ対応しています。
  • SDとSDHCのみ対応しています。SDXCは非対応です。


サンプルスケッチ(書き込み)


1秒間隔でアナログ入力0の値を読み取り、SDカードに書き込むサンプルです。

SD.open() の引数に FILE_WRITE を指定するとファイルを読み書きモードでオープンします。ファイルが存在しない場合は新しいファイルが作成され、すでにファイルが存在する場合は追記モードでオープンします。

print() や println() で数値や文字が書き込めます。バイナリデータを書き込む場合は、write() を使います。書き込み速度は一度に沢山のデータを書き込んだ方が速くなります。seek(0) でファイルの先頭からデータを書き込めます。

#include <SD.h>

// この値は使用しているシールドや基板に合わせて変更すること。たとえば、
// イーサーネットシールドは 4
// Adafruit のSDシールドは 10
// Sparkfun のSDシールドは 8
const int chipSelect = 4;

void setup()
{
  // シリアルポート初期化
  Serial.begin(9600);
  while (!Serial) {
    ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。
  }

  Serial.print(F("Initializing SD card..."));

  // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。
  // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。
  pinMode(SS, OUTPUT);

  // SDライブラリを初期化
  if (!SD.begin(chipSelect)) {
    Serial.println(F("Card failed, or not present"));
    // 失敗、何もしない
    while(1);
  }
  Serial.println(F("ok."));

  // 日付と時刻を返す関数を登録
  SdFile::dateTimeCallback( &dateTime );
}

void loop()
{
  // ファイルを開く
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // もしファイルが開けたら値を書き込む
  if (dataFile) {
    int value = analogRead(0);
    dataFile.println(value);
    dataFile.close();
    // シリアルポートにも出力
    Serial.println(value);
  }
  // ファイルが開けなかったらエラーを出力
  else {
    Serial.println(F("error opening datalog.txt"));
  } 

  // 一秒待つ
  delay(1000);
}

void dateTime(uint16_t* date, uint16_t* time)
{
  uint16_t year = 2013;
  uint8_t month = 2, day = 3, hour = 9, minute = 0, second = 0;

  // GPSやRTCから日付と時間を取得
  // FAT_DATEマクロでフィールドを埋めて日付を返す
  *date = FAT_DATE(year, month, day);

  // FAT_TIMEマクロでフィールドを埋めて時間を返す
  *time = FAT_TIME(hour, minute, second);
}

次のように日時を返す関数を登録することで、ファイルの作成日時や変更日時が記録できます。

  // 日付と時刻を返す関数を登録
  SdFile::dateTimeCallback( &dateTime );


サンプルスケッチ(読み込み)


ファイルに書き込まれている値をシリアルモニタに出力するサンプルスケッチです。

SD.open() の引数を省略すると読み込み専用モードでオープンします。引数を省略した場合は FILE_READ を指定したことと同じになります。

available() は現在の位置から何バイト読み込めるか返します。available() の戻り値は int 型で読み込めるバイト数が32767を超える場合、戻り値は常に32767になります。ファイルのサイズは size() で取得できます。

read() は1byte読み出します。read(buffer, length) とした場合、lengthバイト分のデータをbufferに読み込みます。

position() は現在の読み込み位置を返します。seek() で読み込み位置を移動できます。

#include <SD.h>

// この値は使用しているシールドや基板に合わせて変更すること。たとえば、
// イーサーネットシールドは 4
// Adafruit のSDシールドは 10
// Sparkfun のSDシールドは 8
const int chipSelect = 4;

void setup()
{
  // シリアルポート初期化
  Serial.begin(9600);
  while (!Serial) {
    ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。
  }

  Serial.print(F("Initializing SD card..."));

  // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。
  // そうしないとSPIがスレーブモードに移行し、SDライブラリが動作しなくなります。
  pinMode(SS, OUTPUT);

  // SDライブラリを初期化
  if (!SD.begin(chipSelect)) {
    Serial.println(F("Card failed, or not present"));
    // 失敗、何もしない
    while(1);
  }
  Serial.println(F("ok."));

  // ファイルを開く
  File dataFile = SD.open("datalog.txt");

  // もしファイルが開けたら値をシリアルポートに出力する
  if (dataFile) {
    // 64byte単位で読み出す
    byte buffer[64];
    while (dataFile.available()) {
      int length = dataFile.available();
      if(length > 64){
        length = 64;
      }
      dataFile.read(buffer, length);
      Serial.write(buffer, length);
    }
    // 1byte単位で読み出す
    // while (dataFile.available()) {
    // Serial.write(dataFile.read());
    // }
    dataFile.close();
  }
  // ファイルが開けなかったらエラーを出力する
  else {
    Serial.println(F("error opening datalog.txt"));
  }
}

void loop()
{
}


参考リンク


SDメモリカード - Wikipedia
http://ja.wikipedia.org/wiki/SDSDメモリカード

ArduinoでマイクロSDカードを使う - ラジオペンチ
http://radiopench.blog96.fc2.com/blog-entry-332.html




Arduino ワイヤレスSDシールド
スイッチサイエンス
売り上げランキング: 71,943




Dotsduino(ドッツデュイーノ)ハンダづけ

Posted by arms22 on 2013年02月18日 6  0

2013/2/18
Dotsduinoバージョン2.0に合わせてはんだづけ手順を更新しました。


目次


イントロダクション



Dotsduinoのはんだづけの手順を解説します。Dotsduinoにはいくつかのバージョン(1.2と2.0)がありますが、はんだづけの手順はほとんど同じです。

バージョン1.2では内蔵発振器を使っていたため、スケッチのアップロードに時々失敗することがありました。バージョン2.0からはセラミック発振子を採用し、スケッチのアップロードに失敗しないようになりました。

バージョン2.0ではセラミック発振子をはんだづけを忘れないでください。セラミック発振子のはんづけを忘れると、マイコンが動作せず、スケッチのアップロードに失敗してしまいます。


部品リスト


まずは足りない部品がないか確認しましょう。

IC1ATmega328P1個
R1カーボン抵抗 10KΩ1個
R2~R9カーボン抵抗 100Ω8個
C1~C3積層セラミックコンデンサ 0.1uF3個
ピンヘッダ 6ピン1個
8x8ドットLEDマトリクス1個
Dotsduino基板1枚
U1セラミック発振子 8MHz※11個

※1...セラミック発振子はバージョン2.0のみ付属します。バージョン1.2では内蔵発信器を使用しているのでセラミック発振子は付属しません。


ハンダづけ(バージョン1.2)


まずは背の低い部品=カーボン抵抗からハンダづけします。R1は10KΩ、R2~R9は100Ωです。R1のみ10KΩですので間違えずハンダづけしましょう。
Dotsduino v1.2

次にICとコンデンサ、ピンヘッダをハンダづけします。ICの向きに注意しましょう。写真右側にICの凹みがくるようにしてはんだづけします。スケッチを書き換えるつもりの人はこの段階で、スケッチを書き込めるか確認しましょう。
バージョン2.0をご購入の方はセラミック発振子のはんだづけを行ってからスケッチの書き換えを行ってください。
Dotsduino v1.2

ドットマトリクスのハンダづけの前に、ドットマトリクスの4辺のうち、凹んだ2辺の内側の凸をカッターナイフで切り取ります。こうすることでDotsduino基板がドットマトリクスの内側にすっぽり収まるようになります。
Dotsduino v1.2

最後にドットマトリクスをハンダづけします。ドットマトリクスはDotsduino基板の裏側に描かれたシルクと向きを合わせてハンダづけしましょう。
Dotsduino v1.2

Dotsduino v1.2


ハンダづけ(バージョン2.0)


はんだづけの手順はバージョン1.2とほとんど同じです。

IMGP7711

セラミック発振子のはんだづけを忘れずに!
IMGP7713

IMGP7718


以上で完成です!
IMGP7719

Dotsduino(ドッツデュイーノ)のスケッチと回路図

Posted by arms22 on 2013年02月18日 29  1

2015/4/18 デモ用スケッチで新しいBounceライブラリを使った時にコンパイルエラーが発生する問題を修正しました。
2013/6/19 Dotsライブラリに点灯パターンが反転する不具合が見つかりました。6/18以前のライブラリをお使いの方は新しいバージョンをダウンロードしてお使いください。
2013/2/18 過去のバージョンの組立説明書と回路図を追加しました。

目次


イントロダクション


Dotsduino

Dotsduino(ドッツデュイーノ)の組立説明書と回路図、ライブラリとサンプルスケッチを公開します。

Dotsduino組み立てキット説明書-1.2c.pdf
Dotsduino組み立てキット説明書-1.2d.pdf
Dotsduino組み立てキット説明書-1.2e.pdf
Dotsduino組み立てキット説明書-2.0a.pdf


回路図


dotsduino-v2.0b
Dotsduinoはその名通り、Arduino互換機として作られています。ArduinoシリーズだとArduino Pro 8MHz 3.3Vが一番近い回路構成になっています。Dotsduinoは電池駆動を想定しているので電圧レギュレータは搭載していません。凡そ2.7V~5Vの範囲で動作します。スケッチの書き込みには別途USBシリアルアダプタが必要です。

dotsduino-v1.2c.pdf
dotsduino-v1.2d.pdf
dotsduino-v1.2e.pdf
dotsduino-v2.0a.pdf
dotsduino-v2.0b.pdf


Arduino Software


Dotsduinoのソフトウェア(スケッチ)はArduino Softwareを使用して作成します。DotsduinoはArduino互換機として動作するので、Arduinoのスケッチがそのまま動作します。Arduinoソフトウェアはバージョン1.0以降をお使いください。Arduinoソフトウェアは以下のURLからダウンロードできます。

Download the Arduino Software
http://arduino.cc/en/Main/Software


Dotsライブラリ


Dotsduinoに搭載されている8x8LEDドットマトリクスをダイナミック点灯する為のライブラリ「Dots」を用意しました。ライブラリにはサンプルスケッチ(ハートとかインベーダなど)が含まれています。これらサンプルを少し修正することで好きなパターンを表示させることができます。

Dotsライブラリ
https://github.com/arms22/Dots/archive/master.zip
https://dl.dropbox.com/u/14188987/Products/Dots/Dots.zip

ライブラリはArduinoのスケッチブックディレクトリ(Macは"ユーザ名/Documents/Arduino/"、Windowsは"ユーザ名¥My Documents¥Arduino¥")のlibrariesディレクトリにコピーしてください。


サンプルスケッチ


Dotsライブラリには次のサンプルスケッチが含まれています。
  • Dotsduinoデモ(dotsduino_demo)
  • フリップ(flip_animation)
  • ♥ビート(heartbeat)
  • Hello Matrix(hello_matrix)
  • インベーダー(inverder)
  • インベーダーUFO(inverder_ufo)
  • インベーダーカニ(inverder_kani)
  • スクロール(scroll_animation)
  • 波(wave_animation)
"ファイル→スケッチの例→Dots"からサンプルスケッチを開けます。パターンを変更したい場合はベースとなるサンプルを開いて、全文コピーし、新しいスケッチに貼付けてください。

Dotsduinoデモを書き込む場合は、Bounceライブラリをあらかじめインストールしておいてください。

Arduino Playground - Bounce
http://playground.arduino.cc/code/bounce


アップロード


スケッチを作成したらアップロードします。USBシリアルアダプタをDotsduinoに接続します。コネクタの向きに注意してください。DotsduinoとUSBシリアルアダプタのコネクタ部分に書かれている文字が一致するよう差し込んでください。
"ツール→マイコンボード"から"Arduino Pro or Pro Mini (3.3V 8MHz) /w ATmega328"を選択してください。次に"ツール→シリアルポート"からUSBシリアルアダプタのポートを選択します。最後に"マイコンボードに書き込む"ボタンを押して、アップロードします。


おまけ


dotsduino実態配線図

ユニバーサル基板で作ってみたい人は↑の実態配線図を参考にしてください。キットと違って電流制限用の抵抗は省略しています。


参考リンク


Arduino 日本語リファレンス
http://www.musashinodenpa.com/arduino/ref/

Arduinoチュートリアル 基礎編
http://www.musashinodenpa.com/arduino/ref/index.php?f=2



超薄型 両面 ユニバーサル基板(黒)  t=0.4mm  230x320mm 金フラッシュ
プリント基板センターPB
売り上げランキング: 62497


Arduinoをはじめよう
Arduinoをはじめよう
posted with amazlet at 10.11.22
Massimo Banzi
オライリージャパン
売り上げランキング: 4059


Arduino Uno
Arduino Uno
posted with amazlet at 10.11.22
スイッチサイエンス
売り上げランキング: 10189

このカテゴリーに該当する記事はありません。