Note 1有提到,这次的IOT玩具我想要做自动浇花工具,所以必须有一个控制水流的开关才行。比较直觉的方法有:
帮浦马达抽水机械手臂开水龙头(?去电料行逛了一下,最后选择第二个方法,买了servo motor!因为我是学软体的,连电子学都没修过,所以找了比较懂的朋友一起(帮我)买。
因为不知servo motor是啥东西,先来看篇教学文。
总之,要控制servo motor需要输入50Hz方波给它,且这个方波需要可以调整Pulse Width。还好SDK也有example了,直接拿来设定一下参数就好。
範例路径:project/realtek_amebaz2_v0_example/example_sources/pwm
上一篇已经成功用http POST控制LED了,现在我们一样用http POST来控制servo motor。
因为只是测试,所以先直接把code直接写在同样的位置 component/common/example/httpd/example_httpd.c ,之后再来整理吧!
#define PWM_7 PA_13 // servo motor PWM pin接A13,另外还要接5V和GND#define PWM_PERIOD 20000 // 20000us = 0.02s = 50Hz// http POST之后执行的functionvoid test_post_cb(struct httpd_conn *conn) // 目前测试先写在这个function,之后为了coding style的可读和维护性,要重新写过才行!{// 中间略 // PWM uint8_t pwm_width_idx = body[strlen((char const*)body)-1]; // 一样使用POST data的最后一个char (到底多不想parsing string?) if ((pwm_width_idx >= 48) && // '0' (pwm_width_idx <= 57) ) { // '9' pwm_width_idx -= 48; // 0 ~ 9 (连string to int都懒?) printf("[HANA] PWM width index %d\n", pwm_width_idx); // pwm_width_idx是0~9的数字 //pwmout_pulsewidth_us(&pwm_motor, (int)(500 + pwm_width_idx*150)); // 500us(0.5ms)~2000us(2ms) maps to -90 ~ +90 degree // 根据spec,每个pwm_width_id的间距应该要是150 pwmout_pulsewidth_us(&pwm_motor, (int)(500 + pwm_width_idx*190)); // 500us(0.5ms)~2000us(2ms) maps to -90 ~ +90 degree // 但是经过测试,间距要设为190才可以达到180度的转度// 入口点static void example_httpd_thread(void *param){// 中间略 // Init PWM output pin pwmout_init(&pwm_motor, (PinName)PWM_7); pwmout_period_us(&pwm_motor, PWM_PERIOD);
大概就是这样~~