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

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

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)がありますーが、良くわからない部分も多く、先人のブログなどが役にたちます。
※自分も色々参考にさせてもらいました、ありがとう御座います~

初号機

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

クアッドコプター3

骨組みが出来たら、現実味が増した感じですけどー、まだまだ先は長いですねー
まず、基板に、ジャイロ。加速度センサーを中心に配置しました、残りのスペースにCPUなどを載せます。
今回は手持ちの関係で、SH7125を使う事にしましたー、現在では、100MHzのRXマイコンが手頃な価格で入手できるので、わざわざ、過去のCPUを使う理由も無いと思いますがー、タンスの肥やしにするのもアレなので、あえてこれを使います、機能的には十分なものと思います。
SH7125とRXマイコンの比較(参考)
・価格
SH7125F(R5F71253) ---> 900円(秋月の価格)
RXマイコン(R5F56218BDFP) ---> 950円(秋月の価格)
・内蔵メモリー
SH7125F ---> フラッシュ128キロバイト、RAM8キロバイト
RXマイコン ---> フラッシュ512キロバイト、RAM96キロバイト
・速度など
SH7125F ---> 50MHz、5V動作、各種タイマー、A/Dなど
RXマイコン ---> 100MHz、単精度浮動小数点演算器、2.7V~3.6V動作、A/D、USBインターフェース、リアルタムクロックなど

どうです、比べるまでも無い感じですね・・
※基板作る時にはRXでやってみようとおもいますねー

まあでも、SH7125のりソースは少しだけあるので、未知のCPUで、荒波に飛び込むより、無難ではあります、でもやっぱりメモリー(RAM)が少ないのは痛いです・・
プログラム変更の度にフラッシュに書き込むのは面倒だし効率が悪いので、簡単なモニターを用意して、実験段階ではRAMで開発をするのが一般的な方法です、自分も、Sフォーマットをロードしたり、メモリーのダンプを行うモニターを作成しましたが、RAMが狭く、色々考えながら進めないと駄目な感じです。

昨日も、インプットキャプチャー機能を試していると、1チャンネルだけなら動作するのに、複数のチャネルを同時に動かすとハングアップしたり、妙な動作をしていましたがー、よくよく調べてみると、スタックの領域と、ワークエリアが接近し過ぎていて、ワークエリアを壊していたようです・・・
※これ気がつくまでに凄く時間がかかりました・・・・・

・プロペラの話・・・
クアッドコプターでは、2組の正転、逆転の組みを作り、回転による反力を相殺します、最初、「あぁ、逆に回すんだから、プロペラを逆に組めばいいんだよねー」と簡単に考えてましたがー、実際に逆転にしたら、風向も逆になるだけで意味ありません、よーーく考えると、「ピッチが逆じゃないと駄目なんでは・・」と思いましたー、ネットを調べると、CW/CCWペアとかでプロペラ売ってました、「あーーあ、なるほどねー」って感じで、急遽、シンガポールで売っていた8インチ、ピッチ4.5のプロペラを購入しましたー(汗)

このクラスだと、飛ぶ事は出来るでしょうが、やはり推力は出ない感じなので、実験機が上手くいったら、RXマイコンで作り直します、その時は10インチのプロペラでやってみたいですねー

続く~

クアッドコプター2

センサーを入手したところで、送信機、受信機をどうするか・・

以前は、2.4GHzの無線モジュールを使って自作しようと思いましたがー、「早く飛ばしてみたい!」とゆー事で、既存の物を買う事としましたー、例によって色々探すと、アメリカで売っている(中国製)やつが安くて高性能な感じですー、しかし、今ひとつ食指が沸かない感じです・・、そんな時、いつもお世話になっている Daytona7 でプロポを観たら、JR(日本遠隔無線)製のプロポセットがそれなりの価格で売られていたので、それを購入してみましたー
高いですがー、安物買いの何とかとゆーのもありますし、丁度良い落とし所と思います。

送信機は7チャネル、受信機は6チャネル?、基本、4チャネルあれば、ヘリコプターの機動には十分そうですがー、何か別のものを制御する事もできるしで、7チャンネルくらい必要だろうと思った次第ですー、又、この機種はテレメトリー機能があり、機体の情報をプロポに返す事が出来ます。
標準では、受信機の電圧しか返せませんが、オプションのセンサーを繋げば、色々な情報を返す事が出来るようです。

-----

さて、肝心の機体ですがー、実験機という事もあり、お手軽に作る事を考えていましたー、そこで、ホームセンターで入手できるアルミの中空材に注目しました、10mm角で、1mmアルミの押し出し材でしょうか?、アルマイト処理もしてあり、軽いです、機体は軽ければ軽いほど良いのですが、ある程度の強度も必要です、このアルミなら強度は十分で、穴を開けて軽量化も可能と思い、これで基本の骨格を制作します、中心をフライスで削り、十字に合わせます。

そして、端にモーターをマウントします。


↑モーター試運転の様子。

プロポのスロットルを中間より少し上目くらいにすると、ほんのり浮き上がります~、モーター4個なら、十分な推力が得られると思えます。

-----
じつは、フライス盤の加工範囲の関係で、最初は30cmくらいで造りました、しかし、モーターを載せてみると、プロペラが当たる事が判明・・・、34cmで作り直しました・・・ルート2倍の計算がちゃんと出来てなかった。