HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-02-21 (Sat) Today's Access : 529 Total : 1297335. Since 10 Sep. 2019

ドローン制御第3回 機体制御 雑談
2024.06.23


YouTube でも紹介しています。画像をクリックすると再生できます。

ここではSTEVAL-DRONE01のソースコードをもとにドローンの機体制御を試していきます。
ソースコードの解説は、Interface 2020年3月号の特集記事として取り上げられていますのでバックナンバーを購入されることをお勧めします。 入手できない場合は、2022年4月号に再掲載されていますので、そちらを入手してみてください。
STEVAL-DRONE01は2021年末時点で廃盤になっており、またフライト・コントロール・ユニットFCU001V1が前提としていた開発環境TrueSTUDIOも後継のSTM32CubeIDEに移り変わっています。


●STEVAL-DRONE01用ソースコード

ST_Drone_FCU_F401
STEVAL-DRONE用ソースコードは現時点ではまだ入手可能です。 STM32CubeIDE環境ならビルド可能かもしれませんが、PlatformIOでframeworkにstm32cubeを指定してコンパイルしてみたのですが、HALライブラリに関する部分でエラーが多発します。
うぷ主は機体制御を学習することが目的です。姿勢制御部分のコードのハードウェアに依存しません。 そこで、手軽に環境を構築可能な Arduino Nano 33 IoT用にコードを書き換えていきます。

今回は雑談ということで、STEVAL-DRONE01ハードウェア構成をみてみます。

●STEVAL-DRONE01ハードウェア構成
飛ばすことが目的でなければ、DRONE01のユーザ・マニュアルをもとにMCUやセンサー類を用意することで模擬環境を構築することが可能です。
Getting started with the STEVAL-FCU001V1 flight controller unit evaluation board for mini drones


フライト・コントロール・ユニット STEVAL FCU001V1


●Compact flight controller unit (FCU) evaluation board complete with sample firmware for a small or medium sized quadcopter
●On-board LiPo 1-cell battery charger
●Possibility to directly drive 4 DC brushed motors through the low voltage on-board MOSFET or alternatively use external ESC for DC brushless motor configuration
●Main components:
 ・STM32F401 - 32-bit MCU with ARM® Cortex®
 ・LSM6DSL - iNEMO intertial module: 3D accelerometer and 3D gyroscope
 ・LIS2MDL - High performance 3D magnetometer
 ・LPS22HD - MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
 ・SPBTLE-RF - Very low power module for Bluetooth Smart v4.1
 ・STL6N3LLH6 - N-channel 30 V, 6 A STripFET H6 Power MOSFET
 ・STC4054 - 800 mA standalone linear Li-Ion battery charger



STEVAL FCU001V1 のMCUはSTM32F401CCU6/84MHz RAM:64KB FLASH:256KB です。

上記ピン配置と、CubeMXで生成されたSTEVAL-DRONE01用の設定ファイルを参考にするとピンの用途がわかります。
STEVAL_FCU001V1_ver1.ioc
#MicroXplorer Configuration settings - do not modify
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_9
ADC1.IPParameters=NbrOfConversionFlag,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,Rank-0\#ChannelRegularConversion,master
ADC1.NbrOfConversionFlag=1
ADC1.Rank-0\#ChannelRegularConversion=1
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_3CYCLES
ADC1.master=1
File.Version=6
KeepUserPlacement=false
Mcu.Family=STM32F4
Mcu.IP0=ADC1
Mcu.IP1=NVIC
Mcu.IP10=USB_DEVICE
Mcu.IP11=USB_OTG_FS
Mcu.IP2=RCC
Mcu.IP3=SPI1
Mcu.IP4=SPI2
Mcu.IP5=SYS
Mcu.IP6=TIM2
Mcu.IP7=TIM4
Mcu.IP8=TIM9
Mcu.IP9=USART1
Mcu.IPNb=12
Mcu.Name=STM32F401C(B-C-D-E)Ux
Mcu.Package=UFQFPN48
Mcu.Pin0=PH0 - OSC_IN
Mcu.Pin1=PH1 - OSC_OUT
Mcu.Pin10=PB0
Mcu.Pin11=PB1
Mcu.Pin12=PB2
Mcu.Pin13=PB10
Mcu.Pin14=PB12
Mcu.Pin15=PB13
Mcu.Pin16=PB14
Mcu.Pin17=PB15
Mcu.Pin18=PA8
Mcu.Pin19=PA9
Mcu.Pin2=PA0-WKUP
Mcu.Pin20=PA10
Mcu.Pin21=PA11
Mcu.Pin22=PA12
Mcu.Pin23=PA13
Mcu.Pin24=PA14
Mcu.Pin25=PB3
Mcu.Pin26=PB4
Mcu.Pin27=PB6
Mcu.Pin28=PB7
Mcu.Pin29=PB8
Mcu.Pin3=PA1
Mcu.Pin30=PB9
Mcu.Pin31=VP_TIM2_VS_ClockSourceINT
Mcu.Pin32=VP_TIM4_VS_ClockSourceINT
Mcu.Pin33=VP_TIM9_VS_ClockSourceINT
Mcu.Pin34=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin4=PA2
Mcu.Pin5=PA3
Mcu.Pin6=PA4
Mcu.Pin7=PA5
Mcu.Pin8=PA6
Mcu.Pin9=PA7
Mcu.PinsNb=35
Mcu.UserConstants=
Mcu.UserName=STM32F401CCUx
MxCube.Version=4.8.0
MxDb.Version=DB.4.0.80
NVIC.OTG_FS_IRQn=true\:3\:0\:true\:true
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SPI1_IRQn=true\:3\:0\:true\:true
NVIC.SPI2_IRQn=true\:3\:0\:true\:true
NVIC.SysTick_IRQn=true\:0\:0\:false\:true
NVIC.TIM1_BRK_TIM9_IRQn=true\:3\:0\:true\:true
NVIC.TIM2_IRQn=true\:2\:0\:true\:true
NVIC.USART1_IRQn=true\:4\:0\:true\:true
PA0-WKUP.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd
PA0-WKUP.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PA0-WKUP.GPIO_PuPd=GPIO_PULLDOWN
PA0-WKUP.GPIO_Speed=GPIO_SPEED_FAST
PA0-WKUP.Locked=true
PA0-WKUP.Signal=S_TIM2_CH1_ETR
PA1.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd
PA1.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PA1.GPIO_PuPd=GPIO_PULLDOWN
PA1.GPIO_Speed=GPIO_SPEED_FAST
PA1.Locked=true
PA1.Signal=S_TIM2_CH2
PA10.Mode=Asynchronous
PA10.Signal=USART1_RX
PA11.Mode=Device_Only
PA11.Signal=USB_OTG_FS_DM
PA12.Mode=Device_Only
PA12.Signal=USB_OTG_FS_DP
PA13.Mode=Serial-Wire
PA13.Signal=SYS_JTMS-SWDIO
PA14.Mode=Serial-Wire
PA14.Signal=SYS_JTCK-SWCLK
PA2.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd
PA2.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PA2.GPIO_PuPd=GPIO_PULLDOWN
PA2.GPIO_Speed=GPIO_SPEED_FAST
PA2.Locked=true
PA2.Signal=S_TIM2_CH3
PA3.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd
PA3.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PA3.GPIO_PuPd=GPIO_PULLDOWN
PA3.GPIO_Speed=GPIO_SPEED_FAST
PA3.Locked=true
PA3.Signal=S_TIM2_CH4
PA4.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode
PA4.GPIO_Label=BLE_IRQ
PA4.GPIO_Mode=GPIO_MODE_INPUT
PA4.GPIO_PuPd=GPIO_NOPULL
PA4.Locked=true
PA4.Signal=GPIO_Input
PA5.Locked=true
PA5.Mode=Full_Duplex_Master
PA5.Signal=SPI1_SCK
PA6.Locked=true
PA6.Mode=Full_Duplex_Master
PA6.Signal=SPI1_MISO
PA7.Locked=true
PA7.Mode=Full_Duplex_Master
PA7.Signal=SPI1_MOSI
PA8.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PA8.GPIO_Label=LSM6DS33_CS
PA8.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PA8.GPIO_PuPd=GPIO_NOPULL
PA8.GPIO_Speed=GPIO_SPEED_LOW
PA8.Locked=true
PA8.Signal=GPIO_Output
PA9.Mode=Asynchronous
PA9.Signal=USART1_TX
PB0.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB0.GPIO_Label=BLE_CS
PB0.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PB0.GPIO_PuPd=GPIO_NOPULL
PB0.GPIO_Speed=GPIO_SPEED_LOW
PB0.Locked=true
PB0.Signal=GPIO_Output
PB1.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode
PB1.GPIO_Label=VBAT_SENSE
PB1.GPIO_Mode=GPIO_MODE_ANALOG
PB1.GPIO_PuPd=GPIO_NOPULL
PB1.Locked=true
PB1.Signal=ADCx_IN9
PB10.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB10.GPIO_Label=LPS25H_CS
PB10.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PB10.GPIO_PuPd=GPIO_NOPULL
PB10.GPIO_Speed=GPIO_SPEED_LOW
PB10.Locked=true
PB10.Signal=GPIO_Output
PB12.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB12.GPIO_Label=LIS3MDL_CS
PB12.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PB12.GPIO_PuPd=GPIO_NOPULL
PB12.GPIO_Speed=GPIO_SPEED_LOW
PB12.Locked=true
PB12.Signal=GPIO_Output
PB13.Locked=true
PB13.Mode=Full_Duplex_Master
PB13.Signal=SPI2_SCK
PB14.Locked=true
PB14.Mode=Full_Duplex_Master
PB14.Signal=SPI2_MISO
PB15.Locked=true
PB15.Mode=Full_Duplex_Master
PB15.Signal=SPI2_MOSI
PB2.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB2.GPIO_Label=BLE_RSTN
PB2.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PB2.GPIO_PuPd=GPIO_NOPULL
PB2.GPIO_Speed=GPIO_SPEED_LOW
PB2.Locked=true
PB2.Signal=GPIO_Output
PB3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB3.GPIO_Label=LED3
PB3.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PB3.GPIO_PuPd=GPIO_NOPULL
PB3.GPIO_Speed=GPIO_SPEED_LOW
PB3.Locked=true
PB3.Signal=GPIO_Output
PB4.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB4.GPIO_Label=LED2
PB4.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PB4.GPIO_PuPd=GPIO_NOPULL
PB4.GPIO_Speed=GPIO_SPEED_LOW
PB4.Locked=true
PB4.Signal=GPIO_Output
PB6.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label
PB6.GPIO_Label=MOTOR1
PB6.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PB6.GPIO_PuPd=GPIO_NOPULL
PB6.GPIO_Speed=GPIO_SPEED_LOW
PB6.Signal=S_TIM4_CH1
PB7.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label
PB7.GPIO_Label=MOTOR2
PB7.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PB7.GPIO_PuPd=GPIO_NOPULL
PB7.GPIO_Speed=GPIO_SPEED_LOW
PB7.Signal=S_TIM4_CH2
PB8.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label
PB8.GPIO_Label=MOTOR3
PB8.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PB8.GPIO_PuPd=GPIO_NOPULL
PB8.GPIO_Speed=GPIO_SPEED_LOW
PB8.Signal=S_TIM4_CH3
PB9.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd,GPIO_Label
PB9.GPIO_Label=MOTOR4
PB9.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP
PB9.GPIO_PuPd=GPIO_NOPULL
PB9.GPIO_Speed=GPIO_SPEED_LOW
PB9.Signal=S_TIM4_CH4
PH0\ -\ OSC_IN.Mode=HSE-External-Oscillator
PH0\ -\ OSC_IN.Signal=RCC_OSC_IN
PH1\ -\ OSC_OUT.Mode=HSE-External-Oscillator
PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=false
ProjectManager.BackupPrevious=true
ProjectManager.CompilerOptimize=2
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=false
ProjectManager.CustomerFirmwarePackage=
ProjectManager.DefaultFWLocation=true
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32F401CCUx
ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.5.0
ProjectManager.FreePins=true
ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=0
ProjectManager.PreviousToolchain=
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=STEVAL_FCU001V1_ver1.ioc
ProjectManager.ProjectName=STEVAL_FCU001V1_ver1
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=EWARM
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL,2-SystemClock_Config-RCC-false-HAL,3-MX_ADC1_Init-ADC1-false-HAL,4-MX_SPI1_Init-SPI1-false-HAL,5-MX_SPI2_Init-SPI2-false-HAL,6-MX_TIM2_Init-TIM2-false-HAL,7-MX_TIM4_Init-TIM4-false-HAL,8-MX_TIM9_Init-TIM9-false-HAL,9-MX_USART1_UART_Init-USART1-false-HAL,10-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL
RCC.48MHZClocksFreq_Value=48000000
RCC.AHBFreq_Value=84000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
RCC.APB1Freq_Value=42000000
RCC.APB1TimFreq_Value=84000000
RCC.APB2Freq_Value=84000000
RCC.APB2TimFreq_Value=84000000
RCC.CortexFreq_Value=84000000
RCC.FCLKCortexFreq_Value=84000000
RCC.HCLKFreq_Value=84000000
RCC.HSE_VALUE=16000000
RCC.HSI_VALUE=16000000
RCC.I2SClocksFreq_Value=96000000
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLN,PLLP,PLLQ,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.LSE_VALUE=32768
RCC.LSI_VALUE=32000
RCC.MCO2PinFreq_Value=84000000
RCC.PLLCLKFreq_Value=84000000
RCC.PLLN=336
RCC.PLLP=RCC_PLLP_DIV4
RCC.PLLQ=7
RCC.RTCFreq_Value=32000
RCC.RTCHSEDivFreq_Value=8000000
RCC.SYSCLKFreq_VALUE=84000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.VCOI2SOutputFreq_Value=192000000
RCC.VCOInputFreq_Value=1000000
RCC.VCOOutputFreq_Value=336000000
RCC.VcooutputI2S=96000000
SH.ADCx_IN9.0=ADC1_IN9,IN9
SH.ADCx_IN9.ConfNb=1
SH.S_TIM2_CH1_ETR.0=TIM2_CH1,Input_Capture1_from_TI1
SH.S_TIM2_CH1_ETR.ConfNb=1
SH.S_TIM2_CH2.0=TIM2_CH2,Input_Capture2_from_TI2
SH.S_TIM2_CH2.ConfNb=1
SH.S_TIM2_CH3.0=TIM2_CH3,Input_Capture3_from_TI3
SH.S_TIM2_CH3.ConfNb=1
SH.S_TIM2_CH4.0=TIM2_CH4,Input_Capture4_from_TI4
SH.S_TIM2_CH4.ConfNb=1
SH.S_TIM4_CH1.0=TIM4_CH1,PWM Generation1 CH1
SH.S_TIM4_CH1.ConfNb=1
SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2
SH.S_TIM4_CH2.ConfNb=1
SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3
SH.S_TIM4_CH3.ConfNb=1
SH.S_TIM4_CH4.0=TIM4_CH4,PWM Generation4 CH4
SH.S_TIM4_CH4.ConfNb=1
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8
SPI1.CalculateBaudRate=10.5 MBits/s
SPI1.Direction=SPI_DIRECTION_2LINES
SPI1.IPParameters=BaudRatePrescaler,Mode,CalculateBaudRate,VirtualType,Direction
SPI1.Mode=SPI_MODE_MASTER
SPI1.VirtualType=VM_MASTER
SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4
SPI2.CalculateBaudRate=10.5 MBits/s
SPI2.Direction=SPI_DIRECTION_2LINES
SPI2.IPParameters=BaudRatePrescaler,Mode,CalculateBaudRate,VirtualType,Direction
SPI2.Mode=SPI_MODE_MASTER
SPI2.VirtualType=VM_MASTER
TIM2.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1
TIM2.Channel-Input_Capture2_from_TI2=TIM_CHANNEL_2
TIM2.Channel-Input_Capture3_from_TI3=TIM_CHANNEL_3
TIM2.Channel-Input_Capture4_from_TI4=TIM_CHANNEL_4
TIM2.ICPolarity_CH1=TIM_INPUTCHANNELPOLARITY_BOTHEDGE
TIM2.ICPolarity_CH2=TIM_INPUTCHANNELPOLARITY_BOTHEDGE
TIM2.ICPolarity_CH3=TIM_INPUTCHANNELPOLARITY_BOTHEDGE
TIM2.ICPolarity_CH4=TIM_INPUTCHANNELPOLARITY_BOTHEDGE
TIM2.IPParameters=ICPolarity_CH4,ICPolarity_CH3,ICPolarity_CH2,Channel-Input_Capture2_from_TI2,Period,ICPolarity_CH1,Channel-Input_Capture4_from_TI4,Prescaler,Channel-Input_Capture3_from_TI3,Channel-Input_Capture1_from_TI1
TIM2.Period=32767
TIM2.Prescaler=20
TIM4.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM4.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM4.IPParameters=Prescaler,Period,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Channel-PWM Generation1 CH1
TIM4.Period=1999
TIM4.Prescaler=83
TIM9.IPParameters=Prescaler,Period
TIM9.Period=1999
TIM9.Prescaler=839
USART1.IPParameters=VirtualMode
USART1.VirtualMode=VM_ASYNC
USB_DEVICE.IPParameters=VirtualModeFS,USBD_HandleTypeDef,VirtualMode
USB_DEVICE.USBD_HandleTypeDef=hUsbDeviceFS
USB_DEVICE.VirtualMode=Cdc
USB_DEVICE.VirtualModeFS=Cdc_FS
USB_OTG_FS.IPParameters=VirtualMode
USB_OTG_FS.VirtualMode=Device_Only
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM4_VS_ClockSourceINT.Mode=Internal
VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT
VP_TIM9_VS_ClockSourceINT.Mode=Internal
VP_TIM9_VS_ClockSourceINT.Signal=TIM9_VS_ClockSourceINT
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
board=STEVAL_FCU001V1_ver1

本体mcu部分は blackpill_f401cc などで代用できるかもしれません。


モータ・ドライバ STL6N3LLH6


N-channel 30 V, 0.021 Ohm typ., 6 A STripFET H6 Power MOSFET in a PowerFLAT 2x2 package

3軸加速度/3軸角速度センサ LSM6DSL

SCL(S2_CLK)、SDA(S2_SDA)の表記は、設定ファイルを確認するとSPIとして使われています。

気圧センサ LPS22HBTR


3軸地磁気センサ LIS2MDL


PWM inputs 6-pin header connector (プロポ受信機用)



UART 4-pin header connector



I2C 4-pin header connector



Debugging micro SWD connector



Battery 2-pin header connector


●ST-LINK プログラマ


ST-LINK V2(左)を持っていないので、書き込みにはSTM32 Nucleo Board STM32F401(右)のST LINKを使います。

試しにNucleo基板のST-LINKを分離して、本体のNucleoボードに書込みを行ってみます。

CN2のジャンパは2つとも外します。


Nucleo本体側PWRのジャンパーピンをE5V側に差し替えます。

ST-LINK部分とNUCLEO本体との配線は下記の通りです。

 ST-LINK(CN4)  F401RE本体 
 1:VDD_TARGET  CN6-04:3.3V 
 2:SWCLK  CN7-15:PA14 
 3:GND  CN7-08:GND  
 4:SWDIO  CN7-13:PA13 
 5:NRST  CN6-03:NRST 
 6:SWO(未使用)


電源供給はモバイルバッテリーから5V→(POWER:5V,GND)を供給しています。

補足:電源は下記の使用になっています。
UM1724 User manual - STM32 Nucleo-64 boards (MB1136)


SB2とSB12は表面実装のoΩ抵抗が付いています。

$ pio init -b nucleo_f401re

$ vi platformio.ini
[env:nucleo_f401re]
platform = ststm32
board = nucleo_f401re
framework = arduino
upload_protocol = stlink ←追加

$ vi src/blink.cpp
#include <Arduino.h>

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
$ pio run -t upload

Error: target voltage may be too low for reliable debugging
[stm32f4x.cpu] halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08001ea4 msp: 0x20018000
** Programming Started **
** Programming Finished **
** Verify Started **
** Verified OK **
** Resetting Target **
shutdown command invoked



●FCU001V1へのArduinoコード書込み

うぷ主は奇跡的にSTEVAL-DRONE01を入手できていたので、フライト・コントロール・ユニット STEVAL FCU001V1への書き込みを行ってみます。
ここでは、プラットフォームに ststm32、フレームワークに Arduino を指定してみます。

ボード情報をPlatformIOで探してみます。
$ pio boards STM32F401CCU6

Platform: ststm32
===============================================================================================================
ID                  MCU            Frequency    Flash    RAM    Name
------------------  -------------  -----------  -------  -----  -------------------------------------------------------
steval_fcu001v1     STM32F401CCU6  84MHz        256KB    64KB   STEVAL-FCU001V1 Flight controller unit evaluation board
genericSTM32F401CC  STM32F401CCU6  84MHz        256KB    64KB   STM32F401CC (64k RAM. 256k Flash)
blackpill_f401cc    STM32F401CCU6  84MHz        256KB    64KB   WeAct Studio BlackPill V2.0 (STM32F401CC)


STEVALのボード情報を覗いてみると、framworksにarduinoがありません。

$ cat ~/.platformio/platforms/ststm32/boards/steval_fcu001v1.json
{
  "build": {
    "cpu": "cortex-m4",
    "extra_flags": "-DSTM32F4xx -DSTM32F401xC",
    "f_cpu": "84000000L",
    "mcu": "stm32f401ccu6",
    "product_line": "STM32F401xC"
  },
  "debug": {
    "jlink_device": "STM32F401CC",
    "openocd_target": "stm32f4x",
    "svd_path": "STM32F40x.svd"
  },
  "frameworks": [
    "cmsis",
    "stm32cube",
    "libopencm3",
    "zephyr"
  ],
  "name": "STEVAL-FCU001V1 Flight controller unit evaluation board",
  "upload": {
    "maximum_ram_size": 65536,
    "maximum_size": 262144,
    "protocol": "stlink",
    "protocols": [
      "jlink",
      "cmsis-dap",
      "stlink",
      "blackmagic"
    ]
  },
  "url": "https://www.st.com/en/evaluation-tools/steval-fcu001v1.html",
  "vendor": "ST"
}
そこで、FCU001V1と同じmcuを持つボードgenericSTM32F401CCで代用します。
$ cat ~/.platformio/platforms/ststm32/boards/genericSTM32F401CC.json
{
  "build": {
    "core": "stm32",
    "cpu": "cortex-m4",
    "extra_flags": "-DSTM32F401xC -DSTM32F4xx",
    "f_cpu": "84000000L",
    "mcu": "stm32f401ccu6",
    "product_line": "STM32F401xC",
    "variant": "STM32F4xx/F401CC(F-U-Y)_F401C(B-D-E)(U-Y)"
  },
  "debug": {
    "jlink_device": "STM32F401CC",
    "openocd_target": "stm32f4x",
    "svd_path": "STM32F401x.svd"
  },
  "frameworks": [
    "arduino",
    "cmsis",
    "stm32cube",
    "libopencm3"
  ],
  "name": "STM32F401CC (64k RAM. 256k Flash)",
  "upload": {
    "maximum_ram_size": 65536,
    "maximum_size": 262144,
    "protocol": "serial",
    "protocols": [
      "blackmagic",
      "dfu",
      "jlink",
      "serial",
      "stlink"
    ]
  },
  "url": "https://www.st.com/en/microcontrollers-microprocessors
                                           /stm32f401cc.html",
  "vendor": "Generic"
}
genericSTM32F401CCはframworkとして、arduinoをサポートしています。

ピン情報も確認しておきます。
$ cat ~/.platformio/packages/framework-arduinoststm32/variants/STM32F4xx/'F401CC(F-U-Y)_F401C(B-D-E)(U-Y)'/variant_generic.h
/*
 *******************************************************************************
 * Copyright (c) 2020, STMicroelectronics
 * All rights reserved.
 *
 * This software component is licensed by ST under BSD 3-Clause license,
 * the "License"; You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                        opensource.org/licenses/BSD-3-Clause
 *
 *******************************************************************************
 */
#pragma once

/*----------------------------------------------------------------------------
 *        STM32 pins number
 *----------------------------------------------------------------------------*/
#define PA0                     PIN_A0
#define PA1                     PIN_A1
#define PA2                     PIN_A2
#define PA3                     PIN_A3
#define PA4                     PIN_A4
#define PA5                     PIN_A5
#define PA6                     PIN_A6
#define PA7                     PIN_A7
#define PA8                     8
#define PA9                     9
#define PA10                    10
#define PA11                    11
#define PA12                    12
#define PA13                    13
#define PA14                    14
#define PA15                    15
#define PB0                     PIN_A8
#define PB1                     PIN_A9
#define PB2                     18
#define PB3                     19
#define PB4                     20
#define PB5                     21
#define PB6                     22
#define PB7                     23
#define PB8                     24
#define PB9                     25
#define PB10                    26
#define PB12                    27
#define PB13                    28
#define PB14                    29
#define PB15                    30
#define PC13                    31
#define PC14                    32
#define PC15                    33
#define PH0                     34
#define PH1                     35

// Alternate pins number
#define PA0_ALT1                (PA0  | ALT1)
#define PA1_ALT1                (PA1  | ALT1)
#define PA2_ALT1                (PA2  | ALT1)
#define PA2_ALT2                (PA2  | ALT2)
#define PA3_ALT1                (PA3  | ALT1)
#define PA3_ALT2                (PA3  | ALT2)
#define PA4_ALT1                (PA4  | ALT1)
#define PA7_ALT1                (PA7  | ALT1)
#define PA15_ALT1               (PA15 | ALT1)
#define PB0_ALT1                (PB0  | ALT1)
#define PB1_ALT1                (PB1  | ALT1)
#define PB3_ALT1                (PB3  | ALT1)
#define PB4_ALT1                (PB4  | ALT1)
#define PB5_ALT1                (PB5  | ALT1)
#define PB8_ALT1                (PB8  | ALT1)
#define PB9_ALT1                (PB9  | ALT1)

#define NUM_DIGITAL_PINS        36
#define NUM_ANALOG_INPUTS       10

// On-board LED pin number
#ifndef LED_BUILTIN
  #define LED_BUILTIN           PNUM_NOT_DEFINED
#endif

// On-board user button
#ifndef USER_BTN
  #define USER_BTN              PNUM_NOT_DEFINED
#endif

// SPI definitions
#ifndef PIN_SPI_SS
  #define PIN_SPI_SS            PA4
#endif
#ifndef PIN_SPI_SS1
  #define PIN_SPI_SS1           PA15
#endif
#ifndef PIN_SPI_SS2
  #define PIN_SPI_SS2           PNUM_NOT_DEFINED
#endif
#ifndef PIN_SPI_SS3
  #define PIN_SPI_SS3           PNUM_NOT_DEFINED
#endif
#ifndef PIN_SPI_MOSI
  #define PIN_SPI_MOSI          PA7
#endif
#ifndef PIN_SPI_MISO
  #define PIN_SPI_MISO          PA6
#endif
#ifndef PIN_SPI_SCK
  #define PIN_SPI_SCK           PA5
#endif

// I2C definitions
#ifndef PIN_WIRE_SDA
  #define PIN_WIRE_SDA          PB3
#endif
#ifndef PIN_WIRE_SCL
  #define PIN_WIRE_SCL          PB10
#endif

// Timer Definitions
// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin
#ifndef TIMER_TONE
  #define TIMER_TONE            TIM10
#endif
#ifndef TIMER_SERVO
  #define TIMER_SERVO           TIM11
#endif

// UART Definitions
#ifndef SERIAL_UART_INSTANCE
  #define SERIAL_UART_INSTANCE  2
#endif

// Default pin used for generic 'Serial' instance
// Mandatory for Firmata
#ifndef PIN_SERIAL_RX
  #define PIN_SERIAL_RX         PA3
#endif
#ifndef PIN_SERIAL_TX
  #define PIN_SERIAL_TX         PA2
#endif

/*----------------------------------------------------------------------------
 *        Arduino objects - C++ only
 *----------------------------------------------------------------------------*/

#ifdef __cplusplus
  // These serial port names are intended to allow libraries and architecture-neutral
  // sketches to automatically default to the correct port name for a particular type
  // of use.  For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
  // the first hardware serial port whose RX/TX pins are not dedicated to another use.
  //
  // SERIAL_PORT_MONITOR        Port which normally prints to the Arduino Serial Monitor
  //
  // SERIAL_PORT_USBVIRTUAL     Port which is USB virtual serial
  //
  // SERIAL_PORT_LINUXBRIDGE    Port which connects to a Linux system via Bridge library
  //
  // SERIAL_PORT_HARDWARE       Hardware serial port, physical RX & TX pins.
  //
  // SERIAL_PORT_HARDWARE_OPEN  Hardware serial ports which are open for use.  Their RX & TX
  //                            pins are NOT connected to anything by default.
  #ifndef SERIAL_PORT_MONITOR
    #define SERIAL_PORT_MONITOR   Serial
  #endif
  #ifndef SERIAL_PORT_HARDWARE
    #define SERIAL_PORT_HARDWARE  Serial
  #endif
#endif

ST-LINKとの配線は下記の通りです。
ST-LINK(CN4)FCU001V1
1:VDD_TARGET P8-1
2:SWCLK P8-4
3:GND P8-3
4:SWDIO P8-2
5:NRST P8-10
6:SWO(未使用)

SWDIO(deta)とSWCLK(clock)ラインにプルアップ、プルダウン抵抗を取り付けています。
FCU001V1にモバイルバッテリーから給電しています。
回路図ではP8の5,7,9をGNDに落としていますが、これをするとアップロードに失敗します。


ピンソケット 1.27mm 2×5(10P)/ピッチ変換基板 2×5⇔1×10

はんだ付けするとこんな感じになります。 これをコントロール・ユニットのSWDに挿します。


コントロール・ユニットをST-LINKを介して、Raspberry Pi model 3 A+に繋いでいます。 コントロール・ユニットへはモバイルバッテリーから給電しています。

$ mkdir genericSTM32F401CC
$ cd genericSTM32F401CC
$ pio init -b genericSTM32F401CC

$ vi platformio.ini
[env:blackpill_f401cc]
platform = ststm32
board = genericSTM32F401CC
framework = arduino
upload_protocol = stlink ←追加

ドローン制御ログ表示のためのSerial.print()の動作を確認します。
$ vi src/serial.ino
HardwareSerial Serial1(PA10, PA9);

void setup() {
	Serial1.begin(115200,SERIAL_8N1); 
	while (!Serial1) delay(100);
	Serial1.printf("%s\n","Hello World!");
}

void loop() {}
$ pio run
PLATFORM: ST STM32 (17.3.0) > STM32F401CC (64k RAM. 256k Flash)
HARDWARE: STM32F401CCU6 84MHz, 64KB RAM, 256KB Flash
DEBUG: Current (blackmagic) External (blackmagic, jlink, stlink)
PACKAGES:
 - framework-arduinoststm32 @ 4.20701.0 (2.7.1)
 - framework-cmsis @ 2.50900.0 (5.9.0)
 - toolchain-gccarmnoneeabi @ 1.120301.0 (12.3.1)

低電圧のエラ=が表示されますが、正常に書き込まれます。

●LSM6DSL 3軸加速度/3軸角速度センサ

stm32duino/LSM6DSL

platformio.ini
[env:genericSTM32F401CC]
platform = ststm32
board = genericSTM32F401CC
framework = arduino
upload_protocol = stlink
lib_deps =
  stm32duino/STM32duino LSM6DSL

#include <LSM6DSLSensor.h>

HardwareSerial Serial1(PA10, PA9);

#define SPI_MOSI     PB15
#define SPI_MISO     PB14
#define SPI_SCK      PB13
#define LSM6DS33_CS  PA8

SPIClass dev_spi(SPI_MOSI, SPI_MISO, SPI_SCK);
LSM6DSLSensor AccGyr(&dev_spi, LSM6DS33_CS);

int32_t accelerometer[3];
int32_t gyroscope[3];

void setup()
{
	Serial1.begin(19200,SERIAL_8N1); 
	while (!Serial1) delay(100);

	dev_spi.begin();

	AccGyr.begin();	
	AccGyr.Enable_X();  
	AccGyr.Enable_G();

	while(1) {
		AccGyr.Get_X_Axes(accelerometer);
		AccGyr.Get_G_Axes(gyroscope);
		Serial1.printf("Acc[mg]: %ld %ld %ld",accelerometer[0],accelerometer[1],accelerometer[2]);
		Serial1.printf(" | Gyr[mdps]:  %ld %ld %ld\n",gyroscope[0],gyroscope[1],gyroscope[2]);
		delay(1000);
	}
}

void loop() {}


基板を振っても加速度、角速度センサから取得される値が変化しません。 レジスタの設定変更が必要かもしれません。

STEVAL-DRONE01では、気圧センサ、地磁気センサは使用されていません。

●LPS22HBTR 気圧センサ

STMicroelectronics/stm32-lps22hb

●LIS2MDL 3軸地磁気センサ

STMicroelectronics/lis2mdl-pid

●Arduino Nano 33 IoT
Nano 33 IoTは、WiFi通信が可能で、11個のPWM端子、3軸加速度およびジャイロセンサを実装しています。
次回以降、STEVAL-DRONE01用ソースコードの姿勢制御に関する部分をArduinoに書き換えて、Nano 33 IoT に実装していきます。


MICROCONTROLLERSAMD21 Cortex®-M0+ 32bit low power ARM
Wi-Fi & Bluetoothu-blox NINA-W102
OPERATING VOLTAGE3.3V
INPUT VOLTAGE (LIMIT)21V
DC CURRENT PER I/O PIN7mA
CLOCK SPEED48MHz
CPU FLASH MEMORY256KB
SRAM32KB
EEPROMnone
DIGITAL INPUT / OUTPUT PINS14
PWM PINS11 (2, 3, 5, 6, 9, 10, 11, 12, 16 / A2, 17 / A3, 19 / A5)
UART1
SPI1
I2C1
ANALOG INPUT PINS8 (ADC 8/10/12 bit)
ANALOG OUTPUT PINS1 (DAC 10 bit)
EXTERNAL INTERRUPTSAll digital pins (all analog pins can also be used as interrput pins, but will have duplicated interrupt numbers)
LED_BUILTIN13
USBNative in the SAMD21 Processor
IMULSM6DS3(3軸加速度/ジャイロセンサ)
LENGTH45 mm
WIDTH18 mm
WEIGHT5 gr (with headers)
Nano 33 IoT

Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2022.05.27 まずはロボットカーでお勉強
2022.06.10 第1回テスト環境構築
2022.07.02 第2回テレメトリ通信
2024.06.23 第3回 機体制御 雑談
2024.07.23 第4回 慣性センサ
2025.02.22 第5回 自作シリアル・プロポ
2025.03.10 簡易二足歩行ロボット
2025.04.24 第6回 自作TELNET・プロポ
2025.10.23 M5STACK BugC

たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」 「一念発起して何かを始めても、いつも三日坊主で終わってしまう」 「色んなことを先延ばしにしたまま、時間だけが過ぎていく」 そこで本書では、そんな著者が独自に開発した、 まったく新しい目標達成メソッド「100日デザイン」について、 その知識と技術を、余すところなくご紹介します。

まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。 ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。

今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。

ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。 29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!

【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。 基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説! 500以上のサンプルを掲載。実行結果も確認。 全24章の包括的なチュートリアル。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。

Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード

電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)

Copyright © 2011-2027 Sarako Tsukiyono All rights reserved®.