ドローン制御第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 に実装していきます。
MICROCONTROLLER | SAMD21 Cortex®-M0+ 32bit low power ARM |
Wi-Fi & Bluetooth | u-blox NINA-W102 |
OPERATING VOLTAGE | 3.3V |
INPUT VOLTAGE (LIMIT) | 21V |
DC CURRENT PER I/O PIN | 7mA |
CLOCK SPEED | 48MHz |
CPU FLASH MEMORY | 256KB |
SRAM | 32KB |
EEPROM | none |
DIGITAL INPUT / OUTPUT PINS | 14 |
PWM PINS | 11 (2, 3, 5, 6, 9, 10, 11, 12, 16 / A2, 17 / A3, 19 / A5) |
UART | 1 |
SPI | 1 |
I2C | 1 |
ANALOG INPUT PINS | 8 (ADC 8/10/12 bit) |
ANALOG OUTPUT PINS | 1 (DAC 10 bit) |
EXTERNAL INTERRUPTS | All digital pins (all analog pins can also be used as interrput pins, but will have duplicated interrupt numbers) |
LED_BUILTIN | 13 |
USB | Native in the SAMD21 Processor |
IMU | LSM6DS3(3軸加速度/ジャイロセンサ) |
LENGTH | 45 mm |
WIDTH | 18 mm |
WEIGHT | 5 gr (with headers) |
Nano 33 IoT
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81
無水エタノールP 500mlx2個パック(掃除)
ケイバ(KEIBA) マイクロニッパー MN-A04
サンハヤト SAD-101 ニューブレッドボード
白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02
[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠
|