iT邦幫忙

0

[IoT自製玩具][Ameba Z2][Note 5] 控制servo motor

Note 1有提到,這次的IOT玩具我想要做自動澆花工具,所以必須有一個控制水流的開關才行。比較直覺的方法有:

  1. 幫浦馬達抽水
  2. 機械手臂開水龍頭(?

去電料行逛了一下,最後選擇第二個方法,買了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之後執行的function
void 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);


大概就是這樣~~
/images/emoticon/emoticon06.gif


尚未有邦友留言

立即登入留言