「電子工作な日々」カテゴリーアーカイブ

電子工作に関連するお話など・・

AKI-RX62 で SDカードを読む

そろそろ、RXマイコンも何とかしないとー、と思い、とりあえず、SDカードを接続してみた。

ネットで探すと、AKI-RX62にSDカードを繋ぐ記事は少ないようなので、同じような事を考えている人は参考になると思う。
※コンパイラは gcc を使っているが、コンパイラの依存をなるべく少なくなるようにしているので、ルネサスのIDEでもコンパイル出来ると思う。

まず、SDカードの前に、シリアルコミュニケーションを何とかしないと駄目だーー
それで、とりあえず、SCI0だけ使える、モジュールを作った。

シリアルは、以下のピンを使う。
P20(TxD0)
P21(RxD0)
※FTDIの変換モジュールを使ってUSB接続

rx62x_sci.h、rx62x_sci.c

「ポーリング」、又は、「割り込み」のどちらかで、初期化すれば、後は、ある程度適当にやってくれる。
※「ポーリング」はあまりちゃんとテストしていないので、あしからず・・・
※処理負荷も低いし、「割り込み」モードで問題無いハズだ、バッファの大きさを変えたい場合は、ソースコードで define されてるので、好きな大きさに変えられる。
※割り込みレベルも変更できるようにしてある。

自分が使っている gcc では、ビットフィールドを使ってデバイスを操作すると、まともに動作するコードが出来ない為、とりあえず直接ビットパターンを書き込むようなコードとなっている。
※そのうち、この問題は解決しなければならないのだが・・・
そもそも、ビットフィールドの操作は、コンパイラ依存の部分が多いし、エンディアンの違いなども関係する為、使わない方向で考えている。
最終的には、処理系や、エンディアンなどに依存しない実装を考えないと駄目な感じ。(これはそのうち・・)
※ルネサスのサンプルは、標準的にビットフィールドを使ってるみたいなので、何とかしないと・・・

SCIが動くようになったので、早速SDカード、まず、FatFsをダウンロードする。
※サンプルプロジェクトには、RX マイコン用の物もあるので、「mmc_rspi.c」を参考にAKI-RX62用に改修させてもらった。
※define マクロは、inline 関数に変更してある、define マクロは、罠にはまりやすく、可読性を悪くし、良い事は殆ど無い、速度も特別速くならない、それなのに未だに良く使われているのは不思議で滑稽だ。
※このソースでは、RSPI0を使って、パラレル/シリアル変換をハードで行っているので、かなり高速に通信できるようだ。

SDカードとの接続は、以下のピンで行っている。
PC7(MISOA-A)  SDO
PC6(MOSIA-A)  SDI
PC5(RSPCKA-A) CLK
PC4           /CS
PC3           /WP(ライトプロテクト)
PC2           /CD(カードディテクト)
GND           GND
VCC           3V3
※VCCの電源ラインは、カードが接続された場合に大きな電流が流れて、電源が不安定になるので、フェライトビーズを入れる。
※ソースコードにはコメントを沢山入れているので、自分のシステムに合うように容易に改修できると思う。
※パスコンは適当に入れておく事。

SDカードのソケットは、ヒロセSDカードコネクタが最高だと思ってるのだけど、ピンが狭い部分があり、ユニバーサル基板に取り付けるのは厳しいと思い、SDカードソケットモジュールを使う事にした。
前に「安かった」ので買っていたのだが、いざ、基板に付けてみると、「ライトプロテクト」が無いじゃん~・・・、まぁいいかー、試作だしー、と思ったのだが、SDカードを入れたり出したりしてみると、??
このCD(CardDetected)って、WriteProtectなのでは!?、
じゃぁ、CDは???、Google 先生に聞いて、このカードソケットの図面を探してみたー、あったー、まさしく、このソケットに違いない~、で、「CD」は?、うーーんGNDに接続されてるし・・・、しかた無いので、パターンをカットして、CDを取り出してみた。

IMG_0449ss
※この誤植は、秋月に一応伝えておいた。

ちなみに、マイクロSDは、小さくて良いのだが、小さすぎて無くしそうな感じなので、イマイチ好きになれない・・・www

それにしても、ELMさん(ChaN)のFatFsは、本当に良く出来ている、こんなに簡単に組み込めるのは、高品質なソースコードの所以であると思う。

文字コードをどうするか?
FatFs は、「ffconf.h」の設定で、デフォルトの文字コードを選ぶ事が出来ます。
そこで、利便性を色々考えて・・・

#define _LFN_UNICODE 1 /* 0:ANSI/OEM or 1:Unicode */

とします、こうすると、ファイル名の扱いが、全て WCHAR 型(unsigned short)になりますが、色々と一番扱いが楽だと思います。
しかし、シリアル出力などは、8ビットなので、UTF8などに変換が必要です、UTF8とUTF16は、論理的な相互変換が出来るので、比較的楽です。

さて、SDカードが読めて、シリアルコンソールが繋がると、もっと本格的にソフトの実装が出来ないと利便性がありません・・
そこで、syscalls の実装を行いました。
これは、以前にSH2Aで実装したリソースの再利用なのですが、一応実装されただけで、まだテストは出来ていません・・
syscalls の実装を行う事で、printf やファイルのオープン(fopen)など、POSIX の関数が普通に使えるようになります。
※SDカードは自動的にマウントするようになっています。(刺してから1秒くらい待ちます)

このプログラムを書き込んで、起動すると、「SD Monitor」なる物が起動します。
コマンドは、「ls」(ファイルのディレクトリーリスト)のみです。www
STL も普通に使えるみたいです、これから詳細な検証。

※リンク時に、気になる警告が出ますが、問題無いようです・・・

全体のソースコード

あと、リアルタイムクロックを乗せないと駄目な感じです、RXマイコンにもRTCは付いてますが、バッテリーバックアップが出来ないので、全く使い物になりません。

IMG_0448s

L6470 ステッピングモータードライバー

例によって秋月で、L6470ステッピングモータードライバーのモジュールを買った(750円)。
※ステッピングモーター駆動のタコメーターを作る予定で買った。

早速動かしてみたので、その報告。

L6470 は、最大 48V、定格 3A のドライバーで、128 マイクロステップが可能なインテリジェントドライバーだ。
制御は SPI で行う。
※このLSIは、位置と速度を管理していて、単なるドライバーとは言えない高機能なものだ。

「マイクロステップ」とは、ステッピングモーターの2つの相に流す電流の比を制御して、より細かいステップで制御する方法で、2相(4相)ステップモーターの相コイルは、丁度90度に直行した構造なので、X、Y軸の関係に等しい。
X、Y軸をそれぞれ、サインとコサインの関係で、電流比を制御すると、理論的には無限大まで分解能を上げられる。
このICはステップモーターの1ステップを128分割まででき、きめ細かな制御が出来る。
注意して欲しいのは、ステッピングモーターに流れる電流は、誘導性負荷なので、速度(回転速度)が速くなると当然流れる電流は少なくなる、なので、制御の精度は、「比」となる、絶対的な電流では無い。

実験には、ATMega88P を使い、SPI の制御を行って、L6470 にコマンドを送って制御した。
※ネットを探すと、Arduino のスケッチが色々見つかるが、純粋に C++ でプログラムを行った。

ステップモーターは秋月で買った物で、定格12Vなのだが、ユニポーラをバイポーラとして駆動する為、12Vで駆動する場合、定格の半分となる。
※最終的にはタコメーターを作る予定なので、12Vで丁度良いと思う。

回路図は書いて無いので、結線は以下のように接続する。
PC0: L6470 STBY/RST
PB2: L6470 /CS
MOSI PB3: L6470 SDI
MISO PB4: L6470 SDO
CLK PB5: L6470 CK

電源は12V、AVRには5Vを印加する。

※他の回路は参考資料にある回路をそのまま使う。
※boot ストラップに使うダイオードはショットキーダイオードを使う。(手持ちの都合で、2A/40V を使った)

IMG_0443s

ソースコード

まだ、実験的コードなので、色々未完成、タコメーターのハード製作に合わせて修正していく予定。

-----
追記:
2013年7月1日(21時25分)
ソースコードを更新しました。
spi.hpp ---> AVR の SPI 通信をクラス化したものです。(まだ不完全です)
L6470io.hpp ---> L6470 の制御をクラス化しました。(まだ不完全ですが、コマンド発行など、より判り易く使えます)

2013年7月1日(22時23分)
L6470io.hpp を更新、これで、アプリケーションから、必要な事が出来るようになった感じ。
※ステータスの読み込みは、まだ未実装

動画をアップ

HIDaspx を作る

AVR を使った電子工作では、ISP プログラマーが必須だ、以前から「ELM さんの AVR ライタ」を使わせてもらっている。
※シリアル→ISPの変換デバイスを USB シリアル変換(FTDI)と組み合わせて、ケースに入れてある。

IMG_0436s
※さすがにかなりくたびれているが、未だ現役。

数年前に、ATtiny2313 を使って、ソフトウェアーだけで、USB クライアントになる ISP プログラマーが発表され、ずっと使ってみたかったのだが、現役のプログラマーで何とかなっていたので、ずっと見送っていた。
千秋ゼミ(AVRマイコンなど)
先日ゲームコントローラーを作るので部品を買った余り(余分に買った)があり、丁度良い機会なので、作ってみる事にした。

HIDaspx は、ATtiny2313 といくつかの部品だけで動作する AVR 用 ISP プログラマーなのだが、非常に洗練されており、ソフトウェアーの機能もてんこ盛りだ(はまった)。
折角なので、単純に AVR の ISP プログラマーを作りたい人の為に、簡単な製作記を残しておこうと思う。

(1) ハードの製作
HIDaspxは、プリント基板を販売しているところがあり、それを使えば簡単なのだがー、いくつかの点で、自分のスタイルに会わない為、今回はパス。

・やはりこの手の物は、ちゃんとケースに入れて、使わないと、ショートしたり、何かとトラブルが起こるもので、前回同様、同じケースに入れる事とした。
・ISP のコネクターは、前回と互換性を持たせ、10ピン仕様とする。
・最近はミニ USB やマイクロ USB が主流で、小さくて、扱いやすいので、ミニ USB コネクター仕様とした。
・電源の切り替えは、前回同様、5V、3.3Vを切り替えできるようにした。
・HIDaspx は、Ready と Busy のランプがある。
以上を踏まえて、ケース内のレイアウトを決め、ケースの加工、基板の切り出し、加工を行った。

IMG_0434s
※この段階では、LED 電源切り替えスイッチの穴は開けてない。
※ミニ USB のコネクターは、既製品の変換アダプターを使った。(かなり昔に買ったもの)
※このケースは、底蓋の面構造が、基板を、コネクターの形状を利用して固定するのに都合良く作られている。

内部に納める基板が出来たら、回路図を見ながら、部品を乗せて行く。

IMG_0437s

IMG_0438s
※緑の LED、VF が 3.2~3.4V なので、3.3V で動作させた場合にLEDが点灯しないのでは無いかと考え、フォトカプラーを間に入れて、常に5Vで駆動するように改修してある。
※他は、ほぼオリジナルの回路準拠
※経験上、三端子レギュレーターの入力側にはコンデンサはを入れていない(無くても、まず発振したりしないし、レギュレーションが悪くなる事も無い)
※緑 LED は超高輝度を使った為(手持ちがそれしかなかった)、電流を少なくしても、直視できないほど刺すような明るさで、失敗・・・、ブルー LED に交換する予定

最後にケースにレタリング

IMG_0439s
※新旧、2台のISP

IMG_0440s
※USB コネクター部分の違い

(2) 動作検査
まず、ファームやツールなどをダウンロードする。

今回使ったのは「hidspx-2012-0326.zip」で、既存の ISP で、2313 にファームを書き込んだ。

hidspx-2012-0326/bin/firmware/main-12.hex

ヒューズの設定は、ここに詳しく書かれている。

さて、一応、配線を確認後、PC の USB ポートに接続する、しばし・・・
問題なく、デバイスドライバーがインストールされた。

※自分の環境は、Windows7 64 ビットだ。
※USB2.0 のハブに接続している。

HIDaspxDeviceMan
※デバイスドライバーは、「HID 準拠デバイス」として認識されているようだ・・

(3) ツールの用意

hidspx-2012-0326/bin/hidspx.exe があるので、cygwin などのシェルを起動して、このコマンドを使ってみる。

↓以下のようにコマンドを打てば、認識したデバイスを表示してくれる。
% ./hidspx -ph?
VID=16c0, PID=05df, [ YCIT], [HIDaspx], serial=[0000] (*)

では、AVR を ISP に接続して、ヒューズビットを読み込んでみよう~
% ./hidspx -ph -d4 -rf
Detected device is ATmega88.

==== ATmega88 ====

Low: 11100110
||||++++-- CKSEL[3:0] システムクロック選択
||++-- SUT[1:0] 起動時間
|+-- CKOUT (0:PB0にシステムクロックを出力)
+-- CKDIV8 クロック分周初期値 (1:1/1, 0:1/8)

High:11-11111
|||||+++-- BODLEVEL[2:0] (111:無, 110:1.8V, 101:2.7V, 100:4.3V)
||||+-- EESAVE (消去でEEPROMを 1:消去, 0:保持)
|||+-- WDTON (1:WDT通常動作, 0:WDT常時ON)
||+-- SPIEN (1:ISP禁止, 0:ISP許可) ※Parallel時のみ
|+-- DWEN (On-Chipデバッグ 1:無効, 0:有効)
+-- RSTDISBL (RESETピン 1:有効, 0:無効(PC6))

Ext: -----001
||+-- BOOTRST (1:Normal, 0:BootLoader)
++-- BOOTSZ[1:0] (11:128W, 10:256, 01:512, 00:1024)

Cal: 182

※何かの拍子に、ISP が認識しなくなる事があるようだ、USB ケーブルをさし直すと直るようだが・・・

----- 注意!注意!注意! -----

hidspx は非常に高機能で、複雑、オプションなど注意を要する、得に、他の ISP プログラマーの機能を取り込んでいる為、他の ISP と混同すると期待した動作はしない。

※ありがちな事(自分もやった)
・USBaspx と HIDaspx を混同する。
※USBaspx は、libusb-win32 経由でデバイスとやりとりする為、libusb-win32 のツールを使って、デバイスを認識させる必要がある。

・libusb-win32 のツールを使って、HIDaspx を認識させてしまうと、hidspx で認識しなくなる。
※誤って、そうしたら、デバイスドライバーを削除すれば OK。
※HIDaspx はドライバーのインストールなどが一切不要で、直ぐに利用できる、半面、デバイスドライバーのプロパティでは、「HID 準拠デバイス」としか認識されない。

「千秋ゼミ」のページは、情報が多く、初心者には判りずらいかもしれない、しかしながら HIDaspx は非常に素晴らしい ISP なので、AVR のプログラマーを探している人は是非使ったら良いと思う。

追記:
> 何かの拍子に、ISP が認識しなくなる事があるようだ、USB ケーブルをさし直すと直るようだが・・・
外部電源に、数百mA程度を消費するような機器を繋いだ場合に、瞬間的に電源電圧が変動して、ATtiny2313 の機能が止まって認識しなくなるようです。
※Windows のデバイスマネージャーからは、正常に見えている。
そこで、外部電源ラインに、直列にフェライトビーズ「BLM18PG471SN1D」(秋月電子扱い)を入れたら、安定しました。
※470オーム(100MHz)/1000mA/0.2オーム(直流抵抗)

AVRでUSBゲームコントローラーを自作する

自分フレームワークの実装過程で、前回、エミュレーターソースを流用してスペースインベーダーを作成した。

GLFW3 には、標準で、ゲームコントローラーの取得 API があるので、それを使ってみる事にした。

適当な USB ゲームパッドを買っても良いのだがー、備品の中に、ファミコン時代に購入した、「ASCII STICK II TURBO」が埃をかぶっている事を発見したー

IMG_0423s

内部
IMG_0424s
※ボタンの「受け」などは鉄板で補強してあり、筐体はプラスチックだが、必要な剛性を確保してある。
※設計は、当時ナムコの筐体デザインなどをしていた遠山さんと言う噂なのだがー、この創りの良さとこだわりは、実際そうなのだろうと思う。

当時5000円くらいはした覚えがあるが、機能的には、ファミコン用なので、ボタンが少ないのだがー、連射や、4方向、8方向切り替えなど、色々と芸が細かい、
デザインも優れているし、剛性も高く、方向レバーはマイクロスイッチで、価格以上の素晴らしい創りとなっている、今回はこれを改造する事とした。

USB のゲームコントローラーでは当然ながら、制御用マイコンが必要だが、ネットを探すと色々ある、今回利用させてもらったのは「ココ」のサイト。
AVR を使った USB ゲームデバイスで、最近ではあまり馴染みの無い ATMega8 を使っている。
手持ちの ATMega88 とかで出来れば良いのだがー、このコントローラーの制御ソースはアセンブラなので、ATMega8 を別途購入した(秋月で180円)。
そもそも、USB の通信機能が無い AVR でUSB(Low スピード)の通信を行うのはかなりハードルが高い、マシンサイクルを正確に計算して、ソフトウェアーのタイミングループだけで、USB の制御信号を
生成しているのは、クールとしか言いようが無い。

ASCII STICK には、何に使うか最後まで不明な「OPTION」コネクターがある。
丁度良いので、USB コネクターはここに出そうと考えて、工作してみた。

IMG_0429s
※回路は、特に変更はしていないが、USB の差動ラインに入っている68オーム、手持ちが無かったので75オームとした。
※アナログの電源ライン「GND」も回路図ではオープンとなっているが、一応 GND に落としておいた。

----- Fuse ビット書き込み時の注意 -----

ATMega8 は、ピンアサインなどは、ATMega88P などに近いものの、古いデバイスで、注意する点があります。
現在も流通はしているものの、ATMega88Pや上位デバイスに置き換えるのでしょう。
※自分もそれでハマリました・・・
まず、ヒューズビットを書き込む場合ですが、最初に low バイトを書き込んでしまうと、発振機が動作しなくなります。
これは、「fuse.txt」の値が適切とは言えない点と、ATMega8 の仕様によるところにあります。
12MHz のクリスタルを使う場合なので、high バイトの「CKOPT」を変更して、「0」にしておく必要があるようです。

僕は、色々やった結果、high バイトに「0xC9」、low バイトに「0xEF」を書き込んでいます。
※WatchDog は有効にした方が良いかもしれません・・
※fuse.txtでは、low バイトの CKSEL が、「External Low-frequency Crystal」となっていて、これは絶対間違っていると思います。

AVR の痛いところは、fuse の書き込みを失敗すると、再起不能になる場合がありますので、注意が必要です。
クロックの選択を誤った場合は復帰するチャンスはありますが、「RESET」端子とかを無効にしたりすると、ISP でのプログラムは不可能となります。

IMG_0431s

IMG_0433s
※いつものフォーレックスを適当に削って、USB コネクターのカバーにした、基板とLOCTITE で接着してある。

Game_Controler_Dialogjpg
※ゲームコントローラーとして認識したダイアログ(ボタンが多いのは愛嬌)

フレームワークを USB コントローラーに対応した。
ソース
バイナリー

RX マイコンでC++

少し間が空いたけど、またまたRXマイコン関連ですー

日本の組み込み(趣味)マイコンでは、まだ「C」が主流で、「C++」の情報が少ないように感じる。
デバイスドライバーもCで書かれたものが殆どで、C++で書かれた物が少ない(日本国内では観た事が無い)
※たとえば、複数チャネルを備えたUARTなど、テンプレートクラスを使えば、拡張性のあるコードがシンプルに書けると思う。

Windows などのアプリケーションプログラマーは別だが、組み込み系プログラマーは、まだC++に対して、「負」の感情を持っているのだろうか?

最近AVRでプログラムする機会があり、C++が実用レベルで扱える事を知ったー
又、arduino を触る機会があり、そのコードはC++が中心である事も知った。
ARM系、海外の組み込みプログラムでは、C++が普通に使われている、何故日本は未だにCなのだろうか?

さて、RXマイコンの開発環境なのだがー、C++でプログラムする場合に必要な事を考えてみたい。

AVRではメモリーの制限からSTLを扱う事が困難だ、RXマイコンなら全てのデバイスでは無理だけど、少なくともRX621など、RAMもROMもある程度豊富にあればSTLも怖くないと思われる。
以前にSH2AでSTLが正しく動作しなかったのだが、それは、静的な初期化関数のコンストラクターが正しく呼ばれていない事に起因するようだった。

ARMの gcc などの情報から、「.ctors」セクションに初期化が必要な関数のコンストラクターテーブルが格納される事は判ったので、リンカースクリプトに.ctorsセクションのロード命令を記述して、簡単なコードを書き、アセンブルリストを観て確認してみた。

typedef unsigned int uint32;

class func {

uint32 count_;

public:
func() : count_(0) { }

void service() { ++count_; }
uint32 get() const { return count_; }
void set(uint32 v) { count_ = v; }
};

func func_;

↑たとえば、こんなクラスを宣言して、静的なクラスを配置する、「func_」は、main 関数が実行される以前にコンストラクターが呼ばれなければならない。
※funcクラスでは、コンストラクターで、count_を0で初期化している。

リンカースクリプトに、以下のように書いたが、mapファイルを観ても、.ctorsのサイズは0となっている・・・
.ctors :
{
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
}

最適化を0にして、アセンブラリストを確認すると、初期化関数自体はあるが、当然呼ばれていない・・・

fff80b31 <__GLOBAL__sub_I_func_>:
fff80b31: 7e a6 push.l r6
fff80b33: ef 06 mov.l r0, r6
fff80b35: 66 11 mov.l #1, r1
fff80b37: fb 2e ff ff 00 mov.l #0xffff, r2
fff80b3c: 39 c7 ff bsr.w fff80b03 <__Z41__static_initialization_and_destruction_0ii>
fff80b3f: 3f 66 01 rtsd #4, r6-r6

そこで、C++の標準的リンカースクリプトを参考にしてみたー「/usr/tkdn-20110720/rx-elf/rx-elf/lib/rx.ld」
そして、判ったー、最近の gcc では、別のセクションに格納されているようだー、これは、4.6 くらいからそうなったようだー

PROVIDE (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE (__preinit_array_end = .);
PROVIDE (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE (__init_array_end = .);
PROVIDE (__fini_array_start = .);
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
PROVIDE (__fini_array_end = .);

※ちなみに簡単に説明すると、「.preinit_array、.init_array」セクションが、コンストラクターの開始アドレステーブルが格納されるセクションであり、「.fini_array」はデストラクターの開始テーブルが格納されるセクションとなっているようだー
又、「KEEP」は、重要なキーワードで、最適化された場合、どこからも参照されないアドレステーブルは、削除される為、それが起こらないようにするものだ。

「__GLOBAL__sub_I_func_」は、「__Z41__static_initialization_and_destruction_0ii」を呼んでいるのだが、コンストラクターとデストラクターが共通になっており、引数を使って呼び分けているようだ。

初期化コードはこんな感じ~

int main(int argc, char**argv);

extern int sbss;
extern int ebss;
extern int idata;
extern int sdata;
extern int edata;

extern int _preinit_array_start;
extern int _preinit_array_end;
extern int _init_array_start;
extern int _init_array_end;

int init(void)
{
// R/W-data セクションのコピー
{
int *src = &idata;
int *dst = &sdata;
while(dst < &edata) { *dst++ = *src++; } } // bss セクションのクリア { int *dst = &sbss; while(dst < &ebss) { *dst++ = 0; } } // 静的コンストラクターの実行(C++ ) { int *p = &_preinit_array_start; while(p < &_preinit_array_end) { void (*prog)(void) = (void *)*p++; (*prog)(); } } { int *p = &_init_array_start; while(p < &_init_array_end) { void (*prog)(void) = (void *)*p++; (*prog)(); } } // main の起動 int argc = 0; char **argv = 0; int ret = main(argc, argv); return ret; } C++ テスト・コード

※今後 rx.ld を解析して、自分のシステムに合った物に修正する必要がある、リンカースクリプトにはまだまだ不明な事が多い・・・

とりあえず今回はここまで。

16×16ドットマトリックスLEDでテトリス

昔は、「C++」なんてのクチでしたが、ここ数年は、C++ を改めて勉強するようになり、ようやくやりたい事が表現出来るようになってきました。

C++ は非常に難しい言語なので独学では難しい側面もあり、習得には時間がかかりますが、複雑な処理を安全で判り易く記述する事が可能だと思います。
※自分は、友人のおかげでスマートに学習する事が出来ました。

C++ の場合、記述方法として「かなり強く従わせる」ような風潮があります、しかしこれには「意味」があります、多くの人はそれが自分のスタイルに合わないとか、馴染まないとか言って、避けてしまい、本当の価値を見失っている事が多々あり、誤解されている事を多くみかけます。
又、不合理で自分勝手な方法論で実装された、クズ同然のコードも多くみられます、非常に残念ですが、良い「先生」を見つける事は難しいのです。

今まで、AVRではメモリーが少ないとか、組み込みマイコンでとか、やった事無いとかなどの理由で「C」言語での開発でしたが、WinAVR で、C++ も使える事が判り、C++ に移行しています。
WinAVR では、STL は標準ではサポートしていないようですが、boost も一部使う事が出来ます、一番の問題は、メモリーが少ない点で、それさえ設計の段階で考えておけばコード効率も優れているようです。
普段のプログラムを C++ で創るのが日常的になると、C ではもはや満足出来ないところまできています(精神的)しかし良い時代です、512 バイトの RAM と 8 キロバイトの ROM を持った 8 ビットの RISC でも C++ で実装出来るのですから。

今回、ATMega88 でドットマトリックス LED を制御するに辺り、スイッチを付けたので、何か、ゲームでも作ってみたくなり、「テトリス」を作ってみました。
※バグが色々ありますがww

ATMega88 LED DotMatrix 16x16
ATMega88 LED DotMatrix 16x16

Dot Matrix LED TETRIS

ソースコード一式

16×16ドット・マトリックスLED

以前に、秋葉原の「鈴商」で赤色 LED の16×16のドットマトリックスが安く売られていた。
※確か400円くらいだったと思う、今でもまだ在庫があれば売られていると思う、緑もあったと思う。
LT-5013T

この手の物はジャンクに近いものだが、一応新品で、簡単なピンアサインをメモした紙が付いている。
16×16くらいの物だと、普通に買うとかなり高価で、このくらいの解像度があれば、かなり面白い表現も出来る。
丁度、キッチンタイマーを作ってみたくて、1個買っておいたーーー
それから数ヶ月、ようやく時間が取れたので、ドライブしてみた。

最初の問題は、このモジュールから出ているピンの間隔だ、「2mmピッチ」うーーん、ユニバーサル基板には不満な間隔・・
他の8×8とかは2.54mmピッチなのに、しかも32本を格納出来ない事も無いのにーー(それが安い理由かもしれないww)
まぁ、このモジュールの設計者(タコ)は、自作する立場を考える必要も無いので、適当に選んだ結果なのだろうけど・・・
しかた無いので、まずピッチ変換基板を作って、作業性を良くする事から始めた。

DotMatrixBottom

かなり強引だけど、とりあえずインチピッチのコネクタで接続出来るようにした。

次にドライバーの仕様を考えた、16×16のダイナミックスキャンだけど、全てのLEDを点灯した場合、1個に2mAでも512mAも必要。
ダイナミック点灯なので duty は1/16となる、たまたま秋月で、8ビットのシフトレジスターとラッチが合体したIC「NJU3711D」を売っていたので2個購入。
残念なのは、このICは5V動作で、電流も最大25mA、3.3Vで駆動出来ない、でもまぁいいか・・・
※買った後で見つけたのだけど、TIにまさにLEDドライブの為のICがあったTLC5940これを知っていたら、これにしたのに・・・

さて、気を取り直して、仕様の続き、25mAだと、1/16で、1.5625mA、少し暗いかなぁーと思って、テストしてみたが、そんなに暗く無い事が判り、全体で25×16=400mAの消費となった、これならUSBの電源でも駆動できる。(ソフトを作る時を考えるとUSBの電源でまかなえるのは正しい!)

キッチンタイマーにしたいので、なるべく小さく作りたい。
デコーダーに74HC138を2個使い、4to16のデコーダーとした、マイコンは、おなじみのAVRとした、在庫が沢山あったATmega88にする。(168や328に交換できるので便利)
74HC138で25mAを吸わすのは厳しいと思い、PチャネルデュアルMOSFETFDS4935Aをドライブしている。

DotMatrixTop

基板の裏はこんな感じ

DotMatrixBottom2

かなり苦しいけど、とりあえず1品物なので、まぁいいかーーーって感じ。

とりあえず、0.5秒間隔ランダムで表示してみた。

これから本格的にソフト開発なのだが、スイッチ類と音をどうするかを考えないといけない・・・

-----
文字の表示を行ってみた、リソースは以前に作った液晶用の6×12ピクセルのフォントなど。
文字のスクロール

RX マイコン

今更感が強いが、秋月のRXマイコンボードを動かしてみた。

AKI-RX62
AKI-RX62

コストや開発環境、性能、その他色々な点を考えると、ARM マイコンを使う方が「筋」なのかもしれない・・
しかし、個人的な理由で、RX マイコン「推し」なのである。
・国産だから。(昔から日立のマイコンを多く使ってきている)
・ルネサスには頑張って欲しい。(逆風の中、色々頑張っている様子が伺える)
※プロダクトは悪く無い、折角伸びしろがあるのに、単純なコストの勝負で無くなってしまうのは残念・・
・比較的安く入手できるようになった。
※以前は、個人には売ってくれなかったが、最近は、1個でも購入可能となっている。
・周辺のペリフェラルが扱いやすい。
・ドキュメントが日本語である。(別に英語でもいいけどww)

など、「推し」の理由はいろいろとあるけど・・

「日本人だろ!、RX使えRX!」みたいなww

・開発環境の整備
まずは開発環境、ルネサスには統合環境もあるし、フリーで使えるものもある、しかし、しかしである・・・
自分はどうも IDE と呼ばれるところの統合環境があまり好きでは無い、gcc と make emacs があればそれで良いと思ってる。
エクリプスとかは最悪だと思う。
確かに、Visual Studio は、本当に良く出来ているし、デバッグ環境は素晴らしい~、しかし、常にあそこまでの環境は必要無いと思う。
※まぁ、考え方は人それぞれであるし、強制は出来ないけど~

趣味程度の遊びで、C コンパイラに10万とかありえないので、開発環境にコストはかけられない、そこで、当然のように gcc !
て言うか gcc が好き!
※Windows のプログラム開発でも gcc をメインに使っている~
組み込みのプログラムであっても C++ を多用するつもりなので、boost とかも部分的に動かすつもり、なので g++ も動作可能な事。
※将来的には C++11 も使いたい!

1)cygwin の整備
gcc を使う場合には、この環境が一番扱いやすい
※ make、makedepend を入れておく事

2)RX 用 gcc の準備
自分でソースコードから作ろうかと思ったが、コンパイル済みのバイナリーを入手出来るので、とりあえず、それを落とすのが良いと思う。
rx-elf-gcc

※展開は以下のように行う
$ cd /usr
$ tar xjvf tkdn-20110720-gcc.tar.bz2
.bashrc にパスを通しておく
> PATH=$PATH:/usr/tkdn-20110720/rx-elf/bin

3)RX マイコン用フラッシュプログラムツールのインストール
現在、フラッシュのプログラムツールは2種類あるようだ、「FDT(Flash Development Toolkit)」と、「Renesas Flash Programmer」
で、後者の方が、フラッシュの書き込みだけなら簡単で判りやすい。
※ツールのダウンロードにはアカウントが必要(無償評価版をダウンロード)
※ FDT でも書き込めます。

4)サンプルプログラムの入手
動作確認を行う為のサンプルプログラムを用意しました。
LED テストの簡単なサンプル

5)コンパイルと実行
$ make
でコンパイルされ、フラッシュ書き込み用モトローラー形式のファイルが出来ます。
AKI-RX62 に確認用 LED(赤) をCN1、25番(P30) に接続します。
※抵抗は 680 程度
「Renesas Flash Programmer」を起動します。
AKI-RX62 は、DIP スイッチの 1(BOOT)、2(リトルエンディアン)を ON 、3、4を OFF とします。
USB ケーブルを PC と接続し、電源を入れます。
※最初に接続した時は、ドライバーのインストールなど多少時間がかかります
※ アプリケーションの設定では、USB Direct で接続し、12.0MHz、x8、x4 とします。
mot ファイルを選択して、「スタート」すれば、書き込みが開始されます。
電源を OFF にして、DIP スイッチの1(boot)を OFF にしてから電源を入れると、LED が点滅すると思います。

次回は、もっと実用的なプログラムを紹介します。

LEDシーリングライト

最近ツイッターに、製作記をつぶやくので、長文でのブログはあまり書かなくなってきている・・

それでは宜しく無いので、先日作ったLEDシーリングライトの製作記などを~

-----

動機としては、パワーLEDが安くなった事で、高輝度な照明を作るハードルが下がった事が要因に思う。
それと、インバーター式蛍光灯は、意外と寿命が短く、直ぐに交換の時期が来る。
イニシャルコストは高くても、長持ちして、電気を食わないのはありがたい、コストは直ぐに回収できる。

最近、それなりの値段で購入出来る電球型LEDランプを沢山使って、シーリングライトを作る事も考えた
けど、あのLED電球は罠だと判ったww
光量をギリギリまで出す為と、なるべく買い替えサイクルを短くする為、LEDの仕様ギリギリで使っている、
発熱も多く、光量が落ち始める時期が早く、制御回路もわざとショボく作っていると思う。
※自分の予想では、LEDの光量が落ちる前、保証期間が切れる辺りで、壊れると思う、2000円やそこら
の品が10年とか使えたら、電気メーカーは困ると思う。

LEDシーリングライトは、まともなやつを買うと5万とかするので、自分で作るのが一番となるww

いわゆる1WパワーLEDは、350mAの電流を流すことができ、大体100ルーメンの光量が得られる。
効率で考えると、砲弾型や、チップ型のLEDを沢山並べて1Wの電力で発光できる「光量」の方が大きい。
※たとえば、秋月で50個1700円で売られている角型のLED(OSW443Z4E1)の場合だと、
30mAで30ルーメンの光量が得られる(但し、内部は3個直列なので)1Wの電力で得られる光量は、
116ルーメンとなる、発熱も少ないので、放熱は必要無い。

パワーLEDの、もう一つの問題として、「熱」がある、1WのパワーLEDは放熱無しでは、使えない、
それも、かなりおおきな熱を出すので、それなりに大きな放熱器が必要なので、意外と使い勝手は悪いと思う。

とはいえ、とりあえず作って、使ってみない事には、判らない事も多い。

6畳の部屋では、どのくらいの明かりが必要なのだろうか?
売られているLEDシーリングライトの光量からすると4000ルーメン以上は必要そうである・・
とりあえず、秋月で、24V30WのSW電源が安く売られていたので、それを使って3000ルーメンを目標
に作ってみた。

秋月で、パワーLEDが3個アルミの基板に接続済みのモジュールが600円で売っていた、とりあえずコレを
10個買って来たー(6000円)、定電流モジュールは、以前にストロベリー・リナックスで買ったパワーLED
用モジュール、1個のモジュールで、LEDモジュール2個を直列(9個)に駆動するので、5個のモジュールを使う
(525円×5個)

まず最初に、どのくらいの放熱が必要なのか調べてみたー、そして、一番コストの安い方法を考えた。
ホームセンターで、3mm厚のアルミバーを買って、10分割し、表面積を稼ぐ為、穴を開けてみた。
そしてLEDモジュールに取り付けて、実験してみたー・・・

うーーん、十分じゃないかな・・、もっと小さくても良いかもしれない・・
※実際には、50円で買った、TO-220用の放熱器を足しているけど・・

さて、このLEDモジュールでリグを組む、アルミアングルが安くて丈夫で軽い。

で、こんな感じで出来た~

初めは、暗いかもと思ったが、十分な明るさがある、それと、電源を入れて直ぐに明るいので気持ちいが良い~
※パワーLEDは明るさが集中している為、直接観ると目が焼ける感じで危ない、もっと緩い光じゃないと、寝室には辛い。
それと、調光も必要だなー

2号機は、4500ルーメンくらいで作るかな~

クアッドコプター4

前回の記事から、随分経ちますが、4回めをポストします。
ゲーム関係の仕事で時間が取れず、休みの日は、何もヤル気が起きず、映画観たりして、ゴロゴロする日が続いてました・・(涙)

SH7125 で制御基板、ソフトを作っていましたが、ジャイロの I2C 読み込みが上手く出来ずに悩んでいました。

でも、とりあえず、空に浮かべたくて、完成した制御ボードを購入してみました、でも自作制御ボードは引き続き進めます。
制御ボードは色々調べると、「Hobbyking KK2.0 Flight Controller」 が安くて、高性能な感じで、購入しました。

このボードの特徴としてー
・クワッドコプターだけではなく、色々なタイプのマルチローターや通常のヘリなどを電子制御で安定させる事が出来るようです。
・液晶表示付きで、セットアップが簡単です。
・ISP ポートもあり、ファームの書き換えで、バージョンアップに対応出来ます。(Atmega324)
・低価格($29.99)、国内では、Daytona7 で扱っていました。(4200円)
※ただ、今観たら、リストに無かったですね・・、Hobbyking から直で買っても、送料と時間が少々かかるだけなのですが・・・
・ジャイロは3軸「InvenSense Inc.」、加速度センサーも3軸「Anologue Devices Inc.」
・ファームは非常に良くできているようです、ソースコードも公開されています(アセンブラ)

これだけの機能と性能で、この値段は凄いですー

設定ですがー、簡単なマニュアル(PDF)がありますーが、良くわからない部分も多く、先人のブログなどが役にたちます。
※自分も色々参考にさせてもらいました、ありがとう御座います~

初号機

でーーー、とりあえず、試行錯誤を行い、空に浮かべるまでできましたが、直ぐに墜落させてしまい、プロペラが折れたり、色々修理してます・・(涙)
垂直に上げて、また下ろすだけのつもりでしたがー、ドリフトして補正したら逆に動いて、パニックになり、無理な操作を行い、ガシャーンです(涙)
とりあえず、ラジコンなんで、操縦を習得する必要がありますね・・・