[解決しました] STM32のADCで嵌った( MultiChannel 非連続 循環バッファ DMA TIM3駆動 )

DMAでADC開始した後にさらにADC開始をしていたために一回チャネルがずれてしまうことになったようだった。

pUart = &huart1;
HAL_ADC_MspInit(&hadc1);
HAL_UART_Receive_DMA(pUart, RdBuff, RCV_BUFF_SIZE); /* 受信開始 */
HAL_ADC_Start_DMA(&hadc1, ADC_BUFF, ADC_BUFF_SIZE*6);
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start(&hadc1);

修正にいたる過程では6chのうち一つだけを増やしてサンプリングしたいということなどの要望がありDMAを使うものと割り込み駆動をするものとでトライしたがままならずDMAのみでサンプルするチャネルを当該のみ10倍にすることにした。この際に、バッファ段数の動的切り替えなどをトライする過程でADCとDMAの停止・取り込み再開の検討をする中で上記の点について気づきなおすことでトリガ単位で一つのチャネルをADC取り込みがなされることを確認できた。

HAL_ADC_MspInit(&hadc1);
HAL_UART_Receive_DMA(pUart, RdBuff, RCV_BUFF_SIZE); /* 受信開始 */
HAL_TIM_Base_Start(&htim3);
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1, ADC_BUFF, ADC_BUFF_SIZE*15);

 

STM32のADCで嵌った( MultiChannel 循環バッファ DMA TIM3駆動 )

STM32F103を用いてADCを複数チャネル使い、常時計測を行い計測要求があった時点で過去10mS間の64回のデータを移動平均を取って処理報告制御するという処理を組んでいたのだが、STM32の持つDiscontinuousモードを用いて各チャネルを一回ずつ分割して順次TIM3のイベント周期で計測していくという形で計測をした。TIM3で25uS毎にイベントを出してADCが1chずつ計測していきDMAがサーキュラーバッファに格納していく。PA0にNucleoのGND/3.3Vを接続してバッファにどの様に入るのかを確認した。この使い方をすると、3.3V result on PA0 discontinuous modeの様にバッファの先頭に入るべきが2つ目に入る結果となった。

150uS周期に全てのチャネルを一気に計測するContinuous modeにして計測した結果は、3.3V result on PA0 continuous modeのようにバッファ先頭に入る形となった。期待値は、こちらなのでこのモードを用いる形にした。なぜズレるのかは不明だ。

ちなみにCubeMXは6.5.0でIDEはTrueStudio9.3.0でのケースなのでCubeMXでの問題があるのかも知れない。納入先の指定で開発環境が指定されているのでその範囲で対応と対策を試みて納品に漕ぎつけた。

 

STM32マイコンの評価ボードで開発支援

フリーランスでの仕事をいただくと実機前に適用マイコンに近い評価ボードで実装してみて開発環境に用いている。今回のマイコンはSTM32F103CBT6で128kBのFlashと20kBほどの組み込みマイコンではMidRangeのものだ。アーキテクチャの近いものとしてSTM32F103RBが搭載されているNucleo-103RBを用いて開発をしている。実際の機器との違いはピンアサインなど種々あるのだが、必要なI/Fについては割付先の違いくらいなのでコード生成機能(CubeMX)を用いて変更する程度で処理としては簡単に変更するのも最近のツール進化で楽になっている。

こうした評価ボード自体も、そのまま小規模なシステムに組み込んで用いてしまうことも多いのは昨今のチップ不足などもあり普通に見かける。評価開発にブレッドボードやArduino互換での端子なども含めて便利だからでもある。

ArduinoのAVRなどに比べるとARM-CoreM3が搭載されているこのボードは強力でクロックは72MHzまで高める事が出来るし内蔵の周辺機能も沢山集約されていてマイコンメーカーとして名をはせているST Micro社が世界に沢山出している人気マイコンでもある。

SPI/I2C/UART/ADC/TIMER/GPIOが多く搭載されているので、仕事でよくいただく測定器のファーム開発ではとても有用だし開発ボードにデバッガも組み込まれているのでUSBでPCと接続すればそのままソースコードをみつつ確認動作が出来る。USB一本でVCPチャネル経由でのアプリからの通信処理も確認できるので、主にシリアルコマンドで動作させることが多いのでこれも便利な一面だ。

さて、今回の開発では多くのアナログ信号のセンサ処理でフィードバックしたりセンサデバイスの線形補間処理も行って所要機能の精度確保を実現したりする必要もある。ADCからのデータ収集を一括して常時DMAで集信することも出来て処理としては過去のデータから移動平均を取るなどの作りこみも容易だ。ちなみに今回は6chを10ms周期にそれぞれ64回測定したものをオンデマンドで平均処理をして返送するという使い方だ。タイマから25uS周期でトリガを発生させて順次20uS程度の取り込み処理でADCがメモリ配列に取り込んでいく。DMAでサイクリックバッファに取り込むわけだ。

いろいろと稼働させていくと標準の動作クロック8MHzのままではリソース不足となりPLL設定のクロック割付にして高速にしていく。コアの速度・周辺クロックをそれぞれ調整して必要なものに変えていく。むやみに上げるとCMOS構造故に消費電力は周波数に比例して上昇する。USB接続で動作する構造のボードなので5Vから3.3Vのレギュレータを経て、300mA/100mAの二種の設定が出来るもののこれを越す場合には別途電源を供給する必要がある。USBハブの能力を上げてもこれは解決できない。しかしながら、このマイコン自体の消費電流からみても十分だということが分かった。ARM CortexM3クラスのマイコンなので消費電流は100mA程度に収まるらしい。拡張基板などを搭載したりする場合を除いては十分なものだろう。

今回は、デバッグ時点で応答しないという現象が多発して「Target not responding」というようなメッセージが出ていたのだが、評価基板の回路図と照らして間違ったIOの設定をしたりして端子同志がショートしたりといった事象が起きてしまったからのようだった。ともあれ。必要十分な低めのクロックを与えて消費電流を抑えることは必要だろう。コマンドとアイドルループ処理で凡そ0.6mS程度でソフトは回っているようだ。表示LEDにフリックを入れてオシロで確認できた。ADC以外にもシリアルコマンドの受信はDMAに任せていてコマンド処理ループ側で取り込みバッファからの読み出しで実行している。

測定器として接続されるのでホストからの処理を取りこぼしてはならないので、DMA任せにしているのは気楽だ。DACで出力した結果のADCを読みだす必要もあり、時間経過後に取り込んだADCバッファを移動平均処理したものを扱うには時間経過のポスト処理も必要だ。タイマ割り込みでの時間経過通知などで対応している。

 

ルンバみたいな掃除機を作りたい(3)

BT接続の沼にはまった。HC-05/HC-06ともに在庫が山の中から見つかり確認をするのだが、オリジナル品とコピー品の混在なのかも含めて曖昧で見えてきたことがあった。
PINコードの設定コマンドがエラーになり、PINコードの確認ではPINコードが6桁の表示になるのだった。
PINコード桁数については、さまざまなBT機器の中で4桁設定が占めていたのと以前の開発記録では4桁だったので混乱した。調べていくとBT規格の進展の中で6桁に代わっていったようでHC-05/HC-06の目指すIoT機器ではBLE規格などの時代になり6桁に移ったらしい。もっていたスマホアプリではPIN4桁設定だったのだが、新しい他のBT接続ターミナルアプリを調べると6桁に対応しているようで、スマホとの接続でも問題なく動作することが分かった。週末にS君が来た時にはBT子機となるHC-06タイプのモジュールを渡して彼のBT接続ターミナルソフトでも6桁設定で通信が出来た。
しかしながら、実際に彼がやりたい動作中にコマンド受信がしたいということには、別の困難があった。
彼が複数集めてきたスケッチはいわゆる単機能でloop関数の中でwhileループを組んでいるようなものばかりだったので、同時に処理をするためにはこうした処理をマージしなければならない。
S君とは哲学問答をするように、彼が実際にやりたいことを確認しつつそのためにはどうすべきかを解説する。
極端に言えば状態遷移図を彼に書いてもらうことだった。Arduino UNOの性能範囲で実現可能なハード設定にはなったので、この先は彼が設計をすすめることで出来てくるだろう。
彼には、時間管理も含めて指導したいので、予め帰りのバス時刻をめどにアラームをアレクサに頼んでおいた。普段ならばずるずるとやっていて母上に迎えに来てコールをしてからさらに続けるということだったが、アレクサがアラームした段階で進んできた内容を振り返りこのままでは、ここで出来ることも限られるので納得して今回は帰ってもらうことになった。小学生ではなくなり来月からは中学3年になるS君なのでそうした自立する姿も母上に見せられればと思う。年の離れた末っ子ぶりはわかるものの、逞しくなってほしい。

ルンバみたいな掃除機を作りたい(2)

サーバー構築が叶ったS君は、3年越しのプロジェクトであるルンバを再開した。超音波センサでの距離計測、衝突予防で後進しつつ方向転換をして走っていくというものだった。
Arduinoにモータードライバーを搭載して3つのモーターを駆動する。2つは田宮のギアメカだ。残り一つは塵取りに掻き込むブラシモーターの予定だ。
駆動系統を整理して超音波距離センサで方向転換が出来るのを確認して3年前の課題クリアと思いつつ、家に持ち帰ると動作がうまくないらしい。
単三電池二個を搭載したモーター用電源では、モータードライバーでのドロップも含めてモーター駆動には不十分のようだ。三個搭載の電源ボックスと交換して安定動作になった。
彼の思いとしてはリモコン制御でスタートストップをコントロールしたいということもあったらしく翌週には超音波センサを組み込んで動作させてみたけどモーター駆動中は、動作しないらしい。
距離センサとして用いる超音波センサと超音波リモコンで行う信号検出が性能的には厳しいらしいということがわかり、距離センサをi2Cと接続のToF距離センサに変えてみた。
IoTサポートをしてきた経験から検出精度は対象の差があるけれど近接範囲についての壁検知ならば動作しそうだと思い実験をしてもらった。超音波同様にまっすぐぶつかる場合には検知するのだが。いずれにしても二つないと検知できないケースもありそうだった。超音波リモコンの検出自体はするのだが、どうも検知したコードが化けてしまうようだ。モーター駆動でのノイズが影響するのかリモコン受信部のアースにノイズが回り込むこともあるようだ。並行処理をしつつの超音波リモコン機能はArduino UNOでは難しいと判断してBluetoothモデムモジュールを使うことを提案した。
Bluetoothモデム(HC-05/HC-06)は、かつて3×3のバスケットボール用に開発した12秒タイマーでスタート・ストップをリモコン制御するのに用いていたのでインタフェースのシリアル速度さえ抑えておけばsoftwareserialでも十分に検知制御できて、シリアル接続のLED群WS2812Bなどで構成した大型表示部も制御できていたので問題はないはずだった。
大量にどこかに在庫していたのだったが、部品棚にあったのはHC-05の親機が見つかった。サンプルのスケッチとスマホ側のアプリを紹介しておいたら、彼なりに自宅で接続テストをしたようで、あいにくとアプリは現在の彼のスマホではAPIがマッチしないのか動作しないようで、別のBT接続のアプリを見つけて実験をしていたらしい。
自宅での実験するなかで、どうもHC-05が正しく応答しないようで壊れているのではないかという話になり次回来た時に交換してほしいという連絡がLINEできた。
こちらでも動作確認をしようということで、古いスケッチを持ち出してみたのだが、どうにもBT接続のターミナル接続とコネクトできない・・・。

ルンバみたいな掃除機を作りたい(1)

表題のような思いを持った少年がやってきたのは彼が小学五年生の時だった。ArduinoUNOに3chのモーターシールドを作ったもののユニバーサル基板では作りたいものに到達するまえにまだ配線が未熟だったようだった。
基板を起こして駆動系モーター二系統と、掃除用のブラシ駆動用の一系統をドライブ可能なもので形がついた。
超音波センサを付けて壁に衝突する際には後進旋回をして・・・という部分までをざっとサンプルソースを見せて調整していくという段階でコロナに入った・・・。
コロナを超えてタイムマシンでやってきた少年は、中学二年生となっていた。
この三年の間に自分でもパソコンの勉強をしていたようで今年になってから再開をするようになると、ルンバプロジェクトの再開と共にサーバー立ち上げをやりたいと言ってきた。かねてよりハードオフで入手したゲームパッドを修理したいといったこともやってきた彼にはハードオフは狩場なのだろう。
タワーマシンを携えて母上と車で来られて暫しサーバーは里に鎮座しつつ彼が作りたい動画登録サイト構築の仕上げを学びたいということだった。ngnixを設定したUbuntuを入れた彼のマシンには、彼がレンタルしていたサイトを移植して自宅配下でドメイン移管も含めて実現したいというのが彼の喫緊のプロジェクトになっていた。
PHPで出来ていたサービスを自分のマシンに作り直してFirewall設定したマシンにポート中継をしていくとのことだが、この辺りで自宅の稼業に影響がない形で評価開発したいのでというのがその内容だった。
彼がとった独自ドメインをダイナミックIPの上に登録することも出来て、リモートでssh接続で接続が出来たので、あとは自宅からチューニングは出来るだろう。移築した動画登録サイトが動作はしたので開通式をビデオ撮りをしたりしてその動画を載せたりしていた。

Arduinoで学ぶ組み込みハンズオン合宿をしてきました(1)

先週末11/24と11/25は、依頼された組み込みハンズオン合宿の講師をしてきました。開催場所は茨城県神栖市の旅館を借りてのものでした。オープンソース活用などを進めておられた知己が地元の母校(波崎工業高校)の後輩たちもターゲットにして開催する刺激を与えることを目的として企画されましたが、実際には若手抜きでの開催となり準備推進といった様相となりました
先日開発したスポーツ用の12秒タイマーの実装例などの解説を中心にしてカスタマイズや、センサー・アクチュエータを活用できるところまで参加された方々のIDE環境のセットアップから二日間で漕ぎつけるというものでした。ほかにも教育研究されている宇都宮大学の先生や波崎工業高校の先生のお話も交えての内容で縦軸が私の担当するハンズオンの合宿でした。

地域の工業高校生の参加勧誘に向けては、社会連携などの活動としてのお話しにつなげていく中でのものでしたので準備に手間取り実際の生徒さんたちの都合には十分な宣伝期間などが不足して、社会人の方たちの参加のみに限定されましたが教える側としてのトライアルとしては寧ろIT環境になれない方たちも含めてのものとしての挑戦でもありました。

最初に、自身の邂逅となるマイコン遭遇となる組み込み人生について自己紹介をかねての経歴説明の中でマイコン開発の進め方にどう携わってきたのかを話して開発環境への取り組みが35年ほど遡る時代背景での高級言語Cのマイコン実装実現での経験について話をして、現代にいたるまでの話をつなぎました。これには今日のハンズオンへの伏線を隠していました。同様な内容は先月開催されたヒューマンネットワーク高専の全国交流会でのプレゼンと被ります

手元に皆さんが使えるようにしたのは中華製のArduino互換基板です。今回参加された方々はUbuntu, Windows, MacOSと様々なタイプのマシンを持ち込まれていたのでIDEのインストールを通じて最近のライセンス問題やArduino自身の出自や、Arduinoプロジェクトの御家騒動、USB変換チップの模造品問題などについても触れて今回のものに搭載されているものが中華国家が推進しているCH340が搭載されていることに触れて、識者の方にも経験のあるUSBケーブルが動作しなくなったある時期の時代背景についても触れて実態について紹介しました。こうした技術上の現代史を知らないまま、これからの時代を生きていくうえでは重要な点と理解しています。

折角の機会なのでマイコンの構造を解き明かしつつ内部の構成についても解説を加えるという回りくどい教え方でもありました。

Arduinoのベースとなるマイコンの基本を知ってもらう意味で機械語の動作が目視でみたりすることが出来るマイコン黎明期に登場したAlnair/IMSAIなどのレプリカマシンであるLegacy8080(科学少年出版)を持ち込みマイコンとしての動作の概念であるメモリ、バスライン、デバイスの仕組みについて解説して自身が開発して成果を上げてきた話とシンクロしながら説明をして、組み込みの基本となるリセットからのマイコン動作も含めてデモすることで実際にマイコンをステップ動作させることで理解した雰囲気に導きました。

Arduinoの良いところはプロトタイピングのために徹底した抽象化が図られていて本当の意味で知らなければならない細かい所作については理解しなくても使い込んでいくことが出来ることでもあるのですが、そうした隠ぺいした部分について詳細な理解までは別にして気にする程度に説明することで実際のモノづくりに必要なことを実装例を通じて示していきました。

実際に作ったスポーツタイマーは12秒計測を行う大型のLEDでフラッシングを脈動するような形で色や照度を変えつつ表示計測して任意に停止したり巻き戻したり進めたりという実現したものの説明を先に行いました。これで参加される方がこれから説明しようとするものについての動作上の理解をしてもらうことが出来ました。

具体的な動作例を示すことで、その中身のソースコードを説明していくことで必要な記述が何を示していくのかについての関心が増します。

150個のLEDピースが連結されたNeoPixelというデバイスが三本の線で接続されていることを示しつつ、信号線の定義をソース上で行うこと、実際の基板の上での読み方や複数のピンが存在する中で使える二つのタイプのピンAnalogの入力にもつかえるピン、デジタルの入出力に使えるピンなとの機能についての説明や配置上の自由などにふれ、これから制御しようとしているLEDのシリアルテープ構造のもの自体が一つずつにマイコンが搭載されていて3色のLEDの色情報と輝度情報を持っていることを教えます。セグメント構造、色の制御、時間経過での色と照度変化のための構造定義とロジックについてから前後しますが、ArduinoのプログラムにはMainが存在せずにSetupとLoopしかないことを説明して、普通のブログラミングであればMainから終了すると終わってしまうのが、Setupが最初に一度だけ呼ばれてから、Loop関数は繰り返し呼ばれてしまう構造であることを伝えて、ようやくソフトの制御の流れについての読み方を説明していくことを伝えます。スポーツタイマーではBluetoothの端末からのコマンドで動作することを示していたことは示していましたが、あえてシリアルインタフェースは使わずにソフトシリアルを使っていることを理由も含めて説明していくことで深みに嵌めていきました。

7セグメントの構造の1.5桁構成の表示機で制御するためのLED構造が数珠つなぎで一番Arduinoに近いものからアドレスが降られていることを伝えて制御したいセグメントを定義するスタートとエンドの番号を定義していく箇所。

そのセグメントが0から12までどの様に点灯するのかということを定義したデータ配列。

三色のバランスを段々変えていき、緑から始まって、徐々に赤くなっていく色の変化を定義した配列。

一秒刻みで毎回ハッキリと輝度を上げて表示しつつ経過時間で薄くなっていくための輝度調整の計算ロジック。

以上開発した関数を組み合わせて、ある経過時間での残り時間を、その時の秒数と、その時の輝度と色で150個のLEDに与えるデータとして編集する関数群として呼び出す仕組み。

最後に一気にそのデータを瞬間的に高速に払い出すための関数。

BLEを使おうとしたら嵌ったerror: too many asp_ble_gattc_open(esp_gatt_if_t, uint8_t*, bool)’

ESP32の開発環境をArduinoに構築してとりあえず、LEDテープが動作したりするのは確認できたので、bleを使うために最新のライブラリを取り込んでみたのだが、表題のエラーがでる。ソースコードを確認していくと新しいライブラリで新たなincludeディレクトリとしてapiというものが出来ていた。まだBLEが最新版に統合されていない状況で個別にかぶせる形で展開したためにエラーとなる関数のヘッダーが新旧と同時に存在して探索パスの順序から古いものが参照されていたというオチだった。

apiに存在しているもので、上のディレクトリにあったものは削除することで解決した。

私の場合は、D:\User2\Documents\Arduino\hardware\espressif\esp32\tools\sdk\include\bluedroid

ここの下に新しいBLEライブラリはapiというヘッダが作られていた。

Arduino 環境 1.8.5
ESP32 最新版
BLE  0.4.16

思い立ったら組み込みの里で実験しよう

赤外線リモコン開発に挑戦中

日曜日にはバイトがないというN君は、思い立って土曜日に組み込みの里に連絡を入れて、作業をしたい旨を伝えてきた。赤外線リモコンの開発をしたいということを伝えて使いたい設備はオシロだと伝えていた。

日曜の来訪に備えて、たぶん使うことになるロジックアナライザ(ロジアナと略す)を使えるようにまずは、使用ソフトをインストールしていたマシンのWindows更新を進めておき、また必要なロジアナのドライバーも更新してすぐに使えるようにしておいた。

使うはずの赤外線受光部と赤外線LEDも用意しておいた。

昼過ぎにやってきたN君だったが、オシロとロジアナを使えるようにしてみせて、まずはざっくり波形をアナログのオシロで見て確認してからサンプリング時間などの設定をするように伝えてロジアナで実際に見てもらった。トリガのかけ方と表示範囲の設定や取り込みメモリ容量の設定などを伝えたのだが、実際には使い方を次々と発掘してCSV にデータを吸い上げて解析を進めていたようだった。やるねぇ高専生・・・。

現在は、アパート生活をしている専攻科生のN君だが、部屋のインフラとしてスイッチなどが無くてリモコンだらけなのだという。これを解決するソリューションとしてArduinoで学習リモコンを作ってカスタム仕様のスイッチを付けたいというのが彼の発想だったらしい。

持ってきたリモコンのうち、一つはニトリの掃除ロボットのリモコンでこれだけは、赤外線ではなくて2.4Gの無線制御だった。これについてはいろいろと調べていたようだが結局スタートキーだけをハードハックしてArduinoからスタートが制御できるようにするというのが彼の判断だった。

ニトリのリモコンの開封が一つのハードルだつたがなんとか達成して、里のワイヤストリッパーも堪能してもらい分解に必要な手業としての低温半田による組成変性で半田を溶かすということも体験理解してもらって分解に成功してリューターも使ってもらい線の引き出しに成功した。

赤外線の信号の動作確認がロジアナで取れるようになったので、まずは部品選定を進めなければならないスイッチハックの制御について実験をしていたようだ。彼の理解は、フォトカプラだったが実際にスペックを確認して無理そうだと理解したようだ。提案したのはトランジスタ、FET、最後はリレーだった。2SC1815と2N7000と3Vのリレーだった。実際にはFETはほとんど学んだだけで使ったことはないらしい。実際に馬力をあげて次々と確認していき、結局リレーに落ち着いたらしい。

とりあえず、こうした部品がすぐに手当て出来るのも、里のオープンラボの所以である。ホームセンターや秋葉に行かずともそろって実験が出来るのだ。

アイデアと腕さえあれば、彼のように次々と挑戦して新たな道具と対峙してキャッチアップして自分の思索を深めていくことが出来ますよ。

彼のデバッグは、まだ続くようです。里で見かけることがあれば声援してあげてください。

ブログラミングスクールでも電子工作の波か

2020年から始まる小学校でのブログラミング教育必修の流れを受けて、各地でブログラミングスクールでもスクラッチを用いたクラスが始まったりしているようですが、IchigoJamやArduinoを活用して電子工作との流れとの連携もいろいろと模索されているようです。里の開設以来お話しをさせていただいている教室ではLEGOからスクラッチに発展したりという流れで今さらに3Dプリンターの活用なども推進されているようです。

木更津市内でもいくつかのブログラミングスクールが立ち上がっているようで、母校の学生さんもアルバイト講師として活躍されている事例もあるようです。

組み込みの里では、電子工作というには厳しい掟を課しているので鉛フリーの半田で電子工作をさせるという大リーグボール養成ギブスのような厳しさではんだ付けの基本となる部材への加熱と半田の濡れを感じてもらえるようにしていますが、小学三年生のお子さんからこうした取り組みをさせていただいてきました。

スクールの方が電子工作を導入するのに体験したいということで訪問されたりする事例も出てきました。6年ほどの運営が続く中で宣伝もしない中で口コミだけでつながってきたということになります。実際に必要な機材や材料環境などの整備に面食らったりしているのも目にしていますが、こうした方々が増えて子供たちに刺激を与える機会が増えていけば幸いです。

いろいろな階層の方々に出来るだけ経験に基づく指導をしているのが実情です。