老眼鏡(2,980円)の蝶番のネジがいつのまにか外れ、テンプル(柄)がとれてしまった。「買い換え」かなと諦めていたが、蝶番以外の部品は問題ないので、蝶番に使えるネジがないかと探したところ、M1.4のネジが使えることが判り、DIYショップでネジセットを入手(SUS、複数の長さサイズ入りで300円程度)。
適当な長さのネジを蝶番としてはめてみると、ピッタリ治まり、ダブル・ナットで固定。さらに、ナットの緩み止めに瞬間接着剤で補強し、修理が完了。
今回はSUSのネジを使ったが、百均の眼鏡を買って、分解し、パーツとすれば、もっと安くできそう。
。
ソースネクストで「COBポータブル投光器(2個セット)」を3,280円(23%引き)で購入した。小型の手持ちライトは持っていないわけではないが、いずれも電池式で、充電式ではない(充電式も持っていたのだが充電できなくなった)。ソーラー充電も出来るので災害時でも使えそう。
ポータブル投光器は、@USB充電、Aソーラーパネル(充電)付き、B据え置き/吊り下げ、C内側・外側の2つの点灯パターン(同時点灯は不可)で、COBは広範囲にムラ無く照明できるのが特徴。
XC8コンパイラで、数値を文字列に変換する(s)printf関数を使うことが多いが、(s)printf関数はメモリを多く使うことで有名である。例えば、前報(abc890)のスレーブプログラムで、(ROM/RAM)
すなわち、ROMで1,475バイト、RAMで120バイトが、(s)printf文を使うことで増えている。
また、C90コンパイラでは、itoa()などの文字列変換関数が使えたが、C99ではサポートされていない。
そこで、(s)printf関数を使いたくない場合、以下の2つの方法がある
1.C90コンパイラを使う方法
C90コンパイラを使うには、Projectを右クリックし、propertiesを選び、XC8 Global OptionのC standerdをC90に設定し、itoa関数などを使う。
なお、C99で強化された主なものは、
C99はハードウェア毎に異なる部分をなるべく少なくするため(intのビット幅指定)と、セキュリティの強化が図られた。PICでは、C99の浮動小数点は32ビットと固定だがC90では24ビットも選択でき、C99で(バッファーオーバーランエラーを防止するため)使えなくなったいくつかのライブラリ関数(itoa,ltoa,utoaなど)も利用可能となる(printf関数は残されたが)。8ビットPICでは、主に8ビットデータを使うことが多く、搭載メモリも少ないので、C90がよく用いられている。
※参 考:後閑哲也(技術評論社)など
2.自作文字列変換関数を使う方法
C99のまま、printf関数に置き換わる文字列変換関数(負号無し16ビット)を独自に作成。
前報(abc890)のキーユニットで、PIC16F18325でコンパイルしてみると、独自関数使用例ではプログラムが2Kバイト未満となったので、PIC16F18323(ROM:2kbyte)に置き換えが可能となった
PIC16F18325でprintfを使用した場合 |
PIC16F18325で独自関数を使用した場合 |
PIC16F18323で独自関数を使用した場合 |
|
|
※16進数文字列変換関数はslaveプログラムを参照 | 10進数値文字列変換の例(今回未使用) |
今回試作したものは、前報(abc890)で製作した物はそのまま残し、全ての回路を新たに作成した。回路および配線はabc890と同じだが、プッシュキーには「ボタン付きタクトスイッチ」(秋月電子、103654、@100円×12個)を使用し、自作した電話機配列の数値シール(A-one_26101)をトップに貼り付けた。
PIC16F18323を利用した4x3キーユニットで、キー入力と通信テストを行ったところ、LCD画面およびパソコンのテラターム画面に、入力データが正常に表示されることを確認できた。
なお、キーユニットからUSB送信時に、16進数変換を利用しているが、printf文の4桁16進文字出力とほぼ同じ機能を持つprintx16()関数を作成し、printf文は(コメントとして)使用していない。
また、キーデータkeyPは 1〜12 から 0〜11 に変更した(bitCount関数でfor文の条件を変更)
I2C接続キーユニット(PIC16F18323)接続例 (ボタン付きスイッチにシールを貼り付け) (各ユニットはabc890と同じものを再度作成) |
USB接続テラターム(windows10)画面例 (画面上:キーユニットUSB接続時例) (画面下:Base14からUSB接続時例) |
|
※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。