アルドウィーノを使った
オープンソース、オープンハードの
ローコストECU
テージのECUが壊れているみたいなので
Speeduinoに装換します。
その13:ハーネスの作製の続き
SMT32_megaCPUボード
2024年
7月21日
PCBWAYで作製したSTM32_megaの基板が深センから出荷されたとの連絡がきました。
![](tn-STM32_pcbway_deli.jpg)
マウザで購入の表面実装のDIPSWと470Ωの0.1%抵抗が到着しました。PSoC5LP評価ボードは送料調整用です。
![](tn_240721_5.jpg)
部品の内、Speeduino下基板の接続用ピンソケットの注文が抜けてけていたので秋月に発注しました。
![](tn-STM32_pinsocket.jpg)
7月23日
STM32_megaの続きです。秋月のピンソケットが到着しまた。左は表面実装の緑LEDです。
![](tn_240723_1.jpg)
部品、基板とも日本に来ています。26日までには揃う予定です
![](tn-fed_parts.jpg)
![](tn-fed_pcb.jpg)
Speeduino下基板の2枚目をデュアルホイール用に改造しています。赤枠が追加のコンパレータです。
![](tn_240723_2.jpg)
7月24日
STM32_megaの基板と部品が到着しました。予定より少し早かったです。
![](tn_240724_1.jpg)
![](tn_240724_3.jpg)
部品の検品中ですが、オペアンプの数を間違えて、数量が足らないです。他にも不足があるかもしれないので、後で一括で追加発注します。
![](tn_240724_2.jpg)
7月25日
STM32_megaボードの部品の実装を開始します。初めに、今回、一番小さい緑枠の集合抵抗からです。2mmx1mmに4素子入っています。ピッチは0.5mmです。後で、実体顕微鏡で半田の状態を確認します。
![](tn_240725_1.jpg)
![](tn-RN_10K_0402_4.jpg)
続いて、単品の抵抗/コンデンサは1608サイズで拡大鏡があれば付けられます。その後、スイッチ、SDカードスロット、CPU以外の半導体も実装しました。
![](tn_240725_2.jpg)
7月29日
STM32_megaの部品実装中ですが、部品不足の原因が分かりました。部品表をアップロード後、基板を3枚作るので、全ての部品数を3倍するところを間違えて、全ての部品が3個づつ発注してしまったのが原因でした。それでも主要部品以外の抵抗などMOQが50とか100なので多くの部品が多めに届いたということでした。不足分はマウザに発注済みです。
![](tn_240729_1.jpg)
STM32_megaで動かす準備として、ポートアサインを確認しています。左はinit.cppのコンフィギュレーション部です。これをコピーして、右のCALCに入れてテージ用設定との違いを確認します。
![](tn-init_cpp_F407.jpg)
![](tn-init_cpp_F407_calc.jpg)
マウザに発注してあった、不足分の部品は到着しています。
![](tn_240729_2.jpg)
7月31日
マウザの不足部品とオペアンプ、ロジック、CPU、コネクタの順にハンダ付けして部品実装完了しました。USBコネクタは下ボードと干渉するので実装しません。他にアナログ入力用のオペアンプも半分の2個のみ実装しました。CANも使う予定が無いので未実装です。また、USBーUARTのFTDIはSTM32のネイティブUSBを使ってファームのアップロードを行い、運用時はUARTのブルートゥースを使うので未実装です。
![](tn_240731_1.jpg)
USBコネクタの代わりはMEGAボードと同様に、半田面にアングルのピンヘッダを実装します。
![](tn_240731_2.jpg)
8月1日
STM32で動かす準備です。STM32F407の日本語リファレンスマニュアルがあるので、ブートモードについて少し勉強しておきます。
![](tn-F407_rm0090.jpg)
BOOT0ピンをHIGHにすると、ブートモードになり、内蔵されているシステムプログラムが走ります。システムプログラムは予め決まっている通信ポート(今回はUSB)をスキャンして通信を開始し、内蔵フラッシュにプログラムを書き込みます。今回のSTM32_megaボードのBOOT0スイッチはオルタネートなので、押しながら電源投入するか、リセットを解除する必要があります。
![](tn-F407_rm0090_boot1.jpg)
![](tn-F407_rm0090_boot2.jpg)
8月3日
STM32で動かす準備の続きです。STM32_mega基板がUSBデバイスとしてPCから認識されることを確認します。通常のUSBコネクタは気圧センサと干渉するため未実装で、代わりに裏側にアングルのピンヘッダが実装されています。
![](tn_240803_1.jpg)
BOOT0スイッチを押しながらPCにUSBケーブルを接続すると、デバイスマネージャにSTM32ブートローダが出現します。
![](tn-STM32_prg_dev_man.jpg)
STマイクロのフラッシュ書き込みツールを起動して、インターフェースのUSBを選択します。
![](tn-STM32_prg1.jpg)
USBのプロダクトIDとベンダID、固有シリアル番号が表示され、USB通信ができていることが確認できます。
![](tn-STM32_prg2.jpg)
コネクトボタンを押すと、コード領域のメモリダンプが表示され、FFが読み出されて、内部フラッシュが初期状態であることが確認できます。用意されているバイナリプログラムのダウンロードは行わず、USBの確認のみにします。3枚とも良好でした。
![](tn-STM32_prg3.jpg)
8月7日
STM32_megaはBMWの4輪用なので、init.cppの不要なポート設定をコメントアウトして、コンパイルしました。ワーニングが出るものの、正常終了します。
![](tn-stm32_VC_mod.jpg)
STM32CubeProgrammerでボードにプログラムを書き込みます。
![](tn-stm32_prg4.jpg)
PlatformIOでビルドされたバイナリを選択します。
![](tn-stm32_prg5.jpg)
正常に書き込みが終了しました。
![](tn-stm32_prg6.jpg)
電源を再投入するとハートビートLEDが点滅しているので、正しく書き込めていると思われます。LEDの制限抵抗は予め大きくしていたのですが、まだ明るいので更に大きくした方が良さそうです。元々、LEDはケースに入れると見えないです。
![](tn_240807_1.jpg)
早速、CPUボードをSTM32_megaボードに入れ替えてSpeeduinoを動かしてみます。まだ細かい所は未チェックですが、噴射、点火などの基本的な所は動いているようです。クリックすると約1.8Mバイトの動画をダウンロードします。
![](tn_240807_1m.jpg)
8月8日
STM32_megaとアルドウィーノMEGAの動作クロックはそれぞれ168MHzと8MHzで大きく違っています。双方ともRISCなので基本命令は1クロックで処理していると思われます。エンジンの回転数が上がると、ECUのプロセッサは忙しくなっていきます。TunerStudioに″Main loops per revolution″というシステムパラメータのゲージがあり、処理がどのくらい忙しいかを表示できます。それぞれ8000rpm(133Hz)で比べてみました。156対7となり、クロックの比率は21倍なので、ほぼ動作速度に合っています。左がSTM32_mega、右がアルドウィーノMEGAです。因みに、アルドウィーノMEGAの7は赤ゾーンになっています。プロジェクトを開始した1年前にアルドウィーノMEGAでは非力だと思い、Tennsyボードを使ったDropBearを調査しました。この時は既にCPUボードが入手不可で諦めた経緯がありました。
![](tn-STM32_loop_rev.jpg)
![](tn-ard_loop_rev.jpg)
8月10日
STM32_megaボードの動作確認を進めます。今回アナログ入力のオペアンプバッファは半分のみ実装しています。元々のSTM32_megaの回路は16入力ですが、今回使用するのは6入力です。
![](tn_240810_1.jpg)
O2センサの入力にA8を使っているので、ジャンパでA7に繋ぎ代えています。A5、A6、A7は未使用なので、オペアンプは半分実装でも問題ないです。
![](tn-STM32_analog.jpg)
エンジンエミュレータと繋いで各機能の動作確認をします。左上の赤枠がO2センサの代わりのスイッチで、0V、0.5V、1Vを出力します。その下はマップ選択スイッチです。実車では右ハンドル予備スイッチ
です。下げるとLOW(0V)になり、セカンダリマップが選択されます。中央下はブルートゥースモジュールでSTM32_megaでもUARTを使う
FTDI版をビルドすればブルートゥースでPCと通信できることを確認しました。
![](tn_240810_2.jpg)
エンジンエミュレータからの0.5VでO2センサのAFRゲージが緑枠のように理想空燃比になり、スイッチによりAFRが変化することを確認しました。
![](tn-STM32_AFR.jpg)
セカンダリマップの切替ポートをD24/LOWに設定します。動作確認は特定のマップ値をプライマリと異なる値にして選択を切り替え、噴射量が変わることを確認しました。
![](tn-STM32_Se_MAP.jpg)
LED輝度が高いので制限抵抗を大きくしました。5V電源は51KΩ、ハートビートLEDは43KΩに変更しました。元々は470Ωでした。アマゾンで購入の1608抵抗セットはEIA−96表記で分かりにくいです。
![](tn_240810_3.jpg)
8月11日
STM32_megaはボード上にマイクロSDスロットがあり、オンボードでSDカードへログが取れるはずです。ただし、ソースコードのコメントによると実験的に実装されているようです。また、アクセスは1ビットのSPIモードで行われます。Tennsyボードはフルの4ビットでアクセスできるようです。Speeduinoのフォーラムに質問したところ、無償版のTunerStudioでも、SDログが取れるそうです。現状はSDカードは認識されているものの、ログメニューにSDログの項目が出てこないです。
![](tn-SD_LOG.jpg)
ディゼーブルになっているメニューも出すオプションがありました。
![](tn-SD_LOG2.jpg)
SDログのメニューが出てきますが、依然としてグレーアウトしています。引き続きフォーラムでやり取りしてみます。
![](tn-SD_LOG3.jpg)
8月12日
別の不具合としてMiniTerminalの動作がおかしいです。ヘルプやリアルデータの表示はされず、リターンの入力に対してタイムアウトと思われる応答を返します。唯一、’F’のプロトコルバージョンの応答”002”のみ正常表示されます。
![](tn-mini_term.jpg)
8月14日
TunerStudioのメニュ−はspeeduino.iniに記述されていて、PCにmainController.iniとしてコピーされて使用されている事がフォーラムで判明しました。そこで、強制的にSDメニューを出す設定に修正してみました。下の修正をするとTennsyボードと同じ設定になります。
![](tn-mainCtrl_ini_mod.jpg)
修正語、SDメニューが出てきました。
![](tn-TS_sdlog_menu.jpg)
SDをフォーマット後に再初期化ボタンを押すとSD Errorの表示が出ていますが、SDの容量は正しく表示されているので、全く動いていないわけでは無いようです。また、RTCもPCの時間を設定できて、電源再投入後に誤差が大きいですが、時間がバックアップされています。
![](tn-TS_sdlog_cons.jpg)
8月15日
STM32_megaはYouTubeのpazi88さんの動画で紹介されていて、質問を受け付けています。メッセージを介して質問をしたところ、現状で実験的な部分は無く、SDカードのログは正しく動作しているとのことでした。こちらのハードウェアかソフトウェアのビルド環境に問題があると思われます。初めに、TunerStudioのSDメニューが出ない原因を探ってみます。下のmainController.iniの赤枠が真にならないので、メニューが表示されないと思われます。赤枠の意味はpinLayoutをインデックスとしてboardHasRTC配列を参照したときに0より大きければ真になるということ思われます。ここでpinLayoutはボードの種別番号です。boardHasRTC配列はボードがRTCを持っているがのフラグの配列です。
![](tn-ini_HasRTC_1.jpg)
boardHasRTC配列の定義は8ビットの符号なしの128個の配列です。ボードの種別が128個あるという事です。
![](tn-ini_HasRTC_2.jpg)
以下でboardHasRTC配列に値が代入されています。スペース区切り(スペースの数もまちまち)で非常に見にくいです。
![](tn-ini_HasRTC_3.jpg)
以下でpinLayouts(ボード名)が定義されています。
![](tn-ini_pinlayout.jpg)
以下でpinLayoutsから、pinLayoutが定義されています。pinLayoutは何番目のボードかを表すインデックスです。
![](tn-ini_pinlayout2.jpg)
一旦、boardHasRTCとpinLayoutsを1行毎のテキストにして左側に、init.cpp内のboardIDとソースのコメントを右側に並べて表計算に入れてみました。pinLyaoutとboardIDが一致して、BMW PnP(SMT32_mega)のboardHasRTCが6になっていることがわかります。0より大きいので条件を満たしているはずですが、メニューは表示されません。不思議です。因みに、RTCを持っているのはSTM32_megaの他はTennsyを使ったDropBearとSTM32F407Bloackボードを使った3種のみです。
![](tn-HasRTC_calc.jpg)
8月16日
STM32_megaボードにはST−LINKのコネクタがあります。元となった
BlackボードにはJTAGが付いていたのですが、大きいので縮小して緑枠のSWD(Serial Wire Debug)が実装されています。JTAGの4線よ
り少ない2線式で、GNDが必要なので3線を接続する必要があります。Visual Studio CodeでもST−LINKを使ってデバッグできるようです。500円位で中国製のST−LINK2互換のケーブルが売っているので買ってみます。
![](tn_240816_1.jpg)
良く考えたら、手持ちのNucleo32のSTM32F401REボードにST−LINKが付いてるので、買わなくても良かったです。左の赤枠がST−LINKです。切り離せるように切り込みが入っています。
![](tn_240816_2.jpg)
STM32F401REの回路図を確認しておきます。ショートピンを解放すると、ターゲットと切り離されてST−LINKとして使えるようになっています。ボード上に6極のSWDのピンヘッダがあり、P2:SWCLK、P3:GND、P4:SWDIOを使えば良いようです。
![](tn-NC_F401_stlink.jpg)
8月18日
PlatformIOのデバッグ機能をSTM32F401REボードで確認しておきます。ST−LINKが付いているのでplatform.iniにdebug_tool=stlinkを追加する必要があります。
![](tn_240818_1.jpg)
Lチカをちょっと修正してローカル変数を追加しました。ちょっと動作が遅いですが、ブレーク後にカーソルを変数に近づけると緑枠のようにローカル変数の参照できました。また、再実行、各種ステップ実行も正常動作しました。STM32_megaのSDログの不具合もデバッグできそうです。
![](tn-local_val_watch.jpg)
8月20日
STM32_megaをSWDを使ってデバッグする準備です。SWDコネクタはケースに入れると裏側になってしまうので、3ピンのアングルコネクタを半田面に付け替えました。STM32F401RE評価ボードのショートピンを解放するとSWDデバッガ部がターゲットと切り離されてST−LINKとして使えるようになります。STM32_megaとSWDデバッガを接続するケーブルを作って接続します。
![](tn_240820_1.jpg)
初めに、Lチカで正しくデバッガが機能することを確認しましす。STM32_mega用のLチカプロジェクトを作ってボードをSTM32_megaの元になったblack_f407veに設定し、platform.iniにdebug_tool = stlinkの1行を追加しました。
![](tn-vsc_F407_ini.jpg)
STM32F401REボードの時と同様にブレーク、変数参照など、デバッガが正しく動くことを確認しました。
![](tn-vsc_F407_main.jpg)
8月21日
他の2枚のSTM32_megaボードもSWDコネクタを裏側に付け替えました。
![](tn_240821_1.jpg)
8月22日
VSCのデバッグ機能を勉強中です。赤枠のコンソールはCLIでコマンド入力できますが、そのままGDBでした。下の例ではdata変数のアドレスや中身が表示しています。ただし、1ライン編集コマンドは動かないようです。
![](tn-vsc_con_gdb.jpg)
8月24日
限定的ですが、SDログが取れるようになりました。以下、手順の箇条書きです。
1.PCでexFatでフォーマットしたSDカードを入れて、Speeduinoの電源投入します。
2.TunerStudioを起動します。この時点でSDコンソールのSDカードのトータルサイズは不明になります。予めPCでファイルをコピーしてもファイル名は表示されません。(この後、ログ開始ボタンを押すとSDエラーになります。一度、SDエラーになるとSpeeduinoの電源を切らない限りそのままです)
3.″Format SD Card″ボタンでSDカードをフォーマットします。
4.″Reset and wait″ボタンでSDカードの読み直しを行うと、SDカードのトータルサイズが正しく表示されます。
5.″Start SD Log″ボタンを押してログ開始して、停止すると、正常にログが取れ、ファイル名も表示されます。(ブート時からログ開始、外部端子によるログ開始はSDエラーになります。エンジン回転数によるログ開始は動作良好です。正しく取れたログはUSBを介してPCにダウンロード可能です。ただし、ブルートゥース経由では大きいファイルはエラーになりました。)
Speeduinoの電源を再投入すると、再びSDカードのトータルサイズが不明になり、フォーマットする以外にログを再度を取ることはできないようです。どうも、このダイアログでフォーマット後でないと、SDカード情報を正しく得られないのが原因のようです。なので、手順1は行なわなくてもログは取れます。
![](tn-ts_sd_log_ok.jpg)
![](back.gif)