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 以上の場合問題をひきおこすかもしれない。これらの関数はこのような状況では一切動かないだろう。

  1. トップ
  2. avr
  3. AVR progmem に long を置く方法
  1. トップ
  2. arduino
  3. AVR progmem に long を置く方法

抵抗器とかコンデンサとかをうまく整理する方法を考えてる。とにかく種類が多いし、そこそこ体積があったりするので面倒くさい。

値わけして袋詰めするまではいいとして、袋がばらばらにあっても、ソートされていないと見つけることができないのでゴミと変わりがない。

抵抗

抵抗はそんなに大きくないので (100本ぐらいだと結構…) 100均のハガキ用バインダーにだいたい納まった。E24 系全部持ってたりすると2冊ないとダメそう。

コンデンサ

電界コンデンサだと特にだけど、そこそこ体積があるので、バインダーみたいのに入れこむのはつらい。こちらは普通に横長のプラスチックケースにソートして入れるみたいにしてみた。

本当は仕切りが可変できるパーツボックスがあればいいんだけど、結構高いのしかないので、これで我慢する。

半導体

半導体が一番悩ましい。ソートしようがないので、できるだけ 一覧性が高い形で保存したいけど、いい方法が思いついてない。

基本は用途別にわけていくのがよさそう。

  • ダイオード
    • 整流用
    • 小信号用
    • ツェナー
  • LED
    • 形別にわける
  • トランジスタ
    • 耐圧ごと? になんとなくソート?
    • フォトカプラも
  • FET
    • 耐圧ごと? になんとなくソート?
  • センサー系
  • ロジックIC
  • オーディオ関係IC
  • マイコンチップ

ドラム式洗濯・乾燥機

NA-VX7200L-N パナソニック ドラム式洗濯乾燥機 -

5.0 / 5.0

買ってから半年ぐらい経ったけど不満なし。常に乾燥まで一気にやっていて、一切外に干していない。

食洗機

パナソニック 食器洗い乾燥機 NP-TR6-W ホワイト -

5.0 / 5.0

これも買ってから半年ぐらい経ったけど一切不満がないし、これなしではもはや生きていけない。

手で洗うよりも確実に綺麗になるので安心感がある。無理してでも設置する価値が絶対にある。

食洗機用小物カゴ(丸型) TD10 -

5.0 / 5.0

小物洗うには別途カゴも必要。これは厚さを2段階に調節できて便利。ステンレスだから清潔な感じがするし良い。

ルンバ

iRobot Roomba 自動掃除機 ルンバ 770 -

4.0 / 5.0

これも買ってから半年ほどだけど満足度が高い。普段の掃除の殆どを自動化できる。

これに限らないけど、ここまで書いた「家事自動化」は確実に生活が向上する。特に、1つ自動化できればその間に他のことをすることができる。

シャトルシェフ

サーモス 真空保温調理器 シャトルシェフ 2.8L アプリコット KBF-3000 APR -

5.0 / 5.0

これは自分では買っていなくて、結婚祝いにもらったんだけど、同じように便利。

煮ている間、火を使わないのでつきっきりでいる必要がなくなる。家事自動化と同じような効果があって、他のことに時間を使うことができるようになる。洗濯機まわしつつ、食洗機まわしつつ、ルンバを起動して、シャトルシェフでカレーを作りながら風呂に入ったりとかできるようになる。神か。

髪の毛くるくるぽい

【お風呂グッズ】 髪の毛くるくるポイ (Cタイプ) ユニットバス用 (x1個) -

3.0 / 5.0

掃除しやすくなっていい。あと見てると渦ができて楽しい。ただ、設置方法的に、くるくるぽいに髪の毛が挟まっていることがあって、これがうまく解決したらいいなあと思う。

万年筆

パイロット 万年筆 カクノ FKA-1SR-LGM 中字 ライトグリーン -

5.0 / 5.0

kakuno のコストパフォーマンスが非常に高い。書くのが楽しくなる。勉強とかテンションあがらないけど、多少テンションをあげることができて良い。

パイロット 万年筆インキ iroshizuku INK-50-TY ツキヨ -

5.0 / 5.0

 -

4.0 / 5.0

これらも買うとさらにテンションをあげることができる。インクを早く使いきるぞ!っていうモチベーションが生まれるのでかなり良い。

スピードサラダ

スピードサラダ 19639 -

5.0 / 5.0

切れるピーラーを使うべき。千切り機能が思いのほか便利だった。

ロールシャープナー

京セラ セラミック ロールシャープナー ファインプレミアシリーズ RS-20-FP -

3.0 / 5.0

包丁研ぐの面倒だけど、これだとすぐ研げるので良い。切れない包丁はかえって危険なのでこまめに研げるのがいい。

10口OAタップ

iBUFFALO OAタップ 2ピン 10個口 雷サージ/集中スイッチ付 1.5m ホワイト BSTA2XS15WH -

5.0 / 5.0

10口ある OA タップはなかなかない。四角でデザインもわるくない。横と縦につけれるので、幅が大きいACアダプタが多い場合も有効に使いやすい。

ACアダプタ繋げるタップ

ELECOM 電源ケーブル ACアダプタを4個つなげる ホワイト T-AD4WH -

4.0 / 5.0

AC アダプタばっかり繋げる場合、こういうのがあったほうが便利。

テービルタップボックス、モール

イノマタ化学 テーブルタップボックス ブラウン Lサイズ -

5.0 / 5.0

ELECOM LD-GAF3/BR フラットモール(ブラウン) -

5.0 / 5.0

テーブルタップボックス、モールは「見た目」の観点から語られることが多いけど、ルンバを使う場合、ケーブルを床に這わせると悲しいことになるので、これらが必須。もちろん見た目もかなり良くなるので大変良かった。一旦設置したら動かすことも殆どないので、面倒くさがらず一回やったらよい。

ドリルドライバ

リョービ(RYOBI) ドライバードリル CDD-1020 645801A -

3.0 / 5.0

ドリルとしても使えるし、ドライバとしても使える。クラッチがついてるので一定の締め付け度になると空転してくれる。普通に使ってる。

踏み台 セノビー

折りたたみ踏み台 39cm セノ・ビーのっぽ君 ブラック 10052 -

5.0 / 5.0

うちが狭いので、あまり踏み台とか買っても置き場がないんだけど、これだと折り畳めるので便利。普通に使いまくってる。

ワットモニター

サンワサプライ ワットモニター5種類測定可能 検電器 TAP-TST8 -

5.0 / 5.0

消費電力の可視化は重要。まずは測定。間違った思い込みで節電しても効果は薄い。