hira のすべての投稿

GLFW3と自分FWを使って昔懐かしい「Space Invaders」を作る

以前から、チクチクとゲーム開発の補助になる自分用フレームワークを作ってきましたがー
GLFW3 がリリースされたタイミングで、glut から GLFW3 に変更していましたが、とりあえずのベータが出来たので、アーカイブを公開します。

自分用フレームワークの完成度を上げるには、一通りの機能を使って、アプリケーションを作る必要があるものです。
また、C++ の熟練度が少しづつ向上して、ソースコードの品質も少しづつではあるけど洗練されてきつつあります。
そこで、何か良い題材は無い物かと考えてましたが、とりあえず、キーボード入力と、サウンド(効果音)が出る、そして簡潔に出来る。
などの理由で、昔懐かしい「Space Invaders」を作る事にしましたww

「作る」と言っても、「Space Invaders」は、mame32 由来のエミュレーターソースをそのまま使います。
※その為、このソースコードもそれらライセンスに従います。

スペースインベーダーは、8ビットのZ80(2MHz)を使い、256×240のモノクロビットマップグラフィクスを使ったゲームで、
当時は、もの凄く洗練されていました。(今でも洗練されていると思う)
エミュレーターは、8080のエミュレーションと、インベーダーのハードをエミュレーションします。
結果は、モノクロビットマップの出力として出てくるので、OpenGL のテクスチャーに貼って、描画します。
インベーダーはアナログシンセサイザーを持っていて、現在では、はサンプリングされたデータを入手出来るので、それを使いSEとして
発音します。

spain

プログラムの動作には、ROMイメージが必要なので、どこかで見つけて下さい。
※このプログラムでは、sounds.zip、invaders.zip の二つのアーカイブを必要とします。
ここが参考になると思います

ソースコード

コンパイルに必要なライブラリー郡、/usr/local 以下に展開

boost_1_53_0 が必要です。

コンパイル済みバイナリー

※操作方法
「1」1プレイヤーボタン
「2」2プレイヤーボタン
「3」コイン
「←」ビーム砲左
「SPACE」ビーム発射
「→」ビーム砲右

GLFW-3.0.1 の機能追加

GLFW ですが、既に 3.0.1 がリリースされてましたーー

Bugfix: The wrong name was used for the CMake variable for the Xxf86vm library
[Cocoa] Bugfix: glfwGetFramebufferSize return the size in screen coordinates
[Cocoa] Bugfix: Messages not supported on Mac OS X 10.6 were used without tests for precence
[Cocoa] Bugfix: Process transformation was not performed if menu bar creation was disabled
[Win32] Bugfix: Context creation was attempted even if no valid pixel formats had been found
[X11] Bugfix: Duplicate window position and window and framebuffer size events were reported

まぁ、基本的にBugFixのようですが・・・

さて、OpenGL のアプリケーションですが、作っていて不便な事があります、アプリケーション・ウィンドウに
ファイルをドラッグ・アンド・ドロップして、ファイル名を受け取る事が出来ない事です。

アプリケーションを作る上で不便なので、GLFW を改造して、この機能を付けましたー

glfw-3.0.1 のパッチ

glfw-3.0.1 のソースを展開して、ルートディレクトリーに異動後、以下のコマンドを入れればパッチが当たると思います。

patch -p0 < glfw_3_0_1-dropfiles.diff で、make すれば OK。 exsamples に dropfiles.c のサンプルがあるので、これを観ればどのようにファイル名を受け取るのか判ると思います。 もっと実用的なサンプルとして、ビューアー・プレイヤーを作りました。
※ソースコードが欲しい方は、連絡下さい、必要なフレームワークの準備に少し時間が必要です。

このアプリケーションは、起動すると、空のウィンドウが開きます、ここに画像ファイル(BMP、PNG、JPEG、JPEG2000)や音楽ファイル(WAV、MP3)を落とせば、それを開きます。
※音楽ファイルは再生します、MP3に画像が含まれている場合は、それを表示します。

※メイン部分だけアップしておきます~

GLFW3.0 を使う

自分のフレームワークとして、「gl_fw」と言うプロジェクトを実装していましたがー

最近(そうでもないかww)、GLFW と言うフレームワークがある事を知りました、現在のところ、OS-X、X11、Windows で使える、マルチプラットホームのフレームワークです。
C、Objective-C(OS-X)で実装されており、シンプルで、良く出来ています。
※「glut」があるのですが、これは、メンテナンスされていないし、色々と痛いところが多いのです。

最近、メジャーバージョンが「3.0」となり、「2.x」から、より洗練された実装になりましたー、まだ機能で欲しい部分は色々あるのですがー、これから追加されていくと思います。

自分のフレームワークも glut から GLFW に変更すべく色々修正中です。
GLFW 3.x で良い部分をいくつか上げると・・・
・マウスホイールのイベントを取得できる。
・クリップボードのやり取りが追加された。
・メインループから綺麗に抜けてくれる。(glutでは、スマートでは無い方法で実装しなければなりません・・)
・ゲームパッドの値を標準的に取得できる。
・キーボードの扱いがゲーム向き。(単純に押したか、押さないを取得できる)
・必要最小限の機能だけ用意してあり、わかり易い。
・ライブラリーをコンパイルするのが簡単。(cygwin の windows クロスコンパイラ i686-w64-mingw32 でコンパイルできるようになった)

現在の「3.0」には、ドロップファイルのイベントを受け取る機能が無いので、これは自分で足そうと思います。
※「2.x」で実装したので、「3.0」風に書き直す感じww

cygwin で glfw-3.0 をコンパイルする手順を書いておきます。

(0) cygwin に i686-w64-mingw32-gcc、cmake などをインストールしておく。
(1) glfw-3.0 のソースアーカイブを取得して展開する。
(2) glfw-3.0 に移動
(3) 「cmake -DCMAKE_TOOLCHAIN_FILE=CMake/i686-w64-mingw32.cmake」
(4) 「make」
※何も指定しないとスタティックリンクライブラリーが作られるようです。(DLL にする意味は無いと思う)

これでおしまい!(ああ、何て簡単なんだろ・・)

(5) 「make install」で、/usr/local/以下にインストールされます。

では動かしてみましょう!


#include <stdlib.h>
#include <GLFW/glfw3.h>

int main(int argc, char** argv);
int main(int argc, char** argv)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();

    return 0;
}

※ cygwin のコンパイルで重要なのは、リンクライブラリーとして、glfw3、opengl32、glu32、gdi32 を加える事です。

さて、ゲームなどで必要なのは、サウンド、スレッド、画像の読み込み等ですが、GLFW のポリシーでは、「これをフレームワークに含め無い方が良い」との考えのようです。

自分もそう思います、自分は、以下のように解決しています。
・サウンド ---> OpenAL を使うのが良いでしょう~
・スレッド ---> POSIX のスレッド pthread を使う。(OS-X、Linux、mingw では標準です、VisualStudio を使う場合は、pthread-win32 ライブラリーを使います)
・画像 ---> libpng、などを使えば良いし、読み込みをサポートするライブラリーやソースは沢山あるので、自分に合った物を選べば良い。

「gl_fw」(紛らわしいけど、GLFW を知る前からなので・・・)の改修が終わったら、またブログを書きます。
※gl_fw は、C++ を使ったフレームワークで、サウンド(単音、ストリーム)を扱うクラス、画像ファイルを単一的に扱うクラス、フォント(漢字)、GUI、などそこそこ高機能な物です。
ソースコードは、テストが済み次第取得できるようにしますが、興味のある人は連絡下さい~
githubから取得出来ます。
※glfw3には、ドロップファイルを受け取る改修をしています(windows版のみ)、Libraries にlibファイルとヘッダーを用意しています。

9XR 送信機と FrSky テレメトリー

自分は、以前に JR の7チャネル送受信機を買ったのだがー、マルチコプターと、ヘリコプターを購入して、受信機を買い足す必要が出てきたー
それに、マルチコプターの本格的運用では7チャネルでは少し足りない感じもする・・・
残念な事に JR の受信機だけ買い足すのも、割高な強気値段で、どうしたもんかなーと考えていたらー、9チャネル送信機が5000円!、えっ?!

そうなんですー、モジュール式の送信機だけなら海外では格安で売られているのですー、品質はそれなりなのかなーと思ったら、そんな事もなさそうだしー
JR は DMSS に対応した物を購入したのですがー、実際、センサーなどのモジュールが割高で、テレメトリーとして運用するには、かなり厳しい・・
テレメトリーのモジュールを自分で作りたいけど、プロトコルは非公開だし、リバースエンジニアリングするのも億劫だし。

TURNIGY 9XR は JR 用モジュールが使えるようになっている。
TURNIGY 9XR

それから、格安の FrSky のテレメトリーモジュールも購入した。
※それでも、JR の受信機買うのとあんまし代わらないお値段。
FrSky DJT

FrSky D8R-II PLUS

FrSky のテレメトリーモジュールは、プロトコルが公開されており、自分で簡単に作る事も出来る。
そこで、とりあえず、送信機側表示モジュールを作って、実験してみようと思う。

基本的構成はいつもの AVR 、今回は ATMega328P を使った(250円)、それと、DJT とシリアル通信を行う為の RS232C のラインドライバー(ADM3202)、表示は、秋月の128×64ピクセルの液晶

9XR はオープンソースもあり、ファームを書き換えする事も出来るので、DJT からのテレメトリープロトコルを突っ込んで、9XR の液晶に表示させれば、シンプルでクールなのだがー、本体を多少改造しないと駄目なので、今回はパスする事にした。
まず、表示用液晶として、秋月電子で売られている128 x 64 のドットマトリックス液晶、この液晶、そこそこ小さく、手頃な価格で良いのだがー、痛いとこもある、接続が、2mm ピッチで自作向きでは無い、そこで、まず、付属のコネクターをユニバーサル基板に接着し、強度を増す為、スタビライザーみたいな物を追加した。
※2本なら、2mmピッチを無理やり2.54mmピッチに差し込める。

128x64 接続A
128x64 接続B

完成した基板
TelemetryBoadTop
TelemetryBoadBottom

とりあえず、ソフトウェアーは、アナログポートの数値を読み込むだけの物を仮に作ってみた。
DJT から送られてくるプロトコルは、以下の通り(ヘッダー、ターミネーター 0x7E、アナログポートのID:0xFE)

0x7E、0xFE、PORT1、PORT2、Link_quality(2)、0x00、0x00、0x00、0x00、0x7E
※FrSky のマニュアルでは、Link_quality は1バイトで zero が5バイト続くとなっているが、Link_quality は2バイトで、zero は4バイトのようだ。

port1 のアナログ電圧は4倍して表示してある。
リチウムポリマー電池の電圧を1/4にして入力すれば良い。
グラフィックス液晶の利点を使って、レベルバーも表示してある。
LCD の下に破線が表示されていて、プロトコルを受信している場合に、アニメーションする。
一応、プロトコルの生データを16進で表示している。
この LCD は、アイコンの表示があり、最下位の4ピクセルの On/Off で表示するのだけど、役に立たないので、63ラインは使わない事にする。IMG_0410s

自分で作ると、専用のカスタマイズを作成する事が出来るのが良い。

※ソースコード

※回路は、mainloop.cpp にポートと、LCD の接続をコメントしてあるので、それを参考に。
※液晶は低速で、コマンドを書き込んでから、それが有効になり次のコマンドを発行するまで待たないといけない、一般的には、ステータスを読み取るのだけど、
液晶を外した状態にすると、プログラムが進まなくなるし、ポートの制御が面倒なので、プログラムループで遅延している、その為 R/W は書き込みしか行わないので、GND に落とす。
※シリアルは、RXD、TXD を RS-232C のコンバーターを通して接続する、DJT:RXD と AVR:TXD、DJT:TXD、AVR:RXD となる事に注意されたい。
※そのうち、KiCAD のプロジェクトをアーカイブに含めるつもり。

HK-450 フライバーレス・ヘリコプター(1)

クワッドコプターは、機械的な構造がほぼ無く、巧みな原理で飛行するのでクールで好きだ。
また、コンピューター制御(フライバイワイヤ)と密接に関係していて、電子回路と切っても切れない関係にあるのも良い。
だからと言って、機械的な構造を駆使して飛行するヘリコプターが嫌いな訳では無く(むしろ好き♪)非常に憧れる~(内燃機関が好きな理由も同じような感じだろうか)
前から、自分で飛ばしてみたくて、小型の室内ヘリなど買う寸前までいった事があるけどー、難しそうだし、際限無くはまりそうでスルーしてきたー。

HobbyKingと言うショッピングサイトがある、主に模型関係の部品を扱っているのだけど、
値段が信じられないくらい安くて、日本では買えないパーツや、面白い試みのパーツが盛り沢山、一番の問題は日本からでは送料が割高になってしまう事くらい・・
※幾ら以上だと送料無料とか、日本国内なら安全確実に安い料金で何処でも送れる、この「送料」が高い現実に、何度も躊躇するのだが・・
でも良く考えて「まとめて」買えば、どうにでもなるかもしれないと思い込む事にする、利用しない手は無いww

HobbyKing は色んなとこにリンクが溢れていて、何かの拍子にウィンドウショッピングを繰り返す事も多くて、「欲しい」欲求が抑えられないよー
そんなこんなで「HK-450」このヘリコプターは、450 サイズの規格で作られたヘリなのだがー、え!?、って値段で売られている。マジで・・・
この値段なら買ってもしょうがないなww、で、後先考えずにとりあえず買ってしまった・・
「本体」だけでは、飛ばないので、モーター、バッテリー、サーボ、ジャイロ、ESC 、必要そうな物を全て購入してしまう。
※それなりの出費だけど、マイクロヘリより本格的なヘリが手に出来る。

ヘリコプターの事なんて何も知らないけど・・・

それが、昨日届き、情報を調べながら、組み立て始めたので、その顛末をここに書いておこうと思う。

組み立てがある程度出来てしまったけどー

HK-450 フライバーレス
HK-450 フライバーレス

こんな感じ~

「何故フライバーレスなのかー」
ヘリコプターにはジャイロ(ローター制御)が必須だけどー、フライバーレスは、それより厳密な制御が必要で、より電子化された制御が必要な事からー、クワッドコプターに近いのかもしれない。
「ヘリコプターは飛ばすのが難しい」これは、昔から言われて来た事なのだがー、ジャイロや加速度センサー、マイコンによる姿勢安定制御ソフトウェアーの進歩が、この常識を変えようとしている。
※自分も姿勢制御ソフトウェアーを作ってみたい、研究してみたい~
↑この辺りも、あって研究目的で手を出したのもあるかもしれないwww

「安さと品質の関係」
本体は確かに安いけど、それだけでヘリが飛ぶハズも無い、「安物買いの銭失い」と言う言葉もあるけどー、日本の大手のように、アフターサービスなどコストがかからない分、空気が読める人だけに売る姿勢は、面白い。
キットには説明書は一切入って無い、聞く所によると、部品が足りないとか余分な部品が入っているとか、様々らしい、自分で考えて、調べて、スキルを上げて切り抜ける事が出来る人にだけ楽しめるものかもしれないww
もはや、ヘリを飛ばすのがゴールではない!作る過程がアドベンチャーゲームだwww
しばらくの間、それを含めて楽しむ事にしよう~♪

「キット以外に何が必要なのか?」
・1.5mm スクリューキャップドライバー(レンチ)
・2.0mm スクリューキャップドライバー(レンチ)
※一般的には、「6角レンチ」と呼ばれる事が多いです。
・小型プラスドライバー
・棒ヤスリ
※100近で売っている200円の「ダイヤモンド粉末入り」が良いです。
・2mm のドリル
・外形3mm、内径2mmのアルミパイプ
※サーボの固定は2mmのネジだけど、買ったサーボのマウントはラバーで固定するタイプなので、カラーを自作する。
・ヒシチューブ
※モーターを ESC を接続する場合、「直」で繋ぐので、ヒシチューブを被せる、テープで巻くより綺麗で確実
・バッテリーと接続するコネクター
※ESC には、バッテリーのコネクターが付属しないので、バッテリーに合ったコネクターを別途用意する。
・2×8mmネジ
※サーボホーンにリンケージを固定するビス、短すぎ!、タッピングビス的に使うのかも知れないけど、緩むのが不安なので、ビスとナットで固定。
・他に一般的な工具や材料など

※近くのホームセンターで、1本250円で、1.5mm のドライバーを買ったけど、軸がねじれてしまい、思った力で締められない、先端だけ 1.5mm で、中間は太くて剛性がある物が良いでしょうか。
※2mmの方も、ねじれる傾向はあるけど、ギリギリ我慢できるかも。

IMG_0372s

「サーボマウントカラーの製作」
今回買ったローター用サーボは、コストの関係で、HobbyKing 製メタルギアーアナログサーボサーボマウントは、ラバーで固定するタイプなので付属の2mmネジでは全く合わない、そこで、アルミパイプを加工してカラーを作る事にした。
※しかし、1個4.55ドルって・・・安!

まず、外形3mm、内径2mmのアルミパイプを用意する。(近くのホームセンターで、1m、199円でした)
・3mmくらいでカットします。
※カッターを垂直に押し当てながらゴロゴロパイプを転がすと、柔らかいアルミなので意外と綺麗に切れます。
IMG_0373s
IMG_0375s
↑ちょっと失敗、でも、1000mmもあるので、何回でもやり直せますww

・何か丁度良い厚み(1.5mmくらい)の板を用意して、3mmの穴を開け、そこにパイプを入れます。
※電子工作用のユニバーサル基板が1.6mmで、角に3mmの穴が開いているので利用しました。
IMG_0376s
↑パイプの口を広げる為に、先の尖った円錐状の物を用意します、写真に写っているのは、旋盤のレースセンターですが、ポンチのような物で良いでしょう。

・板から飛び出たパイプの先端を、円錐状の物で広げます。
IMG_0377s
IMG_0378s

・さらに、平らな物で先端を潰して完成です。
IMG_0379s

IMG_0380s
力の加減があるのですが、何回かやれば思ったように創れます。

全部で6個必要です。

「テールブレード用サーボマウント」
HK-450 では、テールブレードのピッチ変更用サーボだけ、高速な物を要求しています、理由は良く判りませんが、通常の(フライバーレスでは無い)ヘリコプター用ジャイロが要求する仕様のように思います。
一応、高速タイプのデジタルサーボを選択しました。
トルクが1.8キロなので、少し弱いのかもとも思いましたが、ここに大きな力が働くとも考えられません、しかしながら、サーボのブラケットは大きな物が用意されていて、このサーボはそのままでは取り付けできません。
そこで、アルミの板を切って、サポートを作りました。
IMG_0369s
ホームセンターで売られているアルミは、柔らかく加工が楽で安いので気軽に使えます、但し、このくらいの厚さ(1.5mm)があるとカッターで切る訳にもいかないので鉄ノコで切り、端面をヤスリで仕上げます。

「バッテリーの滑り止め」
工具の滑り止めなどの名目で売られている「例の」シートを、接着剤で、張りました。
IMG_0381s

IMG_0382s
接着剤には、「セメダイン・スーパーX」を使いますww
これを知ったのは、デコ携帯に色々くっつけるのに女子が使っているのを観たのがきっかけですww
意外と柔軟で、何でも良くかなり強く接着します、「瞬間」ばかり多用していた自分には新しいです!、但し、接着には時間がかかります。
※「瞬間」も、最近ではアロンアルファでは無く、ロックタイトを良く使います、アロン何とかは、二回目くらいに使う時に固まって使えない事が多く「損」です、最後まで使えた記憶が殆どありません。
※セメダイン社最高!

「モーターとESCの取り付け」
モーターは、Turnigy Typhoon 2215H Brushless 450-Size Heli Motor 3550kvにしました、特別な理由はありません、kv 値は一応少し気にして、他の人が使っているモーターと同じくらいの物を選びました。
※値段が15ドルと安いです!
ESC は40Aが推奨ですが、以前に研究用に買った30Aの物があり、モーターの最大電流が28Aなのと、薄くてマッチするのでとりあえずそれを取り付けましたが、40Aの物も買ってあります。(かなり大きい)
※足りないようなら、40A品を付けますが、しばらくは、高速で飛行させる事は無いので、多分十分と思います。
BEC出力も2Aありますから、サーボ4個程度なら十分です。

IMG_0384s
※モーターのハーネス、1本だけ、細すぎるチューブを使った為失敗しているww

モーターとの接続は、回転方向があるので注意しなければなりません、仮に繋いでみて、回して、回転方向を確認します。
※メインのスパーギアには、自転車のようなクラッチが入っていて、逆回転だと空回りするので、どちらに回転するのが正しいのか直ぐに判ります。
※逆回転なら、3本のうち2本を入れ替えます。

このモーターには最大28Aもの電流が流れるので、接続はハンダで、ガッチリ行います、接続した部分がショートしないように、ヒシチューブで絶縁します。
ヒシチューブは熱で収縮するのですが、ガス半田コテのホットブローアタッチメントを使って処理します。
IMG_0388s
※コテライザーは、ガス半田こてで、非常に便利です、先端のアタッチメントも色々あり、便利!

今回はここまで~

サーボとのリンケージとか、どのように調整するのか不明な事も多く、その辺りは適当に流しましたが、これから地道にやっていこうと思います。
このヘリコプター、意外に軽いのでビックリしますが、剛性が必要な部分はアルミ(ジュラルミン?)の削りだし、フレームもカーボンで出来てます、この造りでこの値段はやはり脅威です、しかし元のヘリコプターの設計が良い事は凄く良く判ります。
上手く飛ばせるようになったら、オリジナルが欲しいですねー

次回は、ジャイロの設定などを中心に紹介する予定です。

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 を解析して、自分のシステムに合った物に修正する必要がある、リンカースクリプトにはまだまだ不明な事が多い・・・

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

久々のツーリング(2/2)

さて前回の続きですー

今回は長野から埼玉、東京(立川の自宅)までです。

県道106号をずっと進むと、県道68号にぶつかるので右(秩父方面)へ。

本当は、県道2号→県道124号→国道299号の予定でしたがー、県道2号へ曲がる所をスルーしてしまいました・・・
ここからが、悪夢の始まりですーー、道なりに進むと、標識が、ストリートビューでは「通行止」となってますが、現在は「不通」では無いと思います、標識も良く観たら、「三国峠、中津川林道」と書いてありますがー、瞬間しか観ていない為、上の「秩父」を観て、なんだー、「秩父に抜けられるじゃん」って思い、そのまま進みました・・・

ここはもう県道では無く、単なる舗装された林道なので、道は狭く、車一台分くらいしかありません、何か嫌な予感はあったのですがー、小雨が降ってきた感じで、寒く、引き返すのもなぁーと思いながら、この道なら問題無いと思いそのまま進みます。

で、三国峠ですよ・・。

中津川林道は、高校生くらいに、友達につられて来た事ありますが、舗装されていないかなりハードな林道です、オフ車なら好んで来ても、RC45みたいなロードバイクで来るとこじゃありません・・・
この標識を観て、引き返そうと思いましたがー、以前の印象では、「舗装されて無いけどー、それなりに走れた感じ」だった為、引き返すのも大変だし、そのまま行く事にしましたー
少し走ってみて、それが間違いと気がつきましたがー、少し行ったら楽になるのでは?と期待しつつ18キロを泣きながら走破しました(涙)、もうね、ガッタガタで、でこぼこ、ニュートラルにしてエンジン切って惰性で進む程度の速度(10~20キロ)でしたね・・・、なるべく平坦そうなとこを選びつつ、ヒイヒイ言いながら、まだ終わらんのか、まだ続くのかと、ひたすら耐える感じです、でも不思議なもんで、最後の方は、多少滑るのが少し楽しくなってましたーー

そしてようやく林道をぬけましたここでしばし休憩ですー、オフローダーが4人くらいいて、笑われましたー、自分は「知らなかった」と照れ隠しですwwカウルの下の方には泥が溜まり、ラジエターが詰まってます(涙)、しばらく休憩してましたがー、既にかなり遅い時間、まだ自宅まで相当距離があるので、そうそうに出ました。

「彩の国ふれあいの森」から県道210号へ、ここの県道も最近道が新しくなったのか、気持ちイイとこです、そして国道140号へ、甲府に抜けて411号を戻っても良いのですがー、同じ道を通るのも何なので、秩父方面へー、ひたすら140号、さすがに休日の国道、けっこう車がいて途中、渋滞してたりします、秩父市内は凄い渋滞・・・、全然動きません・・・、仕方無いので、すり抜け・・、国道299号を日高方面へ

国道299号も凄い渋滞です、道の駅「果樹公園あしがくぼ」で休憩、もう既にかなり暗くなっており、少し寒いです、早々に出発。

299を少し進み正丸トンネルの手前を右に(青梅、名栗)、県道53号は、多少狭いけど、青梅に抜けるには最高の裏道です。

ひたすら53号、途中曲がり角ですが、やっぱり53号ww。
途中の交差点をとりあえず右、(左でもいいんだけど)、そして次の交差点を左(トンネル方面へ)、そのまま、道なり、途中で県道28号へ、青梅市内に入ったら、適当に県道5号(新青梅)を東京方面へ。

そんなこんなで、やっと自宅に到着、8時過ぎになってましたー。

次に「中津川林道」を走る時は、オフ車かモタードで!
※全然懲りてないwww

次の日は、洗車してましたー

久々のツーリング(1/2)

先日の連休、久々にツーリングに行ってきましたー、ソロツーなので日帰りです。

カメラを持っていかなかったのと、写真撮影の為に停止するのが面倒で、写真は1枚も無し!
※次に行く時には撮影も重要なミッションとして行う予定ですw

久々にツーで思う事もあり、そのあらましを残しておきたいと思います。
※リンクとしてストリートビューを所々入れておきます。

自分がツーリングで目指すのは、とにかく空いた道で、渋滞が無く、舗装が綺麗で安全な事です。
自分のバイク、ブレーキにはかなり投資していて、ブレーキが気持ち良く、フロントが沈んだ状態からのコーナーワークが楽しくて仕方ありませんww

そんなこんなで、いつものように新青梅街道を奥多摩方面に進みます。
家を出たのは10時くらいでしたが、意外と込んでましたー、「ジョイフルホンダ」が悪いのかと思いきや、16号の手前で工事の為車線規制をしており、それが原因のようでしたー
新青梅街道は16号の手前で県道5号に合流します、それを道なりに行くと青梅の辺りで411号にぶつかります、ここで奥多摩方面へ。

いつもの事ですがー、青梅線沿いの411号は連休とゆー事もあってそれなりに込んでいます、途中道幅が広い部分とかあるので、すり抜けます。
バイクが後ろに付くと道を譲ってくれるドライバーもいます、ありがたい事です。
対向の車線で、それなりにバイクとすれ違い、最近、ほとんどしなくなったピースサインを出してくれる人がたまにいて驚きますが、用意が出来てなくて反応出来ません・・・
※法定速度以内だから文句は言えないけど、凄まじく遅い車がいます、(軽自動車のドライバーに多い)こんな車は絶対に道を譲りません、大抵後ろに巻き込まれた車が連なっています、少しは流れを考えて欲しいです・・

そんなこんなで411号を進んで行くと、奥多摩駅の手前(かなり)で「海沢大橋」とゆう交差点があります、ここを左に曲がり、県道164号を走ると奥多摩駅の渋滞をパス出来るので、自分はいつも利用します。
途中長いトンネルがあり、温度が低くて寒いですww、自分は一度しか見た事ないですが、スピード取締りを行っています、直線が長いからとスピードを出すとヤバイですwww
トンネルを出るとT字路でまた411号に合流します。

さらに411号を進み奥多摩ダムに行く道を過ぎトンネルを抜けると右側に大きな駐車場があり、ここで休憩です。
休みで天気も良いので、バイクや車が沢山います、売店で缶コーヒーを買い、しばし休憩・・・

411号を山梨方面に進みます。
奥多摩周遊道路は確かに道は良いのですがー、取締りが激しいし、車も多く、追い越し出来ないので、特別な理由が無い限り行きません。
※それより、行く方面が違いますが、139号を抜ける道が面白いですww
今回は、山梨に抜けるので、そのまま411号を行きます、最近、周遊道路に曲がる交差点を過ぎた辺りから先でスピード取締りを行っていたとの報告があります。
この辺りくらいから交通量が減り、すこぶる快調です、「のめこい湯」の前と少し先に最後のGSがあるので、ガソリンに余裕が無い場合は給油すると良いでしょう~、のめこい湯の先のGSは休日は閉めている事が多いようです。
「のめこい湯」は良く行く温泉の一つです、凄く良い温泉と思います。

さらに411号を進み「柳沢峠」に向かいます、最近、道が改修され、舗装も新しくなり、非常に走りやすく安全になりました。
柳沢峠の売店を過ぎたとこも、狭く曲がりくねった道がバイパスされて、非常に綺麗で走りやすくなりました、名物となりつつあるループのようなとこもあります。
この辺りから、大菩薩の湯の辺りでもスピードをやっているとの事なので、慎重に!

今回、「塩山市」に入った辺りで昼食、名物の「ほうとう」を食べました確か1380円、結構高いですが、量はそれなりにありましたー、味は普通ですかー。

昼食後、ここからが本番ですw、山梨の県道の何が凄いかってー、もう、道が空いてて空いてて、広くてー最高なんですー県道31号に向かいます、140号とぶつかっています。
140号から入った処は、民家が多く、それなりですが、直ぐに、民家も少なく、休日なのに車も殆ど走っていません、それでいて、コーナーが沢山あり堪能できます。
※地図を観て、県道で、クネクネしてるとこを試してますwww

峠を越え、街中に下りて来たら、混んでいる街中を少しだけ走り、今度は県道104号(千代田湖方面)へ、ガソリンを入れるなら、この辺りが良いでしょう、ここは、休日、それなりに混んでいます(街中なので)が、そこを過ぎれば気持ちよく走れます、ずっと進むと県道7号への分岐に来ますので、「昇仙峡グリーンライン」へ。
この辺り、観光地なので、そこそこ車がいますが、そこを過ぎれば、また辺鄙な道になりますw
御岳町の辺りで左へ県道7号は続きます、途中から県道27号へバトンタッチ、ガンガン進みます。

高速の手前で、県道616号との分岐になりますが、右の27号を少し走り、交差点を右に曲がり「須玉/明野」方面616号へ、少し進むと、分岐になります、616は右なのですがー、真っ直ぐ(稲坂路)にーしばらく行くと県道23号に合流します。
そのまま進むとT字路になります、右(23号)へ、ここも休日の昼間とは思えない交通量で、すこぶる快調!。
塩川ダムの手前で、分岐があります、右が「増富ラジウムライン」、左の県道610号へ、ひたすら610号~、途中、「信州峠」を境に県道106号に変わります(県境ですねー)

今回はここまでー、続きは、次のブログでー

クワッドコプター再び

今まで、色々と失敗続きで、まともに飛行していない・・

KK2.0

以前に買った、コントローラーは、ホバリングもまともにできないし、設定も色々変えてみたが全く上手く行かない・・・
よくよく調べてみると、ジャイロがどうもおかしく、モニターで出力の変化を確認してみたがー、正常に機能していないようだった・・・

無理やり飛行させてみたがー、ホバリングもまともに出来ないような状態の為、速攻で墜落、壊してしまったのだったー

それから、月日は流れー、再挑戦の為、ホビーキングで、新しいUAVのコントローラーを買ってみたー

Multiwii and Megapirate AIO Flight Controller

今度は、別のやつ。

まず、以前に墜落させて壊してしまった「足」を作り直した、今度は、壊れにくく、ショックを吸収できるようにピアノ線で工作。

LandingGear1
LandingGear2

基板を固定し、受信機を設置

QuadCoptor

で、買った状態で飛ばしてみたが・・・
うーーん、やはりホバリングすらまともに出来ない・・
※真っ直ぐ上に上がらない・・・(多少ドリフトするのは仕方無いにしても・・・)

このボード、USB 接続出来るので、センサーの状態とかモニター出来る~、アプリケーションとか、色々苦労したが、何とか、内部の状態を観る事が出来たがー、ジャイロも加速度センサーも問題無い!
そこで、色々情報を探すのだが、MultiWii 系の物は多いのだがー、MegaPirateNG に関する物が少ないようだ・・・
そもそも、「MegaPireteNG」より「MultiWii」の方がメジャーぽいし・・・

まぁ、ファームを書き換えても、元に戻せるので、MultiWii を試してみようと思い、最新の2.2を取ってきて、スケッチの設定をこのボード用にし、アップロードしてみた。

「MultiWii」について:
そもそも、「MultiWii」は、Wiiのコントローラーに使われているセンサーを利用して UAV 用のプログラムを「arduino」で動作させるべく始まったようでー、進化してきている。
今回買ったボードは
• ATMega 2560 Microcontroller
• MPU6050 6 axis gyro/accel with Motion Processing Unit
• HMC5883L 3-axis digital magnetometer
• MS5611-01BA01 highprecision altimeter
• FT232RQ USB-UART chip and Micro USB receptacle
主に、↑のような特徴があり、GPS を繋いで自立飛行させたり、かなり色々出来そうで、これから楽しみ。

今度はホバリングはまともに出来そうな感じで、でも部屋の中は狭く、外で試さないと判らない・・

とりあえず、ボードはまともなので、これから、順次試してみたい。

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

ソースコード一式