So-net無料ブログ作成

(ARDUINO)ARDUINOに接続したプリンターでロシア語を印字する [arduino]

 せっかく、キリル文字が印刷できるプリンターを手に入れたので、ロシア語の勉強に役立てられないかと思って、「ロシア語メモ書き印刷プリンター」なんてものを作ってみました。

 外見はこんな感じで、東急ハンズで525円で買ってきたハガキ整理用のボックスにプリンターを組み込みました。
P2012_0209_225810.JPG

 中を開けると、XBEEシールドをつけたArduinoが一個だけ入っています。
 5VのACアダプターから電源をもらい(要するにACアダプターからの+電源をArduinoの5V端子へ、-をGNDに配線し)、XBEEシールドでは、ソフトシリアルで9600BPSで受信したXBEEからのデータを、今度は1番ピンからプリンターのRXへ19200BPSで送っているだけです。(ACアダプター端子の処理がめんどくさかったので、とても適当な処理をしています。とりあえず固定用リングが入らなかったので、テープで接触してショートしないようにしていたりします(^^;;;)

 P2012_0209_225556.JPG
 写真が見えにくくてすいません。
 Arduino
 デジタル0番--->プリンター TX
 デジタル1番--->プリンター RX
 GND   --->プリンター GND
 と接続しています。
 XBEEシールドは、デジタル2番と3番を利用するようにスイッチを設定しています。
 Arduinoの電源は、ACアダプターから分けてもらった、5V端子とGNDに差し込んでいます。
 電源については、1.5A以下のACアダプターではプリンターが動作しませんので注意が必要です。

 XBEEはシリーズ2PROのPCBアンテナタイプです。
 ひとつをコーディネーター、もう片方をルーターとして(両方ともATコマンド版)として使っています。
 ※プログラマブル版ではないので、SPARKFUNのXBEEシールドでも正しく動作します。


 またArduinoは、XBEEから「シフトJIS」のキリル文字のデータを受信した場合、プリンター用のキリル文字のキャラクタコードに変換もしています。
 ロシア語が必要ない人にとっては、別になくても良い機能です(^^;;;

 XBEEを使っているので、電源コード意外の配線がないので、とてもすっきりとした外見です。とても控えめなプリンターです。
P2012_0209_225645.JPG
 とりあえず、ざっくりとDELPHIで作った自作ターミナルソフトを起動して、XBEEエクスプローラ経由でプリンターへデータを送ると……
P2012_0209_230130.JPG

 こんな感じで、印刷されます。
P2012_0209_225528.JPG

 こんなんで役に立つのか? と思ったんですけど……
 意外や意外、ちょっとした空き時間にぴろぴろーん、とレシートを広げて文章とかチェックできるので、面白いです。通勤時間にバスを待っている間に、ぴろぴろーんと広げたり、お昼のラーメン食べている時に片手で広げて読んだりも出来ます。
 普通のプリンターって意外と大型化されてしまって、A4とかで印刷すると見る時もめんどうだったりするかもしれませんが、レシートくらいの大きさだと意外となんでもないですね。

 イーサネットシールドと合わせたりすると、定期的にロシア語のサイトを印刷したりとか面白いことが出来るかもしれません。

 ただ……日本語を使おうとすると、さすがに日本で販売されているプリンターが必要になると思いますけど、6万円くらいするので高いんですよね。
 さすがにそこまでは……(^^;;;;;

 私の場合、送信側に自作のターミナルソフトを使いましたが、その理由は大きな文章を送ろうとするとArduinoとプリンターの間ではフロー制御をしていないので、あまり大量のデータを送ったりすると印字が間に合わず、データを取りこぼしてしまうので、文字が化けて印刷されてしまいます。
 なので、ターミナルソフト側で、テキスト一行を送信するごとに、0.5秒くらいのウェイトをかけて次の印刷処理に移るようにしています。
(こんな事を載せても……いったいどれだけの人の役に立つかは判りませんが……(^^;;;)


 でも、XBEEでの印刷はかなり良いです。
 何かのデータやログを離れたところに置いたプリンターで打ち出せるのは気持ちいいです。


参考までにスケッチも載せておきます。
---------------------------------------------------------------------
#include <NewSoftSerial.h>

NewSoftSerial s2(2,3);

int flg=0;
int ff=0;
int a;

void setup()
{
  Serial.begin(19200);
  s2.begin(9600);
  pinMode(13,OUTPUT);  
}


void loop()
{
  if (s2.available() >0)
    {
     a=s2.read();

     if (ff == 0 && a<=0x80)
       {
          Serial.print(char(a));
       }
     if (ff==2) ff=1;        
     if (a==0x84 && ff==0) ff=2;        
     if (ff ==1)
       {
         ff=0;
         a=conv_k(a);
         Serial.print(char(a));
       }         

     flg=1000;
    }

 if (flg >0)
  {
    digitalWrite(13,HIGH);
    flg--;
  }
  else
  {
    digitalWrite(13,LOW);
  }    
    
    
}



int conv_k(int a)
{
          int b='?';
         //АБВДЕ
         if (a >= 0x40 && a<= 0x45 ) {b=a+0x80;}
         ////Ёё
         if (a == 0x46 || a== 0x76) {b=0xB8;}
         if (a>=0x47 && a != 0x76 && a<0x70) {b=a+0x7F;}

         ////////фбв
         if (a >= 0x70 && a<= 0x75 ) {b=a+0x70;}
         if (a>=0x77 && a<=0x7F) {b=a+0x6F;}
         if (a>=0x80) {b=a+0x6E;}
return b;
}



(ARDUINO)ARDUINOにプリンターを接続する [arduino]

今回は、Arduinoに超小型プリンターを接続して使います。使うのは、レシート用紙を使うサーマル・プリンター(熱転写プリンター)です。
 液晶ディスプレイではどうしても情報量が限られますし、マイクロSDに記録してもパソコンがないと結果を把握できないし……簡単に情報を閲覧できるのはなにか?と考えると「プリンター」という結果にたどり着いたのです。
 しかも、熱転写式ならインクジェットみたいにウォームアップがいりません。インク切れに脅える必要もありません。(熱転写式は、実際には熱に弱い欠点がありますけど)
 それで、このプリンターを入手したのです。
 CIMG0183.JPG
 Arduinoと並べると小ささが判ると思います。
 海外のサイトで売られている熱転写プリンター(中国製)です。
 http://www.adafruit.com/products/600#tutorials

 このプリンター、いろいろと探していて見つけたもので、輸送費(いちばん安いヤツ)込みで1万円以内(およそ77USD)で買える価格だったのですぐに注文しました。(先ほどのAdafruitのサイトから購入しました。今回は注文してからおよそ10日ぐらいで届きました)
 SPARKFUNにも同等のプリンター(COM-10438:端子部分など若干違いがあります)がありますが、どちらのプリンターにしても電源は5V〜9Vの1.5Aなので、パソコンのUSB電源では足りないので動かせません。別に電源が必要になります。
 今回、ACアダプターを別に買ったりするのも面倒なので、一式全部そろった「スターター・パック」を注文しました。

 単純に印字するだけなら、19200BPSでテキストを送信して、最後にLF(0x0A)を送信すれば印字してくれます。

 CIMG0187.JPG
 極端な話、Arduinoに適当にBlinkでも入れて(動作のジャマされないようにして)、こんな感じでArduinoのデジタルポートの0番とプリンターのRX、GNDとプリンターのGNDを配線して(これでパソコンからの信号がプリンターに直接届くようになります)、IDEのシリアル・モニターの改行をLF、通信速度を19200BPSに設定してしまえば、IDEから送った文章を印刷してくれます。
 これだけでも、もう小さなタイプライターが出来上がってしまいます。


 またAdafruitに、各種機能を簡単に使えるライブラリーもありますので、それを使うのも良いでしょう! ただし! このライブラリーには注意すべきことがあります!
 Adafruitのサイトで紹介されているライブラリーは統合開発環境Arduino1.0ではエラーとなって動きません。
 さらに、指定のURLからライブラリーをダウンロードすると、「adafruit-Thermal-Printer-Library-736bc98.zip」というファイルになりますが……
 Arduinoのライブラリーに入れる場合、フォルダをこの長いファイル名したのではダメなのです。
 「Thermal」という名前にしないとダメなんです。めんどくさいですね(^^;;;;

 SPARKFUNのHPにも資料がありますので、http://www.sparkfun.com/datasheets/Components/General/Driver%20board.pdf、こちらを参考にしても良いと思います。

 CIMG0184.JPG

 印字速度もレシート用だけに速いです。
CIMG0186.JPG
 縦倍角、反転とか、いろいろありますし、バーコードも印字できます。
 さらにはキリル文字対応ってのがすごいです。
 簡単なグラフィックも印字することは出来ます。

 しかし! カタカナやひらがな、日本語には対応していません。

 でも、とにかく簡単に使えるのでArduinoでプリンターを使いたいって方にはお勧めです。

 ちなみに、付属したレシート用紙の大きさは幅58ミリ、外径35ミリ、内径(芯)12ミリのものでした。用紙については、外径38ミリまでは大丈夫との事です。


※後日追加:Arduino1.0用では、こちらも参考に出来ます。
http://bildr.org/2011/08/thermal-printer-arduino/

(ARDUINO)ATtiny85を8Mhz動作でプログラムする [arduino]

 今回はATtiny85を8Mhzクロック動作にして、統合開発環境Arduino1.0でプログラミングしてみます。

 8Mhz動作にすると、SoftwareSerialが使えるのが大きいです。
 もちろん、シリアルのprint構文なども使えるようになります。

 するとこんな感じに、LEDを点けるだけでなく、シリアル接続の7セグLEDを使えたりします。

CIMG0182.JPG
(※シリアル接続のLEDは、SPARKFUNのCOM-09230という旧タイプ、現在はCOM-09764という新しいタイプになっています。電源は乾電池2本で5Vを出力する電池ボックスPRT-08249です)


 かなり表現範囲が広がるので、いろいろなことが出来るようになります。

 では、肝心の設定に参りましょう!

■8Mhz動作への切り替え
(1)ArduinoとATtiny85をプログラムする時と同じように結線する。
(2)Arduino1.0を起動する
(3)Arduino1.0の[Tools]から[Boad]と進み[Attiny85(internal 8Mhz clock)]を選択
(4)Arduino1.0の[Tools]から[Programmer]と進み、[Arduino as ISP]を選択
(5)Arduino1.0の[Tools]から[Burn bootloader]を選択

 ただし、ここでブートローダを書き込んだとしても、シリアル通信でATtiny85をArduinoのようにプログラムすることは出来ません。
 この手順によって、ATtiny85は8Mhz動作になるようにヒューズ・ビットが設定されるだけです。ですので、プログラムする時は相変わらず、ArduinoISPなどの外付けのISPが必要です。

 後はいつものようにプログラムをして、Attiny85(internal 8Mhz clock)に書き込むことが出来ます。
 もちろん、ソフトウェアシリアルは使えます。
 テストのために、サンプルのBlinkをAttiny85(internal 8Mhz clock)として書き込んでみてください。きちんとヒューズ・ビットの設定が出来ている場合には、一秒間隔で正しく点滅しますが、もし1Mhz動作のままならば、8秒くらいの長い間隔で点滅してしまいます。


■1Mhz動作への切り替え
(1)ArduinoとATtiny85をプログラムする時と同じように結線する。
(2)Arduino1.0を起動する
(3)Arduino1.0の[Tools]から[Boad]と進み[Attiny85(internal 1Mhz clock)]を選択
(4)Arduino1.0の[Tools]から[Programmer]と進み、[Arduino as ISP]を選択
(5)Arduino1.0の[Tools]から[Burn bootloader]を選択

 こうすることで、1Mhzの動作の設定に戻すことが出来ます。


※一度、8Mhzクロックにすれば、以降はずっと8Mhzで動作しますので、書き込むたびに設定する必要はありません。


※今回はなぜか、Arduino1.0のArduino ISPでなぜかプログラムがうまく書き込めませんでした。それで、ArduinoIDEの「IDE-0023」を起動し、そちらのArduinoISPを書き込んで使いました。書き込んだ後は、Arduino1.0を立ち上げ直して、そちらで作業しました。なにかまだISPに問題があるのかもしれません。

 わかり次第報告します。

------------------------------
(追加)
2012/2/6
ShooさんからUNOについての情報が寄せられました。
Arduino Unoのブートローダー(Optiboot)に問題があるので、それをOptifixに変更することで、ArduinoISPを使えるようになるとのことです。
------------------------------


※今回使ったスケッチ
#include <SoftwareSerial.h>  // ライブラリの導入

#define rxPin 1
#define txPin 2

SoftwareSerial MS =  SoftwareSerial(rxPin, txPin);
int b=0;

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  // initialize the digital pin as an output.
  // Pin 0 has an LED connected on most Arduino boards:
  pinMode(0, OUTPUT);     
  MS.begin(9600);    // スピードを設定
 MS.print("w");
 MS.print(char(0));
 MS.print("z");
 MS.print(char(10));



}

void loop() {
  digitalWrite(0, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(0, LOW);    // set the LED off
  delay(1000);              // wait for a second

if(b<1000){ MS.print("X");}
if(b<100){ MS.print("X");}
if(b<10){ MS.print("X");}
 MS.print(b);
 b++;
if (b>9999){b=0;}
}



(ARDUINO)ARDUINO UNOで、ATtiny85をプログラムする [arduino]

開発環境(IDE)もArduino 1.0となりましたので、これとUNO(R3)を使ってATtiny85を、プログラミングしてみました。
(今回は8MHz動作のテストは行っていません。それについては、後日報告します)

CIMG0178.JPG
 参考にするのは、こちらProgramming an ATtiny w/ Arduino 1.0(http://hlt.media.mit.edu/?p=1695)です。


 では、順番にいきましょう。

1.必要な物(ハードウェア系)
(1)arduino UNO
(2)ATtiny85
(3)ブレッドボードとジャンパワイヤー
(4)抵抗(110Ω~120Ωくらいに出来るもの)、このほかLEDを動作させるための適当な抵抗もあるとOK。
(5)LED1個

 これらを使ってこのように配線します。

ArduinoISPtoATtiny45_85LED.png

 ※ここで忘れてはいけないのは、プラスの5V電源を110~120Ωに通し、それをRESETの端子に接続しておくことです。こうしてリセット機能を無効にしておかないと、Arduino ISPが正しく機能しません。

CIMG0179.JPG

 ※また、参考HPにあるように、10μFのコンデンサをRESET側に+、GND側に-を接続してもリセット端子が無効に出来ます。


ハードウェア系は以上です。

2.必要な物(ソフトウェア系)
(1)統合開発環境IDEの「Arduino1.0」
(2)ATtiny85書き込み用の設定ファイル(https://github.com/damellis/attiny/zipball/Arduino1)
 ここで入手したdamellis-attiny-6bff522.zipを展開し、中身をArduinoのスケッチが保存されているディレクトリの「hardware」フォルダに移動します。
 ※もし「hardware」フォルダがない場合は、新たに作成してください。


3.ATtiny85へのプログラムの書き込み

(1)UNOに「Arduino ISP」のプログラムをインストール。
 IDEを立ち上げて、[File]-[Examples]-[Arduino ISP]と進むと、ISP用のスケッチがどーんと開きますのでこれをUNOに入れてください。
(2)BORDの設定は、ATtiny85のインターナルの1MHz、もしくは8MHzを選択します。なお、今回のやり方では8MHzでは正しく動作しません。ヒューズ・ビットが1MHz動作のままになってしまっているからです。
(3)通信ポートは、UNOと同じポートを選択してください。
 あとは、プログラムの作成をして、UPLOADすればOKです。

 使えるのは、以下のコマンドです。
pinMode()
digitalWrite()
digitalRead()
analogRead()
analogWrite()
shiftOut()
pulseIn()
millis()
micros()
delay()
delayMicroseconds()
SoftwareSerial (has been updated in Arduino 1.0)
※なんと、ソフトウェアシリアルが使えるようですね。
でも、これはヒューズ・ビットを正しく8MHz動作に設定出来たときに使えます。
今はまだ使えません。


 また、相変わらず……
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
 このようなエラーは出ます。でも、このエラーが出ても問題なく書き込まれていますので、ご安心ください。


 参考までに、サンプルとしてブリンクならば以下のようになります。

------------------------------------------------------------------

void setup() {
pinMode(0, OUTPUT);
}

void loop() {
digitalWrite(0, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(0, LOW); // set the LED off
delay(1000); // wait for a second
}

------------------------------------------------------------------

参考までに、ピンの配置は以下の通りです。
ATtiny85.gif


さて、ここまで来て問題なくUPLOAD出来れば手放しで喜べるのですが……どうも、うまくいかない場合があります。

 で、解決策として私がやってみたものは以下の通りです。
(1)UNOのリセットボタンを押してから、アップロードしてみる。
(2)パソコンから、一度UNOのUSBケーブルを外して、つなぎ直してアップロードしてみる。
(3)IDEのArduino1.0を終了し、もう一度起動してから、アップロードしてみる。
(4)ボードの選択をインターナル8Mhz動作に設定していたならば、インターナル1Mhzに設定し直してアップロードしてみる。(※ヒューズ・ビットが正しく設定出来ていないかもしれませんから)
(5)ATtiny85を上から指でブレッドボードに押しつけてアップロードしてみる。
 ※ATtiny85はピンもとても華奢なので、きちんとブレッドボードに刺さっているかを確認してください。(意外にも結構これが原因だったりします)

 これらの対応で、なんとかアップロードが出来ます。

 一度書き込んでOKだったのに、二度目以降が失敗続き、なんてこともあるようです。
 これは、抵抗の値を変えても、抵抗をコンデンサに変えても、変わらないようです。

なお、 近いうちに、8MHz動作について報告する予定です。

XBEE S2Bで失敗、SPARKFUNのシールドで動かない。 [arduino]

 Arduinoでちょっと調子に乗ってしまった私ですが……失敗してしまいました。
 Xbeeのシリーズ1が思いのほか使いやすかったので、シリーズ2のZIGBEEに対応した物に手を出して、さらに、注文時に間違って、プログラマブルを買ってしまったのですが……
 落とし穴がありました……。

 まず購入したのはこれです。
P2012_0116_221414.JPG

XBEE PROのS2BのPCBアンテナ(シリーズ1のチップアンテナモデルに相当するもので、外付けアンテナがいらないタイプ)の、プログラマブル・モデルです。

 で、こんなめんどくさいのプログラム出来るはずがありません。
 開発環境そろえるだけでも、面倒です。
 ちょっとWEBを検索しただけでも、初心者が参考にできるサイトはほとんどなく……まいりました。
 なにせ、プログラムを組み込んでいないと、最初に出てくるのが、メニューです。
 アップロード、バージョン情報の確認、バイパスモード、アプリケーションのバージョン情報の確認とかです。
 とりあえずX-CTUで、ターミナルから半角のBを打ち込んでバイパスモードにして、コーディネーターのAT版とルーターのATコマンド版にしてみます。(パラメーターはとりあえずデフォルトにして、最低限のPANIDと、通信先IDだけを変更しました)ここまでくれば普通に使えるのですが…電源を切ったら元に戻ります。
 いろいろと調べてみましたが、結局のところATコマンドなどでただのXBEEとして使用する方法はありません。
 とにかく起動したら最初に有無を言わさず「B」の半角英数を一個送信して、バイパスモードにすればよいので、まあ、これくらいならしょうがないかと思っていたら……

 まだ、落とし穴がありました。
 SPARKFUNが出しているXBEEシールド(画像・左)、こいつに組み込むと動作しません。
 電波は受信出来ているようなのですが、肝心のデータが取り出せない感じです。
 で、SPARKFUNのサイトをみたら、案の定、一部のXBEE(シリーズ1のPROの一部、日本ではまだ使用出来ない、見通し通信距離が3キロを越えるとんでもない高出力タイプ)で動かないことが報告されています。なんでも、どこかに配置されているコンデンサが悪さしているとか、していないとか、しかし、解決方法はいまいちはっきりしません。

 念のため、手元にあった純正シールド(画像・右)に差し替えてみたら、あっさりと正常に動作します。

 P2012_0116_221100.JPG

 もう、愕然としました。
 さらに、SPARKFUNの「エクスプローラ5Vマイコン用(SFE-WRL-09132)」を使ってみても正常に動きません。がっくりです。
 「XBeeエクスプローラUSB(SFE-WRL-08687)」の方は問題なく使えるだけに、ショックでした。とりあえず、長距離通信が必要になった時の中継ポイント用として使うことを考えています。

 SPARKFUNを重宝していただけにショックでした(^^;;;;。
(ただ、最近、SPARKFUNの商品でいろいろと痛い目を見ているので、警戒もしています。シリアル接続で使えるJPEGカメラの撮影サイズが変えられなくなっていたり、ノキアのカラー液晶のシールドが、ライブラリーではうまく動作しないので自分で変更する必要があったりします。なんかコワイですね)

 シリーズ2に挑戦してみようかという方がいましたら、気をつけてください!
プログラマブル・モデルは、このシールドでは動きません。
(その後、普通のXBEE PRO S2Bを入手して確認したところ、プログラマブルでなければ問題なく動作します)
 プログラマブル版をSPARKFUNのXBEEシールドで使おうと計画している方がいましたら、ダメです!動きません!

(ARDUINO)シリアル接続7セグを拡張しました [arduino]

調子に乗っていろいろやっているうちに、RTCを一つショートさせて壊してしまいました。
で、RTCはよく見ると何個もあったので、ダイオードを普通の整流ダイオードとかに交換して作り直しました。

で、RTCだけではなく、どうでもいい拡張というか、この7セグを使って、アルファベットと簡単な記号を表示できるようにしてみました。


RIMG0075.JPG
電源投入時には、すべてが点灯しLEDに異常がないかを確認しやすくしています。
(なにせ素人の自作なので、いつトラブルが出るかわかりません)
データが送られてくると、これらが消灯し、表示モードに移行します。

RIMG0077.JPG
これがアルファベットのa~h


RIMG0078.JPG
これがアルファベットのi~p

RIMG0079.JPG
これがアルファベットのq~x

RIMG0080.JPG
これがアルファベットのy~z、+、-、*、/、=、最後におまけで*を表示しています。
ちなみに、ピリオドの場合は格桁の小数点を表示させるようにしています。

これを使った「HAPPY! NEW YEAR」と表示させるとこんな感じです。
RIMG0083.JPGRIMG0084.JPG
画像で見ると微妙ですが(^^;実物は意外とかわいいです。
もっとも実際に使う場合には、シリアル接続の液晶キャラクタディスプレイの方が遙かに便利なんですけどね。

でも、シリアルポートでプログラムを転送した時に、この7セグがキラキラとアルファベットを表示すると、なんというか、言葉に表しようのない感情(несказанная эмоция)がわき上がってきます。

 そんなわけで、年末~正月とどっぷりとハマっていたら、突然友人から電話がかかってきて口頭で単語のテストが行われました。
そしたら案の定、さんざんな結果で……これからはまたまたロシア語に本腰をいれます。(^^;;



(ARDUINO)シリアル接続の8桁7セグLEDを作ってみたら…起爆装置みたい [arduino]

 最近またArduinoにハマったりしています。
 特に難しいことを考えずにシリアルの信号線を無線化出来てしまうXBEEのシリーズ1とかを使ったり、シリアル接続で使える7セグLEDとか秋月で売られているセイコーのRTCを電気二重層コンデンサでバックアップ出来るようにしたモジュールを自作していたりしました。

 これがまたちょっとしたきっかけで仕事に役立ったりしているので、まだしばらく個人的なArduinoブームは続きそうです。

【RTCと7セグLEDを使った時計】
RTCから時間を読み出すための時計の部分と、シリアル接続で得られたデータを7セグLEDで表示する部分は、それぞれ別の独立したArduinoのユニットになっています。
早い話、この時計は2つのArduinoで構成されています。

赤色8桁の7セグLEDに時間を表示しています。
RIMG0070.JPG
8桁の7セグをダイナミック点灯させるために、手元にあったトランジスタSA1015を使っています。

緑色4桁の7セグLEDに時間を表示しています。
RIMG0068.JPG
こちらは4桁なので、トランジスタは使わずにプログラムでダイナミック点灯をさせています。消灯させるためには、LEDの特性を利用し逆向きに電気を流しています。赤色7セグと比べるとパーツそのものも省電力ですので、緑色で、環境にも優しい感じです(^^;;;


これは8桁の7セグLEDの配線です。
ポリウレタン線を使ってかなりぐちゃぐちゃになっています。
この7セグLEDは、2年ほど前に在庫処分で格安だったものを手に入れたものでした。
今売られているよりも暗い感じがします……
RIMG0073.JPG
それにしても「ポリウレタン線」って便利ですね。線のまわりは絶縁されているのに、半田付けすると絶縁されていた部分は熱で溶けて電気を通すようになるので配線がとても楽です。それまで配線の太さで取り回しを苦労していたのが嘘のようです。

それと、RTCもこれまた2年くらい前に購入して手元に残っていたヤツで、今回は電気二重層コンデンサを追加した自作モジュールにしました。
実はSPARKFUNのバックアップ電池付きのRTC(BOB-00099)を使ってみたのですが……精度があまりにも悪くて、一日で10秒近く遅れてしまうので、セイコーのRTC-8564NBを使ったクロックモジュールに1F5.5Vの電気二重層コンデンサを追加した自作モジュールを作ったわけです。これだと「誤差? それなに?」みたいな感じで一日で1秒なんかずれないし非常に満足です。
RIMG0074.JPG
 RTCのまわりの配線については、こちらの「なんでも作っちゃう、かも(Arduinoで遊ぼう - リアルタイムクロック)」と、こちら「AVR + RTC-8564モジュール デジタル時計の製作」を参考にさせていただきました。

 注意すべきは、RTCモジュールのジャンパーを半田付けしてモジュール内の抵抗を使うようにしてしまうと、電気をバカ食いするらしいので、外部に別に抵抗を配置することです。そうすれば、一週間くらいは電源が遮断されてもRTCは生きているらしいです。

7セグLEDにつけているカバーはスモークのアクリル板で作りました。
なにせこれをつけないと……とてもアブナイアイテムになります。

RIMG0072.JPG

プラスチック爆弾みたいな「ねんど」の上に置いておいたら間違いなく警察に通報されるでしょう。
そもそも4桁×上下2列になると、なんかとても怪しい!
しかも自作の基板と、電気二重層コンデンサが怪しさに輪をかけています。
さらにカラフルな配線コードは、映画でありがちな爆弾のイメージです。


で、ふと思いつきましたけど、トランクの側面にこんな7セグLEDで時間を表示しているヤツなんか作ったらカッコ良さそう!
(それ持って走っていたら、絶対まわりの人はビックリするだろうし、おまわりさんには職務質問されるだろうけど……(^^;;;)

※回路図やスケッチも公開したいのですが、あまりにもやっつけ仕事で……すいません。

(ARDUINO自作)ARDUINO ISPで、ATtiny85をプログラムする [arduino]

 ArduinoをArduino ISPを使って簡単に自作出来るようになりました。

 実は、この環境、ちょっとした追加でATtiny45やATtiny85に対応させることが出来ます。
(参考にしたのはこちらです「High-Low Tech – Programming an ATtiny w/ Arduino」)


■必要なもの
※今回は168Pにブートローダが書き込める環境に、追加するものだけを説明します。

(1)ATtiny45、ATtiny85に対応するための設定ファイル
 参考URLの中段にある、「Download: attiny45_85.zip」で入手出来ます。
 これだけです。


■環境を構築
(1)attiny45_85.zipを解凍します。
 ※解凍すると以下の二つのフォルダが出てきます。
  (a):__MACOSX
  (b):attiny45_85
 実際に必要なものは、(b)の「attiny45_85」だけです。
 ※これにはArduino ISPで作成したプログラムを、ATtiny45やATtiny85に転送するための各種ファイルが含まれています。
(2)出てきた「attiny45_85」をArduinoのスケッチフォルダ(自分の作ったスケッチが保存されるフォルダ)の中にある「hardware」に移動します。(このフォルダは前回のArduino自作のためにすでに作ってあるはずです)
 これで完了です!
 (なお(a)はMACのOS用のファイルなので、Arduinoには関係ありません)

■配線
 ArduinoとATtinyを、下の図のように配線してください。
ArduinoISPtoATtiny45_85LED.png
※ただし、ここの配線図にも載っていないのですが、オートリセット機能を無効にするため、5Vの電源を110Ω~124Ωの抵抗に通したのをRESET端子に通してください。
 これがないとまったく書き込めません。
 とりあえずこんな感じになります。
CIMG0157.JPG


■スケッチの作成
ピンの配置は以下の通りです。
ATtiny85.gif

 使えるコマンドなどはさすがにピンが少ないので以下のものに限られてしまいます。
pinMode()
digitalWrite()
digitalRead()
analogRead()
analogWrite()
shiftOut()
pulseIn()
millis()
micros()
delay()
delayMicroseconds()
 これらを使ってスケッチを作成しましょう。

■動作テスト
 せっかくブレッドボードにLEDも配置しましたので、テストをしましょう。
 スケッチのブリンクを13番ピンではなく、0番ピンに変更します。
------------------------------------------------------------------

void setup() {
pinMode(0, OUTPUT);
}

void loop() {
digitalWrite(0, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(0, LOW); // set the LED off
delay(1000); // wait for a second
}

------------------------------------------------------------------

■<注意>
(1)COMポートはArduino ISPのポート番号に設定してください。
(2)ボードの選択を「ATtiny45 (w/ Arduino as ISP)」や「ATtiny85 (w/ Arduino as ISP)」に使うチップに応じて変更します。これでないと、Arduino ISP経由でコンパイルしたスケッチを転送できません。

※転送時に以下のようなエラーメッセージが出ますが問題なく転送されています。気にしないでください。
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85


■完成
うまくいけば、ATtinyがきちんと動作するはずです。
CIMG0158.JPG

■ATtiny85は「スイッチサイエンス」でも購入することが出来ます。


(ARDUINO自作)ARDUINO ISPで、168Pにブートローダを書き込む [arduino]

ARDUINO ISPで、本来サポートしていない168Pにブートローダを書き込みます。

 最近、Arduinoについては、いつのまにか新しいUNOってモデルが出ていたりしたわけです。
 しかしこの新型モデルだと、今まで私がやっていた自作Arduinoが作れません!
 個人的にすごく慌てました!
 「このままでは私はもう手元のDuemilanoveが壊れたら、もう自作できないじゃん!」
 しかし、調べると、新しくIDEに追加されたArduino ISPで作れることが判明し一安心。しかも、配線も作業手順も簡単そうです!
 おお、なんだずいぶん便利になっちゃったなぁ!
 なんて思っていたら、ATMEGA168には対応していても、ATmega168Pには対応していないことが判明しました。

 でも、なんとか試行錯誤を繰り返し、168Pにブートローダを書き込めるようになりましたので、今回はATmega168Pに3.3V内蔵8Mhzクロック動作のブートローダを書き込む方法を解説します。

 
 今回も初心者に判りやすいようにまとめます!
 (ただし、私の説明で自作するのは自己責任でお願いします。どんなトラブルが発生しても責任は待ちません)


■用意するもの
(ハードウェア系)
1:WINDOWSパソコン
2:Arduino Duemilanove、もしくはUNO
 Arduino DuemilanoveやUNOには、Arduino ISPのプログラムを書き込んでおきます。
3:ブレッドボード(接続用ワイヤ含む)
4:抵抗(110Ω~124Ωの範囲内)
5:ATmega168P

(1)まずは図の通りにArduinoとブレッドボードを配線します。
SimpleBreadboardAVR.png
 ただし、この配線には足らないポイントがあります。
 実は、この配線だけではオートリセット機能がジャマをしてISPとしての機能が働きません。そこで、オートリセット機能を無効にするために簡単な配線を追加します。
 5Vの電源を110Ω~124Ωの抵抗を通してリセットの端子に接続します。
 こうすることで、リセット機能は無効になり、これでISPとして使えるようになります。
 私はDuemilanoveで110Ωと120Ωでリセット機能が無効になることを確認しています。
 ※一応、抵抗の範囲は守ってください。
CIMG0156.JPG
 (ATmega168Pの右側のジャンパーワイヤは、位置決め用の目印です(^^;;)

 ハードウェアが整いましたので、ソフトウェアにいきましょう!

(ソフトウェア系)
1:Arduino-IDE0023
2:168P設定用のファイル※後述
 設定ファイルは「Kimio Kosaka」さんのHPで解説している二つのファイルを用意します。
 (今回も「Kimio Kosaka」さんのHPを参考にさせていただきました)
 

「Kimio Kosaka」さんのHP
http://make.kosakalab.com/arduino/
1:ATmega/ATtiny記述ファイルアーカイブ hardware.zip(2011.07.28版)
(http://www.geocities.jp/arduino_diecimila/use/source/hardware.zip)
2:avrdude.conf拡張ファイル avrdude_conf_add.zip(2011.08.11版)
(http://www.geocities.jp/arduino_diecimila/use/source/avrdude_conf_add.zip)
※各ファイルのリンクは変更される場合がありますので、実際に「Kimio Kosaka」さんのHPで確認してから入手することをお勧めします。


■IDEを168Pへ対応させる

1:入手した、avrdude_conf_add.zipを解凍します。
2:出てきたavrdude_conf_add.txtを開き、この内容をIDEのavrdude.confに追加します。
該当するファイルは、Arduinoをインストールしたディレクトリの中にあります。
たとえばCドライブのルートにIDEをインストールした場合は以下の場所です。
c:\arduino-0023\hardware\tools\avr\etc\avrdude.conf
このavrdude.confをエディタなどで開き、この文末にavrdude_conf_add.txtの内容を追加します。

3:今度はhardware.zipを解凍します。
4:解凍して出てきたhardwareフォルダは以下のようになっています。
[hardware]
+--[avr]
   +--boards.txt
   +--[bootloaders]
      +---[dummy]+--dummy.hex
      +--[cores]
         +---[arduino]他各種ファイル
         +---[atmega644p_1284p]他各種ファイル
         +---[attiny45_85]他各種ファイル
         +---[attiny2313]他各種ファイル
5:このhardwareフォルダをArduinoのスケッチがごっそりと集められているフォルダに移動します。
  ※フォルダの情報はIDEのPreferencesにある「Skechbook location」に表示されています
  ※hardwareフォルダごとごっそり移動させてください。中身であるbootloaders、cores、boards.txtだけを移動しても動作しません
  hardwareフォルダをそこに移動することで、先ほどavrdude.confに追加したボードを扱えるようになります。

■<重要>ここでつまずくポイントがあります■
 実はこのままではブートローダファイルは書き込まれません。
 実際に書き込まれるのは、先ほど移動させたhardwareフォルダのdummy.hexなので、それを変える必要があります。
 hardwareフォルダの下のavrフォルダにあるboards.txtを開いてみてください。
ちょっとクセのある設定ファイルなので、メモ帳などで開いた場合改行が正しくされません。改行が[CR+LF]だけでなく、[CR]のみや[LF]のみに対応しているエディタなどで開く必要があります。

6:ATmega168Pの項目を変更します。boards.txtを開いて、以下のように変更してください。
……略……
###########################################
avr88p.name=ATmega88P / Int.8MHz

avr88p.upload.using=arduino:arduinoisp
avr88p.upload.maximum_size=8192

avr88p.bootloader.low_fuses=0xe2
avr88p.bootloader.high_fuses=0xdd
avr88p.bootloader.extended_fuses=0x07
avr88p.bootloader.path=dummy
avr88p.bootloader.file=dummy.hex<<<<<<このようにダミーのファイルが指定されています。
avr88p.bootloader.unlock_bits=0x3F
avr88p.bootloader.lock_bits=0x3F

avr88p.build.mcu=atmega88p
avr88p.build.f_cpu=8000000L
avr88p.build.core=arduino

###########################################
avr168p.name=ATmega168P / Int.8MHz

avr168p.upload.using=arduino:arduinoisp
avr168p.upload.maximum_size=16384

avr168p.bootloader.low_fuses=0xe2
avr168p.bootloader.high_fuses=0xdf       <<<<<内蔵8MHz動作用にこのように書き換えてください。(0xddにすると2.7ボルト以下で動作を停止するように出来ます)
avr168p.bootloader.extended_fuses=0x00     <<<<<内蔵8MHz動作用にこのように書き換えてください。
avr168p.bootloader.path=dummy
avr168p.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex   <<<<<ブートローダのために書き換えてください。
avr168p.bootloader.unlock_bits=0x3F
avr168p.bootloader.lock_bits=0x3F

avr168p.build.mcu=atmega168p
avr168p.build.f_cpu=8000000L
avr168p.build.core=arduino


############################################
……略……
※ここでのヒューズビットは一定の電圧以下になっても168Pの動作を停止させない値になっています。自分の用途に合わせて変更することも可能です。

7:ATmega168Pを3.3V内蔵8MHz動作で使うための、ブートローダ用HEXファイル(ATmegaBOOT_168_pro_8MHz.hex)を、dummyフォルダの中にコピーしてください。
ATmegaBOOT_168_pro_8MHz.hexのファイルは、Cドライブのルートにインストールした場合なら、
C:\arduino-0023\hardware\arduino\bootloaders\atmegaフォルダにあります。
 移動ではなく、コピーすることに注意してください。

■ブートローダの書き込み
1:Arduino ISPのプログラムを書き込んだArduino DuemilanoveやUNOで、
[tool]-[boad]から、「ATmega168P / Int.8MHz」を選択します。
2:[tool]-[burn bootloader]-[w/ Arduino as ISP]を選択して、ブートローダを168Pに書き込みます。
これで、168Pは内蔵8Mhzクロック動作のArduinoとして動作します。

※なお完成した168Pにスケッチを書き込む場合は、このままでは出来ませんので、別途配線を変えたうえでSparkfunのFTDI BASIC・3.3V版などを使ってください。
※また、その時はボードの選択を「Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168」としてください。

※5Vでの動作確認はしていません。

Arduinoで盆栽のような回路を作って思いをはせる [arduino]

今日はこんなのをArduinoで作ってみました。

090907_005941.jpg

 前に作った乾電池動作、ムサシーノ互換の自称「Kandenchino」です。(ロシア語だったら「Канденцино」……すいません、適当です)

 使ったのは他に、CDSとスイッチサイエンスで購入したシリアル接続の4桁の7セグLEDです。
 電源を接続した他には、ソフトウェアシリアルの信号線一本だけで表示できてしまうのですごく手軽です。(乾電池だと「1」と「8」で明るさが微妙に違うとかはありますけど)

スケッチはこれだけです。
-----------------------
#include <SoftwareSerial.h>  // ライブラリの導入

#define rxPin 3
#define txPin 2
int b=0;
int ledPin =  13;    // LED connected to digital pin 13
// 新たなシリアルポートを設定
SoftwareSerial MS =  SoftwareSerial(rxPin, txPin);

void setup()   {                
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT); 

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  MS.begin(9600);    // スピードを設定
 MS.print("w");
 MS.print(char(0));
 MS.print("z");
 MS.print(char(0));
 
}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()                     
{
  digitalWrite(ledPin, HIGH);   // set the LED on
  delay(500);                  // wait for a second
  digitalWrite(ledPin, LOW);    // set the LED off
  delay(500);                  // wait for a second
 b=analogRead(0);
 
if(b<1000){ MS.print("X");}
if(b<100){ MS.print("X");}
if(b<10){ MS.print("X");}
 MS.print(b);

}

-----------------------

 初期設定の説明をすると……
MS.print("w");
MS.print(char(0));
MS.print("z");
MS.print(char(0));
 この4行で、輝度を最高にして、コロンや小数点をすべて消しています。
 これだけです。
 簡単です。

 で、乾電池でけなげに動いている動作を見ていると、ふと自分が盆栽でも見ているような気持ちになりました。なんというか、この小さな回路をイマジネーションの入り口として、現代の科学技術に思いをはせるというか、また、子供の頃、水たまりにお菓子のおまけの船を浮かべて大海を航海する大型船の気分に浸るというか、そんな感じです。

 これだけの回路ってたいしたことないけど、でも、ここにこうして存在しているだけで意味があるんでしょうね。なんというか、我々人間もひょっとしたらこの小さな回路みたいなものなのかもしれません。いやいや少なくとも、この回路よりももっともっと大切なことは間違いないでしょう。

 これだけでどうってことはないものですが、時にはこんな楽しみも良いですよね。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。