hantas's blog

ブログ移転しました→ http://blog.taniho.net/

C++でのマウス開発

今年の秋頃に入ってから(マウスのプログラムがややこしくなってから),CからC++での開発に切り替えました。

が,それが影響して全然コンパイルが通らない現象に見舞われたので,原因と対処法をまとめておきます。

○はじめから存在していた以下のコードを必ず含めておく。

#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

#ifdef __cplusplus
void abort(void){
}
#endif

コンパイラのドキュメントを読めば書いてあったような気がしますが,どこか忘れちゃったので思い出したら追記しておきます。

○外部の".c",".h"ファイルで宣言されている関数を呼び出す際,もしくは変数を外部参照する際,必ず次の通りにする(と思います。ミスがあれば報告いただけると幸いです)。

例."interrupt_handlers.c"で宣言した割り込み動作時に呼び出す関数を使用する際,その定義を行ったファイル内に次のコードを追記しておく。

#ifdef __cplusplus
extern "C" void interrupt_CMT0();
extern "C" void interrupt_CMT1();
#endif

これは「マングリング」とやらが影響しているようです。

手伝っていただいたサークルの先輩,また次のサイトの作者様,ありがとうございます。

参考: マングリング - debian36の日記

参考: extern "C" - debian36の日記


マングリングなどという現象があるとはいえ,C++を使うメリットはかなり大きいと思います。

が,ルネサスコンパイラは標準ライブラリが少ないので全然使い物になりません。

その話はまた後日したいと思います。

日本語は嫌い

今日はとあるソーシャルゲーム会社にお邪魔してきました。

CTOの方ともお話が出来て非常にモチベーションが向上しましたが,その話は省略します。

そのゲーム会社はUnityをメインに使っているそうですが,それ関連で思い出したことがあるので備忘録代わりにメモ。

 

○Unityを「日本語ユーザー名」のアカウントでセットアップした際,初回起動時に起動できない。

その場合はオフライン認証をすべし。

参考: 日本語ユーザー名でUnityを使う - Qiita

 

PPM(Perl Package Manager)のWindows版を起動しようとしても何の音沙汰もない。

起動しない,そんな場合は作業用ディレクトリを変更し,日本語が含まれないようにすべし。

あらかじめコマンドライン上から,もしくはppm.batに「SET ACTIVEPERL_PPM_HOME=(日本語が含まれないパス)」を追記しておくと良い。

参考: ActivePerl の ppm が起動しない: 男たちの群青

 

というわけです。

hotmailを日本語で登録していたせいでWindows8パソコンが日本語ユーザー名になってしまいました。

ユーザー名は変えられてもディレクトリ名は変えられないし,非常に腹が立つ……。

なんにせよPC上では日本語がやっかいになることがあるので気をつけるべきだと思います。

赤外線通信(笑)

先日学内で行われたUnitus主催のハッカソンに,Miceとして参加しました。

大半がゲームを作っていた中,僕たちだけはなぜかマウスを持ち込み,GR-PEACHを持ち込み,モーターを持ち込み……,異様な空間が出来ていました。

人目を引くこともあってか,なぜか1票差で最優秀賞! レッドブル2ダースを獲得しました!

……とまあ,そんなことはどうでも良いのですが,個人的には面白い取り組みを一つしたので失敗談を含めて紹介しようと思います。

 

マウスを動かすだけの簡単なシステムを製作したのですが,それだけではつまらないのでマウスに触れずに動作できるようにしました。

具体的に言うと,赤外線でマウスに行き先座標を送信するというシステムです。

「赤外線通信」と言うと,まずテレビのリモコンが思い浮かぶと思います。

今回は詳しい規格は紹介しませんが,あれは38kHzの搬送波にデータを載せて転送していたはずです。(これは後日たりぷろで実験します。絶対します。)

こいつを,簡易的に実装しようと思い立ち,次のプロトコルをでっち上げました。

(※プロトコル:通信規格のこと。例えばマクドナルドで注文するときには「商品名」と「個数」を言わないと頼めませんし,この基本的なルールは広く知られています。同じように,機械が機械と会話(通信)するときは,何を,どれだけ(何ビット)送信するか,というルールが決まっていないといけません。)

 

・1語を4ビットとし,「ヘッダ・データ本体・フッタ」を続けて送信する。

・ヘッダは4語で「1111 1111 0000 NNNN」で構成される。

 NNNN:送信するデータ本体の語数(0~15)

・フッタは3語で「PPPP 0000 0000」で構成される。

 PPPP:パリティ(文字数と送信文字すべてとパリティを加算すると下8桁が1111になるようなビット列)

・1ビットを5msで送信し,赤外線点灯時を1,消灯時を0とする。

 つまりビットレートは200bpsとなる。

 

イメージ出来るでしょうか……?

例えば,ゴール座標{ 3, 1 }を送る場合次のようになります。

「1111 1111 0000 0010 0011 0001 1011 0000 0000 」

今回は近距離無線通信,外乱も非常に小さい環境で動作させたため,また送るデータ量も小さかったので何の問題も無く動作してくれました。

 

さて,プチ反省会をしましょう。

今回のプロトコルでは全く持ってダメダメな設計をしています。

赤外線センサを教室の上に向け,そして下に向けるとデータ受信が行われてしましました。なぜでしょうか……?

 

正解はさっき挙げた「外乱」,それと「ヘッダのダメ仕様」です。

教室の上に付いている「蛍光灯」,こいつからは赤外線も出ています。そりゃあ蛍光灯に向けたらセンサが反応しますよね。

これに対応するために,製品化されている赤外線通信の規格では,比較的高周波のパルス波の赤外線が照射されている場合のみ「1」と判断するようになっています。比較的,というのは蛍光灯などの外乱では発生しないレベルで,と言う意味です。

そしてプロトコルのヘッダ部分を見てください,「1111 1111 0000」となっていますよね。赤外線が強いところから弱いところに切り替われば,確かにこのヘッダと一致している! と認識されてもおかしくありません。

例えばヘッダを「1010 1010 1010」としてみましょう。これならば外乱をヘッダと読み違えることも大幅に減ると思われます。

 

今回の実験でプロトコルの重要性を体感させられました。

この結果を基に,たりぷろの赤外線通信を良い物に出来ればと思います。

ではでは,また。

 

○今回のサンプルコード

https://github.com/taniho0707/kani_kama

なおバグのため,パリティが一時的に無効化されているコードです,悪しからず。

初めての大会も終わり

お久しぶりです。

マイクロマウス東北大会,マイクロマウス全日本大会も終わり,ようやく落ち着きました。

結果はと言うと,東北大会リタイア,全日本大会予選13位・決勝リタイア,とまあ残念な結果に。

まあ初めて3ヶ月だから良いでしょうと気を取り直し,マイクロマウス2015が始まりました!

 

今抱えているタスクをざっと挙げると次の通りに。

マイクロマウス2015。これには今の機体の大幅改造と,そのうち始めるであろう次回作があります。それとソフトウェアを製作します。

他力本願プロジェクト(以降「たりぷろ」)。いろんなマイコン周辺機器を試してドキュメントとしてまとめようという部内企画です。

ソフトウェアハッカソン。Unitusという団体とつながりが出来てしまったため,そこ主催のハッカソンや,外部団体・企業主催のハッカソン・コンテストに積極的に参加していきたいと考えています。

・GUGEN,NT京都系の電子工作イベント。何か作って出品したいですね,というお話。

Renesasプロデューサ。GR-PEACHなるmbed基板を無償入手したため,その開発を進めます。

ロボトレース。バイト先での研究課題にライントレースがあるので,その一環で参加しようと思ってます。

知能ロボコン。先輩に勧められたは良いけど,果たしてやるのだろうか。

・まるっきり趣味。来年こそセキュリティキャンプに参加したいと思っているため,その辺の経験を積みたいです。というわけなのでNIC ICを買ってきてそれで遊ぼうかと思っています。

ノベルゲーム制作。何としてでもやってみせます。

って感じです。これ全部来年夏までにこなせるのかな……

 

とまあ,こんなにやることがあればブログに書く内容も尽きることがないと思うので,これからは逐一更新するようにしたいと思います。

初心者が取っつけるような入門,つまづいたところなどの備忘録,作品紹介なら更新も滞らないだろう……。

と言うわけで今日はさっき挙げたたりぷろに関係する話を。

ジャンル分けする都合上,次の記事に続きます。

コミケ準備に大忙し

いよいよC86開催まであと3週間を切りました。

ヤバイです,正直ぎりぎり間に合うかどうか。

今プログラムは程々の進捗。まあ今プログラムやっていては遅いのですが……。

また,今大学はテスト期間なんですよね。

そっちの方も大変ですね……。

 

さて,今後の自分の予定としては,

コミケ

・マイクロマウス

・学祭用の電子工作

とまあ,結構やることがあるのですが,順番に片付けていきます。

 

コミックマーケットC86は,「3日目(17日)西いー20a のどかプラネタリウム」で初作品「思い継ぎ語り」を頒布予定!

皆さんのご来場をお待ちしております。

コミケ当選

なんと初応募でコミケ当選してしまいました。

というわけでみなさん,是非お越しください!

「3日目西い20a:のどかプラネタリウム」でお待ちしております。

頒布物は短編ノベルゲームを予定,鋭意制作中であります。

 

さてさて,今日はロボットのプチ大会という物があったのですが,

ライントレース部門で優勝してしまいました。

記録についてはあまり納得していませんが(PID制御結局諦めた),圧電ブザーを載せて音楽を鳴らしながら進ませることが出来たので,まあまあの出来だとは思います。

今日はちょっと疲れているので,また記事にまとめることにします。

 

先日秋葉原までパーツを買いに行ってきました。

STM32Discovery,LANコネクタモジュール,LED等々を買ってきたので,使えるように勉強しようと思います。

では,また

レポート作成

こんばんは。まだレポートに追われていないはんたすです。

レポートと言えば,もうWord一択の時代なのでしょうか。

僕も仕方がないのでMS Office最新版を買いましたが……。

高校時代は一太郎を愛用していました。細かなところに気が利いていて,個人的な文書を作る際は大変便利です。この宣伝はまた後日にでもしますね。

一方,論文などのフォーマルな文書を作る際は色々と苦労する点があります。

中身を考えるだけでも大変なのに,整形作業は出来るだけぱぱっとしてしまいたい。仕方がないからWordを使ってみよう,という感じで第1回のレポートはWordを作ってみました。

うーん,だめだこりゃ。一番肝心な段落番号振りの挙動がいまいち。キーボードショートカットはあるにしても,3ボタン押しはちょっと辛い……。

そんなてきとーな理由で「LaTeX」を勉強してみようと思い立ちました。

 

インストールには「TeXインストーラ3(http://www.math.sci.hokudai.ac.jp/~abenori/soft/index.html)」を使用。

非常に楽にインストールが終わりました。

苦労した点は次の点。

・余白と行数の設定変更

以下参考サイトを見ながらできました。ありがとうございます。

・日本語のコンパイルが出来ない

UTF-8を使う際は,パッケージ名を"ujarticle",コンパイルの際のコマンド名を"uplatex"とすればうまくいくようです。

・表が思った位置に表示されない

\begin{table}の位置指定に"h"を入れましょう。これで記述場所に表を挿入することが出来ます。

 

今のところこんな感じですかね。今期中にLaTeXを常用できる程度まで頑張ってみたいと思います。

ロボットの方は,今P制御らしき物までは進みました。ぐにゃぐにゃ進みます。

これでは安定性が皆無なので,今I制御を研究しているところですが……うまくいくのかな。

それではまた。

 

○参考サイト

「もうカツ丼でいいよな 1ページ当たりの行数,文字数と周囲の余白を設定する」 http://d.hatena.ne.jp/Rion778/20091002/1254482262

Wikibooks TeX/LaTeX入門」 http://ja.wikibooks.org/wiki/TeX/LaTeX%E5%85%A5%E9%96%80

「電脳世界の奥底にて upLaTeXを使おう」 http://zrbabbler.sp.land.to/uplatex.html