Arduino で SPI 転送テスト

2013-05-31 23.47.00

てっとり早く動作確認するのに便利なので、Arduino よく使います。IN-12b ニキシー管 8 桁表示に使うのですが、表示させるデータを受信するポートを 3つ用意しようと思ってます。 UART, TWI, SPI です。今回は一番簡単な SPI からです。

マスター側は、 1秒毎に SS を LOW → SPI送信(数バイト) → SS を HIGH を繰り返すだけ。

#include <SPI.h>

char val = 'A';

void setup() {
  
  pinMode(10, OUTPUT);
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV32);
}

void loop() {

  digitalWrite(10, LOW);
  for(char i = 0; i < 4; i++) {
    SPI.transfer(val + i);
  }
  SPI.transfer('\r');
  digitalWrite(10, HIGH);  

  if(val++ > 0x58) {
    val = 'A';
  }
  delay(1000);
}

スレーブ側は、受信データを割り込み処理で取り込んで、改行来たら液晶に表示するだけの処理です

#include
#include
#include

int col = 0;
LiquidCrystal lcd(2, 3, 4, A0, A1, A2, A3);
char lcdf = 0;
String strSPI = “”;
boolean strSPIcomplete = false;
int charcnt = 0;

// —————————————————————————–
// — Interrupt Service Routine (SPI transfer complete)
// —————————————————————————–
ISR(SPI_STC_vect) {
char ch;

ch = SPDR;
charcnt++;
strSPI += ch;
if(ch == ‘\r’) {
strSPIcomplete = true;
}
}

// —————————————————————————–
// — Setup
// —————————————————————————–
void setup() {

pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);

// initialize SPI
pinMode(SS, INPUT);
pinMode(SCK, INPUT);
pinMode(MOSI, INPUT);
pinMode(MISO, OUTPUT);
// SPI slave mode
SPCR &= ~(1< SPI 転送の場合クロックは、CPU クロック(今回は 16MHz)の 1/4 だったか、それ以下で使用するのが推奨と記憶にありましてマスター側には SPI.setClockDivider(SPI_CLOCK_DIV32); という記述を入れてます。最初は 8 分周など入れて、データ欠落したので最終的に 32 分周です。ジャンプワイヤで接続しただけなのでこんなもんということにしておきましょう。

ただ、SS ピンを 1 バイト転送毎に LOW – HIGH トグルさせると、クロック 16MHz でも問題なく転送出来ました。SS が LOW から HIGH になるとスレーブ側の受信ロジックのリセットがかかるとデータシートにはあるのですがこれのせいでしょうか?? まぁ、これは想定と違う使い方なので深くは追いません。

Arduino UNO R2,R3 と MEGA2560 R3 の Fuses と Lock bits

Evernote にも保存してますが、誰かが困ったときのリカバリに役立つかも知れないので貼っておく次第。UNO は DIP パッケージです。確認に使用したプログラムは Atmel Studio 6 から起動した Device Programming。インタフェースは AVRISP MKII です。

ATMEGA168 を内蔵オシレータ 8MHz のクロックで動作させる場合。Arduino IDE からは Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 のボードタイプを使用します。F_CPU の define の関係でこれを使います。電圧は関係ありません。

---------------------------------------------------
Arduino ATMEGA168 internal 8MHz Fuses and Lock bits
---------------------------------------------------

BOOTSZ = 1024W_1C00
BOOTRST = [X]
RSTDISBL = [ ]
DWEN = [ ]
SPIEN = [X]
WDTON = [ ]
EESAVE = [ ]
BODLEVEL = DISABLED
CKDIV8 = [ ]
CKOUT = [ ]
SUT_CKSEL = INTRCOSC_8MHZ_6CK_14CK_65MS

EXTENDED = 0xF8 (valid)
HIGH = 0xDF (valid)
LOW = 0xE2 (valid)


LB = NO_LOCK
BLB0 = NO_LOCK
BLB1 = NO_LOCK

LOCKBIT = 0xFF (valid)

ATMEGA168 を外付けのクリスタルもしくはセラロックで動作させる場合。Arduino IDE からは Arduino Diecimila or Duemilanove w/ ATmega168 のボードタイプを使用します。

----------------------------------------------------
Arduino ATMEGA168 External 16MHz Fuses and Lock bits
----------------------------------------------------

BOOTSZ = 1024W_1C00
BOOTRST = [X]
RSTDISBL = [ ]
DWEN = [ ]
SPIEN = [X]
WDTON = [ ]
EESAVE = [ ]
BODLEVEL = DISABLED
CKDIV8 = [ ]
CKOUT = [ ]
SUT_CKSEL = EXTXOSC_8MHZ_XX_16KCK_14CK_65MS

EXTENDED = 0xF8 (valid)
HIGH = 0xDF (valid)
LOW = 0xFF (valid)


LB = NO_LOCK
BLB0 = NO_LOCK
BLB1 = NO_LOCK

LOCKBIT = 0xFF (valid)

こちらは、AVRISP MKII で読んだだけの値です。

————————————–
Arduino UNO R2, R3 Fuses and Lock bits
————————————–

———
>>Fuses<< --------- BODLEVEL = 2V7 RSTDISBL = [ ] DWEN = [ ] SPIEN = [X] WDTON = [ ] EESAVE = [X] BOOTSZ = 256W_3F00 BOOTRST = [X] CKDIV8 = [ ] CKOUT = [ ] SUT_CKSEL = EXTXOSC_8MHZ_XX_16KCK_14CK_65MS EXTENDED = 0xFD (valid) HIGH = 0xD6 (valid) LOW = 0xFF (valid) ------------- >>Lock bits<< ------------- LB = NO_LOCK BLB0 = NO_LOCK BLB1 = LPM_SPM_DISABLE LOCKBIT = 0xCF (valid) [/code]

これも、AVRISP MKII で読んだだけの値です。

—————————————
Arduino MEGA2560 R3 Fuses and Lock bits
—————————————

———
>>Fuses<< --------- BODLEVEL = 2V7 OCDEN = [ ] JTAGEN = [ ] SPIEN = [X] WDTON = [ ] EESAVE = [X] BOOTSZ = 4096W_1F000 BOOTRST = [X] CKDIV8 = [ ] CKOUT = [ ] SUT_CKSEL = EXTXOSC_8MHZ_XX_16KCK_65MS EXTENDED = 0xFD (valid) HIGH = 0xD0 (valid) LOW = 0xFF (valid) ------------- >>Lock bits<< ------------- LB = NO_LOCK BLB0 = NO_LOCK BLB1 = LPM_SPM_DISABLE LOCKBIT = 0xCF (valid) [/code]

IN-12b ニキシー管8桁表示ユニットの基板作成1

20130528133100

IN-12 ニキシー管をマウントする基板から着手。今回は IN-12 を取り付ける基板とマイコンボードは別で考えてみます。IN-12 は Top View なニキシー管なので、この基板は縦向きになります。マイコンボードとケーブルで接続するようにするか、マイコンボードもこの基板と同じ大きさにして一体型になるよう設計するか。大変悩ましいところです。

IN12_displayPanel
IN-12_controlCircuit

回路図は検討中のスケッチです。定数など未決ですのでこのままでは動きません。

IN-12 をマウントする基板と、ATMEGA328P を載せたボードと2枚構成。I/O ピンの残りも3つなので 28ピン AVR マイコン確定で良いと思います。あとは、プログラムの容量で ATMEGA328P / ATMEGA168 などを選択します。

アノード側は TLP627。カソード側は 74141 互換チップで受けます。ニキシー管が消灯しているときの電荷逃がす 100k の抵抗必要か否かなど、ニキシー管のドライブまわりはゴースト除去などやってみないとわからないこともあるためトライ&トライです。

あとは、通信のフォーマット決めつつ、試作を始めていきたいと思います。

Arduino UNO の RESET EN にスイッチを付ける

2013-05-25 13.19.11

はんだごて温める用事があったついでなのですが、Arduino UNO の基板に RESET ENABLE を有効/無効を簡単に切り替え出来るよう基盤用のスイッチを直付けしました。

Arduino IDE からプログラムを書き込むときに仮想シリアルポート経由でプログラムを送るのですが、そのとき仮想シリアルポートの DTR を使って ATMEGA328P をリセットしブートモードにし、プログラム書き込み出来るよう自動化されます。ですが、Arduino のコントロールのためにシリアル通信使うと、ターミナルソフトやシリアル通信するホストアプリケーションなどを起動しますとこの機能のおかげで Arduino がリセットされてしまいます。

開発時には便利な機能も動くようになれば邪魔になります。基板にはもともとランドがあってパターンカットするか、ハンダブリッジでやってねという簡便な方法でこの RESET EN の有効/無効を切り替えるようになっていますが、面倒臭いのでスイッチを付けたという次第。

まぁ、パターンカットしておいて、プログラム書き込み時に、左手で Arduino の RESET ボタン押すのと、右手で Arduino IDE の書き込みをクリック出来るようマウス持ってタイミング良くやれば問題ないのですがね。

IN-12b ニキシー管8桁表示ユニットの検討開始

2013-05-24 10.47.46

IN-12b というニキシー管が少しだけあるので8桁表示ユニットを作成してみようと思っている次第。この球も IN-14 などと同様に数字の 5 は 2 をひっくり返したやつのタイプとなります。が、手元にあるのはこれくらいなのも実情なのです。あとは、カンマ表示はあるけどドットが無いもの実に微妙なところですなぁ。

前回は LD8113 の6桁表示キットというのを出したのですが、これはマイコン側でダイナミック点灯のプログラム必須ということで実は人気ありません。(サンプルの時計プログラムはもうちょっとまともなものをリリースさせていただきたいとは思っています) という反省も踏まえて、インタフェースはわかりやすい方法も用意するのがいいかなと考えます。と言いましてもパッと思いつくのは

  • シリアル接続
  • I2C 接続
  • TWI 接続

ですね。シリアルは簡単なので必須かなと思っています。伝送フォーマットにあわせた形でデータ流してもらったらユニット側で表示しますよというスタイル。

ユニット側の回路構成はまだ検討開始といったところなので具体的に来まっているわけではありません。8管を普通にダイナミック点灯する。 74141 互換の K155ID1 が激安で手にはいるなら、HC595 のシフトレジスタ組合せでスタティック点灯もありかと。まぁ、部品減らしたいのでダイナミック点灯になると思いますが… 8管でやるか4管×2で制御するかなどはもうちょっと検討かとは思います。

アノード側 TLP627 で、カソード側は K155ID1 が手に入ればそれを使い、無理だったらトランジスタで組みます。なのでドライブ部はほぼ一般的な回路に落ち着きそうです。

問題は試作時のソケットをどうするか。パネル用ソケットは6個だけありますがニキシー用コンタクトピンなんて物持ってないし。この IN-12b ってリード線タイプじゃないのです…

中華レーザー加工機で LUX-OT2 用アクリルケース加工にトライしてみた

20130517132000

CorelDRAW で、アクリルケースのデータを入れ終りました。今回使用する最終形の案です。サイドパネルにひっかけの腕を出しまして。それをフロント・リヤのパネルに差し込む方式です。これで固定出来るといいな。

2013-05-17 11.45.23

最初は、紙ついたままカットしてみました。表面と裏面では紙のはがれやすさに差が出ました。基本的に裏側は材料溶けたのとひっつくせいなのかして紙が剥れません。これは他の Blog でも紹介されていた事象です。

2013-05-17 13.03.48

で、アクリル板を組み立てて完成。

2013-05-17 13.04.06

サイドパネルのひっかけのところが、ゆるかったけれどもなんとか固定出来た。構造上簡単に割れやすい場所になるので先っぽの半円の大きさとかね結構悩んだんだけど今回はハズれでした。

2013-05-17 13.06.55

ワーク対象になったアクリル板は、今回 10mm 角の木を四隅に着けてテーブルより浮かせました。がアクリル板のたわみでピントずれて切断失敗したりといい勉強になりましたわ。ハニカムの網みたいなのがいいかなぁ。ちょっとテーブルは今後の課題です。ついでに、切断時のススでアクリル板汚れるのも課題ですな。透明アクリルは十分テスト必要ですが、端材がほとんどなくなったのでまた今度

CorelDraw で、アクリルケースの概観だけ描いてみた

2013-05-16 23.42.25

Stereo 誌の付録、LUX-OT2 の USB オーディオインタフェースをよく使ってはいるのですが、いかんせん写真のとおり裸のまま使用しています。今回中華レーザー加工機の動作テストで、この USB オーディオインタフェース用のアクリルケースを切ってみようかと思いまして、CorelDraw の練習です。

20130516234100

用語の違いなどの調べや操作に慣れないなど、最初2時間程度かけた描いたものがあるのですが、画面のスクロール時に無応答になりまして作業結果保存されない状態になりました。改めて作業しなおしまして30分程度まで効率アップ。超基本操作はわかってきたので良しとしましょうか。

盛大に間違いあるといやなので、USB コネクタやボリュームなどの穴は描いてません。とりあえず、これを紙に出してみて底面パネルが問題ないか確認してから寸法手直しをしたいと思います。

今回は t=2mm のアクリル使用で考えています。ネジ使わなくても図のように引っ掛ける形でうまく形になればいいなと思っています。

中華レーザー加工機のために CorelDRAW 購入

2013-05-14 12.21.36

特別優待の対象ソフトに該当するものがあったので購入することに。ググッテみたところ Amazon で購入。Amazon に出品しているところよりも Amazon 価格が一番安く設定されていたのがきめて。Draw 本体にフォトレタッチなどのソフトも入っている模様。

ただ、CorelDRAW を使用しても、中華レーザーの添付ソフトの LaserDrw を経由させないと加工機は動きません。しかしながら、加工機添付のソフトはやはりハンコに特化したソフトなので図の大きさや配置に苦労します。体験版で CorelDRAW と 加工機に付いてきた CorelLaser というソフトが連動してデータ渡し出来るのが確認出来ました。

これで、出発点すかね

中華レーザー加工機 光軸調整2回目

今日は日曜の朝から自動車税など喫茶店行くついでに支払いなどして、帰宅後2回目の調整開始です。午後からまた出るのでほんのちょっとだけ

今日は、ノズル側の調整です。エアのホース外して、レンズが入ってそうなところも分解。出てきたレンズらしきものはベトベトです。うへぇ

2013-05-12 10.40.48

とりあえず、着なくなった肌着のボロで拭いときます。

2013-05-12 10.44.27

ついでに、ノズル側のミラーも、分解して清掃。ならびに、方向あわせ。鏡使ってやっています。

2013-05-12 10.41.35

で、再度組み立て直しまして、光軸をざっと合せた状態で、動作確認。前回は加工エリア原点から10cm 程度までしかアクリルのカット出来ませんでしたが、今日は、X 原点から 240mm (ハンコ素材はさむスプリング台?のはじっこ) あたりまで切れるようになりました。このときは アクリル t=3mm ヘッド速度 10mm/s レーザーの電流計 15mA 弱の振れ具合いでのテストです。一発で切断出来ました。基本的なところは大体 OK になってきたかなというとこまで来ました。

  • 加工エリア内での彫刻はまず大丈夫
  • t=2mm 程度の樹脂は切れるはず。 t=3mm は一度テスト必要

次はハンコには便利なテーブルをどうするか。ですね・・・、 CorelDraw エッセンシャルで動くかのテストもせねばいかんのだが・・・

中華レーザー加工機の光軸調整1回目とテスト切断

2013-05-08 12.55.47
2013-05-08 12.56.04

ミラーの角度調整しながら1時間弱。テーブルの原点側と加工エリアからは外れますが一番遠いところで、だいたい同じ位置にレーザーが来るようになったかなというところです。調整にはマスキングテープを使用しましたが、ミラーに焦げた煤が着くので拭きつつ調整していました。

本来ならセンタードンピシャ行きたいけど、まぁ、ストッパーのナット締めるだけでズレるのでここらへんが限界。写真ではノズルのところの写真しか掲載していませんが、調整はレーザー管側、レール側のミラー全て調整対象です。しかしながら腰も痛くなってきたので区切りという状況。一応、テストで加工台に置いた段ボールはノズルの位置が変っても焦げたので、彫刻はなんとかなるでしょうというくらいには前進したと思います。はぁ、面倒臭い。

2013-05-08 14.21.43

そして、切断テスト前のレーザー位置を再度確認。原点に近いところは中心より2~3mm ほど左下かな。

2013-05-08 14.22.01

そしてノズルを右に動かして遠ざけた状態。最初の濃い穴とは違って、右下側にコゲが付く状態。この状態で切断してみます。

2013-05-08 14.23.26

厚さ 3mm のアクリル板、出力(15mA強) 速度 7mm/s という設定で原点に近いところでは四角が一発で切れた。

2013-05-08 14.23.31

ノズルを遠ざけた状態の ☆ 形切断は 2 回やって切れました。なので、レーザーはノズル中心に真っ直ぐあたらないと話になりませんという状態ですね。また切断面も斜めになっているので、レンズに入るレーザーが斜めのためレンズ通過後も斜めになるものなのか、ピント合う位置の焦点がズレててビーム斜めのところで切ったためなのかはまだ判断出来てません。こりゃ大変だ