ラベル arduino の投稿を表示しています。 すべての投稿を表示
ラベル arduino の投稿を表示しています。 すべての投稿を表示

2026年6月28日日曜日

arduino nanoにおいて、+5VとVUSBがダイオードで結合されています.もしVINとVUSBを同時に供給したら、+5VのレギュレータICが損傷しませんか?

arduinoに対してかれこれ30年ぐらい抱いている疑問があります.

電源のコンフィグについてです.
1)arduinoを外部電源VINで動かす  (2は無い)
2)arduinoをUSBの5Vで動かす  (1は無い)
3)12同時接続の可能性がある

↓arduino基板で1と2を適宜切り替える回路はこうなっています.shottkey Dで+5VとVUSBが自動選択される.なんかアバウトな回路だなぁと思っています.
いま3で使いたい.VINに6Vを供給し、同時にVUSBに5Vが供給される.
その条件でなら、shottkeyによってVUSBがブロックされ、専らLM1117の作る5Vでarduinoは円満に動く.

わたしの懸念点は、VUSBがLM1117を焼くんじゃないのか?

AIに問い合わせると「平気、平気、大丈夫ですよ」という回答.信じてよいのだろうか?

もしものハナシ、
PCがUSBに5.5Vを供給したらどうなるか? →VUSBがLM1117を焼く
つまりVUSBが(5+shottkeyのVf)を超えたら辺りが全焼するです.

規格から考えてみる.
・LM1117 datasheetから最小4.95V
・USB規格の最大は5.25V
・規格から高低差が0.3Vになることがあり得る
・0.3VをshottkeyのVfでブロックできなかったら炎上
・一般的にshottkeyのVfは0.2Vとも0.3Vとも0.4Vとも言われる
・Vfは指数関数なのでビシッと何ボルトであると言える筋合いのものではない

↓simってみたところ、shottkeyが軽く開いてるようでVUSBから120mAがダダ洩れしている.
↓Vfって温度が下がると小さくなるんだと思うんでsimってみたらイメージと逆だった.60℃でVUSBのダダ洩れが330mAに増えた.

結論:arduinoにVINとUSBからダブル電源供給するのは絶対安全とは言い難い

arduinoのダブル電源供給問題に対して昔からわたしがやってきた対処はこうでした.
正しかったかなと思ったにょ.

パターン1: VINオンリー
・shottkeyを外す =VUSBを切断する

パターン2: VUSBオンリー
・VINに何も接続しない   ←考えてみるとよく動いてるなこれ

パターン3: +5Vに外部から5Vを供給する
・LM1117を外す =VINを切断する
・shottkeyを外す =VUSBを切断する

パターン4: VUSBとVINの同時供給
・無理というか危ないのでやらない!

かしこ

2024年8月7日水曜日

spartan3をCPUから「slave serial mode」でconfigする(8)設計資料

本日は最終回です.XILINX FPGA slave serial configの設計資料をupします.

なお、全て免責としまーす!

ハンダづけ
ハンダづけが下手なので、0.5mm pitchだとフラックスを大量に使用してハンダづけします.ベタベタのフラックスを除去するのにアルコールで超音波洗浄です.

基板の全体
2枚の基板から成ります.
左のはFPGA config機能です.
右のはFPGA XC3S50が載っています.SPARTAN3の小さいものです.

左の基板  回路図pdf  gerber(zip)
USB COM機能のためFT232を使います.
CPUはSTM32C011F4P6です.FLASH 16kB、RAM 6kB
FPGA config dataを格納するのはserial FLASH W25Q32です.32Mbit

右の基板  回路図pdf  gerber(zip)
XC3S50の他に、裏面に3.3V/2.5V/1.2Vのreguratorがあります.

左右の接続
FPGAのconfig信号をコネクタに引き出しています.
ただし、この3つはコネクタに結線せず、固定したりNCしたりで済ませました.
 M[2:0]=111
 HSWAP=0
 DOUT 不使用
左基板には5Vの配線が無いのでjumper改修で追加しています.この5VはUSB bus powerを、FPGAの電源として供給するものです.

やってることはこんなです.
 ・PCとUSB COMで接続する(9600bps)
 ・PC上のxxx.binファイルを受信したらserial FLASHに書く=config data
 ・serial FLASH上のconfig dataをFPGAへ流し込む
 ・PCからコマンドを受けて処理する

XILINX ISE でxxx.binを作る方法はこちらに書きました.

基本の使い方
1)USBでPCと接続する
2)PCのterminal softを起動、COM PORTにシリアル接続する 9600bps
3)xxx.binをserial FLASH W25Q32に焼くには、「f リターンキー」を押す
4)terminalに表示が出る.
   flash write mode. waiting for transferring bin in 20Sec
5)20秒以内にxxx.binをterminal softからバイナリ送信する
6)しばらく待つと書き込み終了する (FLASH先頭から書く)
7)FPGA configするには「w リターンキー」を押す
8)5秒ぐらいでconfig完了する

その他のコマンド
「e リターンキー」    FLASH全域erase
「r リターンキー」    FLASHダンプ (アドレスtopとアクセス長はaとlで設定した値)
「d リターンキー」    binaryダンプ/characterダンプの切り替え
「a 数値 リターンキー」 FLASHアクセスアドレスtop
「l 数値 リターンキー」 FLASHアクセス長BYTE
「q リターンキー」    アドレスとアクセス長を表示する
「s リターンキー」    FLASH上の非ゼロデータ末尾を検索する

source code
PCcommand.c
コマンド処理いろいろ.
USB COM→UART受信はHAL_UART_RxCpltCallback()というcall backで1byteずつ受信してbufferに積みます.
FLASH焼きの際は、PCからのデータが256byte貯まったらFLASHの先頭から焼きます.なお、bufferを2本用意して書く読むを切り替えて、書く読むが衝突しないようにしていますので、programの可読性が悪いです.

FPGAWrite.c
FLASH上のxxx.binをFPGAへ転送する関数いろいろ.
PROGB,INITB,DONEの制御はSPARTAN3のdatasheetを読むと書いてあります.
FLASHから256byteをreadして、FPGAへシリアル転送するのloop.
シリアル転送をFLASHの先頭から始めます.
ならばシリアル転送終了アドレスはどうするかというと、searchBin.cであらかじめ非ゼロデータのボトムアドレスを探索しておいて、そこで打ち切ります.

searchBin.c
FLASH上の非ゼロデータのボトムアドレスを探します.

portRW.c
IO portの読み書きをする下位関数いろいろ.

W25Q32FV.c
FLASHを制御する関数いろいろ.

UART.c
UART→USB COMへ送信する関数いろいろ.
内部状態の表示に使います.

TIMINT.c
TIMER割り込みからcallされる関数いろいろ.
hardwareでこうゆう割り込みをセットしています.
 TIM14 10mSec割り込み
 TIM16 100mSec割り込み
 TIM17 1000mSec割り込み
1000mSec割り込みで、fコマンドのファイル転送待ち時間を管理しています.

3Dプリンタで作る台座
3DCADファイル   (DesignSparkMechanical)

あらすじだけですみません、以上とします.good luck!


かしこ

2024年7月29日月曜日

spartan3をCPUから「slave serial mode」でconfigする(7)CPU内蔵FLASH不足

codeをArduino→STM32C011へ移植しました.コピーしてbuildが通るとこまでですけど.debugはこれからですけど.

STM32C011F4P6の内蔵FLASHは16kBです.これに収まらなくて四苦八苦しちゃった.
Arduinoは32kBなので、このSTM32はFLASH小さい.RAMは6kBとそれなりなので嬉しいんですが、、、FLASHはArduinoのたったの半分とは厳しい・・・
     Arduino STM32C011F4P6
 FLASH  32kB    16kB
 RAM   2kB     6kB

同じ機能を実装してbuildしたbinary sizeが、Arduino 11kB、STM32 13kB となったので、ほぼ同じではありますが、STM32はcode削減努力をやってこれです.code削減せずにbuildしたら24kBにもなってしまって死にかかりました.

code削減はなにをやったかというと、
 1)debug mode → release modeに変更
 2)build optionでsize optimize
 3)sprintf()を使わなくする
 4)atol(),atoi(),itoa()などを使わなくする

HAL driverが巨大で遅いというのは定説ですが、HALを使わなくするのはやってません.

6へ   8へ

かしこ

2024年7月28日日曜日

spartan3をCPUから「slave serial mode」でconfigする(6)cast間違い

回路設計してますか?
本件は1ヶ月ぶりぐらいのupdateです.

「XILINX spartan3をCPUからconfigする」の続きです.前回で円満に動作確認できたのですが、STM32C011F4P6(秋月で¥160)で作り直そうと思います.
SPECはこんなもの、
 ARM_Cortex-M0+  48MHz
 内部FLASH 16kB
 内部RAM 6kB

↓前回の試作物.左がspartan3、右がArduino+外部FLASHによるconfig回路.spartan3へ向けてserial dataをトロトロと流し込む役割です.

↓ほいでもってこれがSTM32で作り直してる基板.FT232+STM32C011F4P6+W25Q32から成ります.W25Q32は未ハンダです.pin pitch 0.65mmなのでハンダランドを長くして手ハンダをやり易くしてます.実装機向けランドだと手ハンダ難しいです.
↓STM32C011F4P6はたった20pinなのでほとんど埋まってしまいます.

まずはUSB COMを動かそうとしたのですが、化けててダメでした.
いろいろ調べたけど変なところはありません.
UART送信するところを見たら、「うっ、これはイカン!」、どこをaddressしてるか判ったもんじゃない.
  HAL_UART_Transmit(&huart1, (const uint8_t)"hirasaka ", 9, 100);
正しくはこうですね.
  HAL_UART_Transmit(&huart1, (const uint8_t*)"hirasaka ", 9, 100);

懺悔ちゃん

5へ   7へ

かしこ

2024年6月24日月曜日

spartan3をCPUから「slave serial mode」でconfigする(5)

XC3S50-4VQ100Cのconfigを自分でやる件です.(config ROMを使わずに)

今回は、FLASH→FPGAの流れについてです.

FPGA XC3S50 の回路図はこちらです.
config信号を配線したコネクタがこれです.
M[2:0]=0b111、SWAP=0にハンダで固定しました.DOUTは使いません.
それ以外の信号をArduino側回路図に接続して回路は出来上がりです.
↓config信号の概念図はこれです.

2回目でも書きましたが、config信号の意味を再掲します.
HSWAP  in     config中は0にする、あらゆるpinを内部pullupする役割
M[2:0] in     slave serial modeにするには111にする
CCLK   in     serial clock
DIN    in     serial data、LSB 1stで入れる
PROG_B in     config開始のゴング、0でconfig開始.すぐ1に戻す
DOUT   out    serial data出力、ここでは使わない
INIT_B inout  PROG_B直後は0、config準備が整ったら1になる
DONE   inout  config中0、config終了したら1

CPUが制御するのはCCLK,DIN,PROG_B,INIT_B,DONEの5本です.

CPU制御をポエム風に語りますとこんな感じ.

①半田付けで固定してしまうpin
 M[2:0]=0b111
 HSWAP=0

②CPU起動時初期設定
 PROG_B=1
 CCLK=1

③開始のゴング
 PROG_B=0 → 1mSec wait → PROG_B=1

④INIT_B=1になるまでpoling wait

⑤FLASHの先頭から順にbit serialで1byteずつLSB 1stで出す(DIN,CCLKへ)
 ただし、FLASH上のconfig data(54kB)よりも256byte多めに出す
 (この理由は、FPGAがconfig後に余分なCCLKを要するため)

⑥ ⑤のbyte送出毎にDONEをpolingする.DONE=0なら⑤へ

⑦ DONE=1につき終了

ーーーー
以下はsourceの説明です.

Arduino sourceを置きます(zip)

おなじみのsetup()で、こんなことをやっています.
  searchBin();
  dispStatus();
  FPGAWrite();

searchBin()はFLASHのbottom addressからゼロ番地へ向かって非FFhが現れるaddressを探します.消去済FLASHはFFhになります.この操作の理由は、.binのサイズが正確にはわからないので、現物のサイズを調査するため.
変数dataLenに.binサイズを代入しますが、サイズを+256しておきます..binを全部FPGAに与えた後に追加のclockが必要なのでその対応です.

dispStatus()は、addressなどの表示です.表示するだけ.

FPGAWrite()がconfigの本体.やってる事は上に書いたポエム風そのものです.注意すべきはLSB 1stってとこぐらいかな.FPGAへ流し込む量は変数dataLenが所持しています.

詳しくはsourceを見てちょ

追記:ArduinoからSTM32C011に移植します.プリント基板を作ります.

4へ    6へ

かしこ

spartan3をCPUから「slave serial mode」でconfigする(4)

XC3S50-4VQ100Cのconfigを自分でやる件です.(config ROMを使わずに)

前回は.binの作り方を説明しました.

作業手順的に、次にやるのはSerial FLASH W25Q32に.binを焼く作業です.HDD上の.binをFLASHの先頭からそのまま書きます.
↓現物はこんなです.FLASHはarduinoの下に隠れています.

↓回路図(pdf) Arduino nanoとW25Q32の部分だけです.上の現物写真の右側の基板.to FPGAの先にFPGA基板を取り付けます.FPGAの回路図は次回公開します.

FLASH焼き動作の骨子はこうなってます.
・ArduinoのUSB(COM port)でPCへ接続する
・PCはterminal softのTeraTermをつかう
・TeraTermに.binをbinary送信させる
・Arduinoは受信した.binを256bytes貯まった都度W25Q32にpage writeする
・ArduinoはFLASHを消去したり、FLASHをdumpする機能も持つ

もう少し細かいこと.受信bufferについて.
・256byteの受信bufferを2本用意して交互に切り替えて使う
・COM portて届いたdataを受信bufferに積み積みする
・256byte貯まったらFLASHへpage writeする
・FLASHの256byte page writeに要する時間は2mSec(実測)
・PCとCOM portの接続速度は9600bpsにする
・9600bpsで256byte受信するには250mSecぐらいかかる
・250mSec >> 2mSec なのでFLASH page writeが邪魔されない

Arduino sourceを置きます(zip)

FLASHを焼く操作はこうします.
1)TeraTermで「e」と打つ =FLASH全域消去
2)TeraTermで「f」と打つ =.binをFLASHに焼く
3)20秒以内に.binをバイナリ送信する
4)2分ぐらい待つと終わる

ーーーー
以下はsourceの簡単な説明.

PCコマンドの処理は、いつものloop関数からPCcommand()を読んでます.
void loop() {
  PCcommand();
}

PCcommand()の中で各種コマンド分岐します.fの場合は、、、
switch(c[0]){
  case 'f': // flash write
    Serial.print("flash write mode. .........bin in 20Sec\n");
    mode='f';
    bufsel = 0;  2本のbufferの切り替え
    fileptr = 0;  .binの先頭からのbyte counter
    TIM2cnt_filetrans_start_timeout=20; // 20Sec timer
    break;

flashWrite()で.bin受信とFLASH焼きをやります.
やってることは、256byte溜まったらbuffer切り替えしてFLASHに焼きます.
.bin file末尾では半端なサイズがbufferに残ります.
そこで受信が停まって10秒待ってtimeoutしたら、残をFLASH焼きします.
詳しくはsourceを見てちょ.

ーーーー
次の話題はFLASH W25Q32のコマンドについて.

大雑把にこの3種類の形式です.
 コマンド       例:全域消去
 コマンド+データ   例:status read
 コマンド+アドレス+データ  例:read/write

よく使うコマンドは、、、
 #define WR_EN   6
 #define CHIP_ERASE    0xC7
 #define PAGE_PROG    2
 #define RD_DATA    3

page writeはこんな風にします.
WEN→CS→write command→A[23:0]→data[7:0]→xCS→wait busy
void W25Q_writePage(long adrs, byte *data, int length){
  W25Q_command(WR_EN,0); // write enable command
  digitalWrite(slaveSelectPin, LOW);
  SPI.transfer(PAGE_PROG); // page write command
  SPI.transfer(adrs>>16);
  SPI.transfer(adrs>>8);
  SPI.transfer(adrs);
  byte *d;
  d = data;
  for(int i=0; i<length; i++)  SPI.transfer(*d++);
  digitalWrite(slaveSelectPin, HIGH);
  W25Q_waitBusy(); // loop during busy
}

全域消去はこんなです.
WEN→CS→erase command→xCS→wait busy
void W25Q_eraseChip(void){
  W25Q_command(WR_EN,0); // write enable
  digitalWrite(slaveSelectPin, LOW);
  SPI.transfer(CHIP_ERASE);
  digitalWrite(slaveSelectPin, HIGH);
  W25Q_waitBusy(); // loop during busy
}

詳しくはsourceを見てちょ.

説明ってこんなところかな.今朝はここまでにしとうございます.

3へ    5へ

かしこ

2024年6月22日土曜日

spartan3をCPUから「slave serial mode」でconfigする(3)

今回は、Xilinx ISEでxxx.binファイルを生成してその中身を少し見ます.

ISEでフツーにbuildして生成されるのは、xxx.bitだけです.これをiMPACTでtarget FPGAへdownloadすれば動きますけど電源切ると消えちゃいます.

そこでconfig ROMに焼くのですが、必要なのはxxx.binです.binはFPGAへserialで入れてやるbit streamそのものであるらしいです.(やってみてそうだと確信した)

まずはiMPACTでxxx.binをどうやったら作れるのかを説明します.bit→binへの変換です.

↓iMPACTを起動してNew Project
↓Prerare a PROM File
↓ここが設定のめんどくさいところ ⑦重要です
↓ファイルを求めてきます
↓すでに出来ているxxx.bitを選ぶ
↓他にもPROMに置くfileはありますか?と聞かれるのでNo
↓さらに確認、めんどくさい
↓iMPACT画面はこうなります.Generate File...をクリック
↓一瞬で終了
↓作業フォルダにuntitled.binが出来ました

ーーーー
このbinをbinaryで覗いてみます

中身はほとんどゼロでして、先頭にいろいろあります.
datasheetにはこのbinの解説が少しだけ書かれています.

1行目の 5599AA66 というのがミソでして AA995566 がspartan3の同期wordなのだそうです.でも違いますよね.5599AA66をbyte毎にbit逆順にするとAA995566になります.

加えまして、その近所にXC3S50を示す 140c093 が在るはずです.見当たらないのでbyte毎にbit逆順にしてみると、800203C9 になるのでこれを探すと、在りません.代わりに3行目に 80020BC9 があります.これかなと思います.

疑問はありますが、xxx.binを使えばspartan3をconfigできるのは事実です.

2へ     4へ

かしこ

2024年6月21日金曜日

spartan3をCPUから「slave serial mode」でconfigする(2)

spartan3をCPUから「slave serial mode」でconfigしてみます.
前回の続報です.

まずは全体像の説明から.

2つの手順から成ります.

手順1:FLASHに焼く
PCのISEでlogic開発は済ませておきます.
xxx.binがFPGAのconfig dataです.
不揮発性のSerial FLASHにxxx.binを焼く.
手順2:FPGAをconfigする
FLASH→FPGAへserialでトロトロとconfig dataを流し込んでやります.
FPGAのinterfaceがxilinx独自なのでやってみなくちゃわからない.

CPUにはArduino nanoを使います.
Serial FLASHはW25Q32というもので32Mbit品だったかな.つまり4MBです.
xxx.binは55kBぐらいですから4MBも要りませんが手持ちがこれなんで.
FPGAは中華通販で入手したXC3S50-4VQ100Cです.
以上がやりたいことの全体像です.

ーーーー
「手順1:FLASHに焼く」はこの投稿ではスルーします.

以下では「手順2:FPGAをconfigする」の動作確認を行います.

ーーーー
slave serial modeのconfigに使われるFPGAのpinについてdata sheetから抜き出します.
こんな結線になるんだそうです.

HSWAP in
あらゆるpinを内部pullupする役割
config中は0にすること
通常使用時はdon't careと書かれているのでハンダで0固定にする

M[2:0] in
slave serial modeにするには111にする
ハンダで111固定にする

CCLK in
slave serial modeではserial clock入力になる

DIN in
serial data入力
やってみたところでは.binのLSB 1stで入れるのが正解

PROG_B in (外部pullup)
config開始のゴング
0にしたらconfig開始.すぐ1に戻す必要がある
open drainで駆動するのがオススメだってさ

DOUT out
serial data出力
マルチFPGAの際のディジーチェイン用かな、ここでは使わない

INIT_B inout (外部pullup)
PROG_Bを受けてFPGAが内部初期化してる間0が出力される
内部初期化が終わると1になる
通常使用時は1か0に固定するべきと書かれている

DONE inout (外部pullup)
config中0が出力される
config終了したら1が出力される

pinは以上.CPUが制御するのはCCLK,DIN,PROG_B,INIT_B,DONEの5本です.

ーーーー
これらをどのように制御すればいいのか?
ポエム風に語ります.

①半田付けで固定してしまうpin
 M[2:0]=0b111
 HSWAP=0

②CPU起動時初期設定
 PROG_B=1
 CCLK=1

③開始のゴング
 PROG_B=0 → 1mSec wait → PROG_B=1

④INIT_B=1になるまでpoling wait

⑤FLASHの先頭から順にbit serialで1byteずつLSB 1stで出す(DIN,CCLKへ)
 ただし、FLASH上のconfig data(54kB)よりも256byte多めに出す
 (この理由は、FPGAがconfig後に余分なCCLKを要するため)

⑥ ⑤のbyte送出毎にDONEをpolingする.DONE=0なら⑤へ

⑦ DONE=1につき終了

動きました.Lチカですけどね.

次回は設計資料を公開します.
Xilinx ISEで.bin fileを生成するやり方とか回路とかfirmwareとか.

1へ   3へ

かしこ

2024年6月19日水曜日

spartan3をCPUから「slave serial mode」でconfigする(1)

近頃GBCばっかりupしているのでたまにはエレキの話題でも.

ArduinoでFPGAをprogramming(ISPとも言うかも)しようとしています.

よろず信号を扱う時には、ArduinoかSTM32のようなCPUで処理したいとは思うのですが、速度等の事情でどうしてもhardwareで自走してもらわなくちゃ成立しない場面がちょくちょくあります.
たとえばパラシリだったりシリパラだったり、それの同期を検出したりするにはFPGAじゃないと務まりません.CPUのperipheralでやれる事は限度があるので、同期検出まではCPUじゃ出来かねる...

そうゆう時はFPGAを使います.FPGA基板を中華通販で探すわけですが、どうも近頃は使いやすい物が無いんです.以下その事情を...

↓2015年頃に$23ぐらいで出回っていたSpartan3E250の基板は好きで何枚か買いました.でもこれは今は見つかりません.Spartan3がディスコンとも聞きますし.
↓あと、Spartan6のこんなてんこ盛り基板もかつて在りまして、¥2700とかでした.spartan6ともなるとgate数が巨大すぎて使いきれないし、基板サイズが巨大で使い勝手は悪かったので2枚ぐらい買ってその後はあまり使ってません.HDMIで使いました.
この投稿を書いているのは2024年なわけですが、コロナ騒動で半導体価格が上がった後遺症でかspartan6基板の価格は¥7000超えてます.¥500足らずのCPUの補器として使うFPGAが¥7000じゃやる気になりません.
↓gate数は小さいですが、cycloneII EP2C5T144 のこれは時価¥3500以上してます.高価すぎる.ALTERAはIDEが苦手だしなぁ.
↓もっと小型でFFが72個のXC9572基板は¥1000ぐらいですけど、gate数が小さすぎます.

というわけで、、、FF数が1000個ぐらいで価格¥1000~2000ぐらいの基板が中華市場に無いんです.なんてこったい・・・

仕方がないので、お好みなFPGAプリント基板を自作するかぁと思い、config ROMのXCF02などを調べると、中華で¥2000などとクレイジーな価格になっています.これも原因はディスコンのせいみたいです.config ROM買えません~

config ROMが市場から消えてしまって皆さんどうしているのかというと、今じゃWINBONDなどのserial FLASHが¥50とかゴミのような価格で売られているので、これを使っているんですね.
.bitをFLASHに焼いておいて、起動時にCPUがFLASH→FPGAへ流し込むというやり方.
さらには、spartan3E以降のFPGAではCPUを介さずに、FPGA自身がserial FLASHからbinaryを読んで自分を焼く仕組みになっているみたいです.なるほど、みんなそれを使うわけだわ.

FLASHの問題はクリアしたとして、FPGAは何を使うか?

↓中華通販で使えそうなのがこれ.XC3S50-4VQ100CはSpartan3の小容量品です.
0.5mm pitch 100pinなのでなんとか手ハンダでやれるレベル.
5ヶ買って¥2800だったので、@¥560は許す.
小容量とはいえFFは1500個載っているので容量的にも十分.
↓FPGA単体のプリント基板は作りました.動作確認は済んでます.ただしこれだとFLASHは載せてないので電源切ったら消えちゃいます.

↓FLASHとCPUの機能はこちらの基板をprogramしてるところ.去年の暮に火入れした投稿ではFLASHへのアクセスを確認しただけだったので、機能を強化してるとこ.

動作確認が済んだら、ATMEGA168+W25Qxxxの基板を作ると思います.

FPGA configバイナリをATMEGA168やATMEGA328の内部FLASHには置けないと思っています.
ISE projectフォルダ内の.bitファイル →56kB
ATMEGA328 FLASH →32kB  容量足りないよねぇ


かしこ

2020年3月29日日曜日

arduinoで簡単オシロのご紹介

こんばんは.2020年4月期のアニメは期待作が無さそうに思っているヒラサカです.

いま、EZ-USBでDCCを実装中である.各部の波形をオシロで観測しつつ、DAC出力(Audio信号)もオシロで観測したい.するとオシロが1台じゃ足りない.USBオシロを買おうかなとAliexpressを探してみたりしたが、数千円の出費してまで欲しいわけでもない、購買意欲が微妙な状態だ.

そういう時にはArduinoで作ってしまえ、というわけで探したら良い物があったので以下にご紹介する.わたしは何も設計とかしてなくて、ただパクッて動かしてみただけだ.

こちらのページをパクらせてもらった.
同ページの下の方にDLリンクがあるのでDLする.

プログラムは2パートから成る.一つはArduinoに焼くオシロスコープ本体.もう一つはPC上で波形表示するプログラムである.

解凍してArduinoフォルダにコピーする.わたしの環境では、
C:\Users\hira\Documents\Arduino\oscilloscope
フォルダが2つある.ArduinoとProcessingという名前だ.ProcessingというのがPC波形表示プログラムであろうと想像がつく.

Processingフォルダを開くと、kit_scope.pdeというのだけしか入ってない.dataフォルダの下には画像ファイルがいるだけ..pdeってなんなのさ?である.
ちなみにkit_scope.pdeにはこんなcodeが書かれている.
final OscConfigOne osccfg[] = {
  new OscConfigOne(0, 0,  1000,    1,  50, 50),
  new OscConfigOne(1, 0,  1000,    1,  20, 20),
  new OscConfigOne(2, 0,  1000,    1,  10, 10),
  new OscConfigOne(3, 0,  1000,    1,   5,  5),
};

調べたところ、.pdeというのは、javaで動くscript言語のようなものなんだってさ.そんなのがあるなんて知らなかったよ.

こちらからDLしてprocessing IDEをインストする.kit_scope.pdeをprocessing IDEで開けるようになればよし.初めて見る画面だが、Arduino IDEと色が違うだけでなんか似ている.
processing IDEの左上の再生ボタンを押すと、COM port scanを永久に続けるようだ.

お馴染みのArduino IDEも開く.kit_scope.inoをスケッチ開きして、プリント基板に焼く.

COM port scanしていたprocessingがオシロのArduinoを見つけ次第、画面はこのように切り替わり、音声信号が表示される.すげー便利.Alliexpressに注文して1ヶ月待たされなくてよかったよ.

-------
ソフトウエアの運用について述べたが、ハード面のことにはまだ触れていない.

AdruinoのADCは、0~5Vのダイナミックレンジがあるらしい.

わたしが観測したいのはdigital信号ではなく、audio信号なのでDC2.5Vを中心とした交流波形を観測したいわけなので、少し外付け回路が必要になる.こんな回路で、ADC入力をDC2.5Vに固定してやるといい.こうすれば2.5Vを中心に振れるAC波形を観測できる.
なお、A1,A2はArduinoのピン名である.
カップリングの0.1uFは1uF変更した.
←取り付けたCR

追記:
リアル世界の人から仕組みを質問されたので追記しとく.
「ArduinoとPCの接続形態、及びADCデータがどのような形で流れているのか?」

物理的な接続形態はUSBケーブルである.Arduinoは、FLASH焼きのためにUSBケーブルでPCと接続する.そのUSB接続がそのままオシロでも流用される.

PCからArduinoがどう見えるのか? USBデバイスのCOM portに見える.Arduino基板上には、RS232-USB変換ICであるところの、FT232かそれに類するICが載っている.

したがって、PCとArduino間の通信プロトコルは、COM portによる9600bpsとか115200bpsのいつものアレである.FLASH焼きもオシロもCOMで通信する.オシロスコープでCOM portに流れているのはASCIIの電圧データっていうベタな仕様だよ.

かしこ