Turtlebot3を動かしていると色々なLEDがチカチカするので、OpenCR部分のLEDについて調べてみた。
結果
ハードウェア上に記載されている名称
http://emanual.robotis.com/docs/en/parts/controller/opencr10/
名称毎のLEDの意味
名称 | 色 | 内容 |
---|---|---|
USER1 | オレンジ | TXD:ラズパイにシリアルデータを送信してればトグル点灯 |
USER2 | オレンジ | RXD:ラズパイからシリアルデータの受信してればトグル点灯 |
USER3 | オレンジだったかな | ローバッテリー |
USER4 | 緑 | ROS接続できれいれば点灯 |
STATUS | 基本消灯? | よくわからなかった。 |
Arduino | 緑 | OpenCR上のスケッチのループが動作してれば、500ミリ秒間隔でトグル点灯 |
Power | 緑 | OpenCRの電源が入っていれば点灯 |
USB端子の隣の緑のLEDはUSBと書いてある。
解析情報
あとはダラダラと解析内容を記載。
OpenCRのPIN定義
OpenCR / arduino / opencr_arduino / opencr / variants / OpenCR / chip.h
#define LED_BUILTIN 13 #define BDPIN_LED_USER_1 22 #define BDPIN_LED_USER_2 23 #define BDPIN_LED_USER_3 24 #define BDPIN_LED_USER_4 25 #define BDPIN_LED_STATUS 36
PIN設定と初期の消灯
OpenCR / arduino / opencr_arduino / opencr / variants / OpenCR / variant.cpp
void var_init(void) { 省略 pinMode(BDPIN_LED_USER_1, OUTPUT); pinMode(BDPIN_LED_USER_2, OUTPUT); pinMode(BDPIN_LED_USER_3, OUTPUT); pinMode(BDPIN_LED_USER_4, OUTPUT); digitalWrite(BDPIN_LED_USER_1, HIGH); digitalWrite(BDPIN_LED_USER_2, HIGH); digitalWrite(BDPIN_LED_USER_3, HIGH); digitalWrite(BDPIN_LED_USER_4, HIGH); }
LED操作関数。引数は0〜3
static uint8_t user_led_tbl[] = { BDPIN_LED_USER_1, BDPIN_LED_USER_2, BDPIN_LED_USER_3, BDPIN_LED_USER_4 }; 省略 void setLedOn(uint8_t led_num) { if(led_num < 4) { digitalWrite(user_led_tbl[led_num], LOW); } } void setLedOff(uint8_t led_num) { if(led_num < 4) { digitalWrite(user_led_tbl[led_num], HIGH); } } void setLedToggle(uint8_t led_num) { if(led_num < 4) { digitalWrite(user_led_tbl[led_num], !digitalRead(user_led_tbl[led_num])); } }
LED操作関数に渡す0〜3の使い方定義
#define LED_TXD 0 #define LED_RXD 1 #define LED_LOW_BATTERY 2 #define LED_ROS_CONNECT 3 #define LED_WORKING_CHECK 13
USER1〜4の点灯、消灯指示
void Turtlebot3Diagnosis::showLedStatus(bool isConnected) { static uint32_t t_time = millis(); if ((millis()-t_time) >= 500) { t_time = millis(); digitalWrite(LED_WORKING_CHECK, !digitalRead(LED_WORKING_CHECK)); } if (getPowerInVoltage() < 11.1) { setLedOn(LED_LOW_BATTERY); } else { setLedOff(LED_LOW_BATTERY); } if (isConnected) { setLedOn(LED_ROS_CONNECT); } else { setLedOff(LED_ROS_CONNECT); } updateRxTxLed(); }
showLedStatusの呼び出し元のスケッチ
void loop() { 省略 // Show LED status diagnosis.showLedStatus(nh.connected()); 省略 }