Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- DiGengengen
- Date:
- 2020-11-15
- Revision:
- 3:f56810dbc1ce
- Parent:
- 2:4d280faa7d59
- Child:
- 4:71b6be2a4b13
File content as of revision 3:f56810dbc1ce:
#include "mbed.h"
/* Define */
//#define USB_DEBUG // xbeeでは送れない量の情報をusb通して送信
#define SIMPLE_USE // xbeeで情報送信
/* ID */
const int kModuleID = 1;
/* グローバル変数 */
int sluster_up = 0;
float battery_voltage;
float motor_current;
int sluster_power;
int pump_power;
/* オフセット */
const float k_vbat_offset[] = {
1.4f,
0.6f
};
const float k_Im_offset[] = {
0.0f,
0.0f
};
/* ピン設定 */
DigitalOut led[] = {
DigitalOut(PA_4),
DigitalOut(PA_5),
DigitalOut(PA_6),
};
DigitalOut user[] = {
DigitalOut(PB_1),
DigitalOut(PF_0),
DigitalOut(PF_1),
};
DigitalOut xbee_nreset(PB_5);
AnalogIn raw_battery_voltage(PA_1);
AnalogIn raw_motor_shunt_voltage(PA_0);
//DigitalOut sluster(PA_8);
//DigitalOut pump(PA_11);
DigitalOut pump(PA_8);
DigitalOut sluster(PA_11); //修正
#ifndef USE_DEBUG
Serial xbee(PA_9, PA_10);
#else
Serial xbee(USBTX, USBRX);
#endif
/* WatchDogTimer関係 */
Ticker tick_WDT;
const double TIME_WDT = 2.0; // [sec] : WDTの周期設定
bool flag_WDT = 0;
void WDT_int(){
if(flag_WDT == 1){ // 一定時間反応がなかったためスラスター,ポンプのパワーオフ.
sluster_power = 0;
pump_power = 0;
}
flag_WDT = 1;
}
void WDT_init(){
tick_WDT.attach(&WDT_int, TIME_WDT);
}
/* PWM出力用割り込み関数 */
Ticker pwm;
void myPWM(void)
{
static int t = 0;
if(t == 100){
sluster = 0;
pump = 0;
t = 0;
return;
}
if(t == 100-sluster_power)
sluster = 1;
if(t == 100-pump_power)
pump = 1;
t++;
}
/* xbee or usb シリアル受信時実行関数 */
void SerialReceive(void)
{
flag_WDT = 0; // シリアルの信号を受け取るたびにWDTのフラグを折る.
char message = xbee.getc();
while(xbee.readable()) // bufferを綺麗に
xbee.getc();
switch (message) {
case 'a':
sluster_up = 35;
break;
case 'u':
sluster_power += 5;
break;
case 'd':
sluster_power -= 5;
break;
case '+':
pump_power += 5;
break;
case '-':
pump_power -= 5;
break;
case 'c': // 接続確認用コマンド(WDT生存確認に使用).何もしない.
break;
default :
sluster_power = 0;
pump_power = 0;
sluster_up = 0;
break;
}
if (sluster_power > 95){
sluster_power = 95;
} else if (sluster_power < 0) {
sluster_power = 0;
}
if (pump_power > 95){
pump_power = 95;
} else if (pump_power < 0) {
pump_power = 0;
}
led[2] =~ led[2];
}
/* メイン文 */
int main()
{
// Initialization
pump_power = 0;
sluster_power = 0;
pwm.attach_us(myPWM, 100); // original PWM function
//sluster.period_ms(1);
//pump.period_ms(1);
xbee_nreset = 1; // xBee nreset
xbee.baud(9600);
xbee.attach(SerialReceive,Serial::RxIrq);
WDT_init();
// start motion
wait(1);
#ifdef USB_DEBUG
xbee.printf("2020 Project Iwatobi, PowerModule ID : %02d\n", kModuleID);
#else
xbee.printf("PM : %02d\n", kModuleID);
#endif
wait(1);
led[0] = 1;
while(1) {
//sluster.write(0.01*sluster_power);
//pump.write(0.01*pump_power);
if ((sluster_up > 0)&&(sluster_up > sluster_power)){
sluster_power+=20;
}
battery_voltage = k_vbat_offset[kModuleID] + raw_battery_voltage.read() * 33.0f; // 10.0 * 3.3
motor_current = k_Im_offset[kModuleID] + raw_motor_shunt_voltage * 33.0f; // 10.0 * 3.3
led[1] =~ led[1];
#ifndef SIMPLE_USE
#ifdef USB_DEBUG
xbee.printf("p1 : %03d, p2 : %03d\n", sluster_power, pump_power);
xbee.printf("Vbat : %2.1f [V], Im : %2.1f [A]\n", battery_voltage, motor_current);
#else
xbee.printf("%03d, %03d, %2.1f, %2.1f\n", sluster_power, pump_power, battery_voltage, motor_current);
#endif
#else
xbee.printf("PM : %02d\n", kModuleID);
#endif
wait(0.5);
}
}