にほんブログ村 その他趣味ブログ 電子工作へ

2011年02月06日

Arduino で SPI

モッパーです。

しばらくアップし忘れていた記事です。

Arduino で SPI(Serial Peripheral Interface) 通信をするライブラリやスケッチでスレーブ(slave)側をサポートしているものが少ないので、例を公開しておきます。あちこちから拾ったコードの寄せ合わせです。


以下、SPI.cpp

#include "WProgram.h"
#include "SPI.h"

#define SPI_DONTCARE (0x00)
unsigned char theByte = SPI_DONTCARE;

// init as SPI-Master
void SPI_MASTER_Init(void) {
pinMode(SPI_SCK,OUTPUT);
pinMode(SPI_MOSI,OUTPUT);
pinMode(SPI_MISO,INPUT);
pinMode(SPI_SS1,OUTPUT);
pinMode(SPI_SS2,OUTPUT);

// INIT interface, Master, set clock rate
// SPI2X SPR1 SPR0
//   0    0    0    f/4 = 4Mhz
//   0    0    1    f/16 = 1Mhz
//   0    1    0    f/64 = 250Khz
//   0    1    1    f/128 = 125Khz
//   1    0    0    f/2 = 8Mhz
//   1    0    1    f/8 = 2Mhz
//   1    1    0    f/32 = 500Khz
//   1    1    1    f/64 = 250Khz

SPCR = (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(1<<SPR0);
// enable double rate
SPSR = (0<<SPI2X); 
}

void SPI_SLAVE_Init(void) {
pinMode(SPI_SCK,INPUT);
pinMode(SPI_MOSI,INPUT);
pinMode(SPI_MISO,OUTPUT);
pinMode(SPI_SS,INPUT);

// INIT interface, Slave, set clock rate
// SPI2X SPR1 SPR0
//   0    0    0    f/4 = 4Mhz
//   0    0    1    f/16 = 1Mhz
//   0    1    0    f/64 = 250Khz
//   0    1    1    f/128 = 125Khz
//   1    0    0    f/2 = 8Mhz
//   1    0    1    f/8 = 2Mhz
//   1    1    0    f/32 = 500Khz
//   1    1    1    f/64 = 250Khz

SPCR = (1<<SPE)|(0<<SPR1)|(1<<SPR0);
// enable double rate
SPSR = (0<<SPI2X); // we will now gain fck/2 instead of fck/4
}

unsigned char SPI_ReadWrite(unsigned char data) {
// set data to send into SPI data register
SPDR = data;
// Wait for transmission complete
while(!(SPSR & (1<<SPIF)));
// return data read from SPI (if any)
return SPDR;
}


以下、SPI.h

#define SPI_SCK 13
#define SPI_MISO 12
#define SPI_MOSI 11
#define SPI_SS  10
#define SPI_SS1 10
#define SPI_SS2 9

void SPI_MASTER_Init(void);
void SPI_SLAVE_Init(void);
unsigned char SPI_ReadWrite(unsigned char data);

 
posted by モッパー at 18:17| Comment(14) | TrackBack(0) | Arduino

2010年12月13日

Ethernet Shield

モッパーです。


Arduino の Ethernet Shield 手に入れて遊んでます。これは RCJ とは関係ない私のプロジェクトです。


目的は 10 年前くらいに作って、いまだに我が家の玄関を焦電型赤外線センサーで監視して treva で撮影した画像を携帯に送り続けてくれているコントローラ君の置き換えです。


このコントローラ君、このようなプロジェクトに10年ほど前にちょっとだけ参加した結果作成したものです。8 bit マイコンに ipv6 スタックの実装と java でのネットワークアプリケーションプラットフォームを構築するという、当時では結構驚愕の野心的なプロジェクトでした。
問題は i-mode からの web アクセスで、i-mode は IP パケットの送り方が少〜し変態(RFC からするとOKなんですけど)で、このコントローラ君の TCP/IP スタックが受け付けてくれないことでした。i-mode からの web アクセスによるアプリケーション上の設定変更が出来ず、出先でメールの送信の可否等のコントロールが出来ないので今でも苦労しています。

Arduino については SMTP メール送信は成功例が少ないようですが私は特定のサーバーとユーザー/パスワードを固定出来れば Authorization をスルーしてメール送信出来るところまで確認出来ました。従って、上記コントローラ君とほぼ同等のことが出来るであろうところまで確認済みです。全部成功すれば、セキュリティー面を除いて情報を公開しようと思います。
ただし、最も大きな問題はArduino君 も上記コントローラ君とほぼ同じ拒否反応を i-mode からの web アクセスに対しては示していることです。どなたか、i-mode からの http プロトコルによる Arduino へのアクセスに成功した方はいらっしゃいますでしょうか ? (他力本願....)


RCJ な方にはお答えを期待出来ない領域の質問だと思います。通りすがりの方でも良いので、情報を気長に待ちます。

posted by モッパー at 23:45| Comment(2) | TrackBack(0) | Arduino

2010年11月01日

MODKIT

モッパーです。

H でも Arduino プログラミング出来る GUI ベースの開発環境無いかな...と探し回ったところ、MODKITを発見。まだ alpha 版で誰かに紹介してもらわないと使えないようですが、完成してさらに日本語化されれば、RCJ の仲間たちにとって強力なツールになりそうです。今年の H の活動には間に合いそうにないので残念...
posted by モッパー at 22:37| Comment(4) | TrackBack(0) | Arduino

2010年10月02日

Arduino IDE 0020

モッパーです。

N が Arduino で編集出来ないと騒いでいるので見てみると、確かにタブを画面の幅分使い切ってファイルが選択出来なくなってしまってます。右上の矢印を押して選択しようにも .h と .cpp のファイル名が同じだと選択出来ません。
またも開発環境移行しなきゃか... と思いつつ Arduino のホームページを見に行くと見慣れないロゴとボード(Arduino Uno)が出現しています。もしやと思い IDE のダウンロードページを見ると 0020 がアップされていたのでダウンロードしてみると... 後者の問題が解決されていました !!!
posted by モッパー at 16:08| Comment(0) | TrackBack(0) | Arduino

2010年09月24日

Arduino nano や mini は丸ピンが基本?

モッパーです。
これまた、あちこちのサイトに既出のことではありますが、RCJな方々がハマらないように書いておきます。 Arduino nano や mini のように Arduino の基板の端のスルーホール(簡単に言うと穴!!!)にピンヘッダ等を半田付けしてブレッドボードや自作基板に接続するタイプのものはご親切に標準ピンヘッダ(ロープロファイルじゃないという意味で)が付属しているものがあります。
でも、ピンヘッダを使うと自作基板等から Arduino の基板までの高さが無駄に高くなり、非効率な空間が生まれます。丸ピンのヘッダとソケットを使うと IC 並みに低く実装出来ますので、そのほうが良いようです。
当方は Arduino nano にご親切なピンヘッダを半田付けした後でこのことに気付きましたので、N君と一緒に飽きるほどシュポンシュポン半田吸い取り機やるハメに陥りました。ご注意下さい。
posted by モッパー at 23:01| Comment(0) | TrackBack(0) | Arduino

2010年09月20日

コンパイル関連その1

モッパーです。

Arduino のコンパイルに関する備忘録です。
結果的にはあちこちのサイトに情報があるものですが、少なくとも私は検索でヒットするために結構苦労したのでキーワードを付けて公開しておきます。
Arduino IDE はある種のプリプロセッサで、Arduino 言語を C++ のソースコードに変換してから gcc でコンパイルします。C や C++ になじんだ方にとって、文法の定義が曖昧な Arduino 言語から変換された C++ のソースコードを見たほうが分かりやすいこともあると思います。ただし、Arduino IDE 0018 は変換の結果を見るためにはちょっと普通では思いつかない手順が必要です。

  • \Documents and Settings\ユーザー名\Application Data\Arduino\preferences.txtを編集して build.path=build という行を追加します。
  • Arduino IDE をインストールしたフォルダに build というフォルダを作成します。
  • コンパイルすると build の下に .cpp や .o が作成されます。Arduino IDE を終了すると消えてしまいます。
本当は .s とかもみれればもっと安心出来るんですけど、Arduino IDE の make の理屈(どの makefile を使っているのか、オプション等の書き換え可能なのか...) がまだ分かりません。Arduino IDE でコンパイルする時に SHIFT キー押しながらやると詳細なコマンドが表示されますが、これを見て自分で makefile 作れということなのかな... どなたかご存知なら教えて下さい。(他力本願...)
posted by モッパー at 21:05| Comment(2) | TrackBack(0) | Arduino

2010年09月02日

Arduino の Wire ライブラリの高速化

モッパーです。

こちらの記事へのコメントで Reverse父様にご指摘頂いた、Arduino の Wire ライブラリのクロック高速化ですが、internet 上の情報から答えを見つけることが結構難しかったので、忘れないように書いておきます。(言われないと気付きませんでした。Reverse父様ありがとうございます !!!)

現時点の Wire ライブラリは I2C のクロックが 100Khz (標準モード)に固定されています。libraries\Wire\utility\twi.h に   #define TWI_FREQ 100000L という部分がありますので、この数字を変えるとクロックを変えることが出来ます。ただし、この方法だと I2C セッション毎にクロックを変えることが出来ません。

こちらの掲示板の2009/8/12 の書き込みにあるパッチを Wire ライブラリに当てると Wire.setSpeed(long unsigned int)というメソッドで任意のタイミングでクロックを変えることが出来るようになりました。(その他の修正や追加仕様も入っており互換性は保たれているようですが、まだきちんとした把握と確認は出来ていません。)
0017 用のパッチのようですが 0018 日本語版の Wire に当てても動いているようです。一応、以下に 0018 日本語版にパッチを当てたあとのソースコードを置いておきますが、動作について私は一切責任を持ちませんし、何か聞かれても答えることは出来ないと思います。解凍した後、libraries\Wire\ の下のファイルを置き換えてご使用下さい。

Arduino0018JAP_Wire_Patched.zip
posted by モッパー at 21:49| Comment(2) | TrackBack(0) | Arduino

2010年08月11日

ATmega64系

モッパーです。

Flash が 64K 版の AVR である ATmega64系を使用した Arduino 本流も開発が進んでいるようですが、ATmega64系を使用した Arduino 派生系の Sanguino とか REDUINO-GHOST644U  も良い感じです。特に REDUINO-GHOST644U は LCD マウント出来るし、LCD を直に使ってもそれなりに DIGIAL I/O 残るので良いかな ? Arduino MEGA ほどの能力は必要ないけど Arduino Duemilanoveじゃちょっとね...CPU 壊れた時を考えると DIP じゃなきゃ...と考えるチームには良いと思います。もちろん、Arduino 互換ボードを自作出来るチームは勝手に ATmega64系使って CPU ボード作っても最新の Arduino IDE で制御出来るはずです。
posted by モッパー at 22:19| Comment(2) | TrackBack(0) | Arduino

2010年05月08日

またポチッと

モッパーです。
 
しばらくお休みしますと宣言しておきながら、会社と自宅の PC にはなぜか Arduino の IDE がインストールされ、出張先への移動時間にも遊んでいる私が... ちなみにReverse 父さん他の情報パクった結果です。皆様のご指南ありがとうございます。
 
なんだこれ、初心者を想定してもロボデザイナの Ticolla CDE より全然良いです。私もメンバー達もここ2年くらいロボデザイナどっぷりだったので、目から鱗です。IDE のブラックボックス度合は Ticolla CDE と似たものですが、オープンソースなのでハマってもなんとかなりそうです。ネットで大量のスケッチ(プログラムのこと)も発見できます。なんと言っても素性の良さがロボデザイナの比ではありません。素の AVR として WinAVR 使うにしてもロボデザイナを Codewarrior で使うより遥かに簡単そう。
 
Amazon でポチッとしてしまいました。翌日届いて、私のオモチャだと宣言したにも関わらず既に N 君に取り上げられて、彼がガブガブかぶりついている最中です。
 
posted by モッパー at 00:01| Comment(3) | TrackBack(0) | Arduino
にほんブログ村 その他趣味ブログ 電子工作へ