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

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

振動モータ搭載のバグ的な何か

Posted by arms22 on 2010年01月24日 0  0

只の思いつきでこんなものを作ってしまった。

振動モータ搭載のバグ的な何か

一定時間が経過すると振動モータがぶるぶるして、居眠りを防止してくれる。

振動モータ搭載のバグ的な何か

フルカラーLEDが緑からオレンジ、赤へと変わるとブルブルと振動する。

振動モータ搭載のバグ的な何か

傾けると振動が停止し、カウンタがリセットされる。






Arduinoで遊ぼう - SDメモリカードを読み書きする(廃止)

Posted by arms22 on 2010年01月23日 23  0

2013/2/20
この記事の内容は古く廃止予定です。最新のArduinoに対応した記事を公開しています。
下記リンクから参照してください。
ArduinoでSDメモリカードを読み書きする



SDカードシールド

次のプロジェクトで大容量の記憶領域が必要になったのでSDメモリカードの読み書きに挑戦しました。写真は超薄型基板で作ったシールドにヒロセのSDメモリカードスロット「DM1A」を載せた自作のSDメモリカードシールドです。カードスロットのピンピッチは2.54mmより狭いけど、少しづつずらしてやるとうまく半田付けできました。


接続する



sd-arduino-connections_brd.png

sd-arduino-connections_sch.png


※2010/1/25 追記
SDメモリカードの端子は斜めになった角から9,1,2,3,4,5,6,7,8となっています。

※2010/1/26 追記
回路図が間違っていたのを修正しました。

ArduinoとSDメモリカードは次のように接続します。
10番 --> CS(1)
11番 --> DI(2)
12番 <-- DO(7)
13番 --> SCLK(5)
SDメモリカードの動作電圧は2.7~3.6Vです。5V動作のArduinoで使用する場合、電圧を下げる必要があります。10 -> CS、11 -> DI、13 -> SCKの間に分圧用の抵抗を挿入します。抵抗値は1.5KΩと3.3KΩぐらい。VDDとVSSの間には0.1uFの積セラを挿入します。

※トップの写真では3.3V動作のArduino Proを使用しているため、分圧用の抵抗を省略しています。
※Ethernet Shieldと併用する場合、10番端子はEthernet Shieldが使用しているため、CSを別の端子に接続する必要があります。


ライブラリをインストールする


Arduino用のSDメモリカードライブラリを検索すると、Wave Shield用のライブラリやSparkFunのマイクロSDメモリカードシールド用のライブラリが見つかった。これらはRoland RiegelさんのMMC/SD/SDHCカードライブラリをベースに作られているようす。そのまま使ってもいいけど、機能が限定されていたり、使いづらそうだったのオリジナルのRoland RiegelさんのライブラリにArduinoっぽいラッパークラスを作ってそれを使うことにした。

FatFs library for Arduino based roland riegel's MMC/SD/SDHC card library
http://arms22.googlecode.com/files/FatFs001.zip
http://arms22.googlecode.com/files/FatFs002.zip
http://code.google.com/p/arms22/downloads/detail?name=FatFs-003.zip

追記2010/1/26
データを書き込んだSDメモリカードがPCで読めない不具合を修正しました。

ダウンロードして解凍したフォルダを~/Documents/Arduino/librariesフォルダにコピーしてください。librariesフォルダがない場合は新規作成してください。

※FatFsライブラリはルート直下のファイルの読み書きと、同時に1ファイルの読み書きにのみ対応しています。これらの制限を解除したい場合、fat_config.hを変更して下さい。
※ライトプロテクト、カード検出には対応していません。これらの制限を解除したい場合、sd_raw_config.hを変更して下さい。
※FAT12でフォーマットしたカードは認識しません。

サンプルスケッチ


まずは書き込み。FatFs.initialize()でライブラリを初期化、カードをマウントします。FatFs.createFile()で新しいファイル「analog.txt」をルートディレクトリに作成します。すでにファイルがある場合は作成しません。

ファイルの読み書きはFileクラスを通して行います。open()でファイルを開きます。1秒毎にアナログ端子0番の値をファイルに書き込みます。FileクラスはPrintインターフェースを実装しているのでprint()、println()が使えます。

#include <FatFs.h>

const char file_name[] = "analog.txt";
File file;

void setup()
{
  delay(1000);

  if(FatFs.initialize()){
    FatFs.createFile(file_name);
  }
  else{
    while(1);
  }
}

void loop()
{
  if(file.open(file_name)){
    file.seekToEnd();
    file.println(analogRead(0));
    file.close();
  }
  delay(1000);
}


#if FAT_DATETIME_SUPPORT
void get_datetime(uint16_t* year, uint8_t* month, uint8_t* day, uint8_t* hour, uint8_t* min, uint8_t* sec)
{
  *year = 2010;
  *month = 1;
  *day = 23;
  *hour = 9;
  *min = 0;
  *sec = 0;
}
#endif

ファイルの更新日時を書き込みたい場合は、fat_config.hを次のように変更し、get_datetime()を実装します。
#define FAT_DATETIME_SUPPORT 1

次は読み込み。FatFs.initialize()で初期化、SDメモリカードをマウントし「analog.txt」を開きます。read()で32バイトづつ読み出し、Serial.print()でパソコンに送信します。

#include <FatFs.h>

File file;

void setup()
{
  Serial.begin(9600);

  delay(1000);

  if(FatFs.initialize()){
    if(file.open("analog.txt")){
      char buf[32];
      int sz;
      while((sz = file.read((uint8_t*)buf, sizeof(buf))) > 0){
        for(int i=0; i<sz; i++){
          Serial.print(buf[i]);
        }
      }
      file.close();
    }else{
      Serial.println("can not open.");
    }
  }
  else{
    Serial.println("can not initialize.");
    while(1);
  }
}

void loop()
{
}

※ATmega168を搭載したArduinoを使う場合、書き込みの機能はオフにします。ATmega168はRAMが1Kしかないため、SerialライブラリとFatFsライブラリを同時に使うには書き込みの機能をオフにする必要があります。sd_raw_config.hを次のように変更してください。
#define SD_RAW_WRITE_SUPPORT 0





MMC/SD/SDHC card library
http://ladyada.net/make/waveshield/download.html

厚さ0.4mmの超薄型ユニバーサル基板
http://arms22.blog91.fc2.com/blog-entry-292.html

ELM - MMCの使いかた
http://elm-chan.org/docs/mmc/mmc.html

ELM - FATファイルシステム・モジュール
http://elm-chan.org/fsw/ff/00index_j.html


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




Kingston 2GB microSDカード SDC/2GB 永久保証
キングストンテクノロジー (2008-07-01)
売り上げランキング: 202

Arduinoで遊ぼう - Arduinoブートローダ互換ボード

Posted by arms22 on 2010年01月17日 2  0

Arduinoのブートローダ互換機をいくつか作ってみました。Arduino ProとArduino LilyPadの回路を参考にATmega168マイコンに6ピンヘッダとリセット端子のプルアップ100KΩ抵抗といくつかのコンデンサ(0.1uF)を実装しただけの簡単な回路です。クリスタルは使わず内蔵RC発信器で動かします。
スケッチのアップロードには「FT232RL使用USB~シリアルアダプタ5V」を使います。

IMGP4357.jpg

IMGP4361.jpg

実態配線図



arduino_clone.png


ブートローダの書き込み


内蔵RC発信器を使うのでヒューズビットを次のように設定します。avrdudeは未実装ビットを'0'として扱うので、efuseへ書き込む値は"0x00"としています。
efuse 0x00(0xF8)
hfuse 0xDD
lfuse 0xE2

ブートローダはArduino Pro 8MHz用を使います(LilyPad用ブートローダはスケッチが動き出すまでに10秒ほど待たされる)。ブートローダの詳しい書き込み手順は下記URLを参照してください。
$ sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext
$ avrdude -c diecimila -P ft0 -p m168 -B 4800 -e
$ avrdude -c diecimila -P ft0 -p m168 -B 4800 -U efuse:w:0x00:m -U hfuse:w:0xdd:m -U lfuse:w:0xe2:m
$ avrdude -c diecimila -P ft0 -p m168 -U flash:w:"/Applications/Arduino.app/Contents/Resources/Java/hardware/bootloaders/atmega/ATmegaBOOT_168_pro_8MHz.hex":i
$ avrdude -c diecimila -P ft0 -p m168 -B 4800 -U lock:w:0x0f:m
$ sudo kextload /System/Library/Extensions/FTDIUSBSerialDriver.kext



Arduinoで遊ぼう - AVRライタを使わないBootloaderの書き込み(2)
http://arms22.blog91.fc2.com/blog-entry-286.html

厚さ0.4mmの超薄型ユニバーサル基板

Posted by arms22 on 2010年01月17日 0  0

IMGP4326.jpg
Amazon.co.jpから厚さ0.4mm、幅230mm、高さ320mmの超薄型ユニバーサル基板が届きました。基板一枚だけなのにこの箱の大きさです。基板が200枚くらい入っているんじゃないかと思いました。

IMGP4335.jpg
ペラペラです。カッターで何回か切れ目を入れると簡単に切れます。

IMGP4349.jpg
Arduino Pro用のシールドを作ってみました。こんな風にちょっと複雑な形の基板も簡単に作れます。

IMGP4348.jpg
8X8ドットマトリクスの裏側にぴったりサイズの基板を作ってみました。三角形や五角形、六角形の基板も簡単に作れそうです。

IMGP4346.jpg
ATmega168と6ピンヘッダを載せればArduino互換機の完成です。


1枚(A4サイズ)¥2,835と少し高いですが、小さな基板をいくつも買うことを考えるとそれほど高くない気もします。


ユニバーサル基板(黒) 超薄型t=0.4mm  230x320mm
プリント基板センターPB
売り上げランキング: 37338


Arduinoとニキシー管で24クロックを作る(2)

Posted by arms22 on 2010年01月12日 0  0

nixie_pcb_fritzing.jpg
FRITZING FABで製造してもらったニキシー管制御基板に部品を実装しました。回路図と基板図は次のURLからダウンロードできます。

NIXIE-TUBE CONTROL DRIVER SHIELD FOR ARDUINO
http://fritzing.org/projects/nixi-tube-control-driver-shield-for-arduino/

電流制限用の抵抗をカソード側からアノード側に変更しました。カソード側に抵抗を入れていると、ニキシー管のオフ時間が長くなると考えたからです。波形を見ていないのでカソード側からアノード側に変えたことで、オフ時間が短くなっているかどうかはわかりません。。

nixie_with_case.jpg

スチレンボードを使って外装を作りました。高さを60mmにした所、どんくさすぎると指摘されてしまいました。。外装はもう少し高さを下げて作り直すことにします。

nixie_in_dark.jpg

電気を消すとニキシー管も十分明るく眩しすぎるくらいなので、周囲の明るさに応じて輝度を下げる回路を組み込もうかと考えています


Arduinoとニキシー管で24クロックを作る
http://arms22.blog91.fc2.com/blog-entry-279.html

Mapleが届いた。

Posted by arms22 on 2010年01月11日 7  0

ARMベースのArduino互換ボード、Maple

ARMベースのArduino互換ボード、Mapleがやっと届いた。早速、開発環境を構築しようと思ったけど、ソフトウェアは自分でコンパイルしないとだめみたい。
arm-none-eabiのコンパイルにTex環境が必要で、1GBのファイルのダウンロードにめげてしばらく放置確定しました。。有志の方がOSX向けにコンパイル済みソフトウェアを配布してくれるのをしばらくまちます。。


追記 2010/1/13
Tex環境ははCodeSourceryのToolchainを使わなければ必要ないようです。gcc、binutils、newlib、gdbを個別にダウンロードしたところ、うまくコンパイルできました。次のURLで公開されているシェルスクリプトを使うと、ダウンロードからコンパイルまで一括して行うことができます。事前にMacPortsなどでgmp、mfpr、libiconvはインストールしておきます。

追記2010/1/28
Leaflabsのリポジトリにarm-none-eabiのバイナリがアップされた。リポジトリから最新バージョンを取得すれば、コンパイルまでできた。けど、dfu-utilでエラーが起きてファームウェアのアップロードに失敗する。
まだまだ先は長そう。。

Building an ARM Cortex-M3 toolchain
http://openmulticopter.org/wiki/Building_an_ARM_Cortex-M3_toolchain

Arduinoで遊ぼう - JPEGカメラで撮った写真をTwitPicにポストする

Posted by arms22 on 2010年01月09日 1  0

JPEGカメラモジュール+イーサーネットシールド /w Arduino
TwitPicに画像をポストするライブラリの応用編。JPEGカメラモジュールで撮った写真を直接TwitPicにポストしてみるよ。

接続する



c328r_2led_1sw.png
今回、JPEGカメラモジュールとの通信にはソフトウェアシリアルを使わず、ハードウェアシリアルを使います。ArduinoのTX、RX端子にJPEGカメラモジュールを接続します。JPEGカメラモジュールが接続されているとスケッチのアップロードに失敗するので、スケッチをアップロードする時はJPEGカメラモジュールを外して下さい。

ハードウェアシリアルをJPEGカメラモジュールとの通信に利用した為、処理中のメッセージを表示することができなくなりました。処理中を表すLEDとエラーを表すLEDを追加します。処理中は青色LED(digital 6番)を点灯させ、エラーが発生した場合(ポストに失敗など)には赤色LED(digital 5番)を点灯させます。

シャッターボタンをdigital 4番に接続します。ditital 4番の内蔵プルアップ機能を有効にします。スイッチを押した時のLOWレベルを検知して写真を撮影し、TwitPicにポストします。


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


次のライブラリをダウンロードし、Arduinoのlibrariesフォルダにコピーしてください(~/Documents/Arduino/libraries)。

画像サイズを取得できるよう改造したカメラライブラリ(CameraC328R)
http://arms22.googlecode.com/files/CameraC328R_002.zip

TwitPic-003.zip
http://code.google.com/p/arms22/downloads/detail?name=TwitPic-003.zip
TwitPicライブラリ
http://arms22.googlecode.com/files/TwitPic_002.zip


Arduiniana - NewSoftSerial
http://arduiniana.org/libraries/newsoftserial/


スケッチ


EthernetとSerialを初期化した後、シャッターボタンが押されるの待ちます。シャッターボタンのLOWレベルを検出したらJPEGカメラモジュールとの通信を開始し、スナップショットコマンドを送ります。
撮影に成功したら撮影した画像のサイズを取得し(camera.getJPEGPictureSize)、TwitPicへ画像のアップロードを開始します(twitpic.upload)。
upload関数に指定したc328rImageTransfer関数がコールされたら、撮影した画像の取得を開始します(camera.getJPEGPictureData)。撮影した1枚の画像はJPEGカメラモジュールから分割して送られてきます。分割された画像データが届く度にgetJPEGPicture_callbackがコールされるので、client->write関数を使ってTwitPicに分割された画像データを送信します。


#include <Ethernet.h>
#include <TwitPic.h>
#include <CameraC328R.h>
#include <NewSoftSerial.h>

#define SNAPSHOT     4
#define ERROR_LED    5
#define PROGRESS_LED 6

#define CAMERA_BAUD 57600

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };

TwitPic twitpic("Yourname","Password");

CameraC328R camera;

uint16_t pictureSize = 0;
Client *targetClient;

/**
 * This callback is called EVERY time a JPEG data packet is received.
 */
void getJPEGPicture_callback( uint16_t pictureSize, uint16_t packageSize, uint16_t packageCount, byte* package )
{
  targetClient->write(package,packageSize);
}

uint32_t c328rImageTransfer(Client *client)
{
  if(client){
    targetClient = client;
    camera.getJPEGPictureData( &getJPEGPicture_callback );
  }
  return pictureSize;
}

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin( CAMERA_BAUD );

  pinMode( PROGRESS_LED, OUTPUT );
  digitalWrite( PROGRESS_LED, HIGH );

  pinMode( ERROR_LED, OUTPUT );
  digitalWrite( ERROR_LED, HIGH );

  pinMode( SNAPSHOT, INPUT );
  digitalWrite( SNAPSHOT, HIGH ); // pull-up

  delay(10000);

  digitalWrite( PROGRESS_LED, LOW );
  digitalWrite( ERROR_LED, LOW );
}

void loop()
{
  do {
    if( digitalRead(SNAPSHOT) == LOW ){

      digitalWrite( PROGRESS_LED, HIGH );
      digitalWrite( ERROR_LED, LOW );

      if( !camera.sync() ){
        goto camera_error;
      }

      if( !camera.initial( CameraC328R::CT_JPEG, CameraC328R::PR_160x120, CameraC328R::JR_640x480 ) ){
        goto camera_error;
      }

      if( !camera.setPackageSize( 64 ) ){
        goto camera_error;
      }

      if( !camera.setLightFrequency( CameraC328R::FT_50Hz ) ){
        goto camera_error;    
      }

      if( !camera.snapshot( CameraC328R::ST_COMPRESSED, 0 ) ){
        goto camera_error;    
      }

      pictureSize = 0;
      if( !camera.getJPEGPictureSize( CameraC328R::PT_SNAPSHOT, PROCESS_DELAY, pictureSize) ){
        goto camera_error;    
      }

      if(twitpic.upload(&c328rImageTransfer) < 0){
        goto camera_error;
      }

      camera.powerOff();
      break;

camera_error:
      digitalWrite( ERROR_LED, HIGH );
    }

    digitalWrite( PROGRESS_LED, LOW );
    delay(100);
  }
  while(0);
}




Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ(OAuth対応)
http://arms22.blog91.fc2.com/blog-entry-354.html
Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ
http://arms22.blog91.fc2.com/blog-entry-287.html


Arduinoで遊ぼう - JPEGカメラモジュールで写真を撮る
http://arms22.blog91.fc2.com/blog-entry-261.html



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



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



16セグメントLEDディスプレイ(2)

Posted by arms22 on 2010年01月04日 2  0

16セグメントLED基板表

例の16セグメントLEDを2つ並べると結構でかい。裏側に制御用の回路、マイコンを含めてすべて収まりそう。

16セグメントLED基板裏

やってみた。
マイコンはATmega168、LEDの制御にTLC5940を使った。ATmega168はArduinoブートローダを書き込み済み。USBシリアルアダプタを使ってスケッチを書き込むことができる。

ハンダ面に部品を実装すると、足の配置が逆さまにならないので半田作業がずいぶん楽になった。ワイヤのハンダ付けは、まず片方だけ半田付けして、もう片方は基板の上を這わして長さを合わせてからカット→半田付けすると良い。


16セグメントLEDディスプレイ
http://arms22.blog91.fc2.com/blog-entry-278.html


Arduinoで遊ぼう - TwitPicに画像をポストするライブラリ

Posted by arms22 on 2010年01月02日 6  0

Twitter上で画像を共有するサービス「TwitPic」にArduinoから画像をポストするライブラリを作ったよ!ArduinoからTwitterにつぶやきをポストするライブラリはあったけど、画像をポストするライブラリはなかったでしょ?

JPEGカメラモジュールと組み合わせれば定点観測カメラなんかも簡単に作ることができるよ!ご利用は計画的にね!

追記2010/1/5
そうそうArduinoをインターネットに接続するにはイーサネット・シールドが必要だよ。

Arduinoと接続する



JPEGカメラモジュール接続図

Arduinoで遊ぼう - JPEGカメラモジュールで写真を撮る
http://arms22.blog91.fc2.com/blog-entry-261.html

ライブラリをダウンロードする


TwitPicライブラリ
http://arms22.googlecode.com/files/TwitPic_001.zip
http://arms22.googlecode.com/files/TwitPic_002.zip

ダウンロード+解凍してできたTwitPicフォルダをArduinoフォルダのHardware/librariesにコピーしてください。Mac用のArduino IDEでバージョンが0017以上の場合~/Documents/Arduino/librariesにTwitPicフォルダをコピーしてください。librariesフォルダがない場合は新規作成してください。


サンプルスケッチ


サンプルを実行させると次のような画像とメッセージをポストするよ。
※IPアドレスやMACアドレスはあなたの環境に合わせて変更してください。

twitpic_sample_shot.png


#include <Ethernet.h>
#include <TwitPic.h>
#include "SampleImage.h"

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };

TwitPic twitpic("Yourname","Password");

uint32_t sampleImageTransfer(Client *client)
{
  if(client){
    for(uint32_t i=0; i<sizeof(sampleImage); i++){
      client->print(pgm_read_byte(sampleImage+i));
    }
  }
  return sizeof(sampleImage);
}

void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(3000);

  int ret = twitpic.uploadAndPost("Sample Image Post from Arduino", &sampleImageTransfer);
  if(ret < 0){
    Serial.print("post failed : err code = ");
    Serial.println(ret);
  }
  else{
    Serial.println("OK.");
  }
}

void loop()
{
}


Ethernet.hとTwitPic.hをインクルードします。あなたの環境にあわせてMACアドレス、IPアドレスを変更します。TwitPicクラスのインスタンスを作成します。この時、あなたのTwitterIDとパスワードを指定します。setup関数でEthernetライブラリの初期化を行います。

画像のポストにはuploadAndPost関数またはupload関数を使います。uploadAndPost関数はTLにメッセージを流しますが、upload関数は画像のポストのみ行います。

uploadAndPost関数の第1引数にはポストするメッセージ、第2引数には画像を転送するユーザ関数のポインタを渡します。

ユーザ関数は2つの機能をライブラリに提供する必要があります。1つは転送する画像サイズをライブラリに通知すること、もう1つは画像の転送を行うことです。

ライブラリは最初に引数0を渡しユーザ関数を呼び出します。この時ユーザ関数はこれから転送する画像のサイズを返します。次に引数にClientクラスのポインタを渡して呼び出します。この時ユーザ関数はClientクラスを使って画像を転送します。

画像の転送が完了しポストに成功したらuploadAndPost関数は0を返します。失敗した場合、負の値を返します。-1は致命的なエラー。-1001はTwitterIDまたはパスワードが無効です。-1002は画像が見つかりません。-1003は無効な画像タイプです。-1004は画像サイズが4MB以上です。

今のところこのライブラリはJPEG画像のポストにしか対応していません。



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



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






該当の記事は見つかりませんでした。