フォト
2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« 2014年8月 | トップページ | 2014年10月 »

2014年9月の8件の記事

2014年9月24日 (水)

Arduinoで16x16 LEDドットマトリックスを利用する(5)

前回からの続きです。LEDの制御をTLC5940からTB62706に変更しました。
やっと、思った通りの制御ができました。TB62706は機能が単純で使いやすいです。

Dscn3077

動作はこんな感じです。


ダイナミック点灯方式なので、カメラで撮るとチラつきありますが、
肉眼では気になりません。

回路はこんな感じに変更しました(電源回りは省略しています)。

01

ダイナミック駆動にて、16x16のパターンを表示しています。
Arduinoとのデータのやり取りはD6〜D9の4線で行っています。
D6(ENABLE)が表示/非表示の制御、
D7〜D9がシリアルデータを送り込んでいます。
TB62706→74HC595→74HC595 と接続して32ビットデータを流し込んでます。

TB62706にはCOL(1行毎のデータ)を保持します。
2つのシフトレジスタ74HC595はアクティブにする行(ROW)を保持します。

プログラムこんな感じです。

//
// TB62706を使ったLEDの点灯サンプル
//

#include <arduino.h> #include <MsTimer2.h> #include <string.h> #define DATAPIN (7) // TB62706のSERIAL-INへ #define LATCHPIN (9) // TB62706のLATCHへ #define CLOCKPIN (8) // TB62706のCLOCKへ #define ENABLEPIN (6)     // TB62706のENABLEへ uint16_t fbuf[16];    // 表示パターンバッファデータ // 文字データ "こんにちは埼玉県" uint16_t fnt[11][16]= { {// ""   0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,   0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff },   {// こ   0x0000,0x0000,0x1ff8,0x0000,0x0000,0x0000,0x0000,0x0000,   0x0000,0x0000,0x2000,0x3000,0x1c00,0x07fc,0x0000,0x0000 }, {// ん   0x0200,0x0200,0x0600,0x0400,0x0c00,0x0800,0x0800,0x1b80,   0x1440,0x1840,0x3040,0x2042,0x2046,0x604c,0x4038,0x0000 }, {// に   0x0000,0x1000,0x1000,0x31fc,0x2000,0x2000,0x2000,0x2000,   0x2000,0x2000,0x2200,0x2200,0x2b00,0x31fe,0x1000,0x0000 }, {// ち   0x0100,0x0100,0x0100,0x7ffc,0x0200,0x0600,0x0400,0x0ff0,   0x1808,0x3004,0x0004,0x0004,0x000c,0x0038,0x07e0,0x0000 }, {// は   0x0000,0x2020,0x2020,0x6020,0x47fe,0x4020,0x4020,0x4020,   0x4020,0x4020,0x43e0,0x4438,0x542c,0x6466,0x23c0,0x0000 }, {// 埼   0x2020,0x2020,0x23fe,0x2050,0xf8d8,0x218c,0x2000,0x27ff,   0x2004,0x21e4,0x3924,0x6124,0xc124,0x01e4,0x0004,0x001c}, {// 玉   0x0000,0x7ffe,0x0100,0x0100,0x0100,0x0100,0x0100,0x3ffc,   0x0100,0x0100,0x0118,0x010c,0x0104,0x0100,0xffff,0x0000 }, {// 県   0x07f8,0x2408,0x2408,0x27f8,0x2408,0x2408,0x27f8,0x2408,   0x2408,0x27f8,0x2000,0x3fff,0x0888,0x188c,0x7087,0x0080 }, {// ""   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 }, {// ""   0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,   0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555,0xAAAA,0x5555 } }; // // 行の指定 // void selectRow(byte no) {         uint16_t val = _BV(15-no);         // ビット列データの出力 for( byte i = 0; i < 16; i++ ){ digitalWrite(DATAPIN, val & _BV(i) ? 1:0); digitalWrite(CLOCKPIN, HIGH); digitalWrite(CLOCKPIN, LOW); } } // // 行フォントパターンの送信 // void dataOut(uint16_t val ) { for( byte i = 0; i < 16; i++ ){ digitalWrite(DATAPIN, val & _BV(i) ? 1:0); digitalWrite(CLOCKPIN, HIGH); digitalWrite(CLOCKPIN, LOW); } } void setup() {         pinMode(ENABLEPIN,OUTPUT); pinMode(DATAPIN, OUTPUT); pinMode(LATCHPIN, OUTPUT); pinMode(CLOCKPIN, OUTPUT);         digitalWrite(ENABLEPIN,HIGH); digitalWrite(CLOCKPIN, LOW);         digitalWrite(LATCHPIN, HIGH);        digitalWrite(ENABLEPIN,LOW);            // OUTを有効にする        setfont(fnt[9]); // フォントバッファに初期パターン設定               // 割り込み開始        MsTimer2::set(15, fontout); // 1/60秒程度で1文字を表示        MsTimer2::start(); } // // バッファ内データを表示する // void fontout() {     // 点灯LEDが移動するパターン     digitalWrite(ENABLEPIN,LOW);            // OUTを有効にする     for( byte i = 0; i < 16; i++ ) {        digitalWrite(LATCHPIN, LOW); //送信開始               selectRow(i);                    dataOut(fbuf[i]);        digitalWrite(LATCHPIN, HIGH); //送信開始             }     digitalWrite(ENABLEPIN,HIGH);            // OUTを有効にする } // // バッファにフォントパターンをセット // void setfont(uint16_t* fptr) {   memcpy(fbuf, fptr, 32);  } // // ドット表示チェック(デバッグ用) // void dottest() {   for (byte y=10; y < 11;y++)     for (byte x=0;x <16;x++) {       fbuf[y]= 0x8000>>x;      delay(50);       fbuf[y]= 0;     }        } void loop(){   // 文字を順番に表示する   for (byte i =0; i < 11; i++) {     setfont(fnt[i]);      delay(500); } }

プログラムではMsTimer2ライブラリを使っています。
割り込み処理で15msec間隔でバッファ内のフォントデータをLEDに表示しています。
表側では、バッファに表示したいデータを書き込んでいます。
これで、任意のパターンを任意のタイミングで表示できます。

さて次の目標ですが、任意のメッセージをスクロール表示したいですね。
漢字フォントは、以前試した「日本語フォントROM GT20L16J1Y」を使おうと思います。
「Arduinoで16x16 LEDドットマトリックスを利用する(6)」に続きます。

 

2014年9月21日 (日)

ArduinoでTB62706を使ってみました

TB62706は、ピンピッチが1.778mmなのが面倒ですが、機能はシンプルで使いやすいです。
簡単な配線で16個のLEDをピコピコできます。

シフトレジスタ 74HC595と使い方は同じ感じですが、LED用ドライバだけあって
LEDに流す電流は抵抗1つで設定できるので楽です。

最終的には16x16 LEDドットマトリックスの制御使う予定です。

回路はこんな感じです。

1

R-EXTに接続している2.2kΩの抵抗でOUT0〜OUT16のそれぞれに流れる電流を
決めています。

データシートより抵抗値の決定は、次の式で計算します。
   IOUT = ( 1.26 / REXT) x 14.7

この式より、
   REXT  = 18.522 / IOUT   
となりまして、この回路では8mAを流したいので、
   REXT  = 18.522 / 0.008 = 2315.25 8 ≒ 2.2kΩ
となりました。



テスト用のプログラムはこんな感じです。
//
// TB62706を使ったLEDの点灯サンプル
//

#define DATAPIN		(9)	// TB62706のSERIAL-INへ
#define LATCHPIN	(11)	// TB62706のLATCHへ
#define CLOCKPIN	(12)	// TB62706のCLOCKへ
#define ENABLEPIN       (8)     // TB62706のENABLEへ

//
// ビット列データの出力
//
void dataOut(byte dataPin, byte clockPin, byte nbits, uint32_t val ) {
	digitalWrite(LATCHPIN, LOW);		//送信開始
	for( byte i = 0; i < nbits; i++ ){
		digitalWrite(dataPin, !!(val & (1L << i)));			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);
	}
	digitalWrite(LATCHPIN, HIGH);		// 送信終了
}

void setup() {
        pinMode(ENABLEPIN,OUTPUT);
	pinMode(DATAPIN, OUTPUT);
	pinMode(LATCHPIN, OUTPUT);
	pinMode(CLOCKPIN, OUTPUT);

        digitalWrite(ENABLEPIN,LOW);            // OUTを有効にする
}

void loop(){
        // 点灯LEDが移動するパターン
  	for( int i = 0; i < 16; i++ ) {
		dataOut( DATAPIN, CLOCKPIN, 16, 1L << i );
		delay(100);
	}
}

ちなみに今回、新たに購入した格安互換機を使ったのだけれど、ちゃんと動いてます。

01

原価いくらなんだろう?

このICを使って16x16 LEDドットマトリックスを制御したいと思います。
関連記事: Arduinoで16x16 LEDドットマトリックスを利用する(5)

購入した16ビットシフトレジスタTB62706ピンピッチが1.778mmだった

Arduinoで16x16 LEDドットマトリックスを利用するために、注文していた
16ビットシフトレジスタ TB62706(下記の製品)が届いたのですが、

24ピンICソケットに差し込もうとすると、写真の通り入りません。

Dscn3066

ピンピッチが2.54mmじゃありません。データシートを見てみると
私が注文したTB62706BNは形状がDIPじゃなくSDIPでした。

01

上記の図のとおり、SDIPなのでピンピッチは1.778mmです。

うわー大失敗です。


商品説明にはDIPと書いてあったのでTB62706BNの"BN"を見てませんでした。

TB62706ってSOPかSDIP(シュリンクDIP)しか無いようです。
それで、TB62706があまり流通してないんですね。

これじゃあ、2.54mmピッチのブレッドボードにもユニバーサル基板基板にも
直接の利用はできません。

なんか方法は無いかと調べると、
Aitem-Labさんで販売しているピッチ変換基板DIP24-1P78という製品でいけそうです。

1.778mmピッチのユニバーサル基板が秋月電子で売っているので、
配線で対応でもよいかも。

んで、面白い方法を見つけました。(ikkei blogさんの記事より、感謝!)

Dscn3067

こんな感じで斜めにすると、2.54mmピッチの基板に乗ります。
足を内、外と交合に曲げるのがミソですね。

これでいくか。

2014/09/21 追記

結局、こんな感じにしてブレッドボードに乗るようにしました。

Dscn3069

Dscn3072





2014年9月17日 (水)

IchigoJamのファームウェアの更新

2015/05/23 追記
この記事の内容は古いです。IchigoJamのファームウェアの更新については、
「IchigoJamのファームウェアのアップデートについて」を参照下さい。


公式サイトhttps://www.facebook.com/groups/ichigojam/をチェックすると
最新版の0.8.7が公開されていので早速、最新版に更新しました。

最新版のファームウェア
  https://www.facebook.com/download/1474117816208463/ichigojam-0.8.7.zip

ちなみに私が購入したIchigoJamのファームウェアのバージョンは、0.8.5でした。

Dscn3054

ファームウェアの更新
本家公式サイトを見た感じでは、まとまった解説がないようなので、
「[lang:ja] mbed LPC1114での遊び方」をざっと読んで知識を得た後、
JF1VRUさんのブログ「活動の備忘録」の 記事「ichigojam ファームウェアの更新」
を参考にさせて頂いて作業を行いました。公開しているPDF形式の解説は
大変解かりやすく、大変助かりました。

解説では秋月電子製の「FT232RL USBシリアル変換モジュール」を使った
やり方でしたが、私が所有している類似品でもできました。

Dscn3059

Dscn3061

3.3VのレベルのTxD、RxD、GNDの3本で通信できます。

Photo

書き込みが終了し、IchigoJamを起動するとバージョンが0.8.7になりました。

Dscn3060

ついでに、シリアル接続を試してみました。TeraTermで繋がりました。
ただ、完全にターミナルの制御コードをサポートしている感じではないようです。

プログラムソースの保存用(カット&ペースト)には使えそうです。

Photo_2



    

2014年9月14日 (日)

IchigoJam始めました

IchigoJamとは、福野泰介さんが公開している「IchigoJam - BASICプログラミング専用こどもパソコン」です。

 サポートサイト: http://ichigojam.net/

懐かしい、フルスクリーンエディタのBASICインタプリタが動きます。
PS/2端子接続のキーボードとコンポジット端子(ビデオ端子)で画面出力して、
手軽にプログラミングができる環境です。

スイッチサイエンスで見つけてその存在を知りさっそくキットを購入して組んでみました。

Dscn3046

Dscn3050

大きいICがCPUです。32ビットのARM系のNXP LPC1114(48MHz)です。
mbedなんかにも使われているCPUです。

キットには説明書がついていません。製品情報の組み立て方を参考にして組み立てます。
難易度は低いです(LEDの極性についての説明がないので気を付ける必要あり)。

完成するとこんな感じです。

Dscn3052

接続端子として、PS/2端子、コンポジット端子(ビデオ端子)、電源用マイクロUSB端子があります。

さっそくキーボードとモニタ(ポータブルDVDプレーヤー)を繋げて動かしてみました。

Dscn3055

問題なく動作しました。
起動するといきなりBASICのプログラミング環境です。

試しに簡単なプログラムを組んでみました。
利用できるキャラクタを表示してみます。

02

英数字、カタカナ、ゲームなんかに使えそうなキャラクタがありますね。

プログラミング環境ですが、
フルスクリーンエディタの使い勝手は非常に良いです。
昔のMSXやN-88 BASICなんと同じ感覚で操作できます。

ただし、利用できる命令文少ないです。
利用できる命令文はこちら → IchigoJam BASIC リファレンス - ver 0.8.6

FOR文が利用できません。GOTO文、IF文で代用します。

ゲームを作るのに必要な命令文はしっかりと用意されています。
・キーボードからの入力
・指定座標へのキャラクタ表示
・指定座標の表示キャラクタコードの取得
・乱数

いやーほんと懐かしいです。
プログラミングの学習には最高の環境です。

教育現場では、小中学生や文系大学生のプログラミング教育に
「Squeak(スクイーク)」や、「ドリトル」なんかを推奨して使っているところが
あるようだけど、あまりシンプルな言語じゃないし、実用性が無いんだよね。

基板上にCPU剥き出しの自分で組み立てたコンピュータなら、
実感をもってプログラミングの学習ができると思います。



2014年9月12日 (金)

Arduinoで16x16 LEDドットマトリックスを利用する(4)

前回、とりあえず任意のパターンが表示できたので、

Dscn3045

簡単なスクロールメッセージを表示しようとしたのですが、どうもうまく行きません。
タイマー割り込みを使うと表示が消えます。

調べるとTLC5940は色々と制約があることが分かりました。

TLC5940利用の問題点
1)ライブラリが内部でタイマーつ使っているため、
  タイマーを使うライブラリや関数が使えない。
  タイマー割り込みのMsTimer2ライブラリが使えないのはちょっと痛いです。

2)SPIバスを占有しており、他のSPIバス機器を併用して使えない。

TLC5940にPWMのクロックを供給するためにタイマー資源を2つ利用しているようです。
SPIバス接続は常に占有していて他のディバイスが使えません。

もしかしたら解決策があるのかもしれませんが、TLC5940を使うのは止めます。
代わりとしてTB62706という16ビットシフトレジスタの利用を検討しています。

シフトレジスタ 74HC595で置き換えてもよいのですが、TB62706には出力ピンに
定電流を流せるので、ピンごとに抵抗が不要で配線が楽になります。



使い方も、ブロック図を見る限り簡単そうです。
このIC、東芝製で以前は使われたようですが現在はあまり使われていないようで
手に入れにくいようですが、Aliexpressで売っていたので注文しました。

03

製品到着までは、74HC595で代用してソフトウェア開発を中心に
作業を進めたいと思います。

関連記事

2014年9月 2日 (火)

Arduinoで16x16 LEDドットマトリックスを利用する(3)

前回の続きです。

ブレッドボードにてプロトタイプを制作しました。配線が多いです。

Dscn3025

Dscn3024

回路は前回とほぼ同じでこんな感じです(若干修正しています)。

01

写真の奥の大きいICがTLC5940です。
このICで行単位でフォントパターンを表示しています。
プログラムでダイナミック点灯方式でパターンを表示しています。
手前のボードが74HC595とTD62783のICで表示する行のON/OFFを制御しています。

今回はTLC5940を使ったのですが、ちょっと使いにくです。
使いにくというか通信データが無駄に多いです。
1点につき12ビット(輝度)のデータ送信が必要で16点だと12x16=192ビットのデータを
送る必要があります。

これなら、シフトレジスタ74HC945 2つ + 抵抗16本 に置き換えた方が良いかも。
プログラムも今一タイミング的に不明な所があり、試行錯誤的にdelayを入れて
やっと正常に表示ができました。

プログラムはこんな感じです。ダイナミック点灯部の制御はloop内で強引に
回しているので、このままだと他の処理が何もできません。
今後はタイマー割り込み等を使ってバックグランドで処理する等の改良が必要です。

#include <arduino.h>
#include "Tlc5940.h"

#define DATAPIN (8) // 74HC595のDSへ #define LATCHPIN (7) // 74HC595のST_CPへ #define CLOCKPIN (6) // 74HC595のSH_CPへ #define  LED_BRIGHTNESS  4095  // 最大の明るさ uint16_t fnt[16]= {   0x0200,   0x0200,   0x3ff8,   0x0400,   0x0440,   0x07f0,   0x1c5c,   0x3444,   0x2446,   0x6482,   0x4482,   0x4506,   0x4604,   0x381c,   0x0070,   0x0000 }; void MyShiftOut( int dataPin, int clockPin,uint16_t val ){      for( int i = 0; i < 16; i++ ) { digitalWrite(dataPin, !!(val & ((uint16_t)1 << i))); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW);     } } void clearRow() {    digitalWrite(LATCHPIN, LOW);    MyShiftOut(DATAPIN, CLOCKPIN, 0);    digitalWrite(LATCHPIN, HIGH); } void selectRow(byte row) {    digitalWrite(LATCHPIN, LOW);    MyShiftOut(DATAPIN, CLOCKPIN, 0x8000>>row);    digitalWrite(LATCHPIN, HIGH); } void setdata(uint16_t d) {   Tlc.clear();   uint16_t msk = 0x8000;   for (byte i = 0; i <16;i++) {     Tlc.set(i, msk & d ? LED_BRIGHTNESS : 0);     msk>>=1;   //Tlc.update();   }   //delay(50);   //Tlc.update(); } void setup() {   pinMode(DATAPIN, OUTPUT);   pinMode(LATCHPIN, OUTPUT);   pinMode(CLOCKPIN, OUTPUT);   Tlc.init(0);   clearRow();  } void loop() {   // データ設定テスト    for (int i=0; i < 16;i++) {         setdata(fnt[i]);         clearRow();         Tlc.update();         //delay(1);         delayMicroseconds(750);         selectRow(i);    }    //delay(1); }

プログラムの作成にあたり、TLC5940の使い方は武蔵野電波さんの記事
「第15回 TLC5940で16個のLEDを遊ぶ」を大いに参考にさせて頂きました。
 http://pc.watch.impress.co.jp/docs/column/musashino_proto/20090924_316652.html

TLC5940の使い方については、同じく武蔵野電波さんの「Arduino 日本語リファレンス」
TLC5940 (16ch/12bit PWMコントローラ) を参考にさせて頂きました。
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=2329

また、シフトレジスタ74HC595の使い方については、hiramine.comさんの記事
「少ない出力ピンで、大量のLEDを制御する(シフトレジスタ使用)」を参考にさせて頂きました。
 http://www.hiramine.com/physicalcomputing/arduino/shiftregister.html

「あ」のフォントデータは、下記のHPにて公開されているフォントを利用させて頂きました。
 「JISX0213(所謂第3,4水準漢字)用bdfフォントのページ」
  http://www12.ocn.ne.jp/~imamura/jisx0213.html
  jiskan16-2004-1.bdf.gz(303,930バイト)を利用しています。
 
  ちなみに、「あ」のJISコードは 0x2422(= 10進数 9250)なので、
  bdfファイル(テキストファイル)をエディタで開いて"ENCODING 9250"で検索すれば、
  フォントデータが得られます。
 iskan16-2004-1.bdf(テキストファイル)の「あ」フォントのデータ 
    STARTCHAR 01-04-02
    ENCODING 9250
    SWIDTH 1024 0
    DWIDTH 16 0
    BBX 16 16 0 -2
    BITMAP
    0200
    0200
    3ff8
    0400
    0440
    07f0
    1c5c
    3444
    2446
    6482
    4482
    4506
    4604
    381c
    0070
    0000
    ENDCHAR

   0200〜0000の16個がフォントデータです。

2014年9月 1日 (月)

Arduino IDE 1.0.5がマイナーバージョンアップされていた

追記 2014/11/14, 2015/01/09更新
この記事の内容は古いです。現時点でArduino 1.0x系の最新は 1.06です。
最新版については、公式サイトの「Download the Arduino Software」にて確認して下さい。
こちらの記事も参考にして下さい。
「Arduino IDE 1.0.6 では行番号が表示できりようになった」

先日購入したパソコンでArduino Unoを利用するために、開発環境を構築しました。

arduinoのHPを見てみると、1.0x系の最新版は1.05のままなので、
直前まで使っていたパソコンからarduino-1.0.5のフォルダをコピーして利用しました。
しかし、そのフォルダ内のArduino用のドライバをインストールするとエラーが発生して
インストールできません。

Windows 8なので例の「署名なしドライバ」問題でインストールできないとかと
思ったのですが、Arduino 1.0.5 のドライバは署名付きのはずです。

そんで、署名(証明書)を調べてみると、

03

有効期限が切れていることが判明。これではエラーになりますね。
あらためてarduinoのHPのダウンロードページを見ると、

NOTICE: Arduino Drivers have been updated to add support for Windows 8.1,
you can download the updated IDE (version 1.0.5-r2 for Windows) from the
download links below.

と書かれていまして、1.0.5-r2 for Windowsという新しいバージョンになっていました。
リリースノートを見ると、

ARDUINO 1.0.5-r2 - 2014.01.08
* Signed drivers for Windows 8.1
* Fixed Windows drivers signature (that prevented installation on
  some Windows 8.x OS). Now the signature is timestamped and should
  not expire.

とありまして、ドライバ関連だけ修正したようです。

ダウンロードしてドライバだけを差し換えて利用しました。
インストールも正常に完了しました。

01

02

署名(証明書)の有効期限も更新されています。

04

Lチカを確認すると、正常にプログラムの書き込みが出来て正常動作しました。

05

« 2014年8月 | トップページ | 2014年10月 »