✖
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 に設定したらよい。
Mac で SD カードの速度を測定
買ったSDカードあるいは持っているSDカードの速度がどんなものか測りたいとき、Mac だといまいち良いツールがなかったけど、いつのまにか良さそうなのがでてた。
ただ、SDカードの領域を埋めつくすまで書きこもうとするのでかなり時間がかかるのがイマイチな感じ。意図としてはカード全体がちゃんと動いてるかどうかをチェックという感じだと思う。実際、途中から速度が大幅に変わったりする。
以下のスクリーンショットは手元にあった microSD カード (カード上の表記は Class10) を測定中のもの。最初は 6MB/s だったけど、途中から 11MB/s ぐらいになった。Class10 は綺麗な状態での書き込み10MB/sを保証するので、仕様には適合している。
✖
✖
✖
✖
✖
数学ができない人間に特に便利な、方程式を自動で解くツール (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インチディスプレイ
Dell ディスプレイ モニター UP2414Q 23.8インチ/4K/IPS非光沢/8ms/DPx2,HDMI/AdobeRGB 99%/USBハブ cho45
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
✖
今年買ってあまり良くなかったものまとめ
慎重に買ってるつもりだから、あんまり思いつかないんだけど
ブドウ糖
大丸本舗 ぶどう糖 ボトル入 135g cho45
頭良くなるかな〜 と思ったけど (この発想が頭悪い)、まぁ砂糖だね… って感じだった
電工ペンチ
フジ矢 電工ペンチ FA003 cho45
ワイヤストリッパーは便利だけど、圧着端子は別の工具が必要だな、思った。結構つらい。
頭洗うやつ
悪くはないんだけど、ちょっと面倒でたまにしかやらなくなった。でもたまに使うと気持ちいい。充電が地味に面倒なので、非接触充電になったらなあ。
モンキーレンチ
専用サイズのレンチのほうが100倍ぐらい使い勝手が良い。あると便利だけど、あくまで非常用だなあという感じ。100均でもそこそこの種類のレンチは買える。
6口スイッチつき電源タップ
エレコム 電源タップ color style 雷ガード 省エネ 個別スイッチ 6個口 2m ブラウン T-BR04-2620BR cho45
スイッチついててもあんまり使わないので口数が多いほうがうれしい…… 一応プリンタの待機電力が非常に多いのでできるだけ切るようにしてるけど、なんともいえない。
Qi 用のエネループ充電器
Qi (無接触電源) で単3エネループを充電するやつ。Qi は電力供給能力が低いので充電速度が遅いし、結局普通ので充電していて使ってない。
舌ブラシ
舌は確かに綺麗になるけど、最近使ってない。商品は悪くないと思う。
結論:よくなかったものまとめてもテンションあがりませんね。
✖
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 しか見られないし就職には殆ど意味を感じられない。
勉強すること自体には意味があるけど、過程だけに意味があってもやる気沸いてこない。なんか「これは!!」っていうメリットはないんだろうか。
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 のエイリアスになっている)
ヘッダファイルの冒頭部分の一部を訳してみた。
\note If possible, put your constant tables in the lower 64 KB and use
pgm_read_byte_near() or pgm_read_word_near() instead of
pgm_read_byte_far() or pgm_read_word_far() since it is more efficient that
way, and you can still use the upper 64K for executable code.
All functions that are suffixed with a \c _P \e require their
arguments to be in the lower 64 KB of the flash ROM, as they do
not use ELPM instructions. This is normally not a big concern as
the linker setup arranges any program space constants declared
using the macros from this header file so they are placed right after
the interrupt vectors, and in front of any executable code. However,
it can become a problem if there are too many of these constants, or
for bootloaders on devices with more than 64 KB of ROM.
All these functions will not work in that situation.
可能なら、定数テーブルは 64KB 以下に配置し、pgm_read_byte_far() や pgm_read_word_far() の代わりに pgm_read_byte_near() や pgm_read_word_near() を使ったほうが効率が良いし、なおかつ 64KB 以上は実行コードに使える。
プリフィックスに _P がついている全ての関数はELPM 命令を使わず、フラッシュROMの64KB 以下を引数にとる。これは大抵の場合、このヘッダファイルのマクロを使って定義されたプログラムスペース定数はリンカーが割込みベクターのすぐ後に配置するので、気にすることはない。
しかしながら、もしこのような定数が多すぎる場合や、デバイス上のブートローダーが 64KB 以上の場合問題をひきおこすかもしれない。これらの関数はこのような状況では一切動かないだろう。
電子部品の整理
抵抗器とかコンデンサとかをうまく整理する方法を考えてる。とにかく種類が多いし、そこそこ体積があったりするので面倒くさい。
値わけして袋詰めするまではいいとして、袋がばらばらにあっても、ソートされていないと見つけることができないのでゴミと変わりがない。
抵抗
抵抗はそんなに大きくないので (100本ぐらいだと結構…) 100均のハガキ用バインダーにだいたい納まった。E24 系全部持ってたりすると2冊ないとダメそう。
コンデンサ
電界コンデンサだと特にだけど、そこそこ体積があるので、バインダーみたいのに入れこむのはつらい。こちらは普通に横長のプラスチックケースにソートして入れるみたいにしてみた。
本当は仕切りが可変できるパーツボックスがあればいいんだけど、結構高いのしかないので、これで我慢する。
半導体
半導体が一番悩ましい。ソートしようがないので、できるだけ 一覧性が高い形で保存したいけど、いい方法が思いついてない。
基本は用途別にわけていくのがよさそう。
- ダイオード
- 整流用
- 小信号用
- ツェナー
- LED
- 形別にわける
- トランジスタ
- 耐圧ごと? になんとなくソート?
- フォトカプラも
- FET
- 耐圧ごと? になんとなくソート?
- センサー系
- ロジックIC
- オーディオ関係IC
- マイコンチップ




















