ジャンル不定の日記です。

ダイソーの樹脂粘土

ゲーム用に買った中古スマホの側面に欠けがあった件で、
そのままだと電源ボタンが外れそうな感じで、エポキシ接着剤とかレジンとか使うとボタンが動かなくなりそう・・・

というわけで考えてたが、
ダイソーで樹脂粘土買ってそれで埋めてみた。
くっつかないし量も多くていっぱい埋めれるんで良い感じ。
色も黒で、透明系よりは目立たない。

欠け補修にはこれが良い感じ。

Capacitance meter

壊れた液晶ディスプレイを直せないかと以前から何度か考えて、故障箇所わからなくて放置しているが、
Capacitance meterというコンデンサの容量を測定するテスターがあるのね。

というか、最近のテスターには普通についてるものが多いみたい。
なのだが、普通のマルチメーターだと200uFまでのが多いみたい。
専用のものだと20mFまでとか。

最初eBayで探して、一番安いのがA6013って型番ので1500円くらいだったが、
秋月電子でCM-7115Aってのが測定範囲同じで1270円だった。
送料入れると若干秋月の方が高いが安心感考えると国内だな。

100円ノギスを短く切った

いつもクリックポストの発送前に、セリアで買った100円ノギスで厚みに問題ないか確認しているのだが、
17cmまで目盛りがあって全長20cmを超えるので、ノリ・ハサミ・セロテープ等の入った梱包用道具入れに入らないのね。

Amazonで短いノギス売ってないか確認したが安いのでも500円くらいする。
100円ノギスを短く切っちゃえばよくね?他の用途でもノギスで10cm以上を測るとか考えにくいし。
ということに気づいたので、切断した。

伝導彫刻刀の配線した

この前eBayで買って、電池端子が付いてなかった電動の彫刻刀(ミニリューター?)放置してたけど、配線した。

当初は同時期に注文してたエナメル線が届いたらそれで配線しようかと思ってたが、
0.1mmのエナメル線は細すぎて手で切れちゃうくらいなので、要らないチューブ入りのリード線を切って使った。
マイナス端子はセリアで買ったステン針金(0.9mm)を巻いてバネにした。ステン針金巻くだけで良い反発力が得られる感じ。
導電性を考えると真鍮とかにしたいが、真鍮針金とかで反発力得られるのかな?


うまく導電したが、本来もマイナス端子がバネでリード線で繋ぐものなのかな?
別の出品の写真からバネの存在は確認できたのだが、電池入れとモーターが分離する構造なんで、引っ張るとリード線が切れちゃう構造だが・・・

試しに工作用に敷いてあるセリア木版に当ててみたが、穴開けられるほどのパワーは無さそうな・・・
プラとか削れればと思ったが、もっと厳しいような・・・

V-USBのテストした

eBayで注文してた12MHzのクリスタル届いたんで、V-USBのテストした。

V-USBの配布ファイル内にいくつかサンプルがあるが、
examples/custom-class
がlibusbを使ったドライバレスでLEDをON/OFFできるサンプルなんで、これを使った。

examples/custom-classを適当な場所にコピーして、
その下にusbdrvディレクトリを examples/custom-class/firmwareにコピー。
examples/custom-class/firmwareがAVRマイコンに書き込むプログラムで、Makefileの内容にしたがってmakeできる。

元の配布ファイルのディレクトリ構造に従ってusbdrvをコピーするようになっているが、手動でコピーしたので、
Makefile内の
usbdrv:
    cp -r ../../../usbdrv .

usbdrv:
#    cp -r ../../../usbdrv .
とコメントアウト。

usbdrvがV-USBの本体で、 usbconfig.hで設定して、main.cでAPIの様な感じで使える。
usbconfig.hではD+とD-にしようするピンを指定できるが、今回は変更の必要が無さそうだったのでそのまま。
初期状態でD-がPB4,D+がPB2になっている。
D+はINT0のピン限定なのでマイコンに合わせて固定となる。

Makefileで、使用するデバイス、周波数、ヒューズを設定するようになっている。
DEVICE  = atmega168
F_CPU   = 16000000    # in Hz
FUSE_L  = # see below for fuse values for particular devices
FUSE_H  =
AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer
となっているが、今回はATtiny2313で12MHzなので、
DEVICE  = attiny2313
F_CPU   = 12000000    # in Hz
FUSE_L  = 0xef# see below for fuse values for particular devices
FUSE_H  = 0xdb
AVRDUDE = avrdude -c usbasp -p $(DEVICE) -B 10 # edit this line for your programmer
に変更した。
AVRDUDEは、書き込みに使用する中華プログラマが速度低下させないとエラーになるんで-Bオプションを追加した。

制御するLEDのピンはmain.cで指定できるようになっているが、そのままにした。
初期状態でPB0となっていて、向きは出力になっている。


V-USBの配布ファイル内には、
ダイオード2本で電圧を下げるタイプ、
3端子レギュレータで電圧を下げるタイプ、
信号部のみツェナーダイオードで電圧を下げるタイプ、
の3つの回路図が入っているが、

今回は↑のダイオードで下げる回路を利用した。
V-USBサイト上に記載の回路図から使用マイコンがATtiny2313からATmega8に変更されており、
1MΩの抵抗、アナログ用?の電源とGNDが追加されてる。


まず、回路がダイオード2本で3.6V付近の電圧になるので、回路を繋いだ状態で書き込んで良いのか怪しいので、回路を作る前にファームウェアの書き込みを行った。
$ cd custom-class/firmware
$ make hex
$ sudo make program
make help でヘルプが見れるようだが、そもそもMakefile内を確認している。
make hex で書き込むための.hexファイルが作成され、
make programでflashとfuseが書き込まれる。udevをいじっていなければ要root。


実際に回路を作成したが、
ダイオードは1N4007を使用した。降下電圧は回路図記載の1N4148とほぼ同じと思う。
クリスタルは12MHzでコンデンサは22pfにした。
68Ωの抵抗はないので47Ωにした。
1.5kΩの抵抗はないので、1kと470を直列にした。
4.7ufのコンデンサはないので、この前回収した2.2ufの電解コンデンサを使った。
セラミックコンデンサを使うものと思ってたが、回路図に極性があるようだから電解コンデンサなのかな?
100nfのコンデンサはつけなかった。
PB0に300Ωの抵抗とLEDを繋いだ。

大きいブレッドボードを使うほどではないと思ったが、
ミニ・ブレッドボード1個で、ごちゃごちゃして厳しかったんでミニ・ブレッドボードを2個使った。


で、PCにつないだら、
$ lsusb
Bus 003 Device 018: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb
↑目的のものと思われるものが表示された。

commandlineディレクトリのほうがLED制御用の母艦側コマンドで、
$ make all
でコンパイルできる。

$ set-led on
$ set-led off
でPB0につないだLEDが点いたり消えたりする。



PCからコマンドでLEDの制御ができた。

クリスタルが4番ピンと5番ピンで、D+は6番ピンで固定なので、
小さいブレッドボードだとこの辺りがごちゃごちゃしちゃって難しかった。

libusbを使って何か制御する感じなら、main.cを変更するだけでいろいろできそう。
キーボードとかマウスみたいなPC用の一般的なデバイスも作ってみたいと思ってるので、次はキーボードかマウスの試作をしてみたい。

USBのプロトコル仕様書

AVRマイコンでPCとUSBで接続する機器なんかを作ろうと考えているが、
マウスやキーボードなんかはV-USBにサンプルコードがあるが、ジャンクカメラなんかの部品を使ってデジカメを自作できないかとかも考えているのだが、
ファイル転送が必要になるので調べていた。

USBメモリなどはUSBマスストレージという規格で実装されており、フォーマットなんかもできるようになっている。
USBマスストレージで実装されているデジカメというのもあるらしいのだが、
Picture Transfer Protocol(PTP)やMedia Transfer Protocol(MTP)などで実装されているものが主流の模様。
手元にある古いおもちゃデジカメはWindows用の専用ソフトがないと利用できないので汎用規格になっていない。

デバイス側でも記録領域が扱えるようにするため、フォーマットのできちゃうUSBマスストレージよりもPTPかMTPの方が適していると思ったが、
MTPはマイクロソフトがPTPを拡張して作ったものらしいので難しいと思って当初PTPを中心に調べていたのだが、
PTPはISO15740で国際標準規格となっているのだが、仕様書のPDFが有料しか発見できなかった・・・

PTPやMTPの実装が難しいならUSBマスストレージで実装で妥協かな・・・
とか考えながら調べていたが、
www.usb.orgの、
Developers > Documents > USB Device Class Specifications
にて、いろいろな規格書が無料配信されてた。
中には、MTPの仕様書もあった。(PTPは無い)

というわけで、興味のある規格のPDFは確保しておいた。
Mass Storageにはサブクラス?が複数あるが、USBメモリで一般的なのは"Mass Storage Bulk Only"らしい。
Media Transfer Protocol(MTP)のpdfももちろんダウンロードしたが、他にプリンター、キャプチャー、モニター、ぽいのも確保しておいた。
Communications Device Class(CDC)はUSARTとかそういうのかと思ったが、
"Ethernet"とか書いてあったりするんでUSB接続のLANアダプタとかの規格か?確保しといた。

V-USBの配布ファイルをダウンロードした

まだクリスタルが到着してないので実験できないが、
V-USBの配布ファイルをダウンロードしてちょっと中身覗いてみた。

V-USBの本体は中身のusbdrvってのの模様で、これをインクルードしてAPIみたいな感じで使うぽい。
usbdrvのコード読むのは自分にはちと難しい感じだった。
usbconfig.hを変更するだけでusbdrvの設定ができるぽい。

V-USBのサイト記載の回路図は12MHzのクリスタルを使ってマイコン電源は2連ダイオードで下げてたが、
配布ファイル内にも回路図が入っており、2連ダイオード以外に3端子レギュレータや3.6Vツェナーで信号だけ下げる回路も入ってた。
回路図のクリスタルは12MHzではなく16MHzになっており、12MHz,15MHz,16MHz,18Mhz,20MHzのいずれかか、12.8MHzか16.5MHzの内部クロックでもいいぽい。
とりあえずダイオード2個で全体を下げる回路で試してみようと思うが、5V機器と通信するような場合は3.6Vのツェナーの方が良いのかな。
ツェナーが3.3Vではなく3.6Vなのはダイオード式と統一するためかな?
68Ωの抵抗は電源電圧より低くするため?とりあえず68Ωは無いから50Ωで試してみるつもりだが・・・
あと、ダイオード式の回路にはD+のコネクタのところに1MΩの抵抗が追加されてGNDとつながってる。これはなんだろ?保護用?
使用するピンはusbconfig.hで設定できるが、D+はINT0に繋がないとダメぽい。
D-は変更可能で、20ピンのATTiny2313なら最大16ピン使えるのかな?
USBはVID/PIDのペアで識別してドライバが決まってしまうが、VIDを買うのはかなりの高額で無理だが、V-USBには共用で使えるIDがいくつか用意されてる。
必要ならV-USBのサイトでPIDだけを買うこともできるぽい。

V-USBのデバイス制御にはSPIかI2Cが良いかと思ってたが、V-USBのサンプルコードにlibusbを使ったコードがあった。
libusbはドライバ無しでVID/PIDを指定して通信ができるぽい。
libusbはPerlでも使えそうなんで、特殊デバイス用ならこの方法で良さそう。
ホストコマンドでLEDのON/OFFを切り替えるぽいサンプルがあるんで、とりあえずそれ試すかな。

サンプルコードにはUSBマウスのコードも入ってて、別ファイルにUSBキーボードのコードぽいのもあった。
USBメモリかMTPデバイスなんかもやってみたいと思うが、今のところコードが見つかってないんで、プロトコルがわかんないし難しいかも・・・

ダイオードの降下電圧を測ってみた

先日eBayで買ったダイオード(1N4007)が届いたが、
V-USBやUSBtinyを参考にAVRマイコンでUSB通信をするための電圧降下のためにこのダイオードを使おうと思うので、降下電圧を測ってみた。

ダイオード1本と300Ω抵抗を繋いで5V給電。
給電確認用にLEDつけたほうがいいと思ったので、ついでに緑LEDを繋いだ。

実際に測ってみたが、想定通りの値で、ダイオード両端で0.69Vから0.70V程度の電位差が生じていた。
ついでにLEDの両端も測ったが、1.99Vから2.00V程度だった。
電流は測っていないが、5V電源でダイオードとLEDで2.7V降下だとすると抵抗両端が2.3V。
5/2.3=0.00766
7.7mA程度の電流が流れていた模様。

さらにダイオードを2個にしてみたが、2つのダイオード両端で1.36V程度の電位差だった。
1個の時の2倍よりちょっと低くなっているので個体差かとも思ったが、1個づつにテスター当ててみたら両方共0.68Vだった。
電流が減ると降下電圧が減るからなのかな?

データシート確認したが、降下電圧が0.6Vの時は完全にグラフでは0Aになっていて、0.05A程度で0.7V付近に見える。
1Aでは0.9V程度で、10Aまで行くと1.8Vを超えるとこまでいってる。
しかし、このダイオードは定格1Aなので、0.6Vから0.9Vの範囲で考えておけばいいのかな?



目的のV-USBの回路はこうなってる。
今回の1N4007の降下電圧は一般的な値だと思うが、5Vが3.6V辺りに低下する感じかな?


USBtinyの回路は電圧降下用にはダイオードを使わずマイコン自体は5Vで、信号部分だけツェナーダイオードで3.6Vにしてる。
抵抗値はV-USBと同じなので、V-USBも2連ダイオードで3.6Vが想定電圧かな?

68Ωの抵抗は理解できてないのだが、USBの信号は3.3Vなので、AVRの内部抵抗と合わせて3.3Vに落とす用?
コネクタ側には抵抗はついてないし、やっぱ抵抗なしでも平気じゃね?って思うが・・・


トランジスタのカレントミラー

ニッケル水素電池の充電で定電流にする方法を考えて、
オペアンプというICとトランジスタを使った定電流回路というものが理解できた気がしたんでそれを使おうと考えていたのだが、
オペアンプを使った定電流回路では、トランジスタのGND側の電圧をオペアンプのプラス電圧より高くする必要があると判断して、難しいことに気がづいた。
というわけで、他の定電流回路について調べたのだが、トランジスタ2個を使ったカレントミラーというものが理解できたぽいし、部品もあるので実験してみた。


回路図(NPNトランジスタ用)

トランジスタが左右対称に2個ある。

↓左トランジスタ部分だけの回路図

トランジスタのCとBがショートしてる。
このようなトランジスタの接続方法を「ダイオード接続」というらしく、
BE間とCE間にどれだけ電流が流れるのかわかりにくいが、合流後(E)に流れる電流はCE間電流とBE間電流の合計であることはわかる。
そして、トランジスタを流れる電流の大半はCE間を流れてBE間は流れにくい。

なので、分岐していない箇所に抵抗を挟んでしまえばEの電流がおおよそ決定できる。(図を切ってあるが、右トランジスタのBに流れる電流分、Rの電流はEの電流より大きくなる)

ただし、抵抗の両端電位差は電源電圧からトランジスタのPN順方向降下電圧分だけ下がった値になる。
今回はNPN型トランジスタの2SC1815を使ったが、PN順方向降下は1V未満であると想定される。

電源電圧はUSBの5Vを使用し、LEDに流すために20mA以下程度にしたい。
トランジスタの電圧降下を考えなければ、5Vで20mAにするには抵抗値は250Ω。
トランジスタの電圧降下が1Vだとすると250Ω抵抗では16mAとなる。
今回は近い値の300Ω抵抗を使うことにしたが、大雑把に考えて13mAから16mA程度の電流になりそう。


右のLED側には抵抗が入っておらず、トランジスタのみで電流が制限されることになるが、
左右のトランジスタの性能が同じで正確にBE間電流を増幅した分がCE間に流れると期待すれば、
左トランジスタのエミッタ電流と、右トランジスタのエミッタ電流は等しいことになる。

両方のトランジスタのBE間に流れる電流は共に左のラインから流れるため、
分岐前のRに流れる電流と右のLEDに流れる電流はBE電流2個分の差が生じるが、
トランジスタに流れる電流の大半はCE間に流れるため、Rの電流とLEDの電流はかなり近くなる。(若干Rに流れる電流が大きくなる)


という仕組みらしい。

電流を測るために抵抗の箇所とLEDの箇所にジャンパピンを繋いでジャンパを外してテスターを当てれるようにした。
ジャンパピンを繋いだ状態で給電したら、想定通りLEDは点灯した。
テスターを当てるためにジャンパを外したら消灯した。

電流値は、抵抗側の電流が13.0mA程で、LED側が13.4mA程だった。
電流値は想定程度のものだったが、LED側の方が低いはずなのに逆になったw
たぶんジャンパピンの接触不良による抵抗値が原因だと思う。
トランジスタの個体差によって正確に定電流にはできないようなので、トランジスタの個体差による誤差かもしれない・・・


まあ、この方法でおおよそ定電流にできることが確認できた。
LEDの部分をニッケル水素電池逆接にして抵抗値を調節すれば、それだけで簡単な充電回路ができそう。

あと、最初AVRプログラマを使って5V給電したのだが、
右側のトランジスタを逆接しちゃって点くはずのLEDが光らなかった。
回路図的にトランジスタは左右対称だから左右対称にトランジスタ繋いじゃったんだが、電流の向きが共に上から下だからトランジスタは同じ向きで置かないとダメなんだねw
何も破損しなかったが、回路や配線のミスでAVRプログラマが壊れたら困るから回路への試験給電にAVRプログラマを使うのはやめたほうが良いねw

LinuxでAVR

ファームを更新した中華USBaspを使ってLinuxでAVRの書込みできました。
作ったのは、hello world的な簡単なコード。
母艦環境はArch Linux。

先日の記事に書いたが、
母艦にインストールしたのはavrdude,avr-gcc,avr-binutils,avr-libcの4パッケージで全部公式リポジトリにある。
avr-gccでC言語のコードをAVR用にコンパイルして、avr-binutilsに含まれるavr-objcopyコマンドでavrdudeで書き込めるihex形式のファイルに変換する。

今回のコード。
main.c
#include <avr/io.h>

int main(){
    DDRB=0b00000000;
    DDRD=0b01111111;
    while(1){
        PORTD=PINB;
    }
}
PC用プログラミングの"hello world"ではその名の通り"hello world"と文字を出力するのが一般的だが、
文字出力のできないマイコンの入門には出力確認としてLEDを光らせる。
AVR入門のコードではLEDを点滅させるコードが多いと思うのだが、入門用プログラムにはタイマーを使った"点滅"などさせずに"点灯"だけの方が良いんじゃないかと思う。
が、固定で電圧を出力するだけだとマイコンの処理結果で電圧が出てるのかわからないので、特定ピンの入力状態によって対応ピンに出力するコードにした。

#include <avr/io.h>
は、IOピン関連のライブラリをインクルード。

今回使ったAVRはDIPパッケージのATtiny2313で、

ピン配列はこのようになってる。
20ピンのうち、20番のVCCと10番のGNDはマイコン電圧用なので入出力には利用できない。
A,B,Dの3グループ(ピン数の多いマイコンではCグループもある)に分けられており、
PA0-2 = 3本
PB0-7 = 8本
PD0-6 = 7本
が入出力用に利用できる。
このうち、PA2,PB7,PB6,PB5の4本はマイコンへのファームウェア読み書き用に使わず空けておきたい。
PDは全部使えるので、PB0-6の入力がhighなら対応する番号のPD0-6の出力をhighにするプログラムにした。

今回のコードの、
DDRB=0b00000000;
DDRD=0b01111111;
は、ピンを入力用にするか出力用にするかの設定。
DDR[A,B,D]に値を設定するとピンを入力用にするか出力用にするかを切り替えられるが、
値を2進表記(0bから始まる数値)するとわかりやすい。
2進表記時の最下位ビットが各グループの0番ピン。
対応位置が0なら入力用で、1なら出力用になる。
PB0-7の8本は全部入力用にして、PDは0-6番の7本なので最上位を0にして桁合わせした。普通の10進数と同じで最上位が0なら無意味。

while(1){
    PORTD=PINB;
}
の部分は、
状態の変化に応じてLEDを切り替えるために無限ループにした。
PORTDはPDの出力で、PINBはPBの入力状態。
PDにPBの状態をそのまま代入したが、特定ピンを対象にコードを書きたいならDDR[A,B,D]と同じで2進表記するとわかりやすい。


で、回路の方。

PDグループのピンの出力を同じ番号のPBグループピンの入力状態に対応させるプログラムなわけだが、
マイコンのピン配列的にやりやすそうに見えた4番ピンだけを使うようにした。
まず、PD4にLEDを繋いで、電流制限のために300Ωの抵抗を入れた。
PD4に対応するPB4に電圧をかけるわけだが、PB4と電源との間にON/OFFできるスイッチとしてジャンパを入れた。
そして、PB4は大きい抵抗を挟んでGNDに繋いだ。
PB4をGNDに繋がない場合、スイッチONなら電源電圧がかかるので入力状態がhighだが、スイッチOFFで電源と断線している時にどことも繋がっていないので電位が不明。
スイッチOFF時に確実にlow(0V)にするためにPB4はGNDと繋ぐ。
PB4とGNDを直結してしまうとスイッチON時に電源からGNDにショートしてしまい大電流が流れてしまうので、スイッチとなるジャンパとGNDの間に大きい抵抗を入れる。
この時の抵抗がプルダウン抵抗という。


コードと回路が出来上がったわけだが、avr-gccでコンパイル。
$ avr-gcc -mmcu=attiny2313 -Os -c main.c
main.oが出力される。
-mmcuオプションでターゲットマイコンの種別を指定する。
-cオプションでコンパイルされる。
-Oオプションで最適化ができるのだが、-Osだとサイズが小さくなるように最適化される。
-Osつけた場合とつけなかった場合で、今回のコードだけでも.hexファイルに140byteと50byteくらいの違いが出る。

gccの出力したmain.oを、avr-objcopyコマンドでavrdudeで書き込めるihex形式に変換する。
$ avr-objcopy -I elf32-avr -O ihex main.o main.hex
-Iオプションで入力ファイル形式。
-Oオプションで出力ファイル形式。
オプションに続けて入力ファイルと出力ファイル名。
gccの出力したmain.oはelf32-avrという形式らしい。

avrdudeコマンドでマイコンのflash領域に書き込み。
$ sudo avrdude -c usbasp -p t2313 -U flash:w:main.hex -B 10
AVRプログラマはUSBasp化した中華のやつだが、-Bオプションをつけて速度を落とさないとエラーとなった。
-Bの値は大きい方が遅いぽい。


<実験>

OFF状態

回路図記載のPB4とPD4以外に、PA2,PB5,PB6,PB7に線が繋がってるが、USBaspと繋いだままなので。
VCC(5V)とGND(0V)もUSBaspと繋いだままで、そこからマイコンに給電。
赤いケーブルが1個抜けてるが、これがジャンパでスイッチOFF状態。


ジャンパをPB4につないだらPD4に繋いだLEDが光った!


というわけで実験成功。

こんなLED光らせるだけのプログラムでは全く実用性がないが、
USB接続のPC用デバイスを自作したり、PCから制御できる特殊デバイスを作る技術を得るために、
クリスタルが届いたらV-USB系の実験をやろうと思ってる。

あと、USBの通信は不要で実用的なものとして、USB電源でのニッケル水素充電と、
先日届いたステップアップDCコンバータでニッケル水素電源での5V(USB)出力の制作を考えてる。