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

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)出力の制作を考えてる。

ファーム書き換えできたぽい

昨日届いた中華製ニセUSBaspだが、またファーム更新試したら成功したぽい。
まだ書き込み確認してないが、少なくともファームの書き換えは成功してる。

まず、昨日はハンダでのショートに失敗した可能性があると思ってたので、
ジャンパホールに通せる針金を調達して試そうと思って近所のホームセンターで0.28mmの真鍮針金を買った。(ステンも0.28mmからだったので)
だが、昨日の失敗でホールがハンダで埋まっており、0.28mmの針金の熱では貫通できなかった・・・
というわけで、また結局ハンダでw


で、一度ハンダで固定できて、試しにAVRWRTで検出してみたらATmega88と認識した!
ここの神は外見同じものだが、ATmega8と言ってるが、自分のはAVRWRTの自動検出でATmega88。
どうも複数のタイプが存在するようで、ATmega8用のファームではダメぽい・・・
というわけなのだが、上記ページのコメント欄にATmega88版のファームがあった。

ATmega88のファームで書き込みをしようとしたのだが、
AVRWRTでflashの読み込みは出来るのだが書き込みが出来ない・・・
それで調べたり試行錯誤してるうちに、ジャンパした線が外れちゃったりして苦労したのだが、
AVRWRTの速度を標準の1Mhzから500kHzに変更したら書き込めた。
ヒューズビットは初期状態で0xDD 0xFFだったが、変更の必要なしと思うので変えなかった。
ロックビットとやらが設定されていたが、ファーム更新したら変わった。


ファーム更新してLinuxにつないでlsusbしたらデバイスが出てこなかったのだが、
抜き差ししてるうちにジャンパ線が外れちゃって、そしたら認識したwUSBaspはジャンパはずさないと認識しないぽい?
lsusbの結果に、
Bus 003 Device 003: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb
が出てた。
IDがUSBaspの物になってる。

書き込めるAVRをまだ繋いでavrdudeでの読み書き試してないが、
sudo avrdude -c usbasp
でIDのエラーはでないのを確認した。
後ほどATtiny2313つないで試してみる。

ATmega644pでUSBaspを作ろうと考えているのだが・・・

中華AVRプログラマがニセUSBaspだったんで、ATmega644pでUSBaspを作ろうと考えているのだが、情報まとめ。

USBaspを書き込む際にAVRのヒューズというのもプログラムと別に書き込む必要があるようなのだが、
USBasp標準のATmega8用で、
ヒューズ上位バイト: 0xC9=0b11001001
ヒューズ下位バイト: 0xEF=0b11101111
となっている。

ATmega8の初期値は、
ヒューズ上位バイト: 0b11011001
ヒューズ下位バイト: 0b11100001
となっているらしい。

データシートを見ると、
CKOPT: 1→0
CKSEL3-0: 0001→1111
に変えているぽい。

CKSEL3-0の値によってクロック元が変わるようで、
クロック種別CKSEL3-0
外部発振子1111-1010
外部発振子(低周波)1001
外部RC発振1000-0101
内蔵RC発振0100-0001
外部信号0000
とのこと。

CKOPTの意味はクロック種別により変わる。
元の設定は0001で内蔵RC発振の範囲だが、内蔵RCで1MHzの設定らしい。内蔵RCの場合はCKOPTは常に1。
1111は外部発振子の範囲だが、CKOPTとCKSEL3-1の組み合わせにより周波数範囲が変わり、CKOPTが0でCKSEL3-1が111の組み合わせは1.0MHzから上限なしの設定らしい。
外部発振子の際のCKSEL0は、SUT1,0との組み合わせで起動時間遅延設定となるらしい。


ATmega644で使おうとしているわけだが、ATmega644の初期値は、
ヒューズ上位バイト: 0b10011001
ヒューズ下位バイト: 0b01100010

CKOPTは無く、CKSEL3-0はATmega8と同じく下位バイトの下位4bit。
ATmega8と同じでCKSEL3-0の値でクロック元が決まるが、範囲がちょっと違う。
クロック種別CKSEL3-0
外部発振子(低電力)1111-1000
外部発振子(全振幅)0111-0110
外部発振子(低周波)0101-0100
128kHz内部発振0011
内蔵RC発振0010
外部信号0000
予約0001
とのこと。

初期値は内蔵RCで、内蔵RCの範囲が一つしか無く最大の8MHzになるようなのだが、
ヒューズ下位バイト最上位ビットのCKDIV8が初期値の0だとCLKPR(クロック前置分周レジスタ)を設定することで分周することが出来るらしい。
CKDIV8が0にされるとCLKPRは0011の8分にリセットされ、初期値もそうで出荷時のクロックは8MHzが8分されて1MHzらしい。
CKDIV8が1にされるとCLKPRは0000になるとのこと。
この機能使うと最高周波数以上の発振子を使うことも出来るぽいようなことが書かれてる。

外部発振子は低電力モードと全振幅モードがあるが、低電力だとノイズの影響を受けやすいらしい。
全振幅モードの場合のCKSEL0は、ATmega8と同じくSUT1,0との組み合わせで起動時間遅延。
全振幅モードのCKSEL3-1は011固定で0.1-20MHzとのこと。
全振幅にした方が無難かな?


というわけなので、元のATmega8用のヒューズが周波数関連しか設定されてないので、ATmega644用にするにはヒューズ上位バイトはそのままで下位バイトを、
CKDIV8 0→1
CKSEL3-0 0010→0111
下位バイト全体 0b01100010→0b01100010
にすれば良さ気かな?


USBaspの配布ファイル内にはバイナリが入ってるが、ATmega8用とATmega88用で別のバイナリが用意されてるので、
コンパイルもしないとダメぽい。
コード内にもターゲットデバイスを設定するような箇所があるのを確認したが、ターゲットデバイスの設定以外は変更しないで良さ気かな?

USBaspの回路はUSBtinyと同じ感じになっているが、V-USBみたいにツェナーダイオードじゃなくて2連順方向ダイオードで平気かな?
マイコン自体は5V動作させたほうが良いのかな?


ってな感じ。
V-USB派生のAVR-CDCは内部発振8MHzのATtiny45でクリスタル無しで動作するらしいが、クリスタルなし化は難しいだろうしクリスタル届いてから試す。

中華USBaspがパチもんだった・・・

今日はeBayで買って届いたUSBaspでLinuxでAVRプログラミングしようとして、
テストコード書いてavrdudeで書き込み・・・

のはずが、avrdudeで認識しない・・・
というわけで、ずっとハマってた。


まず、Arch Linuxの公式リポジトリから「avr」で検索すると、それっぽいのは、
avrdude,avr-gcc,avr-binutils,avr-libc,avr-gdb,simavr
辺りが出てきた。
avrdudeがUSBaspというプログラマに対応しているのを確認して購入したのだが、書き込み用に必要。
avr-gccでコンパイルが出来て、avr-binutilsとavr-libcも書き込み用ファイルの作成には必要ぽい。
avr-gdbとsimavrはデバッグ用ツールぽいんで今回は入れなかった。

avr-gccは、
avr-gcc --help
でヘルプが見れるが、
avr-gcc -mmcu=attiny2313 -c main.c
でmain.oが作成される。
-mmcuオプションでターゲットマイコンの種類を渡して、-cオプションでコンパイル、最後にコードファイルって感じぽい。
avr-gcc -mmcu=attiny2313 -Os -c main.c
と-Osオプションをつけるとサイズが小さくなるように最適化されるとのことだが、avr-gccが出力する.oファイルはむしろ大きくなったんだが、書き込み用の.hexファイルに変換したら、
オプション無しで140byteがオプションありで50byteに減ったんで効果でかいぽい。

avr-gccの出力ファイルはelf32-avrという形式のようで、そのままではavrdudeで扱えないらしく、
avr-objcopy -I elf32-avr -O ihex main.o main.hex
でavrdudeで書き込むことができるihexという形式に変換できるぽい。
avr-objcopyはオプション無しで実行するとヘルプが出る。

avrdudeの使い方はオプション無しで実行するとヘルプが出るが、
-cオプションでのプログラマ指定と-pオプションでターゲットマイコンの指定が必要ぽい。(-pは自動認識できる?)
avrdude -c 非対応文字列
とすると対応しているプログラマの一覧が表示され、usbaspのつもりだったんで、
avrdude -c usbasp -p 非対応文字列
とするとターゲットマイコンと指定する文字列の一覧が出る。

で、書き込むのは、
avrdude -c usbasp -p t2313 -U flash:w:main.hex:a
と-Uオプションでwをつけると出来るようなのだが、
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'
こんな感じで怒られた・・・
lsusbコマンドでUSBデバイスを確認すると入手した中華AVRプログラマは「03eb:c8b4」だった。

というわけで解決法を探ったが、/etc/avrdude.conf でプログラマのベンダIDとプロダクトIDが指定できるぽかったので、
usbasp-cloneのusbvidとusbpidを03eb:c8b4に変更してavrdudeの-cオプションをusbasp-cloneにしてみたが、結局ニセusbaspの様でダメだった・・・


さらに解決法探してたが、
ここの人が同じ様にUSBaspのつもりが偽物で、usbasp化改造してた。全く同じものぽい。
自分もWindows用のAVRWRTを用意して改造しようとしたのだが、ジャンパする箇所がすごく小さい。ジャンパピンとか0.6mmの線じゃ入らない。
で、細い線買おうか迷ったがハンダでやることにした。

が、うまく行かなかった。AVRWRTで認識しない。
ランドが小さすぎてハンダが失敗してる気もするが、AVRWRTには給電機能がないので無理なのか?
とも思ったのだが、
ここの人AVRISPmkIIという給電機能のないプログラマで改造成功してる。
自分も同じようにMOSI,MISOをストレートで結線して別のところから5v給電したのだが・・・
中華プログラマが5Vではなく3.3Vで動いてるとAVRWRTでダメって可能性もあるか?
一応、中華プログラマのVCC出力が5Vなのは確認済みだったが、マイコン自体は3.3Vかもしれない。


まあ、今回は断念した。
中華プログラマはUSBaspではなくUSBISPというものらしく、Progispというツールで扱えるようなのだが、Windows専用ならAVRWRTでいいし・・・

とりあえずAVRWRTはインストールして使える状態になっていると思うのだが、やはりLinuxでやりたい。
別のUSBaspを購入するか、USBaspの回路を見たところクリスタルが到着すれば作れそうな気がするんで自作するか・・・
ただ、ATtiny2313では容量不足ぽくて、他のAVRはATmega644pってのしか持ってない。
オリジナルのUSBaspはATmega88かATmega8と記載があるが、644でいけるだろうか?
今回の偽USBaspはメタルジャケット付きで外見良い感じなのだが、むき出しでもICソケット付きの形状のは良いかなと思ってる。
別のプログラマを再購入するとまた偽物つかむ可能性が考えられるが、メタルジャケットではなくプラジャケットのやつはUSBaspとプリントされてるのが確認できるな。
値段同じようなもんだったしプラジャケットのにしておくんだった・・・

あと、今回は1pinのジャンパケーブルでつないだが、ピンアサイン確認しながらじゃないと厳しい。
多分合ってたと思うが、間違えて結線しちゃって失敗した可能性も否定できない・・・
逆指し不可の10ピンソケットと、6pin-10pinの変換ケーブルかコネクタも欲しいと思った。

まあ、金もないしクリスタルが届いてからUSBaspの自作を試みて、
購入の検討はその後にしようと思う。

M3ナッターが欲しいな・・・

HN-50というハンドナッター持ってるんだが、これM4,M5,M6のみでM3非対応なのね。
購入前からPC周りでM3使うからM3対応品のほうが良いと思ってたんだが、ポイントの関係でM3非対応品を買っちゃった感じ。

今回、工作機械の制作を妄想してて、M3ナットをボードに圧着できれば良さ気な箇所が・・・
というわけで、HN-50用のM3マンドレルが存在しないかとか調べてたんだが、
どうもブラインドナットというのはボルトとナットだけで圧着することができるぽい・・・

やり方は、
六角穴付きボルトに普通の六角ナットを通して、ブラインドナットを通す。
板にハメて、六角穴付きボルトを回転しないようにレンチで抑えて、普通の六角ナットをスパナで緩める。
そうすると六角ナットはボルトから外れる方向に動くが、ブラインドナットが回らなければ潰れる。
ということらしい。
ブラインドナットが六角ナットと一緒に回らないように間になにか挟んだほうが良いらしい。板でもいいし、M4以上のナットを挟んで抑える感じでも良いかな?


M3の六角穴付きボルトというものは持ってないんだが、M3の六角スペーサーなら持ってるんで、
六角穴をレンチで抑えるのではなくて、六角スペーサーをスパナとかソケットで抑える感じでも良さそう。

ハンドナッターとか、そもそも要らんかったんだな・・・

CNC工作機械の自作を妄想したり・・・

ここのところeBay見て工作熱がわいているが、
電子工作で不要品の再利用が出来ないかというのが種目的な感じだが、
CNCフライス盤とか3Dプリンタみたいなコンピュータ制御の工作機械を安く自作することも妄想してる。

工作機械は、3Dプリンタとか、エンドミルを回すフライス盤よりも、回転ヤスリを回すミニリューターっての?をCNCするのが良いかなーって思ってる。
3Dプリンタは、どっかから設計図拾ってくるなら別だが、自分で作るなら粘土とかレジンとかグルーガンとかで手作業しても作れるような気がする。


http://www.welcome.zaq.jp/moonlight/cnc-xy.html
↑ここの人が、タミヤのユニバーサルプレートというものを使ってテーブルを作ってるが、このアイデアすごく良いと思った。
タミヤのユニバーサルプレートってのは、5mm間隔で3mmの穴が開いてるプラ版らしい。
プラ版だと強度に不安があるが、最初から穴がいっぱい空いてて加工が少なく済みそう。


タミヤは工作用の部品いろいろ扱ってるが、昔から個人向けに商売やってるからな気がするが、
部品を買おうとすると少量だと高過ぎなことがよくあるが、良心的な価格な気がする。


ユニバーサルアームでテーブル作った人のはモーター軸と同じ向きにプレートを使ってて不安定に見えるんだが、

↑1列だけのユニバーサルアームっていうのも存在するんで、これをモーター軸の両端に横向きに2個並べちゃった方が安くて安定しそうな気がする。
ユニバーサルアームセットってのもあって、アングルが4個ついてて良いかと思ったが、
モーター固定と反対側で3個、両脇に補助シャフトを2本つけると両端で4個で、最低でも1段辺り計7個はアングル必要になる。
それなら、別にアングル調達しちゃった方が良いかなと・・・

ステッピングモーター(eBayだとstepper motor)は、タミヤに減速ギアボックスというものがあるんで、それに連結できる様に軸経1.5mmの小さい奴が良いかと思ったんだが、
eBayで1.5mm軸の安いの出回ってるんだが、データシートないしパワー弱そうだし、データシートありで安く出回ってる28BYJ-48ってのが無難そうかなと思ってる。
これは1個100円ちょいで買えそうだが、これより高いのは結構な値段しちゃう感じ。
軸が5mm,3mmの長方形的な感じになってるんだが、シャフト連結用のカプラーってもんで軸と固定できると思ってる。
とりあえず小型のものでいいと思ってるんで、シャフトはタミヤの部品との相性的に3mmの物が良いかなと思ってる。

↑タミヤの3mmネジシャフトセットってのがm3-150mmと思うんで、それで良いかも。


シャフトにナットを通して、ナットが回転しないようにすることでテーブルを動かすわけだが、
ユニバーサルプレートで作った人はブロックスペーサーというものを使ってナットの上にテーブルを固定してる。
だが、このブロックスペーサーというのは基板を垂直取り付けするように存在するらしいのだが、入手は不可能じゃ無さそうなのだが類似品が少ないようで調達しにくそう。
ナットを固定する方法をいろいろ考えたのだが、モーター軸と補助シャフトにユニバーサルアームを通しちゃって3連ナットみたいのもので固定できないか?と考えた。
だが、それもググってもよさ気なのが出てこない・・・
ユニバーサルアームの中心にm3リベットナットを嵌めこんじゃうってのでもいいか?と思ったが、手持ちのナッターがM3対応してないんだよね・・・
前にナッター買った時に、M3対応品買っておくんだった・・・そうすればPC用にも使いみちが出てくるし。



1段作るだけなら1000円程度でいけそう。
XYZ全部稼働するようにすると、3000円は超えちゃうかな?
垂直フレームはタミヤじゃなくて木材にしちゃったほうが良いかな?
ドリルモーターとかつけて完成させると5000円くらいになるだろうか?

ってな感じで妄想。

また部品回収やった

また不要機器からの部品回収やった。
DIP形状のICがついてるのを中心に。

回収したもの。
種別

個数
備考
スピーカー
8Ω0.4W
2
 
4Ω3W2
 
マイクロスイッチ

5
 
プッシュスイッチ

2

コネクタ
USB TYPE-Aメス
2

ヘッドフォンジャック2
 
ピン
3
 
LED

1

フォトセンサ?
2pin透明
5
 
3pin黒
5
 
発振子
水晶 25.00
1
 
フィルムコンデンサ
4.7nF
2
 
0.1uF
1

セラミックコンデンサ0.1uF
3

電解コンデンサ
2.2uF
4

220uF
3

100uF
2

10uF1
 
22uF
2

可変抵抗
50kΩ
1
 
抵抗
10kΩ3
 
5.6kΩ6
 
15kΩ2

100Ω2
 
580Ω1

12kΩ1
 
680Ω2
 
30kΩ1

2
IC
EM84501AP
1
PS/2マウスIC
QM1200
1
PS/2マウスICと思われる。EM84501APと同じ?
ICL2822
1
TDA2822互換と思われる。
EEPROM
93LC46
1
128x8bit?

部品取ったのは、この前と同じような5インチベイ・スピーカーと、
PS/2・マウスx2、ISA・サウンドカード、PCI・LANカード、PCI・グラフィックカード。

マウスのフォロセンサじゃないかと思うが、謎部品があった。
ISAのサウンドカードにUD61464というチップが載っててDIP形状のDRAMじゃないかと思うんだが、回収したかったけどこのカードの部品固くてほとんど取れなかった。

LANカードに載ってた93LC46ってのがEEPROMだと思うのだが、EEPROMってのは不揮発メモリで使いこなせれば便利じゃないかと思ってる。
古いノートPCの再利用でタッチパッドは使えないかと考えてるが、PS/2マウスICってのはタッチパッドに流用できないかな?USBで実装したほうが良さそうな気もするがw
25.00MHzと思われるクリスタルを回収したが、安いマイコンでは25はダメじゃないかと思う。

他は前回回収したのとかぶるのが多いかな。
スピーカー4個のうち2個は前のやつ外してなかったんで外して回収。


他の不要PCボードは表面実装のものが多くて回収しても活用しにくそうなんで、当面回収は終わりかな。古いマザーボードとかには使えそうな部品あるかな?
この前eBayで買ったミニ・リューターの配線は、エナメル線がまだ届いてないから今日はやらなかった。

部品回収した

要らない機器の基板から部品取って回収してみた。
前にピンヘッダ回収しようとして外れず断念したのと、ロジクールのマウスのスイッチ交換しようとしてうまく取れなかったが、
今回は結構うまくいった感じ。
バラしたのは5インチベイにスピーカーとUSBコネクタを出す奴のオーディオ部分ぽい。

最初、スズメッキ線巻いたうえでハンダ山盛りして大きくて邪魔なスイッチから取っていったが、
基板の端の方にあって位置のわかりやすい2ピン部品をそのままピンセットで抜いてから、難しい部品はハンダ山盛りにして全部溶かしながら叩き落とす感じにして、
スズメッキ線は最終手段にしたほうが良さそう。
スズメッキ線巻くと固定が難しかった。
あと、山盛りハンダ部を溶かす際は、こぼさないように基板角度に注意ぽい。
山盛りハンダは、溶かしてボール状にした後に、完全固まる前にピンセットで掴むと別の場所の部品取りに再利用できた。


回収できたもの。
種別

個数
備考
プッシュスイッチ

2
 
ヘッドフォンジャック
2

可変抵抗
50k
1

ピンヘッダ
L型8pin枠付
1
ピンヘッダというか、1列8pin2.54mmピッチのコネクタ
LED

1

電解コンデンサ
220uF
3
 
100uF
2

2.2uF2

不明
1
電解コンデンサと思うが、何も記載なし
セラミックコンデンサ
0.1uF3

フィルムコンデンサ
0.1uF
2

4.7nF
2

抵抗
10Ω 茶黒黒金
1

2.1kΩ 赤茶赤金
4 
1kΩ 茶黒赤金
1

0Ω 金茶金
2

100Ω 茶黒茶金
2

10kΩ 茶黒橙金
1

15kΩ 茶緑橙金
2

5.5kΩ 緑緑赤金
2

IC
YG2822
1
TDA2822というのと同じと思われる。オーディオアンプぽい。

抵抗のカラーコードとか、目視じゃきつい。ルーペ欲しいと思った。
セリアに売ってるかな?LED付きの買ったほうが良いのか?

抵抗器には色のついた帯が複数ついてるが、

単位

0

1
10Ω

2100Ω

31kΩ

410kΩ

5100kΩ

61MΩ

710MΩ

8

9

0.1Ω

0.01Ω
という順番で、最後の一桁は精度で、カーボン抵抗だと通常金になってるらしい。
0Ωと思われる抵抗器が1桁目が金だったが、基本的に1桁目が値なしの金ということは無いので、金が末尾。
後ろから2番目の桁が単位で、その前の値を順番に見て単位をかければいいぽい。
単位は10のn乗と言った感じで値の数値を使って計算できるが、
1,10,100,100....
と覚えちゃったほうが良いような。
単位が金銀なら-n乗方向なわけだね。
だから、「茶黒赤金」なら金が末尾で隣が単位。金の逆方向から読んで[10x100Ω=1000Ω=1kΩ]という感じらしい。

コンデンサの種類はググッて画像と比較して分類した。
電解コンデンサは容量が大きくて壊れやすいのは知ってるが、セラミック(円盤)とフィルム(ちょっと大きい)を使い分ける必要はあるのかな?

LEDは繋いでみてテスターしないと降下電圧わからないかな?
他の部品も、一応使うときにはテスターしてみようと思うが。

回収した部品を入れるのに、セリアの電池ボックスがちょうどよさ気な感じだった。
セリアは前は工具用の小分けできる容器いろいろ置いてたのに、最近工具類の品揃え悪い・・・


AVRでソフトウェアUSB試してみるのに必要な部品が欲しいところだが、4.7uFと0.1uFのコンデンサは使えそう。
抵抗は合成して近い値にするとして、クリスタルとクリスタル用の小さいコンデンサが欲しいな。
あと、手持ちのダイオードで適度な電圧に降下させられるか。

部品取りに慣れればマウスのスイッチ交換とかもしやすくなるし、今後もちょくちょくやっていこうと思う。
ゴミボードいろいろあるし、部品回収したら惜しまず捨てれるし。

AVRでソフトウェアUSB

電子回路の工作をやろうとしているが、
まずは勉強も兼ねて、電圧と電流の制御だけでできて難易度は高く無さそうな気がして、そこそこ実用的と思うので、USB->NiMH充電制御とNiMH->USB電源をやってみようと考えているが、
電子工作を続けるのに、その先に作るものを考えないといけないよね。

他のものの制作を考えると、
  • PC用デバイスの作成。
  • PCから制御する工作機械等の特殊機器の作成。
といった感じで、思いつくのはPCと連携して使うものがほとんど。
工作機械は、フライス盤とか3Dプリンタが安く作れないかなーとか・・・
PC用デバイスの作成は、マウスやキーボードなどは市販品使えばいいが、それらとディスプレイの制御を自分で作れるような技術があれば、
応用して、ノートPCとかの古いゴミを活用してモバイルPC的なのができれば面白いかなと。

PCと接続するデバイスを作る場合はAVRマイコンを使って処理を行うつもりだが、
古いノートの再利用とかならマウスやキーボード的なのはPS/2とかでつなぐという手もあると思うが、どっちにしろ、USBの技術を避けて通るのは不適切で、USB機器を開発できるようにするべきだよね。

というわけで、AVRマイコンでUSB通信をすることについての情報を調べた。


以前ちょっとAVRをやった時に、AVRでソフトウェアUSBを作ってキーボードを作成してる人の情報を見た記憶があるので、
USBコントローラー的な外部チップは無しでソフトで実装することを考えていたが、
調査序盤で、AVRと外部のUSB-シリアル変換チップを使ってUSBデバイスを作ってる人の情報ばっか出てきた。

なので、eBayでAVRと合わせて使えそうなUSB-シリアル変換チップを探してみた。
20円前後からある安いUSB-シリアル変換ボードを見ると、FT232RL,CP2102,CH340G,PL2303HXのいずれかのチップが使われている模様。
自分で作る機器に搭載しようとすると2.54mmピッチのDIPパッケージが良いが見つからず、ピン数も結構あるので難しそう・・・
チップ単体でも100円以上しちゃう感じだし、USB-シリアル変換チップを使うなら、200円の完成品ボードを使っちゃったほうが良いかも。
だが、機器作るたびに200円コスト増は厳しいね・・・
あと、LinuxにはこれらのUSB-シリアル変換チップ用のドライバは標準で入っているのでドライバは不要だが、マウスやキーボードといったデバイスをUSB-シリアル変換を介して作るとなると独自ドライバが必要になっちゃうよね・・・


さらに調べていたのだが、AVR-CDC日本語)というものを発見した。
外部チップ無しでUSB-シリアル変換を行うもので、当初考えていたソフトウェアでのUSB実装だね。

AVR-CDCはV-USBというソフトウェアUSB通信を実装して、シリアルに変換するものぽい。
V-USBのサイトに他のプロジェクトが多数紹介されていて、i2c-tiny-usbというものを発見した。

i2c-tiny-usbはUSBをI2Cという規格のシリアル通信に変換するもののようだが、
I2Cというのは使ったことがなかったが、シリアルコンソールを使って対話するだけのものではなく、デバイス接続用のバス規格で、Linux標準でもデバイスドライバが多数存在する模様。
さらに、i2c-devというデバイスファイルを作成するだけの汎用ドライバが存在して、デバイスファイルを読み書きするだけで対話ができる模様。
これ使えれば、シリアルコンソールで対話するのが基本のAVR-CDCより良さそうかも・・・

V-USBのサイトには他のソフトウェアUSB実装として、IgorPlug-USB,USBtinyの2つが紹介されていた。
i2c-tiny-usbはV-USBの派生というよりもUSBtinyの派生ぽい。
とりあえず、それらのいずれかを使って実験してみたい。


V-USBの回路


USBtinyの回路

SPI変換の回路のようで、右側はSPI部分。
SPIもI2Cの様なデバイス接続用のバス規格で、4本の信号線で接続できるらしい。

IgorPlug-USBの回路



いずれの回路も12MHzのクリスタルを使ってマイコンの周波数を決めて、低速USBの速度を作ってる。
IgorPlug-USBはクリスタルのところにコンデンサが入ってないが、良いのか?
V-USBとUSBtinyは27pFのコンデンサが2個ついてる。

3つともATTiny2313を使っているが、別のものでもできると思われる。
クリスタル内蔵マイコンなら別途クリスタルが不要らしい。
まあ、ATTiny2313の手持ちがあるんで、それ使うつもり。

USB電源は5Vだが、信号は3.3V(?)らしく、V-USBは順方向ダイオードで落としてマイコン自体が3.3V駆動ぽい。
USBtinyは信号部分だけ3.6Vのツェナーダイオードで落としてる。
IgorPlug-USBは信号も5Vになっているように見えるが、良いのかこれは?

信号はD-には1.5kΩの抵抗入れて電源が繋がってる。
D+もD-も両方共68Ωの抵抗を入れてマイコンのpinにつながってる。
D+とD-はどっち向きの信号なのかよくわからないのだが、コード見ればわかるかな?

他に電源部分にコンデンサがいくつか入ってる。


知識もないのでよくわからんが、IgorPlug-USBはちょっと怪しい感じがする。
V-USBとUSBtinyの大きな違いはマイコンの電圧の差が違うように見えるところかね。
V-USB式の方が部品が一個少なくて済むのかな?
5V駆動の方がファーム更新の時にやりやすいかとも思ったが、AVRプログラマで給電できれば問題ないのかな?

実験するには、12MHzのクリスタルの調達が必要そう。
68Ωと1.5kΩは無いけど、合成抵抗で近くの値にすれば平気かな?
手持ちのダイオードやLEDでちょうどいい電圧が作れるかな?手持ち部品を電源に繋いでテスターで電圧測る必要がありそう。
コンデンサは要らない機器バラして入手できないかな?クリスタルも不要品から調達できたりすれば追加調達要らないかも・・・

これ使いこなせればいろいろ作れそうな気がする・・・

AVRマイコンにはアナログコンパレータってのがあるらしい

ニッケル水素電池使った電子工作しようとして、電池電圧の検知にトランジスタかダイオードの電圧降下分で比較しようと考えていたが、
最終的に電池状況に応じてAVRマイコンで制御するつもりだが、AVRマイコンにはアナログコンパレータってのがついてて2つの入力から電圧の大小を比較できるらしい。

順方向降下の電圧での比較じゃ精度が悪くなると思うし、マイコン使うんだからアナログコンパレータ使ってやるべきだね。
そうすると、比較用の電圧作るのに3端子レギュレータ使うのが良いのかな?
そんなもの持って無いので要調達だが、要らない機器から回収できんかな・・・


ダイオードの回収考えて使ってない機器あさってたが、今のところダイオードは表面実装のばっかだった。
コンデンサなら色んな種類回収できそうな感じだった。
電池ホルダーはLEDスタンドについてた3本直列の回収した。2本+1本の端子になってたんで1本用にもできそう。
端子が底方向についててひっくり返したいが要ハンダぽいんで、ついでにジャンパワイヤ繋いで使おうと思う。

調達したいのは、抵抗セットと3端子レギュレータかな。
トランジスタがNPNしかないけど、電源繋いだ時に切りたいからPNPのが欲しいな。
AVRプログラマが届いてからにするから年内は無理だな。