STM32F042とPCF8574のせる基板届いた
STM32F042とPCF8574ででUSB to I2CでPCにGPIOつける計画の基板届いた。
ちょっと部品乗せたがまだ不足部品あるんで完成は数日後。
ちょっと部品乗せたがまだ不足部品あるんで完成は数日後。
ソフトの方は基板発注前にGoogleと相談してた段階ではi2c-starがSTM32F042に対応してると言われてたんだが、基板発注後になってi2c-starはSTM32F0には対応していないと言われた。
実際i2c-starはSTM32F1とSTM32F4しかコードがないんでそのままじゃ使えない。
i2c-starをSTM32F0に対応させる。
i2c-starはlibopencm3に加えてlibrfnってモジュールを使っててlibrfnの方でビルドエラーが出て原因究明に難があった。
本家のI2C-Tiny-USBのコードを見てSTM32F0に移植する。
本家のI2C-Tiny-USBはUSB機能のないマイコンで無理やりUSBを実装してるんでlibopencm3などのAPIで行うように移植するのは難易度が高そう。
低レベル層でやってるから通信内容知るのはわかりやすいかも?
I2C-Pico-USBを見ながらSTM32F0に移植する。
I2C-Pico-USBはTinyUSBってのでUSB機能を実装しているがこれはSTM32F0にも対応してるとか。
だが、Raspberry Pi PicoはI2Cが0バイトでデータ送信できないとかでBit-BangingでI2C部分をやってるらしい。
i2c-starをSTM32F0に対応させるよりは簡単に思えた。
もう一個i2c-stm32-usbってのみっけて、これはI2C-Tiny-USBがGPIO機能を持ってないからってI2C-Tiny-USBではなくCP2112をエミュレートしてるらしく、機能が多いからかコード量多かった。
で、GoogleじゃなくてChatGPTにも相談してみたんだがlibopencm3だけで作れそうな感じ。
まだ完成してないがmainから直接呼び出す関数は少ないしlibopencm3は公式リファレンスもあるから理解しやすそうなコードだった。
ハードの方は、
.kicad_sch
.kicad_pcb
これなんだが、JLCPCBとLCSCで同梱して送料無料で部品購入できるってGoogleに言われてたんでPCBデータをJLCPCBにアップした後にLCSCで不足部品を探してたんだが、
当初5Vから3.3Vへの降圧にSY8113BADCを使おうとしてたんだがGoogleに0805のインダクタじゃダメ言われて、TLV62565なら0805のインダクタでいけるみたいに言われて降圧ICの方を変更することにしてTLV62568にした。
でインダクタの方は0805のにしたけど定格電量結構大きいから最初のSY8113BADCでもいけたと思う・・・
まあ、SY8113BADCよりTLV62568の方が周辺部品も少なくて済むんで適切だったと思う。
が、問題はmicrousbコネクタがシンボルだとシールドのピン番号がSHになってるんだが、拾ってきたフットプリントはパッド番号が6になってた。
で、パッドの接続ネットをGNDに変えてたんだが、何度か回路図の更新して最終的にJLCPCBに発注する際にコネクタのシールドをGNDに接続するの忘れた状態で発注しちゃった・・・
今度からはこういうミスしないようにPCBエディタでネットを接続するんじゃなくてフットプリントの方を編集するようにする・・・
JLCPCBとLCSCの同梱は結局できなくて、Googleに決済してから連絡でも同梱できるとか言われて言われたとおりにしたら一旦ストップされることになったから部品届くのが遅れることになった・・・
PCF8574は300mil幅で2x4のピンヘッダを2.54mm間隔で並べた幅に置くのが厳しかったんだけど、PCF8574の互換品に150milのがあって本家よりも安いくらいだったのでそれ使うつもりで一旦PCB描いてたんだが、
Aliexpressのクーポン適用のためになにか追加購入する必要があった際に150milと300milの件忘れててAliexpressで300mil幅のPCF8574を購入しちゃった。
なので300mil幅のPCF8574を使うようにPCB描き直したんだが、ちょっとずらして裏配線すれば問題なかった感じ。
4隅にm3ネジ穴開けてアルミ板でサンドイッチする計画。
ネジ穴付近の板が細くならないように、右上と左上にUSBコネクタとスライドスイッチを置いて、下側にはGPIOを32ピン出してスペースがないんで両サイドのヘッダーピンをできるだけ上にずらした。
STM32F042KとPCF8574x4にTLV62568のせてまだ空き面積があるのと、ADCはピンヘッダを10ピン出すんだが使い道がないので、
TLV9062を1個乗せてADC2ピン分を1.65V中心の波形が見れるオシロスコープ的にすることにした。
Googleの計算だと-46Vから+46Vくらいまでは壊れないぽい。
PCF8574は5Vと3.3Vをジャンパピンで切り替えれるようにしてSTM32のBOOT0はスライドスイッチ。
PCF8574のアドレスはA0,A1は固定で1ずつずらしてA2はジャンパピンで切り替えれるように。
ADC以外はI2C,UART,SPI,SWDのピンをつける。
PCF8574のINTはSTM32のPA8に接続するが、I2C-Tiny-USBには自分自身がI2Cデバイスになる機能はないんで、I2C-Tiny-USBの機能に加えて仮想デバイスをぶら下げられないかなと思ってる。
仮想デバイスをぶら下げるならGPIOはPCF8574にすると思うが、ADCのピンもLTC2301かなんかをエミュレートしてUSBケーブル1本で見れるようにしたいところ・・・
STM32にはRTCもついてるからRTCモジュールにすることも可能と思うが、PCにはそもそもRTC機能がついててNTPもできるから明らかに要らない。
PF0とPF1も一旦ピン出すようにPCB描いてたんだが、PCF8574x4でGPIOx4普通にあるんでI2Cモジュールのエミュレートが必要になるSTM32のピンを単純なGPIO用として出す必要はないと思ったんでPF0とPF1はNCにした。
外部クリスタル用のパッドを設けても良かったかもしれないが、PF0とPF1は電源ピンに近くてなかなか厳しいし使うことはなさそうだし・・・
配線的にはSTM32F042KをCH32V203Kに置き換え可能と思うんで、STM32でうまく行ったらCH32買ってみたい。
実際i2c-starはSTM32F1とSTM32F4しかコードがないんでそのままじゃ使えない。
i2c-starをSTM32F0に対応させる。
i2c-starはlibopencm3に加えてlibrfnってモジュールを使っててlibrfnの方でビルドエラーが出て原因究明に難があった。
本家のI2C-Tiny-USBのコードを見てSTM32F0に移植する。
本家のI2C-Tiny-USBはUSB機能のないマイコンで無理やりUSBを実装してるんでlibopencm3などのAPIで行うように移植するのは難易度が高そう。
低レベル層でやってるから通信内容知るのはわかりやすいかも?
I2C-Pico-USBを見ながらSTM32F0に移植する。
I2C-Pico-USBはTinyUSBってのでUSB機能を実装しているがこれはSTM32F0にも対応してるとか。
だが、Raspberry Pi PicoはI2Cが0バイトでデータ送信できないとかでBit-BangingでI2C部分をやってるらしい。
i2c-starをSTM32F0に対応させるよりは簡単に思えた。
もう一個i2c-stm32-usbってのみっけて、これはI2C-Tiny-USBがGPIO機能を持ってないからってI2C-Tiny-USBではなくCP2112をエミュレートしてるらしく、機能が多いからかコード量多かった。
で、GoogleじゃなくてChatGPTにも相談してみたんだがlibopencm3だけで作れそうな感じ。
まだ完成してないがmainから直接呼び出す関数は少ないしlibopencm3は公式リファレンスもあるから理解しやすそうなコードだった。
ハードの方は、
.kicad_sch
.kicad_pcb
これなんだが、JLCPCBとLCSCで同梱して送料無料で部品購入できるってGoogleに言われてたんでPCBデータをJLCPCBにアップした後にLCSCで不足部品を探してたんだが、
当初5Vから3.3Vへの降圧にSY8113BADCを使おうとしてたんだがGoogleに0805のインダクタじゃダメ言われて、TLV62565なら0805のインダクタでいけるみたいに言われて降圧ICの方を変更することにしてTLV62568にした。
でインダクタの方は0805のにしたけど定格電量結構大きいから最初のSY8113BADCでもいけたと思う・・・
まあ、SY8113BADCよりTLV62568の方が周辺部品も少なくて済むんで適切だったと思う。
が、問題はmicrousbコネクタがシンボルだとシールドのピン番号がSHになってるんだが、拾ってきたフットプリントはパッド番号が6になってた。
で、パッドの接続ネットをGNDに変えてたんだが、何度か回路図の更新して最終的にJLCPCBに発注する際にコネクタのシールドをGNDに接続するの忘れた状態で発注しちゃった・・・
今度からはこういうミスしないようにPCBエディタでネットを接続するんじゃなくてフットプリントの方を編集するようにする・・・
JLCPCBとLCSCの同梱は結局できなくて、Googleに決済してから連絡でも同梱できるとか言われて言われたとおりにしたら一旦ストップされることになったから部品届くのが遅れることになった・・・
PCF8574は300mil幅で2x4のピンヘッダを2.54mm間隔で並べた幅に置くのが厳しかったんだけど、PCF8574の互換品に150milのがあって本家よりも安いくらいだったのでそれ使うつもりで一旦PCB描いてたんだが、
Aliexpressのクーポン適用のためになにか追加購入する必要があった際に150milと300milの件忘れててAliexpressで300mil幅のPCF8574を購入しちゃった。
なので300mil幅のPCF8574を使うようにPCB描き直したんだが、ちょっとずらして裏配線すれば問題なかった感じ。
4隅にm3ネジ穴開けてアルミ板でサンドイッチする計画。
ネジ穴付近の板が細くならないように、右上と左上にUSBコネクタとスライドスイッチを置いて、下側にはGPIOを32ピン出してスペースがないんで両サイドのヘッダーピンをできるだけ上にずらした。
STM32F042KとPCF8574x4にTLV62568のせてまだ空き面積があるのと、ADCはピンヘッダを10ピン出すんだが使い道がないので、
TLV9062を1個乗せてADC2ピン分を1.65V中心の波形が見れるオシロスコープ的にすることにした。
Googleの計算だと-46Vから+46Vくらいまでは壊れないぽい。
PCF8574は5Vと3.3Vをジャンパピンで切り替えれるようにしてSTM32のBOOT0はスライドスイッチ。
PCF8574のアドレスはA0,A1は固定で1ずつずらしてA2はジャンパピンで切り替えれるように。
ADC以外はI2C,UART,SPI,SWDのピンをつける。
PCF8574のINTはSTM32のPA8に接続するが、I2C-Tiny-USBには自分自身がI2Cデバイスになる機能はないんで、I2C-Tiny-USBの機能に加えて仮想デバイスをぶら下げられないかなと思ってる。
仮想デバイスをぶら下げるならGPIOはPCF8574にすると思うが、ADCのピンもLTC2301かなんかをエミュレートしてUSBケーブル1本で見れるようにしたいところ・・・
STM32にはRTCもついてるからRTCモジュールにすることも可能と思うが、PCにはそもそもRTC機能がついててNTPもできるから明らかに要らない。
PF0とPF1も一旦ピン出すようにPCB描いてたんだが、PCF8574x4でGPIOx4普通にあるんでI2Cモジュールのエミュレートが必要になるSTM32のピンを単純なGPIO用として出す必要はないと思ったんでPF0とPF1はNCにした。
外部クリスタル用のパッドを設けても良かったかもしれないが、PF0とPF1は電源ピンに近くてなかなか厳しいし使うことはなさそうだし・・・
配線的にはSTM32F042KをCH32V203Kに置き換え可能と思うんで、STM32でうまく行ったらCH32買ってみたい。