ポケットラジオ「RAD-F127N」を購入 [家電]
5~6年ぶりに、ラジオを買い増してみました。
今回購入するラジオに求めた条件は、次の4点です。
これらの条件を満たした機種のひとつが、AudioCommのAM/FMポケットラジオ RAD-F127N。
と、ほぼほぼ理想的なスペックでありながら、ジョーシン電機で税込950円で購入することができました。
拙宅(練馬区の木造住宅)で使用したところ、AMは、NHK、TBS、文化放送が強力に入感。ニッポン放送、RFラジオ日本はノイズ混じりながら入感します。
FM受信時は内蔵ロッドアンテナを伸ばすか、(アンテナ代わりとなる)付属イヤホンの接続が必須。
TOKYO-FM、J-WAVE、InterFM、NHK-FM、TBS(FM補完)、文化放送(FM補完)、ニッポン放送(FM補完)は強力に受信でき、比較的ラクにチューニングできました。
その他のFM局の選局には、慣れと辛抱強さが必要かも……。
東京のようなFM局過密地域では、選局ダイヤルを少し回しただけで、さまざまな局が入ってくるため、ダイヤル操作に慎重さが求められます。
価格を考えるとコストパフォーマンスの高いラジオといえますが、「ステレオイヤホン使用時の音声出力が、左右逆位相」という、とても残念なウィークポイントがあるのでした。
ラジオそのものがモノラル仕様のため、ステレオイヤホンを接続すると「モノラル音が左右逆位相」で出力されます。
ステレオイヤホンでしばらく聴いていると、定位の定まらない音像が脳内を浮遊して、気持ち悪くなってきます。X-)
さらに、このヘンテコな左右逆位相仕様のせいで、ステレオミニジャック付きモノラルイヤホン(左右の音を混合して片耳で聴くためのイヤホン)を使うと、左右の音が互いを打ち消し合い、音がまったく聞こえません。
まあ、付属イヤホンを使うぶんには問題にならないんですけれどもね。
今回購入するラジオに求めた条件は、次の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-P
- 出版社/メーカー: オーム電機
- メディア: エレクトロニクス
拙宅(練馬区の木造住宅)で使用したところ、AMは、NHK、TBS、文化放送が強力に入感。ニッポン放送、RFラジオ日本はノイズ混じりながら入感します。
FM受信時は内蔵ロッドアンテナを伸ばすか、(アンテナ代わりとなる)付属イヤホンの接続が必須。
TOKYO-FM、J-WAVE、InterFM、NHK-FM、TBS(FM補完)、文化放送(FM補完)、ニッポン放送(FM補完)は強力に受信でき、比較的ラクにチューニングできました。
その他のFM局の選局には、慣れと辛抱強さが必要かも……。
東京のようなFM局過密地域では、選局ダイヤルを少し回しただけで、さまざまな局が入ってくるため、ダイヤル操作に慎重さが求められます。
価格を考えるとコストパフォーマンスの高いラジオといえますが、「ステレオイヤホン使用時の音声出力が、左右逆位相」という、とても残念なウィークポイントがあるのでした。
ラジオそのものがモノラル仕様のため、ステレオイヤホンを接続すると「モノラル音が左右逆位相」で出力されます。
ステレオイヤホンでしばらく聴いていると、定位の定まらない音像が脳内を浮遊して、気持ち悪くなってきます。X-)
さらに、このヘンテコな左右逆位相仕様のせいで、ステレオミニジャック付きモノラルイヤホン(左右の音を混合して片耳で聴くためのイヤホン)を使うと、左右の音が互いを打ち消し合い、音がまったく聞こえません。
まあ、付属イヤホンを使うぶんには問題にならないんですけれどもね。
ウォーターサーバーはいりません [雑記]
まるごとシールブックDX「バッジとれ~るセンター デコレーションシールブック」発売のお知らせ [雑記]
拙者が企画・構成したシールブック「バッジとれ~るセンター デコレーションシールブック」(600円+税・小学館)が明日、3月30日に発売となります!
本書はニンテンドー3DSダウンロードソフト「バッジとれ~るセンター」でゲットできるバッジをシールブック化したもので、全16シート301枚の任天堂キャラクターシールが収録されております。
内容は以下のとおり。こちらのサイトで試し読みすることもできます……というか、全ページ大公開中! ですなww。
・「マリオ と なかまたち」シール(1)
・「マリオ と なかまたち」シール(2)
・「マリオカート8」カートシール
・「マリオカート8」バイクシール
・「スーパーマリオブラザーズ」季節のマリオシール
・「とびだせ どうぶつの森」フェイスシール(1)
・「とびだせ どうぶつの森」フェイスシール(2)
・「とびだせ どうぶつの森」しずえのコーデシール
・「ゼルダの伝説 風のタクト HD」シール(1)
・「ゼルダの伝説 風のタクト HD」シール(2)
・「スプラトゥーン」シール(1)
・「スプラトゥーン」シール(2)
・「ニッキー コレクション「シール(1)
・「ニッキー コレクション」シール(2)
・「だるめしスポーツ店」シール
・「バッジとれ~るセンター」お得意様バッジシール
▲まるごとシールブックDX「バッジとれ~るセンター デコレーションシールブック」表紙。
▲一部書店では、このようなポップアップケースでディスプレイされています。「一箱まとめて全部くれや!」的な交渉をすると、箱ごと売ってもらえるかもしれませんが保証はしません。
▲ポップアップケース左側面には、「とびだせ どうぶつの森」のしずえさんがびっしり! このシールブックでしか見られないしずえのコーデが、多数収録されております。
▲ポップアップケース右側面には、ニッキーねえさんと、パンダくん&ネコくんが勢ぞろい。なんと、ニッキーねえさんのキュートでワンダホーなビキニ姿も拝めます!
Nintendo
厳選に厳選を重ねたシール(バッジ)を極限まで隙間なく詰め込んでおりますが、実は、誌面の制約上泣く泣く掲載を見送ったシール(バッジ)が、まだまだ大量にございます。
(「バッジとれ~るセンター」プレイヤーならご存知であろう)「ドット絵シリーズ」は殊に秀逸で、絵師の匠の技が光る作品群……なのですが、今回は断腸の思いで掲載を断念。
第一弾が好調なら続編制作の道も開けますので、みなさま、よしなにお願いいたします。
バッジとれ~るセンター デコレーションシールブック (まるごとシールブックDX)
- 作者: 任天堂
- 出版社/メーカー: 小学館
- 発売日: 2016/03/30
- メディア: 文庫
本書はニンテンドー3DSダウンロードソフト「バッジとれ~るセンター」でゲットできるバッジをシールブック化したもので、全16シート301枚の任天堂キャラクターシールが収録されております。
内容は以下のとおり。こちらのサイトで試し読みすることもできます……というか、全ページ大公開中! ですなww。
・「マリオ と なかまたち」シール(1)
・「マリオ と なかまたち」シール(2)
・「マリオカート8」カートシール
・「マリオカート8」バイクシール
・「スーパーマリオブラザーズ」季節のマリオシール
・「とびだせ どうぶつの森」フェイスシール(1)
・「とびだせ どうぶつの森」フェイスシール(2)
・「とびだせ どうぶつの森」しずえのコーデシール
・「ゼルダの伝説 風のタクト HD」シール(1)
・「ゼルダの伝説 風のタクト HD」シール(2)
・「スプラトゥーン」シール(1)
・「スプラトゥーン」シール(2)
・「ニッキー コレクション「シール(1)
・「ニッキー コレクション」シール(2)
・「だるめしスポーツ店」シール
・「バッジとれ~るセンター」お得意様バッジシール
▲まるごとシールブックDX「バッジとれ~るセンター デコレーションシールブック」表紙。
▲一部書店では、このようなポップアップケースでディスプレイされています。「一箱まとめて全部くれや!」的な交渉をすると、箱ごと売ってもらえるかもしれませんが保証はしません。
▲ポップアップケース左側面には、「とびだせ どうぶつの森」のしずえさんがびっしり! このシールブックでしか見られないしずえのコーデが、多数収録されております。
▲ポップアップケース右側面には、ニッキーねえさんと、パンダくん&ネコくんが勢ぞろい。なんと、ニッキーねえさんのキュートでワンダホーなビキニ姿も拝めます!
Nintendo
厳選に厳選を重ねたシール(バッジ)を極限まで隙間なく詰め込んでおりますが、実は、誌面の制約上泣く泣く掲載を見送ったシール(バッジ)が、まだまだ大量にございます。
(「バッジとれ~るセンター」プレイヤーならご存知であろう)「ドット絵シリーズ」は殊に秀逸で、絵師の匠の技が光る作品群……なのですが、今回は断腸の思いで掲載を断念。
第一弾が好調なら続編制作の道も開けますので、みなさま、よしなにお願いいたします。
ワンチャンアルデー無事終了 [雑記]
昨日、南青山FutureSEVENで行われた「ゲーム音楽親睦会 ワンチャンアルデー!」は大変な盛況でありました。
演者の方々の興味深いトークと、素晴らしい演奏(奇抜な演奏も含む)にも感動!
大石由梨香さんのピアノと歌、あだっちさんのルーパー芸(ピアノ生演奏を幾重にもオーバーダブしてひとり連弾)、ikeさん×ヒトミchの新ユニット「ワンチャンアルデー」によるピアノ・リコーダーアンサンブル、沖政一志さんの箏演奏、どれもあっぱれでした。というか、楽器演奏できる人を心底羨ましく思いましたわ~。
拙者はといえば、(拙者のトークを聴くために)はるばる京都からお越しいただい方や、濱文様の文鳥手ぬぐいをプレゼントしてくださった方もいて、お心遣いが有り難いやら申し訳ないやら……。十分ご満足いただけたかどうか、はなはだ心配ではあります。
といったわけで、本来ならここで会場のようすでも公開すべきなんでしょうが、あろうことか写真を取るのをすっかり忘れておりました。かたじけない!
また機会があれば、今回お話できなかった小ネタをご披露しますね~。
演者の方々の興味深いトークと、素晴らしい演奏(奇抜な演奏も含む)にも感動!
大石由梨香さんのピアノと歌、あだっちさんのルーパー芸(ピアノ生演奏を幾重にもオーバーダブしてひとり連弾)、ikeさん×ヒトミchの新ユニット「ワンチャンアルデー」によるピアノ・リコーダーアンサンブル、沖政一志さんの箏演奏、どれもあっぱれでした。というか、楽器演奏できる人を心底羨ましく思いましたわ~。
拙者はといえば、(拙者のトークを聴くために)はるばる京都からお越しいただい方や、濱文様の文鳥手ぬぐいをプレゼントしてくださった方もいて、お心遣いが有り難いやら申し訳ないやら……。十分ご満足いただけたかどうか、はなはだ心配ではあります。
といったわけで、本来ならここで会場のようすでも公開すべきなんでしょうが、あろうことか写真を取るのをすっかり忘れておりました。かたじけない!
また機会があれば、今回お話できなかった小ネタをご披露しますね~。
3月19日の「ワンチャンアルデー」に登壇します [雑記]
不肖わたくし、3月19日(土)に開催される「ゲーム音楽親睦会 ワンチャンアルデー!」に登壇いたします。
以下、告知サイトからの転載です。
拙者はゲスト5名のうちのひとりであり、持ち時間は10分程度であります。
トゥーシャイボーイでおなじみの拙者であるにもかかわらず、ikeさんからのお誘いをなぜ受諾してしまったのか? それは、うっかりしていたから! ……というわけで、今さら仮病で休むわけにもいかないので、パワポでスライドをちまちま作っていたりします。
今後、いつ同様のお誘いがあるか、それをうっかり引き受けるかは未定につき、興味がある方はぜひお越しください。
詳細は主催者ikeさんのblog「ピアノであそぼ日記」をご覧ください。
以下、告知サイトからの転載です。
ゲーム音楽の演奏会が終わった後、ほとんど同じメンバーで二次会。
よく見る光景ですね。
むしろ二次会がメインと言っている人すらいます。
…でもそれなら、最初から飲み会で、酒のツマミに演奏やトークがついてくるイベントがあっても良くね?
ゲーム音楽が好きで、飲み会はもっと好き。そんなあなたの願いを叶えるイベント、それが「ゲーム音楽親睦会 ワンチャンアルデー!」です。
●そんなわけで、これは「いきなり二次会みたいなもの」です。
軽い気持ちでお越しください!
日時: 2016年3月19日(土) 18:00開場 18:30開始 21:30終了
場所: 南青山FutureSEVEN
参加費: 4,000円
・FutureSEVEN専属シェフによる、ブッフェ形式の美味しいお食事付き
・1ドリンク付き(追加ドリンクは、バーカウンターで1杯500円を頂きます。)
拙者はゲスト5名のうちのひとりであり、持ち時間は10分程度であります。
トゥーシャイボーイでおなじみの拙者であるにもかかわらず、ikeさんからのお誘いをなぜ受諾してしまったのか? それは、うっかりしていたから! ……というわけで、今さら仮病で休むわけにもいかないので、パワポでスライドをちまちま作っていたりします。
今後、いつ同様のお誘いがあるか、それをうっかり引き受けるかは未定につき、興味がある方はぜひお越しください。
詳細は主催者ikeさんのblog「ピアノであそぼ日記」をご覧ください。
Arduino EEPROMの初期値 [Arduino]
サインスマートのLeonardo互換ボードでEEPROMを使ってみようと思ったのですが、そもそも初期値はどーなってるの? というわけで、メモリダンプしてみました。
以下、EEPROMメモリダンプスケッチ。
※初出時、最終アドレスが0x1ffとなっていたため、0x3ffに修正しました。(2016/1/16)
[ dumpEEPROM.ino ]
実行結果は次のとおり。
すべて0xffでした。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をはじめよう 第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.cpp ]
以下は、サンプルスケッチ(Keyboar_jp使用例)です。Digital Pin 2-GND間、Digital Pin 4-GND間に接続したタクトスイッチを押下すると、円記号を含む文字列を出力します。Pin 2ボタン押下時はKeyboard.write、Keyboard.printを使用して出力、Pin4ボタン押下時はKeyboard.writeRawを使用して出力しています。
[ Keyboard_jp_test ]
【謝辞】
Keyboard_jpライブラリの作成にあたり、「まごころ誠実堂~Arduinoで任意のUSBコードを送る 解決編」を参考にさせていただきました。
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コードを送る 解決編」を参考にさせていただきました。
サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック
- 出版社/メーカー: サインスマート(SainSmart)
- メディア: おもちゃ&ホビー
Raspberry Piにリブート/シャットダウンスイッチをつける [Raspberry Pi]
Raspberry Pi B+/Pi 2 B用のリブート/シャットダウンスイッチを作ってみました。
まずは、Raspberry Piに取りつけるリブート/シャットダウンボタンを製作します。
▲秋月で購入した2ピンタクトスイッチと、好みの長さに切断できる分割ロングピンソケットで、リセット/シャットダウンスイッチを作ります。RasPi内蔵プルアップ抵抗を使うので、外付け抵抗は不要です。
▲タクトスイッチを、Pin39(GND)-Pin40(GPIO21)間に挿します。
電子工作はこれだけ。超カンタン。
続いて、リブート/シャットダウンスクリプトを作成。あらかじめ、Python(Python3) GPIOモジュールもインストールしておきましょう。
スクリプトの仕様と、動作シーケンスは以下のとおりです。
(1) リブート/シャットダウンスクリプトが起動すると、オンボードPower LEDが点滅します(2秒毎に0.1秒間消灯)。
↓ (2) タクトスイッチを1秒以上押し続けると、LEDがゆっくり点滅(3秒間)。この間にスイッチを離すとリブートします。
↓ (3) さらにタクトスイッチを押し続けると、LEDが速く点滅(3秒間)。この間にスイッチを離すとシャットダウンします。
↓ (4) さらにタクトスイッチを押し続けると、リブート/シャットダウン処理をキャンセルできます。
↓ (1)へ戻る
リセットボタンを押したあとに「いかん! 編集中のデータをまだ保存してなかった!」的な事態に陥っても、ボタンを長押ししつづければ危機回避が可能な仕様となっております。
スクリプトを起動し、動作確認を行います。
リブート、シャットダウンともに正しく動作することを確認できたら、/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で導入済みパッケージの更新を行ってみてください。
まずは、Raspberry Piに取りつけるリブート/シャットダウンボタンを製作します。
▲秋月で購入した2ピンタクトスイッチと、好みの長さに切断できる分割ロングピンソケットで、リセット/シャットダウンスイッチを作ります。RasPi内蔵プルアップ抵抗を使うので、外付け抵抗は不要です。
▲タクトスイッチを、Pin39(GND)-Pin40(GPIO21)間に挿します。
電子工作はこれだけ。超カンタン。
続いて、リブート/シャットダウンスクリプトを作成。あらかじめ、Python(Python3) GPIOモジュールもインストールしておきましょう。
$ sudo aptitude install python-rpi.gpio pyhton3-rpi.gpio
スクリプトの仕様と、動作シーケンスは以下のとおりです。
(1) リブート/シャットダウンスクリプトが起動すると、オンボードPower LEDが点滅します(2秒毎に0.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で導入済みパッケージの更新を行ってみてください。
uxcell 押しボタンスイッチ タクトスイッチ 2ピン 瞬時触覚タクト ブラック 6x6x5mm 10個入
- 出版社/メーカー: uxcell
- メディア: Tools & Hardware
Raspberry Pi 2(Jessie)でradikoを受信する[crontab編] [Raspberry Pi]
前エントリで構築したradiko受信環境。コマンドラインで実行するぶんには問題ないのですが、crontab設定でハマってしまったため、そのあたりについても備忘録を残しておきます。
ハマッたのは次の2点。
1) cronのデフォルトパスに/usr/local/binが通っていない。
2) コマンドオプションの%をエスケープする必要がある。
これらを解決するには、crontab -eで次のように記述します。パスを追記し、%の前に\(または半角円記号)を加える必要があります。#で始まる行はコメントです。
もしくは環境変数を設定して、次のように記述しても可。
さらに、録音ディレクトリやdate~の記述も環境変数に書いておくとスッキリします。date~を環境変数に記述する場合、%のエスケープは不要です。
ハマッたのは次の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
- メディア: エレクトロニクス
【Amazon.co.jp限定】Transcend microSDHCカード 32GB Class10 (無期限保証) Newニンテンドー3DS 動作確認済み TS32GUSDHC10E (FFP)
- 出版社/メーカー: トランセンド・ジャパン
- メディア: Personal Computers
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を使用していますが、各自お好きなエディタをお使いください。
なお、公開鍵インストール時に警告表示されますが、無視して意地でも先に進んじゃいましょう。自己責任で。
■必要なパッケージとスクリプトをインストールする
radiko受信に必要なもろもろのパッケージをインストールします。radiko再生/録音スクリプト radio.sh は /usr/local/bin へ移動したほうが使い勝手がよさげです。
■受信テストを行う
環境構築が済んだら、受信テストを行います。radiko参加放送局一覧を参照し、radikoで聴取可能な地元局を指定してください。以下は、関東地方でTOKYO FMを受信する例です。
ヘッドホン端子にスピーカーを接続した際、スピーカーから音が出ないことがあります。この場合は、次のコマンドを実行してオーディオ出力先を切り替えます。最後のパラメータで出力先を、0(自動)、1(ヘッドホン端子)、2(HDMI端子)のいずれかに設定できます。
音量設定方法1。alsamixer起動後、カーソルキー上下で行えます。終了はESC。
音量設定方法2。amixerを用いると、コマンド一発で音量設定できます(nn%を任意の値に変えてください)。現在値はamixer sget で取得可能。
■録音/再生テストを行う
続いて、録音/再生テストを行います。(ホームディレクトリ)/radioを作成し、そこへTOKYO FMの番組をファイルネーム「test.m4a」として1分間録音。その後、mplayerで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)
※以下の作業は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
- メディア: エレクトロニクス
【Amazon.co.jp限定】Transcend microSDHCカード 32GB Class10 (無期限保証) Newニンテンドー3DS 動作確認済み TS32GUSDHC10E (FFP)
- 出版社/メーカー: トランセンド・ジャパン
- メディア: Personal Computers