SSブログ

ポケットラジオ「RAD-F127N」を購入 [家電]

5~6年ぶりに、ラジオを買い増してみました。

今回購入するラジオに求めた条件は、次の4点です。

・安い
・バッグに放り込んで常時携帯できるサイズ
・ワイドFM(FM補完放送)に対応している
・連続使用可能時間が長い


これらの条件を満たした機種のひとつが、AudioCommのAM/FMポケットラジオ RAD-F127N。

・寸法 幅55mm×高さ91mm×厚さ20mm
・重さ 約66g(電池含まず)/約88g(単4電池2本含む)
・連続使用可能時間 AM受信時 約140時間/FM受信時 約130時間(イヤホン使用時)


と、ほぼほぼ理想的なスペックでありながら、ジョーシン電機で税込950円で購入することができました。


OHM AudioComm AM/FMポケットラジオ ダークグレー RAD-F127N-H

OHM AudioComm AM/FMポケットラジオ ダークグレー RAD-F127N-H

  • 出版社/メーカー: オーム電機
  • メディア: エレクトロニクス



OHM AudioComm AM/FMポケットラジオ ピンク RAD-F127N-P

OHM AudioComm AM/FMポケットラジオ ピンク RAD-F127N-P

  • 出版社/メーカー: オーム電機
  • メディア: エレクトロニクス



拙宅(練馬区の木造住宅)で使用したところ、AMは、NHK、TBS、文化放送が強力に入感。ニッポン放送、RFラジオ日本はノイズ混じりながら入感します。

FM受信時は内蔵ロッドアンテナを伸ばすか、(アンテナ代わりとなる)付属イヤホンの接続が必須。

TOKYO-FM、J-WAVE、InterFM、NHK-FM、TBS(FM補完)、文化放送(FM補完)、ニッポン放送(FM補完)は強力に受信でき、比較的ラクにチューニングできました。

その他のFM局の選局には、慣れと辛抱強さが必要かも……。

東京のようなFM局過密地域では、選局ダイヤルを少し回しただけで、さまざまな局が入ってくるため、ダイヤル操作に慎重さが求められます。

価格を考えるとコストパフォーマンスの高いラジオといえますが、「ステレオイヤホン使用時の音声出力が、左右逆位相」という、とても残念なウィークポイントがあるのでした。

ラジオそのものがモノラル仕様のため、ステレオイヤホンを接続すると「モノラル音が左右逆位相」で出力されます。

ステレオイヤホンでしばらく聴いていると、定位の定まらない音像が脳内を浮遊して、気持ち悪くなってきます。X-)

さらに、このヘンテコな左右逆位相仕様のせいで、ステレオミニジャック付きモノラルイヤホン(左右の音を混合して片耳で聴くためのイヤホン)を使うと、左右の音が互いを打ち消し合い、音がまったく聞こえません。

まあ、付属イヤホンを使うぶんには問題にならないんですけれどもね。






ウォーターサーバーはいりません [雑記]

スマホに03-6327-5387という見慣れない番号から着信。 出てみると……

「So-netをご利用いただいているので、無料でウォーターサーバーを設置できます」やら「富士山のパナジウム天然水代だけ、費用負担していただければ構いません」

とおっしゃる。

でもね、そのお水がお高いんでしょ? 拙者はディスカウントストアの安売り天然水で十分だし、なんなら水道水をガブガブ飲んじゃう人なのです。ウォーターサーバーとか必要ないんですよ、わかってくださいよ。と丁重にお断りしました。

迷惑電話ストップサービスに、上記番号を登録しておきます。



サントリー 天然水(南アルプス)

サントリー 天然水(南アルプス)

  • 出版社/メーカー: サントリー
  • メディア: 食品&飲料



まるごとシールブックDX「バッジとれ~るセンター デコレーションシールブック」発売のお知らせ [雑記]

拙者が企画・構成したシールブック「バッジとれ~るセンター デコレーションシールブック」(600円+税・小学館)が明日、3月30日に発売となります!


バッジとれ~るセンター デコレーションシールブック (まるごとシールブックDX)

バッジとれ~るセンター デコレーションシールブック (まるごとシールブックDX)

  • 作者: 任天堂
  • 出版社/メーカー: 小学館
  • 発売日: 2016/03/30
  • メディア: 文庫



本書はニンテンドー3DSダウンロードソフト「バッジとれ~るセンター」でゲットできるバッジをシールブック化したもので、全16シート301枚の任天堂キャラクターシールが収録されております。

内容は以下のとおり。こちらのサイトで試し読みすることもできます……というか、全ページ大公開中! ですなww。

・「マリオ と なかまたち」シール(1)
・「マリオ と なかまたち」シール(2)
・「マリオカート8」カートシール
・「マリオカート8」バイクシール
・「スーパーマリオブラザーズ」季節のマリオシール
・「とびだせ どうぶつの森」フェイスシール(1)
・「とびだせ どうぶつの森」フェイスシール(2)
・「とびだせ どうぶつの森」しずえのコーデシール
・「ゼルダの伝説 風のタクト HD」シール(1)
・「ゼルダの伝説 風のタクト HD」シール(2)
・「スプラトゥーン」シール(1)
・「スプラトゥーン」シール(2)
・「ニッキー コレクション「シール(1)
・「ニッキー コレクション」シール(2)
・「だるめしスポーツ店」シール
・「バッジとれ~るセンター」お得意様バッジシール



btc_cover.jpg
▲まるごとシールブックDX「バッジとれ~るセンター デコレーションシールブック」表紙。

btc_box_f.jpg
▲一部書店では、このようなポップアップケースでディスプレイされています。「一箱まとめて全部くれや!」的な交渉をすると、箱ごと売ってもらえるかもしれませんが保証はしません。

btc_box_l.jpg
▲ポップアップケース左側面には、「とびだせ どうぶつの森」のしずえさんがびっしり! このシールブックでしか見られないしずえのコーデが、多数収録されております。

btc_box_r.jpg
▲ポップアップケース右側面には、ニッキーねえさんと、パンダくん&ネコくんが勢ぞろい。なんと、ニッキーねえさんのキュートでワンダホーなビキニ姿も拝めます!
[コピーライト]Nintendo


厳選に厳選を重ねたシール(バッジ)を極限まで隙間なく詰め込んでおりますが、実は、誌面の制約上泣く泣く掲載を見送ったシール(バッジ)が、まだまだ大量にございます。

(「バッジとれ~るセンター」プレイヤーならご存知であろう)「ドット絵シリーズ」は殊に秀逸で、絵師の匠の技が光る作品群……なのですが、今回は断腸の思いで掲載を断念。

第一弾が好調なら続編制作の道も開けますので、みなさま、よしなにお願いいたします。


ワンチャンアルデー無事終了 [雑記]

昨日、南青山FutureSEVENで行われた「ゲーム音楽親睦会 ワンチャンアルデー!」は大変な盛況でありました。

演者の方々の興味深いトークと、素晴らしい演奏(奇抜な演奏も含む)にも感動!

大石由梨香さんのピアノと歌、あだっちさんのルーパー芸(ピアノ生演奏を幾重にもオーバーダブしてひとり連弾)、ikeさん×ヒトミchの新ユニット「ワンチャンアルデー」によるピアノ・リコーダーアンサンブル、沖政一志さんの箏演奏、どれもあっぱれでした。というか、楽器演奏できる人を心底羨ましく思いましたわ~。

拙者はといえば、(拙者のトークを聴くために)はるばる京都からお越しいただい方や、濱文様の文鳥手ぬぐいをプレゼントしてくださった方もいて、お心遣いが有り難いやら申し訳ないやら……。十分ご満足いただけたかどうか、はなはだ心配ではあります。

といったわけで、本来ならここで会場のようすでも公開すべきなんでしょうが、あろうことか写真を取るのをすっかり忘れておりました。かたじけない!

また機会があれば、今回お話できなかった小ネタをご披露しますね~。






3月19日の「ワンチャンアルデー」に登壇します [雑記]

不肖わたくし、3月19日(土)に開催される「ゲーム音楽親睦会 ワンチャンアルデー!」に登壇いたします。

以下、告知サイトからの転載です。

ゲーム音楽の演奏会が終わった後、ほとんど同じメンバーで二次会。
よく見る光景ですね。

むしろ二次会がメインと言っている人すらいます。

…でもそれなら、最初から飲み会で、酒のツマミに演奏やトークがついてくるイベントがあっても良くね?

ゲーム音楽が好きで、飲み会はもっと好き。そんなあなたの願いを叶えるイベント、それが「ゲーム音楽親睦会 ワンチャンアルデー!」です。

●そんなわけで、これは「いきなり二次会みたいなもの」です。
軽い気持ちでお越しください!


日時: 2016年3月19日(土) 18:00開場 18:30開始 21:30終了
場所: 南青山FutureSEVEN
参加費: 4,000円
・FutureSEVEN専属シェフによる、ブッフェ形式の美味しいお食事付き
・1ドリンク付き(追加ドリンクは、バーカウンターで1杯500円を頂きます。)

拙者はゲスト5名のうちのひとりであり、持ち時間は10分程度であります。

トゥーシャイボーイでおなじみの拙者であるにもかかわらず、ikeさんからのお誘いをなぜ受諾してしまったのか? それは、うっかりしていたから! ……というわけで、今さら仮病で休むわけにもいかないので、パワポでスライドをちまちま作っていたりします。

今後、いつ同様のお誘いがあるか、それをうっかり引き受けるかは未定につき、興味がある方はぜひお越しください。

詳細は主催者ikeさんのblog「ピアノであそぼ日記」をご覧ください。



新迷解 ポケモンおもしろことわざ

新迷解 ポケモンおもしろことわざ

  • 作者: げゑせんうえの
  • 出版社/メーカー: 小学館
  • 発売日: 2006/11
  • メディア: 単行本



新迷解 もっと!ポケモンおもしろことわざ

新迷解 もっと!ポケモンおもしろことわざ

  • 作者: げゑせん うえの
  • 出版社/メーカー: 小学館
  • 発売日: 2011/12/08
  • メディア: 単行本



Arduino EEPROMの初期値 [Arduino]

サインスマートのLeonardo互換ボードでEEPROMを使ってみようと思ったのですが、そもそも初期値はどーなってるの? というわけで、メモリダンプしてみました。

以下、EEPROMメモリダンプスケッチ。

※初出時、最終アドレスが0x1ffとなっていたため、0x3ffに修正しました。(2016/1/16)

[ dumpEEPROM.ino ]
/*
 *  Arduino EEPROM Dump
 *  Written by Toshiyuki UENO MMXVI
 */
#include  <EEPROM.h>

void dumpEEPROM(unsigned int start_adrs, unsigned int end_adrs){
  unsigned int i, a;
  char s[4];

  if(start_adrs >= 1024 || end_adrs >= 1024 || start_adrs > end_adrs){
    return; // error
  }
  a = int(start_adrs / 16);
  Serial.print("      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F");
  for(i = a; i <= end_adrs; i++){
    if((i % 16) == 0){
      sprintf(s, "\n%04X:", i);
      Serial.print(s);
    }
    if(i >= start_adrs){
      sprintf(s, " %02X", EEPROM.read(i));
      Serial.print(s);
    } else {
      Serial.print("   ");
    }
  }
  Serial.println("");
}

void setup() {
  Serial.begin(9600);
  while(!Serial);       // シリアルポートオープン待ち
  dumpEEPROM(0, 1023);
}

void loop() {
}

実行結果は次のとおり。

      +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0020: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0030: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0040: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0050: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0060: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0070: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0080: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0090: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0100: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0110: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0120: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0130: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0140: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0150: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0160: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0170: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0180: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0190: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
01F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0200: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0210: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0220: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0230: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0240: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0250: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0260: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0270: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0280: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0290: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
02F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0300: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0310: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0320: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0330: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0340: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0350: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0360: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0370: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0380: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0390: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03A0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03B0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03C0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03D0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03E0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03F0: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

すべて0xffでした。EEPROM使用前にゼロクリアしたほうがよさげですな。


Arduinoをはじめようキット

Arduinoをはじめようキット

  • 出版社/メーカー: スイッチサイエンス
  • メディア: おもちゃ&ホビー



Arduinoをはじめよう 第3版 (Make:PROJECTS)

Arduinoをはじめよう 第3版 (Make:PROJECTS)

  • 作者: Massimo Banzi
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2015/11/28
  • メディア: 単行本(ソフトカバー)



Arduino Leonardoで\記号を打つ [Arduino]

Arduino LeonardoでUSBキーボードエミュレーションを行う場合、IDE付属のKeyboardライブラリを使うと記号が化けたり、「\」「|」「半角/全角キー」などの打てない文字・キーがあったりします。

Keyboardライブラリは101キーボードをエミュレートするため、106/109キーボードにしかない文字やキーを打てず、キーバインドの異なる記号は化けてしまうのです。

そこで、Keyboard.h/Keyboard.cppを改変し、日本語106/109キーボード対応版を作成してみました。(Arduino IDE 1.6.7で動作確認済)

ユーザーフォルダ\Documents\Arduino\libraries\Keyboard_jp フォルダを作成して、そのフォルダ内に下のKeyboard_jp.h、Keyboard_jp.cppを保存すると利用できます。


以下の関数の使用方法は、IDE付属Keyboardライブラリと同じです。「Arduinoリファレンス・キーボードライブラリ」を参照してください。また、Keyboar_jpで使用できる修飾キーは、Keyboard_jp.hを参照してください。

vold begin(void)
void end(void)
size_t write(uint8_t k)
size_t press(uint8_t k)
size_t release(uint8_t k)
void releaseAll(void)


Keyboard_jpで追加された関数は以下の3つです。動作はKeyboard.write、Keyboard.press、Keyboard.releaseと同じですが、引数が(キーコードではなく)UsageIndexであることに注意してください。UsageIndexの詳細は、「Keyboard Scan Code Specification」(Microsoft Word形式)を参照してください。

size_t writeRaw(uint8_t k)
size_t pressRaw(uint8_t k)
size_t releaseRaw(uint8_t k)


[ Keyboard_jp.h ]
/*
  Keyboard_jp.h

  Copyright (c) 2015, Arduino LLC
  Original code (pre-library): Copyright (c) 2011, Peter Barrett
  Modified for Japanese 106/109 Keyboard by Toshiyuki UENO MMXVI

  This library is free software; you can redistribute it y it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef KEYBOARD_h
#define KEYBOARD_h

#include "HID.h"

#if !defined(_USING_HID)

#warning "Using legacy HID core (non pluggable)"

#else

//================================================================================
//================================================================================
//  Keyboard

#define KEY_RETURN        0x80  // 0x28
#define KEY_ESC           0x81  // 0x29
#define KEY_BACKSPACE     0x82  // 0x2a
#define KEY_TAB           0x83  // 0x2b

#define KEY_KANJI         0x8d  // 0x35 Hankaku/Zenkaku | Kanji

#define KEY_CAPS_LOCK     0x91  // 0x39
#define KEY_F1            0x92  // 0x3a
#define KEY_F2            0x93  // 0x3b
#define KEY_F3            0x94  // 0x3c
#define KEY_F4            0x95  // 0x3d
#define KEY_F5            0x96  // 0x3e
#define KEY_F6            0x97  // 0x3f
#define KEY_F7            0x98  // 0x40
#define KEY_F8            0x99  // 0x41
#define KEY_F9            0x9a  // 0x42
#define KEY_F10           0x9b  // 0x43
#define KEY_F11           0x9c  // 0x44
#define KEY_F12           0x9d  // 0x45
#define KEY_PRINT_SCREEN  0x9e  // 0x46
#define KEY_SCROLL_LOCK   0x9f  // 0x47
#define KEY_PAUSE         0xa0  // 0x48
#define KEY_INSERT        0xa1  // 0x49
#define KEY_HOME          0xa2  // 0x4a
#define KEY_PAGE_UP       0xa3  // 0x4b
#define KEY_DELETE        0xa4  // 0x4c
#define KEY_END           0xa5  // 0x4d
#define KEY_PAGE_DOWN     0xa6  // 0x4e
#define KEY_RIGHT_ARROW   0xa7  // 0x4f
#define KEY_LEFT_ARROW    0xa8  // 0x50
#define KEY_DOWN_ARROW    0xa9  // 0x51
#define KEY_UP_ARROW      0xaa  // 0x52

#define KEY_KANA          0xe0  // 0x88 Katakana/Hiragana
#define KEY_HENKAN        0xe2  // 0x8a
#define KEY_MUHENKAN      0xe3  // 0x8b

#define KEY_LEFT_CTRL     0xf8  // 0xe0
#define KEY_LEFT_SHIFT    0xf9  // 0xe1
#define KEY_LEFT_ALT      0xfa  // 0xe2
#define KEY_LEFT_GUI      0xfb  // 0xe3
#define KEY_RIGHT_CTRL    0xfc  // 0xe4
#define KEY_RIGHT_SHIFT   0xfd  // 0xe5
#define KEY_RIGHT_ALT     0xfe  // 0xe6
#define KEY_RIGHT_GUI     0xff  // 0xe7

//  Low level key report: up to 6 keys and shift, ctrl etc at once
typedef struct
{
  uint8_t modifiers;
  uint8_t reserved;
  uint8_t keys[6];
} KeyReport;

class Keyboard_ : public Print
{
private:
  KeyReport _keyReport;
  void sendReport(KeyReport* keys);
public:
  Keyboard_(void);
  void begin(void);
  void end(void);
  size_t write(uint8_t k);
  size_t press(uint8_t k);
  size_t release(uint8_t k);
  void releaseAll(void);
  size_t writeRaw(uint8_t k);
  size_t pressRaw(uint8_t k);
  size_t releaseRaw(uint8_t k);
};
extern Keyboard_ Keyboard;

#endif
#endif


[ Keyboard_jp.cpp ]
/*
  Keyboard_jp.cpp

  Copyright (c) 2015, Arduino LLC
  Original code (pre-library): Copyright (c) 2011, Peter Barrett
  Modified for Japanese 106/109 Keyboard by Toshiyuki UENO MMXVI
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "Keyboard_jp.h"

#if defined(_USING_HID)

//================================================================================
//================================================================================
//  Keyboard

static const uint8_t _hidReportDescriptor[] PROGMEM = {

  //  Keyboard
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)  // 47
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x85, 0x02,                    //   REPORT_ID (2)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
   
  0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    
  0x95, 0x08,                    //   REPORT_COUNT (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
    
  0x95, 0x06,                    //   REPORT_COUNT (6)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xfe,                    //   LOGICAL_MAXIMUM (101)  *** modified 0x65 to 0xfe
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    
  0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0xfe,                    //   USAGE_MAXIMUM (Keyboard Application)  *** modified 0x65 to 0xfe
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0,                          // END_COLLECTION
};

Keyboard_::Keyboard_(void) 
{
  static HIDSubDescriptor node(_hidReportDescriptor, sizeof(_hidReportDescriptor));
  HID().AppendDescriptor(&node);
}

void Keyboard_::begin(void)
{
}

void Keyboard_::end(void)
{
}

void Keyboard_::sendReport(KeyReport* keys)
{
  HID().SendReport(2,keys,sizeof(KeyReport));
}

extern
const uint16_t _asciimap[128] PROGMEM;

#define SHIFT 0x8000

const uint16_t _asciimap[128] =
{
  0x00,        // NUL
  0x00,        // SOH
  0x00,        // STX
  0x00,        // ETX
  0x00,        // EOT
  0x00,        // ENQ
  0x00,        // ACK
  0x00,        // BEL
  0x2a,        // BS   Backspace
  0x2b,        // TAB  Tab
  0x28,        // LF   Enter
  0x00,        // VT
  0x00,        // FF
  0x00,        // CR
  0x00,        // SO
  0x00,        // SI
  0x00,        // DEL
  0x00,        // DC1
  0x00,        // DC2
  0x00,        // DC3
  0x00,        // DC4
  0x00,        // NAK
  0x00,        // SYN
  0x00,        // ETB
  0x00,        // CAN
  0x00,        // EM
  0x00,        // SUB
  0x00,        // ESC
  0x00,        // FS
  0x00,        // GS
  0x00,        // RS
  0x00,        // US
 
  0x2c,        // " "
  0x1e|SHIFT,  // !
  0x1f|SHIFT,  // "
  0x20|SHIFT,  // #
  0x21|SHIFT,  // $
  0x22|SHIFT,  // %
  0x23|SHIFT,  // &
  0x24|SHIFT,  // '
  0x25|SHIFT,  // (
  0x26|SHIFT,  // )
  0x34|SHIFT,  // *
  0x33|SHIFT,  // +
  0x36,        // ,
  0x2d,        // -
  0x37,        // .
  0x38,        // /
  0x27,        // 0
  0x1e,        // 1
  0x1f,        // 2
  0x20,        // 3
  0x21,        // 4
  0x22,        // 5
  0x23,        // 6
  0x24,        // 7
  0x25,        // 8
  0x26,        // 9
  0x34,        // :
  0x33,        // ;
  0x36|SHIFT,  // <
  0x2d|SHIFT,  // =
  0x37|SHIFT,  // >
  0x38|SHIFT,  // ?
  0x2f,        // @
  0x04|SHIFT,  // A
  0x05|SHIFT,  // B
  0x06|SHIFT,  // C
  0x07|SHIFT,  // D
  0x08|SHIFT,  // E
  0x09|SHIFT,  // F
  0x0a|SHIFT,  // G
  0x0b|SHIFT,  // H
  0x0c|SHIFT,  // I
  0x0d|SHIFT,  // J
  0x0e|SHIFT,  // K
  0x0f|SHIFT,  // L
  0x10|SHIFT,  // M
  0x11|SHIFT,  // N
  0x12|SHIFT,  // O
  0x13|SHIFT,  // P
  0x14|SHIFT,  // Q
  0x15|SHIFT,  // R
  0x16|SHIFT,  // S
  0x17|SHIFT,  // T
  0x18|SHIFT,  // U
  0x19|SHIFT,  // V
  0x1a|SHIFT,  // W
  0x1b|SHIFT,  // X
  0x1c|SHIFT,  // Y
  0x1d|SHIFT,  // Z
  0x30,        // [
  0x89,        // Yen(Backslash)
  0x31,        // ]
  0x2e,        // ^
  0x87|SHIFT,  // _
  0x2f|SHIFT,  // @
  0x04,        // a
  0x05,        // b
  0x06,        // c
  0x07,        // d
  0x08,        // e
  0x09,        // f
  0x0a,        // g
  0x0b,        // h
  0x0c,        // i
  0x0d,        // j
  0x0e,        // k
  0x0f,        // l
  0x10,        // m
  0x11,        // n
  0x12,        // o
  0x13,        // p
  0x14,        // q
  0x15,        // r
  0x16,        // s
  0x17,        // t
  0x18,        // u
  0x19,        // v
  0x1a,        // w
  0x1b,        // x
  0x1c,        // y
  0x1d,        // z
  0x30|SHIFT,  // {
  0x89|SHIFT,  // |
  0x31|SHIFT,  // }
  0x2e|SHIFT,  // ~
  0            // DEL
};


uint8_t USBPutChar(uint8_t c);

// press() adds the specified key (printing, non-printing, or modifier)
// to the persistent key report and sends the report.  Because of the way 
// USB HID works, the host acts like the key remains pressed until we 
// call release(), releaseAll(), or otherwise clear the report and resend.
size_t Keyboard_::press(uint8_t k) 
{
  uint8_t i;
  uint16_t c;

  if (k >= 0xf8) {          // it's a modifier key
    _keyReport.modifiers |= (1 << (k-0xf8));
    k = 0;
  } else if (k >= 0x80){    // it's a non-printing key and KANJI key
    k -= 0x58;
  } else {                  // it's a printing key
    c = pgm_read_word(_asciimap + k);
    k = uint8_t(c) & 0xff;
    if (!c) {
      setWriteError();
      return 0;
    }
    if (c & SHIFT) {
      _keyReport.modifiers |= 0x02;
    }
  }

  // Add k to the key report only if it's not already present
  // and if there is an empty slot.
  if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && 
    _keyReport.keys[2] != k && _keyReport.keys[3] != k &&
    _keyReport.keys[4] != k && _keyReport.keys[5] != k) {
    
    for (i=0; i<6; i++) {
      if (_keyReport.keys[i] == 0x00) {
        _keyReport.keys[i] = k;
        break;
      }
    }
    if (i == 6) {
      setWriteError();
      return 0;
    }  
  }
  sendReport(&_keyReport);
  return 1;
}

// release() takes the specified key out of the persistent key report and
// sends the report.  This tells the OS the key is no longer pressed and that
// it shouldn't be repeated any more.
size_t Keyboard_::release(uint8_t k) 
{
  uint8_t i;
  uint16_t c;

  if (k >= 0xf8) {          // it's a modifier key
    _keyReport.modifiers &= ~(1<<(k-0xf8));
    k = 0;
  } else if (k >= 0x80) {   // it's a non-printing key and KANJI key
    k -= 0x58;
  } else {                  // it's printing key
    c = pgm_read_word(_asciimap + k);
    k = uint8_t(c) & 0xff;
    if (!k) {
      return 0;
    }
    if (c & SHIFT) {
      _keyReport.modifiers &= ~(0x02);
    }
  }

  // Test the key report to see if k is present.  Clear it if it exists.
  // Check all positions in case the key is present more than once (which it shouldn't be)
  for (i=0; i<6; i++) {
    if (0 != k && _keyReport.keys[i] == k) {
      _keyReport.keys[i] = 0x00;
    }
  }

  sendReport(&_keyReport);
  return 1;
}

void Keyboard_::releaseAll(void)
{
  _keyReport.keys[0] = 0;
  _keyReport.keys[1] = 0;
  _keyReport.keys[2] = 0;
  _keyReport.keys[3] = 0;
  _keyReport.keys[4] = 0;
  _keyReport.keys[5] = 0;
  _keyReport.modifiers = 0;
  sendReport(&_keyReport);
}

size_t Keyboard_::write(uint8_t c)
{  
  uint8_t p = press(c);  // Keydown
  release(c);            // Keyup
  return p;              // just return the result of press() since release() almost always returns 1
}

size_t Keyboard_::pressRaw(uint8_t k) {
  uint8_t  i;
  
  if(!k){
    return 0;
  }

  // Add k to the key report only if it's not already present
  // and if there is an empty slot.
  if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && 
    _keyReport.keys[2] != k && _keyReport.keys[3] != k &&
    _keyReport.keys[4] != k && _keyReport.keys[5] != k) {
    
    for (i=0; i<6; i++) {
      if (_keyReport.keys[i] == 0x00) {
        _keyReport.keys[i] = k;
        break;
      }
    }
    if (i == 6) {
      // setWriteError();
      return 0;
    }  
  }
  sendReport(&_keyReport);
  return 1;
}

size_t Keyboard_::releaseRaw(uint8_t k) {
  uint8_t i;
  if (!k) {
    return 0;
  }

  // Test the key report to see if k is present.  Clear it if it exists.
  // Check all positions in case the key is present more than once (which it shouldn't be)
  for (i=0; i<6; i++) {
    if (0 != k && _keyReport.keys[i] == k) {
      _keyReport.keys[i] = 0x00;
    }
  }

  sendReport(&_keyReport);
  return 1;
}

size_t Keyboard_::writeRaw(uint8_t c)
{  
  uint8_t p = pressRaw(c);  // Keydown
  releaseRaw(c);            // Keyup
  return p;                 // just return the result of press() since release() almost always returns 1
}

Keyboard_ Keyboard;

#endif

以下は、サンプルスケッチ(Keyboar_jp使用例)です。Digital Pin 2-GND間、Digital Pin 4-GND間に接続したタクトスイッチを押下すると、円記号を含む文字列を出力します。Pin 2ボタン押下時はKeyboard.write、Keyboard.printを使用して出力、Pin4ボタン押下時はKeyboard.writeRawを使用して出力しています。

[ Keyboard_jp_test ]
/*
 * Keyboard_jp サンプルスケッチ
 * Written by Toshiyuki UENO
 */

#include  "Keyboard_jp.h"

// define Button Pin Number
// Button[0] = 2, Button[1] = 4
const int BUTTON[] = { 2, 4 };

void setup() {
  int i;
  for( i = 0; i <= 1; i++ ){
    pinMode(BUTTON[i], INPUT_PULLUP);
  }
  Keyboard.begin();
  delay(1000);  // wait for initialization
}

void loop() {
  int i;
  for( i = 0; i <= 1; i++ ){
    if( !digitalRead(BUTTON[i]) ){
      if( i == 0 ){                       // if press button[0]                 
        Keyboard.write('a');
        Keyboard.write('A');
        Keyboard.write('_');
        Keyboard.write('\\');
        Keyboard.write(KEY_RETURN);
        delay(100);
        Keyboard.print("aA_\\");
        Keyboard.write(KEY_RETURN);
      } else if( i == 1 ){                // if press button[1]
        Keyboard.writeRaw(0x04);   // 'a'
        Keyboard.pressRaw(0xe1);   // press LeftShift
        Keyboard.writeRaw(0x04);   // 'A'
        Keyboard.writeRaw(0x87);   // '_'
        Keyboard.releaseRaw(0xe1); // release LeftShift
        Keyboard.writeRaw(0x89);   // '\'
        Keyboard.writeRaw(0x28);   // Return(ENTER)
      }
      delay(100);                         // button debounce
      while( !digitalRead(BUTTON[i]) ){}; // wait button release
      delay(100);                         // button debounce
    }
  }
}

【謝辞】
Keyboard_jpライブラリの作成にあたり、「まごころ誠実堂~Arduinoで任意のUSBコードを送る 解決編」を参考にさせていただきました。



Arduino Leonardo (ソケット・ヘッダ付き)

Arduino Leonardo (ソケット・ヘッダ付き)

  • 出版社/メーカー: Arduino
  • メディア: 付属品



サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック

サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: おもちゃ&ホビー



Raspberry Piにリブート/シャットダウンスイッチをつける [Raspberry Pi]

Raspberry Pi B+/Pi 2 B用のリブート/シャットダウンスイッチを作ってみました。

まずは、Raspberry Piに取りつけるリブート/シャットダウンボタンを製作します。

resetbutton1.jpg
▲秋月で購入した2ピンタクトスイッチと、好みの長さに切断できる分割ロングピンソケットで、リセット/シャットダウンスイッチを作ります。RasPi内蔵プルアップ抵抗を使うので、外付け抵抗は不要です。

resetbutton2.jpg
▲タクトスイッチを、Pin39(GND)-Pin40(GPIO21)間に挿します。

電子工作はこれだけ。超カンタン。


続いて、リブート/シャットダウンスクリプトを作成。あらかじめ、Python(Python3) GPIOモジュールもインストールしておきましょう。
$ sudo aptitude install python-rpi.gpio pyhton3-rpi.gpio


スクリプトの仕様と、動作シーケンスは以下のとおりです。

(1) リブート/シャットダウンスクリプトが起動すると、オンボードPower LEDが点滅します(2秒毎に0.1秒間消灯)。
(2) タクトスイッチを1秒以上押し続けると、LEDがゆっくり点滅(3秒間)。この間にスイッチを離すとリブートします。
(3) さらにタクトスイッチを押し続けると、LEDが速く点滅(3秒間)。この間にスイッチを離すとシャットダウンします。
(4) さらにタクトスイッチを押し続けると、リブート/シャットダウン処理をキャンセルできます。
(1)へ戻る

リセットボタンを押したあとに「いかん! 編集中のデータをまだ保存してなかった!」的な事態に陥っても、ボタンを長押ししつづければ危機回避が可能な仕様となっております。


$ sudo vi /usr/local/bin/resetbutton.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# REBOOT & SHUTDOWN Button
# for Raspberry Pi B+ / Pi 2 B
# Written by gaecen ueno
# [Dec.24,2015]
#
#===================================================================
#
# GPIO Connection
# S=TACT SW (GPIO 21) / G=GND
#
# 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0
# 9 7 5 3 1 9 7 5 3 1 9 7 5 3 1 9 7 5 3 1
# G - - - - - - G - - - - - - - G - - - -
# S - - - - - - - - - G - - G - - - - - -
# 4 3 3 3 3 3 2 2 2 2 2 1 1 1 1 1 0 0 0 0
# 0 8 6 4 2 0 8 6 4 2 0 8 6 4 2 0 8 6 4 2
#
# Holding down the button(tact switch)
#   | [1second]
#   | [3seconds](LED blink slowly)  Release the button -> Reboot
#   V [3seconds](LED blink faster)  Release the button -> Shutdown
# Abort Reboot and Shutdown

GPIO_BUTTON = 21  # GPIO 21(pin40) -> TACT SW -> GND
GPIO_LED = 35     # GPIO 35 is On-Board PWR LED(/sys/class/leds/led1)

LED_BLINK_TIME = [
  [1.9, 0.1],    # default  on=1.9sec off=0.1sec
  [0.5, 0.5],    # reboot   on=0.5sec off=0.5sec
  [0.1, 0.1]     # shutdown on=0.1sec off=0.1sec
]

#===================================================================

import  RPi.GPIO as GPIO
import  time
import  os

SHUTDOWN_NONE = 0
SHUTDOWN_REBOOT = 1
SHUTDOWN_HALT = 2


def getButtonState(io):
  cnt = 0
  prev_btn = not GPIO.input(io)

  while cnt < 3:
    time.sleep(0.01)
    btn = not GPIO.input(io)
    if prev_btn == btn:
      cnt += 1
    else:
      prev_btn = btn
      cnt = 0

  return btn


def callback(ch):
  global  shutdown_mode
  global  do_shutdown

  # Waiting for holding down the button.(1sec)
  for i in range(10):
    btn = getButtonState(GPIO_BUTTON)
    if btn == False:
      break
    time.sleep(0.1)

  # [REBOOT] Release the button when the LED is blinking slowly.(3sec)
  else:
    shutdown_mode = SHUTDOWN_REBOOT
    for i in range(30):
      btn = getButtonState(GPIO_BUTTON)
      if btn == False:
        do_shutdown = True
        break
      time.sleep(0.1)

    # [SHUTDOWN] Release the button when the LED is blinking faster.(3sec)
    else:
      shutdown_mode = SHUTDOWN_HALT
      for i in range(30):
        btn = getButtonState(GPIO_BUTTON)
        if btn == False:
          do_shutdown = True
          break
        time.sleep(0.1)

  if do_shutdown == False:
    shutdown_mode = SHUTDOWN_NONE

  return

#===================================================================

if __name__ == '__main__':
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(GPIO_LED, GPIO.OUT, initial=GPIO.HIGH)
  GPIO.setup(GPIO_BUTTON, GPIO.IN, pull_up_down=GPIO.PUD_UP)

  shutdown_mode = SHUTDOWN_NONE
  do_shutdown = False

  GPIO.add_event_detect(GPIO_BUTTON, GPIO.FALLING, callback=callback)

  try:
    while do_shutdown == False:
        GPIO.output(GPIO_LED, GPIO.HIGH)
        time.sleep(LED_BLINK_TIME[shutdown_mode][0])
        GPIO.output(GPIO_LED, GPIO.LOW)
        time.sleep(LED_BLINK_TIME[shutdown_mode][1])

    if shutdown_mode == SHUTDOWN_REBOOT:
      os.system("sudo shutdown -r now > /dev/null 2>&1")
    elif shutdown_mode == SHUTDOWN_HALT:
      os.system("sudo shutdown -h now > /dev/null 2>&1")

  except KeyboardInterrupt:
    pass

  finally:
    GPIO.cleanup(GPIO_LED)
    GPIO.cleanup(GPIO_BUTTON)


スクリプトを起動し、動作確認を行います。
$ sudo chmod 755 /usr/local/bin/resetbutton.py
$ sudo /usr/local/bin/resetbutton.py

リブート、シャットダウンともに正しく動作することを確認できたら、/etc/rc.localの最終行(exit 0)の前の行に /usr/local/bin/resetbutton.py & を追加し、リブートしましょう(※1)。Raspberry Pi起動時に、リブート/シャットダウンスクリプトを自動起動することができます。

※1
/etc/rc.localを書き換えて自動起動させた場合、スクリプトの入力ミスやタクトスイッチに不具合があると、最悪の場合リブートをくり返す可能性があります。Win32DiskImagerなどを使って、事前にシステムのバックアップをとっておきましょう。


※2
拙宅のB+/2 Bでは正しく作動しましたが、古いB+だとエラーが出たり、オンボード Power LEDが点滅しないかもしれません。sudo rpi-updateでファームウェアを更新したり、aptitudeやapt-getで導入済みパッケージの更新を行ってみてください。



入門 Python 3

入門 Python 3

  • 作者: Bill Lubanovic
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2015/12/01
  • メディア: 単行本(ソフトカバー)



実践 Python 3

実践 Python 3

  • 作者: Mark Summerfield
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2015/12/01
  • メディア: 単行本(ソフトカバー)






Raspberry Pi 2(Jessie)でradikoを受信する[crontab編] [Raspberry Pi]

前エントリで構築したradiko受信環境。コマンドラインで実行するぶんには問題ないのですが、crontab設定でハマってしまったため、そのあたりについても備忘録を残しておきます。

ハマッたのは次の2点。

1) cronのデフォルトパスに/usr/local/binが通っていない。
2) コマンドオプションの%をエスケープする必要がある。

これらを解決するには、crontab -eで次のように記述します。パスを追記し、%の前に\(または半角円記号)を加える必要があります。#で始まる行はコメントです。
# 月曜日7時から60分間TOKYO FMを録音(~/radio/filename_年月日_時分.m4a)
00 7 * * 1 /usr/local/bin/radiko.sh -d ~/radio -f filename_`date +\%y\%m\%d_\%H\%M` -t 60 FMT > /dev/null 2>&1

もしくは環境変数を設定して、次のように記述しても可。
PATH=/usr/local/bin:/usr/bin:/bin
# 月曜日7時から60分間TOKYO FMを録音(~/radio/filename_年月日_時分.m4a)
00 7 * * 1 radiko.sh -d ~/radio -f filename_`date +\%y\%m\%d_\%H\%M` -t 60 FMT > /dev/null 2>&1

さらに、録音ディレクトリやdate~の記述も環境変数に書いておくとスッキリします。date~を環境変数に記述する場合、%のエスケープは不要です。
PATH=/usr/local/bin:/usr/bin:/bin
RECDIR=~/radio
RECDATE="date +%y%m%d_%H%M"
# 月曜日7時から60分間TOKYO FMを録音(~/radio/filename_年月日_時分.m4a)
00 7 * * 1 radiko.sh -d $RECDIR -f filename_`date $RECDATE` -t 60 FMT > /dev/null 2>&1




Eleduino Raspberry Pi 2 (1GB)Base Kit (New Raspberry Pi 2 +Case+Heatsink)

Eleduino Raspberry Pi 2 (1GB)Base Kit (New Raspberry Pi 2 +Case+Heatsink)

  • 出版社/メーカー: Eleduino
  • メディア: エレクトロニクス









Raspberry Pi 2(Jessie)でradikoを受信する [Raspberry Pi]

Raspberry Pi 2 Model B+Raspian 8.0(Jessie)でradiko再生・録音環境を構築しました。おもに Machuu / Raspberry Piでradikoの再生、録音 に記載されている方法を参考にしましたが、Jessieではひと工夫必要だったため導入過程を備忘録として残しておきます。

※以下の作業はrootで行っています。su - でrootユーザーへ切り替えて作業するか、各コマンドの冒頭に sudo を付加して実行してください。
※radiko配信番組の録音・再生は私的利用に限定してください。


■リポジトリ追加と公開鍵のインストール
2015年12月13日現在、Jessieではデフォルトでffmpegをインストールすることができないため、deb-multimediaリポジトリの追加と、公開鍵のインストールを行いました。テキストエディタにviを使用していますが、各自お好きなエディタをお使いください。
なお、公開鍵インストール時に警告表示されますが、無視して意地でも先に進んじゃいましょう。自己責任で。
$ vi /etc/apt/sources.list

  # /etc/apt/sources.list に次の2行を追加
  deb http://www.deb-multimedia.org jessie main non-free
  deb-src http://www.deb-multimedia.org jessie main non-free

$ aptitude update
$ aptitude install deb-multimedia-keyring
$ aptitude update


■必要なパッケージとスクリプトをインストールする
radiko受信に必要なもろもろのパッケージをインストールします。radiko再生/録音スクリプト radio.sh は /usr/local/bin へ移動したほうが使い勝手がよさげです。
$ aptitude install rtmpdump ffmpeg mplayer swftools wget libxml2-utils
$ wget https://gist.githubusercontent.com/soramugi/836952a6b09e540eb6a3/raw/81182ff0a1f5003077a479e0e947b66fb5d3b99e/radiko.sh
$ chmod 755 radiko.sh
$ mv radiko.sh /usr/local/bin


■受信テストを行う
環境構築が済んだら、受信テストを行います。radiko参加放送局一覧を参照し、radikoで聴取可能な地元局を指定してください。以下は、関東地方でTOKYO FMを受信する例です。
$ radiko.sh -p FMT

ヘッドホン端子にスピーカーを接続した際、スピーカーから音が出ないことがあります。この場合は、次のコマンドを実行してオーディオ出力先を切り替えます。最後のパラメータで出力先を、0(自動)、1(ヘッドホン端子)、2(HDMI端子)のいずれかに設定できます。
$ amixer cset numid=3 1

音量設定方法1。alsamixer起動後、カーソルキー上下で行えます。終了はESC。
$ alsamixer

音量設定方法2。amixerを用いると、コマンド一発で音量設定できます(nn%を任意の値に変えてください)。現在値はamixer sget で取得可能。
$ amixer sget PCM
Simple mixer control 'PCM',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback -10239 - 400
  Mono: Playback -4919 [50%] [-49.19dB] [on]
$ amixer sset PCM 90%
Simple mixer control 'PCM',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback -10239 - 400
  Mono: Playback -663 [90%] [-6.63dB] [on]


■録音/再生テストを行う
続いて、録音/再生テストを行います。(ホームディレクトリ)/radioを作成し、そこへTOKYO FMの番組をファイルネーム「test.m4a」として1分間録音。その後、mplayerでtest.m4aを再生します。
$ mkdir ~/radio
$ radiko.sh -d ~/radio -f test -t 1 FMT
$ mplayer ~/radio/test.m4a

※TIPS
-f ファイル名_`date +%y%m%d_%H%M` とすることで、ファイル名に「_年月日_時分」を追加できます。


※備考
radiko.shではflv録音・m4a変換を/var/tmpで行ったあと、m4aファイルを-dで指定したディレクトリへ移動しています。/var/tmpがRAMディスク上にある場合は、/etc/fstabを修正して十分な容量を確保しておくことをおすすめします。1分あたり録音と変換に約720KBを要するため、1時間番組なら44MB程度は必要です。 もしくはradiko.shを編集し、「wkdir='/var/tmp'」を容量に余裕のあるドライブへ変更しておくのが吉。



■radiko.shの起動パラメータについて
radiko.shをパラメータなしで起動し、表示されるUsageを参照してください。なお、radiko.sh配布元である
まっつんぶろぐ/radikoの録音・再生(ArchLinux)に詳細な使用方法や、cronを用いた予約録音方法が解説されています。


■参考サイト
・Muchuu/Raspberry Piでradikoの再生、録音
・まっつんぶろぐ/radikoの録音・再生(ArchLinux)
・S2/Raspberry Piのサウンドを試したら音が出なかった話
・Installing Ffmpeg on Debian GNU/Linux Version 8.0 (Jessie)


Eleduino Raspberry Pi 2 (1GB)Base Kit (New Raspberry Pi 2 +Case+Heatsink)

Eleduino Raspberry Pi 2 (1GB)Base Kit (New Raspberry Pi 2 +Case+Heatsink)

  • 出版社/メーカー: Eleduino
  • メディア: エレクトロニクス









この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。