for hank
Dependencies: mbed-STM32F103C8T6_new
Diff: main.cpp
- Revision:
- 1:0fe432e5dfc4
- Parent:
- 0:217105958c2d
- Child:
- 2:f48b0967b6cc
--- a/main.cpp Wed Feb 20 15:13:20 2013 +0000 +++ b/main.cpp Wed Apr 15 11:36:03 2020 +0000 @@ -1,37 +1,357 @@ #include "mbed.h" -#include "lcd_driver.h" +//#include "rtos.h" +#include "stm32f103c8t6.h" +#include "ATCmdParser.h" +#include "UARTSerial.h" +//#include "Thread.h" + +DigitalOut MOTOA1(PB_4); +DigitalOut MOTOB1(PB_5); + +DigitalOut MOTOA2(PB_8); +DigitalOut MOTOB2(PB_9); + +Serial debug_uart(PB_10, PB_11); + +AnalogIn SensorCurrent(PA_0); + +AnalogIn BatteryVoltage(PA_1); + +void motor1_move(uint8_t dir); +void motor2_move(uint8_t dir); + +void system_init(); + +UARTSerial *_serial; + +//Thread thread1,thread2,thread3; + +#if 1 + +uint8_t sensor_cnt,cal_cnt; +uint8_t dir; +float sense_value; +uint8_t ov_flag, init_flag, motor1_ready_flag, motor2_ready_flag, sensor_flag; + +#endif + +void sensor_capture_cb(void){ + sensor_cnt++; +} + +#define MAX_LENGTH_STEPS 55 +#define MIN_LENGTH_STEPS 10 +#define MOVING_UP 1 +#define MOVING_DOWN 2 +#define MOVING_FORWARD 1 +#define MOVING_BACKWARD 2 +#define STOP 0 + +#if 1 + +void Power_thread(void const *argument){/*detect current*/ + uint8_t i = 0; + while(true){ + Thread::wait(500); /*unit millisec*/ + //debug_uart.printf("Power_thread 11111111111111\r\n"); + //debug_uart.printf("sensor_cnt = %d\r\n", sensor_cnt); + sense_value = SensorCurrent.read(); + //debug_uart.printf("current sense_value2 =%0.4f \r\n", sense_value); + if((sense_value>0.8)&&sensor_flag){ + debug_uart.printf("sense_value = %0.4f > 0.4 \r\n", sense_value); + ov_flag = 1; + //if(motor2_ready_flag){ + //motor2_ready_flag = 0; + //while(1){motor1_move(STOP);} + //} + } + } +} -DigitalOut myled(LED1); +void Motor1_thread(void const *argument){/*detect current*/ + uint8_t i; + while(true){ + Thread::wait(300); /*unit millisec*/ + if(motor2_ready_flag){ + sensor_cnt = 0; + motor1_move(MOVING_FORWARD); + wait(1); + sensor_flag = 1; + while(!ov_flag){debug_uart.printf("xxxxxxxxxxxxxxxxx \r\n"); wait(1);} + motor1_move(STOP); + debug_uart.printf("overcurrent detected \r\n"); + ov_flag = 0; + motor2_ready_flag = 0; + cal_cnt = sensor_cnt; + debug_uart.printf("calibration done \r\n"); + debug_uart.printf("calibrated cnt is %d \r\n", cal_cnt); + wait(2); + debug_uart.printf("back to origianl position, motor1_ready_flag = 1\r\n"); + motor1_ready_flag = 1; + while(1){ + if(motor2_ready_flag){break;}else{ + wait(1); + debug_uart.printf("thread2----wait for motor2 ready\r\n"); //wait(1); + } + } + motor2_ready_flag = 0; + sensor_cnt = 0; + sensor_flag = 0; + motor1_move(MOVING_BACKWARD); + debug_uart.printf("current cal_cnt is %d\r\n", cal_cnt); + //while(sensor_cnt<(cal_cnt-10)){debug_uart.printf("sensor cnt is %d\r\n", sensor_cnt);} + while(1){ + if(sensor_cnt>(cal_cnt-10)){break;}else{ + wait_ms(10); + //debug_uart.printf("sensor cnt is %d \r\n", sensor_cnt); + } + } + debug_uart.printf("xxxxxxxxxx----------sensor cnt is %d \r\n", sensor_cnt); + //debug_uart.printf("sensor cnt is higher than equal cal_cnt - 10 \r\n"); + motor1_move(STOP); + wait(2); + motor1_ready_flag = 1; + //if(ov_flag){ov_flag = 0;} + } + } +} + +void Motor2_thread(void const *argument){/*detect current*/ + uint8_t sta1,sta2; + DigitalIn Stopper1(PA_13); + DigitalIn Stopper2(PA_15); + + while(true){ + Thread::wait(300); /*unit millisec*/ + if(!init_flag){ + #if 1 + wait(1); + debug_uart.printf("thread 2 start \r\n"); + motor2_move(MOVING_UP); + while(Stopper1){;} + motor2_move(STOP); + debug_uart.printf("up stopper1 triggered \r\n"); + //init_flag = 1; + motor2_ready_flag = 1; + wait(1); + //while(!motor1_ready_flag){debug_uart.printf("wait for motor1 ready\r\n");wait(1);} + while(1){ + if(motor1_ready_flag){break;}else{ + wait(1); + debug_uart.printf("thread2----wait for motor1 ready \r\n"); + } + } + debug_uart.printf("motor1 is ready\r\n"); + motor1_ready_flag = 0; + motor2_move(MOVING_DOWN); + while(Stopper2){;} + motor2_move(STOP); + debug_uart.printf("down stopper1 triggered \r\n"); + motor2_ready_flag = 1; + init_flag = 1; + //while(!motor1_ready_flag){debug_uart.printf("wait for finish\r\n");wait(1);} + while(1){ + if(motor1_ready_flag){break;}else{ + wait(1); + debug_uart.printf("thread2----wait for motor1 ready \r\n"); + } + } + debug_uart.printf("move motor2 to center\r\n"); + motor2_move(MOVING_UP); + wait(1.5); + motor2_move(STOP); + debug_uart.printf("motor2 thread done\r\n"); + #endif + } + } +} -int main() { +#endif + +int main(){ + wait(2); - Serial pc(USBTX, USBRX); // tx, rx + system_init(); + + InterruptIn Hall1(PA_14); + //InterruptIn Hall2(PB_3); + Hall1.fall(callback(sensor_capture_cb)); // Attach ISR to handle button press event + //Hall2.fall(callback(sensor_capture_cb)); // Attach ISR to handle button press event + debug_uart.printf("Hall1 init done\r\n"); - Lcd_Init(); - pc.printf("Hello mbed\n"); - LCD_clear(); - pc.printf("clear \n"); - Pant(0xf800); - Pant(0x07e0); - Pant(0x001f); - Pant(0xffff); - Pant(0x0000); - - while(1) { - Pant(0xf800); - Pant(0x07e0); - Pant(0x001f); - Pant(0xffff); - Pant(0x0000); -#if 0 - myled = 1; - wait(0.5); - myled = 0; - wait(0.5); -#endif + //Thread thread1(osPriorityNormal,2048,Power_thread, NULL); /*check the real-time current*/ + + #if 0 + thread1.start(Power_thread); + debug_uart.printf("thread1~~~~~~~~~~~~~~~~\r\n"); + thread2.start(Motor1_thread); + debug_uart.printf("thread2~~~~~~~~~~~~~~~~\r\n"); + thread3.start(Motor2_thread); + debug_uart.printf("thread3~~~~~~~~~~~~~~~~\r\n"); + #endif + + #if 1 + + Thread thread1(Power_thread, NULL, osPriorityNormal, 2048); + Thread thread2(Motor1_thread, NULL, osPriorityNormal, 2048); + Thread thread3(Motor1_thread, NULL, osPriorityNormal, 2048); + #endif + + #if 0 + debug_uart.printf("thread1~~~~~~~~~~~~~~~~\r\n"); + Thread thread2(osPriorityNormal,2048,Motor1_thread, NULL); /*check the real-time current*/ + //Thread thread2(Motor1_thread, NULL, osPriorityNormal, 512); /*check the real-time current*/ + debug_uart.printf("thread2~~~~~~~~~~~~~~~~\r\n"); + Thread thread3(osPriorityNormal,2048,Motor2_thread,NULL); /*check the real-time current*/ + //Thread thread3(Motor2_thread, NULL, osPriorityNormal, 512); /*check the real-time current*/ + debug_uart.printf("thread3~~~~~~~~~~~~~~~~\r\n"); + #endif + + + + init_flag = 0; + //motor2_ready_flag = 1; + //motor2_move(MOVING_DOWN); + while(1){ + //debug_uart.printf("~~~~~~~~~~~~~~\r\n"); + wait(1); + //sense_value = SensorCurrent.read(); + debug_uart.printf("current sense_value2 =%0.4f \r\n", sense_value); } } + +void motor1_move(uint8_t dir){/*main motor*/ + if(dir==1){/*forward*/ + MOTOA1 = 0; + MOTOB1 = 1; + }else if(dir==2){/*backward*/ + MOTOA1 = 1; + MOTOB1 = 0; + }else{ /*stop*/ + MOTOA1 = 0; + MOTOB1 = 0; + } +} + +void motor2_move(uint8_t dir){/*assistant motor*/ + if(dir==1){/*up*/ + MOTOA2 = 0; + MOTOB2 = 1; + }else if(dir==2){/*down*/ + MOTOA2 = 1; + MOTOB2 = 0; + }else{ /*stop*/ + MOTOA2 = 0; + MOTOB2 = 0; + } +} + +void system_init(){ + + debug_uart.baud(115200); + /* + lcdBus.write(0x00); + TFTRD = 0; + TFTWR = 0; + TFTDC = 0; + TFTCS = 0; + */ + MOTOA1 = 0; + MOTOB1 = 0; + MOTOA2 = 0; + MOTOB2 = 0; + init_flag = 0; + motor1_ready_flag = 0; + motor2_ready_flag = 0; + sense_value = 0; + sensor_flag = 0; + + debug_uart.printf("system init done\r\n"); + +} +#if 0 +void wifi_debug(){ + wifi_uart.baud(115200); + debug_uart.baud(115200); + WIFI_PWREN = 1; + while(1){ + if(wifi_uart.readable()){ + debug_uart.putc(wifi_uart.getc()); + } + if(debug_uart.readable()){ + wifi_uart.putc(debug_uart.getc()); + } + } +} +void bt_debug(){ + bt_uart.baud(9600); + debug_uart.baud(9600); + while(1){ + if(bt_uart.readable()){ + debug_uart.putc(bt_uart.getc()); + } + if(debug_uart.readable()){ + bt_uart.putc(debug_uart.getc()); + } + } +} +void lcd_debug(){ + char i = 0; + unsigned char str[] = "bob's test"; + unsigned char str2[] = "hello world"; + ST7789V_Init(); + BlockWrite(0,COL-1,0,ROW-1); + LCD_block_test(); + //DispColor(GREEN); + DispStr(str, 40, 80, BLUE, GREEN); + DispStr(str2, 40, 120, BLUE, GREEN); + //DispOneChar(0x32,60,60,BLUE,GREEN); + while(1){ + ; + } +} + +void sht20_debug(){ + while(1) { + int temperature = sht.readTemp(); + debug_uart.printf("Temperature is: %d \t", temperature); + int humidity= sht.readHumidity(); + debug_uart.printf("Humidity: %d \r\n",humidity); + wait(2); + } +} + +void eeprom_debug(){ + char ucdata_write[1]; + if (!i2c.write((MCP24AA02_ADDR|WRITE), ucdata_write, 1, 0)){ + //readID(MCP24AA02_MID); + //readID(MCP24AA02_DID); + //Uncomment the following 6 lines of code to write Data into the EEPROM + /* + writeEE(0x00,0x4D); // ASCII M + writeEE(0x01,0x61); // ASCII a + writeEE(0x02,0x72); // ASCII r + writeEE(0x03,0x74); // ASCII t + writeEE(0x04,0x69); // ASCII i + writeEE(0x05,0x6E); // ASCII n + debug_uart.printf("\n\r"); + */ + //Uncomment the following line to Erase the EEPROM + // eraseEE(); + #if 1 + for (int i=2;i<=0x7;i++){readEE(i);} + debug_uart.printf("\r\n"); + #endif + }else{ + debug_uart.printf("\n\rCannot get an ACK from the Device check connections!\n\r"); + } +} + +#endif + + +