【活用事例】既存評価ボードからSTM32リーフへの移植

【活用事例】既存評価ボードからSTM32リーフへの移植

  • このトピックには0件の返信、1人の参加者があり、最後にアバターKeith Mineにより2021-02-24 11:11に更新されました。
0件の返信スレッドを表示中
  • 投稿者
    投稿
    • #12045
      アバターKeith Mine
      参加者
      +1

      こちらは、KDDI協賛 Leafony応用コンテストの参加作品です。

      自己紹介


      計画工学研究所の三根(みね)と申します。個人事業として組込みシステムの機能安全・サイバーセキュリティに興味をもっています。応用先としては「自律して移動するIoT-Edge端末」で、ラジコンカーとかドローンの産業展開が目標です。

      目的


      STマイクロエレクトロニクス社から豊富な評価ボード(NUCLEO)が提供されています。
      それらの組み込み資産をLeafonyに移植する方法を検討しました。最終的な目標は小型ドローンの開発で、そのための準備作業の結果を報告いたします。

      目次


      1. NUCLEOをMCUリーフと見立ててリーフを使う
      2. STM32リーフからNUCLEOシールドを使う
      3. カスタムボード設定方法
      4. PWM制御方法の検討
      5. Quadcopter制御ソフト移植の準備

      1. NUCLEOをMCUリーフと見立ててリーフを使う


      Leafonyと同じMCUを搭載する「NUCLEO-64 STM32L452RE」をMCUリーフと見立てて既存のセンサーやI/Oリーフを利用できないかと考えました。

      NUCLEO-64にはL452RE無印とL452RE-P の2種類存在します。

      Arduino Uno 互換性 Leafony端子との相性 シールド (AX01)
      L452RE無印 ピンヘッダ無し 7ピン異なる ジャンパ線でつなぐ
      L452RE-P 裏面にピンヘッダ有り 相当異なる 裏面に装着、使いづらい

      使い勝手が悪いとの結論です。

      2. STM32リーフからNUCLEOシールドを使う


      NUCLEOシールド: DCモーター制御 を使ってみました。

      • 製品名: X-NUCLEO-IHM12A1
      • 制御IC: STSPIN240

      上記1.の結果からSTM32リーフとNUCLEO-64マイコンの信号割当に7本の差分があることが分かっています。本ボードのデモ・プロフラムとして提供されている「STSPin240」とモーターシールドの回路図を調べると、以下のピン番号の読替えで動作しました。

      【元】 motor = new STSpin240_250 (D2, D9, D6,  D7,  D5,  D4,  A0); 

      【変更】motor = new STSpin240_250 (D9, D2, PA8, PB12, D5, D4, D8);

      A0に割り当てられるPA4にはタイマー機能が無いので、その替りにD8を使い、ジャンパ線でD8からA0(設定しないと入力モードの筈)に接続しました。

      NUCLEO-64はIOREFに3.3Vを供給するが、Leafony(AX01 + STM32リーフ)からは供給されないので、CN6 pin2 VDD端子と3.3V端子をジャンパー線で接続しました。

      結論として、ピン番号の読替えとジャンパー線2つでデモプログラムが動作しました。

      3. カスタムボード設定方法


      ピン番号の読替えは結構煩雑なので、カスタムボード設定によりピン番号でなくArduino端子番号で利用できないか試行してみました。

      Windows10に限定された対処方法です。Arduino IDEのインストールに際して「Portable」フォルダーの使用が推奨されていました。Windows10になって「ArduinoData」フォルダーが使用されており、スケッチを収める「Arduino」フォルダーの「hardware」サブフォルダーが未使用である事に気が付きました。ここにカスタムボード設定を置けば良さそうです。

      手順としては、\ArduinoData\packages\STM32\hardware\stm32\1.9.0から

       boards.txt とplatform.txt をコピーして、後者のタイトル行を修正。

      上記の「variants」サブフォルダーにある NUCLEO_L452REサブフォルダーをコピー

      して、その中にある variant.h  variant.cpp のピン割当を編集する。

      詳細については下記を参照して下さい。充分に検証できてなく、又、コンパイラの警告が出る課題があります。

          gitlab.com/cubicrootk/leafony-stm32-mcu

       

      AI03 MIC&VR&LEDリーフのLEDで動作検証をしてみました。

       

      4. PWM制御方法の検討


      4.1 モーター制御ICの制御ピンはGPIOで制御する

       モーター制御ICの品種毎に、制御のピン、及び、論理が異なるだけなので制御は簡単そうです。

      4.2 一方、PWMについてはマイコン毎に制御が異なります

      Atmega328P
       6つのPWMチャンネル (Timer3個にコンペア・レジスタが2つ)
        analogWrite(pin, dutyCycle)
      ESP32
       16個のPWMチャンネルがあるが、名称が“LEDc”に注意
       ledcWrite(ledChannel, dutyCycle)
      STM32
       Hardware Timerを使う
       AVRと同様に analogWrite() も使える

      4.3 PWMを同時に幾つまで制御できるのでしょうか?

      先程の\variants サブフォルダーにある PeripheralPin.c にそのヒントがあります
        WEAK const PinMap PinMap_PWM[] = {
          {PA_0,  TIM2,   STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1

      使える Timer と Channel の組み合わせに重複があるので、
         TIM1: Ch1/ 2/ 3
         TIM2: Ch1/ 2
         TIM3: Ch1/ 2/ 3
         TM16: Ch1n  (nは極性反転の意味)
        (尚、TIM6 は端子を使わないので、ブザーとかに使える)

      例えばPWMを 4チャンネル制御したい場合、その候補は限られてきます:
        D3/ 5/ 6/ 10     = TIM2_ch2/ TIM3_ch1/ TIM1_ch1/ TIM16_ch1n (Arduino端子)
        D6/ 9/ 10/ 11   = TIM1_ch1/ TIM1_ch3/ TIM16_ch1n/ TIM3_ch2 (LED leaf)
        D3/ 5/ 4/ 10     = TIM2_ch2/ TIM3_ch1/ TIM3_ch2/ TIM16_ch1n
        D13/12/11/6    = TIM3_ch2/ TIM2_ch1/ TIM3_ch1/ TIM1_ch1  (SPI 使用不可)
        A1/ A2/ A3/ D2 = TIM2_ch1/ TIM2_ch2/ TIM3_ch3/ TIM3_ch2  (UART 使用不可)

      同じくAI03 MIC&VR&LEDリーフのLEDにて動作検証をしてみました。

      5. Quadcopter制御ソフト移植の準備


      ここまでの準備でQuadcopter(4枚プロペラのドローン)の飛行制御ソフトウェアを移植できそうな予感がしてきました。

      ブレッドボードと29ピンリーフでモーター制御基盤を仮試作しました。
       モーター制御ICとしてTB6612FNGモジュールを2個(4つのPWM制御が必要)
       6軸センサーMPU-6050モジュール(I2C接続)

      市販の木製ドローンの制御回路を置き換えてみました。
       AX02 29pin, AP03 STM32 MCU, AZ01 USB, AV04 2V~4.5V
       Aerowood Modular Wooden Drone (SOPHON)
       1セルのLiPoバッテリー

      ビデオ


      以上

0件の返信スレッドを表示中
  • このトピックに返信するにはログインが必要です。