2018年03月08日

リモコンプラレールの検討

 先日のリモコンプラレールの件。「名張市つつじが丘おもちゃ病院」さんの記事をまず読んで、いろいろ考えてみる。

  • PIC は使い慣れてないので、AVR に置き換える。秋月で入手できる8ピン AVR は ATtiny13 か ATtiny85。以前作った1号機では ATtiny13 でも十分余裕はあった。
  • プラレールに搭載するとなると、電源が問題になる。できればエネループ1本で済ませたい。となると、1.2V から 3.3V に昇圧する回路が必要。
  • 少し前には、秋月で 250 円の昇圧モジュールが売られていたらしい(AE-XCL101C331BR-G)。今は廃番。なんでやねん…代わりに、500 円の昇圧モジュールを使うことにするか(M-08937)。
  • トランジスタ4個でHブリッジを作るのは学習用にはたいへん良いのだが、効率の点ではどうか?
  • 面白そうなモータドライバを発見した。Pololu DRV8838ブラシモータドライバボード。そんなに高価でもないし、一度実験してみたい。

 他にもいろいろあるけど、ひとまずはこんなところかな。あと、送信機も作らないといけない。家電のリモコンを流用すればいいのだけど、解析が結構面倒だ。送信機も自作してしまえば、家電の通信プロトコルを実装しなくてもいいので、ファームウェアも簡単になる。工作の順序としては、送信機の製作→受信の実験→モータドライバの実験→実装、となるかな。

タグ:工作
posted by toshinagata at 01:17| 日記

2018年03月04日

リモコンプラレール再び

 坊の電子工作はしばらく一休みだったのだが、最近になって、鉄道好きの同級生と一緒に「鉄道模型のリモコン化」を画策しているらしい。「(同級生が)YouTube でプラレールをリモコンで動かす動画を見て、ああいうのをやりたいって言うんだよね」とのこと。それ、前にやったよ君らに見せたのに完全スルーされたけどな。まあ当時は坊は小学校にも行ってなかったから、無理もない話ではある。

 当時作ったものを見たい、と坊が言うので、探し出してきたが、IR受光素子が外れていたり、基板結合用のピンヘッダが折れていたり、ちょっと修復不可能な壊れ方をしていた。これは作り直さないといかんね。

 改めて調べてみると、いくつか作例が見つかった。中でも良さそうだったのが、「名張市つつじが丘おもちゃ病院:100均プラレールの赤外線リモコン化の製作」。子供向けのマイコン工作教室の教材として開発されたらしい。しかも、有難いことに、回路図・配線図・部品表などがすべて公開されている。マイコンが8ピンの PIC なので、そこは AVR に変えたいけど、その他はそのまま流用できるだろう。

 坊はさっそく物置からプラレールの車両を引っ張り出してきて、検討を始めた。こちらも、上の公開資料を参考にさせてもらって、坊たちが実現できそうな原案を作成してやろう。

タグ:工作
posted by toshinagata at 23:11| 日記

2018年03月03日

A級順位戦最終局:三浦勝ち、渡辺陥落

 ニコニコ動画で見ていたら、プレミアム会員の方々に追い出されてしまいました(苦笑)。仕方がないので、5ちゃんねるをリロードしながら経過をチェック。盤面がないから何にもわからない。ときどきウソを投下する人がいるし。

 三浦さんにはなんとしても勝って欲しかった。三浦さん本人としては、相手が渡辺棋王と言っても、別に「因縁の対決」などとは思ってないだろう。単にまわりが煽っているだけ。でも、観客の一人として、やっぱり勝って欲しかった。勝ってもらって、こちらが溜飲を下げたかった。真剣に将棋と向き合っている棋士のみなさんには申し訳ないんだけど、観客ってそういう身勝手な存在なんだ。

 そして三浦さんは勝った。おまけに、深浦さんが久保王将に勝って、渡辺棋王はB1へ陥落。かつ、名人挑戦は前代未聞の6人によるプレーオフ。誰かが台本を書いたとしても「そりゃ無理でしょ」とボツになるぐらいの劇的結末になった。なんかこの1年間、将棋界は「いくらなんでも無理があるでしょ」というネタが多かったね。

 深浦さんも好きな棋士の一人です。お付き合いしていた女性との結婚を認めてもらうために、相手のご両親をタイトル戦に招待した話は特に好き。そういえば、先日羽生竜王の就任式で「聖の青春」で羽生役を演じた東出さんが素晴らしいスピーチをしたけど、その中で深浦さんに言及されていました。東出さんも深浦さんのファンなんだろうな。

タグ:将棋
posted by toshinagata at 01:50| 日記

2018年02月26日

wxPython を試し中

 訳あって wxPython を使ってみた。

20180226-1.png

 実は Python ってちょっと苦手で、ラズパイを使っていても、「何とか Python 使わずに済ませられんかなあ」とどこかで思っていた。インデントで論理構造を表現する、というコンセプトがどうにも気持ち悪かった、というのが一番大きい。

 ところが、やっぱり Python は世界的にユーザーが多いだけあって、ライブラリが圧倒的に充実している。wxWidgets のバインディングを探していた時、現時点で最もアクティブなのが wxPython だった。特に、Python3 と wxWidgets3 の組み合わせになって、「本気度」が高まっている印象がある。ドキュメントもちゃんとしているし。(英語だけど)

 この週末でいろいろ試してみたんだけど、簡単なドローアプリの骨格がもうできてしまった。これは生産性高いわ。Python が広く使われている理由がわかった気がする。

20180226-2.png

 インデントは相変わらず気持ち悪いけど、これは良いエディタにサポートしてもらうしかないな。今使っているのは、mi の Python モード。キーバインドを OS 標準(= Emacs 類似)にすれば、かなり使い勝手はよい。

posted by toshinagata at 23:06| 日記

2018年02月25日

Facebook が「いいね」ボタンで個人情報収集

 「Facebook が『いいね!』設置サイトと通じ『個人情報』を大量収集か」(Livedoor ニュース)。他の SNS サービスでも同様の問題があるんだろうけど、Facebook は実名登録が基本だから、余計にまずいですね。このブログでも「いいね」ボタンをつけていたけど、滅多に押されることもないので、この機会に外してしまいました。

 Facebook も、なんだか微妙ですね。一応情報収集のために登録しているけど、どのあたりが盛り上がっているのかがイマイチよくわからない。公開グループがもう少し探しやすければいいのに、と思ったりもする。

タグ:SNS
posted by toshinagata at 23:03| 日記

2018年02月24日

LÖVE (Love2D) の記事追加

 「LÖVE (Love2D) プログラミング」に2つ記事を追加しました。

 フリーソフトウェア界隈では、音関係はどうも後手に回っている感がある。画像系と比べて、いろいろと検証がめんどくさいんでしょうね。オーディオを専門に扱う人はそちらで突っ走ってるんだけど、「すごく高機能」か「めちゃくちゃしょぼい」の二択になっていて、バランスが悪い気がする。上記記事で、ラズパイ上の Love2D で mp3 を扱ってみたところ、思いのほか性能が低かった。ハードウェアデコードの機能があるんじゃないかと思うんだけど、実装は難しいのかな。

 「画像の一部を使う」というのは、テクスチャアトラスを利用する話。スプライトシート、と言った方が通じやすいかもしれない。

 テクスチャアトラスを使って「マージャンソリティア」を実装中。レイアウトがまずいせいか、なかなかクリアできません(苦笑)

20180224-1.png
posted by toshinagata at 12:29| 日記

2018年02月18日

梅一輪

 庭の梅が一輪咲きました。

20180218-1.jpg

 枯れたシダレウメが結局復活しなかったので、昨年の春に植え替えた。今年は初めての春で、うれしいことにたくさんつぼみがついている。

 花が終わった後の剪定がカギだと思うので、今回は失敗しないようにしたい。ちょっと勉強しないといけないな。

タグ:園芸
posted by toshinagata at 21:36| 日記

2018年02月17日

名フィル定期演奏会

 名古屋フィルハーモニー交響楽団の第454回定期演奏会に行ってきました。

20180217-1.jpg

 少し早く仕事を切り上げて、チケットを確かめて会場に向かう。高校生の時、500円の学生優待チケットを握りしめて大フィルの演奏会を聴きに行ったものだけど、その時のワクワクした気持ちを思い出した。

20180217-2.jpg

 開演前に、ロビーで木管四重奏のミニコンサートがあった。Ob, Cl, Fg の三重奏で、ドヴィエンヌのトリオ。原曲は 2Fl, Fg のトリオなのかな。けっこうな人だかりになっていた。高校生が15人ぐらい集団で来ていて、熱心に聴いていた。スマホで動画とっている子がいたけど、いいのか? ロビーコンサートは許されてるんかな。

 演奏会本体。第1曲は、クーネ「エレヴェータ・ミュージック」(Graeme Koehne, Elevator Music, 日本初演)。非常に面白かった。全曲を通してほぼアップテンポの 3+3+2 リズムが貫かれているが、それに息の長い旋律がかぶさったり、細かいパッセージがフーガ風にかけあったりして、退屈させない。しかし、一番の見所は広上さんの指揮でした。指揮台の上でリズミカルに踊っていて、見飽きなかった。

 第2曲、シベリウスのヴァイオリン協奏曲、ソロはアリーナ・ポゴストキーナ。これは今ひとつ入り込めなかった。何となく先を急いでいるようで、ゆったりした伸びやかさをあまり感じなかった。前の曲から休憩なしに入ったので、こちらの気持ちがうまく切り替えられなかったかも。

 休憩をはさんで第3曲、アッテルベリの交響曲第6番ハ長調「ドル・シンフォニー」(Kurt Atterberg, Symphony No. 6)。アッテルベリはスウェーデンの作曲家だそうです。第1楽章は平凡な印象だったが、第2楽章が出色。第3楽章はリズミカルな曲想で、広上さんがまた踊りまくっていた。楽しく終われてよかった。

 名フィルを聞くのは初めて。音が個性的で、各パートの自己主張が強い印象だった。曲や指揮者との相性もあるのかもしれない。こういう自由な感じのオケはけっこう好きですね。

タグ:音楽
posted by toshinagata at 11:01| 日記

2018年02月14日

将棋の局面を左右反転させると?

 「左右反転と将棋盤」(Ponanza 作者、山本さん)。理論的には、将棋のコマの動きはすべて左右対称だから、「ある局面」と「それを左右反転した局面」からスタートすれば、そこから勝利に至る確率は当然同じ。だから、評価関数は左右対称であるはずなんだけど、実戦的には評価関数を左右非対称にした方が勝率が 2% ほど上がるそうです。

 これは「対戦相手が左右非対称な評価関数を使っているから」だと思う。山本さんが指摘されているように、右の穴熊と左の穴熊だと「左の方が強そうに見える」。つまり、人間の評価関数は左右対称ではなくて、左穴熊の方を高く評価していることになる。それはたぶん、初期盤面が左右非対称なので、「その局面に持って行くのにかかる手数」を局面の評価に含めているからだろう。純粋に理論的に言えば、ある局面にいったんたどりついてしまえば、そこから先の展開は「それまでにかかった手数」とは無関係のはず。けれども、人間の心理としてはそうはならないんでしょう。左右反転させた局面を見たら、「なんでこうなっちゃったの?」とまず考えるんじゃないだろうか。

 プロ棋士の棋譜は多数データ化されているわけだから、「左右対称の局面」が今までどのぐらい実現してきたのか、そこから先の展開はどう異なっているのか(あるいは似通っているのか)、そういう研究って面白そうだな。誰かヒマで将棋の好きな人、やってみてくれませんか。

タグ:将棋
posted by toshinagata at 23:39| 日記

2018年02月13日

LÖVE (Love2D) を Raspbian Stretch で動かす

 ゲームエンジンの LÖVE (Love2D) なんですが、最新の Raspbian Stretch でうまく動かない問題があった。音を鳴らそうとするとトラブルが起きる。

  • Raspberry Pi1 では、Illegal Instruction で落ちてしまう(たぶん Zero でも)。
  • Raspberry Pi3 では、落ちはしないが、発音がひどく遅れる(たぶん Pi2 でも)。

 Illegal Instruction はダメでしょ。Gdb で動作させて調べてみたところ、libopenal.so の中で落ちていることがわかった。OpenAL が壊れているらしい。試しに、こんなコードで検証してみた(openal.c とする)。

#include <stdlib.h>
#include <stdio.h>
#include <AL/alc.h>
#include <AL/al.h>

int ReadHeaderWav(FILE* fp, int *channel, int* bit, int *size, int* freq) {
  int16_t res16;
  int32_t res32, dataSize, chunkSize;
  int16_t channelCnt, bitParSample, blockSize;
  int32_t samplingRate,byteParSec;	
  int dataPos, i, flag = 0;
  
  fread(&res32, 4, 1, fp);
  if (res32 != 0x46464952) {	/* "RIFF" */
    return 1;	//error 1
  }
  fread(&dataSize, 4, 1, fp);  /*  Data size  */
  
  /*  WAVE header  */
  fread(&res32, 4, 1, fp);
  if (res32 != 0x45564157){	/* "WAVE" */
    return 2;	//error 2
  }
  
  /*  Chunks  */
  while (flag != 3) {
  fread(&res32, 4, 1, fp);
  fread(&chunkSize, 4, 1, fp);
    switch (res32) {
    case 0x20746d66:	/* "fmt " */
      fread(&res16, 2, 1, fp);
      if (res16 != 1) {
        return 4;  /*  Not supported  */
      }
      fread(&channelCnt, 2, 1, fp);
      if (res16 > 2) {
        return 5;  /*  Not stereo nor monoral  */
      }
      fread(&samplingRate, 4, 1, fp);
      fread(&byteParSec, 4, 1, fp);
      fread(&blockSize, 2, 1, fp);
      fread(&bitParSample, 2, 1, fp);
      *channel = (int)channelCnt;
      *bit = (int)bitParSample;
      *freq = samplingRate;
      flag |= 1;
        
      break;
    case 0x61746164:	/* "data" */
      *size = chunkSize;
      dataPos = ftell(fp);
      flag |= 2;
      break;
    }
  }
  fseek(fp, dataPos, SEEK_SET);
  return 0;
}

int main (int argc, char **argv)
{
  ALuint buffer, source;
  FILE *fp;
  int wavChannel, wavBit, wavSize, wavFreq;
  unsigned char *data;
  int i, fmt;
  
  ALCdevice *device;
  ALCcontext *context;
  
  /*  Initialize  */
  device = alcOpenDevice(NULL);
  context = alcCreateContext(device, NULL);
  alcMakeContextCurrent(context);
  
  fp = fopen("bgm.wav","rb");
  if (ReadHeaderWav(fp, &wavChannel, &wavBit, &wavSize, &wavFreq)){
    printf("Format not supported\n");
    return 1;
  }
  data = (unsigned char *)malloc(wavSize);
  fread(data, wavSize, 1, fp);
  fclose(fp);
  
  alGenBuffers(1, &buffer);
  if (wavChannel == 1)
    fmt = (wavBit == 8 ? AL_FORMAT_MONO8 : AL_FORMAT_MONO16);
  else
    fmt = (wavBit == 8 ? AL_FORMAT_STEREO8 : AL_FORMAT_STEREO16);
  alBufferData(buffer, fmt, data, wavSize, wavFreq);
  
  alGenSources(1, &source);
  alSourcei(source, AL_BUFFER, buffer);
  for (i = 0; i < 5; i++) {
    fprintf(stderr, "play\n");
    alSourcePlay(source);
    sleep(1);
    alSourceStop(source);
  }
  
  alDeleteBuffers(1, &buffer);
  alDeleteSources(1, &source);
  free(data);
  return 0;
}

 gcc -g -o altest altest.c -lopenal でビルドして、gdb で実行してみた。Pi3 では "play" と表示されてから約 0.6 秒遅れで音が鳴る。Pi1 では、"play" が1回表示された直後に下のエラーで落ちる。

Thread 4 "altest" received signal SIGILL, Illegal instruction.
[Switching to Thread 0xa59ff460 (LWP 593)]
0xb6f3ead4 in ?? () from /usr/lib/arm-linux-gnueabihf/libopenal.so.1

 これは libopenal.so をビルドし直して差し替えるしかないね。ついでに、pulseaudiojack が問題を起こすので、非対応にする。

$ wget http://kcat.strangesoft.net/openal-releases/openal-soft-1.18.2.tar.bz2
$ tar xvjf openal-soft-1.18.2.tar.bz2
$ cd openal-soft-1.18.2/build
$ cmake -DALSOFT_BACKEND_JACK=OFF -DALSOFT_BACKEND_PULSEAUDIO=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/games/love ..
$ sudo mkdir -p /usr/local/games/love; sudo chown pi /usr/local/games/love
$ make && make install

 さっきの altest を試してみる。ちゃんと音が出るようになった。新しく作った libopenal.so をリンクするため、LD_LIBRARY_PATH 環境変数を設定する。

$ LD_LIBRARY_PATH=/usr/local/games/love/lib ./altest

 これに対応した Love2D のビルドスクリプトを作りました。→「LÖVE (Love2D) プログラミング:インストール

posted by toshinagata at 00:12| 日記
email.png
Powered by さくらのブログ