OpenCR 1.0
イントロダクション
OpenCR1.0は、完全にオープンソースのハードウェアとソフトウェアを提供するために、ROSの組み込みシステム用に開発されました。
ボードの回路図、PCBカバー、BOM、TurtleBot3とOP3用のファームウェアのソースコードなど、ボードに関するすべてのものは、ユーザーとROSコミュニティのためにオープンソースライセンスのもとで無料で配布されています。
OpenCR1.0ボード内のSTM32F7シリーズチップは、浮動小数点演算ユニットを搭載した非常に強力なARM Cortex-M7をベースにしています。
OpenCR1.0の開発環境は、若い学生向けのArduino IDEやScratchから、エキスパート向けの従来のファームウェア開発まで幅広く対応しています。
仕様表
項目 | 仕様 |
---|---|
マイクロコントローラー | STM32F746ZGT6 / 32-bit ARM Cortex®-M7 with FPU (216MHz, 462DMIPS) Reference Manual, Datasheet |
センサー | (廃止) 三軸ジャイロ, 三軸加速度, 三軸磁気センサ (MPU9250) (新設) 三軸ジャイロ, 3軸加速度, デジタルモーションプロセッサー™ (ICM-20648) |
プログラマー | ARM Cortex 10ピン JTAG/SWD コネクター USBデバイスファームウェア アップグレード (DFU) シリアル |
デジタルI/O | 32ピン (L 14, R 18) *Arduino connectivity 5ピン OLLO x 4 GPIO x 18ピン PWM x 6 I2C x 1 SPI x 1 |
アナログ入力 | ADCチャンネル (最大 12bit) x 6 |
通信ポート | USB x 1 (マイクロUSBタイプB/USB 2.0/Host/Peripheral/OTG) TTL x 3 (B3B-EH-A / DYNAMIXEL) RS485 x 3 ([B4B-E名称H-A] / DYNAMIXEL) UART x 2 (20010WS-04) CAN x 1 (20010WS-04) |
LEDとボタン | LD2 (red/green) : USB通信 ユーザーLED x 4 : LD3 (赤), LD4 (緑), LD5 (青) ユーザーボタン x 2 パワーLED : LD1 (赤, 3.3 V 電源オン) リセットボタン x 1 (ボードの電源リセット用) 電源オン/オフ スイッチ x 1 |
入力電源 | 5 V (USB VBUS), 5-24 V (バッテリーもしくはSMPS) 標準バッテリー : LI-PO 11.1V 1,800mAh 19.98Wh 標準SMPS : 12V 4.5A RTC(リアルタイムクロック)用外部バッテリー (Molex 53047-0210) |
出力電源 | * 12V 最大 4.5A(SMW250-02)* 5V 最小 4A(5267-02A), 3.3V@800mA(20010WS-02) |
寸法 | 105(幅) X 75(奥行き) mm |
重量 | 60g |
注釈: ご使用の前に必ずお読みいいただき、正しくお使いください。
- 2020年以降、MPU9250センサーはICM-20648に置き換えられ、MPU9250の生産は中止されました。
- 5V電源は安定化された12V出力を供給することにより安定している必要があります。
- OpenCR1.0ボードからの「ショアパワー」(12V、4.5A SMPS)と「モバイルパワー」(バッテリー)間のホットスワップ電源スイッチにより、UPS(無停電電源装置)機能が有効になります。
レイアウト/ピン配置
警告: ピン配列を確認してください DYNAMIXELのピン配列はコネクタメーカのピン配列とはことなる可能性があります。
Arduinoコネクター
OpenCRにはArduino Unoのピンに対応したコネクタが付属しています。
0~21番のピンはArduino Unoと同じピンで、それ以降はOpenCRに追加されたピンにマッピングされています。
ピン番号 | 関数 | 1 | 2 | 3 | etc |
---|---|---|---|---|---|
0 | UART RXD | UART6_RX | FT |
||
1 | UART TXD | UART6 TX | FT |
||
2 | EXTI_0 | FT |
|||
3 | PWM | TIM3_CH1 | EXTI_1 | FT |
|
4 | EXTI_2 | FT |
|||
5 | PWM | TIM1_CH1 | FT |
||
6 | PWM | TIM2_CH3 | FT |
||
7 | EXTI_3 | FT |
|||
8 | EXTI_4 | FT |
|||
9 | PWM | TIM9_CH2 | FT |
||
10 | PWM/NSS | TIM11_CH1 | SPI2_NSS | FT |
|
11 | PWM/MOSI | TIM12_CH2 | SPI2_MOSI | FT |
|
12 | MISO | SPI2_MISO | FT |
||
13 | SCK | SPI2_SCK | FT |
||
14 | SDA | I2C1_SDA | FT |
||
15 | SCL | I2C1_SCL | FT |
||
16 | ADC | A0 | FT |
||
17 | ADC | A1 | FT |
||
18 | ADC | A2 | FT |
||
19 | ADC | A3 | FT |
||
20 | ADC | A4 | FT |
||
21 | ADC | A5 | FT |
FT
ピンはアナログモード時を除き、5Vトレラントです。FTピンの最大注入電流は -5mA です。また、全I/O端子を合計した総出力電流は、120mA / -120mA となります。
ユーザーLED
OpenCRの追加LEDは4つのLEDで構成されており、Arduinoのピン22-25にマッピングされています。
名称 | Arduinoピン | ピンの名称 |
---|---|---|
USER1 | 22 | BDPIN_LED_USER_1 |
USER2 | 23 | BDPIN_LED_USER_2 |
USER3 | 24 | BDPIN_LED_USER_3 |
USER4 | 25 | BDPIN_LED_USER_4 |
STS | 36 | BDPIN_LED_STATUS |
Arduino | 13 | LED_BUILTIN |
ディップスイッチ
Arduinoピン | ピンの名称 |
---|---|
26 | BDPIN_DIP_SW_1 |
27 | BDPIN_DIP_SW_2 |
GPIO
18ピンの共通GPIO拡張コネクタを持ち、ArduinoのGPIOピンにマッピングされています。下のピン番号はArduinoのピン番号です。
ピン番号 | Arduinoピン | ピンの名称 | ピン番号 | Arduinoピン | ピンの名称 | etc |
---|---|---|---|---|---|---|
1 | - | 3.3V | 2 | - | GND | - |
3 | 50 | BDPIN_GPIO_1 | 4 | 51 | BDPIN_GPIO_2 | FT |
5 | 52 | BDPIN_GPIO_3 | 6 | 53 | BDPIN_GPIO_4 | FT |
7 | 54 | BDPIN_GPIO_5 | 8 | 55 | BDPIN_GPIO_6 | FT |
9 | 56 | BDPIN_GPIO_7 | 10 | 57 | BDPIN_GPIO_8 | FT |
11 | 58 | BDPIN_GPIO_9 | 12 | 59 | BDPIN_GPIO_10 | FT |
13 | 60 | BDPIN_GPIO_11 | 14 | 61 | BDPIN_GPIO_12 | FT |
15 | 62 | BDPIN_GPIO_13 | 16 | 63 | BDPIN_GPIO_14 | FT |
17 | 64 | BDPIN_GPIO_15 | 18 | 65 | BDPIN_GPIO_16 | FT |
19 | 66 | BDPIN_GPIO_17 | 20 | 67 | BDPIN_GPIO_18 | FT |
FT
ピンはアナログモード時を除き、5Vトレラントです。FTピンの最大注入電流 -5mA です。また、全I/Oピンを合計した総出力電流は、 120mA / -120mA となります。
注釈 : プルアップ/プルダウンの代表的な抵抗は40kΩです。
ROBOTIS 5-ピン コネクター
プッシュスイッチ
Arduinoピン | ピンの名称 |
---|---|
34 | BDPIN_PUSH_SW_1 |
35 | BDPIN_PUSH_SW_2 |
外部割り込み
外部割込みは以下のピンに割り当てられており、 attachInterrupt(EXTI_Pin, callbackFunction, Mode) マクロで使用することができます。
EXTI ピン | Arduinoピン | ピンの名称 |
---|---|---|
0 | 2 | - |
1 | 3 | TIM3_CH1 |
2 | 4 | - |
3 | 7 | - |
4 | 8 | - |
5 | 42 | OLLO_P1_ADC |
6 | 45 | OLLO_P2_ADC |
7 | 72 | OLLO_P3_ADC |
8 | 75 | OLLO_P4_ADC |
/*
EXTI_0 is assigned to Arduino PIN 2
*/
pinmode(2, INPUT_PULLDOWN); //set Arduino Pin 2 as input with pull-down
attachInterrupt(0, changeDirection_EXIT_0, RISING);
void changeDirection_EXIT_0(void){
Serial.println("EXIT_Interrupt! 0");
}
UART(Serial)
Classインスタンス | Arduinoピン | ハードウェア |
---|---|---|
Serial | USB | USB |
Serial1 | 0(RX), 1(TX) | USART6 |
Serial2 (SerialBT1) | UART1 | USART2 |
Serial3 | DXL Port | USART3 |
Serial4 (SerialBT2) | UART2 | UART8 |
注意: DYNAMIXELではSerial3を使用しているため、他のシリアルとは使い方が異なります。(詳細はDYNAMIXEL Workbenchを参照してください)。
ピンの定義
extern const Pin2PortMapArray g_Pin2PortMapArray[]=
{
{GPIOC, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 0 UART6_RX
{GPIOC, GPIO_PIN_6, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 1 UART6_TX
{GPIOG, GPIO_PIN_6, NULL, NO_ADC , NULL , NO_PWM , 0 }, // 2 EXTI_0
{GPIOB, GPIO_PIN_4, NULL, NO_ADC , &hTIM3 , TIM_CHANNEL_1, 1 }, // 3 TIM3_CH1 EXTI_1
{GPIOG, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , 2 }, // 4 EXTI_2
{GPIOA, GPIO_PIN_8, NULL, NO_ADC , &hTIM1 , TIM_CHANNEL_1, NO_EXTI }, // 5 TIM1_CH1
{GPIOA, GPIO_PIN_2, NULL, NO_ADC , &hTIM2 , TIM_CHANNEL_3, NO_EXTI }, // 6 TIM2_CH3
{GPIOC, GPIO_PIN_1, NULL, NO_ADC , NULL , NO_PWM , 3 }, // 7 EXTI_3
{GPIOC, GPIO_PIN_2, NULL, NO_ADC , NULL , NO_PWM , 4 }, // 8 EXTI_4
{GPIOA, GPIO_PIN_3, NULL, NO_ADC , &hTIM9 , TIM_CHANNEL_2, NO_EXTI }, // 9 TIM9_CH2
{GPIOB, GPIO_PIN_9, NULL, NO_ADC , &hTIM11, TIM_CHANNEL_1, NO_EXTI }, // 10 TIM11_CH1 SPI2_NSS
{GPIOB, GPIO_PIN_15, NULL, NO_ADC , &hTIM12, TIM_CHANNEL_2, NO_EXTI }, // 11 TIM12_CH2 SPI2_MOSI
{GPIOB, GPIO_PIN_14, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 12 SPI2_MISO
{GPIOA, GPIO_PIN_9, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 13 LED SPI2_SCK
{GPIOB, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 14 I2C1_SDA
{GPIOB, GPIO_PIN_8, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 15 I2C1_SCL
{GPIOA, GPIO_PIN_0, &hADC3, ADC_CHANNEL_0 , NULL , NO_PWM , NO_EXTI }, // 16 A0
{GPIOF, GPIO_PIN_10, &hADC3, ADC_CHANNEL_8 , NULL , NO_PWM , NO_EXTI }, // 17 A1
{GPIOF, GPIO_PIN_9, &hADC3, ADC_CHANNEL_7 , NULL , NO_PWM , NO_EXTI }, // 18 A2
{GPIOF, GPIO_PIN_8, &hADC3, ADC_CHANNEL_6 , NULL , NO_PWM , NO_EXTI }, // 19 A3
{GPIOF, GPIO_PIN_7, &hADC3, ADC_CHANNEL_5 , NULL , NO_PWM , NO_EXTI }, // 20 A4
{GPIOF, GPIO_PIN_6, &hADC3, ADC_CHANNEL_4 , NULL , NO_PWM , NO_EXTI }, // 21 A5
{GPIOG, GPIO_PIN_12, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 22 BDPIN_LED_USER_1
{GPIOE, GPIO_PIN_5, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 23 BDPIN_LED_USER_2
{GPIOE, GPIO_PIN_4, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 24 BDPIN_LED_USER_3
{GPIOG, GPIO_PIN_10, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 25 BDPIN_LED_USER_4
{GPIOG, GPIO_PIN_11, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 26 BDPIN_DIP_SW_1
{GPIOE, GPIO_PIN_6, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 27 BDPIN_DIP_SW_2
{GPIOA, GPIO_PIN_4, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 28 BDPIN_SPI_CS_IMU
{GPIOC, GPIO_PIN_0, &hADC3, ADC_CHANNEL_10, NULL , NO_PWM , NO_EXTI }, // 29 BDPIN_BAT_PWR_ADC
{GPIOC, GPIO_PIN_3, &hADC3, ADC_CHANNEL_13, NULL , NO_PWM , NO_EXTI }, // 30
{GPIOF, GPIO_PIN_14, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 31 BDPIN_BUZZER
{GPIOF, GPIO_PIN_15, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 32 BDPIN_DXL_PWR_EN
{GPIOG, GPIO_PIN_14, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 33
{GPIOG, GPIO_PIN_3, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 34 BDPIN_PUSH_SW_1
{GPIOC, GPIO_PIN_12, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 35 BDPIN_PUSH_SW_2
{GPIOG, GPIO_PIN_9, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 36 BDPIN_LED_STATUS
{GPIOA, GPIO_PIN_5, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 37 BDPIN_SPI_CLK_IMU
{GPIOA, GPIO_PIN_6, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 38 BDPIN_SPI_SDO_IMU
{GPIOB, GPIO_PIN_5, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 39 BDPIN_SPI_SDI_IMU
{GPIOB, GPIO_PIN_0, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 40 OLLO_P1_SIG1
{GPIOC, GPIO_PIN_8, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 41 OLLO_P1_SIG2
{GPIOA, GPIO_PIN_7, &hADC1, ADC_CHANNEL_7 , NULL , NO_PWM , 5 }, // 42 OLLO_P1_ADC EXTI_5
{GPIOC, GPIO_PIN_5, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 43 OLLO_P2_SIG1
{GPIOB, GPIO_PIN_1, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 44 OLLO_P2_SIG2
{GPIOC, GPIO_PIN_4, &hADC1, ADC_CHANNEL_14, NULL , NO_PWM , 6 }, // 45 OLLO_P2_ADC EXTI_6
{GPIOD, GPIO_PIN_10, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 46 OLLO_SLEEP
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 47
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 48
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 49
{GPIOB, GPIO_PIN_10, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 50 BDPIN_GPIO_1
{GPIOB, GPIO_PIN_11, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 51 BDPIN_GPIO_2
{GPIOC, GPIO_PIN_13, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 52 BDPIN_GPIO_3
{GPIOD, GPIO_PIN_2, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 53 BDPIN_GPIO_4
{GPIOE, GPIO_PIN_3, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 54 BDPIN_GPIO_5
{GPIOG, GPIO_PIN_2, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 55 BDPIN_GPIO_6
{GPIOE, GPIO_PIN_10, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 56 BDPIN_GPIO_7
{GPIOE, GPIO_PIN_11, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 57 BDPIN_GPIO_8
{GPIOE, GPIO_PIN_12, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 58 BDPIN_GPIO_9
{GPIOE, GPIO_PIN_13, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 59 BDPIN_GPIO_10
{GPIOE, GPIO_PIN_14, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 60 BDPIN_GPIO_11
{GPIOE, GPIO_PIN_15, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 61 BDPIN_GPIO_12
{GPIOF, GPIO_PIN_0, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 62 BDPIN_GPIO_13
{GPIOF, GPIO_PIN_1, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 63 BDPIN_GPIO_14
{GPIOF, GPIO_PIN_2, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 64 BDPIN_GPIO_15
{GPIOD, GPIO_PIN_8, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 65 BDPIN_GPIO_16
{GPIOF, GPIO_PIN_4, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 66 BDPIN_GPIO_17
{GPIOD, GPIO_PIN_9, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 67 BDPIN_GPIO_18
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 68
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 69
{GPIOF, GPIO_PIN_12, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 70 OLLO_P3_SIG1
{GPIOF, GPIO_PIN_11, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 71 OLLO_P3_SIG2
{GPIOF, GPIO_PIN_5, &hADC3, ADC_CHANNEL_15, NULL , NO_PWM , 7 }, // 72 OLLO_P3_ADC EXTI_7
{GPIOE, GPIO_PIN_9, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 73 OLLO_P4_SIG1
{GPIOE, GPIO_PIN_8, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 74 OLLO_P4_SIG2
{GPIOF, GPIO_PIN_3, &hADC3, ADC_CHANNEL_9 , NULL , NO_PWM , 8 }, // 75 OLLO_P4_ADC EXTI_8
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 76
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 77
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 78
{GPIOF, GPIO_PIN_7, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 79
{GPIOD, GPIO_PIN_6, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 80 BDPIN_UART1_RX
{GPIOD, GPIO_PIN_5, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 81 BDPIN_UART1_TX
{GPIOE, GPIO_PIN_0, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 82 BDPIN_UART2_RX
{GPIOE, GPIO_PIN_1, NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }, // 83 BDPIN_UART2_TX
{NULL , 0 , NULL, NO_ADC , NULL , NO_PWM , NO_EXTI }
};
Arduino IDE
Linuxにインストール
USBポートの設定
OpenCRのUSBポートがroot権限無しでArduinoスケッチをアップできるようにします。
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/99-opencr-cdc.rules
$ sudo cp ./99-opencr-cdc.rules /etc/udev/rules.d/
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger
コンパイラの設定
OpenCRライブラリは、32ビットプラットフォーム用に構築されているため、64ビットPCではArduino IDE用の32ビットコンパイラが必要になります。
$ sudo apt-get install libncurses5-dev:i386
Arduino IDE(Linux)のインストール
Arduino公式ホームページから最新版のArduino IDEをダウンロードして、インストールします。現在、OpenCRはバージョン1.6.4.以降でサービス開始予定です。
https://www.arduino.cc/en/Main/Software
そして、ダウンロードしたファイルを任意のフォルダに展開し、ターミナルからインストールファイルを実行します。この場合、以下の例ではユーザーの一番上のフォルダ(~/)にtoolsというフォルダを作ります。このフォルダがArduino IDEフォルダとして機能します。
$ cd ~/tools/arduino-1.6.4
$ ./install.sh
インストールしたArduino IDEのファイルパスを、bashrcファイルのPATHという絶対パスに設定します。ここでは、geditエディタの使用を推奨します。(必要に応じて他のエディタを使用してください。) 最後にソースを作成して変更を適用します。
$ gedit ~/.bashrc
$ export PATH=$PATH:$HOME/tools/arduino-1.6.4
$ source ~/.bashrc
Arduino IDE(Linux)の実行
Linuxプラットフォーム上でArduino IDEを実行するには、ターミナルに以下のように入力します。
$ arduino
Arduino IDE(Linux)へのポーティング
環境設定
Arduino IDEを起動した後に、IDEのトップメニューにある「ファイル」→「環境設定」をクリックします。環境設定ウィンドウが表示されたら、以下のリンクをコピーして、Additional Boards Manager URLsのテキストボックスに貼り付けます。(この作業には約20分かかります)
https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/arduino/opencr_release/package_opencr_index.json
ボードマネージャーを使ってOpenCRパッケージをインストール
ツール → ボード → ボードマネージャーをクリックします。
テキストボックスにOpenCRと入力して、OpenCR by ROBOTISパッケージを検索します。見つかったら、インストールをクリックします。
インストールが終わると「INSTALLED」と表示されます。
ツール → ボードのリストにOpenCRボードが表示されるようになったかどうかを確認します。これをクリックして、OpenCRボードのソースをインポートします。
ポート設定
このステップでは、プログラムをアップロードするためのポート設定を行います。パソコンとOpenCRをUSBポートで接続してください。
ツール → ポート → /dev/ttyACM0を選択してください。
警告 : 文字列 /dev/ttyACM0
の下一桁の値 0
は USB 接続環境によって異なる場合があります。
モデムマネージャの削除
Arduino IDEでプログラミングを行い、OpenCRにプログラムをアップロードすると、OpenCRが再起動して再接続されます。同時に、Linuxのモデム関連のパッケージから、デバイスを管理するためのATコマンドが送信されます。このように、OpenCR上で接続エラーが発生していることを示していますので、このステップは事前に行っておく必要があります。
$ sudo apt-get purge modemmanager
Macにインストール
Arduino IDE(Mac)のインストール
Arduinoの公式ホームページから最新版のArduino IDEをダウンロードしてインストールします。現在、OpenCRはバージョン1.6.4以降でサービスを開始する予定です。
https://www.arduino.cc/en/Main/Software
Arduino IDE(Mac)の実行
MacプラットフォームでArduino IDEを実行するには、以下のようにArduino IDEのアイコンをクリックします。
Arduino IDE(Mac)へのポーティング
環境設定
Arduino IDEを起動したら、IDEのトップメニューにある「ファイル」→「環境設定」をクリックします。環境設定ウィンドウが表示されたら、以下のリンクをコピーして、Additional Boards Manager URLsのテキストボックスに貼り付けます。(この作業には約20分かかります)
https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/arduino/opencr_release/package_opencr_index.json
ボードマネージャーを使ってOpenCRパッケージをインストール
ツール → ボード→ ボードマネージャーをクリックします。
実行
テキストボックスにOpenCRと入力して、OpenCR by ROBOTISパッケージを探します。OpenCRパッケージをインストールします。
インストールが終わると「INSTALLED」と表示されます。
ツール → ボードの一覧にOpenCR Boardが表示されるようになったかどうかを確認してください。これをクリックして、OpenCR Boardのソースをインポートします。
ポート設定
このステップでは、プログラムアップロードをするためのポート設定を行います。パソコンとOpenCRをUSBポートで接続します。
ツール → ポート → /dev/cu.usbmodem1411を選択します。
注意 : PSの接続されている環境によっては、 /dev/cu.usbmodem1411
値が異なる場合があります。
Windowsにインストール
ドライバーインストール
警告 : Windows 10の場合は、このドライバーのインストールをスキップしてください。
適切なドライバーが自動的にインストールされます。
8.x以下のWindowsでOpenCRのUSBポートをシリアルポートとして使用するには、USB CDCドライバが必要です。STが提供するUSBドライバをインストールすることができます。
http://www.st.com/en/development-tools/stsw-stm32102.html
Arduino IDE(Windows)のインストール
Arduinoの公式ホームページから最新版のArduino IDEをダウンロードしてインストールします。現在、OpenCRはバージョン1.6.4以降でサービスを開始する予定です。
https://www.arduino.cc/en/Main/Software
Arduino IDE for Windowsにはインストール版と圧縮版がありますので、お好きな方法でインストールしてください。
Arduino IDE(Windows)へのポーティング
環境設定
Arduino IDEを起動したら、IDEのトップメニューにある「ファイル」→「環境設定」をクリックします。環境設定ウィンドウが表示されたら、以下のリンクをコピーして、Additional Boards Manager URLsのテキストボックスに貼り付けます。(この作業には約20分かかります)
https://raw.githubusercontent.com/ROBOTIS-GIT/OpenCR/master/arduino/opencr_release/package_opencr_index.json
ボードマネージャーを使ってOpenCRパッケージをインストール
- ツール → ボード → ボードマネージャをクリックします。
- テキストボックスに OpenCR と入力して、OpenCR by ROBOTIS パッケージを検索します。見つかったら、[インストール]をクリックします。
- インストールが終わると、「INSTALLED」と表示されます。
- ール→ボードの一覧にOpenCR Boardが表示されるようになったかどうかを確認してください。これをクリックするとOpenCR Boardのソースがインポートされます。
ポート設定
このステップでは、プログラムアップロード時のポート設定を行います。パソコンとOpenCRをUSBポートで接続する必要があります。
ツール→ポート→COM1を選択します。
注意 : COM1
の値は、PCに接続されている環境によって異なる場合があり 。
例
LED
OpenCRボードに内蔵されているLEDテストです。
コード
OpenCRには5つのLEDがあり、USER1~4とArduinoの13番ピンに接続されているLEDがあります。
USER1~4のArduinoのピン番号は以下のように定義されています。対応するピンがHigh/Lowとして出力されると、LEDが点灯/消灯します。
#define BDPIN_LED_USER_1 22
#define BDPIN_LED_USER_2 23
#define BDPIN_LED_USER_3 24
#define BDPIN_LED_USER_4 25
すべてのLEDを順次点灯、消灯するコードです。
int led_pin = 13;
int led_pin_user[4] = { BDPIN_LED_USER_1, BDPIN_LED_USER_2, BDPIN_LED_USER_3, BDPIN_LED_USER_4 };
void setup() {
// Set up the built-in LED pin as an output:
pinMode(led_pin, OUTPUT);
pinMode(led_pin_user[0], OUTPUT);
pinMode(led_pin_user[1], OUTPUT);
pinMode(led_pin_user[2], OUTPUT);
pinMode(led_pin_user[3], OUTPUT);
}
void loop() {
int i;
digitalWrite(led_pin, HIGH); // set to as HIGH LED is turn-off
delay(100); // Wait for 0.1 second
digitalWrite(led_pin, LOW); // set to as LOW LED is turn-on
delay(100); // Wait for 0.1 second
for( i=0; i<4; i++ )
{
digitalWrite(led_pin_user[i], HIGH);
delay(100);
}
for( i=0; i<4; i++ )
{
digitalWrite(led_pin_user[i], LOW);
delay(100);
}
}
結果
ボタン
これは、OpenCRボードに内蔵されているBUTTONテストです。
コード
OpenCRにはプッシュスイッチ1〜2とディップスイッチ1〜2があります。ピン番号は以下のように定義されており、そのピンのデータを入力すると現在のボタンの状態がわかります。
#define BDPIN_DIP_SW_1 26
#define BDPIN_DIP_SW_2 27
#define BDPIN_PUSH_SW_1 34
#define BDPIN_PUSH_SW_2 35
ボタンの入力状態をシリアルで出力するコードです。
void setup(){
Serial.begin(115200);
pinMode(BDPIN_DIP_SW_1, INPUT);
pinMode(BDPIN_DIP_SW_2, INPUT);
pinMode(BDPIN_PUSH_SW_1, INPUT);
pinMode(BDPIN_PUSH_SW_2, INPUT);
}
void loop(){
int dip_state;
int push_state;
dip_state = digitalRead(BDPIN_DIP_SW_1)<<0;
dip_state |= digitalRead(BDPIN_DIP_SW_2)<<1;
push_state = digitalRead(BDPIN_PUSH_SW_1)<<0;
push_state |= digitalRead(BDPIN_PUSH_SW_2)<<1;
Serial.print("dip_state = ");
Serial.print(dip_state, BIN);
Serial.print("\tpush_state = ");
Serial.println(push_state, BIN);
delay(100);
}
結果
ブザー
OpenCRボードに内蔵されたBUZZER関連のテストで、ArduinoのTone機能を利用しています。
コード
OpenCRにはブザーが内蔵されており、周波数に依存して音が変化します。 また、内蔵されているブザーはArduinoのピン番号にマッピングされており、Arduinoのピン番号は以下のようになっています。Arduinoのトーン機能が移植されているので、この機能を使うことでブザーを使うことができます。
#define BDPIN_BUZZER 31
pitches.hヘッダで定義されたスケールに従ってメロディを出力します。以下のコードは、Arduino IDEで提供されている例で、OpenCRのBUZZERをピン番号のみに変更したものです。
#include "pitches.h"
// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(BDPIN_BUZZER, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(BDPIN_BUZZER);
}
}
結果
PWM
OpenCRボードのArundinピンからのPWM出力テストです。
コード
OpenCRはArduino Unoと同じピン構成です。PWM出力も同じポートにマッピングされています。そのため、対応するポートにPWMのデューティー比を出力するため、analogueWriteを使用しています。分解能は0から255までの8ビットで、周波数は50KHzです。
これは6ピン全てにPWM出力を行った例です。
int pwm_pins[6] = { 3, 5, 6, 9, 10, 11 };
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
int i;
static uint8_t pwm_out = 0;
for( i=0; i<6; i++ )
{
analogWrite(pwm_pins[i], pwm_out++);
}
delay(100);
}
結果
EEPROM
OpenCRボートのEEPROMライブラリのテストです。
OpenCRはEEPROMメモリを持っていないので、STM32F746に内蔵されているフラッシュメモリの一部をEEPROMにエミュレートします。エミュレーションの方法はSTマイクロエレクトロニクス社から例として提供されたものです。
EEPROMとして使用する領域は、以下のように0x08010000~0x08020000です。2つのセクターが使用されています。
32ビットは1つのデータを格納するためのもので、下位16ビットは格納するデータ、上位16ビットは対応するデータのアドレスを示しています。データを保存する際には、常に新しい場所に保存されます。データ保存中に1ページを使用した場合、保存したページの最新値のみが新しいページにコピーされ、既存のページは削除されます。 その結果、フラッシュメモリの消去回数が減り、書き込み寿命が長くなります。
EEPROMライブラリを使用するにはヘッダを追加する必要があり、現在のEEPROMの最大サイズは1KBytesです。EEPROMライブラリはArduinoでサポートされているものを移植しているので、基本的な使用方法は他の既存のArduinoボードで使用されているものと同じです。詳しい使い方はAdunionのサイトを参照してください。
https://www.arduino.cc/en/Reference/EEPROM
コード
#include <EEPROM.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
uint32_t tTime;
static int i = 0;
if( (millis()-tTime) > 100 )
{
Serial.print(EEPROM.read(0));
Serial.print("\t");
Serial.print(EEPROM.read(1));
Serial.print("\t");
Serial.print(EEPROM.read(2));
Serial.println("\t");
tTime = millis();
}
if (Serial.available())
{
uint8_t inByte = Serial.read();
if( inByte == '1' )
{
EEPROM.write(0, i+1);
EEPROM.write(1, i+2);
EEPROM.write(2, i+3);
i++;
}
}
}
結果
OP3
人型ロボットOP3では、電源やセンサー制御にOpenCRを使用しています。OP3のOpenCRのファームウェアが変更されている場合は、以下の手順でアップデートしてください。
警告 : 本製品に電源(電池やSMPS)を接続する際は、必ず電源スイッチを切ってから行ってください。
準備
OpenCRはArduino IDEを介してファームウェアの開発とダウンロードを行います。そのため、事前にArduino IDEをインストールしておき、OpenCRボードのパッケージをインストールする必要があります。以下のリンク先のドキュメントからインストールします。
OP3ファームウェアのダウンロード
-
OpenCRのファームウェアをアップデートするには、下図のようにOP3のフロントカバーを開き、USBをPCに接続します。
- USB接続後にArduino IDEにて、ツール-> ボード-> OpenCRボードを選択します。
- ツール-> ボードが接続されているポートに変更します。
-
Arduino IDEの例で、OP3用のファームウェアを選択します。
-
下図の赤丸が表示されているArduino IDEのアイコンをクリックして、ファームウェアをビルドしてダウンロードします。ダウンロードが完了すると、ファームウェアが自動的に実行されます。
OP3ファームウェアの編集
OpenCRの基本例として提供されているファームウェアは読み込み専用です。編集したい場合は、新しいフォルダに保存して作業する必要があります。
-
OP3の例を開きます。
-
ファイル-> 保存を選択します。
-
提供された例は読み取り専用なので、OKを選択して新規ファイルとして保存します。
-
新しいフォルダに保存して編集します。編集が完了したら、ファームウェアのビルドとダウンロードを繰り返します。
センサー
環境光センサー
OpenCRボード上での環境光センサーテストです。
- ピン配置
- 緑 : 信号
- 赤 : Vcc
- 黒 : Gnd
- 仕様
- ambient light sensor specification
- 電源電圧 : 3.3V ~ 5V
- 照明範囲 : 1ルクス ~ 6000ルクス
- インターフェース : アナログ
コード
センサーの受け取った光に応じてLEDが順次消灯/点灯します。
明るい場所ではLEDが消灯します。暗い場所では点灯します。
このセンサはアナログセンサのため、ポートA0に接続してください。
#define BDPIN_LED_USER_1 23
#define BDPIN_LED_USER_2 24
#define BDPIN_LED_USER_3 25
光の明るさの変化に応じてLEDをON/OFFするコードです。
void setup()
{
Serial.begin(9600);
pinMode(BDPIN_LED_USER_1, OUTPUT);
pinMode(BDPIN_LED_USER_2, OUTPUT);
pinMode(BDPIN_LED_USER_3, OUTPUT);
}
void loop()
{
if(analogRead(0)<200)
{
digitalWrite(BDPIN_LED_USER_1, LOW);
digitalWrite(BDPIN_LED_USER_2, LOW);
digitalWrite(BDPIN_LED_USER_3, LOW);
}
else if(analogRead(0)>200 && analogRead(0)<300)
{
digitalWrite(BDPIN_LED_USER_1, HIGH);
digitalWrite(BDPIN_LED_USER_2, LOW);
digitalWrite(BDPIN_LED_USER_3, LOW);
}
else if(analogRead(0)>300 && analogRead(0)<400)
{
digitalWrite(BDPIN_LED_USER_1, HIGH);
digitalWrite(BDPIN_LED_USER_2, HIGH);
digitalWrite(BDPIN_LED_USER_3, LOW);
}
else if(analogRead(0)>400 && analogRead(0)<500)
{
digitalWrite(BDPIN_LED_USER_1, HIGH);
digitalWrite(BDPIN_LED_USER_2, HIGH);
digitalWrite(BDPIN_LED_USER_3, HIGH);
}
Serial.println(analogRead(0), DEC);
delay(100);
}
結果
チルトセンサー
OpenCRのチルトセンサーのテストです。
- ピン配置
- 緑 : 信号
- 赤 : Vcc
- 黒 : Gnd
- 仕様
- Tilt Sensor Specification
- 電源電圧 : 3.3V ~ 5V
- インターフェース : デジタル
コード
チルトセンサーとLED はOpenCRに接続されており、チルトすると赤/青のLEDがON/OFF、チルトしない場合は赤/青のLEDがOFF/ONになります。
チルトセンサー、Led_blue、Led_redの信号ピンをD0、D1、D2に接続します。
#define tilt 0
#define led_blue 1
#define led_red 2
void setup()
{
pinMode(tilt, INPUT);
pinMode(led_blue, OUTPUT);
pinMode(led_red, OUTPUT);
}
void loop()
{
if(digitalRead(tilt) == HIGH)
{
digitalWrite(led_blue, HIGH);
digitalWrite(led_red, LOW);
}
else
{
digitalWrite(led_blue, LOW);
digitalWrite(led_red, HIGH);
}
}
結果
回転センサー
OpenCRボードの回転センサーテストです。
- 仕様
- 回転センサー仕様
- 回転角度 : 360度
- 電源電圧 : 3.3V ~ 5V
- インターフェース : アナログ
コード
回転センサはアナログセンサで、回転角度に応じて出力値が変わります。
回転角度に応じて LED が点灯/消灯します。
信号ピンは OpenCRのA0に接続されています。
#define BDPIN_LED_USER_1 22
#define BDPIN_LED_USER_2 23
#define BDPIN_LED_USER_3 24
#define BDPIN_LED_USER_4 25
const int analogInPin = A0;
int sensorValue = 0;
void setup()
{
Serial.begin(9600);
pinMode(BDPIN_LED_USER_4, OUTPUT);
pinMode(BDPIN_LED_USER_3, OUTPUT);
pinMode(BDPIN_LED_USER_2, OUTPUT);
pinMode(BDPIN_LED_USER_1, OUTPUT);
}
void loop()
{
sensorValue = analogRead(analogInPin);
Serial.print(" sensorValue : ");
Serial.println(sensorValue);
if(sensorValue>0 && sensorValue<50)
{
digitalWrite(BDPIN_LED_USER_4, LOW);
digitalWrite(BDPIN_LED_USER_3, HIGH);
digitalWrite(BDPIN_LED_USER_2, HIGH);
digitalWrite(BDPIN_LED_USER_1, HIGH);
}
if(sensorValue>50 && sensorValue<100)
{
digitalWrite(BDPIN_LED_USER_4, LOW);
digitalWrite(BDPIN_LED_USER_3, LOW);
digitalWrite(BDPIN_LED_USER_2, HIGH);
digitalWrite(BDPIN_LED_USER_1, HIGH);
}
if(sensorValue>100 && sensorValue<150)
{
digitalWrite(BDPIN_LED_USER_4, LOW);
digitalWrite(BDPIN_LED_USER_3, LOW);
digitalWrite(BDPIN_LED_USER_2, LOW);
digitalWrite(BDPIN_LED_USER_1, HIGH);
}
if(sensorValue>200 && sensorValue<250)
{
digitalWrite(BDPIN_LED_USER_4, LOW);
digitalWrite(BDPIN_LED_USER_3, LOW);
digitalWrite(BDPIN_LED_USER_2, LOW);
digitalWrite(BDPIN_LED_USER_1, LOW);
}
delay(100);
}
結果
静電容量式タッチセンサー
OpenCRボードの静電容量式タッチセンサーテストです。
- ピン配置
- 緑 : 信号
- 赤 : Vcc
- 黒 : Gnd
- 仕様
- 静電容量式タッチセンサー仕様
- 電源電圧 : 3.3V ~ 5V
- インターフェース : デジタル
コード
センサーに手を乗せるとLEDが順次点灯/消灯し、手を離すとLEDが消灯します。
チルトセンサーはデジタルセンサーで、センサーの信号はOpenCRのD0に接続されています。
#define SensorINPUT 0
#define BDPIN_LED_USER_1 22
#define BDPIN_LED_USER_2 23
#define BDPIN_LED_USER_3 24
#define BDPIN_LED_USER_4 25
int LED[] = {BDPIN_LED_USER_1, BDPIN_LED_USER_2, BDPIN_LED_USER_3, BDPIN_LED_USER_4};
int i = 0;
void setup()
{
pinMode(SensorINPUT, INPUT);
pinMode(BDPIN_LED_USER_1, OUTPUT);
pinMode(BDPIN_LED_USER_2, OUTPUT);
pinMode(BDPIN_LED_USER_3, OUTPUT);
pinMode(BDPIN_LED_USER_4, OUTPUT);
}
void loop()
{
if (digitalRead(SensorINPUT) == HIGH )
{
for(i=0; i<4; i++)
{
digitalWrite(LED[i], LOW);
delay(100);
digitalWrite(LED[i], HIGH);
}
}
if (digitalRead(SensorINPUT) == LOW )
{
for(i=0; i<4; i++)
{
digitalWrite(LED[i], HIGH);
}
}
}
結果
炎センサー
OpenCRボードの炎センサーのテストです。
- ピン配置
- 青 : 信号
- 赤 : Vcc
- 黒 : Gnd
- 仕様
- 炎センサー仕様
- 検出範囲 : 20cm(4.8V) ~ 100cm(1V)
- 電源電圧 : 3.3V ~ 5V
- インターフェース : アナログ
コード
炎を検知するとLEDが点灯します。
センサーの近くで火をつけると1024に近い高い値を出力します。
出力が800を超えるとLEDが点灯します。
信号はArduinoのA0に接続されています。
#define BDPIN_LED_USER_1 22
#define flame 0
void setup()
{
Serial.begin(9600);
pinMode(BDPIN_LED_USER_1, OUTPUT);
}
void loop()
{
int val;
val=analogRead(flame);
if(val>800)
{
digitalWrite(BDPIN_LED_USER_1, LOW);
}
else
{
digitalWrite(BDPIN_LED_USER_1, HIGH);
}
Serial.println(val,DEC);
delay(100);
}
結果
ジョイステックセンサ
OpenCRボードでのジョイステックテストです。
- 仕様
- ジョイステックセンサ仕様
- インターフェース : アナログ
コード
入力に応じて出力値を取得するのがJジョイステックです。
動き方によって変化するx、y、zの値を見ていきます。
x、y、zの信号はArduinoのA0、A1、A2に接続しています。
#define X A0
#define Y A1
#define Z A2
void setup()
{
Serial.begin(9600);
}
void loop()
{
int x,y,z;
x=analogRead(X);
y=analogRead(Y);
z=analogRead(Z);
.
Serial.print(" X = ");
Serial.print(x,DEC);
Serial.print(" Y = ");
Serial.print(y,DEC);
Serial.print(" Z = ");
Serial.println(z,DEC);
delay(100);
}
結果
DYNMAIXEL Workbench
OpenMANIPULATOR
ブートローダー
ブートローダーは、ボードを初期化し、フラッシュメモリにファームウェアをダウンロードして実行する役割を担っています。
OpenCRボードのメインMCUに使用されているSTM32F7xxは、DFU(Device Firmware Upgrade)をサポートしています。
これにより、主にブートローダーの初期化、リカバリーモード、ブートローダーの更新をUSBで行うことで、MCUの内蔵ブートローダー単体でDFUプロトコルで起動させることができるようになります。
USBでブートローダーを使用しても、他のJTAG機器を使用せずにブートローダーを使用できることが最大のメリットです。
STLinkなどの書き込み/デバッグ機器を使用せずに、MCUに内蔵されたDFUモードを使用してファームウェアを書き込みます。
項目 | 説明 |
---|---|
対応OS | Windows, Linux, Mac |
コンパイラー | gcc arm 5.4 2016q2 |
- USBポート
- PCに接続してシリアルポートとして認識されます。
- ブートローダー経由でファームウェアをダウンロードするための通信ケーブルです。
- プッシュスイッチ2
- 電源投入時やリセット時にボタンを長押しすると、ブートローダーが実行されます。
- 電源投入時にボタンが押されていない場合は、ブートローダーが実行されます。ファームウェアがフラッシュメモリにある場合は、ブートローダーがファームウェアを実行します。
メモリマップ
OpenCRで使用しているSTM32F746は、1024KBの内部フラッシュメモリを持ち、各領域は以下のように定義されています。ブートローダーはフラッシュメモリ内の最下位アドレスに配置されており、電源投入時とリセット時に最初にブートローダーが実行されます。
ブートシーケンス
ボードの電源投入やリセット時にスイッチ2ボタンを押すと、ブートローダー状態でPCからのコマンドを待ちます。スイッチ2ボタンが押されていない場合は、フラッシュメモリのファームウェア領域にファームウェアが存在する場合は、ファームウェアにジャンプして実行します。
通信プロトコル
MavLink
ブートローダーからファームウェアをダウンロードするための通信プロトコルはMavLinkを使用しています。MavLinkはUAVでの通信用に作成されたもので、詳細は以下のリンクを参照してください。
機能として、コマンド名とパラメータをxmlファイルとして生成した際に、各コマンドの通信コードをjava / c / pythonなどのコードで自動生成してくれます。通信のためのCRCチェックやデータ解析を行う機能を自動で生成してくれるため、必要なコマンドだけをxmlファイルとして定義しておけば、ソースを自動生成することができます。
また、様々な言語で生成するため、移植も容易です。
http://qgroundcontrol.org/mavlink/start
コマンドの構成
<?xml version="1.0"?>
<mavlink>
<!--<include>common.xml</include>-->
<!-- NOTE: If the included file already contains a version tag, remove the version tag here, else uncomment to enable. -->
<!--<version>3</version>-->
<enums>
</enums>
<messages>
<message id="150" name="ACK">
<description></description>
<field type="uint8_t" name="msg_id"></field>
<field type="uint16_t" name="err_code"></field>
<field type="uint8_t" name="length"></field>
<field type="uint8_t[16]" name="data"></field>
</message>
</messages>
... omit ...
</mavlink>
最終的に定義されたxmlファイルは、githubに追加されています。
https://github.com/ROBOTIS-GIT/OpenCR/blob/master/arduino/opencr_bootloader/common/msg/xml/opencr_msg
定義されたxmlファイルは、MavLinkユーティリティを使って使用したい言語のコマンドコードに変換する必要があります。MavLinkユーティリティのソースコードは以下のgithubからダウンロードしてください。
https://github.com/mavlink/mavlink/
Pythonで書かれており、Python 2.7以降が必要です。インストールされていない場合は追加してください。
$ sudo apt-get install python-tk
$ sudo apt-get install python-future
$ python mavgenerate.py
MAVLink Generatorを実行するとGUI画面が表示され、既に作成されているXMLファイルを選択し、言語をCに、プロトコルのバージョンを1.0に設定します。Outで出力するフォルダ名を選択し、Generateを選択すると、xmlファイルを元に追加されたコマンドを使用できる関数ヘッダーファイルが作成され、ファームウェアにおいて使用することができます。
最終的に生成された通信コードは、以下のリンク先で見ることができます。
MavLink プロトコルを介してファームウェアをダウンロードして実行するブートローダのコマンドは以下の通りです。
void cmd_read_version( msg_t *p_msg );
void cmd_read_board_name( msg_t *p_msg );
void cmd_jump_to_fw( msg_t *p_msg );
void cmd_flash_fw_write_packet( msg_t *p_msg );
void cmd_flash_fw_write_begin( msg_t *p_msg );
void cmd_flash_fw_write_end( msg_t *p_msg );
void cmd_flash_fw_write_block( msg_t *p_msg );
void cmd_flash_fw_erase( msg_t *p_msg );
void cmd_flash_fw_verify( msg_t *p_msg );
void cmd_flash_fw_read_block( msg_t *p_msg );
ダウンロードシーケンス
ブートローダーの主な機能は、パソコンからファームウェアファイルを受け取り、フラッシュに保存し、保存したファームウェアを実行することです。ダウンロードの順番は以下のようになっており、それを見ながら進め方やどこに目を向けて進めているかを確認することができます。これを元に実際の実装を行うことができます。
メッセージ処理
実際に実装したコードでは、メイン関数はメッセージ処理のために msg_process_vcp()関数を呼び出しています。この場合、USBからのデータがある場合はmsg_recv関数を呼び出してメッセージを解析し、何かコマンドを受信した場合はTRUEを返して対応するコマンド関数を呼び出しています。
int main(void)
{
tTime = millis();
while(1)
{
msg_process_vcp();
}
}
void msg_process_vcp(void)
{
BOOL ret;
uint8_t ch;
msg_t msg;
while(vcp_is_available())
{
ch = vcp_getch();
ret = msg_recv( 0, ch, &msg );
if( ret == TRUE )
{
switch( msg.p_msg->msgid )
{
case MAVLINK_MSG_ID_READ_VERSION:
cmd_read_version(&msg);
break;
case MAVLINK_MSG_ID_READ_BOARD_NAME:
cmd_read_board_name(&msg);
break;
... omit ...
default:
cmd_send_error(&msg, ERR_INVALID_CMD);
break;
}
}
}
}
例えば、Mavlink_msg_read_version_decode()関数は、メッセージデータをコマンドのデータ構造に解析します。解析されたmav_dataによく反応するフィールドがアクティブな場合、ACK コマンドを介してブートローダのバージョンとリビジョンを送信します。
void cmd_read_version( msg_t *p_msg )
{
err_code_t err_code = OK;
mavlink_ack_t mav_ack;
mavlink_read_version_t mav_data;
mavlink_msg_read_version_decode(p_msg->p_msg, &mav_data);
if( mav_data.resp == 1 )
{
mav_ack.msg_id = p_msg->p_msg->msgid;
mav_ack.err_code = err_code;
mav_ack.data[0] = boot_version;
mav_ack.data[1] = boot_version>>8;
mav_ack.data[2] = boot_version>>16;
mav_ack.data[3] = boot_version>>24;
mav_ack.data[4] = boot_revision;
mav_ack.data[5] = boot_revision>>8;
mav_ack.data[6] = boot_revision>>16;
mav_ack.data[7] = boot_revision>>24;
mav_ack.length = 8;
resp_ack(p_msg->ch, &mav_ack);
}
}
ブートローダーのアップデート
OpenCRボード上のMCUのDFUモードを使ってブートローダをアップデートすることができます。
DFUモードを使ってアップデートするには、dfu-utilをインストールする必要があります。
$ sudo apt-get install dfu-util
フォルダ構造
項目 | 内容 |
---|---|
bin | ビルド後に生成されたobjとbinファイルを保存します |
common->bsp | ボード固有の機能(LED / BUTTON / USBなど)を搭載しています |
common->hal | ハードウェアに依存しないボード上の機能フォルダ |
common->lib | 外部または公的に使われているライブラリ |
msg->mavlink | Xmlによって生成された通信プロトコルソース |
msg->xml | コマンドを定義したxmlファイルフォルダ |
src | ブートローダー機能に必要な機能フォルダ |
ブートローダーのアップデート
OpenCRボード上のMCUのDFUモードを使ってブートローダをアップデートすることができます。
DFUモードを使ってアップデートするには、dfu-utilをインストールする必要があります。
$ sudo apt-get install dfu-util
DFUモードに入る
OpenCRをDFUモードで実行するには、以下の手順に従ってください。
Boot
ボタンを押したままにする。Reset
ボタンを押す。Reset
ボタンを離す。Boot
ボタンを離す。
内蔵のブートローダーによってリセットされた後、OpenCRはDFUモードに入ります。
ブートモードの確認
Linuxの場合
lsusbを実行すると、DFUモードになっているかどうかを確認することができます。MCUがDFUモードの場合、lsusbを実行するとDFUデバイスが表示されます。
$ lsusb
Windowsの場合
デバイスマネージャー
> ユニバーサルシリアルデバイス
を開き、STM32 BOOTLOADERが検出されていることを確認してください。
もし検出されない場合には、ドライバーインストール(オプション)の項目を参照してください。
ブートローダーの書き込み
ブートローダーの書き込み(Linux)
注意 : バージョンが更新されている場合には、ブートローダーを更新してください。
プログラマー設定
ツール → DFU-UTILを選択
DFUモードの実行
ブートボタン
が押されている間にリセットボタン
を押してください。これによりDFUモードが起動します。
DFUモードに正常に入り、ターミナルで lsusb を入ルよくすると、STMicroelectronics STM Device in DFU Mode
という文字列が表示されます。
ブートローダーのダウンロード
ツール → ブートローダー書き込みをクリックし、ブートローダーをダウンロードします。
ブートローダーの書き込み(Mac)
注意 : バージョンが更新されている場合には、ブートローダーを更新してください。
プログラマー設定
ツール → DFU-UTILを選択
DFUモードの実行
ブートボタン
が押されている間にリセットボタン
を押してください。これによりDFUモードが起動します。
ブートローダーのダウンロード
ツール → ブートローダー書き込みをクリックし、ブートローダーをダウンロードします。
ブートローダーの書き込み(Windows)
注意 : バージョンが更新されている場合には、ブートローダーを更新してください。
DFUモードの実行
ブートボタン
が押されている間にリセットボタン
を押してください。これによりDFUモードが起動します。
ブートローダーのダウンロード
Arduino IDEを設定した後に、Arduino IDEを起動し、ツール
> ブートローダーを書き込む
でブートローダーをダウンロードします。
カスタムブートローダー
カスタムブートローダを構築している場合には、binファイルのあるフォルダに移動し、dfu-utilで更新してください。
以下のコマンドは、opencr_boot.bin をルートディレクトリに置いた例です。
$ sudo dfu-util -d 0483:df11 -a 0 -s 0x08000000 -D ./opencr_boot.bin
ドライバーインストール(オプション)
ブートローダのアップデートを実行するには、ST DFUドライバーをPCにインストールする必要があります。
Windows10では、通常、ST DFUドライバーは 自動的にインストール されています。
しかし、ST DFUドライバが正しくインストールされていない場合、OpenCRはArduino IDEに新しいブートローダを書き込むことができません。
以下のようなエラーメッセージが表示されて、Arduino IDE でのブートローダの書き込みに失敗した場合は、以下の手順でDFUドライバーを再インストールしてください。
DFUデバイス0483:df11を開けません
DFU対応のUSBデバイスが利用できません
ブートローダーの書き込み中にエラーが発生しました
ブートローダーの書き込み中にArduino IDEからエラーメッセージが出る場合。
-
Zadigをhttp://zadig.akeo.ie/からダウンロードします。
-
インストールして、Zadigを実行します。
-
オプション
>全てのデバイスを一覧表示
に移動します。 -
STM32 BOOTLOADER を選択して、WinUSB ドライバーをインストールします。
ダウンローダー
PC ダウンローダーアプリケーションは、ブートローダと通信し、PC からファームウェアを OpenCR ボードフラッシュのファームウェア領域にダウンロードします。 ダウンローダーは、提供されたバイナリファイルに必要な情報を追加します。
項目 | 説明 |
---|---|
対応OS | Windows, Linux, Mac |
コンパイラー | Linux : gcc Windows : Qt 5.7 |
使用方法
コマンドを使用する場合は、以下の説明を読み適切に使用してください。
$ opencr_ld <Communication port> <Baudrate> <Firmware binary> <Firmware execution status [0|1]>
Communication port
- 使用中のシリアルポートの名前を入力します(/dev/ttyACM0は、Linuxで広く使用されています)。
Baudrate
- 通信、入力する速度は115200bpsです。
Firmware binary
- ファームウェアのバイナリイメージには、binの拡張子があります。
Firmware execution status
- ダウンロード後にファームウェアを実行するには、「1」を設定します。
-
ファームウェアをダウンロードするには、「0」を設定します(またはステータスを入力しません)。
Arduino IDEからコンパイルしたバイナリファイルをエクスポートする
Linux/Macの例
以下は、LinuxおよびMacユーザーの例です。ご使用のPC環境によっては、コマンドが異なる場合があります。
$ sudo opencr_ld /dev/ttyACM0 115200 ./opencrfw.bin 1
Communication port
- /dev/ttyACM0
Baudrate
- 115,200 bps.
Firmware binary
- opencrfw.bin
Firmware execution status
- 1
Windowsの例
以下は、Windowsユーザーの例です。 ご使用のPC環境によっては、コマンドが異なる場合があります。
opencr_ld.exe COM1 115200 ./opencrfw.bin 1
Communication port
- COM1
Baudrate
- 115,200 bps.
Firmware binary
- opencrfw.bin
Firmware execution status
- 1
実行結果
実行ファイルのダウンロード
リファレンス
リカバリーモード
不完全もしくは間違ったファームウェアがダウンロードされ、ボードがフリーズしたり、動作しなくなったりした場合は、正常なファームウェアをダウンロードできるようにするために、ブートローダーに入る必要があります。
ブートローダーを実行するには、以下の手順に従ってください。
プッシュスイッチ2
ボタンを押したままにする。リセット
ボタンを押す。リセット
ボタンを離す。プッシュスイッチ2
ボタンを離す。
OpenCRはリセット後、ブートローダーに入ります。ブートローダーが動作しているときは、ステータスLEDが100msごとに点滅します。
ブートローダーが起動している間に通常のファームウェアをダウンロードすることができます。
DYNAMIXEL コネクタ
次の表は、DYNAMIXELのピン配列を示しています。
Item | TTL | RS-485 |
---|---|---|
ピン配列 | 1 GND2 VDD3 DATA |
1 GND2 VDD3 DATA+4 DATA- |
ダイアグラム | ||
ハウジング | JST EHR-03 |
JST EHR-04 |
PCB ヘッダ | JST B3B-EH-A |
JST B4B-EH-A |
圧着端子 | JST SEH-001T-P0.6 | JST SEH-001T-P0.6 |
ワイヤゲージ | 21 AWG | 21 AWG |
警告: ピン配列を確認してください DYNAMIXELのピン配列はコネクタメーカのピン配列とはことなる可能性があります。
通信回路
DYNAMIXEL アクチュエータを制御するには、メインコントローラがそのUART信号を半二重タイプに変換する必要があります。 このための推奨回路図を以下に示します。
TTL 通信
NOTE: Above circuit is designed for 5V or 5V tolerant MCU. Otherwise, use a Level Shifter to match the voltage of MCU.
RS-485 通信
NOTE: Above circuit is designed for 5V or 5V tolerant MCU. Otherwise, use a Level Shifter to match the voltage of MCU.
DYNAMIXELの電力は、Pin1(-)、Pin2(+)を介して供給されます。
(上記の回路は、DYNAMIXELのみのコントローラーに組み込まれています。)
上記の回路図では、TTLレベルのTxDおよびRxDのデータ信号の方向は、次のようにTX_Enable_5Vのレベルに応じて決定されます。
TX_Enable_5V レベルがHighの場合:TxDの信号がD+およびD-に出力されます。
TX_Enable_5V レベルがLowの場合:D+およびD-の信号は、RxDに出力されます。
警告: ピン配列を確認してください DYNAMIXELのピン配列はコネクタメーカのピン配列とはことなる可能性があります。
ダウンロード
認証
未登録の認証については、お問い合わせください。
FCC
注釈:この装置はテスト済みであり、FCC規則のパート15に基づくクラスAデジタルデバイスの制限に準拠していることが確認されています。 これらの制限は、機器が商業環境で操作された場合に有害な干渉から適切な保護を提供するように設計されています。 この装置は無線周波数エネルギーを生成、使用、および放射する可能性があり、取扱説明書に従って設置および使用されない場合、無線通信に有害な干渉を引き起こす可能性があります。 住宅地でこの機器を操作すると、有害な干渉が発生する可能性があります。その場合、ユーザーは自己負担で干渉を修正する必要があります。
注意
製造元によって明示的に承認されていない変更または修正を行うと、機器を操作するユーザーの権限が無効になる場合があります。