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

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

先日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に落とす用?
コネクタ側には抵抗はついてないし、やっぱ抵抗なしでも平気じゃね?って思うが・・・


DVI-HDMI変換アダプタ届いたんだが・・・

前に届いたAndroid TV BOXの画像出力がミニタイプのHDMIで、ディスプレイ側のデジタル端子はDVIしか無いから変換アダプタ注文してて届いたのだが、
ディスプレイのDVI端子の下にスタンドの膨らみがあってアダプタ+ケーブルだと装着できねえw

というわけで考えたのだが、
ディスプレイ側はDVIメス、機器側はミニHDMIメス。
DVI-HDMIのオスオスケーブルは持ってる。
今回届いたのはケーブルレスのDVI-HDMI変換アダプタ。
ケーブルレスのアダプタをディスプレイ側につけるとスタンドと鑑賞してつけられない。
という状況。

手持ちではミニHDMI関連はCS918(機器)付属のHDMI-ミニHDMIのオスオスケーブルしか無く、
HDMIオスが挿せるHDMIメスは今回の変換アダプタしか持ってない。

壊れてるiiyamaのディスプレイには同じくHDMI端子はないのだが、DVIの下に干渉物はなく、たぶんコンデンサ交換で治ると思うので治すことも検討したが、
机に置いてるディスプレイが今は3つ同型だし、USBハブ機能もあるのでできれば今のディスプレイがいい。

ケーブルレスでない変換アダプタなら問題ないので探したが、ケーブル付きの場合はほとんどの商品が両端オスになってるんでミニHDMIの変換ケーブルが使えない。

機器側に装着するミニHDMI-HDMIを変換ケーブルではなくケーブルレスのアダプタ(HDMIでもDVIでも)にした場合は基本的にオスメス形状なのだが、
HDMIはコネクタ外れやすいし、機器側にアダプタつけるのはあまり良く無さそうな気が・・・
HDMIだとでかすぎるからミニHDMIになってるわけだし、機器側にアダプタをつけると別の箇所で干渉しそう・・・

メスメスのケーブルレスアダプタも考えて探したが、基本的にケーブルレスのものは片方のコネクタに挿すようにできているから、殆どの物はオス-メスになってる。
ケーブルのものは両方のコネクタに挿す用にできているからオスオスになってる。
ミニHDMI-DVIのケーブルだと使いみちが限られちゃうし、ケーブル長も最適化しにくい。


てな感じで考えたのだが、角度変更のできるDVIオス-HDMIメスの変換アダプタというものが送料込み250円で売ってるんで、それ買うことにした。
ピン数多いディスプレイコネクタで回転式だから、すぐ断線しそうなのが怖いが・・・

CS918は届いてから1ヶ月利用できない感じだな。
工作に時間と金費やしたい感じになってるし、買わなきゃ良かったと思ってる。

ついでに、通貨単位が違ったからなのかカートに入れて同時注文ができなかったのだが、
買いたいと思ってた100円のハンダ吸い取り器が同じセラーさんが売ってたんで注文した。
両方合わせて400円弱かな。

ピンヘッダーの入れ忘れが生じてたセラーさんは、いつでも注文していいと連絡きたんで、
100 x S8050(0.7A NPNトランジスタ)
2 x 28BUJ-48 (ステッピングモーター)
の2つを注文した。
こっちは両方で500円ちょい。

あと、昨日の記事に書いてなかったが、センターポンチって工具も欲しいと思ってる。
金属板にドリルとかで穴空ける前にちょっと叩き潰してドリルがずれなくする工具ぽい。
今日のセラーさんは扱ってなかったんで買わなかったが、ハンマー式のなら国内でも安く売ってるんで国内で買うかも。
というか、ハンマー式なら釘でいいのかもしれないw

今購入検討中のものは、
工具: センターポンチ,ヒートガン
部品: UV-LED,RGB-LED,普通LEDパック
ってなとこかな。

工作はクリスタルが届いてからV-USBの実験あたりからやろうと思ってるが、
数日中に届きそうな気はするが、USBの信号の向きがわからんので先にV-USBのコードを見てUSBのプロトコル仕様をちょっと知りたいかも。

欲しい物まとめ

先日のeBayで買って届いた商品に注文したはずのピンヘッダーが入ってなかった件は、
同じ人ぽいとこから複数回買ってたからかもしれないが、「次回注文時に一緒にで配送どうか?」的な感じの提案が。
良い品揃えのセラーだし、安いモノだし揉めるつもりもないので承諾だが、
新たに注文するもの探したりで欲しい物出てきたんでまとめ。

件のセラーさんのとこでは、先日から検討してるステッピングモーターの28BYJ-48が安い感じなんだが、他は最安って感じではなくあまり買いたくないのだが、
手持ちトランジスタの2SC1815が力不足な時に使えるものとして、他のセラーと比較してS8050は買える値段かなって感じ。
セラーさんの表記では、S8050は1.5A流せるトランジスタと記載されてるんだが、NPNの0.7Aまでなはずのもの。
SS8050ってのが1.5Aで、ソッチの方が良いかと思ってたんだが、最大電力はどっちも1Wな気がするんで大差無いような・・・
そもそも、ヒートシンクつけれない形状で1.5Aとか無理な気が・・・
28BYJ-48の方はネジ穴と軸がズレてるのが気に入らないんで定番ぽいNEMA17も検討したが、やっぱ試しで買える値段の28BYJ-48にする方向。
ATtiny85とか使えそうなAVRマイコンなんかもついでに買おうかとも検討したが、必要になってからにする。

同じとこで買うなら予定はそのくらいなんだが、
先日800円ちょいでヒートガンっての見つけて、ドライヤーのすごいやつみたいな工具なんだが、グルーガンで溶かしたグルーをさらに溶かして型加工できないかな?
ってのを考えた。
だが、ヒートガンってのは500度とかまで上がるらしいんで、800円のじゃなくて、ちゃんと温度制御できるようなやつ買った方が良いかなという方向・・・
もうちょい高いやつだと国内購入でも値段に差がない感じで、ポイント使えるショップもあったんで国内購入にしそう。

あと、先日から何回かハンダ付けされた部品の回収やったが、ハンダ吸い取り器ってものがeBayで100円ちょいで売ってる。
USBaspの穴にハマったハンダの吸い取りも吸い取り線でできなくて断念したんで、欲しいわ。
国内だと以前はダイソーが200円で売ってるらしいんだが、他だと1,000円位はする感じ。
安いのだとバネがヘタるらしいが、壊れやすいとしても送料込みで100円なら買いたい。
壊れるまでは安いのでも高いのでも大差ないらしい。

他に、件のセラーさんのとこで商品リスト見てて知ったんだが、
カソードが3本ついててRGB3色光らせられる4pinのLEDというものを知った。
状態表示用のLEDにはこういうLED使った方が部品数減らせて良いね。
だが、安いセラーは50個300円程度なんだが600円だったんで機会があった時に他で買う。
あと、UV硬化塗料等が使えるように、UV-LEDっての使ってUV箱的なの作りたいと思ってる。
UV-LEDは100個で300円位かな?
新品LEDはGREENしか持ってないんで、100pcs程度のLEDセットも欲しいと思ってる。

さほど買いたいものは多くない感じだな。

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

ニッケル水素電池の充電で定電流にする方法を考えて、
オペアンプという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)出力の制作を考えてる。

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

昨日届いた中華製ニセ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の自作を試みて、
購入の検討はその後にしようと思う。

eBayから2個届いた

eBayで注文してた商品のうち、USBASPとか計5点とDCジャックと部品類計6点の2注文分が届いた。
のだが、DCジャックと一緒に注文した部品のうち、ピンヘッダーが含まれてない・・・

というわけで、別発送ってこともありえるのかもしれないが連絡した。
必要になるかもしれないので写真は取っておいた。
注文する時に売り物似てると思ってたが、2個とも発送元同じだったんで中の人同じぽい。
もう一個、クリスタルとか注文したセラーも多分同じと思う。
良い品揃えで安いんで揉めたくないが・・・

最近eBayで電子部品とか機器を買うことが多いが、不良・入れ忘れ・入れ違い、等の確率が5割超えてるわw
昔ライターとか喫煙具をeBayで中華から売ってもらってた頃には問題があったことはなかったのだが、
複数商品をまとめ買いしたりすると入れ忘れられたり、喫煙具と違って電子機器だと明らかに動作しない状態で送られてくることがあるぽい。


USBASPが届いたらLinuxでのAVRプログラミングをやってみたかったんで、さっそくLEDを点灯させるだけの実験をやってみたい。

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

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

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

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


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

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