iT邦幫忙

2022 iThome 鐵人賽

DAY 23
2

昨天說明了 CircusUart Library 的架構,並且講解了基本用法,今天我們將拿它來實作小專案,這次我們將移植 Day 14、Day 15 FPV Car 小車,改用 RockBot 洛克霸,並且 ESP32 與 ATmega328P 之間使用 CircusUart Library 通訊,並且新增其他做動功能。

https://ithelp.ithome.com.tw/upload/images/20221004/20152065CdBso8q1Cp.jpg

準備材料

ESP32 Code

我們將 ESP32 code 與 ATmega328P 通訊加上左平移(pan_left)、右平移(pan_right),前方夾子角度(angle)。

if (!strcmp(variable, "forward")) {
    uart.send(ESP32_CMD_FORWARD);
} else if (!strcmp(variable, "left")) {
    uart.send(ESP32_CMD_LEFT);
} else if (!strcmp(variable, "pan_left")) {
    uart.send(ESP32_CMD_PAN_LEFT);
} else if (!strcmp(variable, "right")) {
    uart.send(ESP32_CMD_RIGHT);
} else if (!strcmp(variable, "pan_right")) {
    uart.send(ESP32_CMD_PAN_RIGHT);
} else if (!strcmp(variable, "backward")) {
    uart.send(ESP32_CMD_BACK);
} else if (!strcmp(variable, "stop")) {
    uart.send(ESP32_CMD_STOP);
} else {
    res = -1;
}

if (receive_angle) {
    int servo_angle = atoi(angle);
    uart.send(ESP32_CMD_ANGLE, ':', String(servo_angle).c_str());
}

Web Page 同樣加上左右平移按鈕以及滑桿元件

<tr>
    <td align="center"><button class="button" onmousedown="toggleCheckbox('pan_left');"
            ontouchstart="toggleCheckbox('pan_left');" onmouseup="toggleCheckbox('stop');"
            ontouchend="toggleCheckbox('stop');">Pan Left</button></td>
    <td></td>
    <td align="center"><button class="button" onmousedown="toggleCheckbox('pan_right');"
            ontouchstart="toggleCheckbox('pan_right');" onmouseup="toggleCheckbox('stop');"
            ontouchend="toggleCheckbox('stop');">Pan Right</button></td>
</tr>
<tr>
    <td align="right" valign="bottom" style="width:40px;height:40px"></td>
    <td valign="bottom" style="width:40px;height:40px">
        <center><input type="range" min="0" max="90" step="1" oninput="sliderChange(this.value)"
                onchange="sliderChange(this.value)" /></center>
    </td>
    <td valign="bottom" style="width:40px;height:40px"></td>
</tr>

ATmega328P

在 setup 方法註冊將會收到的命令並給定動作

void setup()
{
    Serial.begin(UART_BAUDRATE);
    Wire.begin();

    uart.on(ESP32_CMD_FORWARD, '\0', [](const char *temp) {
        Move_direction(speed, speed, speed, speed);
    });

    uart.on(ESP32_CMD_BACK, '\0', [](const char *temp) {
        Move_direction(-speed, -speed, -speed, -speed);
    });

    uart.on(ESP32_CMD_LEFT, '\0', [](const char *temp) {
        Move_direction(-speed, speed, -speed, speed);
    });

    uart.on(ESP32_CMD_PAN_LEFT, '\0', [](const char *temp) {
        Move_direction(-speed, speed, speed, -speed);
    });

    uart.on(ESP32_CMD_RIGHT, '\0', [](const char *temp) {
        Move_direction(speed, -speed, speed, -speed);
    });

    uart.on(ESP32_CMD_PAN_RIGHT, '\0', [](const char *temp) {
        Move_direction(speed, -speed, -speed, speed);
    });

    uart.on(ESP32_CMD_STOP, '\0', [](const char *temp) {
        Move_direction(0, 0, 0, 0);
    });

    uart.on(ESP32_CMD_ANGLE, ':', [](const char *angle) {
        Servo_angle(1, (uint8_t)atoi(angle));
    });
}

Loop 中檢查資料

void loop()
{
    uart.loop();
}

定義 RockBot 的驅動 Method

void Send_iic(uint8_t Register, uint8_t Speed)
{
    Wire.beginTransmission(0x38);
    Wire.write(Register);
    Wire.write(Speed);
    Wire.endTransmission();
}

void Move_direction(int8_t S1, int8_t S2, int8_t S3, int8_t S4)
{
    Send_iic(0x00, S1);
    Send_iic(0x01, S2);
    Send_iic(0x02, S3);
    Send_iic(0x03, S4);
}

void Servo_angle(uint8_t Servo_ch, uint8_t degree)
{
    Send_iic((Servo_ch - 1) | 0x10, int(degree));
}

洛克霸出動~~!

掃描 QR Code 連接 WiFi。

https://ithelp.ithome.com.tw/upload/images/20221004/20152065S5H0uW9BCU.jpg

打開瀏覽器輸入 TFT 螢幕上顯示的 IP, 192.168.4.1。

https://ithelp.ithome.com.tw/upload/images/20221004/20152065PRGK8nUXKE.jpg

Yes

小結

以上就是搭配FPV RockBot 洛克霸,實際使用 CircusUart Library 通訊,讓我們快速做出各種應用,可以看到即時畫面,夾取物品等各種功能,還不手刀帶一台回家一起玩~~!

更多有趣系列教學文章


上一篇
(Day 22)Arduino 簡化上下位機通訊(Part 2)
下一篇
(Day 24)PixelBit 俄羅斯方塊 Tetris(Part 1)
系列文
PixelBit 可以這樣玩!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言