✖
✖
マイコンプログラミングとか、黙って Arduino やっとけハゲという感じではあるんだけど、Arduino の言語がどうも好きになれなくて使ってない。CっぽいけどCじゃない、でもC、みたいなのがなんとなく嫌だなと感じてる。それは置いておいても Arduino は素晴しいと思います。
Arduino も AVR を使っているし、結局 Arduino 頑張ろうとすると AVR のスペックを理解する必要があるので、じゃあ AVR でいいか、という感じになる (安いし)。
Arduino は、開発環境も含めたエコシステムが魅力で、そこがすごくいいと思うけど、自分みたいに CUI で vim で書いて Makefile でコンパイルして書きこんで gdb でデバッグするみたいのが好きな人間だと、少し魅力が薄れてしまうように思う。
IDE はあればあるで便利で良いんだけど、Makefile と gdb を使ってやっていれば、マイコンプログラミング以外のときにもその知識が生かせて嬉しいと思う (IDEの操作の知識はほかに生かせない)
✖
トトト・トトトト・トトトトト
S (トトト) H (トトトト) 5 (トトトトト) の区別がつくように全然ならない。20wpm 程度でも結構間違える。全部とれない場合、ミスのほとんどがこれ。25wpm になると、1分間やっている中の 5 を全部 H、H を S と書く、あるいは逆、みたいにズレて聞きとったりする。クソすぎてイライラする。
S H 5 だけランダムで聞きとろうとすると、今度は全部聞きとれない。ランダムではなく SHE, HIS とかはパターンで覚えてるからある程度聞きとれるけど、ランダムだと全く意味わかんない。なので、比較して聞きとれるようにするということもできない。というか単体ならまず間違えないんだよ……
E (ト) と I (トト) と S (トトト) の区別は容易にできるけど、それ以上の短点は「いっぱい」としか認識されない。「ちょっと長いから5だろう」「5ほどじゃないからHかな」ぐらいの曖昧な感じ。本当にイライラする。
もう初めて3ヶ月ほど経つのにこのありさまなのでやる気なくす。あまりにもこれらを間違えるので 26wpm から 20wpm 程度までスピードを落としてゆっくりやってる。多少マシになったかもしれないけど。あいかわらず間違える。聞きとれない文字がいくつかあると、それらで考えてしまって止まるので、速度があげられない。一度聞きとれないと、その単語は完全に落とすので、そういう文字があってはならない。
次に J と 1 も、S H 5 ほどではないけど区別がつかない。こっちはコールサインの文脈でよく使うので比較的頭に長さのイメージができているけど、それでも間違える。どうすれば解決するのか全くわからない。3ヶ月やってダメなら一生ダメなんじゃないか。
以上の符号以外にも、2、3、7、Z、X はそれ以外に比べてよく間違える。
AVR 浮動小数点 (float) 演算
浮動小数点演算を使ったとき、-lm を付けないとバイナリサイズが巨大化する問題がある。-lm をつけない場合、デフォルトの (libgccの?) 浮動小数点関数がリンクされるけど、avr 用には高効率なものが libm に実装されている。libgcc だと 3k -> libm だと 1k ぐらいのインパクトがあるので必ず libm を使うようにしたい。
とはいえ、ちゃんと理解してないと libm にリンクされない……
結論からいうと以下じゃないとだめだった。
$(COMPILE) -o main.elf $(OBJECTS) -lm
以下のようだとうまくいかない。
$(COMPILE) -lm -o main.elf $(OBJECTS) $(COMPILE) -o main.elf -lm $(OBJECTS)
というのも、リンカは、引数を順番に読みこんで、読み込み中のファイルに今までで未定義のシンボルがあったとき、それを解決する、という挙動をするらしい (なんとなく逆に、先に定義して解決していくもんだと思ってた)。
なので、先に -lm を指定しても、その時点では未定義のシンボルが何もないので何の意味もない。
gcc のオプションに -v (verbose) を渡すと、最終的に ld (collect2) に渡される引数がわかる。
うまくいく場合は main.o -lm -lgcc -lc -lgcc というふうになってる。main.o で使ってるシンボルが -lm で解決されて、あとまだ足りないのは -lgcc とかで解決される。-lgcc が2回出てくるのは、-lc が -lgcc を使ってるからかな。よくわかんない。
このエントリを参照するエントリ
AVR、なぜかリセットされまくるとき
割込みかけるように設定しているにも関わらず、それに対する処理を書いていないと、sei() を呼んだあと、割込みが発生するときに落ちてリセットがかかる。
sei() が呼ばれるまでは問題ないので、コメントアウトでデバッグしていると超ハマる。
このエントリを参照するエントリ
AVR シリアルでPCと接続してデバッグ
USB-シリアルポートアダプタ (RS-232C) は前に買っていたけど、RS-232C は正負 -12~+12 で1/0を表現うるので、マイコンのロジックレベル(0 or VCC)とは違っていて、そのままではマイコンと接続できない。
調べてみると、RS232トランシーバー (ドライバ) ICというのがあって、それを使えば簡単にレベル変換できることがわかった。有名なのは MAX232 というやつみたいだけど、ほぼ同じインターフェイス(ピンアサイン)でビットレートや電源電圧が違うやつがいろいろとあるみたいだ。
今回は ICL3232CPZ という 3.3V〜5V で動いて、なおかつ外付け部品が 0.1uF 5個だけというのを選んで作った。
繋いで以下のような、ボーレート 19200 で吐き出すコードを書いてみた (チップは ATTiny2313、レジスタ名がチップによって違うので、チップ変えるとそのままでは動かない)
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#define clear_bit(v, bit) v &= ~(1 << bit)
#define set_bit(v, bit) v |= (1 << bit)
static inline void uart_putchar(char c) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
}
static inline void uart_puts(char* string) {
unsigned int len = strlen(string);
unsigned int i;
for (i = 0; i < len; i++) {
uart_putchar(string[i]);
}
uart_putchar('\r');
uart_putchar('\n');
}
void usart_init(unsigned short baudrate) {
unsigned int d = ((F_CPU + (baudrate * 8L)) / (baudrate * 16L) - 1);
UBRRL = d;
UBRRH = d >> 8;
UCSRB =
(1<<RXCIE) | // RX Complete Interrupt Enable
(1<<TXCIE) | // TX Complete Interrupt Enable
(0<<UDRIE) | // USART Data Register Empty Interrupt Enable
(1<<RXEN) | // Receiver Enable
(1<<TXEN) | // Transmitter Enable
(0<<UCSZ2) | // Character Size
(0<<RXB8) | // Receive Data Bit 8
(0<<TXB8) ; // Transmit Data Bit 8
UCSRC =
(0<<UMSEL) | // USART Mode Select: 0=Asynchronous Operation, 1=Synchronous Operation
(0<<UPM1)|(0<<UPM0) | // Parity Mode
(0<<USBS) | // Stop Bit Select
(1<<UCSZ1)|(1<<UCSZ0) | // Character Size (with UCSRB)
(0<<UCPOL) ; // Clock Polarity
}
static inline void setup_io () {
usart_init(19200);
}
int main(void) {
setup_io();
for (;;) {
uart_puts("Hello, World");
_delay_ms(1000);
}
}
PC 側では、この USB シリアルポートアダプタの場合、/dev/tty.usbserial-FTB3L9UG というようなファイルができるので、これを指定して GNU screen の window を1つ作ってる。変なことしてないのでボーレートを指定するだけでいける。
screen /dev/tty.usbserial-FTB3L9UG 19200
これで RX/TX があるチップならかなりデバッグが捗りそう。
このエントリを参照するエントリ
ATTiny13A
いろいろパーツを注文するついでに ATTiny13A というチップも買ってみた。
見ての通り8ピンしかないチップだけど、以下のような特徴がある
- 1個50円と激安。
- ADC がついてる
- プログラムに使えるのは1KBしかない
- SRAM が 64B だけある (のでCで書ける)
- 外付け水晶を使うのは面倒 (使わないつもりで書いたほうが良い)
- ISPを殺せば最大6ピンIOに使えるけど、基本5ピンしかIOに使えないと考えたほうがいい
かなり制約があって楽しい。サイズ的に浮動小数点は使えないので工夫する必要がある。メモリ(SRAM)も64Bしかないのでついうっかりするとオーバーしそう。でもCで開発できるのでいいバランス。
とりあえずエレキー作るのがいいかと思って作ってみた。
まとめを後日書きました ボタン電池で動く小型・低消費電力 AVR エレキー (50円 ワンチップマイコン ATTiny13A) | tech | avr | arduino - 氾濫原
ただ、ピン数が少ないせいで大きな問題がある。というのも、必然的に ISP で使うピンとアプリケーションのピンを共有することになるので、回路によっては、繋いだままの ISP というのができないっぽい。「SCK fail」とか「MOSI fail」とか出て意味不明だったけど、このせいみたいだ。うまくやらないと In-System Programming という感じでなくなる。なんか簡単ないい方法ないのかな。
ADC の端子がいくつかあるので、スイッチをたくさん繋いでいくというのは割とできそう。ただ出力はそうもいかない。ソフトウェアに使えるメモリ量も少ないので「ハードにないからソフトで実現」というのも難しいことが多そう。
それにしても「50円で買えるコンピュータ」というのはグっとくる。
このエントリを参照するエントリ
Bose QuietComfort 15 のイヤーパッドを交換
使いはじめて2年ぐらい経ったところで、イヤーパッドの縫い目が割けてきしまったので、交換したくなった。とりあえず純正が高いので安いのを買ってみた。
Bose QuietComfort 15 対応交換用パッド◆QC15, QC2, AE2, AE2i 対応(univarcオリジナル) 安心安全保証付き U1355 cho45
さすがに本体とサイズが合わないということはなく、普通に使える感じ。ただ、純正と比べるとちょっと硬い。しばらく使ってみる。
Bose QuietComfort 15 Acoustic Noise Cancelling headphones ノイズキャンセリングヘッドホン QuietComfort15-S cho45
やっぱりほぼ毎日使っていると痛んでくる。どのぐらい長く使えるかな。もうこれ無しの生活とか考えられないんだけど
ピーラーは100均やIKEAのものを買ってはいけない。
IKEA で買ったピーラーの切れ味がよくなくて、うちで不評だったので以下を買った。知り合いの家にあって、便利だったので、検索してみたらすぐ見つかった。
スピードサラダ 19639 cho45
千切り機能とか使わねーだろと思ったけど、使ってみたら便利だった。刃物系はあんまり安いとよくないですね。
爪切りも少しだけ良いものを買ったほう確実に生活が向上していいです。
木屋 はがねの爪切り 大 BK-T02 cho45
↑ これほしい。
万年筆 PILOT カクノ (kakuno)
普段仕事でもなんでも殆ど、筆記用具を使わないので、筆記用具とかもはやどうでもいいやって感じだったけれど、最近になって筆記で勉強しはじめたので、捗る筆記用具について思いを馳せた。
最初は普通に今まで持っていたゴミみたいなシャープペンシルを使っていた。しかし、最近何かのアレで万年筆 (LAMYというメーカーのやつ) をもらったので、せっかくだからと使ってみたら、すごく書きやすかった。気に入った点は大したことではないんだけど、
- インクなのでシャープペンシルと比べて色が圧倒的に濃い
- 筆圧かけずにすらすら書ける
あたりで、それからはずっと万年筆を使って勉強してる。書くのが楽しいので、問題を解くモチベーションに繋る。
しかし、いただいた万年筆は線がちょっと太めな感じだったので、細いのが欲しくなった。と、いうタイミングで、ちょうどよくパイロットのカクノ という子供向け1000円の万年筆が発売されたので、買ってみた。(アマゾンにまだなかったので普通に文具店で買った。今はあるみたい)
買ったのは色はライトグリーンで、ペン先が F のもの。F のものが日本語筆記だとスタンダードっぽくて、ちょっと細めみたいだ。デザインはまぁ……悪くはないけどって感じだけど、使ってみた感じだと、先が細いぶんちょっとひっかかるかなというぐらいで十分良かったので、今はこっちをメインに使ってる。
と、いうのはいいんだけど、最初についてるインクが2週間経たないぐらいでなくなってしまって「えっ!」となった。実はインクがなくなるまで使えたら買おうと思っていたかっこいいインクがあったので、さっそく注文した。
↑ これ、どっかで見かけて、すごいかっこいいなー欲しいなーけど俺使わないなーと思っていたけど、案外インク使うことがわかったのでウキウキしながら買ってみた。
インクを入れるコンバーターというのも買った。(カクノには最初インクカートリッジがついてるけど、コンバーターも普通に使えるようだ)
一回ペンを洗ってから入れかえた。初めて入れかえをやったので結構楽しい。実際書いてみると色がすごく自分に好みだったので大変満足した。嬉しい買いものだった。色はかなりたくさんあって、悩んだけど、これ (月夜) にしてよかった。少しだけ緑が入っている夜空の青。
ペンを変えたら、ペンを使いたくなるので、勉強のモチベーションがちょっとあがる。簡単にモチベーションが上がるようなことは全部やったらいいと思うし、コストの割には結構いい感じに上がるので、たいへんいいなと思った。
しかし、もうすこしいいのも欲しくなるのが困る
カクノ以外は結構なお値段ですね!! カクノは使い捨てというわけではないし、コンバーターも使えるのでコストパフォーマンスは高そう。もうちょっとだけかっこいいのがあればなあ。