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

STM32F042K6T6認識した!

前回の記事でSTM32F103C8T6の中華ボードを中華ST-Linkで認識して、再度STM32F042K6T6をとQFP32変換ボードを買って試してみたいと書いたが、
昨日届いたんで今はんだ付けしたが、認識した!

$ sudo st-info --probe
Found 1 stlink programmers
 serial: 413a010032124353354b4e00
openocd: "\x41\x3a\x01\x00\x32\x12\x43\x53\x35\x4b\x4e\x00"
  flash: 32768 (pagesize: 1024)
   sram: 6144
 chipid: 0x0445
  descr: F04x device
↑こんな感じになった。

http://ewarmjp.seesaa.net/article/441952177.html
↑前回の記事書いたあとに見っけたSTM32F042K6T6使ってる人の記事を参考に、
1,5,17番ピンに3.3V
16,32番ピンにGND
23番ピンにSWDIO
24番ピンにSWCLK
で接続。
3.3VとGNDを5本つなぐ必要があるのかわからないんだが、どちらにしろこれらのピンはIO等の機能は当てられないのでつないじゃえば良さそう。
5番はアナログ用みたいだからA/Dコンバータとか使うときだけ変更するんかな?

前回のボードは同様に接続しても認識しなかったんで、はんだ付け失敗か不良品?
ブリッジはないようだったが・・・
まあ、前回半田盛りすぎから吸い取り器で除去したりしたんで、
今回は直接半田線を当てずに、コテ先にハンダをつけてコテ先のハンダをつける感じでやった。そのほうが良さげ。

それと、前回は手持ちのヘッダーピンがQFP変換ボードに挿さらなくてやむを得ずソケットをくっつけたが、
細ピンヘッダを購入してブレッドボードに刺さるようにした。
ピンヘッダのはんだ付けは今回の参考サイトの人がユニバーサル基板を重ねて挿して水平にした状態ではんだ付けしてたんで、真似した。

STM32F103C8T6の中華ボード

STM32F042K6T6が使えなくて試しに買ったSTM32F103C8T6の中華ボード(Blue Pillというらしい)、
届いてから放置してたが、とりあえず中華ST-Linkにつないでみた。
ヘッダピンは付属しているがはんだ付けされていない製品だが、最初からはんだ付けされてて横向きに出てる4ピンヘッダがST-Link用みたい。

ボードの裏面に3V3,SWO,SWCLK,GNDと記載があるので中華ST-Linkにそのままつないだ。
$ sudo st-info --probe
[sudo] user のパスワード:
Found 1 stlink programmers
 serial: 413a010032124353354b4e00
openocd: "\x41\x3a\x01\x00\x32\x12\x43\x53\x35\x4b\x4e\x00"
  flash: 0 (pagesize: 0)
   sram: 0
 chipid: 0x0000
  descr: unknown device
↑ボードを繋がないでst-info --probe

$ sudo st-info --probe
Found 1 stlink programmers
 serial: 413a010032124353354b4e00
openocd: "\x41\x3a\x01\x00\x32\x12\x43\x53\x35\x4b\x4e\x00"
  flash: 131072 (pagesize: 1024)
   sram: 20480
 chipid: 0x0410
  descr: F1 Medium-density device
↑ボードをつないでst-info --probe
認識してるね。

フラットケーブルコネクタ届いた

IS01のキーボードを解析しようと思って買った、0.5mmピッチ20ピンのコネクタを2.54mmピッチに変換する基板届いた。


ケーブルつないでみたがピッタリb

でテスター当てながらボタン押してみたら、3番ピンと7番ピンにつないだ状態で右SHIFT押したら反応した!
のだが、これリバーシブルで裏に1.0mmピッチのコネクタがついてる基板で、IS01のケーブルはひっくり返して装着する仕様になってる。
なので、18番ピンと14番ピンなのね。だが、逆向きにテスタ当てるの難しいから逆側の番号で見ていくか。
逆接も反応するので単純なスイッチぽい。

あと、テスター当てながらボタン押してく方法で解析はできると思うがめんどい。
基板にヘッダーピンソケットつけてマイコン使って解析するか・・・

ダイソーの樹脂粘土

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

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

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

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デバイスなんかもやってみたいと思うが、今のところコードが見つかってないんで、プロトコルがわかんないし難しいかも・・・