2024年8月10日土曜日

AVR128DB28でArduino(3)

 

進化した8bitAVRマイコン"AVR Dx"をArduinoにしてみる。Atmega328PのArduinoでリソースが足りない場合の選択肢としていんじゃないかなって。ArduinoUNOっぽいボードを作ってみる。

あれ?ユニバーサルとかブレッドボードとかでって言ってなかった?って思うよねー、、、いやーやっぱりそれらしいボードに載ったものもあってもいいやないか。でKiCADで作ってみた。
<方針>
部品はできるだけ秋月で買えるものにする
オリジナルと同じように電源がミックスされないような回路も入れる
ACアダプタから5V作るのはリニアレギュレータじゃなくDCDCにする
デジタルピン番号をUNO R3とできるだけ一致させる
1608より小さい部品は使わない(もう1005とかしんどいわけよ)
パスコンの選定は雑に済ます(アカンてわかってるんやけど)
で、こんな回路
AWはこんな感じ
3Dビューだと
KiCADの使い方とかは、ここでは説明しませんよ。世の中に結構ドキュメントもあるしチャレンジすればなんとなくできるようになると思う。ちなみにLANDはSamacsys(RSの手下?)からだいたいダウンロードできる。で、今回のやつが、うまくいくのかはわからない。仕事じゃないってのとFusionPCBが送料半額キャンペーン中なのでとりあえずトライするのが良いと思っている。まぁ多少の失敗はラインカットやらジャンパ線やらで何とかするもんです。

CADとかプリント基板設計とか回路設計者としては必ず必要な技術であると思うけど、実際は、外注したり、派遣さんに依頼したり、社内でも専門の人がいたり。それでいいのか?って思う(某社にいたときは全部自分でやってたので、今の会社に来たときはカルチャーショックだった)。プリント基板設計は必要な品質レベルがその使われ方によって大きく異なると思う。ちょっろっとデバイスの評価に使うだけってものを外注に出して市場に出すのと同じ品質で設計していてはトータルの製品設計としてはその費用・スピードで競争力を自ら捨てているのと同じ。まぁ残念なことです。
が、今は地震が来ないことだけを祈っています(―人―)


2024年8月8日木曜日

AVR128DB28でArduino(2)

 

進化した8bitAVRマイコン"AVR Dx"をArduinoにしてみる。Atmega328PのArduinoでリソースが足りない場合の選択肢としていんじゃないかなって。bootloaderを書き込むぜ。

では、前回見た資料に従って配線してみる。
こうなる。USB-Serialはいつもの秋月FT231Xモジュールです。ダイオードはなんでもいいっぽいので、うちになぜか大量にあって始末に困っている1N4148です。抵抗は470Ω(見りゃわかるって?)。Arduinoでポートを選択。うちの場合はLinuxなので/dev/ttyUSB0
で、Programmerを選択する。はじめてのUPDIなので安全そうなSerialUPDI - SLOW: 57600 baudにする。
そして、「Burn Bootloader」、、、あ、あれ?できちゃった、、、?
ログを見てみる。
  1. SerialUPDI
  2. UPDI programming for Arduino using a serial adapter
  3. Based on pymcuprog, with significant modifications
  4. By Quentin Bolsee and Spence Konde
  5. Version 1.3.0.3 - Jul 2023
  6. Using serial port /dev/ttyUSB0 at 57600 baud.
  7. Target: avr128db28
  8. Set fuses: ['0:0b00000000', '1:0x00', '2:0x00', '5:0b11001000', '6:0b00001100', '7:0x00', '8:0x01']
  9. Action: write
  10. File: /home/hoge/.arduino15/packages/DxCore/hardware/megaavr/1.5.11/bootloaders/hex/optiboot_128dx_ser0_alt_extr.hex
  11. Pinging device...
  12. Ping response: 1E970E
  13. Setting fuse 0x0=0x0
  14. Writing literal values...
  15. Verifying literal values...
  16. Action took 0.16s
  17. Setting fuse 0x1=0x0
  18. Writing literal values...
  19. Verifying literal values...
  20. Action took 0.16s
  21. Setting fuse 0x2=0x0
  22. Writing literal values...
  23. Verifying literal values...
  24. Action took 0.16s
  25. Setting fuse 0x5=0xc8
  26. Writing literal values...
  27. Verifying literal values...
  28. Action took 0.16s
  29. Setting fuse 0x6=0xc
  30. Writing literal values...
  31. Verifying literal values...
  32. Action took 0.16s
  33. Setting fuse 0x7=0x0
  34. Writing literal values...
  35. Verifying literal values...
  36. Action took 0.16s
  37. Setting fuse 0x8=0x1
  38. Writing literal values...
  39. Verifying literal values...
  40. Action took 0.16s
  41. Finished writing fuses.
  42. Chip/Bulk erase,
  43. Memory type eeprom is conditionally erased (depending upon EESAVE fuse setting)
  44. Memory type flash is always erased
  45. Memory type lockbits is always erased
  46. ...
  47. Erased.
  48. Action took 0.06s
  49. Writing from hex file...
  50. Writing flash...
  51. Writing flash...
  52. Action took 0.46s
  53. Verifying...
  54. Verify successful. Data in flash matches data in specified hex-file
  55. Action took 0.27s
FUSE書き込みとかもやってくれてそう。まじか、、、すごいやん。
では、回路を変更して、普通にUART/bootloader経由での書き込みをやってみる。
RSTピンが結構メンドクサイ位置にあって変なところを経由しているけど、まぁいつも通りの回路です。
で、こんな単純なのやってみます。
  1. #define LED_PIN (19)
  2. void setup() {
  3.   pinMode(LED_PIN, OUTPUT);
  4. }
  5. void loop() {
  6.   digitalWrite(LED_PIN, HIGH);
  7.   delay(500);
  8.   digitalWrite(LED_PIN, LOW);
  9.   delay(500);
  10. }
で、書き込み。
うまくいったようです。そしてLEDが点滅します。で、本当に16MHzで動いているかどうかロジアナで確認すると、
ぴったり1sになっています。動作中にセラロックを引っこ抜くとLED点滅が止まるので、期待通りになっています。ということで、いいぞAVR Dxです。

ところで、大地震の確率が高まっているらしい。どういうできるわけではないけど、起こらないように祈る(―人―)







2024年8月3日土曜日

AVR128DB28でArduino(1)

 

進化した8bitAVRマイコン"AVR Dx"をArduinoにしてみる。Atmega328PのArduinoでリソースが足りない場合の選択肢としていんじゃないかなって。

進化したArduinoといえば、Arduino UNO R4がある。こちらはRenesas RA4M1 (Arm® Cortex®-M4)が使われていて超リッチなんだけど、DIPパッケージ品がないので、ユニバーサル基板やブレッドボードでちょちょっとやりたいときにちょっと面倒。で、AVR Dxってのがあるのでこちらで試してみる。ちょちょっとやりたいときにそんなにリソースが必要になるんか?ってつっこんじゃうよねー、、、ほんと滅多にないけどたまにあるかもよ。

今回購入したのは秋月で売っているAVR128DB28(https://akizukidenshi.com/catalog/g/g118149/)。少々お高いけど、SRAMが16kBもある!ちなみに秋月では AVR64DD28ってのも扱っていて、こちらはAtmega328P-PUよりもお安い。用途によってはDDのほうがいいのかも(比較表はこちらhttps://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/Brochures/AVR-Microcontrollers-Peripheral-Integration-30010135.pdf)。

で、AVR DxをArduino化するのにDxCoreっていうbootloaderを作っている人がいるのでホント助かる。こちら(https://github.com/SpenceKonde/DxCore/tree/master)。これ作っているSpenceKondeさんって何者なんやろ。いろんなAVRマイコンのArduino bootloaderを作っていて、その情熱がすごすぎる。
そして、AtmelがMichrochipに買収されたときには、AVRがなくなるんやないかとか、もともとPICマイコンに対するMichrochipの方針がイマイチ気に入らんかったりで、ショックだったけど、古い(軽い)8bitマイコンもちゃんと製造だけじゃなく開発も続けているところがイイネ。まぁPICマイコンはあらゆる仕様が乱立していて今さら手を出すことはまずないと思うけど。
さて、SpenceKondeさんのgithubをみると、pinoutはこうなっているらしい。
で、UNO R3に使われるときのAtmega328Pのpinoutはこう。
くぅーぜんぜんちゃう( •᷄⌓•᷅ )

まずは環境を整える(これを先にやらないとわからないこともあるので)。ArduinoIDEにDxCoreボードマネジャを追加する。DxCoreのFilesのInstallation.mdによると、追加のボードマネジャのURLは
http://drazzy.com/package_drazzy.com_index.json
らしいので、こうなる。
で、ArduinoIDEのボードマネジャーからdxcoreを検索して、出てきたDxCoreをインストール。
で、ボードをDxCoreのAVR DB-series (Optiboot)にすると、とんでもなくたくさんのオプションが出てくる。
で、クロックを外付け16MHzクリスタルに変更する(クロック誤差にシビアなものを作る方が多い業界にいるので、内蔵オシレータはあまりやらない)。そして、Programmerのサブメニューを見て初めて気づく、、、
あぁ方式がICSPからUPDIってやつにかわったんや、、、対応しているライターはAtmelICE。こちらまぁまぁお高い。ちなみにpickit4もまぁまぁお高い。ってことは、SerialUPDIってやつに挑戦せんといかん。githubのreadme.mdのUPDI programmingってところを見てやる。SerialUPDI documentationってリンクをつつく。で、今回まずはブレッドボードで組むってのと、秋月のFT231Xモジュール(https://akizukidenshi.com/catalog/g/g106894/)にはボード上に抵抗がないってのでこちら
の構成で組んでいく。で、WindowsだとたぶんUPDI programmingってところに書いている通りにやればいいんだと思うんだけど、うちLinuxなので、、、

ちょっとゴールが遠そうなので一旦ここで筆をおくニャンカンキチ、、、カンキチさんまだ出願しているのかな?

だいぶさぼったんだけど、本当は先週くらいには取り掛かれる予定だった。部品の手配も早くできたはずと考えるとさらにもちっと早く取り掛かれるはずだった。いろいろ起こるもんですよ。言い訳。単にだらけていただけです。

2024年6月30日日曜日

クリスタル発振回路(1)

クリスタル発振回路をシミュレーションしてみる。

いまさら感があるけど、なんとなくやってみたくなった。最近は素子の加工精度が上がったことから基本波発振の発振子が普通になってきて、動けばだいたいOKなので、そんなに一所懸命やることもなくなった(昔はMHz以上からはオーバートーンで使うことが多くて、異常発振とかが多くの設計者を悩ませていたに違いない)昨今、、、まぁメモなんよ。こういうのできるとか、こういうのなんでやろとか、書いとくんよここに。
で、今回はたわいもない内容なのでngspiceを直で使うことにする(GUI苦手なんよねーGUIは右の人差し指に作業が集中するのでじじいにはこたえるんよ)。で、まずはインバーターをどうするか。通常は発振回路評価とかで74HCU04とかを使うわけで、この記述を探すっと、LTspiceにあるらしいじゃないか、、、いや、すばらしい。ここ(https://github.com/texane/power_inverter/tree/master/ltspice/logic/74hc)にあるので、ありがたく頂いてくる。
で、まずはインバーターとしてちゃんと動くことを確認する。
  1. * inverter_74hcu04.cir
  2. .title inverter_74hcu04
  3.  
  4. .include 74hc.lib
  5.  
  6. XU1 1 2 3 0 74HCU04 vcc1=3.3 speed1=1.0 tripdt1=1e-9
  7. VCC 3 0 DC 3.3
  8. VIN 4 0 PULSE ( 0 3.3 0 0 0 0.5ms 1ms 10)
  9. R1 2 0 1k
  10. R2 4 1 10k
  11.  
  12. .control
  13. tran 0.01ms 20ms
  14. plot v(1) v(2) v(4)
  15. .endc
  16. .end
まぁ、こんなかんじで。で、 ngspiceを起動して、
source inverter_74hcu04.cir
で、実行。すると、
となるので、インバーターとして動作していることがわかる。
で、どんな特性なのかいちおう調べておくってことで、パルスの代わりにPWLで三角波をいれることでリサージュっぽいものを見てみる。
  1. * char_74hcu04.cir
  2. .title char_74hcu04
  3.  
  4. .include 74hc.lib
  5.  
  6. XU1 1 2 3 0 74HCU04 vcc1=3.3 speed1=1.0 tripdt1=1e-9
  7. VCC 3 0 DC 3.3
  8. VIN 4 0 PWL(0 0 10ms 4 20ms 0)
  9. R1 2 0 1k
  10. R2 4 1 10k
  11.  
  12. .control
  13. tran 0.01ms 20ms
  14. plot v(1) v(2) v(4)
  15. .endc
  16. .end
まぁ、こういう特性のモデルらしい。
では、32.768kHzのクリスタルを発振させてみる。クリスタルの等価回路定数はあまり公開されていないので、実測する必要があるけど、EPSONは32.768kHzクリスタルの等価回路定数を公開しているので、これでやってみる。 まぁ、こんなかんじ。
  1. .title xtal_osc
  2. * xtal_osc_study_002.cir
  3.  
  4. .include 74hc.lib
  5.  
  6. XU1 1 2 5 0 74HCU04 vcc1=3.3 speed1=1.0 tripdt1=1e-9
  7. R2 1 2 10MEG
  8.  
  9. L1 1 3 2986.16
  10. C1 3 4 7.9e-15
  11. R1 4 2 40e3
  12. C2 1 2 1.5e-12
  13. C3 1 0 680e-12
  14. C4 2 0 680e-12
  15. VCC 5 0 DC 3.3
  16. .ic v(1)=3.3
  17. *.options abstol=1e-12
  18. *.options pivtol=1e-13
  19. *.options reltol=0.003
  20. *.options vntol=1e-6
  21. *.options chgtol=1e-14
  22. *.options trtol=7
  23.  
  24. .options abstol=1e-12
  25. .options pivtol=1e-13
  26. .options reltol=0.003
  27. .options vntol=1e-6
  28. .options chgtol=1e-14
  29. .options trtol=5
  30.  
  31. .control
  32. tran 10us 10000ms
  33. plot v(2) v(1)
  34. .endc
  35. .end
なんやけど、実は発振させるのにかなり苦労した。結局、負荷容量を実際に使用する値(10pF前後)よりもかなり大きくして、シミュレーション時間をとんでもなく長くしてやっと発振した。で、
こんなかんじ。現実は結構簡単に発振開始するけど、シミュレーションではなかなか難しい。でさらに、発振開始時間ってけっこう神のイカヅチ(.icで初期状態を入れているところ)によってかわる。高い電圧だと、早く発振開始する。発振開始時間って結局現物で繰り返し評価するしかないって現実をやっぱそうかーって受け入れる。が、もっと現実に近い発振開始時間にするにはどうしたらいいのか。
、、、メンドクサくなってきたので、今日はこのくらいにしておく。

2024年6月16日日曜日

Seleniumをpowershellから使う(2)

 

webページの操作を自動化できるSelenium。これをpowershellから使おうっていう試み。今回は、指定する要素をどうやって知ることができるのかってのを書いてみる。Seleniumの紹介ページってものすごーくたくさんあるけど、要素(element)の指定方法について詳しく書かれたものはないと思う。ていうか、そんなの常識?なのか?ってところに切り込んでみる。
例題として、SundayEngineerのページに自動的にコメントするスクリプトを書いてみる。
どのページにするかって言うと前回記事のこちら(https://sunday-engineer.jimdofree.com/2024/06/11/selenium%E3%82%92powershell%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86-1/)とする。まずは、chromeでそのページを開いてみる。そして、ctrl+shift+iを押す。そすっと、
こんな感じで、開発者用のウィンドウが現れる。で、今回自動入力したいコメント欄が見えるように下のほうまでスクロールして、その状態で、開発者ウィンドウのElementsタブで閉じているアイテムを開いたりなんだりしながらマウスを行ったり来たりさせると、Webページのほうが色が変わったりする。で、
こんな感じで、まずはコメントの「名前」ってところが
inputって要素でそのnameが"name"であり、idが"name11138124819"であるので、これのどっちかを使って指定できそうだなってわかる。
でコメント欄は
textareaって要素でそのnameが"comment"であり、idが"comment11138124819"。
で、送信ボタンは
inputって要素でそのnameが"送信"であり、idが"submit11138124819"で、valueが"送信"。ってことがわかる。
で、いろいろ調べると、send-sekeysだけじゃなくてsetypeってやつでもテキストを送れるらしいので、今回はこっちを使ってみる。-clearfirst使うと入力前のクリアが少し楽になるっぽいし(試したわけではない)。
そして、一旦、はまったのが、jimboのホームページって、cookieの同意をしないとまともに表示されないので、cookieの同意も押さないと入力できないってこと。
これも要素を調べて自動で押しちゃう。
で、idがcookie-settings-selectedってことで要素を選択してクリックすればよいのだろう。それと、(テキストを入力する)要素をクリックしてからじゃないと、入力できないことがある気が何となくする(てきとーすぎやろ)ので、setypeの前にclickしておくことにする。
そしてコードがこちら。
  1. write-output "hello selenium!"
  2. $binary_path="C:\Program Files\Google\Chrome\Application\chrome.exe"
  3. $driver_path="C:\Users\hoge\Documents\work\powershell\selenium_study\chromedriver-win64-125.0.6422.141"
  4. $start_url="https://sunday-engineer.jimdofree.com/2024/06/11/selenium%E3%82%92powershell%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86-1/"
  5. $driver=start-sechrome -binarypath $binary_path -webdriverdirectory $driver_path
  6. enter-seurl -url $start_url -driver $driver
  7. start-sleep -Milliseconds 300
  8. $element=find-seelement -driver $driver -Id 'cookie-settings-selected'
  9. send-seclick -element $element
  10. start-sleep -Milliseconds 100
  11. $element=find-seelement -driver $driver -Id 'name11138124819'
  12. setype -element $element -keys "ディグダ" -ClearFirst
  13. $element=find-seelement -driver $driver -Id 'comment11138124819'
  14. setype -element $element -keys "地面ポケモン" -ClearFirst
  15. $element=find-seelement -driver $driver -Id 'submit11138124819'
  16. send-seclick -element $element
  17. start-sleep 1
  18. stop-sedriver -driver $driver
  19. write-output "completed"
まぁこれでうまくいく。
ところで、このコードはsjisで保存してpowershellから実行するとうまくいくんだけど、vscodeから実行すると文字化けする。powershellの文字コード問題は、、、また別の機会に考える。c#だと、このへんが少し楽になりそうな(というのも情報が多いから)気がする。が、powershellはマイブームなので。

powershellからseleniumを使ってwebブラウザ操作を自動化するってなかなか面白いと思う。業務ソフトがwebブラウザベースなら取り組まない手はない。seleniumと格闘するのが正解か、人力でやり切るのが正解か、、、って悩んで躊躇することがあると思うけど、躊躇するくらいだったらやってみるのがいいと思う。

今回の例題を誰かがそのまま試して、たくさんのコメント(しかも文字化けしているのもあったり)が来たとしたらまじうけるー