HOME | Raspberry Pi | ビジネス書籍紹介 | 2026-01-04 (Sun) Today's Access : 227 Total : 1260925. 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回テレメトリ通信
2023.05.01 番外編 micro:bit磁気加速度センサ
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®.