✖
スマフォのテザリングを主回線にした家庭内LANの構築
結局これを買って、あとかなり昔に買ったしょぼいルーターを使って構築してみた。
- インターネット → (LTE) → スマフォ → (Wi-Fi) → イーサネットコンバーター LAN-PW150N → (LANケーブル) → ルーター → (Wi-Fi or LANケーブル) → 各端末
LAN-PW150N は初期設定に LAN ケーブルが必要だけど、昨今の Mac にはイーサネットポートがついてないので、Windows 機をひっぱりだしてきて設定した。スマフォのAPに特に問題なく設定できた。
スマフォのテザリングは切ったり入れたりをよくするので、LAN-PW150N がそれなりの速度で再接続を行ってくれるかが心配だったけど、特にそれも問題ない感じだった。
これで以下のようなことが可能になった
- 同じネットワーク間のコンピュータでの通信 (スマフォのテザリングのオンオフ関係なしに)
- DLNA
- ファイル共有
スマフォのテザリングは 2GHz バンドでしかできないっぽい。ルーターから出す電波は 5GHz バンドにしたほうが干渉しにくくなって良さそうだけど、うちにあるしょぼいルーターだとできないので多少そのへんが犠牲になってる。
↑ これが欲しい。
JT65
微弱信号通信用の通信プロトコルに JT65 というのがあるらしい。もともと VHF の EME (月面反射通信) 用に考えられたみたいだけど、それを HF 帯の地上間通信にも応用して流行ってる?みたい。実際信号を聞いたことはない。しかしプロトコル自体の解説が全然見つからなくてよくわからない。
- 72bit のメッセージに 6bit シンボルの RS(63,12) (リードソロモン12シンボル長データに51シンボルのパリティ)。
- 72 / 6 = 12 シンボル に対し訂正符号51シンボル
- 64 トーンの FSK
- 2の6乗、すなわち1シンボルにつき1トーン
- 1分間間隔で TX/RX が切り替わる (正確な時間で同期をかける)
細かい部分がまだよく理解できてない。ものすごいおおざっぱに理解すると、
- 厳密にお互い同期した時間を持っていることを前提に
- かなり強い誤り訂正符号を付与して
かすかに受信できる信号を本来のデータにデコードできるようにする、という話っぽい。あとよく使うメッセージに関してはショートハンドメッセージというのを定義してより受信しやすくしている (プロトコルにこういうヒューリスティックな要素があるのはだいぶ気持ちが悪いしチートっぽい)
EME の場合、月まで往復約2.5秒かかるけど、正確な時間の同期はどうしているんだろう? 定数?
換気扇から煙草の臭いが入ってきて不快
結構前からなんだけど、キッチンの換気扇を止めているとき、煙草の臭いが入ってくることがある。不愉快極まわりないうえに完全な対応法がない。吸ってるやつを見つけだして磔にしたい。ヒカリエに磔にしたい。
原因は
- 外にタバコの臭いがしばしば蔓延している
- うちはこのせいで窓が殆どあけれない。磔にしたい
- 部屋の中が負圧になってる
- 浴室の換気扇をつけっぱなしにしているからだと思う
解決方法としては
- 吸ってるやつを全員磔にする
が最も効果的で最良の方法なんだけど、合法的に行う方法が思いついていない。
なので仕方なく、換気扇をプラスチックダンボールと磁石で作った自作の蓋で塞いでる。3ヶ月ぐらいこれで (つまり運用で) カバーしているけど、プラスチックダンボールだと硬さが足りなくて耐久性が低く、よく落ちてきてしまって、これがまたストレスが溜まるんだけど、まぁまぁお手軽なので現状これでやってる…… もっといい方法を知りたい (例えば喫煙者を全員合法的に磔にする方法とか)。
✖
✖
✖
異常に食べたくなったので買った。
梅みんつ的なものは100均で2種類ぐらい買ってみたけど、メーカーによる個体差が激しい (香料効かせすぎていて美味しくないやつもひいた…)。小さめのほうが好きだけど、オリオンのは少し大きい。
✖
元気が全く、全然出てこなくて、どうしようもない。1回大きい負荷がかかって以来全方面にすっかり心が折れてるのがずっと続いてる。
コーディングは、別に、個人的に書きたいコードとかは比較的普通に書けるしまぁまぁ楽しめるけど、誰か別の人間のためにコードを書こうという気が前にも増して一切失くなってる。
アルゴリズム的なものに実装に挑戦しようとしたりしているけど、全然どこから手をつけたらいいのかわからなくて、本当、自分は実力というのがなくて、積み木を積むことしかできないということを痛感してやる気がなくなる。理論的な部分が、イメージは掴めても、コードに落としこめない。コードが普通に書ける人からしたら「はぁ?」って感じのレベルだし、そのせいで、こういったコードを書こうとすると、コードを普通に書ける人にバカにされることばかり考える。「そんなこともできないでプログラマ〜やってるの?」「そんな実装普通しないよww」とか、そういったことが常に頭に浮かぶ。
具体的には、隠れマルコフモデルとかリードソロモン符号とかが、なんとなくかっこいいし実用的そうなのでやってみたいけど、途中で挫折してる。隠れマルコフモデルはモデルの作りかた(学習のさせかた)がさっぱりわからず、コードをコピってきたとしても、欲しいものを作りあげることができない。リードソロモン符号は根本的にガロア拡大体の変換規則みたいなやつが理解できない。リードソロモン、ググっていると「こんなのもできないのは〜」みたいのがひっかかってほんと萎える。
コード以外でも、モールスの聞き取りは気分転換にやっているつもりなんだけど、全然成長している感じがしない。こっちは定量的評価として聞き取り精度を記録していて、全く成長していないなんてことはないんだけど、とにかく成長が遅すぎてめげそう。ある程度は訓練が習慣になっているとはいえ、こんなことしても1円にもならないし、バカにされるだけというのが多重でつらい。
無線工学の勉強も、一定の成果は見せていて、テスト問題で評価する限りでは向上が見られるけど、主観的には向上した感じがしていない。
英語の勉強は毎回それをしようと始める前にめげる。何度始めようとしても「いくら勉強したってネイティブ並に喋れる日本人にバカにされる」状況しか思い浮かばず、メリットが押し潰される。ドヤ顔で日本人に説教されるのほどイライラすることはないと思う。そいつらがみんな死んだらやる気になってもいい。TOEIC満点とるのが普通です、みたいなのやめてほしい。そういった形でバカにされることがないぶん、モールスのほうが100倍ぐらいマシに感じる。モールスは、十分に習得した人がレベルが低い人をバカにすることはあまりない。なんで同じような技術訓練なのに、モールスと英語でこんなに違うのだろう。
いずれにせよ、遅かれ早かれ、技術力の向上を目指すならば以下の点を改善する必要がある
- 数学力
- 英語力
英語はともかく数学力を向上させる方法がさっぱり思い浮かばない。かけ算九九がクソ遅い時点で躓いてる。これら、できる人からひたすらバカにされ続ける感じの分野なので、本当につらい。
RPG のレベル上げみたいに、特に負荷をかけなくても、単純作業をやっていたらレベルが上がっていったらいいのにと思いながらドラクエ1をクリアした。現実は少し強めの負荷を継続的にかけないとレベルは上がらない。同レベル以下のモンスターだと経験値が0になるネトゲのような感じだ。
✖
✖
読んでて、実際実践しないとだめなそうな感じだけど、結局役に立たない気がする。
第七章を読んでて、じゃあタバコ臭いやつに対して怒りが出ないようにできるか?っていうと、全然解決方法が見えてこない。
- 「タバコなんて誰もが吸うべきではない」
- ↑ 反論:人の勝手
- 「路上喫煙はもはや禁止されてる」
- ↑ 反論:?
- 「タバコを吸うやつはゴミクズ」
- ↑ 反論:そうとは限らない
- 「タバコを吸うやつのドヤ顔に嘔吐がでる」
- ↑ 反論:誰もがドヤ顔ではない
こんなことしても意味があるように思えない。公正さが相対的だなんてあたりまえすぎる。
生理的に受け付けることができず、逃がれることもできないことに対しての対処法が示されていないように思う。それに対して「認知の方法を変えろ」っていうのはすなわち我慢しろってことと一緒だ。結局我慢するしかないってこと。怒らないで、諦めろってだけ。どうしようもないから、単に諦めて我慢しろ、としか言っていない。「なんであんなゴミクズ共がドヤ顔で路上喫煙してるのに、何も悪くない自分が我慢しなくてはいけないんだ?」とは考えてはいけない。単に我慢して通りすぎろってだけ。どうしようもない。何の救いもない。思考を停止しろってこと。こんなのなら、ツールとしての神様というのを考えると「あいつらには天罰が下るから放っておこう」と考えたほうが、精神のコントロール方法として惨めにならないぶんまだマシだと思う。
✖
認知療法の「考え方を変えろ」というやつが、そもそもアイデンティティを毀損していて、デッドロックが発生しているように感じる。
これまでの「考え方」はこれまでの人生そのものではあるけど、全てを変えない限りではアイデンティティは破壊されない。これからの人生は別に考え方を構築できる?
しかし自動思考ってものすごいアイデンティティに密着しているように感じる。1個取り外せば、全部こんがらがっているから、全部出してくるしかないような。
✖
習慣とか考え方って、急に変化させることはできない。徐々にしかできない。
ウェブサービスは「リニューアル」をすべきではないと思う。少しずつ変えていって、最終的に目的ものに変化させるしかない。過渡をおろそかにしているから、結局ユーザに大きな反感を買う。
✖
何をするにせよ出てきて、自分をバカにしてくる鬱陶しいドヤ顔というのがあって、それを消滅させたい。
何をするにせよ頭にイメージとして自動的に浮かんでくる。これは、特定の誰かというわけではなく (直近で嫌なことを言われた場合その人物になるけど)、いろんな顔が重ねあわさっている。
不愉快なことがあったときも、その「不愉快な顔の集合」みたいなのが脳裏に浮かんでくる。タバコ吸ってるゴミ共の場合、そういう人らのドヤ顔が合成されて脳裏に浮かぶ。
幻視・幻聴というレベルではないと思う。実際それがないことはわかっているけど、自動的に想像される。何が原因になってこれが起こるようになったのか、全くわからない。いつからなのかもわからない。少なくとも大学生のときにはあった。一番遡って思い出せる範囲でバカにされて傷ついたことを思い出すと小学1年生のときの給食で教師にバカにされたことだと思う。今思い出しても理不尽さに腹が立つ。とはいえ、たぶん特定の1事象でこうなったわけじゃなくて、積み増しされて不愉快な顔が合成されているんだと思う。
✖
タバコについては、独りでいるときはアンコントローラブルな部分があって、即殺したい感じになるけど、社会性にスイッチが入っているときはほぼ何も考えず無視できる程度の自動思考だと思う。実際、喫煙者がいる飲み会とかは (飲み会中は) キレたりはしない。帰ってからがひどいだけだ。
✖
不愉快な顔の自動思考も、社会性にスイッチが入っているときは起こらない。これは社会性にスイッチが入っているかどうかじゃなくて、単に社会性の負荷が重すぎるので、そのへんの自動思考まで負荷がかけられないからだと思う。
しかしタバコに対する不快感の場合、人前で抑えていれば十分なので、社会性スイッチと同期しているのは都合がいいというか、表面的には問題がないけど、何らかの学習とか、コードを書くとかの場合、社会性スイッチが必ず切れている状態になるから、非常に大きな問題になってる。
✖
22:00 ぐらいから1時間ぐらい、タバコの臭いがあまりにもひどかった。基本、止まっている換気扇から入ってくるから、プラスチックダンボールで蓋 (当然タンボールの方向的に隙間ができにくいようにはしてある) をつけてるにも関わらず、ひどい臭い。しかたないので換気扇をまわして、臭くない方向の窓をあけた。
外にいて多少タバコ臭い、というのがぎりぎり我慢できる限界で、家の中に臭いが入ってくるのは完全に我慢の限界を超えている。タバコ吸ってる汚物は、自分が汚物であることを自覚して、締めきった部屋でもちろん換気扇もつけずに、すなわち自分という汚物を完全に密閉して吸ってもらいたい。それができないならタバコを吸うな汚物。
✖
✖
つかれた
✖
今年買ってよかったものまとめ
ドラム式洗濯・乾燥機
買ってから半年ぐらい経ったけど不満なし。常に乾燥まで一気にやっていて、一切外に干していない。
食洗機
これも買ってから半年ぐらい経ったけど一切不満がないし、これなしではもはや生きていけない。
手で洗うよりも確実に綺麗になるので安心感がある。無理してでも設置する価値が絶対にある。
小物洗うには別途カゴも必要。これは厚さを2段階に調節できて便利。ステンレスだから清潔な感じがするし良い。
ルンバ
これも買ってから半年ほどだけど満足度が高い。普段の掃除の殆どを自動化できる。
これに限らないけど、ここまで書いた「家事自動化」は確実に生活が向上する。特に、1つ自動化できればその間に他のことをすることができる。
シャトルシェフ
これは自分では買っていなくて、結婚祝いにもらったんだけど、同じように便利。
煮ている間、火を使わないのでつきっきりでいる必要がなくなる。家事自動化と同じような効果があって、他のことに時間を使うことができるようになる。洗濯機まわしつつ、食洗機まわしつつ、ルンバを起動して、シャトルシェフでカレーを作りながら風呂に入ったりとかできるようになる。神か。
髪の毛くるくるぽい
掃除しやすくなっていい。あと見てると渦ができて楽しい。ただ、設置方法的に、くるくるぽいに髪の毛が挟まっていることがあって、これがうまく解決したらいいなあと思う。
万年筆
kakuno のコストパフォーマンスが非常に高い。書くのが楽しくなる。勉強とかテンションあがらないけど、多少テンションをあげることができて良い。
これらも買うとさらにテンションをあげることができる。インクを早く使いきるぞ!っていうモチベーションが生まれるのでかなり良い。
スピードサラダ
切れるピーラーを使うべき。千切り機能が思いのほか便利だった。
ロールシャープナー
包丁研ぐの面倒だけど、これだとすぐ研げるので良い。切れない包丁はかえって危険なのでこまめに研げるのがいい。
10口OAタップ
10口ある OA タップはなかなかない。四角でデザインもわるくない。横と縦につけれるので、幅が大きいACアダプタが多い場合も有効に使いやすい。
ACアダプタ繋げるタップ
AC アダプタばっかり繋げる場合、こういうのがあったほうが便利。
テービルタップボックス、モール
テーブルタップボックス、モールは「見た目」の観点から語られることが多いけど、ルンバを使う場合、ケーブルを床に這わせると悲しいことになるので、これらが必須。もちろん見た目もかなり良くなるので大変良かった。一旦設置したら動かすことも殆どないので、面倒くさがらず一回やったらよい。
ドリルドライバ
ドリルとしても使えるし、ドライバとしても使える。クラッチがついてるので一定の締め付け度になると空転してくれる。普通に使ってる。
踏み台 セノビー
うちが狭いので、あまり踏み台とか買っても置き場がないんだけど、これだと折り畳めるので便利。普通に使いまくってる。
ワットモニター
消費電力の可視化は重要。まずは測定。間違った思い込みで節電しても効果は薄い。
AVR progmem に long を置く方法
PROGMEM をつけると (const も必須)、その変数の示す先がプログラムメモリー領域になる。そのままだと使えないのでワーキングメモリ (SRAM) にコピーする必要がある、という話。大きい定数は SRAM に置けないので、基本的にプログラムメモリ (フラッシュメモリ) 上に置いて、必要なときだけコピーするようにする。
avr/pgmspace.h に byte やら word を読み出す関数は提供されているけど、long はない。どうするのが正しいのかなあと思ったけどよくわからなかった。
結局以下のように memcopy でうまくいった。
const uint32_t MORSE_CODES[] PROGMEM = { ... }; uint32_t current_sign; memcpy_P(¤t_sign, &MORSE_CODES[character], 4);
progmem 調べていると prog_ が prefix された型を使え、って書いてあるのがよく検索ででてくるけど、それは obsolete で、使うとエラーになる。ヘッダを読んだほうが良い。const と PROGMEM をつけるのが正しい。
しかしヘッダ見ると far とか near とかよくわかんない関数がいっぱいあって混乱する。far は 64KB 以上のフラッシュがあるデバイスしか関係ないっぽいので気にしないほうがいいっぽい。つまり near_ だけ使っていれば良い (実際、 near も far もついていない関数は near のエイリアスになっている)
ヘッダファイルの冒頭部分の一部を訳してみた。
電子部品の整理
抵抗器とかコンデンサとかをうまく整理する方法を考えてる。とにかく種類が多いし、そこそこ体積があったりするので面倒くさい。
値わけして袋詰めするまではいいとして、袋がばらばらにあっても、ソートされていないと見つけることができないのでゴミと変わりがない。
抵抗
抵抗はそんなに大きくないので (100本ぐらいだと結構…) 100均のハガキ用バインダーにだいたい納まった。E24 系全部持ってたりすると2冊ないとダメそう。
コンデンサ
電界コンデンサだと特にだけど、そこそこ体積があるので、バインダーみたいのに入れこむのはつらい。こちらは普通に横長のプラスチックケースにソートして入れるみたいにしてみた。
本当は仕切りが可変できるパーツボックスがあればいいんだけど、結構高いのしかないので、これで我慢する。
半導体
半導体が一番悩ましい。ソートしようがないので、できるだけ 一覧性が高い形で保存したいけど、いい方法が思いついてない。
基本は用途別にわけていくのがよさそう。
- ダイオード
- 整流用
- 小信号用
- ツェナー
- LED
- 形別にわける
- トランジスタ
- 耐圧ごと? になんとなくソート?
- フォトカプラも
- FET
- 耐圧ごと? になんとなくソート?
- センサー系
- ロジックIC
- オーディオ関係IC
- マイコンチップ
✖
1アマ (第1級アマチュア無線技士) 試験を受験した
アマチュア無線の試験を前回 (3級) 受けたのは、まだ電信受信試験があった中1のときだったので、実に14年ぶりぐらいの試験になった。その間に電信の試験は廃止され2級と1級はあまり難易度に差がなくなったみたいなので (数学的な部分だけ?)、2級は受けないことにした。
動機
- 10MHz, 14MHz (2級以上で許可) に出てみたくなった
- 3級とか小学生でもとれるし恥ずかしい感じがする
- 資格の説明が「 アマチュア無線局の無線設備の操作」 とシンプルになってかっこいい
やりたいことは2級でもできるし、QRO (2級で最大200W、1級だと最大1000Wまで許可されるけど、集合住宅だと出力をあげるのは悪手) する気もないので、モチベーション的な問題が大きい。
勉強
昔はどうだったか知らないけど、1アマは難しい難しいと聞いていた割に、今はそんなに難しい試験ではないように思った。中学で数学ちゃんとやって卒業してたら余裕、みたいな感じだと思う…… (複素数の計算が一部あるけど、1アマだとたいしたことはしない) 電信聞き取りがないし、ほんと単に数学力が難易度に直結する。
自分は中学・高校で数学をちゃんとやらなかったばかりか、かけ算九九でミスをするレベルなので、そのへんが大変つらかった。問題を方程式にするまではできても、かなりの頻度で計算ミスをして、しばらく気付けないことがある。計算ミスが多いと、それに気をとられるがあまり、考慮不足で根本的に間違えることもあって辛い。
2ヶ月前から落ちてもいいから基礎からというつもりで準備をしたけど、本気でやりまくったのは最初の1ヶ月だけで、模試をしてみたら合格点を超えてしまったのでだんだんやる気が落ちていった。使った本は
と、中学生レベルの計算を思い出すためにドリルを買って2回ぐらいやった。高校受験用だと中1〜3まで纏まっていて便利。
ドリルは体感的にはかなり効果があって、その後問題を解くのが気分的にもだいぶ楽になった。
あと、本でよくわからなかったところは以下のサイトが大変わかりやすかった。たぶん以下のサイトと過去問題だけでも工学は受かると思う。
前述の通り、複素数に関しては1アマでは普通に文字式を解くのと変わらないレベルのことしか要求されないので、余計な勉強はしてないし、特に苦手意識もつかなかった。新たに覚えたのは分母にj がきたとき共役複素数で分母を有理化というルールだけだった。
本番
直近の過去3回の問題は事前にやってたけど、工学は本番の問題が思いのほか難しく感じた。これは1枚目に計算問題が集中しており、なおかつその全てが事前にやった問題集や試験問題に同じ形の問題がないというものだったからだと思う。なのでかなり焦った。そう難しい変化ではないとはいえ、方程式の変形をよくミスするので、結局念のため4回ぐらい解いたりした…… (おかげでこれらは正答できた)
能動素子 (半導体) の問題が全然でなかったなあという印象だった (出たことは出たんだけど)。ことごとく、出たらいいなあとなんとなく思っていた問題はでなかった。逆に、出たら捨てようと思っていた過渡状態の問題がでて悲しかった (けどこれは改めて考えたら解けた)
間違えた問題(A問題の2問)の原因は、理解不足による勘違いと、根本的な解きかたのケアレスミス (2倍するのを忘れた的な) だった。
久しぶりに全力で応用部分の頭使った感じだった。終わったあとヘロヘロになった。
法規は単に覚え間違いが多かった。「無線電信とは~通信設備である」が何度見ても納得いかない。設備じゃねーだろと思うんだけど、定義だから仕方ない……
答えあわせ
試験日の3日後?の15時に公式の解答が出るみたいで、答えあわせをした。(法規、工学ともに、150点満点中 105点 正答率70%以上が合格ライン)
- 法規: 130点 (正答率87%)
- 工学: 140点 (正答率93%)
だった。試験後の印象としては、法規は余裕で工学がヤバイ、だったけど、点数的には逆だった……
マークミスさえなければ、合格しているはず。25日に正式な合格発表がある。
まとめ
やればできた。勉強はじめる前はいろいろあって受かる気がしなかったんだけど、実際勉強してみると、そんなグダグダ言うほどには難しくなくて、これさえ受かないとかだと自分相当ダメなんじゃないかと思ってプレッシャーだった。(難易度的には1陸特より少し難しいぐらいらしく、無線資格としては1陸技・1総通まであるわけで、入門レベルなのだなあという感じ…)
たまには試験的なものをしてみるのもいいかもなあと思う。けど、受けるモチベーションが起こる試験があまりない。多少勉強する姿勢ができたので、継続して何かしら勉強をしたい。
✖
仮にも (こういう言い方をすると怒られそう) プログラマとして働いているのに、情報処理試験を一度も受けたことがなく、勉強の機運が高まっているので受けてみようと調べてみたけど、やはりメリットが感じられず、モチベーションが沸いてこなかった。
情報処理の試験は受かっても別になにか独占業務があるわけではないので、何に価値を見い出せばいいのかよくわからない。「情報セキュリティスペシャリスト」とか名前かっこいい!ぐらいしかない…… ウェブ業界だと、資格持ってても github しか見られないし就職には殆ど意味を感じられない。
勉強すること自体には意味があるけど、過程だけに意味があってもやる気沸いてこない。なんか「これは!!」っていうメリットはないんだろうか。
✖
今年買ってあまり良くなかったものまとめ
慎重に買ってるつもりだから、あんまり思いつかないんだけど
ブドウ糖
頭良くなるかな〜 と思ったけど (この発想が頭悪い)、まぁ砂糖だね… って感じだった
電工ペンチ
ワイヤストリッパーは便利だけど、圧着端子は別の工具が必要だな、思った。結構つらい。
頭洗うやつ
悪くはないんだけど、ちょっと面倒でたまにしかやらなくなった。でもたまに使うと気持ちいい。充電が地味に面倒なので、非接触充電になったらなあ。
モンキーレンチ
専用サイズのレンチのほうが100倍ぐらい使い勝手が良い。あると便利だけど、あくまで非常用だなあという感じ。100均でもそこそこの種類のレンチは買える。
6口スイッチつき電源タップ
スイッチついててもあんまり使わないので口数が多いほうがうれしい…… 一応プリンタの待機電力が非常に多いのでできるだけ切るようにしてるけど、なんともいえない。
Qi 用のエネループ充電器
Qi (無接触電源) で単3エネループを充電するやつ。Qi は電力供給能力が低いので充電速度が遅いし、結局普通ので充電していて使ってない。
舌ブラシ
舌は確かに綺麗になるけど、最近使ってない。商品は悪くないと思う。
結論:よくなかったものまとめてもテンションあがりませんね。
✖
数学ができない人間に特に便利な、方程式を自動で解くツール (Maxima)
方程式解くのがクッソ苦手でも、コンピュータで方程式を解くためのツールというのが存在するので、大抵のものは自分のようなバカでも自動で解くことができる。
Maxima は Common-Lisp で書かれた数式処理ツールで、方程式を解くこともできる。例えば以下のように
(%i96) assume(C > 0, L > 0); (%o96) [C > 0, L > 0] (%i97) solve([ (2 * %pi * f * L = 1 / (2 * %pi * f * C))], [f]); 1 1 (%o97) [f = - ---------------------, f = ---------------------] 2 %pi sqrt(C) sqrt(L) 2 %pi sqrt(C) sqrt(L) (%i98) tex(%); $$\left[ f=-{{1}\over{2\,\pi\,\sqrt{C}\,\sqrt{L}}} , f={{1}\over{2\, \pi\,\sqrt{C}\,\sqrt{L}}} \right] $$ (%o98) false
(負のやつが出てくるのはどうしたらいいのかわからない。f > 0 を assume しても消えない)
また、出てきた方程式は tex(%oNN) とすると tex 記法にできて、そのまま使える (手直しが必要な場合も多いけど)
数学ができない僕みたいな人間にとってはこの程度の使い方でも死ぬほど便利だと思う。プログラムを書いてるとしばしば方程式を解いて使う場面があって、そういうとき試行錯誤なしにパツイチで求める式が出てくるのはうれしい。
問題は数式を Maxima の式になおすとこなのですこしだけメモ。演算子, ベーシックな関数
式 | 例 |
---|---|
y = 2 * x | |
2^n | |
sqrt(2) | |
%pi | |
%e^(-t / (C * R)) | |
sum(2 * n, n, 1, k) |
simplify_sum
sum をとにかく計算したいときは
$ load(simplify_sum); $ simplify_sum(sum(2 * n, n, 1, k));
ってやると
ってでてくる。便利すぎる。
log10
log10 はなぜか定義されていないので
log10(x) := log(x) / log(10)
してあげる必要がある。面倒だから最初から定義されていてほしい。
assume()
よくある、一部変数の値の範囲を仮定できる。一回定義したのは forget(定義) で消せる。全部消したいときは forget(facts()) で消せる。
Dell UP2414Q 4K 23.8インチディスプレイ
4K で10万円を切る値段のがでてきた。23.8inch 3840 x 2160 非光沢 IPS。重要なのはディスプレイサイズが今までのに比較して、小さいところだと思う。AdobeRGB 99% カバーらしいし、写真扱うなら本当に欲しいものが出てきた感じだ。
ディスプレイのppiはどれぐらい必要か? というのを書いたけど、これの場合、ppi は約185。デスクトップに置いたとき、ディスプレイの大きさとのバランスが良いのがでてきたなぁという印象。
MacBook の最新モデルからは 4K 解像度に対応しはじめたので、ようやく使える環境が整いつつある。しかし、割と最近にディスプレイ買ったばっかりなのでちょっと手が出ない…… (とかいって買いそう)
function ppi (w, h, inch) { return Math.sqrt(w * w + h * h) / inch }; ppi(3840, 2160, 23.8); //=> 185
✖
✖
✖
✖
Mac で SD カードの速度を測定
買ったSDカードあるいは持っているSDカードの速度がどんなものか測りたいとき、Mac だといまいち良いツールがなかったけど、いつのまにか良さそうなのがでてた。
ただ、SDカードの領域を埋めつくすまで書きこもうとするのでかなり時間がかかるのがイマイチな感じ。意図としてはカード全体がちゃんと動いてるかどうかをチェックという感じだと思う。実際、途中から速度が大幅に変わったりする。
以下のスクリーンショットは手元にあった microSD カード (カード上の表記は Class10) を測定中のもの。最初は 6MB/s だったけど、途中から 11MB/s ぐらいになった。Class10 は綺麗な状態での書き込み10MB/sを保証するので、仕様には適合している。
✖
AVR のタイマー計算機
というのを作ってみた。
AVR に限らないけど、マイコンで時間を測るにはCPUクロックを数えるわけですが、欲しい時間に対して分周比とかを求めるのが面倒なのでかいた。
F_CPU は CPU クロック数、Seek Freq. のほうに欲しい周波数または時間間隔を入れて、Calculate を押すと、各分周比において CTC でいくつを設定すればいいか、あるいはオーバーフローでいけるかどうかとかを出す。
16MHz で 1msec を測りたい場合、
Pre-scaler:1, 16bit Timer CTC:16000 Pre-scaler:8, 16bit Timer CTC:2000 Pre-scaler:64, 8bit Timer CTC:250 Pre-scaler:256, no result for 62.5 Pre-scaler:1024, no result for 15.625
このようにでる。この場合は 8bit タイマーで 64 分周して CTC を 250 に設定したらよい。
1アマ合格
25日発表ってアナウンスされてたと思うんだけど、なんとなく見にいったら24日に発表されてた。合格日は速報の日と同じらしいので、さっさと書いて出してきた。
25日にハガキが届いた。はやい。
Raspberry Pi がきたのでセットアップして I2C デバイスを読むところまで
Raspberry Pi だ! ππだ!! Raspberry Pi は約5000円ぐらいで買うことができるカードサイズの Linux パソコンです。当然スペックとしてはしょぼいのですが、ホームサーバ用途とかには十分な感じです。
まぁそれだけでも安くて便利なボードなのですが、キモはさらに GPIO (General Purpose IO) がついているところです。基板にピンが立っていて、そのピンを Linux 側から制御できるので、マイコンの延長として使うことができます。普通、マイコンといえども性能が良かったり複雑なインターフェイスをつけようとすると、結構コストがかかるので、多少複雑なことをしたい場合、このような安い Linux コンピュータで比較的富豪的に諸問題を解決するのは個人レベルではかなりコストパフォーマンスが良い気がします。
これです。クリアケース付きです。本体の他に
- 4GB Class4 以上 SD カード
- microUSB 5V 0.7A以上のACアダプタ (容量が多いほうがよい)
- USB Wi-Fi アダプタ
が必要です。
SD カードの速度
Raspberry Pi 側は UHS-1 とか SDXC には対応していないので、仕様上 Class10 の SDHC 32GB というのが最大限富豪な選択になります。。
http://elinux.org/RPi_SD_cards を見ると、だいたい Read Write ともに 20MB/sec 程度でればいい方みたい (異常に早い報告もあるけどよくわからない)。
イメージの書きこみ
オンラインインストールのものではなく、普通にイメージを落としてきて Mac から書きこみました。特別別途ソフトがいるとかはないので楽です。
diskutil list diskutil unmountDisk /dev/disk99 sudo dd bs=1m if=2013-09-25-wheezy-raspbian.img of=/dev/rdisk99 sudo diskutil eject /dev/rdisk99
指定するのはあくまでディスクであって、パーティションではないところに注意が必要です (/dev/disk2s1 とかはパーティション)。df で出てくるのはマウント済みのパーティション一覧で紛らわしいので、diskutil list を使ったほうが良いです。dd で指定するディスクファイルは r (raw) をつけて指定します。
dd の指定をミスると指定ディスクの内容が消えて悲しいのでこわい。
dd でイメージ作ってるけど、初期設定でパーティションを拡張するようになっているので、でかいカードを使っておいても損はしない。
初期設定
最初はキーボードと HDMI だけ繋げて起動します。
- Expand Filesystem を実行して、SDカード領域全域を使えるようになる。これは一瞬で終わります。
- Internationalization Options → Locale で en_US.UTF-8 をスペースで選択して、デフォルトを en_US.UTF-8 にする
- Internationalization Options → Timezone を Asia/Tokyo にする。
- Advanced Options → SSH を Enable にする。
- Finish して reboot をする。
reboot が終わったら、とりあえず pi/raspberry でログインしてみて
sudo shutdown -h now
して終了させます。
Wi-Fi 設定
さっさと SSH したいのでネット設定します。
念のため終了して電源ケーブルを抜いてから USB Wi-Fi をつけます。
でもう一度電源ケーブルをさして起動
IP は固定で指定します (SSH しやすいように)
$ sudo vi /etc/network/interfaces auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 iface wlan0 inet static address 192.168.0.250 netmask 255.255.255.0 gateway 192.168.0.1 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf # WiFi アダプタが異常に遅い現象が出るのでオフ wireless-power off iface default inet dhcp
めんどうなのでパスは直書き。
$ sudo su # wpa_passphrase ESSID password >> /etc/wpa_supplicant/wpa_supplicant.conf # exit
でもって
$ sudo ifdown wlan0 $ sudo ifup wlan0
以下のようなエラーが出た場合、less /var/log/daemon.log を見るとエラってる部分がわかるはず。
wpa_supplicant: /sbin/wpa_supplicant daemon failed to start
うまくいった場合何も表示されない。daemon.log を見てうまくいっているか確認し、ifconfig を実行する以下のように IP アドレスが割当られます。
pi@raspberrypi ~ $ ifconfig eth0 Link encap:Ethernet HWaddr b8:27:eb:01:5c:f2 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:22 errors:0 dropped:0 overruns:0 frame:0 TX packets:22 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2434 (2.3 KiB) TX bytes:2434 (2.3 KiB) wlan0 Link encap:Ethernet HWaddr b0:c7:45:a9:9e:91 inet addr:192.168.0.250 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:176 errors:0 dropped:0 overruns:0 frame:0 TX packets:112 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:36200 (35.3 KiB) TX bytes:17924 (17.5 KiB)
これで SSH できるようになったはずなので、手元のマシンからログインします。
$ ssh pi@192.68.0.250 pi@192.168.0.250's password: Linux raspberrypi 3.6.11+ #538 PREEMPT Fri Aug 30 20:42:08 BST 2013 armv6l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Sep 26 07:18:58 2013 pi@raspberrypi ~ $
~/.ssh/authorized_keys に手元のマシンのキーを追加して公開鍵認証にしとく。これで、もはやキーボードと HDMI はいらないので外します。
dns-sd 化
IP アドレス固定にしているので必須ではないけど、手元のヒストリとかが綺麗になるし、便利なのでやっておく
$ sudo apt-get install avahi-daemon $ sudo insserv avahi-daemon
で avahi-daemon を入れて、起動スクリプトを登録する。
以下のファイルを作って SSH をアナウンスするようにする。
$ sudo vim /etc/avahi/services/multiple.service <?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">%h</name> <service> <type>_device-info._tcp</type> <port>0</port> <txt-record>model=RaspberryPi</txt-record> </service> <service> <type>_ssh._tcp</type> <port>22</port> </service> </service-group>
それで avahi-daemon を再起動
$ sudo /etc/init.d/avahi-daemon restart
これで名前でアクセスできるようになる。
$ dns-sd -B _ssh._tcp $ ssh -c arcfour pi@raspberrypi.local
アップデート
まずこれをやらないとこわいのでやっておきます。upgrade で結構時間がかかります。1時間ぐらい。
$ sudo apt-get update $ sudo apt-get upgrade
ここまできたらあとは普通に自分の環境をつくります。
環境作り
zsh は重いのでいれず、手元の dotfiles は .bashrc も入れてあるのでそれを使います。
$ ssh-keygen # して key を github に登録 $ cd $ git clone git@github.com:cho45/dotfiles.git $ cd dotfiles $ ruby setup.rb $ sudo apt-get install screen libncurses5-dev vim $ screen -S main $ curl -L http://cpanmin.us | perl - --sudo App::cpanminus ### 以下は時間がかかりすぎるのでやめた $ mkdir tmp $ cd tmp $ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 $ tar xjvf vim-7.4.tar.bz2 $ cd vim-7.4 $ ./configure --prefix=/usr/local/vim7 --enable-multibyte --enable-gpm --enable-cscope --with-features=huge --enable-fontset --disable-gui --without-x --disable-xim --disable-perlinterp $ make # かなり時間がかかる $ sudo make install
raspi はさすがに遅いので vim のコンパイルとかはしないほうが良いみたいです。
perl はデフォルトで 5.14.2 が入っているので十分で、cpanm さえ入れればよさそうです。ruby は 1.9.4p194 が入っていて、まぁそのまま頑張るほうがよさそうです。
I2C できるように
デフォルトでは有効になっていないらしいので有効にします。
/etc/modules に以下を追加
i2c-dev
/etc/modprobe.d/raspi-blacklist.conf の以下の部分のコメントアウトする
# blacklist i2c-bcm2708
でリブートして
$ cat /var/log/dmesg | grep i2c $ sudo apt-get install i2c-tools
確認して、関連ツールを入れておきます。
I2C 確認のため MPL115A2 (気圧計) を読む
仕様を確認しておくと
- 3.3V
- プルアップ抵抗は実装済み
- 3.3V ピンから 50mA しかとれない
- 5V ピンは供給電源から本体の電流(700mA)を引いたぶんだけ使える。1A のアダプタなら 300mA
- しかしレギュレータで 3.3V 安定化するか、入出力部分はレベル変換が必要
となっています。ハードウェア部分はミスると普通に壊れるので、気をつけて作業する必要があります。
手元に、ワンチップで簡単そうなのは MPL115A2 という気圧計しかないのでこれを頑張って読むことにしました。3.3V で使えるし、消費電力もほとんどないので簡単そうです。
http://elinux.org/RPi_Low-level_peripherals を参考に結線すると i2cdetect にでてきます。このアドレスは仕様書に書かれてるのと一緒です。
$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
sudo してるのは /dev/i2c* のパーミッションが一般ユーザに許可されていないからですが、面倒なので pi ユーザも許可するように変えます。/dev/i2c* は i2c グループが所有者になっているのでi2c グループに pi ユーザを追加します。そのうち必要になりそうなのも追加しとく。
sudo usermod -G i2c,spi,gpio,dialout pi
いっかい exit でログインしなおさないと反映されないっぽいです。
でもって MPL115A2 の仕様書通りに値を読みだして計算します。今回は Ruby で書いてみました。
#!/usr/bin/env ruby | |
# coding: utf-8 | |
class I2CDevice | |
# ioctl command | |
# Ref. https://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/include/linux/i2c.h | |
I2C_RETRIES = 0x0701 | |
I2C_TIMEOUT = 0x0702 | |
I2C_SLAVE = 0x0703 | |
I2C_SLAVE_FORCE = 0x0706 | |
I2C_TENBIT = 0x0704 | |
I2C_FUNCS = 0x0705 | |
I2C_RDWR = 0x0707 | |
I2C_SMBUS = 0x0720 | |
I2C_UDELAY = 0x0705 | |
I2C_MDELAY = 0x0706 | |
attr_accessor :address | |
def initialize(address) | |
@address = address | |
end | |
def i2cget(address, length=1) | |
i2c = File.open("/dev/i2c-1", "r+") | |
i2c.ioctl(I2C_SLAVE, @address) | |
i2c.write(address.chr) | |
ret = i2c.read(length) | |
i2c.close | |
ret | |
end | |
def i2cset(*data) | |
i2c = File.open("/dev/i2c-1", "r+") | |
i2c.ioctl(I2C_SLAVE, @address) | |
i2c.write(data.pack("C*")) | |
i2c.close | |
end | |
end | |
class ACM1602NI < I2CDevice | |
MAP = Hash[ | |
[ | |
"。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚".split(//).map {|c| | |
c.force_encoding(Encoding::BINARY) | |
}, | |
(0xa1..0xdf).map {|c| | |
c.chr | |
} | |
].transpose | |
] | |
def initialize | |
super(0x50) | |
initialize_lcd | |
end | |
undef i2cget | |
def initialize_lcd | |
# function set | |
i2cset(0, 0b00111100) | |
sleep 53e-6 | |
# display on/off control | |
i2cset(0, 0b00001100) | |
sleep 53e-6 | |
clear | |
end | |
def clear | |
i2cset(0, 0b00000001) | |
sleep 2.16e-3 | |
end | |
def put_line(line, str) | |
str.force_encoding(Encoding::BINARY) | |
str.gsub!(/#{MAP.keys.join('|')}/, MAP) | |
str = "%- 16s" % str | |
# set ddram address | |
i2cset(0, 0b10000000 + (0x40 * line)) | |
sleep 53e-6 | |
i2cset(*str.unpack("C*").map {|i| [0x80, i] }.flatten) | |
sleep 53e-6 | |
end | |
# Usage: | |
# lcd.define_character(0, [ | |
# 0,1,1,1,0, | |
# 1,0,0,0,1, | |
# 1,1,0,1,1, | |
# 1,0,1,0,1, | |
# 1,1,0,1,1, | |
# 1,0,0,0,1, | |
# 1,0,0,0,1, | |
# 0,1,1,1,0, | |
# ]) | |
def define_character(n, array) | |
raise "n < 8" unless n < 8 | |
raise "array size must be 40 (5x8)" unless array.size == 40 | |
array = array.each_slice(5).map {|i| | |
i.inject {|r,i| (r << 1) + i } | |
} | |
i2cset(0, 0b01000000 + (8 * n)) | |
sleep 53e-6 | |
i2cset(*array.map {|i| [0x80, i] }.flatten) | |
sleep 53e-6 | |
end | |
end | |
class MPL115A2 < I2CDevice | |
def initialize | |
super(0x60) | |
coefficient = i2cget(0x04, 8).unpack("n*") | |
@a0 = fixed_point(coefficient[0], 12) | |
@b1 = fixed_point(coefficient[1], 2) | |
@b2 = fixed_point(coefficient[2], 1) | |
@c12 = fixed_point(coefficient[3], 0) / (1<<9) | |
p [@a0, @b1, @b2, @c12] | |
end | |
def fixed_point(fixed, int_bits) | |
msb = 15 | |
deno = (1<<(msb-int_bits)).to_f | |
if (fixed & (1<<15)).zero? | |
fixed / deno | |
else | |
-( ( (~fixed & 0xffff) + 1) / deno ) | |
end | |
end | |
def calculate_hPa | |
i2cset(0x12, 0x01) # CONVERT | |
sleep 0.003 | |
data = i2cget(0x00, 4).unpack("n*") | |
p_adc = (data[0]) >> 6 | |
t_adc = (data[1]) >> 6 | |
p_comp = @a0 + (@b1 + @c12 * t_adc) * p_adc + @b2 * t_adc | |
hPa = p_comp * ( (1150 - 500) / 1023.0) + 500; | |
end | |
end | |
mpl = MPL115A2.new | |
loop do | |
puts "%d hPa" % mpl.calculate_hPa | |
sleep 0.5 | |
end |
校正値が入っていてそれを考慮して計算しないといけないので多少面倒だけど、比較的すぐ書けました。
やった〜! 天気図を見た感じではだいたいあってる感じです。センサー自体の精度が ±1kPa なので、下1桁は信用できない値です。
SPDY とか新しいプロトコルがよくわからないので簡単にまとめた
HTTP 0.9
RFC (rfc:1945) は1996年 (HTTP 1.0と同じRFCで説明されてる)
最初の HTTP。GET メソッドしかなかった。レスポンスヘッダもない (ボディーだけ)。
HTTP 1.0
RFC (rfc:1945) は1996年
- メソッドに GET POST HEAD が追加された
- ヘッダが追加された
HTTP 1.1
RFC (rfc:2068 → rfc2616) は1997年
HTTP 1.0 に Keep Alive とかを追加したやつ。
- バーチャルホストに対応 (Host ヘッダが必須に)
- Keep Alive が可能
- 1つのTCPセッションで複数のファイルのやりとりができる
- リクエストパイプラインが可能
- リクエストを複数個レスポンスを待たずに送ることができる
- サーバ側で対応が必要なのであまり有効活用されてない
HTTPS
RFC (rfc:2817, rfc:2818) は2000年
HTTP 1.0 または 1.1 を TLS (暗号化層) にのっけたもの (暗号化通信)
(SSL は TLS の元になったプロトコルの名前)
WebSocket
RFC (rfc:6455) は2011年。HTTP を拡張したもの、と言っていいか微妙だけど、HTTP でセッションを初期化して 101 Switching Protocols で専用プロトコルに切り替わる関連技術的なもの。
- ブラウザでソケットのようにサーバと自由に送受信ができるようにするのが目的
- サーバプッシュが可能
- 普通 JS と一緒に使う
SPDY
Google が作ったプロトコル。現在は SPDY Protocol - Draft 3.1 が最新。
- レンテンシを低くするのが目的
- HTTPS のように TLS (暗号化層) にのっかってるので、常に暗号化通信
- HTTP は SPDY プロトコル上にのっかる感じに
- サーバープッシュが可能
- サーバーヒント
- 予め必要そうなファイルをサーバから送りつけることができる
HTTP 2.0
SPDY を元に提唱されてる新しい HTTP のバージョン。SPDY を HTTP 2.0 として標準化しよう、って感じかな。現状では SPDY と一緒。
QUIC
Google が作ってるあたらしいプロトコル。上記までのような HTTP の互換レイヤーの話ではなく、その下のレイヤーのプロトコル。
- レンテンシを低くするのが目的
- TCP の代替
技術の発展とともに TCP がネックになることが増えてきたので、UDP を使って TCP+TLS レイヤーを実装しなおすという感じ。
わからないところ
未来における WebSocket の立ち位置がよくわからない。HTTP 2.0 になったとして (SPDY 実装はすすんでいるし、たぶんなるだろう)、WebSocket はどうなるだろう。HTTP 2.0 上で WebSocket を使うのか、あるいは HTTP 2.0 のセッションを JS からコントロールできるような API が整備されるのか。
Linux 上の LL で I2C する (Ruby)
なんとなく i2c-dev.h とかで定義されているAPIを呼ばないと使えないのかなあと思っていたけど、デバイスファイルの読み書きと ioctl だけで普通に使うことができた。
書きこみ
- /dev/i2c-1 とかを rw+ で open
- ioctl で I2C_SLAVE コマンドを使ってスレーブアドレスを指定する
- write する
I2C 的には START -> SLAVE + W -> DATA送信 -> STOP が行われる。
読みこみ
- /dev/i2c-1 とかを rw+ で open
- ioctl で I2C_SLAVE コマンドを使ってスレーブアドレスを指定する
- 読みこみたいアドレスを write する
- read す
I2C 的には START -> SLAVE + W -> DATA送信 -> ReSTART -> SLAVE + R -> DATA受信 -> STOP が行われる。
たぶん一度 write/read するたびに Repeated Start が送られるのかな。
Ruby での例
Ruby でやる場合以下のような感じでいけた。デバイスによってはうまくいかないかもしれない。
class I2CDevice
# ioctl command
# Ref. https://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/include/linux/i2c.h
I2C_SLAVE = 0x0703
attr_accessor :address
def initialize(address)
@address = address
end
def i2cget(address)
i2c = File.open("/dev/i2c-1", "r+")
i2c.ioctl(I2C_SLAVE, @address)
i2c.write(address.chr)
ret = i2c.read(1).ord
i2c.close
ret
end
def i2cset(*data)
i2c = File.open("/dev/i2c-1", "r+")
i2c.ioctl(I2C_SLAVE, @address)
i2c.write(data.pack("C*"))
i2c.close
end
end
Raspberry Pi の GPIO でシリアル通信
GPIO に UART があるけど、デフォルトではシリアルコンソールとして使うことが想定されていて、カーネルメッセージとかが流れる。これを無効にして、普通のシリアルポートとして使う。
/etc/inittab を書きかえる。ttyAMA0 の行をコメントアウトする
#Spawn a getty on Raspberry Pi serial line T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
/boot/cmdline.txt を書きかえる。デフォルトだと以下のようになっているので
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
- console=ttyAMA0,115200 を削除 (シリアルコンソールのオプション)
- kgdboc=ttyAMA0,115200 を削除 (カーネルデバッグ用のオプション ref. kgdboc
して以下のように
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
で reboot すると普通にユーザレベルで自由に使えるようになる。
3.3V なので、RS-232C レベルにするなら 3.3V でも使えるドライバICを使う必要がある。ICL3232 だと100円ぐらい。
回路
FET らへんは GPIO 25 (22pin) をオンにしているときだけスイッチを入れるための仕組みなので RS-232C のためには必須ではない (GND を普通に繋ぐだけ)